我想用NumPy(或Pandas)编写计算Arnaud-Legoux移动平均值的代码的向量化版本。你能帮我拿这个吗?谢谢。在
非矢量化版本如下所示(见下文)。在
def NPALMA(pnp_array, **kwargs) :
'''
ALMA - Arnaud Legoux Moving Average,
http://www.financial-hacker.com/trend-delusion-or-reality/
https://github.com/darwinsys/Trading_Strategies/blob/master/ML/Features.py
'''
length = kwargs['length']
# just some number (6.0 is useful)
sigma = kwargs['sigma']
# sensisitivity (close to 1) or smoothness (close to 0)
offset = kwargs['offset']
asize = length - 1
m = offset * asize
s = length / sigma
dss = 2 * s * s
alma = np.zeros(pnp_array.shape)
wtd_sum = np.zeros(pnp_array.shape)
for l in range(len(pnp_array)):
if l >= asize:
for i in range(length):
im = i - m
wtd = np.exp( -(im * im) / dss)
alma[l] += pnp_array[l - length + i] * wtd
wtd_sum[l] += wtd
alma[l] = alma[l] / wtd_sum[l]
return alma
开始进近
我们可以沿着第一个轴创建滑动窗口,然后使用范围为
wtd
的张量积进行和约化。在实现应该是这样的-
获取滑动窗口的函数:} 。在
strided_axis0
来自^{使用
1D
卷积增强那些有} 。考虑到内存效率,这会快得多,因为我们不会创建巨大的滑动窗口。在
wtds
值的乘法和它们的和约化基本上是沿着第一轴卷积的。因此,我们可以沿着axis=0
使用^{实施将是-
^{pr2}$因此,
out[length-1:]
,即非零行将与avgs[:-length+1]
相同。在如果我们使用的是来自
wtds
的非常小的内核数,那么精度可能会有所不同。所以,如果使用这个convolution
方法,请记住这一点。在运行时测试
方法-
时间安排-
相关问题 更多 >
编程相关推荐