如何用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
相关产品推荐
相关产品推荐

