Python Pandas计算相邻行滚动比率报错问题求解
问题复现
测试数据集构造代码:
import pandas as pd data = pd.DataFrame([1.0,2.0,3.0,4.0,5.0],columns=['close'])
执行以下滚动计算代码时触发报错:
data.close.rolling(3, win_type='triang').divide()
错误提示:
'Window' object has no attribute 'divide'
预期计算结果为相邻两行的比值:2.0/1.0、3.0/2.0、4.0/3.0、5.0/4.0。
错误原因
- pandas的Rolling滚动窗口对象本身没有
divide()内置方法,直接调用必然报属性不存在的错误 - 代码里设置的窗口大小为3、指定
triang三角加权窗,和「相邻两行逐行计算比值」的需求完全不匹配,这类参数是为滚动加权聚合类计算设计的。
正确实现方法
你需要的是当前行数值除以前一行数值,窗口大小固定为2即可,有两种常用实现方式:
方法1:移位直接计算(性能最优)
不需要启动滚动窗口,直接将序列移位一位后做除法即可,代码最简洁运行最快:
# 计算相邻比值 data['adj_ratio'] = data.close / data.close.shift(1)
方法2:滚动窗口自定义计算
如果后续需要扩展更复杂的窗口计算逻辑,可以用rolling.apply自定义窗口内的运算规则,窗口大小设为2:
data['adj_ratio'] = data.close.rolling(2).apply(lambda window: window[-1] / window[0])
两种方法得到的计算结果完全一致,输出如下:
close adj_ratio 0 1.0 NaN 1 2.0 2.000000 2 3.0 1.500000 3 4.0 1.333333 4 5.0 1.250000
第一行因为不存在前序相邻值,默认返回空值NaN,不需要空值的话在计算逻辑末尾追加.dropna()即可。
内容的提问来源于stack exchange,提问作者Dario Federici
相关产品推荐
相关产品推荐

