Pandas的滚动窗口,步长等于窗口大小
我查了怎么用Pandas的 rolling 函数,但在使用时遇到了困难。
让我们用一个简单的例子:把 [0, 1, 2, ..., 15] 当作一个Pandas Series。
s = pd.Series(range(16))
我想得到前四个元素的和,再得到接下来的四个元素的和,直到最后一个元素,也就是 [6, 22, 38, 54]。
我尝试了这个:
>>> s.rolling(4, step=4, closed="both").sum()
0 NaN
4 10.0
8 30.0
12 50.0
dtype: float64
似乎是从 3 开始,到 12 结束,这与我的预期不符。到目前为止,调整参数也没有帮助。充其量,我得到了
>>> s.rolling(4, step=4, closed='left').sum()
0 NaN
4 6.0
8 22.0
12 38.0
dtype: float64
仍然缺少 54。
我到底哪里做错了?
解决方案
我想得到前四个元素的和,再得到接下来的四个元素的和……
如果你需要的是一个不重叠的窗口,那就不是一个滚动窗口。
相反地,你可以将索引对窗口大小进行向下整除,然后分组:
>>> s.groupby(s.index//4).sum()
0 6
1 22
2 38
3 54
dtype: int64
对于非区间索引的情况:s.groupby(np.arange(len(s)) // 4).sum()
否则,似乎你其实需要一个向前的窗口,可以使用 FixedForwardWindowIndexer:
>>> from pandas.api.indexers import FixedForwardWindowIndexer as ffwi
>>> s.rolling(ffwi(window_size=4), step=4).sum()
0 6.0
4 22.0
8 38.0
12 54.0
dtype: float64
用户指南:窗口操作 § 自定义窗口滚动
这与用 start=3 对完整结果进行切片(如Julien的回答所示)类似,只是 .rolling 不支持一个 start 参数,因此我们要改用前向窗口。这种方法应该避免不必要的计算(也就是那些会被切除的部分)。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。