You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Pandas的rolling groupby中使用随分组变化的窗口参数

按分组动态设置Rolling窗口的实现方案

针对你提供的月度数据DataFrame,由于同一id对应的window_in_months值固定,我们可以通过分组后自定义函数处理的方式,为每个分组设置专属的滚动窗口参数。

步骤1:预处理日期列

首先确保date列是datetime类型,保证时间排序的正确性:

import pandas as pd

# 构造示例数据
data = {
    'id': [1,1,2,2],
    'date': ['2000-01-01','2000-02-01','2000-01-01','2000-02-01'],
    'window_in_months': [3,3,12,12],
    'value': [20,30,40,60]
}
df = pd.DataFrame(data)

# 转换日期列为datetime类型
df['date'] = pd.to_datetime(df['date'])

步骤2:自定义分组滚动函数

编写函数,针对每个分组提取对应的窗口值,执行滚动计算(这里以均值为例,可替换为你需要的聚合函数如sum()max()等):

def group_rolling_calc(group):
    # 获取当前分组的窗口大小(同一id的window_in_months值一致,取第一个即可)
    window_size = group['window_in_months'].iloc[0]
    # 先按日期排序,再执行滚动计算,min_periods与窗口大小保持一致
    return group.sort_values('date')['value'].rolling(
        window=window_size, 
        min_periods=window_size
    ).mean()

步骤3:应用分组计算并合并结果

通过groupby.apply将函数应用到每个分组,再将结果合并回原DataFrame:

# 应用分组滚动计算,group_keys=False避免保留分组键层级
df['rolling_result'] = df.groupby('id', group_keys=False).apply(group_rolling_calc).reset_index(level=0, drop=True)

结果说明

对于示例数据,由于每个分组的数据量都小于对应的窗口大小(id1窗口3只有2条数据,id2窗口12只有2条数据),所以rolling_result列的结果均为NaN,符合min_periods=window_size的要求——只有当窗口内数据量达标时才会输出计算值。

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

火山引擎 最新活动