Files
Jyotisha/scripts/event_prediction_model.py
T
732642856 2c3392703d feat: v3.6.0 全量同步 — 完整印度占星引擎+74篇参考资料+14子命令
## 核心升级(v1.6.0 → v3.6.0)

### 计算引擎(scripts/)
- jyotish_engine.py v3.6.0:14子命令统一引擎(chart/dasha/yoga/predict/varga/celebrity/db-stats/transit/shadbala/ashtakavarga/memory/validate/audit/report)
- 基于 Swiss Ephemeris + Lahiri Ayanamsa 恒星黄道
- shadbala.py:Shadbala六重力量计算(Sthana/Dig/Kala/Chesta/Naisargika/Drik Bala)
- ashtakavarga.py v2.0:BPHS完整8×8矩阵,SAV=337
- validate.py:R1-R10+R2b 数学验证(11项)
- event_prediction_model.py:三层验证事件预测规则引擎
- hermes_memory_core.py + hermes_bridge.py:Hermes记忆系统
- report_builder.py:MD→HTML报告生成器(羊皮纸主题)

### 参考资料(references/)— 74篇
- 新增35篇:AI解盘工作流/Argala/Dasa Convergence/替代推运系统/条件Dasha/Shodasavarga十六分盘/古典文献翻译/专业发展路径等
- 修改8篇:PDF读取v3.0/Ashtakavarga v2.0/名人案例库v2.0/KP占星v2.0等
- 覆盖:行星/星座/宫位/Nakshatra/Yoga/Dasha/Transit/关系占星/年运盘/Jaimini/KP/Varshaphala/补救措施

### 审计管线(P1-P12 + P3/P8/冲突仲裁)
- P3仓库耦合:双宫掌管命运捆绑分析
- P8年龄状态:行星度数→执行模式判定
- 冲突仲裁3条规则:矛盾信号裁决

### 其他
- CHANGELOG.md:完整版本历史
- .gitignore:排除缓存和数据库
- SKILL.md v3.6.0:触发词/子命令表/工作流完整更新
2026-04-24 22:36:57 +08:00

