Pandas无需for循环利用前X行数据定义新列实现Doji指标
Pandas实现Doji指标无循环方案
核心思路
用Pandas滚动窗口(rolling)替代手动遍历/多shift调用,全向量化操作完全匹配原有逻辑,性能远高于for循环。
实现步骤
- 先计算每根K线的实体高度:
实体高度 = |收盘价 - 开盘价| - 用滚动窗口计算当前行之前20个实体高度的均值,通过
closed='left'参数排除当前行,完全匹配原有逻辑的取值范围 - 用
numpy.where()单条语句完成条件判断,生成isDoji标记列
完整代码示例
import pandas as pd import numpy as np # 假设你的行情DataFrame变量名为df,包含open、close列 # 1. 计算实体高度 df['body_height'] = abs(df['close'] - df['open']) # 2. 计算前20行实体高度的均值(不包含当前行) df['prev_20_body_avg'] = df['body_height'].rolling(window=20, closed='left').mean() # 3. 单行生成isDoji标记,和原for循环结果完全一致 df['isDoji'] = np.where(df['body_height'] <= df['prev_20_body_avg'] * 0.05, True, False) # 可选:前20行无足够历史数据,填充为False df['isDoji'] = df['isDoji'].fillna(False)
逻辑一致性说明
rolling(window=20, closed='left')会为第N行(索引从0开始)计算[N-20, N-1]区间的均值,完全等价于遍历到第N行时取前20行计算的逻辑,无任何偏差。
内容的提问来源于stack exchange,提问作者wildcat89
相关产品推荐
相关产品推荐

