Media móvil para NumPy Array en Python
-
Utilice el método
numpy.convolve
para calcular la media móvil de matrices numerosas -
Utilice el método
scipy.convolve
para calcular la media móvil de matrices numerosas -
Utilice el módulo
bottleneck
para calcular la media móvil -
Utilice el módulo
pandas
para calcular la media móvil
La media móvil se utiliza con frecuencia para estudiar datos de series de tiempo calculando la media de los datos a intervalos específicos. Se utiliza para suavizar algunas fluctuaciones a corto plazo y estudiar tendencias en los datos. Las medias móviles simples se utilizan mucho al estudiar las tendencias en los precios de las acciones.
La media móvil ponderada pone más énfasis en los datos recientes que en los más antiguos.
El siguiente gráfico le dará una mejor comprensión de las medias móviles.
En este tutorial, discutiremos cómo implementar la media móvil para matrices numpy en Python.
Utilice el método numpy.convolve
para calcular la media móvil de matrices numerosas
La función convolve()
se utiliza en el procesamiento de señales y puede devolver la convolución lineal de dos arrays. Lo que se está haciendo en cada paso es tomar el producto interno entre el array de unos y la ventana actual y tomar su suma.
El siguiente código implementa esto en una función definida por el usuario.
import numpy as np
def moving_average(x, w):
return np.convolve(x, np.ones(w), "valid") / w
data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])
print(moving_average(data, 4))
Producción :
[ 8. 9.25 13.5 18. 18.5 18.5 17. 15. 14. ]
Utilice el método scipy.convolve
para calcular la media móvil de matrices numerosas
También podemos utilizar la función scipy.convolve()
de la misma forma. Se supone que es un poco más rápido. Otra forma de calcular la media móvil usando el módulo numpy es con la función cumsum()
. Calcula la suma acumulada del array. Este es un método no ponderado muy sencillo para calcular la media móvil.
El siguiente código devuelve la media móvil utilizando esta función.
def moving_average(a, n):
ret = np.cumsum(a, dtype=float)
ret[n:] = ret[n:] - ret[:-n]
return ret[n - 1 :] / n
data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])
print(moving_average(data, 4))
Producción :
[ 8. 9.25 13.5 18. 18.5 18.5 17. 15. 14. ]
Utilice el módulo bottleneck
para calcular la media móvil
El módulo bottleneck
es una compilación de métodos numpy rápidos. Este módulo tiene la función move_mean()
, que puede devolver la media móvil de algunos datos.
Por ejemplo,
import bottleneck as bn
import numpy as np
def rollavg_bottlneck(a, n):
return bn.move_mean(a, window=n, min_count=None)
data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])
print(rollavg_bottlneck(data, 4))
Producción :
[ nan nan nan 8. 9.25 13.5 18. 18.5 18.5 17. 15. 14. ]
Dado que el intervalo de la ventana de tiempo es 4, hay tres valores nan al principio porque no se pudo calcular la media móvil para ellos.
Utilice el módulo pandas
para calcular la media móvil
Los datos de series de tiempo se asocian principalmente con un DataFrame pandas
. Por lo tanto, la biblioteca está bien equipada para realizar diferentes cálculos sobre dichos datos.
Podemos calcular la media móvil de los datos de una serie de tiempo utilizando las funciones rolling()
y mean()
como se muestra a continuación.
import pandas as pd
import numpy as np
data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])
d = pd.Series(data)
print(d.rolling(4).mean())
Producción :
0 NaN
1 NaN
2 NaN
3 8.00
4 9.25
5 13.50
6 18.00
7 18.50
8 18.50
9 17.00
10 15.00
11 14.00
dtype: float64
Primero convertimos el array numérica en un objeto de serie de tiempo y luego usamos la función rolling()
para realizar el cálculo en la ventana rodante y calculamos la media móvil usando la función mean()
.
Aquí también, dado que el intervalo de la ventana de tiempo es 4, hay tres valores nan al principio porque no se pudo calcular la media móvil para ellos.
Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.
LinkedIn