在 Python 中即时实施加权平均值
Implementing a weighted average on the fly in Python
我有一连串即将到来的数据,我想即时执行移动平均线。如果移动平均线中的所有元素都具有相同的权重,则使用 'Queue' 很容易实现,但我希望最近的元素具有更高的权重,并且该权重的分布是线性的(不是指数的)。
例如,如果移动平均线的长度为 5,则当前值的权重应为“1”,前一个值的权重应为“0.8”,依此类推,直到队列中的第五个元素应具有权重'0.2';所以权重向量是:[0.2, 0.4, 0.6, 0.8, 1.0]
。
我想知道是否有人知道如何实现它 Python。如果有任何更快的方法可以做到这一点,请向我推荐;效率对我的具体工作很重要。
如果您想保留所描述的权重向量(线性递减权重),您将需要保留有关您过去的流的所有信息。我很快尝试画出一个数学函数来避免将过去的标量保留在记忆中,但没有成功。这就是指数加权具有强大优势的地方:
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!
我有一连串即将到来的数据,我想即时执行移动平均线。如果移动平均线中的所有元素都具有相同的权重,则使用 'Queue' 很容易实现,但我希望最近的元素具有更高的权重,并且该权重的分布是线性的(不是指数的)。
例如,如果移动平均线的长度为 5,则当前值的权重应为“1”,前一个值的权重应为“0.8”,依此类推,直到队列中的第五个元素应具有权重'0.2';所以权重向量是:[0.2, 0.4, 0.6, 0.8, 1.0]
。
我想知道是否有人知道如何实现它 Python。如果有任何更快的方法可以做到这一点,请向我推荐;效率对我的具体工作很重要。
如果您想保留所描述的权重向量(线性递减权重),您将需要保留有关您过去的流的所有信息。我很快尝试画出一个数学函数来避免将过去的标量保留在记忆中,但没有成功。这就是指数加权具有强大优势的地方:
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!