Saltar al contenido

¿Cómo puedo simplemente calcular la varianza rodante / en movimiento de una serie de tiempo en Python?

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")

ingrese la descripción de la imagen aquí

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)

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *