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

如何在非均匀域上计算加权移动平均?优先用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层面循环,提升效率:

  1. 提取索引和目标值为NumPy数组:
x = df.index.values
y = df['y'].values
  1. 计算所有索引点之间的差值矩阵:
dx = x[:, np.newaxis] - x  # 形状为(n, n),dx[i,j] = x[i] - x[j],对应x0=x[i]时的x0-x[j]
  1. 生成权重矩阵:
weights = f(dx)
  1. 计算加权平均的分子与分母,得到最终结果:
numerator = weights @ y
denominator = weights.sum(axis=1)
yavg = numerator / denominator
  1. 将结果回写到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:33:25