v6.0.20: Narayana Dasha (Rishi Dasha) implementation
Narayana Dasha is Parashara's rashi-based dasha system, complementary to Vimshottari (nakshatra-based). Algorithm: start from Lagna, each sign's dasha years = count from the sign to its lord's sign (zodiacal order). Implementation: - scripts/narayana_dasha.py: core calculation module - calc_narayana_mahadasha(): 12-sign sequence from Lagna - calc_narayana_antardasha(): sub-periods within each MD - get_current_narayana_dasha(): locate current period by age - scripts/cmd_narayana_dasha.py: CLI subcommand - jyotish_engine.py: Step 4.13 in full-reading + narayana-dasha subparser Verified with Leo Asc chart: total cycle 88 years, current Sagittarius MD (31-38 yrs, 5H/creativity) complements Vimshottari Saturn MD. Files: +2 new (narayana_dasha.py, cmd_narayana_dasha.py), +4 modified
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Narayana Dasha 子命令
|
||||
Jyotish Vedic Astrology Skill — v6.0.20
|
||||
"""
|
||||
|
||||
import json
|
||||
|
||||
|
||||
def cmd_narayana_dasha(args, chart_data):
|
||||
"""
|
||||
narayana-dasha 子命令:计算并报告 Narayana Dasha(Rishi Dasha)。
|
||||
|
||||
用法:
|
||||
python jyotish_engine.py narayana-dasha --year REDACTED_YEAR --month 4 --day 17 \\
|
||||
--hour 14 --minute 45 --lat 36.47 --lon 114.2 --tz 8 --age 33
|
||||
"""
|
||||
if chart_data is None:
|
||||
return "\n".join([
|
||||
"╔══════════════════════════════════════════╗",
|
||||
"║ Narayana Dasha(Rishi Dasha) ║",
|
||||
"╚══════════════════════════════════════════╝",
|
||||
"",
|
||||
"错误:图表数据未生成(swisseph 可能未安装)。",
|
||||
"Narayana Dasha 需要完整的行星经度数据。",
|
||||
])
|
||||
|
||||
from narayana_dasha import narayana_dasha_full_report
|
||||
|
||||
planet_lons = {}
|
||||
for pn, pd in chart_data.get('planets', {}).items():
|
||||
if isinstance(pd, dict) and 'degree' in pd:
|
||||
planet_lons[pn] = pd['degree']
|
||||
|
||||
asc_idx = chart_data.get('ascendant', {}).get('sign_idx', 0)
|
||||
if isinstance(asc_idx, str):
|
||||
asc_idx = int(asc_idx)
|
||||
|
||||
current_age = float(getattr(args, 'age', 0) or 0)
|
||||
birth_year = getattr(args, 'year', 0) or 0
|
||||
|
||||
result = narayana_dasha_full_report(
|
||||
lagna_sign_idx=asc_idx,
|
||||
planet_lons=planet_lons,
|
||||
current_age=current_age,
|
||||
birth_year=birth_year,
|
||||
)
|
||||
|
||||
# 格式化输出
|
||||
lines = [
|
||||
"╔══════════════════════════════════════════╗",
|
||||
"║ Narayana Dasha(Rishi Dasha) ║",
|
||||
"╚══════════════════════════════════════════╝",
|
||||
"",
|
||||
f"Lagna: {result['lagna_sign']}({result['lagna_sign_idx']})",
|
||||
f"总周期: {result['total_cycle_years']} 年",
|
||||
"",
|
||||
"── 大运序列 ──",
|
||||
]
|
||||
|
||||
for p in result['mahadasha_sequence']:
|
||||
lines.append(
|
||||
f" {p['sign']:>12s} ({p['lord']:>7s} in {p['lord_in_sign']:>12s}): "
|
||||
f"{p['years']:2d}年 [{p['start_age']:5.1f}→{p['end_age']:5.1f}]"
|
||||
)
|
||||
|
||||
curr = result.get('current_dasha', {})
|
||||
md = curr.get('md')
|
||||
if md:
|
||||
lines.append("")
|
||||
lines.append(f"── 当前大运(age={current_age:.1f})──")
|
||||
lines.append(f" Mahadasha: {md['sign']}({md['lord']}){md['years']}年")
|
||||
lines.append(f" 剩余: {curr.get('remaining_years', 0):.1f}年")
|
||||
|
||||
ad = curr.get('ad')
|
||||
if ad:
|
||||
lines.append(f" Antardasha: {ad['sign']}({ad['lord']}){ad['years']}年")
|
||||
|
||||
lines.append("")
|
||||
for line in result.get('interpretation', []):
|
||||
lines.append(f" {line}")
|
||||
|
||||
return "\n".join(lines)
|
||||
Reference in New Issue
Block a user