Pandas按分组计算日期扩展窗口均值并补全缺失日期值的实现方法
分组时序扩展窗口均值计算及补全方案
优化扩展均值计算逻辑
原有两次分组聚合的写法可以简化为单次聚合,减少计算开销,和原有逻辑结果完全一致,代码如下:
import pandas as pd # 预处理:将日期转为datetime格式,按分组+日期排序保证时序正确性 df_example['date'] = pd.to_datetime(df_example['date']) df_example = df_example.sort_values(['group', 'date']).reset_index(drop=True) # 单次按分组+日期聚合,同时计算总和、计数 date_agg = df_example.groupby(['group', 'date'])['val'].agg(['sum', 'count']) # 分组累加后直接计算均值 expanding_mean = date_agg.groupby('group').cumsum().eval('val = sum / count')[['val']]
补全全量日期序列
要实现所有分组覆盖完整日期、缺失日期沿用最近结果的需求,可以通过重索引+向前填充实现,代码如下:
# 取全局所有出现过的日期作为完整日期序列 all_dates = df_example['date'].unique() # 反压栈分组维度、重索引补全日期、向前填充缺失值、恢复索引结构 full_result = expanding_mean.unstack('group')\ .reindex(all_dates)\ .ffill()\ .stack('group')\ .swaplevel()\ .sort_index()
多指标适配说明
如果需要同时计算多个指标的扩展均值,只需修改聚合逻辑即可,无需调整整体流程:
# 假设存在val1、val2两个需要计算的指标 date_agg = df_example.groupby(['group', 'date'])[['val1', 'val2']].agg(['sum', 'count']) cumsum_agg = date_agg.groupby('group').cumsum() # 批量计算所有指标的扩展均值 for col in ['val1', 'val2']: cumsum_agg[col] = cumsum_agg[(col, 'sum')] / cumsum_agg[(col, 'count')] expanding_mean = cumsum_agg[[col for col in ['val1', 'val2']]]
内容的提问来源于stack exchange,提问作者user157545
相关产品推荐
相关产品推荐

