Skip to content

Numpy Rolling - Calculando la media móvil en Python

Updated on

En el ámbito del análisis de datos, especialmente cuando se trata de datos de series temporales, la capacidad de calcular estadísticas móviles es una habilidad crucial. La principal herramienta para esto en Python es la biblioteca numpy, y más específicamente, la función numpy rolling. Esta función nos permite calcular diversas estadísticas móviles, como la media móvil, en nuestros datos. Pero, ¿cómo funciona y cómo podemos usarla de manera efectiva?

Numpy rolling es una función que nos permite aplicar una función sobre una ventana móvil de un tamaño especificado en nuestros datos. Esto es particularmente útil en el análisis de series temporales, donde a menudo queremos suavizar las fluctuaciones a corto plazo para ver mejor las tendencias a largo plazo. En este artículo, profundizaremos en los detalles de numpy rolling, cubriendo su sintaxis, cómo usarlo con diferentes tamaños de ventana, cómo aplicarlo a matrices 2D y cómo usar filtros con él.

¿Quieres crear rápidamente visualizaciones de datos a partir de un DataFrame de Pandas en Python sin código?

PyGWalker es una biblioteca de Python para el análisis exploratorio de datos con visualización. PyGWalker (opens in a new tab) puede simplificar tu flujo de trabajo de análisis y visualización de datos en Jupyter Notebook, convirtiendo tu DataFrame de pandas (y DataFrame de polars) en una interfaz de usuario estilo Tableau para la exploración visual.

PyGWalker para visualización de datos (opens in a new tab)

Entendiendo Numpy Rolling

Numpy rolling es una función que aplica una ventana móvil a una matriz y realiza una función en los datos de esa ventana. La ventana se desplaza a lo largo de la matriz y la función se aplica a la nueva ventana en cada paso. El tamaño de la ventana es especificado por el usuario y puede ser cualquier número entero menor o igual al tamaño de la matriz.

La sintaxis de la función rolling de numpy es la siguiente:

numpy.rolling(ventana)

Aquí, ventana es el tamaño de la ventana móvil. Es un número entero que especifica el número de elementos consecutivos de la matriz que se incluirán en la ventana.

Por ejemplo, si tenemos una matriz 1D de valores y queremos calcular la media móvil con un tamaño de ventana de 3, usaríamos el siguiente código:

import numpy as np
 
# Crear una matriz 1D
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
 
# Calcular la media móvil con un tamaño de ventana de 3
media_movil = np.rolling(3).mean(data)
 
print(media_movil)

Esto imprimirá la siguiente matriz:

array([nan, nan, 2., 3., 4., 5., 6., 7., 8.])

Los primeros dos valores son nan porque no hay suficientes valores anteriores para llenar una ventana de tamaño 3. El tercer valor es 2 porque la media de los primeros tres valores (1, 2, 3) es 2, y así sucesivamente.

Comparando Numpy Rolling y Numpy Roll

Aunque numpy rolling y numpy roll pueden sonar similares, tienen propósitos diferentes. Numpy roll es una función que desplaza los elementos de una matriz a lo largo de un eje especificado, envolviendo los elementos alrededor del otro lado de la matriz. Por otro lado, numpy rolling aplica una ventana móvil a una matriz y realiza una función en los datos de esa ventana.

Por ejemplo, si tenemos la siguiente matriz 1D:

import numpy as np
 
# Crear una matriz 1D
data = np.array([1, 2, 3, 4, 5])
 
# Usar numpy roll para desplazar los elementos 2 lugares hacia la derecha
datos_desplazados = np.roll
 
(data, 2)
 
print(datos_desplazados)

Esto imprimirá la siguiente matriz:

array([4, 5, 1, 2, 3])

Como puedes ver, los elementos se han desplazado dos lugares hacia la derecha, y los elementos que fueron empujados fuera del final se envuelven al principio de la matriz.

Aplicando Numpy Rolling a Matrices 2D

Numpy rolling también se puede aplicar a matrices 2D. En este caso, la ventana móvil se aplica a cada fila o columna de la matriz (dependiendo del eje especificado) y la función se aplica a los datos de la ventana.

