pd.rolling_mean está en desuso – alternativas para ndarrays

Parece que pd.rolling_mean está en desuso para ndarrays ,

  pd.rolling_mean(x, window=2, center=False) 

FutureWarning: pd.rolling_mean está en desuso para ndarrays y se eliminará en una versión futura

pero parece ser la forma más rápida de hacer esto, de acuerdo con esta respuesta de SO .

¿Hay nuevas formas de hacerlo directamente con SciPy o NumPy que sean tan rápidas como pd.rolling_mean ?

EDITAR – Desafortunadamente, parece que la nueva forma no es tan rápida:

Nueva versión de Pandas:

 In [1]: x = np.random.uniform(size=100) In [2]: %timeit pd.rolling_mean(x, window=2) 1000 loops, best of 3: 240 µs per loop In [3]: %timeit pd.Series(x).rolling(window=2).mean() 1000 loops, best of 3: 226 µs per loop In [4]: pd.__version__ Out[4]: '0.18.0' 

Versión antigua:

 In [1]: x = np.random.uniform(size=100) In [2]: %timeit pd.rolling_mean(x,window=2) 100000 loops, best of 3: 12.4 µs per loop In [3]: pd.__version__ Out[3]: u'0.17.1' 

Parece que la nueva forma es a través de métodos en la clase DataFrame.rolling (supongo que se supone que debes pensarlo como un groupby ): http://pandas.pydata.org/pandas-docs/version/0.18. 0 / whatsnew.html

p.ej

 x.rolling(window=2).mean() 

prueba esto

 x.rolling(window=2, center=False).mean() 

Sugiero scipy.ndimage.filters.uniform_filter1d como en mi respuesta a la pregunta vinculada. También es mucho más rápido para matrices grandes:

 import numpy as np from scipy.ndimage.filters import uniform_filter1d N = 1000 x = np.random.random(100000) %timeit pd.rolling_mean(x, window=N) __main__:257: FutureWarning: pd.rolling_mean is deprecated for ndarrays and will be removed in a future version The slowest run took 84.55 times longer than the fastest. This could mean that an intermediate result is being cached. 1 loop, best of 3: 7.37 ms per loop %timeit uniform_filter1d(x, size=N) 10000 loops, best of 3: 190 µs per loop 

Si sus dimensiones son homogéneas, podría intentar implementar una forma n-dimensional de la Tabla de área sumda utilizada para las imágenes bidimensionales:

Una tabla de área sumda es una estructura de datos y un algoritmo para generar de manera rápida y eficiente la sum de valores en un subconjunto rectangular de una cuadrícula.

Entonces, en este orden, podrías:

  1. Cree la tabla de área sumda (“integral”) de su matriz;
  2. Iterar para obtener la sum (bastante barata) de un núcleo n-dimensional en una posición dada;
  3. Dividir por el tamaño del volumen n-dimensional del núcleo.

Desafortunadamente, no puedo saber si esto es eficiente o no, pero por la premisa dada, debería serlo.