在Python中即时实现加权平均值

时间:2018-06-27 17:26:37

标签: python queue weighted-average

我有大量即将到来的数据,我想即时实现移动平均。如果移动平均线中的所有元素都具有相同的权重,则使用“队列”可以很容易地实现,但是我希望最新的元素具有更高的权重,并且这些权重的分布是线性的(不是指数的)。

例如,如果移动平均线的长度为5,则当前值的权重应为“ 1”,前一个值的权重应为“ 0.8”,依此类推,直到队列中第五个元素的权重为“ 0.2” ';因此权重向量为:[0.2, 0.4, 0.6, 0.8, 1.0]

我想知道是否有人知道如何使用Python。如果有更快的方法可以这样做,请向我推荐;效率对我的特定工作很重要。

1 个答案:

答案 0 :(得分:0)

如果您要保留所述的加权矢量(线性降低的权重),则需要保留有关过去流的所有信息。我很快尝试绘制一个数学函数,该函数将避免过去的标量无法成功存储。这就是指数加权具有强大优势的地方:

average_(t) = x_(t) + aa*average_(t-1)

您只需要在内存中保留两个变量即可。

无论如何,如果内存不是效率参数,那么您的问题就会因向量乘法而下降。因此,我建议使用 numpy 库。 [1] [2]。请参阅下面的解决方案示例(也许您会找到一个更有效的解决方案):

import numpy as np

stream = np.array((20, 40))
n = len(stream)

latest_scalar = 60
stream = np.append(stream, latest_scalar)

n += 1
# n represent the length of the stream
# I assumed that is more efficient to handle n without calling len() function
# may raise safety issue
weights = np.arange(1, n+1)
# [1, 2, 3]
average = np.dot(stream, weights).sum() / (n*(n+1)/2)
# (n*(n+1)/2): total of the weights
# output: 46.666... ok!