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