huangjijingshi/bianyao_huangjijingshi.py

57 lines
2.0 KiB
Python
Raw Normal View History

2025-05-06 17:57:02 +08:00
import pandas as pd
def bianyao_huangjijingshi(Map64Gua: pd.DataFrame, yaoOrig: str) -> pd.DataFrame:
"""
皇极经世变爻计算
输入原爻 '000100'输出所有变爻之后的卦象合集
"""
#print("Map64Gua:",Map64Gua['yaoAll'].apply(type).value_counts())
# 找到原始卦所在的行
if 'yaoAll' not in Map64Gua.columns:
raise ValueError("'yaoAll' 列在 Map64Gua 中不存在,请检查数据")
Map64Gua = Map64Gua.copy()
Map64Gua['yaoAll'] = Map64Gua['yaoAll'].astype(str).str.zfill(6).str.strip()
yaoOrig = str(yaoOrig).zfill(6).strip()
# 找到原始卦所在的行
matches = Map64Gua[Map64Gua['yaoAll'] == yaoOrig]
if matches.empty:
raise ValueError(f"未找到 yaoAll 为 {yaoOrig} 的卦象")
k2 = matches.iloc[0] # 取第一行
# 计算原卦的二进制值
a0 = (k2['yao1'] + k2['yao2']*2 + k2['yao3']*4 +
k2['yao4']*8 + k2['yao5']*16 + k2['yao6']*32)
# 依次翻转每一爻,得到新卦的二进制值
a1 = (k2['yao1'] + k2['yao2']*2 + k2['yao3']*4 +
k2['yao4']*8 + k2['yao5']*16 + (1 - k2['yao6'])*32)
a2 = (k2['yao1'] + k2['yao2']*2 + k2['yao3']*4 +
k2['yao4']*8 + (1 - k2['yao5'])*16 + k2['yao6']*32)
a3 = (k2['yao1'] + k2['yao2']*2 + k2['yao3']*4 +
(1 - k2['yao4'])*8 + k2['yao5']*16 + k2['yao6']*32)
a4 = (k2['yao1'] + k2['yao2']*2 + (1 - k2['yao3'])*4 +
k2['yao4']*8 + k2['yao5']*16 + k2['yao6']*32)
a5 = (k2['yao1'] + (1 - k2['yao2'])*2 + k2['yao3']*4 +
k2['yao4']*8 + k2['yao5']*16 + k2['yao6']*32)
a6 = ((1 - k2['yao1']) + k2['yao2']*2 + k2['yao3']*4 +
k2['yao4']*8 + k2['yao5']*16 + k2['yao6']*32)
# 结果列表
result = pd.DataFrame()
# 查找对应的卦象
for a in [a0, a1, a2, a3, a4, a5, a6]:
row = Map64Gua[Map64Gua['value_2binary'] == a]
if not row.empty:
result = pd.concat([result, row], ignore_index=True)
return result