Катящееся окно для 1D массивов в Numpy?
Есть ли способ эффективно реализовать развертку окна для 1D массивов в Numpy?
Например, у меня есть этот чистый фрагмент кода на Python для вычисления стандартных отклонений для 1D-списка, где observations
- 1D-список значений, а n
- длина окна для стандартного отклонения:
stdev = []
for i, data in enumerate(observations[n-1:]):
strip = observations[i:i+n]
mean = sum(strip) / n
stdev.append(sqrt(250*sum([(s-mean)**2 for s in strip])/(n-1)))
Есть ли способ сделать это полностью внутри Numpy, т.е. без каких-либо петель Python? Стандартное отклонение тривиально с numpy.std
, но часть прокатного окна полностью обрушивает меня.
Я нашел это сообщение в блоге относительно вращающегося окна в Numpy, но, похоже, это не для 1D массивов.
Ответы
Ответ 1
Просто используйте код блога, но примените свою функцию к результату.
то есть.
numpy.std(rolling_window(observations, n), 1)
где у вас (из блога):
def rolling_window(a, window):
shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
strides = a.strides + (a.strides[-1],)
return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
Ответ 2
def moving_avg(x,n):
mv = np.convolve(x,np.ones(n)/n,mode='valid')
return np.concatenate(([np.NaN for k in range(n-1)],mv))
Ответ 3
Только с одной строкой кода...
pd.Series(observations).rolling(n).std()