567 lines
18 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
事件预测模型
基于三层验证法(静态星盘 + Dasha激活 + 过境触发)预测事件
"""
from typing import Dict, List, Optional, Tuple
from dataclasses import dataclass
from datetime import datetime
from enum import Enum
class EventType(Enum):
"""事件类型"""
MARRIAGE = "婚姻"
CAREER = "职业"
WEALTH = "财富"
HEALTH = "健康"
EDUCATION = "教育"
CHILDREN = "子女"
TRAVEL = "旅行"
SPIRITUAL = "灵性"
class RiskLevel(Enum):
"""风险等级"""
LOW = ""
MEDIUM = ""
HIGH = ""
CRITICAL = "极高"
@dataclass
class Prediction:
"""预测结果"""
event_type: EventType
description: str
probability: float # 0-100
risk_level: RiskLevel
timing: Optional[str]
key_factors: List[str]
recommendations: List[str]
class EventPredictionModel:
"""事件预测模型"""
def __init__(self, chart_data: Dict, dasha_data: Optional[Dict] = None,
transit_data: Optional[Dict] = None):
"""
初始化事件预测模型
Args:
chart_data: 星盘数据
dasha_data: 大运周期数据
transit_data: 过境数据
"""
self.chart = chart_data
self.dasha = dasha_data
self.transit = transit_data
self.predictions = []
def predict_all_events(self) -> List[Prediction]:
"""预测所有类型的事件"""
predictions = []
# 1. 婚姻预测
marriage_pred = self.predict_marriage()
if marriage_pred:
predictions.append(marriage_pred)
# 2. 职业预测
career_pred = self.predict_career()
if career_pred:
predictions.append(career_pred)
# 3. 财富预测
wealth_pred = self.predict_wealth()
if wealth_pred:
predictions.append(wealth_pred)
# 4. 健康预测
health_pred = self.predict_health()
if health_pred:
predictions.append(health_pred)
self.predictions = predictions
return predictions
def predict_marriage(self) -> Optional[Prediction]:
"""
婚姻预测(三层验证法)
第一层:静态星盘分析
- 7宫状态
- 金星状态
- 婚姻相关Yoga
第二层:Dasha激活
- 当前Dasha主星是否掌管7宫或金星
- 当前Antardasha主星是否掌管7宫或金星
第三层:过境触发
- 木星过境7宫
- 土星过境7宫
"""
# 第一层:静态分析
static_factors = self._analyze_marriage_static()
# 第二层:Dasha激活
dasha_activation = self._analyze_marriage_dasha()
# 第三层:过境触发
transit_trigger = self._analyze_marriage_transit()
# 综合判断
probability = self._calculate_marriage_probability(
static_factors, dasha_activation, transit_trigger
)
risk_level = self._assess_marriage_risk(static_factors)
timing = self._predict_marriage_timing(dasha_activation, transit_trigger)
key_factors = []
if static_factors.get('7th_house_afflicted'):
key_factors.append("7宫受克")
if static_factors.get('venus_weak'):
key_factors.append("金星弱势")
if static_factors.get('marriage_yoga'):
key_factors.append("婚姻Yoga")
recommendations = []
if risk_level in [RiskLevel.HIGH, RiskLevel.CRITICAL]:
recommendations.append("建议进行详细合婚分析")
recommendations.append("考虑补救措施")
else:
recommendations.append("婚姻前景良好")
return Prediction(
event_type=EventType.MARRIAGE,
description="婚姻预测",
probability=probability,
risk_level=risk_level,
timing=timing,
key_factors=key_factors,
recommendations=recommendations
)
def predict_career(self) -> Optional[Prediction]:
"""职业预测"""
# 第一层:静态分析
static_factors = self._analyze_career_static()
# 第二层:Dasha激活
dasha_activation = self._analyze_career_dasha()
# 第三层:过境触发
transit_trigger = self._analyze_career_transit()
probability = self._calculate_career_probability(
static_factors, dasha_activation, transit_trigger
)
risk_level = self._assess_career_risk(static_factors)
timing = self._predict_career_timing(dasha_activation, transit_trigger)
key_factors = []
if static_factors.get('10th_house_strong'):
key_factors.append("10宫强")
if static_factors.get('career_yoga'):
key_factors.append("职业Yoga")
recommendations = []
if risk_level == RiskLevel.LOW:
recommendations.append("职业前景良好")
else:
recommendations.append("需要努力和规划")
return Prediction(
event_type=EventType.CAREER,
description="职业预测",
probability=probability,
risk_level=risk_level,
timing=timing,
key_factors=key_factors,
recommendations=recommendations
)
def predict_wealth(self) -> Optional[Prediction]:
"""财富预测"""
static_factors = self._analyze_wealth_static()
dasha_activation = self._analyze_wealth_dasha()
transit_trigger = self._analyze_wealth_transit()
probability = self._calculate_wealth_probability(
static_factors, dasha_activation, transit_trigger
)
risk_level = self._assess_wealth_risk(static_factors)
timing = self._predict_wealth_timing(dasha_activation, transit_trigger)
key_factors = []
if static_factors.get('2nd_house_strong'):
key_factors.append("2宫强")
if static_factors.get('dhana_yoga'):
key_factors.append("财富Yoga")
recommendations = ["注意财务管理"]
return Prediction(
event_type=EventType.WEALTH,
description="财富预测",
probability=probability,
risk_level=risk_level,
timing=timing,
key_factors=key_factors,
recommendations=recommendations
)
def predict_health(self) -> Optional[Prediction]:
"""健康预测"""
static_factors = self._analyze_health_static()
dasha_activation = self._analyze_health_dasha()
transit_trigger = self._analyze_health_transit()
probability = self._calculate_health_probability(
static_factors, dasha_activation, transit_trigger
)
risk_level = self._assess_health_risk(static_factors)
timing = self._predict_health_timing(dasha_activation, transit_trigger)
key_factors = []
if static_factors.get('6th_house_afflicted'):
key_factors.append("6宫受克")
if static_factors.get('moon_weak'):
key_factors.append("月亮弱势")
recommendations = []
if risk_level in [RiskLevel.HIGH, RiskLevel.CRITICAL]:
recommendations.append("建议定期体检")
recommendations.append("注意健康生活方式")
return Prediction(
event_type=EventType.HEALTH,
description="健康预测",
probability=probability,
risk_level=risk_level,
timing=timing,
key_factors=key_factors,
recommendations=recommendations
)
# ===== 静态分析方法 =====
def _analyze_marriage_static(self) -> Dict:
"""婚姻静态分析"""
factors = {}
if 'planets' in self.chart:
# 检查7宫
factors['7th_house_afflicted'] = False # 简化版
factors['venus_weak'] = False
# 检查金星
venus = self.chart['planets'].get('Venus')
if venus and venus.get('status') == 'debilitated':
factors['venus_weak'] = True
# 检查婚姻Yoga
factors['marriage_yoga'] = False
return factors
def _analyze_career_static(self) -> Dict:
"""职业静态分析"""
factors = {}
if 'planets' in self.chart:
factors['10th_house_strong'] = False
factors['career_yoga'] = False
# 检查10宫
for planet, data in self.chart['planets'].items():
if data.get('house') == 10 and data.get('status') in ['exalted', 'own_sign']:
factors['10th_house_strong'] = True
return factors
def _analyze_wealth_static(self) -> Dict:
"""财富静态分析"""
factors = {}
if 'planets' in self.chart:
factors['2nd_house_strong'] = False
factors['dhana_yoga'] = False
# 检查2宫
for planet, data in self.chart['planets'].items():
if data.get('house') == 2 and planet in ['Jupiter', 'Venus']:
factors['2nd_house_strong'] = True
return factors
def _analyze_health_static(self) -> Dict:
"""健康静态分析"""
factors = {}
if 'planets' in self.chart:
factors['6th_house_afflicted'] = False
factors['moon_weak'] = False
# 检查月亮
moon = self.chart['planets'].get('Moon')
if moon and moon.get('status') == 'debilitated':
factors['moon_weak'] = True
return factors
# ===== Dasha激活分析 =====
def _analyze_marriage_dasha(self) -> Dict:
"""婚姻Dasha激活分析"""
if not self.dasha:
return {'status': '缺失Dasha信息'}
# 检查当前Dasha主星是否掌管7宫或金星
return {'activated': False}
def _analyze_career_dasha(self) -> Dict:
"""职业Dasha激活分析"""
if not self.dasha:
return {'status': '缺失Dasha信息'}
return {'activated': False}
def _analyze_wealth_dasha(self) -> Dict:
"""财富Dasha激活分析"""
if not self.dasha:
return {'status': '缺失Dasha信息'}
return {'activated': False}
def _analyze_health_dasha(self) -> Dict:
"""健康Dasha激活分析"""
if not self.dasha:
return {'status': '缺失Dasha信息'}
return {'activated': False}
# ===== 过境触发分析 =====
def _analyze_marriage_transit(self) -> Dict:
"""婚姻过境触发分析"""
if not self.transit:
return {'status': '缺失过境信息'}
# 检查木星是否过境7宫
return {'triggered': False}
def _analyze_career_transit(self) -> Dict:
"""职业过境触发分析"""
if not self.transit:
return {'status': '缺失过境信息'}
return {'triggered': False}
def _analyze_wealth_transit(self) -> Dict:
"""财富过境触发分析"""
if not self.transit:
return {'status': '缺失过境信息'}
return {'triggered': False}
def _analyze_health_transit(self) -> Dict:
"""健康过境触发分析"""
if not self.transit:
return {'status': '缺失过境信息'}
return {'triggered': False}
# ===== 概率计算 =====
def _calculate_marriage_probability(self, static: Dict, dasha: Dict, transit: Dict) -> float:
"""计算婚姻概率"""
base_prob = 50.0
if static.get('marriage_yoga'):
base_prob += 20
if static.get('7th_house_afflicted'):
base_prob -= 15
if static.get('venus_weak'):
base_prob -= 10
if dasha.get('activated'):
base_prob += 15
if transit.get('triggered'):
base_prob += 10
return min(100, max(0, base_prob))
def _calculate_career_probability(self, static: Dict, dasha: Dict, transit: Dict) -> float:
"""计算职业概率"""
base_prob = 50.0
if static.get('10th_house_strong'):
base_prob += 20
if static.get('career_yoga'):
base_prob += 15
if dasha.get('activated'):
base_prob += 15
if transit.get('triggered'):
base_prob += 10
return min(100, max(0, base_prob))
def _calculate_wealth_probability(self, static: Dict, dasha: Dict, transit: Dict) -> float:
"""计算财富概率"""
base_prob = 50.0
if static.get('2nd_house_strong'):
base_prob += 20
if static.get('dhana_yoga'):
base_prob += 15
if dasha.get('activated'):
base_prob += 15
if transit.get('triggered'):
base_prob += 10
return min(100, max(0, base_prob))
def _calculate_health_probability(self, static: Dict, dasha: Dict, transit: Dict) -> float:
"""计算健康概率"""
base_prob = 70.0 # 基础健康概率
if static.get('6th_house_afflicted'):
base_prob -= 20
if static.get('moon_weak'):
base_prob -= 15
if dasha.get('activated'):
base_prob -= 10
if transit.get('triggered'):
base_prob -= 5
return min(100, max(0, base_prob))
# ===== 风险评估 =====
def _assess_marriage_risk(self, static: Dict) -> RiskLevel:
"""评估婚姻风险"""
if static.get('7th_house_afflicted') and static.get('venus_weak'):
return RiskLevel.HIGH
elif static.get('7th_house_afflicted') or static.get('venus_weak'):
return RiskLevel.MEDIUM
else:
return RiskLevel.LOW
def _assess_career_risk(self, static: Dict) -> RiskLevel:
"""评估职业风险"""
if static.get('10th_house_strong'):
return RiskLevel.LOW
else:
return RiskLevel.MEDIUM
def _assess_wealth_risk(self, static: Dict) -> RiskLevel:
"""评估财富风险"""
if static.get('2nd_house_strong'):
return RiskLevel.LOW
else:
return RiskLevel.MEDIUM
def _assess_health_risk(self, static: Dict) -> RiskLevel:
"""评估健康风险"""
if static.get('6th_house_afflicted') and static.get('moon_weak'):
return RiskLevel.HIGH
elif static.get('6th_house_afflicted') or static.get('moon_weak'):
return RiskLevel.MEDIUM
else:
return RiskLevel.LOW
# ===== 时间预测 =====
def _predict_marriage_timing(self, dasha: Dict, transit: Dict) -> Optional[str]:
"""预测婚姻时间"""
if dasha.get('activated') and transit.get('triggered'):
return "近期可能"
elif dasha.get('activated'):
return "等待过境触发"
else:
return "需要等待Dasha激活"
def _predict_career_timing(self, dasha: Dict, transit: Dict) -> Optional[str]:
"""预测职业时间"""
if dasha.get('activated'):
return "当前阶段"
else:
return "需要等待Dasha激活"
def _predict_wealth_timing(self, dasha: Dict, transit: Dict) -> Optional[str]:
"""预测财富时间"""
if dasha.get('activated'):
return "当前阶段"
else:
return "需要等待Dasha激活"
def _predict_health_timing(self, dasha: Dict, transit: Dict) -> Optional[str]:
"""预测健康时间"""
if dasha.get('activated'):
return "当前需要注意"
else:
return "总体稳定"
def generate_report(self) -> str:
"""生成预测报告"""
if not self.predictions:
self.predict_all_events()
lines = []
lines.append("=" * 60)
lines.append("事件预测报告")
lines.append("=" * 60)
lines.append("")
for pred in self.predictions:
lines.append(f"{pred.event_type.value}")
lines.append(f" 概率:{pred.probability:.1f}%")
lines.append(f" 风险等级:{pred.risk_level.value}")
if pred.timing:
lines.append(f" 时间预测:{pred.timing}")
lines.append(" 关键因素:")
for factor in pred.key_factors:
lines.append(f" - {factor}")
lines.append(" 建议:")
for rec in pred.recommendations:
lines.append(f" - {rec}")
lines.append("")
return "\n".join(lines)
if __name__ == "__main__":
# 测试示例
test_chart = {
'planets': {
'Sun': {'house': 9, 'sign': 'Aries', 'status': 'exalted'},
'Moon': {'house': 1, 'sign': 'Leo', 'status': 'own_sign'},
'Mars': {'house': 1, 'sign': 'Aries', 'status': 'exalted'},
'Mercury': {'house': 9, 'sign': 'Aries', 'status': ''},
'Jupiter': {'house': 1, 'sign': 'Sagittarius', 'status': 'own_sign'},
'Venus': {'house': 8, 'sign': 'Pisces', 'status': 'exalted'},
'Saturn': {'house': 7, 'sign': 'Aquarius', 'status': 'own_sign'},
}
}
model = EventPredictionModel(test_chart)
predictions = model.predict_all_events()
print(model.generate_report())