如何基于完整8个月时间序列按COD分组计算ACT的均值与标准差
按完整8个月时间周期计算分组ACT均值与标准差的解决方案
你之前的代码是直接对每个COD现存的ACT记录计算均值和标准差,但这只能反映有活动记录的时间段的统计结果,没法覆盖你需要的完整8个月周期。要解决这个问题,我们需要先补全每个COD在8个月周期内的所有时间节点数据(无活动的节点填充0),再基于完整序列计算统计量。具体步骤如下:
1. 预处理日期并确定完整时间周期
首先把日期转换为可分组的格式,然后确定8个月的连续时间范围(这里以数据中最早的月份为起点,你也可以指定固定的起始月份):
import pandas as pd # 你的原始数据(示例) df = pd.DataFrame({ 'COD': [5713]*5 + [23369]*4 + [32012]*2, 'ACT': [1.0]*11, 'DATE': ['2020-07-16', '2020-08-11', '2020-06-20', '2020-06-19', '2020-06-01', '2020-07-17', '2020-08-07', '2020-09-02', '2020-11-22', '2020-06-02', '2020-07-26'] }) # 转换日期格式并提取年月(作为时间分组单位) df['DATE'] = pd.to_datetime(df['DATE']) df['year_month'] = df['DATE'].dt.to_period('M') # 生成连续8个月的时间序列:以数据中最早的月份为起点 start_month = df['year_month'].min() full_time_range = pd.period_range(start=start_month, periods=8, freq='M')
2. 构建完整的COD-时间节点数据集
生成所有唯一COD和8个月时间节点的笛卡尔积,确保每个COD都覆盖完整周期:
# 获取所有唯一的COD值 unique_cods = df['COD'].unique() # 构建COD与完整时间节点的全量组合 full_dataset = pd.MultiIndex.from_product( [unique_cods, full_time_range], names=['COD', 'year_month'] ).to_frame(index=False)
3. 聚合月度ACT数据并补全缺失值
把原始数据按COD和年月分组统计月度活动次数,再和全量数据集合并,无活动的月份填充0:
# 统计每个COD每月的ACT总和(每条记录代表1次活动,总和即月度活动次数) monthly_act_counts = df.groupby(['COD', 'year_month'])['ACT'].sum().reset_index() # 合并到全量数据集,缺失的ACT值填充为0(代表该月无活动) full_dataset = full_dataset.merge( monthly_act_counts, on=['COD', 'year_month'], how='left' ).fillna({'ACT': 0})
4. 计算完整周期的均值与标准差
现在基于补全后的8个月完整序列,按COD分组计算统计量,还可以把结果合并回原始数据:
# 计算每个COD的均值和标准差 cod_stats = full_dataset.groupby('COD')['ACT'].agg( MEAN='mean', STD='std' ).reset_index() # 将统计量合并回原始数据(方便和原记录对应) df = df.merge(cod_stats, on='COD', how='left') # 如果需要查看每个COD的完整8个月序列及统计量,可以查看full_dataset full_dataset = full_dataset.merge(cod_stats, on='COD', how='left')
关键细节说明
- 这里以月度为时间粒度,如果你需要按天计算,只需把
freq='M'改成freq='D',生成8个月内的所有日期即可。 - 填充值用0是因为无活动的月份没有ACT记录,代表活动次数为0;如果用NaN,计算均值时会忽略该节点,依然不符合完整周期的统计要求。
- 最终的
cod_stats就是每个COD在完整8个月周期内的ACT均值和标准差,full_dataset则包含了每个月的具体活动次数和统计结果。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

