You need to enable JavaScript to run this app. 如何基于曲线交叉条件编辑Pandas DataFrame生成标记列
优惠活动
大模型
产品
解决方案
定价
更多

如何基于曲线交叉条件编辑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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 13:24:03