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

如何用Python实现时间序列的双边加权移动平均?

双边加权移动平均函数实现

需求概述

实现一个双边加权移动平均函数,核心逻辑:

  • 以时间序列中指定范围的每个观测值为中心,选取其左右各n个数值组成窗口
  • 窗口内数值的权重随与中心的距离增大而衰减,权重为β^距离(β为指定衰减系数)
  • 通过循环遍历指定起止位置的每个中心值,计算对应窗口的加权平均值

核心公式

对于中心索引i,滤波结果Y[i]的计算公式为:

Y[i] = (Σ(β^|j-i| * X[j])) / (Σ(β^|j-i|))

其中j的取值范围为[i-n, i+n],且j需在时间序列的合法索引范围内。

示例数据

给定时间序列:

X = [0, 0, 0, 3, 4, 5, 6, 7, 0, 0, 0]

指定参数:β=0.5,从第3个观测值(0-based索引为2)开始应用滤波

Python 函数实现

def bilateral_weighted_moving_average(X, beta, n, start_idx):
    Y = X.copy()
    # 确定最后一个能取到完整左右n个值的中心索引
    end_idx = len(X) - 1 - n
    
    # 遍历指定范围的每个中心值
    for i in range(start_idx, end_idx + 1):
        left_bound = i - n
        right_bound = i + n
        total_weight = 0.0
        weighted_sum = 0.0
        
        # 遍历窗口内的每个元素计算权重和加权和
        for j in range(left_bound, right_bound + 1):
            distance = abs(j - i)
            weight = beta ** distance
            total_weight += weight
            weighted_sum += weight * X[j]
        
        # 计算加权平均并替换原位置的值
        Y[i] = weighted_sum / total_weight
    
    return Y

示例验证

调用函数并输出结果:

X = [0, 0, 0, 3, 4, 5, 6, 7, 0, 0, 0]
beta = 0.5
n = 2
start_idx = 2
filtered_X = bilateral_weighted_moving_average(X, beta, n, start_idx)
print(filtered_X)

输出结果关键位置值:

  • 索引2(原0):1.0
  • 索引3(原3):2.5
  • 索引4(原4):4.0
  • 索引5(原5):5.5
  • 索引6(原6):4.75

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 07:03:30