Python Pandas如何实现当前两行与前两行的滚动对比及实时校验
解决方案
一、全量历史数据新增Cond11列
你要实现的两行和前两行对比逻辑,用pandas向量化运算即可高效实现,无需自定义滚动apply(性能更高):
核心逻辑:两行均值对比等价于两行和的对比(两边都除以2,大小关系完全一致),因此我们先计算n列的2行滚动和,再将当前2行滚动和与前2个位置的滚动和对比即可:
# 计算n列每连续2行的和 roll2_sum = df['n'].rolling(2).sum() # 当前2行和 > 往前数的前2行和,即为满足条件 df['Cond11'] = roll2_sum > roll2_sum.shift(2)
- 注意:最终结果的前3行(索引0、1、2)会返回NaN,属于正常逻辑:至少需要4行数据才能完成两组2行数据的对比,前3行没有足够的前置数据做校验。
如果你习惯用rolling(4)的写法也可以实现,仅性能略低于上述向量化方案:
df['Cond11'] = df['n'].rolling(4).apply(lambda x: x[-2:].mean() > x[:2].mean()).astype(bool)
二、实时场景校验最新行的代码修正
你给出的代码不能正确校验条件,问题出在Python的切片规则为左闭右开:
candles.n[-2:-1].sum()只会取倒数第2行的单值,不是最后两行的和candles.n[-4:-3].sum()只会取倒数第4行的单值,不是倒数第4、3行的和
正确写法如下:
# 取最后两行的和 与 倒数第4、3行的和对比 cond11 = candles.n.iloc[-2:].sum() > candles.n.iloc[-4:-2].sum()
- 注意:执行该校验前需要先判断dataframe的行数至少≥4,否则会触发索引越界错误。
内容的提问来源于stack exchange,提问作者Garrad2810
相关产品推荐
相关产品推荐

