如何在非均匀域上计算加权移动平均?优先用NumPy实现
非等间隔观测值的加权滚动平均实现需求
之前的讨论针对的是等间距观测值的滚动平均计算(索引为整数范围),但我的场景中观测值是在任意时间点采集的,观测间隔可以是任意浮点数。示例数据如下:
import pandas as pd import numpy as np df = pd.DataFrame({"y":np.random.uniform(size=100)}, index=np.random.uniform(size=100)).sort_index()
我需要为df添加一列yavg,该列在索引值x0处的取值为:
sum(df.y[x]*f(x0-x) for x in df.index) / sum(f(x0-x) for x in df.index)
其中f是给定的权重函数,例如:
def f(x): return np.exp(-x*x)
请问如何以最小工作量实现该需求?优先使用纯NumPy实现。
实现方案
利用NumPy的广播机制完成向量化计算,避免Python层面循环,提升效率:
- 提取索引和目标值为NumPy数组:
x = df.index.values y = df['y'].values
- 计算所有索引点之间的差值矩阵:
dx = x[:, np.newaxis] - x # 形状为(n, n),dx[i,j] = x[i] - x[j],对应x0=x[i]时的x0-x[j]
- 生成权重矩阵:
weights = f(dx)
- 计算加权平均的分子与分母,得到最终结果:
numerator = weights @ y denominator = weights.sum(axis=1) yavg = numerator / denominator
- 将结果回写到DataFrame:
df['yavg'] = yavg
完整可运行代码:
import pandas as pd import numpy as np def f(x): return np.exp(-x*x) # 生成示例数据 df = pd.DataFrame({"y":np.random.uniform(size=100)}, index=np.random.uniform(size=100)).sort_index() # 纯NumPy实现加权平均计算 x = df.index.values y = df['y'].values dx = x[:, np.newaxis] - x weights = f(dx) df['yavg'] = (weights @ y) / weights.sum(axis=1)
说明:该方案完全基于NumPy向量化操作,比逐元素循环效率提升显著;若处理超大规模数据(如10万+样本),可进一步结合SciPy的稀疏矩阵优化或滑动窗口裁剪,但常规数据规模下上述方案已足够高效。
内容的提问来源于stack exchange,提问作者sds
相关产品推荐
相关产品推荐

