虽然我喜欢像george这样的Martijn's answer方法,但我想知道,如果使用一个运行求和法,而不是在几乎相同的数字上一遍又一遍地应用sum(),这样做是否更快。
另外,在爬坡阶段将None值作为默认值的想法也很有趣。事实上,移动平均线可能有很多不同的情况。我们把平均数的计算分成三个阶段:加速:在当前迭代计数窗口大小处开始迭代
稳定的进程:我们有精确的窗口大小的元素数,可以计算一个正常的average := sum(x[iteration_counter-window_size:iteration_counter])/window_size
斜坡下降:在输入数据的末尾,我们可以返回另一个window_size - 1“平均”数字。
这里有一个函数可以接受任意iterable(生成器可以)作为数据输入
任意窗口大小>;=1
在上升/下降阶段打开/关闭值产生的参数
这些阶段的回调函数,用于控制如何生成值。这可用于持续提供默认值(例如None)或提供部分平均值
代码如下:from collections import deque
def moving_averages(data, size, rampUp=True, rampDown=True):
"""Slide a window of elements over to calc an average
First and last iterations when window is not yet completely
filled with data, or the window empties due to exhausted , the