@@ -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"\n Natal 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 ("\n Tertiary + 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 ("\n Progressed 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"\n Saved: { output } " )
743+
744+
584745# =============================================================================
585746# RUN ALL EXAMPLES
586747# =============================================================================
@@ -589,7 +750,8 @@ def example_15_progression_with_solar_arc_biwheel():
589750def 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