Solución:
Los pandas rolling_mean
y rolling_std
Las funciones han quedado obsoletas y se han sustituido por un marco “rodante” más general. El ejemplo de @ elyase se puede modificar para:
import pandas as pd
import numpy as np
%matplotlib inline
# some sample data
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000)).cumsum()
#plot the time series
ts.plot(style="k--")
# calculate a 60 day rolling mean and plot
ts.rolling(window=60).mean().plot(style="k")
# add the 20 day rolling standard deviation:
ts.rolling(window=20).std().plot(style="b")
los rolling
La función admite varios tipos de ventanas diferentes, como se documenta aquí. Se pueden llamar varias funciones en el rolling
objeto, incluyendo var
y otras estadísticas interesantes (skew
, kurt
, quantile
, etc.). Me he quedado con std
ya que la gráfica está en el mismo gráfico que la media, lo que tiene más sentido en términos de unidades.
Deberías echarle un vistazo a los pandas. Por ejemplo:
import pandas as pd
import numpy as np
# some sample data
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000)).cumsum()
#plot the time series
ts.plot(style="k--")
# calculate a 60 day rolling mean and plot
pd.rolling_mean(ts, 60).plot(style="k")
# add the 20 day rolling variance:
pd.rolling_std(ts, 20).plot(style="b")
A pesar de ser un hilo antiguo, agregaré otro método modificado a partir de este, que no se basa en pandas ni en bucles de Python. Esencialmente, utilizando los trucos de zancada de Numpy, primero puede crear una vista de una matriz con zancadas de modo que calcular una estadística de la función a lo largo del último eje sea equivalente a realizar la estadística de rodadura. Modifiqué el código original para que la forma de salida sea la misma que la forma de entrada al agregar el relleno al inicio del último eje.
import numpy as np
def rolling_window(a, window):
pad = np.ones(len(a.shape), dtype=np.int32)
pad[-1] = window-1
pad = list(zip(pad, np.zeros(len(a.shape), dtype=np.int32)))
a = np.pad(a, pad,mode="reflect")
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)
a = np.arange(30).reshape((5,6))
# rolling mean along last axis
np.mean(rolling_window(a, 3), axis=-1)
# rolling var along last axis
np.var(rolling_window(a, 3), axis=-1)
# rolling median along last axis
np.median(rolling_window(a, 3), axis=-1)