v6.0.15: 新增 Tithi Lord + Pancha Pakshi + Rashi Tulya Navamsa 技法

- scripts/tithi_lord.py(新):Tithi Lord 计算模块
- scripts/pancha_pakshi.py(新):Pancha Pakshi 五鸟系统
- scripts/rashi_tulya_navamsa.py(新):Rashi Tulya Navamsa D1-D9 对比分析
- scripts/jyotish_engine.py:Step 4.10 集成 3 个新技法
- references/technique_registry.json:新增 3 个技法注册
- CHANGELOG.md:新增 v6.0.15 条目
- SKILL.md:版本号 6.0.14 → 6.0.15
This commit is contained in:
732642856
2026-06-04 05:31:55 +08:00
parent 63fb547dda
commit de07e98a3d
7 changed files with 795 additions and 5 deletions
+36
View File
@@ -1,5 +1,41 @@
# 印度占星 Skill 更新日志
## v6.0.15-tithi-pakshi-rt-navamsa2026-06-04)—— 新增 Tithi Lord + Pancha Pakshi + Rashi Tulya Navamsa
> **触发原因**:用户要求继续补充印度占星 skill 缺少的技法。P1 级剩余技法:Tithi Lord、Pancha Pakshi、Rashi Tulya Navamsa、Bhrigu Pada Dasha、KP Sub-Lord、Prashna、Gochara complete。本轮实现前 3 项。
### 新增功能
- `scripts/tithi_lord.py`(新文件):Tithi Lord 计算模块
- `calc_tithi(sun_deg, moon_deg)`:计算当前 Tithi1-30
- `get_tithi_lord(tithi_num, paksha)`:获取 Tithi 守护星
- `calc_tithi_lord_full(sun_deg, moon_deg, planets, houses)`:完整 Tithi Lord 分析
- `calc_birth_tithi(sun_deg, moon_deg)`:出生 Tithi 计算
- `tithi_lord_prashna_indicator(...)`Prashna 时机指标
- `scripts/pancha_pakshi.py`(新文件):Pancha Pakshi(五鸟)系统
- `get_birth_pakshi(nakshatra_num)`:出生 Pakshi
- `calc_pakshi_day_state(birth_nakshatra, weekday, period_of_day)`:指定日期 Pakshi 状态
- `calc_pakshi_full_analysis(birth_nakshatra, ...)`:完整五鸟分析
- `pancha_pakshi_prashna_guide(...)`Prashna 指导
- `scripts/rashi_tulya_navamsa.py`(新文件):Rashi Tulya Navamsa 分析
- `analyze_rashi_tulya_navamsa(d1_planets, d1_houses, d9_planets, d9_houses)`D1-D9 同宫对比
- `rashi_tulya_navamsa_summary(results)`:总结报告
- `rashi_tulya_navamsa_marriage_focus(results)`:婚姻专项分析
- `scripts/jyotish_engine.py``cmd_full_reading` 新增 Step 4.10
- 调用 `calc_tithi_lord_full``modules.tithi_lord`
- 调用 `calc_pakshi_full_analysis``modules.pancha_pakshi`
- 调用 `analyze_rashi_tulya_navamsa``modules.rashi_tulya_navamsa`
- `references/technique_registry.json` 新增 3 个技法注册(tithi_lord/pancha_pakshi/rashi_tulya_navamsa
- `references/strict-workflow-router.md`Audit Table 模板新增 3 行
### 技法状态变更
| 技法 | 原状态 | 新状态 | 说明 |
|------|--------|--------|------|
| tithi_lord | missing | partial | 基础 Tithi 计算已实现,Prashna 集成待完善 |
| pancha_pakshi | missing | partial | 基础五鸟计算已实现,Tamil 文献校准待完善 |
| rashi_tulya_navamsa | missing | partial | D1-D9 同宫对比已实现,婚姻专项分析待完善 |
## v6.0.14-yogas-doshas-dk2026-06-04)—— 新增 Yogas + Doshas + Special Lagnas + Darakaraka
> **触发原因**:用户要求补充印度占星 skill 缺少的技法。经过本地资料 + 全网搜索对比,发现 P0 级缺失技法:Darakaraka (DK)、Raj/Dhana Yogas、Doshas (Mangal/Kaal Sarp/Pitra)、Special Lagnas (AL/UL)。
+1 -1
View File
@@ -1,6 +1,6 @@
---
name: jyotish-vedic-astrology
version: 6.0.14
version: 6.0.15
description: 印度占星(Jyotish)专业解盘与推运系统。核心能力:PDF星盘输入→严谨解盘→精确推运应期输出。触发词:印度占星、吠陀占星、Jyotish、解盘、推运、星盘分析、Dasha、Transit、Nakshatra、Yoga、出生时间矫正、PDF星盘、读取PDF、分析PDF星盘、现代解读、误判纠错、Varga分盘、综合分析、过境分析、合盘、婚姻匹配、年运盘、Prashna、Argala、Jaimini、KP系统、Shadbala、Ashtakavarga、HTML报告、深度解盘。
---
+70 -4
View File
@@ -1,5 +1,5 @@
{
"version": "v6.0.14-yogas-doshas-dk",
"version": "v6.0.15-tithi-pakshi-rt-navamsa",
"source_inspiration": [
{
"name": "jyotishyamitra",
@@ -635,6 +635,63 @@
],
"audit_label": "Upapada Lagna",
"missing_impact": "Marriage quality analysis incomplete without UL."
},
"tithi_lord": {
"name": "Tithi Lord / 月日守护星",
"domains": [
"tithi",
"prashna",
"timing",
"moon_sun"
],
"status": "partial",
"knowledge_refs": [],
"commands": [
"full-reading"
],
"output_paths": [
"modules.tithi_lord"
],
"audit_label": "Tithi Lord",
"missing_impact": "Tithi Lord 分析不完整,Prashna 问卜时机判断受限。"
},
"pancha_pakshi": {
"name": "Pancha Pakshi / 五鸟系统",
"domains": [
"pancha_pakshi",
"tamil",
"prashna",
"timing"
],
"status": "partial",
"knowledge_refs": [],
"commands": [
"full-reading"
],
"output_paths": [
"modules.pancha_pakshi"
],
"audit_label": "Pancha Pakshi",
"missing_impact": "五鸟系统分析不完整,Tamil 占星时机判断受限。"
},
"rashi_tulya_navamsa": {
"name": "Rashi Tulya Navamsa / 本命对分盘分析",
"domains": [
"varga",
"d1_d9",
"analysis",
"marriage"
],
"status": "partial",
"knowledge_refs": [],
"commands": [
"full-reading"
],
"output_paths": [
"modules.rashi_tulya_navamsa"
],
"audit_label": "Rashi Tulya Navamsa",
"missing_impact": "D1-D9 同宫对比分析不完整,婚姻/内在潜力判断受限。"
}
},
"routes": {
@@ -675,7 +732,10 @@
"pitra_dosha",
"sade_sati",
"arudha_lagna",
"upapada_lagna"
"upapada_lagna",
"tithi_lord",
"pancha_pakshi",
"rashi_tulya_navamsa"
],
"optional_techniques": [
"bhava_chalit",
@@ -712,7 +772,10 @@
"pitra_dosha",
"sade_sati",
"arudha_lagna",
"upapada_lagna"
"upapada_lagna",
"tithi_lord",
"pancha_pakshi",
"rashi_tulya_navamsa"
],
"optional_techniques": [
"d9_navamsa",
@@ -755,7 +818,10 @@
"pitra_dosha",
"sade_sati",
"arudha_lagna",
"upapada_lagna"
"upapada_lagna",
"tithi_lord",
"pancha_pakshi",
"rashi_tulya_navamsa"
],
"optional_techniques": [
"bhava_chalit",
+48
View File
@@ -3502,6 +3502,54 @@ def cmd_full_reading(args):
except Exception as e:
report['errors'].append(f"yogas-doshas: {e}")
# ── Step 4.10: Tithi Lord + Pancha Pakshi + Rashi Tulya Navamsa (v6.0.15) ──
try:
# Tithi Lord(出生 Tithi + Lord 分析)
from tithi_lord import calc_tithi_lord_full
sun_deg = planet_lons[0]
moon_deg = planet_lons[1]
tithi_result = calc_tithi_lord_full(sun_deg, moon_deg, planets, houses)
report['modules']['tithi_lord'] = tithi_result
except Exception as e:
report['errors'].append(f"tithi-lord: {e}")
try:
# Pancha Pakshi(五鸟系统,需要出生 Nakshatra)
# 先尝试从 nakshatra_advanced 获取出生 Nakshatra
nakshatra_num = None
if 'moon_nakshatra' in dir() or 'moon_nak' in locals():
pass # 动态获取
# 从 planets 数据推算 NakshatraMoon 的度数为基准)
moon_deg = planet_lons[1]
nak_num = int(moon_deg / 13.3333333) + 1
if nak_num > 27:
nak_num = 27
from pancha_pakshi import calc_pakshi_full_analysis
pk_result = calc_pakshi_full_analysis(nak_num, target_weekday=0, target_period=0)
report['modules']['pancha_pakshi'] = pk_result
except Exception as e:
report['errors'].append(f"pancha-pakshi: {e}")
try:
# Rashi Tulya NavamsaD1 与 D9 同宫对比分析)
from rashi_tulya_navamsa import analyze_rashi_tulya_navamsa, rashi_tulya_navamsa_summary
varga_full = report['modules'].get('varga_full', {})
d9_data = varga_full.get('D9_Navamsa', {})
if d9_data and d9_data.get('planets') and d9_data.get('houses'):
rt_result = analyze_rashi_tulya_navamsa(
planets, houses,
d9_data['planets'], d9_data['houses']
)
rt_summary = rashi_tulya_navamsa_summary(rt_result)
report['modules']['rashi_tulya_navamsa'] = {
'analysis': rt_result,
'summary': rt_summary
}
else:
report['modules']['rashi_tulya_navamsa'] = {'note': 'D9 data incomplete, skip Rashi Tulya Navamsa'}
except Exception as e:
report['errors'].append(f"rashi-tulya-navamsa: {e}")
# ── Step 5: 精确相位 ──
try:
from aspects import calc_all_aspects
+202
View File
@@ -0,0 +1,202 @@
"""
pancha_pakshi.py - Pancha Pakshi(五鸟)系统计算模块
v6.0.15 新增技法
Pancha Pakshi 是泰米尔占星系统,将 27 Nakshatra 分配给 5 只""
(代表生命力的 5 种状态:统治、进食、行走、睡眠、死亡)。
每个人根据出生 Nakshatra 和当前时日,处于某种 Pakshi 状态。
"""
# 五鸟名称与状态
PAKSHI_NAMES = {
0: "Vulture / Rule (统治)",
1: "Crow / Eat (进食)",
2: "Crane / Walk (行走)",
3: "Owl / Sleep (睡眠)",
4: "Bat / Die (死亡)",
}
# 27 Nakshatra 对应的 Pakshi 分配(按泰米尔传统)
# 来源:泰米尔占星文献
# 分配方式:每个 Pakshi 掌管 5-6 个 Nakshatra
NAKSHATRA_PAKSHI = {
# Vulture / Rule (0)
1: 0, 2: 0, 3: 0, 4: 0, 5: 0,
# Crow / Eat (1)
6: 1, 7: 1, 8: 1, 9: 1, 10: 1,
# Crane / Walk (2)
11: 2, 12: 2, 13: 2, 14: 2, 15: 2,
# Owl / Sleep (3)
16: 3, 17: 3, 18: 3, 19: 3, 20: 3,
# Bat / Die (4)
21: 4, 22: 4, 23: 4, 24: 4, 25: 4, 26: 4, 27: 4,
}
# Nakshatra 名称列表
NAKSHATRA_NAMES = [
"Ashvini", "Bharani", "Krittika", "Rohini", "Mrigashira", "Ardra",
"Punarvasu", "Pushya", "Ashlesha", "Magha", "Purva Phalguni", "Uttara Phalguni",
"Hasta", "Chitra", "Svati", "Vishakha", "Anuradha", "Jyeshtha",
"Mula", "Purva Ashadha", "Uttara Ashadha", "Shravana", "Dhanishta",
"Shatabhisha", "Purva Bhadrapada", "Uttara Bhadrapada", "Revati"
]
# 五状态顺序(统治 → 进食 → 行走 → 睡眠 → 死亡 → 统治...)
PAKSHI_CYCLE = [0, 1, 2, 3, 4] # Rule, Eat, Walk, Sleep, Die
# 星期对应的 Pakshi 起始偏移(0=周日,1=周一...6=周六)
# 每个星期开始时的 Pakshi 偏移量
WEEKDAY_PAKSHI_OFFSET = {
0: 0, # 周日:从 Rule 开始
1: 2, # 周一:从 Walk 开始
2: 4, # 周二:从 Die 开始
3: 1, # 周三:从 Eat 开始
4: 3, # 周四:从 Sleep 开始
5: 0, # 周五:从 Rule 开始
6: 2, # 周六:从 Walk 开始
}
def get_birth_pakshi(nakshatra_num):
"""
根据出生 Nakshatra 获取所属 Pakshi。
"""
if nakshatra_num < 1 or nakshatra_num > 27:
return None, f"Nakshatra 编号 {nakshatra_num} 超出范围(1-27"
pakshi_idx = NAKSHATRA_PAKSHI.get(nakshatra_num)
if pakshi_idx is None:
return None, f"Nakshatra {nakshatra_num} 未找到 Pakshi 映射"
return pakshi_idx, PAKSHI_NAMES[pakshi_idx]
def calc_pakshi_day_state(birth_nakshatra, weekday, period_of_day=0):
"""
计算指定日期的 Pakshi 状态。
birth_nakshatra: 出生 Nakshatra 编号(1-27
weekday: 星期(0=周日,1=周一...6=周六)
period_of_day: 一天中的时段(0-4,对应五个 Pakshi 时段)
"""
birth_pakshi, _ = get_birth_pakshi(birth_nakshatra)
if birth_pakshi is None:
return None, f"出生 Nakshatra {birth_nakshatra} 无效"
# 星期起始偏移
offset = WEEKDAY_PAKSHI_OFFSET.get(weekday, 0)
# 当日当前时段的 Pakshi = (出生 Pakshi + 星期偏移 + 时段) % 5
current_pakshi = (birth_pakshi + offset + period_of_day) % 5
return current_pakshi, PAKSHI_NAMES[current_pakshi]
def calc_pakshi_full_analysis(birth_nakshatra, birth_weekday=None, target_weekday=None, target_period=0):
"""
完整 Pancha Pakshi 分析。
birth_nakshatra: 出生 Nakshatra1-27
birth_weekday: 出生星期(可选,用于更精确分析)
target_weekday: 目标日期星期(用于预测,0-6)
target_period: 目标时段(0-4
"""
birth_pakshi_idx, birth_pakshi_name = get_birth_pakshi(birth_nakshatra)
if birth_pakshi_idx is None:
return {"error": birth_pakshi_name}
result = {
"birth_nakshatra": birth_nakshatra,
"birth_nakshatra_name": NAKSHATRA_NAMES[birth_nakshatra - 1] if 1 <= birth_nakshatra <= 27 else "Unknown",
"birth_pakshi_idx": birth_pakshi_idx,
"birth_pakshi_name": birth_pakshi_name,
}
# 出生时的 Pakshi 状态解释
pakshi_interpretations = {
0: "统治鸟(Vulture):出生时有领导力,能掌控局面,适合开始重要项目。",
1: "进食鸟(Crow):出生时需要滋养,关注物质获取,适合积累资源。",
2: "行走鸟(Crane):出生时处于行动状态,适合旅行、移动、沟通。",
3: "睡眠鸟(Owl):出生时休息状态,适合内省、规划、潜伏等待。",
4: "死亡鸟(Bat):出生时转化状态,适合结束、释放、深度改变。",
}
result["birth_pakshi_interpretation"] = pakshi_interpretations.get(birth_pakshi_idx, "")
# 如果提供了目标日期,计算那时的 Pakshi 状态
if target_weekday is not None:
target_pakshi_idx, target_pakshi_name = calc_pakshi_day_state(
birth_nakshatra, target_weekday, target_period
)
result["target_weekday"] = target_weekday
result["target_period"] = target_period
result["target_pakshi_idx"] = target_pakshi_idx
result["target_pakshi_name"] = target_pakshi_name
# 目标状态的解读
target_interpretations = {
0: "统治时段:适合开始新项目、领导、决策、公开行动。能量最强。",
1: "进食时段:适合积累、学习、获取资源、建立联系。能量恢复中。",
2: "行走时段:适合旅行、移动、沟通、短途出行。能量流动。",
3: "睡眠时段:适合休息、规划、内省、等待。能量最低,不宜重要决策。",
4: "死亡时段:适合结束、释放、深度转化、灵性实践。能量转化中。",
}
result["target_pakshi_interpretation"] = target_interpretations.get(target_pakshi_idx, "")
# Pakshi 周期完整列表(一天五个时段)
day_periods = []
for period in range(5):
p_idx, p_name = calc_pakshi_day_state(birth_nakshatra, target_weekday or 0, period)
day_periods.append({
"period": period,
"pakshi_idx": p_idx,
"pakshi_name": p_name,
})
result["day_periods"] = day_periods
return result
def pancha_pakshi_prashna_guide(birth_nakshatra, question_type="general"):
"""
Pancha Pakshi 用于 Prashna(问卜)的指导。
根据出生 Pakshi 和当前时段判断问题是否适合提问。
"""
birth_pakshi_idx, _ = get_birth_pakshi(birth_nakshatra)
# 不同时段适合的问题类型
suitable_for = {
0: ["new_beginning", "leadership", "decision"], # 统治:新开始、领导、决策
1: ["resource", "learning", "relationship"], # 进食:资源、学习、关系
2: ["travel", "communication", "short_term"], # 行走:旅行、沟通、短期
3: ["rest", "planning", "inner_work"], # 睡眠:休息、规划、内在工作
4: ["ending", "transformation", "spiritual"], # 死亡:结束、转化、灵性
}
guidance = {
"current_pakshi": birth_pakshi_idx,
"current_pakshi_name": PAKSHI_NAMES[birth_pakshi_idx],
"suitable_question_types": suitable_for.get(birth_pakshi_idx, []),
"prashna_advice": (
"当前为统治时段,问题关于新开始或领导最适合。"
if birth_pakshi_idx == 0 else
"当前为进食时段,问题关于资源或学习最适合。"
if birth_pakshi_idx == 1 else
"当前为行走时段,问题关于旅行或沟通最适合。"
if birth_pakshi_idx == 2 else
"当前为睡眠时段,问题关于休息或规划最适合,不宜重要决策。"
if birth_pakshi_idx == 3 else
"当前为死亡时段,问题关于结束或转化最适合。"
),
}
return guidance
if __name__ == "__main__":
# 测试:出生 Nakshatra 10Magha),目标周三(weekday=3),时段 0
result = calc_pakshi_full_analysis(10, target_weekday=3, target_period=0)
print("Pancha Pakshi 测试结果:")
for k, v in result.items():
if k != "day_periods":
print(f" {k}: {v}")
print(" 时段列表:")
for p in result.get("day_periods", []):
print(f" {p}")
+259
View File
@@ -0,0 +1,259 @@
"""
rashi_tulya_navamsa.py - Rashi Tulya Navamsa(本命对分盘九分仪)分析模块
v6.0.15 新增技法
Rashi Tulya Navamsa:将 D9Navamsa)分盘的每一宫与 D1(Rashi)的同一宫对比,
揭示该生活领域的"内在真相""潜在动力"
核心思路:D1 是外在表现,D9 是内在潜力/真实状态。
"""
# 宫位名称(1-12
HOUSE_NAMES = [
"第1宫(自我/身体)", "第2宫(财富/家庭)", "第3宫(兄弟/勇气)",
"第4宫(母亲/情绪)", "第5宫(子女/智慧)", "第6宫(疾病/敌人)",
"第7宫(配偶/合伙)", "第8宫(隐藏/转变)", "第9宫(命运/父亲)",
"第10宫(事业/名声)", "第11宫(收益/朋友)", "第12宫(损失/解脱)"
]
# 行星名称
PLANET_NAMES = ["Sun", "Moon", "Mars", "Mercury", "Jupiter", "Venus", "Saturn", "Rahu", "Ketu"]
# 宫位领域关键词
HOUSE_KEYWORDS = [
"自我身份、外貌、性格、生命力",
"财富积累、语言能力、早期教育、家庭经济",
"兄弟姐妹、沟通勇气、短途旅行、动手能力",
"母亲、家庭、内心安全感、不动产、车辆",
"子女、创造性智慧、投资项目、恋爱前期",
"日常工作、健康问题、竞争对手、债务",
"婚姻关系、商业合伙、公开的敌人、异地",
"深层转变、神秘学、性传播、意外收入",
"人生大方向、高等教育、哲学信仰、父亲",
"社会身份、事业成就、公众形象、权威",
"长期收益、朋友圈、团体归属、愿景实现",
"潜意识、海外事务、精神解脱、隐秘支出"
]
def analyze_rashi_tulya_navamsa(d1_planets, d1_houses, d9_planets, d9_houses):
"""
Rashi Tulya Navamsa 核心分析。
输入:
d1_planets: D1 行星数据 {planet_idx: {sign, house, dignity,...}}
d1_houses: D1 宫位数据 {house_num: {sign, lord, planets}}
d9_planets: D9 行星数据 {planet_idx: {sign, house, dignity,...}}
d9_houses: D9 宫位数据 {house_num: {sign, lord, planets}}
输出:
每宫的 D1→D9 对比分析
"""
results = []
for house_num in range(1, 13): # 1-12 宫
d1_house_data = d1_houses.get(house_num, {})
d9_house_data = d9_houses.get(house_num, {})
# D1 该宫的信息
d1_sign = d1_house_data.get("sign", "Unknown")
d1_lord = d1_house_data.get("lord", "Unknown")
d1_planets_in = d1_house_data.get("planets", [])
d1_house_strength = d1_house_data.get("strength", "Unknown")
# D9 该宫的信息
d9_sign = d9_house_data.get("sign", "Unknown")
d9_lord = d9_house_data.get("lord", "Unknown")
d9_planets_in = d9_house_data.get("planets", [])
d9_house_strength = d9_house_data.get("strength", "Unknown")
# 核心对比分析
comparison = _compare_d1_d9_house(
house_num, d1_sign, d1_lord, d1_planets_in, d1_house_strength,
d9_sign, d9_lord, d9_planets_in, d9_house_strength
)
results.append({
"house_num": house_num,
"house_name": HOUSE_NAMES[house_num - 1],
"house_keywords": HOUSE_KEYWORDS[house_num - 1],
"d1_sign": d1_sign,
"d1_lord": d1_lord,
"d1_planets_in": d1_planets_in,
"d1_strength": d1_house_strength,
"d9_sign": d9_sign,
"d9_lord": d9_lord,
"d9_planets_in": d9_planets_in,
"d9_strength": d9_house_strength,
"comparison": comparison,
})
return results
def _compare_d1_d9_house(house_num, d1_sign, d1_lord, d1_pl, d1_str, d9_sign, d9_lord, d9_pl, d9_str):
"""
对比 D1 和 D9 同一宫位的详细分析。
"""
analysis = []
# 1. 宫主星对比
if d1_lord == d9_lord:
analysis.append(f"宫主星一致({d1_lord}),该领域内外表现统一,潜力与表现匹配。")
else:
analysis.append(f"宫主星不同:D1={d1_lord}D9={d9_lord}。外在表现({d1_lord}"
f"与内在潜力({d9_lord})有差异,需要调和。")
# 2. 行星入驻对比
d1_pl_names = [PLANET_NAMES[p] if isinstance(p, int) else p for p in d1_pl]
d9_pl_names = [PLANET_NAMES[p] if isinstance(p, int) else p for p in d9_pl]
if d1_pl_names:
analysis.append(f"D1 入驻行星:{', '.join(map(str, d1_pl_names))}(外在影响)")
else:
analysis.append("D1 无行星入驻(该领域外在平静)")
if d9_pl_names:
analysis.append(f"D9 入驻行星:{', '.join(map(str, d9_pl_names))}(内在动力)")
else:
analysis.append("D9 无行星入驻(该领域内在潜力未被激活)")
# 3. 力量对比
analysis.append(f"D1 宫力量:{d1_str} | D9 宫力量:{d9_str}")
if d1_str == "Strong" and d9_str == "Strong":
analysis.append("→ D1、D9 均强:该领域内外兼强,潜力完全发挥。")
elif d1_str == "Weak" and d9_str == "Weak":
analysis.append("→ D1、D9 均弱:该领域内外兼弱,需要努力克服。")
elif d1_str == "Strong" and d9_str == "Weak":
analysis.append("→ D1 强 D9 弱:外在表现好,但内在支持不足,可能表面风光。")
elif d1_str == "Weak" and d9_str == "Strong":
analysis.append("→ D1 弱 D9 强:外在表现弱,但内在潜力强,大器晚成之象。")
# 4. 关键解读(按宫位)
key_interp = _get_house_key_interpretation(house_num, d1_pl, d9_pl, d1_lord, d9_lord)
if key_interp:
analysis.append(f"关键解读:{key_interp}")
return analysis
def _get_house_key_interpretation(house_num, d1_pl, d9_pl, d1_lord, d9_lord):
"""
按宫位给出关键解读。
"""
interpretations = {
1: "第1宫:自我认知。D9 强则内在自信,D1 强则外在魅力。",
2: "第2宫:财富积累。D9 有金星/木星则财富潜力大,D1 有恶星则财务波折。",
3: "第3宫:勇气行动。D9 有火星则内在勇敢,D1 有水星则沟通力强。",
4: "第4宫:内心安全。D9 有月亮/金星则内心满足,D1 有土星则情感压抑。",
5: "第5宫:创造智慧。D9 有木星则智慧天赋高,D1 有火星则创造冲动强。",
6: "第6宫:竞争健康。D9 有土星/火星则抗压能力强,D1 有木星则能化解敌意。",
7: "第7宫:婚姻关系。D9 是婚姻内在,D1 是婚姻表现。D9 强则婚姻内在和谐。",
8: "第8宫:深层转变。D9 有木星/金星则危机中有贵人,D1 有恶星则有突发事件。",
9: "第9宫:命运方向。D9 有木星/太阳则命运护佑强,D1 有恶星则需要努力。",
10: "第10宫:事业成就。D9 是事业潜力,D1 是事业表现。D9 强则事业基础稳。",
11: "第11宫:收益朋友。D9 有木星/金星则收益潜力大,D1 有土星则收益延迟。",
12: "第12宫:解脱潜意识。D9 有木星/金星则精神解脱能力强,D1 有恶星则有隐秘损失。",
}
return interpretations.get(house_num, "")
def rashi_tulya_navamsa_summary(rashi_tulya_results):
"""
生成 Rashi Tulya Navamsa 的总结报告。
"""
summary = {
"total_houses_analyzed": len(rashi_tulya_results),
"houses_d1_d9_both_strong": [],
"houses_d1_weak_d9_strong": [],
"houses_d1_strong_d9_weak": [],
"houses_d1_d9_both_weak": [],
"key_insights": [],
}
for house_data in rashi_tulya_results:
h = house_data["house_num"]
d1_s = house_data["d1_strength"]
d9_s = house_data["d9_strength"]
if d1_s == "Strong" and d9_s == "Strong":
summary["houses_d1_d9_both_strong"].append(h)
elif d1_s == "Weak" and d9_s == "Strong":
summary["houses_d1_weak_d9_strong"].append(h)
elif d1_s == "Strong" and d9_s == "Weak":
summary["houses_d1_strong_d9_weak"].append(h)
elif d1_s == "Weak" and d9_s == "Weak":
summary["houses_d1_d9_both_weak"].append(h)
# 关键洞察
if summary["houses_d1_weak_d9_strong"]:
summary["key_insights"].append(
f"大器晚成宫位:{summary['houses_d1_weak_d9_strong']}"
f"(这些领域内在潜力强,但需要时间/努力才能显现)"
)
if summary["houses_d1_strong_d9_weak"]:
summary["key_insights"].append(
f"表面风光宫位:{summary['houses_d1_strong_d9_weak']}"
f"(这些领域外在表现好,但内在支持不足,需要警惕)"
)
if summary["houses_d1_d9_both_strong"]:
summary["key_insights"].append(
f"内外兼强宫位:{summary['houses_d1_d9_both_strong']}"
f"(这些领域实力雄厚,可以重点发展)"
)
if summary["houses_d1_d9_both_weak"]:
summary["key_insights"].append(
f"需要努力宫位:{summary['houses_d1_d9_both_weak']}"
f"(这些领域内外都弱,需要特别努力或寻求帮助)"
)
return summary
def rashi_tulya_navamsa_marriage_focus(rashi_tulya_results):
"""
专门针对婚姻(第7宫)的 Rashi Tulya Navamsa 分析。
"""
# 找到第7宫的数据
house_7_data = None
for h_data in rashi_tulya_results:
if h_data["house_num"] == 7:
house_7_data = h_data
break
if not house_7_data:
return {"error": "未找到第7宫数据"}
d1_7 = house_7_data["d1_sign"]
d9_7 = house_7_data["d9_sign"]
d1_pl_7 = house_7_data["d1_planets_in"]
d9_pl_7 = house_7_data["d9_planets_in"]
d1_str_7 = house_7_data["d1_strength"]
d9_str_7 = house_7_data["d9_strength"]
marriage_analysis = {
"house_7_d1_sign": d1_7,
"house_7_d9_sign": d9_7,
"house_7_d1_planets": d1_pl_7,
"house_7_d9_planets": d9_pl_7,
"house_7_d1_strength": d1_str_7,
"house_7_d9_strength": d9_str_7,
"marriage_outer_expression": f"外在婚姻表现受 {d1_7} 影响",
"marriage_inner_potential": f"内在婚姻潜力在 {d9_7}",
"assessment": "",
}
# 评估
if d1_str_7 == "Strong" and d9_str_7 == "Strong":
marriage_analysis["assessment"] = "婚姻内外兼强,配偶优秀,关系和谐。"
elif d1_str_7 == "Weak" and d9_str_7 == "Strong":
marriage_analysis["assessment"] = "婚姻内在潜力强(D9强),但外在表现弱(D1弱),可能晚婚或婚姻经历波折后好转。"
elif d1_str_7 == "Strong" and d9_str_7 == "Weak":
marriage_analysis["assessment"] = "婚姻外在表现好(D1强),但内在不稳定(D9弱),需要注意关系维护。"
else:
marriage_analysis["assessment"] = "婚姻内外都弱,需要努力经营,也可能配偶条件一般。"
return marriage_analysis
if __name__ == "__main__":
# 简单测试(需要实际数据)
print("Rashi Tulya Navamsa 模块已加载")
print("需要 D1 和 D9 的行星/宫位数据作为输入")
+179
View File
@@ -0,0 +1,179 @@
"""
tithi_lord.py - Tithi Lord 计算模块
v6.0.15 新增技法
Tithi(月日)是月亮与太阳的黄经差除以12°,共30个 Tithi(阴阳各15)。
每个 Tithi 由一颗行星守护,用于 Prashna(问卜)和一些时机判断技术。
"""
import math
# Tithi 名称(1-15 Shukla 盈,1-15 Krishna 亏)
TITHI_NAMES = {
1: "Pratipad (1)", 2: "Dvitiya (2)", 3: "Tritiya (3)", 4: "Chaturthi (4)",
5: "Panchami (5)", 6: "Shashthi (6)", 7: "Saptami (7)", 8: "Ashtami (8)",
9: "Navami (9)", 10: "Dashami (10)", 11: "Ekadashi (11)", 12: "Dvadashi (12)",
13: "Trayodashi (13)", 14: "Chaturdashi (14)", 15: "Purnima/Amavasya (15)",
}
# Tithi 守护星(Parashara 系统)
# 1=Sun, 2=Moon, 3=Mars, 4=Mercury, 5=Jupiter, 6=Venus, 7=Saturn
# Tithi 1-7: Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn
# Tithi 8-14: Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn
# Tithi 15 (Purnima/Amavasya): Sun
TITHI_LORD_MAP = {
1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6,
8: 0, 9: 1, 10: 2, 11: 3, 12: 4, 13: 5, 14: 6,
15: 0,
}
# 逆映射:行星索引 → 名称
PLANET_NAMES = ["Sun", "Moon", "Mars", "Mercury", "Jupiter", "Venus", "Saturn", "Rahu", "Ketu"]
# Nakshatra 列表(1-27
NAKSHATRA_NAMES = [
"Ashvini", "Bharani", "Krittika", "Rohini", "Mrigashira", "Ardra",
"Punarvasu", "Pushya", "Ashlesha", "Magha", "Purva Phalguni", "Uttara Phalguni",
"Hasta", "Chitra", "Svati", "Vishakha", "Anuradha", "Jyeshtha",
"Mula", "Purva Ashadha", "Uttara Ashadha", "Shravana", "Dhanishta",
"Shatabhisha", "Purva Bhadrapada", "Uttara Bhadrapada", "Revati"
]
def calc_tithi(sun_deg, moon_deg):
"""
计算当前 Tithi。
Tithi = floor((Moon - Sun) / 12) + 1
返回 (tithi_num, tithi_paksha, tithi_deg)
"""
diff = (moon_deg - sun_deg) % 360
tithi_deg = diff % 12 # 在当前 Tithi 内的度数
tithi_num = int(diff // 12) + 1 # 1-30
if tithi_num <= 15:
paksha = "Shukla" # 盈月(白月)
else:
paksha = "Krishna" # 亏月(黑月)
tithi_num = tithi_num - 15
return tithi_num, paksha, tithi_deg, diff
def get_tithi_lord(tithi_num, paksha):
"""
获取 Tithi 的守护星。
Tithi 1-15 的守护星在阴阳月中是一样的(Parashara 系统)。
"""
# Tithi 1-15 的守护星(阴阳月相同)
lord_idx = TITHI_LORD_MAP[tithi_num]
return lord_idx, PLANET_NAMES[lord_idx]
def calc_tithi_lord_full(sun_deg, moon_deg, planets=None, houses=None):
"""
完整 Tithi Lord 分析。
输入:太阳度数、月亮度数、行星列表(可选)、宫位列表(可选)
输出:Tithi 信息 + Lord 分析
"""
tithi_num, paksha, tithi_deg, raw_diff = calc_tithi(sun_deg, moon_deg)
lord_idx, lord_name = get_tithi_lord(tithi_num, paksha)
result = {
"tithi_number": tithi_num,
"tithi_paksha": paksha,
"tithi_name": TITHI_NAMES.get(tithi_num, f"Tithi {tithi_num}"),
"tithi_deg_in": round(tithi_deg, 2),
"tithi_lord_idx": lord_idx,
"tithi_lord_name": lord_name,
"raw_diff_deg": round(raw_diff, 2),
}
# 如果提供了 planets 和 houses,做进一步的 Lord 分析
if planets is not None and houses is not None:
# Tithi Lord 的星盘位置
lord_sign = None
lord_house = None
lord_dignity = None
# 从 planets 字典里找 Tithi Lord 的数据
# planets 格式:{0: {sign, house, dignity,...}, 1: {...}, ...}
if lord_idx in planets:
lord_data = planets[lord_idx]
lord_sign = lord_data.get("sign")
lord_house = lord_data.get("house")
lord_dignity = lord_data.get("dignity")
result["tithi_lord_sign"] = lord_sign
result["tithi_lord_house"] = lord_house
result["tithi_lord_dignity"] = lord_dignity
# Tithi Lord 的解读提示
interpretations = {
0: "Tithi Lord 为太阳:权威、名声、父亲、事业。太阳强则人生有目标感。",
1: "Tithi Lord 为月亮:情感、母亲、公众、内心安全感。月亮强则情绪稳定。",
2: "Tithi Lord 为火星:行动力、勇气、竞争、冲突。火星强则有执行力。",
3: "Tithi Lord 为水星:沟通、商业、学习、适应性。水星强则思维敏捷。",
4: "Tithi Lord 为木星:智慧、导师、扩张、幸运。木星强则有人生指引。",
5: "Tithi Lord 为金星:享乐、艺术、关系、舒适。金星强则生活有质量。",
6: "Tithi Lord 为土星:纪律、延迟、责任、苦行。土星强则能承受压力。",
}
result["tithi_lord_interpretation"] = interpretations.get(lord_idx, "")
# Tithi Lord 与主要行星的相位关系(如果有 aspects 数据)
# 这里只做简单标注
result["tithi_lord_notes"] = (
f"Tithi Lord {lord_name}{tithi_num}日({paksha}月)。"
f"Tithi Lord 位于第{lord_house}宫,"
f"星性:{lord_dignity or '未知'}"
)
return result
def calc_birth_tithi(sun_deg, moon_deg):
"""
计算出生 Tithi(用于 Prashna/问卜 和 个人特质分析)。
返回出生 Tithi 信息。
"""
return calc_tithi_lord_full(sun_deg, moon_deg)
def tithi_lord_prashna_indicator(tithi_num, paksha, question_type="general"):
"""
Tithi Lord 作为 Prashna(问卜)的时机指标。
不同 Tithi 适合不同类型的问题。
"""
# Tithi 1-5: 新开始,适合启动项目
# Tithi 6-10: 稳定期,适合巩固
# Tithi 11-15: 完成期,适合结束/收获
guidance = {
"new_beginning": tithi_num <= 5,
"consolidation": 6 <= tithi_num <= 10,
"completion": 11 <= tithi_num <= 15,
}
paksha_guidance = {
"Shukla": "盈月期:能量上升,适合启动、扩张、公开行动。",
"Krishna": "亏月期:能量下降,适合内省、结束、隐藏行动。"
}
return {
"tithi_num": tithi_num,
"paksha": paksha,
"guidance": guidance,
"paksha_note": paksha_guidance.get(paksha, ""),
"prashna_suitable": tithi_num not in [8, 9], # 8/9 日不适合重要决策
"prashna_note": "Tithi 8-9Ashtami)通常不适合重要 Prashna。"
if tithi_num in [8, 9] else "当前 Tithi 适合进行 Prashna 分析。"
}
if __name__ == "__main__":
# 测试:假设太阳 30°,月亮 90°
sun = 30.0
moon = 90.0
result = calc_tithi_lord_full(sun, moon)
print("Tithi Lord 测试结果:")
for k, v in result.items():
print(f" {k}: {v}")