Pandas按条件匹配行后对比后续多行计算价格差值方法
Pandas 按形态标识行计算后续N周期价格差实现方案
现有包含price(价格)、pattern(形态标识:0代表无目标形态,1代表存在目标形态)两列的DataFrame,示例数据如下:
price pattern 0 10 0 1 12 1 2 15 0 3 11 0 4 9 0
需要仅对pattern=1的行完成两项差值计算:
- 目标行价格与下1行价格的差值(下1行价格 - 目标行价格),存入新列
diff_1_tf,用于后续统计均值、分析形态出现后的整体价格变动规律 - 目标行价格与向后数第3行价格的差值(后第3行价格 - 目标行价格),存入新列
diff_3_tf
方案1:shift向量化实现(推荐,性能最优)
你提到的shift函数完全适配这个场景,不需要写逐行循环,pandas向量化运算的执行效率比逐行迭代高1~2个数量级,实现逻辑:
df['col'].shift(-n)会将列整体向上平移n位,平移后每一行的取值,就是原列对应行向后数第n行的取值- 计算完全部行的差值后,仅保留
pattern=1行的计算结果,其余行置为空值即可
完整代码:
# 复制源数据避免修改原表 new_df = df[['price', 'pattern']].copy() # 生成后1行、后3行价格的对齐列 next_1_price = new_df['price'].shift(-1) next_3_price = new_df['price'].shift(-3) # 仅给形态标识为1的行赋值差值 new_df.loc[new_df['pattern'] == 1, 'diff_1_tf'] = next_1_price - new_df['price'] new_df.loc[new_df['pattern'] == 1, 'diff_3_tf'] = next_3_price - new_df['price']
示例数据运行后输出结果:
price pattern diff_1_tf diff_3_tf 0 10 0 NaN NaN 1 12 1 3.0 -3.0 2 15 0 NaN NaN 3 11 0 NaN NaN 4 9 0 NaN NaN
后续做统计分析直接调用聚合方法即可:
# 统计形态出现后1周期的平均价格变动 avg_diff_1 = new_df['diff_1_tf'].mean() # 统计形态出现后3周期的平均价格变动 avg_diff_3 = new_df['diff_3_tf'].mean()
方案2:iterrows逐行迭代实现
你提到的iterrows()结合索引定位也可以实现需求,适合习惯逐行写逻辑的场景,注意提前初始化新列,同时加索引越界判断避免最后几行无后续数据时报错:
new_df = df[['price', 'pattern']].copy() # 初始化新列为空值 new_df[['diff_1_tf', 'diff_3_tf']] = pd.NA for idx, row in new_df.iterrows(): # 仅处理存在形态的行 if row['pattern'] != 1: continue # 计算1周期差值,判断索引不越界 if idx + 1 < len(new_df): new_df.loc[idx, 'diff_1_tf'] = new_df.loc[idx+1, 'price'] - row['price'] # 计算3周期差值,判断索引不越界 if idx + 3 < len(new_df): new_df.loc[idx, 'diff_3_tf'] = new_df.loc[idx+3, 'price'] - row['price']
注意:逐行迭代方案仅适合数据量10万行以内的小数据集,数据量较大时优先选shift向量化方案。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

