51 lines
2.0 KiB
Python
51 lines
2.0 KiB
Python
import pandas as pd
|
||
import numpy as np
|
||
|
||
def luckCalc_huangjijingshi(Map64Gua, yearGuaMap, GuaLuck):
|
||
"""
|
||
计算年份吉凶卦象
|
||
Args:
|
||
Map64Gua (pd.DataFrame): 64卦映射表,包含卦名、爻信息和二进制值
|
||
yearGuaMap (list or pd.DataFrame): 年份卦象映射表,格式为 [年份, 卦名]
|
||
GuaLuck (pd.DataFrame): 吉凶卦象,包含6爻信息
|
||
Returns:
|
||
pd.DataFrame: 包含年份、年卦和吉凶卦的结果表
|
||
"""
|
||
LuckYear = []
|
||
|
||
# 确保 yearGuaMap 是 DataFrame(如果是列表,先转换)
|
||
if isinstance(yearGuaMap, list):
|
||
yearGuaMap = pd.DataFrame(yearGuaMap, columns=['Year', 'Trigram'])
|
||
|
||
for i in range(len(yearGuaMap)):
|
||
kYear = yearGuaMap.iloc[i] # 当前年份和卦名
|
||
trigram = kYear['Trigram']
|
||
|
||
# 找到当前卦名对应的卦象(爻信息)
|
||
k1 = Map64Gua[Map64Gua['trigram'] == trigram].index
|
||
if len(k1) == 0:
|
||
raise ValueError(f"未找到卦名 {trigram} 对应的卦象")
|
||
|
||
# 提取当前卦的6爻和吉凶卦的6爻,合并计算
|
||
abc = Map64Gua.loc[k1, ['yao1', 'yao2', 'yao3', 'yao4', 'yao5', 'yao6']].values
|
||
abc_luck = GuaLuck[['yao1', 'yao2', 'yao3', 'yao4', 'yao5', 'yao6']].values
|
||
abc_combined = np.vstack([abc, abc_luck])
|
||
|
||
# 计算新卦的二进制值(模2求和后加权)
|
||
abc2 = np.mod(np.nansum(abc_combined, axis=0), 2)
|
||
abc3 = np.sum(abc2 * [1, 2, 4, 8, 16, 32])
|
||
|
||
# 查找对应的新卦
|
||
new_gua = Map64Gua[Map64Gua['value_2binary'] == abc3].iloc[0]
|
||
LuckYear.append(new_gua)
|
||
|
||
# 合并结果
|
||
LuckYear = pd.DataFrame(LuckYear)
|
||
LuckYear['Year'] = yearGuaMap['Year'].values
|
||
LuckYear['YearGua'] = yearGuaMap['Trigram'].values
|
||
|
||
# 调整列顺序(年份和年卦在前)
|
||
cols = ['Year', 'YearGua'] + [c for c in LuckYear.columns if c not in ['Year', 'YearGua']]
|
||
LuckYear = LuckYear[cols]
|
||
|
||
return LuckYear |