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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:46:06