huangjijingshi/luckCalc_huangjijingshi.py

51 lines
2.0 KiB
Python
Raw Permalink Normal View History

2025-05-06 17:57:02 +08:00
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