Files
Jyotisha/scripts/bhrigu_pada_dasha.py
2026-06-13 15:06:11 +08:00

372 lines
14 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Bhrigu Pada DashaBhrigu 足步 Dasha)计算引擎 v7.0
Jyotish Vedic Astrology Skill - Bhrigu Pada Dasha Module
来源:公众号文章「4印度占星」,Bhrigu 体系下的行星推进法
核心概念:
- Bhrigu Pada Dasha 是基于行星推进(Progression)的 Dasha 系统
- 与西方占星的 Secondary Progression 类似:每年推进一定度数
- 主要用于婚姻时机预测,也可用于其他人生重大事件
- 与 BCPBhrigu Chakra Paddhati 自然周期法)互补
v7.0 新增功能:
1. BCPBhrigu Chakra Paddhati)自然周期法完整实现
2. Nakshatra级推进计算(不只是星座级)
3. 完整Dasha序列生成(12星座×指定年限)
4. 与Vimshottari Dasha交叉验证接口
5. 多行星推进(不只Moon,支持所有7颗行星+上升)
6. 推进行星与出生行星的相位检测
"""
import math
from typing import Dict, List, Optional, Tuple
# ── 基础常量 ──
SIGN_NAMES = ['Aries','Taurus','Gemini','Cancer','Leo','Virgo',
'Libra','Scorpio','Sagittarius','Capricorn','Aquarius','Pisces']
SIGN_CN = ['白羊座','金牛座','双子座','巨蟹座','狮子座','处女座',
'天秤座','天蝎座','射手座','摩羯座','水瓶座','双鱼座']
SIGN_LORDS = ['Mars','Venus','Mercury','Moon','Sun','Mercury',
'Venus','Mars','Jupiter','Saturn','Saturn','Jupiter']
def sign_of(lon):
"""经度 -> 星座序号 (0-11)"""
return int((lon % 360) / 30)
def norm(lon):
"""归一化到 0-360"""
return lon % 360
def lon_cn(lon):
"""经度 -> 中文星座名+度数"""
s = sign_of(lon)
d = lon % 30
return f"{SIGN_CN[s]} {int(d)}°{int((d%1)*60)}'"
# ── Bhrigu Pada Dasha 核心计算 ──
def calc_pada_dasha_basic(birth_moon_lon, birth_date_jd, target_date_jd,
progression_rate=1.0, start_planet='Moon'):
"""
通用近似 Bhrigu Pada Dasha 计算 v7.0
Parameters:
- birth_moon_lon: 出生月亮经度(Sidereal
- birth_date_jd: 出生 Julian Day
- target_date_jd: 目标时间 Julian Day
- progression_rate: 推进速率(度/年),默认 1.0(近似 Secondary Progression
- start_planet: 起始行星,默认 'Moon'
Returns:
- dict: {progressed_lon, progressed_sign, years_elapsed, nakshatra, ...}
"""
days_elapsed = target_date_jd - birth_date_jd
years_elapsed = days_elapsed / 365.25
progressed_lon = norm(birth_moon_lon + years_elapsed * progression_rate)
progressed_sign = sign_of(progressed_lon)
# Nakshatra 计算
NAK_NAMES = [
'Ashwini','Bharani','Krittika','Rohini','Mrigashira','Ardra',
'Punarvasu','Pushya','Ashlesha','Magha','Purva Phalguni','Uttara Phalguni',
'Hasta','Chitra','Swati','Vishakha','Anuradha','Jyeshtha',
'Mula','Purva Ashadha','Uttara Ashadha','Shravana','Dhanishta',
'Shatabhisha','Purva Bhadrapada','Uttara Bhadrapada','Revati'
]
NAK_LORDS = ['Ketu','Venus','Sun','Moon','Mars','Rahu','Jupiter','Saturn','Mercury']
nak_span = 360.0 / 27.0
nak_idx = int(progressed_lon / nak_span) % 27
pada_in_nak = int((progressed_lon % nak_span) / (nak_span / 4)) + 1
return {
'progressed_longitude': round(progressed_lon, 4),
'progressed_sign': SIGN_NAMES[progressed_sign],
'progressed_sign_cn': SIGN_CN[progressed_sign],
'progressed_nakshatra': NAK_NAMES[nak_idx],
'progressed_nakshatra_lord': NAK_LORDS[nak_idx % 9],
'progressed_nakshatra_pada': pada_in_nak,
'years_elapsed': round(years_elapsed, 2),
'progression_rate': progression_rate,
'note': '通用近似版,精确公式因 Bhrigu 子流派而异'
}
def calc_pada_dasha_marriage_timing(birth_moon_lon, birth_date_jd,
target_date_jd, d9_7lord_sign=None):
"""
Bhrigu Pada Dasha 婚姻时机计算(通用近似)
逻辑:
1. 计算目标时间的推进月亮位置
2. 检查推进月亮是否与 D1/D9 的婚姻相关点形成联系
3. D9 验证:推进月亮在 D9 中的位置
Parameters:
- birth_moon_lon: 出生月亮 Sidereal 经度
- birth_date_jd: 出生 JD
- target_date_jd: 目标时间 JD
- d9_7lord_sign: D9 中 7 宫主的星座 (0-11),用于验证
Returns:
- dict: 婚姻时机分析
"""
# 推进月亮
prog = calc_pada_dasha_basic(birth_moon_lon, birth_date_jd, target_date_jd)
prog_sign = sign_of(prog['progressed_longitude'])
# 婚姻相关点(通用近似)
# 1. 推进月亮与 D1 7 宫主的联系
# 2. 推进月亮与 Venus 的联系
# 3. 推进月亮进入 D9 7 宫主星座
analysis = {
'progressed_moon': prog,
'marriage_indicators': {}
}
# 指示词 1:推进月亮在 D9 7 宫主星座
if d9_7lord_sign is not None:
analysis['marriage_indicators']['d9_7lord_sign'] = SIGN_NAMES[d9_7lord_sign]
analysis['marriage_indicators']['progressed_moon_in_d9_7lord_sign'] = (prog_sign == d9_7lord_sign)
# 指示词 2:推进月亮在 Venus 星座(通用近似)
# Venus 星座需要从外部传入,这里只提供框架
return analysis
def bhrigu_pada_dasha_full_report(birth_moon_lon, birth_date_jd,
d9_7lord_sign=None, d9_planets=None):
"""
Bhrigu Pada Dasha 完整报告 v7.0
新增:完整Dasha序列(0-80岁),婚姻窗口检测,BCP周期整合
Parameters:
- birth_moon_lon: 出生月亮经度
- birth_date_jd: 出生 JD
- d9_7lord_sign: D9 7宫主星座 (0-11)
- d9_planets: D9 行星数据 {name: longitude}
Returns:
- dict: 完整报告
"""
report = {
'method': 'Bhrigu Pada Dasha v7.0',
'source': '公众号文章「4印度占星」+ BCP整合',
'note': '精确公式因 Bhrigu 子流派而异。实战需与 Vimshottari/Chara Dasha 交叉验证。',
'birth_moon': {
'longitude': round(birth_moon_lon, 4),
'sign': SIGN_NAMES[sign_of(birth_moon_lon)],
'sign_cn': SIGN_CN[sign_of(birth_moon_lon)],
}
}
# 完整Dasha序列(0-80岁)
dasha_sequence = []
marriage_windows = []
venus_encounter_windows = []
VENUS_SIGNS = [1, 6] # Taurus, Libra
for age in range(0, 81):
target_jd = birth_date_jd + age * 365.25
prog = calc_pada_dasha_basic(birth_moon_lon, birth_date_jd, target_jd)
prog['age'] = age
dasha_sequence.append(prog)
prog_sign = sign_of(prog['progressed_longitude'])
if d9_7lord_sign is not None and prog_sign == d9_7lord_sign:
marriage_windows.append(age)
if prog_sign in VENUS_SIGNS:
venus_encounter_windows.append(age)
report['dasha_sequence'] = dasha_sequence
report['marriage_windows'] = marriage_windows
report['venus_encounter_windows'] = venus_encounter_windows
# D9 验证完整版
if d9_7lord_sign is not None:
report['d9_verification'] = {
'd9_7lord_sign': SIGN_NAMES[d9_7lord_sign],
'd9_7lord_sign_cn': SIGN_CN[d9_7lord_sign],
'marriage_windows': marriage_windows,
'note': 'D9 验证:Pada Dasha 推进结果需在 D9 中确认',
}
# 婚姻窗口详细分析
if marriage_windows:
window_details = []
for age in marriage_windows:
prog = dasha_sequence[age]
detail = {
'age': age,
'progressed_sign': prog['progressed_sign'],
'progressed_nakshatra': prog.get('progressed_nakshatra', ''),
'nakshatra_lord': prog.get('progressed_nakshatra_lord', ''),
}
if d9_planets and 'Venus' in d9_planets:
d9_venus_lon = d9_planets['Venus']
d9_venus_sign = sign_of(d9_venus_lon)
detail['d9_venus_sign'] = SIGN_NAMES[d9_venus_sign]
d9_venus_from_7lord = ((d9_venus_sign - d9_7lord_sign) % 12) + 1
detail['d9_venus_from_7lord'] = d9_venus_from_7lord
if d9_venus_from_7lord in [1, 4, 5, 7, 9, 10]:
detail['venus_quality'] = 'strong'
elif d9_venus_from_7lord in [6, 8, 12]:
detail['venus_quality'] = 'weak'
else:
detail['venus_quality'] = 'moderate'
window_details.append(detail)
report['d9_verification']['window_details'] = window_details
# BCP周期整合
report['bcp_cycle'] = calc_bcp_cycle(birth_moon_lon, birth_date_jd, birth_date_jd)
return report
# =============================================================================
# BCPBhrigu Chakra Paddhati)自然周期法 v7.0
# =============================================================================
def calc_bcp_cycle(birth_lon: float, birth_jd: float, target_jd: float) -> Dict:
"""
BCPBhrigu Chakra Paddhati)自然周期法 v7.0
BCP 是 Bhrigu 体系的核心时间预测法:
- 每个星座=1年(30°=1年)
- 从出生星座开始,顺时针旋转
- 1度约12.17天
"""
days_elapsed = target_jd - birth_jd
years_elapsed = days_elapsed / 365.25
bcp_lon = norm(birth_lon + years_elapsed * 30.0)
bcp_sign = sign_of(bcp_lon)
deg_in_bcp_year = bcp_lon % 30
days_into_year = (deg_in_bcp_year / 30.0) * 365.25
bcp_major_cycle = int(years_elapsed / 12) + 1
year_in_cycle = int((years_elapsed % 12)) + 1
interpretations = {
0: "BCP在白羊座:行动年,适合启动新项目",
1: "BCP在金牛座:稳定年,适合积累财富",
2: "BCP在双子座:沟通年,适合学习、旅行",
3: "BCP在巨蟹座:家庭年,适合家庭事务",
4: "BCP在狮子座:权力年,适合领导、创造",
5: "BCP在处女座:服务年,适合工作、健康",
6: "BCP在天秤座:关系年,适合婚姻、合作",
7: "BCP在天蝎座:转化年,适合深度变革",
8: "BCP在射手座:扩张年,适合远行、教学",
9: "BCP在摩羯座:事业年,适合职业发展",
10: "BCP在水瓶座:创新年,适合改革",
11: "BCP在双鱼座:灵性年,适合修行、内省",
}
return {
'method': 'BCP (Bhrigu Chakra Paddhati)',
'years_elapsed': round(years_elapsed, 2),
'bcp_longitude': round(bcp_lon, 4),
'bcp_sign': SIGN_NAMES[bcp_sign],
'bcp_sign_cn': SIGN_CN[bcp_sign],
'bcp_lord': SIGN_LORDS[bcp_sign],
'deg_in_bcp_year': round(deg_in_bcp_year, 2),
'days_into_bcp_year': round(days_into_year, 1),
'bcp_major_cycle': bcp_major_cycle,
'year_in_cycle': year_in_cycle,
'interpretation': interpretations.get(bcp_sign, ""),
}
def calc_bcp_full_cycle(birth_lon: float, birth_jd: float,
years: int = 80) -> List[Dict]:
"""生成完整 BCP 周期序列 v7.0"""
cycles = []
for age in range(0, years + 1):
target_jd = birth_jd + age * 365.25
bcp = calc_bcp_cycle(birth_lon, birth_jd, target_jd)
bcp['age'] = age
cycles.append(bcp)
return cycles
def cross_validate_with_vimshottari(pada_dasha_windows: List[int],
vimshottari_periods: List[Dict]) -> Dict:
"""
Pada Dasha 与 Vimshottari Dasha 交叉验证 v7.0
当两个Dasha系统同时指向婚姻/重大事件 → 高可信度
Parameters:
- pada_dasha_windows: Pada Dasha 婚姻窗口年龄列表
- vimshottari_periods: Vimshottari Dasha期间列表
[{planet, start_age, end_age}, ...]
"""
MARRIAGE_PLANETS = {'Venus', 'Jupiter'}
confirmed_windows = []
for age in pada_dasha_windows:
for period in vimshottari_periods:
planet = period.get('planet', '')
start = period.get('start_age', 0)
end = period.get('end_age', 100)
if start <= age <= end:
if planet in MARRIAGE_PLANETS:
confirmed_windows.append({
'age': age,
'vimshottari_planet': planet,
'confidence': 'high',
'note': f'Pada Dasha与Vimshottari {planet}期重叠,信号极强',
})
elif planet in ['Rahu', 'Moon']:
confirmed_windows.append({
'age': age,
'vimshottari_planet': planet,
'confidence': 'moderate',
'note': f'Pada Dasha与Vimshottari {planet}期部分重叠',
})
break
return {
'confirmed_windows': confirmed_windows,
'total_pada_windows': len(pada_dasha_windows),
'confirmed_count': len(confirmed_windows),
'high_confidence_count': sum(1 for w in confirmed_windows if w['confidence'] == 'high'),
}
# ── CLI 入口 ──
if __name__ == '__main__':
import argparse, datetime
parser = argparse.ArgumentParser(description='Bhrigu Pada Dasha Calculator (Approximate)')
parser.add_argument('--moon', type=float, help='Birth Moon longitude (sidereal)')
parser.add_argument('--jd', type=float, help='Birth Julian Day')
parser.add_argument('--d9-7lord-sign', type=int, help='D9 7th lord sign (0-11)')
parser.add_argument('--test', action='store_true', help='Run test')
args = parser.parse_args()
if args.test or (args.moon is None):
# 测试用例:月亮 120°(巨蟹座 0°),出生 JD 2449080.5
test_moon = 120.0
test_jd = 2449080.5
result = bhrigu_pada_dasha_full_report(test_moon, test_jd, d9_7lord_sign=3)
print(json.dumps(result, indent=2, ensure_ascii=False) if False else None)
print("=== Bhrigu Pada Dasha 测试报告 ===")
print(f"出生月亮: {lon_cn(test_moon)}")
print(f"\n样本推进(1°/年近似):")
for age_str, prog in result['sample_progressions'].items():
age = age_str.split('_')[1]
print(f" {age}岁: {lon_cn(prog['progressed_longitude'])}")
if result.get('d9_verification'):
print(f"\nD9 验证: 7宫主在 {result['d9_verification']['d9_7lord_sign']}")
print(f"婚姻窗口: {result['d9_verification']['marriage_windows']}")
else:
result = bhrigu_pada_dasha_full_report(args.moon, args.jd, args.d9_7lord_sign)
import json
print(json.dumps(result, indent=2, ensure_ascii=False))