gpt4 book ai didi

performance - Numpy 版本的滚动 MAD(平均绝对偏差)

转载 作者:行者123 更新时间:2023-12-01 09:16:38 26 4
gpt4 key购买 nike

如何制作以下MAD功能的滚动版本

from numpy import mean, absolute

def mad(data, axis=None):
return mean(absolute(data - mean(data, axis)), axis)

此代码是对 this question 的回答

目前我将 numpy 转换为 pandas 然后应用此函数,然后将结果转换回 numpy
pandasDataFrame.rolling(window=90).apply(mad) 

但这在较大的数据帧上效率低下。如何在不循环的情况下为 numpy 中的相同函数获取滚动窗口并给出相同的结果?

最佳答案

这是一个矢量化的 NumPy 方法 -

# From this post : http://stackoverflow.com/a/40085052/3293881
def strided_app(a, L, S ): # Window len = L, Stride len/stepsize = S
nrows = ((a.size-L)//S)+1
n = a.strides[0]
return np.lib.stride_tricks.as_strided(a, shape=(nrows,L), strides=(S*n,n))

# From this post : http://stackoverflow.com/a/14314054/3293881 by @Jaime
def moving_average(a, n=3) :
ret = np.cumsum(a, dtype=float)
ret[n:] = ret[n:] - ret[:-n]
return ret[n - 1:] / n

def mad_numpy(a, W):
a2D = strided_app(a,W,1)
return np.absolute(a2D - moving_average(a,W)[:,None]).mean(1)

运行时测试 -
In [617]: data = np.random.randint(0,9,(10000))
...: df = pd.DataFrame(data)
...:

In [618]: pandas_out = pd.rolling_apply(df,90,mad).values.ravel()
In [619]: numpy_out = mad_numpy(data,90)

In [620]: np.allclose(pandas_out[89:], numpy_out) # Nans part clipped
Out[620]: True

In [621]: %timeit pd.rolling_apply(df,90,mad)
10 loops, best of 3: 111 ms per loop

In [622]: %timeit mad_numpy(data,90)
100 loops, best of 3: 3.4 ms per loop

In [623]: 111/3.4
Out[623]: 32.64705882352941

32x+ 通过循环 Pandas 解决方案在那里加速!

关于performance - Numpy 版本的滚动 MAD(平均绝对偏差),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42865103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com