You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在排除当日数据的情况下计算Roll Sum(滚动求和)?

问题与解决方案

原始数据

我有如下DataFrame:

var 1Day
01
02
13
14
15
16
07
08

需求

计算k天滚动求和(Roll Sum),求和范围不包含当日数据。以k=3为例,期望输出如下:

var 1Daysum
01NA
02NA
13NA
141
152
163
073
082

解决方案

方法1:使用rolling的closed参数(推荐,Pandas 1.2.0+)

利用rolling方法的closed='left'参数,指定窗口仅包含当前行之前的k个数据点,不包含当前行:

import pandas as pd

# 构造数据
df = pd.DataFrame({
    'var 1': [0, 0, 1, 1, 1, 1, 0, 0],
    'Day': [1, 2, 3, 4, 5, 6, 7, 8]
})

k = 3
# 计算滚动求和,不包含当日
df['sum'] = df['var 1'].rolling(window=k, closed='left').sum()

print(df)

输出结果与需求完全一致,前k行自动填充为NaN(等价于示例中的NA)。

方法2:基于累计求和(兼容旧版Pandas)

通过累计求和(cumsum)的差值实现,再手动将前k行设为NA:

import pandas as pd

df = pd.DataFrame({
    'var 1': [0, 0, 1, 1, 1, 1, 0, 0],
    'Day': [1, 2, 3, 4, 5, 6, 7, 8]
})

k = 3
# 计算累计求和的差值
cum_sum = df['var 1'].cumsum()
df['sum'] = cum_sum - cum_sum.shift(k, fill_value=0)
# 前k行设为NA
df.loc[:k-1, 'sum'] = pd.NA

print(df)

这个方法不依赖closed参数,适合版本较低的Pandas环境。

内容的提问来源于stack exchange,提问作者doraemon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 21:53:17