Media móvil para NumPy Array en Python

Manav Narula 30 enero 2023
  1. Utilice el método numpy.convolve para calcular la media móvil de matrices numerosas
  2. Utilice el método scipy.convolve para calcular la media móvil de matrices numerosas
  3. Utilice el módulo bottleneck para calcular la media móvil
  4. Utilice el módulo pandas para calcular la media móvil
Media móvil para NumPy Array en Python

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.

Media móvil simple

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 Narula avatar Manav Narula avatar

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

Artículo relacionado - Python NumPy