如何基于曲线交叉条件编辑Pandas DataFrame生成标记列
问题解决办法
报错原因
报错是因为位运算符&的优先级高于比较运算符,未加括号的情况下,代码会优先执行0 & df['curve_diff'].shift(1)这类运算,触发float数组和布尔标量的类型不匹配错误。
同时原逻辑也存在漏洞:只有两条曲线差值刚好等于0时才会触发标记,实际绝大多数连续曲线交叉场景下,差值只会发生正负符号翻转,不会刚好等于0,需要调整判断逻辑。
完整可运行代码
import pandas as pd import numpy as np # 生成测试数据 df=pd.DataFrame() df['curve1'] = np.sin([a/(2*np.pi) for a in range(180)])*np.random.choice([1,.8,1.2],180, p=(.5,.25,.25)) df['curve2'] = np.sin([-a/(2*np.pi) for a in range(180)])*np.random.choice([1,.8,1.2],180, p=(.5,.25,.25)) # 计算两条曲线差值 df['curve_diff'] = df['curve1'] - df['curve2'] # 计算差值的符号、上一行差值的符号 df['diff_sign'] = np.sign(df['curve_diff']) df['prev_diff_sign'] = df['diff_sign'].shift(1) # 初始化标记列为0 df['new'] = 0 # 向上穿:curve1从低于/等于curve2变为高于curve2,标记1 df.loc[(df['prev_diff_sign'] <= 0) & (df['diff_sign'] > 0), 'new'] = 1 # 向下穿:curve1从高于/等于curve2变为低于curve2,标记-1 df.loc[(df['prev_diff_sign'] >= 0) & (df['diff_sign'] < 0), 'new'] = -1 # 可选:删除中间计算列 df = df.drop(columns=['diff_sign', 'prev_diff_sign', 'curve_diff'])
效果说明
运行后new列就会按照要求标记交叉点:蓝色曲线(curve1)向上穿过橙色曲线(curve2)标记为1,向下穿过标记为-1,无交叉位置为0。
内容的提问来源于stack exchange,提问作者user13079994
相关产品推荐
相关产品推荐

