Pandas的滚动窗口,步长等于窗口大小

后端开发 2026-07-09

我查了怎么用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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章