Por ejemplo, si tenemos una matriz 2D de valores y queremos calcular la media móvil con un tamaño de ventana de 3 a lo largo de las filas, usaríamos el siguiente código:

import numpy as np
 
# Crear una matriz 2D
data = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]])
 
# Calcular la media móvil con un tamaño de ventana de 3 a lo largo de las filas
media_movil = np.rolling(3, axis=1).mean(data)
 
print(media_movil)

Esto imprimirá la siguiente matriz 2D:

array([[nan, nan,  2.,  3.,  4.],
       [nan, nan,  7.,  8.,  9.],
       [nan, nan, 12., 13., 14.]])

Los primeros dos valores en cada fila son nan porque no hay suficientes valores anteriores en la fila para llenar una ventana de tamaño 3. El tercer valor en la primera fila es 2 porque la media de los primeros tres valores en la fila (1, 2, 3) es 2, y así sucesivamente.

Usando Filtros con Numpy Rolling

Numpy rolling también nos permite aplicar filtros a los datos en la ventana móvil. Esto puede ser útil para suavizar los datos o eliminar valores atípicos.

Por ejemplo, si queremos calcular la mediana móvil (que es menos sensible a los valores atípicos que la media) con un tamaño de ventana de 3, usaríamos el siguiente código:

import numpy as np
 
# Crear una matriz 1D
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
 
# Calcular la mediana móvil con un tamaño de ventana de 3
mediana_movil = np.rolling(3).median(data)
 
print(mediana_movil)

Esto imprimirá la siguiente matriz:

array([nan, nan, 2., 3., 4., 5., 6., 7., 8.])

Los primeros dos valores son nan porque no hay suficientes valores previos para llenar una ventana de tamaño 3. El tercer valor es 2 porque la mediana de los primeros tres valores (1, 2, 3) es 2, y así sucesivamente.

Aplicar Numpy Rolling a Datos de Series de Tiempo

Uno de los casos de uso más comunes para numpy rolling es analizar datos de series de tiempo. Los datos de series de tiempo son una secuencia de puntos de datos recopilados a lo largo del tiempo, generalmente en intervalos regulares. Numpy rolling nos permite calcular estadísticas rodantes en datos de series de tiempo, proporcionando información sobre tendencias y patrones.

Para aplicar numpy rolling a datos de series de tiempo, primero debemos asegurarnos de que nuestros datos estén debidamente formateados. Normalmente, los datos de series de tiempo se representan como un array unidimensional o una columna en un array bidimensional, donde cada elemento representa un punto de datos en un tiempo específico. Una vez que tenemos nuestros datos de series de tiempo en el formato deseado, podemos usar numpy rolling para calcular estadísticas rodantes.

Por ejemplo, supongamos que tenemos un conjunto de datos de series de tiempo que registra la temperatura diaria en una ciudad durante el último año. Queremos calcular el promedio móvil de 7 días de temperatura para suavizar las fluctuaciones diarias e identificar las tendencias de temperatura a largo plazo. Así es como podemos hacerlo:

import numpy as np
 
# Supongamos que tenemos un array unidimensional 'temperature' con valores de temperatura diarios
# Calculamos el promedio móvil de 7 días de temperatura
rolling_avg = np.rolling(7).mean(temperature)
 
print(rolling_avg)

El array rolling_avg contendrá los valores del promedio móvil de 7 días de temperatura. Cada valor representa la temperatura promedio en una ventana de 7 días, lo que nos permite observar la tendencia general de temperatura a lo largo del tiempo.

Al aplicar numpy rolling a datos de series de tiempo, podemos descubrir información valiosa, como identificar la estacionalidad, detectar anomalías o predecir tendencias futuras. Esto proporciona una herramienta poderosa para analizar y comprender patrones dependientes del tiempo en diversos ámbitos, como finanzas, clima, análisis del mercado de valores y más.

Manipulación de Ejes con Numpy Rolling

Numpy rolling no solo nos permite aplicar una ventana móvil a lo largo de las filas o columnas de un array bidimensional, sino que también proporciona flexibilidad para manipular los ejes. Esta característica es particularmente útil cuando se trabaja con arrays multidimensionales y se realizan cálculos en dimensiones específicas.

