基于3天滚动窗口的Dataframe逐日全局均值与标准差计算问题
高效计算带3天滚动窗口的年度日期全局均值与标准差
问题场景
现有包含Date(2000-2023年日度数据)和Value列的DataFrame,需计算每个月-日组合的全局均值与标准差,核心规则:每个日期的统计范围是该日期±1天的所有年份对应数据(即3天滚动窗口,中心为当前日期)。直接按Month_Day分组不可行,因为单条数据会参与多个日期的统计,遍历逐个日期筛选的方法效率极低。
已实现的高效均值计算方案
通过滚动统计+分组汇总的向量化操作替代循环,大幅提升效率:
# 先生成月-日标识列 df['Date'] = pd.to_datetime(df['Date']) df['Month_Day'] = df['Date'].dt.strftime('%m-%d') # 计算3天中心滚动窗口的求和与计数 df['roll_sum'] = df['Value'].rolling(window=3, min_periods=1, center=True).sum() df['roll_count'] = df['Value'].rolling(window=3, min_periods=1, center=True).count() # 按月-日分组汇总,计算全局均值 df_grouped = df.groupby('Month_Day').agg( total_sum=('roll_sum', 'sum'), total_count=('roll_count', 'sum') ).reset_index() df_grouped['avg'] = df_grouped['total_sum'] / df_grouped['total_count'] # 合并回原DataFrame df = df.merge(df_grouped[['Month_Day', 'avg']], on='Month_Day', how='left')
逻辑说明
先对每条数据计算其所在3天滚动窗口的总和与样本数,再按Month_Day将所有窗口的总和、样本数分别累加,最终通过总总和/总样本数得到该日期的全局均值。
标准差的高效计算实现
标准差的核心需求是:对每个Month_Day的全局均值avg,计算所有年份中该日期±1天的Value与avg的差的平方和,再通过方差推导得到标准差。
公式推导
差的平方和可展开为:
$$\sum (Value_i - avg)^2 = \sum Value_i^2 - 2avg\sum Value_i + n*avg^2$$
其中:
- $\sum Value_i^2$:所有窗口内的
Value平方和总和 - $\sum Value_i$:所有窗口内的
Value总和(均值计算中已得到) - $n$:所有窗口的总样本数(均值计算中已得到)
代码实现
复用均值计算的滚动统计结果,新增滚动平方和的计算:
# 新增3天中心滚动窗口的Value平方和 df['roll_sq_sum'] = (df['Value']**2).rolling(window=3, min_periods=1, center=True).sum() # 按月-日分组汇总所有统计量 df_grouped = df.groupby('Month_Day').agg( total_sum=('roll_sum', 'sum'), total_count=('roll_count', 'sum'), total_sq_sum=('roll_sq_sum', 'sum') ).reset_index() # 计算全局均值 df_grouped['avg'] = df_grouped['total_sum'] / df_grouped['total_count'] # 计算差的平方和、方差、标准差 df_grouped['sum_sq_diff'] = df_grouped['total_sq_sum'] - 2 * df_grouped['avg'] * df_grouped['total_sum'] + df_grouped['total_count'] * df_grouped['avg']**2 df_grouped['var'] = df_grouped['sum_sq_diff'] / df_grouped['total_count'] df_grouped['std'] = df_grouped['var']**0.5 # 合并回原DataFrame df = df.merge(df_grouped[['Month_Day', 'avg', 'std']], on='Month_Day', how='left')
优势说明
全程使用pandas向量化操作,避免了循环遍历,计算效率与均值方案一致,远高于逐个日期筛选的方法。
内容的提问来源于stack exchange,提问作者kilag
相关产品推荐
相关产品推荐

