pandas滚动相关性:窗口设为'1d'与1为何返回不同结果?
为什么pandas rolling窗口用'1d'和1会得到不同的corr结果?
先看你的数据和代码:
import pandas as pd df = pd.DataFrame({'x':(1,2), 'y':(2,3)}, index=[pd.Timestamp('20180101'), pd.Timestamp('20180102')]) # 两种不同的rolling写法 df.rolling(window='1d').corr() df.rolling(window=1).corr()
你觉得“窗口大小都是1”应该结果一致,但其实这两种窗口的定义逻辑天差地别:
1. 整数窗口window=1:按观测行数取窗口
这个窗口的意思是:每个窗口只包含当前行这1条数据。但计算相关系数的前提是至少有2个样本(单个样本的协方差为0,不同列之间的相关系数无法计算),所以运行结果里,只有列自身和自身的相关系数是1,不同列之间全是NaN:
x y 2018-01-01 x 1.0 NaN y NaN 1.0 2018-01-02 x 1.0 NaN y NaN 1.0
2. 时间偏移窗口window='1d':按时间范围取窗口
这个窗口的意思是:每个窗口包含当前时间点往前1天内的所有观测数据。看你的索引:
- 2018-01-01的窗口范围是当天,只有自己1条数据,结果和上面一致;
- 2018-01-02的窗口范围是「2018-01-01 00:00:00」到「2018-01-02 00:00:00」,这刚好包含了前一行的数据,窗口里有2个样本!
两个样本(1,2)和(2,3)是完全正相关的,所以第二行的x和y相关系数会是1,最终结果:
x y 2018-01-01 x 1.0 NaN y NaN 1.0 2018-01-02 x 1.0 1.0 y 1.0 1.0
核心总结
- 整数窗口:固定取N个连续的行,和时间无关;
- 时间偏移窗口:取当前时间往前指定范围内的所有行,和行数无关。
这就是为什么看起来“窗口大小都是1”,结果却完全不同的原因。
内容的提问来源于stack exchange,提问作者user3538043
相关产品推荐
相关产品推荐

