Python中的双向移动平均线

时间:2019-05-17 00:32:55

标签: python-2.7 numpy scipy moving-average

嗨,我有一些数据,我想计算中心移动平均值或两侧移动平均值。

我已经知道可以使用numpy.convolve函数完成此操作多么容易,并且我想知道是否有一种简单或类似的方法可以完成此操作,但是平均时间需要两面。

如果间隔包含三个条目N = 3,则单侧移动平均通常以以下方式工作:

import numpy
list = [3, 4, 7, 8, 9, 10]
N = 3
window = numpy.repeat(1., N)/N
moving_avg = numpy.convolve(list, window, 'valid')
moving_avg = array([ 4.66666667,  6.33333333,  8.        ,  9.        ])

现在我要获取的是居中的平均值,因此,如果N = 3,则取平均值的间隔为:[[3,4,7],[4,7,8] ,[7、8、9],[8、9、10]。如果N是偶数,这也很棘手。有没有计算工具?我更愿意通过编写函数或使用numpy来做到这一点。

1 个答案:

答案 0 :(得分:1)

像评论员一样,我也很困惑您要实现的目标与您演示的方式不同。

无论如何,我确实想提供一种解决方案,允许您使用Numba's @stencil decorator编写自己的卷积运算:

{
  "size": 0,
  "aggs": {
    "routes": {
      "terms": {
        "field": "route",
        "size": 50
      }
    }
  }
}

不确定这是否正是您要寻找的东西,但模具操作员很棒。您传递的变量表示给定的元素,并且您使用的任何索引都是相对于该元素的。如您所见,创建一个3个元素的窗口以计算移动平均值非常容易。

希望这能满足您的需求。

使用大邻居

您可以将一个参数添加到模具中(包括在内)。让我们邻里9:

ip_range

您可以使用(-8,0)或(0,8)向前或向后移动范围,并更改范围。

设置N个邻居

不确定这是否是最好的方法,但是我用包装器完成了它:

from numba import stencil

@stencil
def ma(a):
    return (a[-1] + a[0] + a[1]) / 3

data = np.array([3, 4, 7, 8, 9, 10])
print(ma(data))
[0.         4.66666667 6.33333333 8.         9.         0.        ]

同样,索引很奇怪,因此您必须使用它才能获得想要的效果。