Por ejemplo, supongamos que tenemos un array tridimensional que representa las mediciones de temperatura mensuales en diferentes ubicaciones y períodos de tiempo. Queremos calcular el promedio móvil de temperatura para cada ubicación a lo largo del eje de tiempo. Así es como podemos lograrlo usando numpy rolling:

import numpy as np
 
# Supongamos que tenemos un array tridimensional 'temperature' con forma (num_ubicaciones, num_periodos_tiempo, num_meses)
# Calculamos el promedio móvil de temperatura a lo largo del eje de tiempo
rolling_avg = np.rolling(3, axis=1).mean(temperature)
 
print(rolling_avg)

En este ejemplo, especificamos axis=1 para indicar que queremos aplicar la ventana móvil a lo largo del eje de tiempo. El array resultante rolling_avg contendrá los valores del promedio móvil de temperatura para cada ubicación, preservando la forma original del array.

Al manipular los ejes con numpy rolling, podemos realizar cálculos rodantes en dimensiones específicas, lo que nos permite analizar y extraer información significativa de datos multidimensionales.

Optimización de Numpy Rolling para el Análisis de Datos

Cuando se trabaja con conjuntos de datos grandes o se realizan cálculos complejos utilizando numpy rolling, la optimización se vuelve crucial para garantizar una computación eficiente y reducir el tiempo de procesamiento. Aquí hay algunos consejos para optimizar numpy rolling para el análisis de datos:

  1. Especifica el dtype: Al crear arrays o cargar datos en numpy, especifica el tipo de datos adecuado (dtype). El uso del tipo de datos correcto no solo ahorra memoria, sino que también mejora la velocidad de cálculo.

  2. Usa el tamaño de ventana sabiamente: Ajusta el tamaño de la ventana según tus datos y requisitos de análisis. Un tamaño de ventana más pequeño proporciona información más detallada pero puede ser sensible al ruido, mientras que un tamaño de ventana más grande suaviza las fluctuaciones pero puede pasar por alto patrones a corto plazo.

  3. Aprovecha las operaciones vectorizadas: Numpy está diseñado para operaciones vectorizadas, que pueden mejorar significativamente el rendimiento. En lugar de utilizar bucles o cálculos iterativos, trata de formular tus cálculos utilizando las funciones y operaciones incorporadas de numpy.

  4. Considera la paralelización: Si tu sistema admite cómputo paralelo, explora opciones para paralelizar tus cálculos de numpy rolling. La paralelización puede distribuir la computación en múltiples núcleos o procesadores, reduciendo el tiempo de procesamiento para conjuntos de datos grandes.

Siguiendo estas técnicas de optimización, puedes mejorar el rendimiento de tus cálculos de numpy rolling y desbloquear todo el potencial del análisis de datos.


Preguntas frecuentes

Aquí tienes algunas preguntas frecuentes sobre numpy rolling:

  1. ¿Qué es numpy rolling? Numpy rolling es una función en la biblioteca numpy que nos permite calcular estadísticas rodantes en arrays. Aplica una ventana móvil a los datos y realiza una función especificada en los datos de la ventana. Esto es particularmente útil para el análisis de series de tiempo y suavizar las fluctuaciones en los datos.

  2. ¿Cómo calcular estadísticas rodantes usando numpy? Para calcular estadísticas rodantes utilizando numpy, puedes usar la función numpy.rolling() y especificar el tamaño de ventana y la función deseada (por ejemplo, media, mediana) que se aplicará a los datos de la ventana. La función itera sobre el array, aplicando la función especificada a cada ventana de datos.

  3. ¿Cuál es la sintaxis de la función rolling de numpy? La sintaxis de la función rolling de numpy es numpy.rolling(ventana, axis=0), donde ventana es el tamaño de la ventana móvil y axis (opcional) especifica el eje a lo largo del cual se debe realizar la operación de rolling. La función devuelve un objeto de ventana móvil que se puede utilizar para aplicar varias funciones como media, mediana, etc.