Initial commit: 印度占星(Jyotish)专业解盘与推运系统

- 核心能力:行星配置、Yoga格局、Nakshatra解读、宫位分析、现代生活场景映射、出生时间矫正、Dasha+Transit推运、精确预测
- 完整方法论:三层验证法、五级大运联动、婚姻/职业/财富预测清单
- 参考文档:15个专业文档(Yoga、Dasha、Nakshatra、宫位映射、名人案例等)
- 能力水平:高级专业占星师(5.0/5)
- 更新记录:2026-04-20 完成全网相似案例搜索、宫位现代生活场景映射学习
This commit is contained in:
732642856
2026-04-20 20:58:21 +08:00
commit a5bbba281f
22 changed files with 5716 additions and 0 deletions
+229
View File
@@ -0,0 +1,229 @@
#!/usr/bin/env python3
"""
印度占星 Dasha 推算脚本
基于用户提供的星盘数据(月亮Nakshatra + 出生日期)推算大运/小运时间线
用法:
python3 dasha_analyzer.py --nakshatra "Jyeshtha" --pada 3 --birthdate 1985-08-20
python3 dasha_analyzer.py --moon-lon 226.5 --birthdate 1985-08-20
"""
import argparse
from datetime import datetime, timedelta
# Nakshatra 对应大运主星与年限
NAKSHATRA_LIST = [
("Ashwini", "Ketu", 7),
("Bharani", "Venus", 20),
("Krittika", "Sun", 6),
("Rohini", "Moon", 10),
("Mrigashira", "Mars", 7),
("Ardra", "Rahu", 18),
("Punarvasu", "Jupiter", 16),
("Pushya", "Saturn", 19),
("Ashlesha", "Mercury", 17),
("Magha", "Ketu", 7),
("Purva Phalguni", "Venus", 20),
("Uttara Phalguni", "Sun", 6),
("Hasta", "Moon", 10),
("Chitra", "Mars", 7),
("Swati", "Rahu", 18),
("Vishakha", "Jupiter", 16),
("Anuradha", "Saturn", 19),
("Jyeshtha", "Mercury", 17),
("Mula", "Ketu", 7),
("Purva Ashadha", "Venus", 20),
("Uttara Ashadha", "Sun", 6),
("Shravana", "Moon", 10),
("Dhanishtha", "Mars", 7),
("Shatabhisha", "Rahu", 18),
("Purva Bhadrapada", "Jupiter", 16),
("Uttara Bhadrapada", "Saturn", 19),
("Revati", "Mercury", 17),
]
DASHA_ORDER = ["Ketu","Venus","Sun","Moon","Mars","Rahu","Jupiter","Saturn","Mercury"]
DASHA_YEARS = {"Ketu":7,"Venus":20,"Sun":6,"Moon":10,"Mars":7,"Rahu":18,"Jupiter":16,"Saturn":19,"Mercury":17}
PLANET_CN = {
"Ketu":"南交点 Ketu ☄️",
"Venus":"金星 Venus ♀",
"Sun":"太阳 Sun ☀️",
"Moon":"月亮 Moon 🌙",
"Mars":"火星 Mars ♂",
"Rahu":"北交点 Rahu 🐉",
"Jupiter":"木星 Jupiter ♃",
"Saturn":"土星 Saturn ♄",
"Mercury":"水星 Mercury ☿",
}
def fuzzy_match_nakshatra(name):
"""模糊匹配 Nakshatra 名称"""
name_lower = name.lower().replace(" ", "").replace("-", "")
for nak in NAKSHATRA_LIST:
if name_lower in nak[0].lower().replace(" ", ""):
return nak
if nak[0].lower().replace(" ", "").startswith(name_lower[:5]):
return nak
return None
def lon_to_nakshatra(moon_lon):
"""月亮黄经(0-360)→ Nakshatra + Pada"""
nak_span = 360 / 27
pada_span = nak_span / 4
idx = int(moon_lon / nak_span)
progress = (moon_lon % nak_span) / nak_span
pada = int((moon_lon % nak_span) / pada_span) + 1
return NAKSHATRA_LIST[idx], progress, pada
def build_dasha_timeline(birth_date_str, nak_info, nak_progress):
"""构建完整大运时间线"""
birth_dt = datetime.strptime(birth_date_str, "%Y-%m-%d")
nak_name, start_lord, start_years = nak_info
# 当前大运已经走了多少年
elapsed = nak_progress * start_years
remaining = start_years - elapsed
# 当前大运的实际开始时间(往回推)
current_dasha_start = birth_dt - timedelta(days=elapsed * 365.25)
start_idx = DASHA_ORDER.index(start_lord)
timeline = []
dt = current_dasha_start
for i in range(9):
lord = DASHA_ORDER[(start_idx + i) % 9]
years = DASHA_YEARS[lord]
end_dt = dt + timedelta(days=years * 365.25)
timeline.append({
"lord": lord,
"start": dt,
"end": end_dt,
"years": years,
})
dt = end_dt
return timeline, round(elapsed, 2), round(remaining, 2), start_lord
def build_antardasha(mahadasha):
"""计算某个大运内的全部小运"""
lord = mahadasha["lord"]
total_days = (mahadasha["end"] - mahadasha["start"]).days
start_idx = DASHA_ORDER.index(lord)
sub_list = []
dt = mahadasha["start"]
for i in range(9):
sub_lord = DASHA_ORDER[(start_idx + i) % 9]
sub_years = DASHA_YEARS[sub_lord]
# 小运时长 = 大运总年数 × 小运行星年占比 / 120
sub_days = total_days * sub_years / 120
end_dt = dt + timedelta(days=sub_days)
sub_list.append({
"lord": sub_lord,
"start": dt,
"end": end_dt,
})
dt = end_dt
return sub_list
def find_current(timeline, today):
"""找到当前所处的大运"""
for i, d in enumerate(timeline):
if d["start"] <= today < d["end"]:
return i, d
return len(timeline) - 1, timeline[-1]
def find_current_sub(sub_list, today):
"""找到当前小运"""
for d in sub_list:
if d["start"] <= today < d["end"]:
return d
return sub_list[-1]
def print_timeline(timeline, today, show_sub=True):
print(f"\n{'='*62}")
print(f" 📅 Vimshottari Dasha 大运时间线")
print(f"{'='*62}")
print(f" {'大运主星':<22} {'开始':<10} {'结束':<10} {'年限':>4}")
print(f" {'-'*58}")
cur_idx, cur_dasha = find_current(timeline, today)
for i, d in enumerate(timeline):
marker = " ◀ 当前" if i == cur_idx else ""
print(f" {PLANET_CN[d['lord']]:<20} {d['start'].strftime('%Y-%m'):<10} {d['end'].strftime('%Y-%m'):<10} {d['years']:>2}{marker}")
# 当前大运小运展开
if show_sub:
print(f"\n{'='*62}")
print(f" 🔍 当前大运 [{PLANET_CN[cur_dasha['lord']]}] 小运展开")
print(f"{'='*62}")
sub_list = build_antardasha(cur_dasha)
cur_sub = find_current_sub(sub_list, today)
print(f" {'小运主星':<22} {'开始':<10} {'结束'}")
print(f" {'-'*50}")
for s in sub_list:
marker = " ◀ 当前" if s == cur_sub else ""
print(f" {PLANET_CN[s['lord']]:<20} {s['start'].strftime('%Y-%m-%d'):<10} {s['end'].strftime('%Y-%m-%d')}{marker}")
# 当前小运剩余时间
remaining_days = (cur_sub["end"] - today).days
print(f"\n 当前小运 [{PLANET_CN[cur_sub['lord']]}] 将于 {cur_sub['end'].strftime('%Y年%m月%d')} 结束")
print(f" 剩余约 {remaining_days} 天({round(remaining_days/30.44, 1)} 个月)")
def main():
parser = argparse.ArgumentParser(description='印度占星 Dasha 推算器(基于已知星盘)')
parser.add_argument('--nakshatra', help='月亮 Nakshatra 名称,如 "Jyeshtha"')
parser.add_argument('--pada', type=int, default=None, help='Nakshatra Pada1-4')
parser.add_argument('--moon-lon', type=float, help='月亮恒星黄经(0-360),与--nakshatra二选一')
parser.add_argument('--birthdate', required=True, help='出生日期 YYYY-MM-DD')
parser.add_argument('--today', default=None, help='计算基准日期 YYYY-MM-DD(默认今天)')
args = parser.parse_args()
today = datetime.strptime(args.today, "%Y-%m-%d") if args.today else datetime.now()
print(f"\n{'='*62}")
print(f" 🌙 印度占星 Vimshottari Dasha 推算器")
print(f"{'='*62}")
print(f" 出生日期:{args.birthdate}")
print(f" 计算基准:{today.strftime('%Y-%m-%d')}")
if args.nakshatra:
nak_info = fuzzy_match_nakshatra(args.nakshatra)
if not nak_info:
print(f" ❌ 未找到 Nakshatra{args.nakshatra}")
print(f" 请检查拼写,或使用 --moon-lon 直接输入月亮黄经")
return
# 若提供了Pada,推算更精确的进度
if args.pada:
pada = max(1, min(4, args.pada))
progress = (pada - 1) / 4 + 0.125 # 每Pada约25%,取中间值
else:
progress = 0.5 # 默认取中间
print(f" 月亮星宿:{nak_info[0]}(大运主星:{nak_info[1]}{nak_info[2]}年)")
if args.pada:
print(f" Pada:第{args.pada}Pada")
elif args.moon_lon is not None:
nak_info, progress, pada = lon_to_nakshatra(args.moon_lon % 360)
print(f" 月亮黄经:{args.moon_lon:.2f}°")
print(f" 月亮星宿:{nak_info[0]}(第{pada}Pada,大运主星:{nak_info[1]}")
else:
print(" ❌ 请提供 --nakshatra 或 --moon-lon")
return
timeline, elapsed, remaining, start_lord = build_dasha_timeline(args.birthdate, nak_info, progress)
print(f"\n 出生时处于 [{PLANET_CN[start_lord]}] 大运")
print(f" 出生时已历时约 {elapsed} 年,剩余约 {remaining}")
print_timeline(timeline, today)
print(f"\n{'='*62}\n")
if __name__ == '__main__':
main()
+268
View File
@@ -0,0 +1,268 @@
#!/usr/bin/env python3
"""
Vedic Astrology Dasha Period Calculator
计算印度占星大运周期
This script helps calculate Dasha periods based on Nakshatra position.
"""
# Standard Vimshottari Dasha periods in years
VIMSHOTTARI_PERIODS = {
'Ketu': 7,
'Venus': 20,
'Sun': 6,
'Moon': 10,
'Mars': 7,
'Rahu': 18,
'Jupiter': 16,
'Saturn': 19,
'Mercury': 17
}
# Planetary order in Vimshottari Dasha
DASHA_ORDER = ['Ketu', 'Venus', 'Sun', 'Moon', 'Mars', 'Rahu', 'Jupiter', 'Saturn', 'Mercury']
def calculate_mahadasha(birth_nakshatra):
"""
Calculate starting Mahadasha based on Moon's Nakshatra at birth
Args:
birth_nakshatra: Nakshatra where Moon was at birth (1-27)
Returns:
Dict with starting Mahadasha lord and remaining years in that period
"""
nakshatra_num = birth_nakshatra
# Map Nakshatra to starting planet
# Ashwini (1), Magha (10), Mula (19) -> Ketu
# Bharani (2), Purva Phalguni (11), Purva Ashadha (20) -> Venus
# Krittika (3), Uttara Phalguni (12), Uttara Ashadha (21) -> Sun
# Rohini (4), Hasta (13), Shravana (22) -> Moon
# Mrigashira (5), Chitra (14), Dhanishta (23) -> Mars
# Ardra (6), Swati (15), Shatabhisha (24) -> Rahu
# Punarvasu (7), Vishakha (16), Purva Bhadrapada (25) -> Jupiter
# Pushya (8), Anuradha (17), Uttara Bhadrapada (26) -> Saturn
# Ashlesha (9), Jyeshtha (18), Revati (27) -> Mercury
# Find remainder when nakshatra number is divided by 9
remainder = nakshatra_num % 9
if remainder == 0:
remainder = 9
# Get the starting Dasha lord
starting_planet_index = remainder - 1 # Convert to 0-indexed
starting_planet = DASHA_ORDER[starting_planet_index]
# Calculate remaining years in first Mahadasha
total_years = VIMSHOTTARI_PERIODS[starting_planet]
nakshatra_pada = ((nakshatra_num - 1) % 4) + 1 # Get pada (1-4)
# Each pada = 1/4 of the period (approximately)
# For precise calculation, need Moon's degree within Nakshatra
remaining_years = total_years - (nakshatra_pada - 1) * (total_years / 4)
return {
'starting_mahadasha': starting_planet,
'total_years': total_years,
'remaining_years': remaining_years,
'starting_age': remaining_years - total_years # Should be negative
}
def get_mahadasha_sequence(starting_planet):
"""
Get the complete Mahadasha sequence starting from given planet
Args:
starting_planet: Planet that starts the sequence
Returns:
List of tuples (planet, years) in sequence
"""
sequence = []
# Find starting index
start_index = DASHA_ORDER.index(starting_planet)
# Build sequence (120 years total)
for i in range(9): # 9 planets
planet_index = (start_index + i) % 9
planet = DASHA_ORDER[planet_index]
years = VIMSHOTTARI_PERIODS[planet]
sequence.append((planet, years))
return sequence
def calculate_bhukti(mahadasha_planet, years_into_mahadasha):
"""
Calculate current Bhukti (sub-period) within Mahadasha
Args:
mahadasha_planet: Current Mahadasha lord
years_into_mahadasha: Years elapsed in current Mahadasha
Returns:
Dict with current Bhukti and remaining years
"""
mahadasha_total = VIMSHOTTARI_PERIODS[mahadasha_planet]
sequence = get_mahadasha_sequence(mahadasha_planet)
years_remaining = years_into_mahadasha
for planet, years in sequence:
if years_remaining <= years:
return {
'bhukti_lord': planet,
'bhukti_years': years,
'years_into_bhukti': years_remaining,
'years_remaining': years - years_remaining,
'bhukti_percentage': (years_remaining / years) * 100
}
years_remaining -= years
return None
def calculate_pratyantar_dasha(mahadasha_planet, bhukti_planet, years_into_bhukti):
"""
Calculate Pratyantar Dasha (sub-sub-period)
This is a more detailed calculation based on the ratio of the
Mahadasha and Bhukti periods.
"""
mahadasha_years = VIMSHOTTARI_PERIODS[mahadasha_planet]
bhukti_years = VIMSHOTTARI_PERIODS[bhukti_planet]
# Pratyantar Dasha proportion = (Bhukti years / 120) * Mahadasha years
pratyantar_proportion = (bhukti_years / 120) * mahadasha_years
sequence = get_mahadasha_sequence(mahadasha_planet)
pratyantar_sequence = []
for planet, _ in sequence:
pratyantar_years = (VIMSHOTTARI_PERIODS[planet] / 120) * pratyantar_proportion
pratyantar_sequence.append((planet, pratyantar_years))
return pratyantar_sequence
def get_current_dasha_period(birth_nakshatra, current_age):
"""
Get complete current Dasha hierarchy (Mahadasha, Bhukti, Pratyantar)
Args:
birth_nakshatra: Moon's Nakshatra at birth (1-27)
current_age: Current age of native
Returns:
Dict with complete Dasha hierarchy
"""
# Calculate starting Mahadasha
start_info = calculate_mahadasha(birth_nakshatra)
# Find current Mahadasha
sequence = get_mahadasha_sequence(start_info['starting_mahadasha'])
years_elapsed = current_age
current_mahadasha = None
years_in_mahadasha = 0
for planet, years in sequence:
if years_elapsed <= years:
current_mahadasha = planet
years_in_mahadasha = years_elapsed
break
years_elapsed -= years
if not current_mahadasha:
return None
# Calculate Bhukti
bhukti_info = calculate_bhukti(current_mahadasha, years_in_mahadasha)
# Calculate Pratyantar Dasha
if bhukti_info:
pratyantar_sequence = calculate_pratyantar_dasha(
current_mahadasha,
bhukti_info['bhukti_lord'],
bhukti_info['years_into_bhukti']
)
# Find current Pratyantar
years_in_bhukti = bhukti_info['years_into_bhukti']
current_pratyantar = None
for planet, years in pratyantar_sequence:
if years_in_bhukti <= years:
current_pratyantar = planet
break
years_in_bhukti -= years
else:
current_pratyantar = None
pratyantar_sequence = []
return {
'mahadasha': {
'lord': current_mahadasha,
'years_into_period': years_in_mahadasha,
'total_years': VIMSHOTTARI_PERIODS[current_mahadasha]
},
'bhukti': bhukti_info,
'pratyantar': {
'lord': current_pratyantar,
'sequence': pratyantar_sequence
}
}
def print_dasha_summary(birth_nakshatra, current_age):
"""
Print a formatted summary of current Dasha period
"""
current_dasha = get_current_dasha_period(birth_nakshatra, current_age)
if not current_dasha:
print("Error: Unable to calculate Dasha period")
return
print("=" * 60)
print("CURRENT DASHA PERIOD")
print("=" * 60)
print(f"Moon Nakshatra at Birth: {birth_nakshatra}")
print(f"Current Age: {current_age} years")
print("-" * 60)
# Mahadasha
md = current_dasha['mahadasha']
print(f"Mahadasha: {md['lord']} (Lord)")
print(f" Years into period: {md['years_into_period']:.2f} / {md['total_years']}")
print(f" Percentage: {(md['years_into_period'] / md['total_years']) * 100:.1f}%")
# Bhukti
bk = current_dasha['bhukti']
if bk:
print(f"\nBhukti (Sub-period): {bk['bhukti_lord']} (Lord)")
print(f" Years into Bhukti: {bk['years_into_bhukti']:.2f} / {bk['bhukti_years']}")
print(f" Percentage: {bk['bhukti_percentage']:.1f}%")
# Pratyantar
pr = current_dasha['pratyantar']
if pr['lord']:
print(f"\nPratyantar (Sub-sub-period): {pr['lord']} (Lord)")
print("=" * 60)
# Example usage
if __name__ == "__main__":
# Example: Moon in 3rd Nakshatra (Krittika) at birth, native is 35 years old
print("Example: Moon in Krittika (Nakshatra 3), Age 35")
print_dasha_summary(birth_nakshatra=3, current_age=35)
print("\n\n")
# Example: Moon in 14th Nakshatra (Chitra) at birth, native is 42 years old
print("Example: Moon in Chitra (Nakshatra 14), Age 42")
print_dasha_summary(birth_nakshatra=14, current_age=42)
+19
View File
@@ -0,0 +1,19 @@
#!/usr/bin/env python3
"""
Example helper script for jyotish-vedic-astrology
This is a placeholder script that can be executed directly.
Replace with actual implementation or delete if not needed.
Example real scripts from other skills:
- pdf/scripts/fill_fillable_fields.py - Fills PDF form fields
- pdf/scripts/convert_pdf_to_images.py - Converts PDF pages to images
"""
def main():
print("This is an example script for jyotish-vedic-astrology")
# TODO: Add actual script logic here
# This could be data processing, file conversion, API calls, etc.
if __name__ == "__main__":
main()