Skip to content

Commit 349af82

Browse files
committed
Update progressions cookbook for tertiary and minor progression functionality.
1 parent 2deb2ba commit 349af82

4 files changed

Lines changed: 173 additions & 3 deletions

File tree

examples/progressions/14_progression_biwheel.svg

Lines changed: 1 addition & 1 deletion
Loading

examples/progressions/15_einstein_1905_solar_arc.svg

Lines changed: 1 addition & 1 deletion
Loading

examples/progressions/19_triwheel_secondary_tertiary.svg

Lines changed: 2 additions & 0 deletions
Loading

examples/progressions_cookbook.py

Lines changed: 169 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,167 @@ def example_15_progression_with_solar_arc_biwheel():
581581
print(" Solar arc used for angle progression")
582582

583583

584+
# =============================================================================
585+
# PART 7: TERTIARY AND MINOR PROGRESSIONS
586+
# =============================================================================
587+
588+
589+
def example_16_tertiary_progressions():
590+
"""
591+
Example 16: Tertiary Progressions (Day-for-a-Lunar-Month)
592+
593+
Tertiary progressions use the time key: 1 day of planetary motion
594+
= 1 lunar month (~27.3 days) of life. This makes them move ~13x
595+
faster than secondary progressions, useful for timing within a year.
596+
"""
597+
section_header("Example 16: Tertiary Progressions")
598+
599+
natal = (
600+
ChartBuilder.from_details("1994-01-06 11:47", (37.4419, -122.1430), name="Kate")
601+
.with_aspects()
602+
.calculate()
603+
)
604+
605+
prog = MultiChartBuilder.progression(
606+
natal, age=30, progression_type="tertiary"
607+
).calculate()
608+
609+
natal_sun = natal.get_object("Sun")
610+
prog_sun = prog.chart2.get_object("Sun")
611+
612+
print(f"Natal Sun: {natal_sun.longitude:.2f}° {natal_sun.sign}")
613+
print(
614+
f"Tertiary Progressed Sun (age 30): {prog_sun.longitude:.2f}° {prog_sun.sign}"
615+
)
616+
print(f" Sun movement: {(prog_sun.longitude - natal_sun.longitude) % 360:.2f}°")
617+
print(
618+
f" (~{(30 * 365.25 / 27.32):.0f} progressed days = ~{(30 * 365.25 / 27.32) / 365.25:.1f} years of solar motion)"
619+
)
620+
621+
# Tertiary Moon moves much further than secondary
622+
natal_moon = natal.get_object("Moon")
623+
prog_moon = prog.chart2.get_object("Moon")
624+
print(f"\nNatal Moon: {natal_moon.longitude:.2f}° {natal_moon.sign}")
625+
print(f"Tertiary Progressed Moon: {prog_moon.longitude:.2f}° {prog_moon.sign}")
626+
627+
# Works with angle methods too
628+
prog_sa = MultiChartBuilder.progression(
629+
natal, age=30, progression_type="tertiary", angle_method="solar_arc"
630+
).calculate()
631+
print("\nTertiary + Solar Arc angle method: ✓")
632+
print(f" Chart name: {prog_sa.chart2.metadata.get('name')}")
633+
634+
635+
def example_17_minor_progressions():
636+
"""
637+
Example 17: Minor Progressions (Lunar-Month-for-a-Year)
638+
639+
Minor progressions use the time key: 1 lunar month (~27.3 days)
640+
of planetary motion = 1 year of life. This gives ~27x more motion
641+
than secondary progressions — intermediate between secondary and
642+
tertiary rates.
643+
"""
644+
section_header("Example 17: Minor Progressions")
645+
646+
natal = (
647+
ChartBuilder.from_details("1994-01-06 11:47", (37.4419, -122.1430), name="Kate")
648+
.with_aspects()
649+
.calculate()
650+
)
651+
652+
prog = MultiChartBuilder.progression(
653+
natal, age=30, progression_type="minor"
654+
).calculate()
655+
656+
natal_sun = natal.get_object("Sun")
657+
prog_sun = prog.chart2.get_object("Sun")
658+
659+
print(f"Natal Sun: {natal_sun.longitude:.2f}° {natal_sun.sign}")
660+
print(f"Minor Progressed Sun (age 30): {prog_sun.longitude:.2f}° {prog_sun.sign}")
661+
print(f" Sun movement: {(prog_sun.longitude - natal_sun.longitude) % 360:.2f}°")
662+
print(
663+
f" (~{30 * 27.32:.0f} progressed days = ~{30 * 27.32 / 365.25:.1f} years of solar motion)"
664+
)
665+
666+
667+
def example_18_compare_progression_types():
668+
"""
669+
Example 18: Compare All Three Progression Types
670+
671+
Side-by-side comparison of secondary, tertiary, and minor progressions
672+
for the same natal chart and age.
673+
"""
674+
section_header("Example 18: Compare Progression Types")
675+
676+
natal = (
677+
ChartBuilder.from_details("1994-01-06 11:47", (37.4419, -122.1430), name="Kate")
678+
.with_aspects()
679+
.calculate()
680+
)
681+
682+
natal_sun = natal.get_object("Sun")
683+
684+
print(f"Natal Sun: {natal_sun.longitude:.2f}° {natal_sun.sign}")
685+
print("\nProgressed Sun at age 30:")
686+
print(f" {'Type':<12} {'Position':<20} {'Movement':<12} {'Rate'}")
687+
print(f" {'-' * 65}")
688+
689+
for ptype in ["secondary", "tertiary", "minor"]:
690+
prog = MultiChartBuilder.progression(
691+
natal, age=30, progression_type=ptype
692+
).calculate()
693+
prog_sun = prog.chart2.get_object("Sun")
694+
delta = (prog_sun.longitude - natal_sun.longitude) % 360
695+
rate = delta / 30 # degrees per year of life
696+
print(
697+
f" {ptype:<12} {prog_sun.longitude:>7.2f}° {prog_sun.sign:<10} {delta:>7.2f}° ~{rate:.2f}°/year"
698+
)
699+
700+
print("\n Secondary: 1 day = 1 year (slowest, most traditional)")
701+
print(" Tertiary: 1 day = 1 lunar month (~13x faster)")
702+
print(" Minor: 1 lunar month = 1 year (~27x faster)")
703+
704+
# Cross-aspects work with all types
705+
print("\n Cross-aspects per type:")
706+
for ptype in ["secondary", "tertiary", "minor"]:
707+
prog = MultiChartBuilder.progression(
708+
natal, age=30, progression_type=ptype
709+
).calculate()
710+
cross = prog.get_all_cross_aspects()
711+
print(f" {ptype:<12}: {len(cross)} progressed-to-natal aspects")
712+
713+
714+
def example_19_triwheel_with_tertiary():
715+
"""
716+
Example 19: Tri-Wheel with Tertiary Progression
717+
718+
Combine natal, secondary, and tertiary progressions in one chart.
719+
"""
720+
section_header("Example 19: Tri-Wheel (Natal + Secondary + Tertiary)")
721+
722+
natal = (
723+
ChartBuilder.from_details("1994-01-06 11:47", (37.4419, -122.1430), name="Kate")
724+
.with_aspects()
725+
.calculate()
726+
)
727+
728+
mc = (
729+
MultiChartBuilder.from_chart(natal, "Natal")
730+
.add_progression(age=30, progression_type="secondary", label="2° Progressed")
731+
.add_progression(age=30, progression_type="tertiary", label="3° Progressed")
732+
.calculate()
733+
)
734+
735+
print(f"Charts: {mc.labels}")
736+
print(f" Natal Sun: {mc.chart1.get_object('Sun').longitude:.2f}°")
737+
print(f" Secondary Sun: {mc.chart2.get_object('Sun').longitude:.2f}°")
738+
print(f" Tertiary Sun: {mc.chart3.get_object('Sun').longitude:.2f}°")
739+
740+
output = OUTPUT_DIR / "19_triwheel_secondary_tertiary.svg"
741+
mc.draw(str(output)).save()
742+
print(f"\nSaved: {output}")
743+
744+
584745
# =============================================================================
585746
# RUN ALL EXAMPLES
586747
# =============================================================================
@@ -589,7 +750,8 @@ def example_15_progression_with_solar_arc_biwheel():
589750
def main():
590751
"""Run all progression cookbook examples."""
591752
print("\n" + "=" * 60)
592-
print(" SECONDARY PROGRESSIONS COOKBOOK")
753+
print(" PROGRESSIONS COOKBOOK")
754+
print(" Secondary, Tertiary, and Minor Progressions")
593755
print(" Stellium - Computational Astrology Library")
594756
print("=" * 60)
595757

@@ -620,6 +782,12 @@ def main():
620782
example_14_draw_progression_biwheel()
621783
example_15_progression_with_solar_arc_biwheel()
622784

785+
# Part 7: Tertiary and Minor Progressions
786+
example_16_tertiary_progressions()
787+
example_17_minor_progressions()
788+
example_18_compare_progression_types()
789+
example_19_triwheel_with_tertiary()
790+
623791
print("\n" + "=" * 60)
624792
print(" All examples complete!")
625793
print(f" Output directory: {OUTPUT_DIR}")

0 commit comments

Comments
 (0)