¿Cómo calcular las medias móviles en Python?

En este artículo vamos a ver cómo calcular la media móvil en Python. El promedio móvil se refiere a una serie de promedios de subconjuntos de tamaño fijo del conjunto total de observaciones. También se conoce como media móvil, media móvil, medios móviles o media móvil.

Considere el conjunto de n observaciones y sea k el tamaño de la ventana para determinar el promedio en cualquier momento t. Luego, la lista de promedios móviles se calcula tomando inicialmente el promedio de las primeras k observaciones presentes en la ventana actual y almacenándolo en la lista. Ahora, la ventana se expande de acuerdo con la condición del promedio móvil a determinar y nuevamente se calcula y almacena en la lista el promedio de los elementos presentes en la ventana. Este proceso continúa hasta que la ventana llega al final del conjunto. 

Por ejemplo: dada una lista de cinco enteros arr=[1, 2, 3, 7, 9] y necesitamos calcular los promedios móviles de la lista con un tamaño de ventana especificado como 3. Primero calcularemos el promedio de los primeros 3 elementos y eso se almacenará como primer promedio móvil. Luego, la ventana se desplazará una posición a la derecha y nuevamente se calculará y almacenará en la lista el promedio de los elementos presentes en la ventana. De manera similar, el proceso se repetirá hasta que la ventana alcance el último elemento de la array. A continuación se muestra la ilustración del enfoque anterior:

A continuación se muestra la implementación:

Python3

# Program to calculate moving average
arr = [1, 2, 3, 7, 9]
window_size = 3
  
i = 0
# Initialize an empty list to store moving averages
moving_averages = []
  
# Loop through the array to consider
# every window of size 3
while i < len(arr) - window_size + 1:
    
    # Store elements from i to i+window_size
    # in list to get the current window
    window = arr[i : i + window_size]
  
    # Calculate the average of current window
    window_average = round(sum(window) / window_size, 2)
      
    # Store the average of current
    # window in moving average list
    moving_averages.append(window_average)
      
    # Shift window to right by one position
    i += 1
  
print(moving_averages)

Producción:

[2.0, 4.0, 6.33]

Promedio móvil simple:

La SMA se calcula tomando la media no ponderada de k (tamaño de la ventana) observaciones en un momento que está presente en la ventana actual. Se utiliza para analizar tendencias.

Fórmulas:

SMAj = (1/k) * ∑ (i=j-1 to j+k-1)  ai

dónde,

  • SMA j = Promedio móvil simple de la j-ésima ventana
  • k = tamaño de la ventana
  • a i = i-ésimo elemento del conjunto de observaciones

Método 1: Usar Numpy

El módulo Numpy de Python proporciona una manera fácil de calcular el promedio móvil simple de la array de observaciones. Proporciona un método llamado numpy.sum() que devuelve la suma de elementos de la array dada. Se puede calcular una media móvil encontrando la suma de los elementos presentes en la ventana y dividiéndola por el tamaño de la ventana.

Python3

# Program to calculate moving average using numpy
  
import numpy as np
  
arr = [1, 2, 3, 7, 9]
window_size = 3
  
i = 0
# Initialize an empty list to store moving averages
moving_averages = []
  
# Loop through the array t o
#consider every window of size 3
while i < len(arr) - window_size + 1:
  
    # Calculate the average of current window
    window_average = round(np.sum(arr[
      i:i+window_size]) / window_size, 2)
      
    # Store the average of current
    # window in moving average list
    moving_averages.append(window_average)
      
    # Shift window to right by one position
    i += 1
  
print(moving_averages)

Producción:

[2.0, 4.0, 6.33]

Método 2: usar pandas

El módulo Pandas de Python proporciona una manera fácil de calcular el promedio móvil simple de la serie de observaciones. Proporciona un método llamado pandas.Series.rolling(window_size) que devuelve una ventana móvil del tamaño especificado. La media de la ventana se puede calcular utilizando la función pandas.Series.mean() en el objeto de la ventana obtenido anteriormente. pandas.Series.rolling(window_size) devolverá algunas series nulas ya que necesita al menos k (tamaño de la ventana) elementos para rodar. 

Python

# Python program to calculate
# simple moving averages using pandas
import pandas as pd
  
arr = [1, 2, 3, 7, 9]
window_size = 3
  
# Convert array of integers to pandas series
numbers_series = pd.Series(arr)
  
# Get the window of series
# of observations of specified window size
windows = numbers_series.rolling(window_size)
  
# Create a series of moving
# averages of each window
moving_averages = windows.mean()
  
# Convert pandas series back to list
moving_averages_list = moving_averages.tolist()
  
# Remove null entries from the list
final_list = moving_averages_list[window_size - 1:]
  
print(final_list)

Producción:

[2.0, 4.0, 6.33]

Promedio móvil acumulativo

El CMA se calcula tomando la media no ponderada de todas las observaciones hasta el momento del cálculo. Se utiliza para el análisis de series de tiempo.

Fórmulas:

CMAt = (1/kt) * ∑ (i=0 to k)  ai

dónde:

  • CMA t = Promedio móvil acumulativo en el tiempo t
  • k t = número de observaciones hasta el tiempo t
  • ai = i-ésimo elemento del conjunto de observaciones

Método 1: Usar Numpy

El módulo Numpy de Python proporciona una manera fácil de calcular el promedio móvil acumulativo de la array de observaciones. Proporciona un método llamado numpy.cumsum() que devuelve la array de la suma acumulada de elementos de la array dada. Se puede calcular un promedio móvil dividiendo la suma acumulada de elementos por el tamaño de la ventana.

Python

# Program to calculate cumulative moving average
# using numpy
  
import numpy as np
  
arr = [1, 2, 3, 7, 9]
  
i = 1
# Initialize an empty list to store cumulative moving
# averages
moving_averages = []
  
# Store cumulative sums of array in cum_sum array
cum_sum = np.cumsum(arr);
  
# Loop through the array elements
while i <= len(arr):
  
    # Calculate the cumulative average by dividing
    # cumulative sum by number of elements till 
    # that position
    window_average = round(cum_sum[i-1] / i, 2)
      
    # Store the cumulative average of
    # current window in moving average list
    moving_averages.append(window_average)
      
    # Shift window to right by one position
    i += 1
  
print(moving_averages)

Producción:

[1.0, 1.5, 2.0, 3.25, 4.4]

Método 2: usar pandas

El módulo Pandas de Python proporciona una manera fácil de calcular el promedio móvil acumulativo de la serie de observaciones. Proporciona un método llamado pandas.Series.expanding() que devuelve una ventana que abarca todas las observaciones hasta el momento t. La media de la ventana se puede calcular utilizando la función pandas.Series.mean() en el objeto de la ventana obtenido anteriormente. 

Python

# Python program to calculate
# cumulative moving averages using pandas
import pandas as pd
  
arr = [1, 2, 3, 7, 9]
window_size = 3
  
# Convert array of integers to pandas series
numbers_series = pd.Series(arr)
  
# Get the window of series of
# observations till the current time
windows = numbers_series.expanding()
  
# Create a series of moving averages of each window
moving_averages = windows.mean()
  
# Convert pandas series back to list
moving_averages_list = moving_averages.tolist()
  
print(moving_averages_list)

Producción:

[1.0, 1.5, 2.0, 3.25, 4.4]

Media Móvil Exponencial

La EMA se calcula tomando la media ponderada de las observaciones a la vez. El peso de la observación disminuye exponencialmente con el tiempo. Se utiliza para analizar cambios recientes.

Fórmulas:

EMAt =  αat + (1- α)EMAt-1

dónde:

  • EMA t = Media Móvil Exponencial en el tiempo t
  • α = grado de disminución del peso de la observación con el tiempo
  • a t = observación en el tiempo t

Python

# Program to calculate exponential
# moving average using formula
  
import numpy as np
  
arr = [1, 2, 3, 7, 9]
x=0.5  # smoothening factor
  
i = 1
# Initialize an empty list to
# store exponential moving averages
moving_averages = []
  
# Insert first exponential average in the list
moving_averages.append(arr[0])
  
# Loop through the array elements
while i < len(arr):
  
    # Calculate the exponential
    # average by using the formula
    window_average = round((x*arr[i])+
                           (1-x)*moving_averages[-1], 2)
      
    # Store the cumulative average
    # of current window in moving average list
    moving_averages.append(window_average)
      
    # Shift window to right by one position
    i += 1
  
print(moving_averages)

Producción:

[1, 1.5, 2.25, 4.62, 6.81]

Método 1: usar pandas

El módulo Pandas de Python proporciona una manera fácil de calcular el promedio móvil exponencial de la serie de observaciones. Proporciona un método llamado pandas.Series.ewm.mean() que calcula el promedio móvil exponencial de las observaciones dadas. pandas.Series.ewm() toma un parámetro llamado factor de suavizado, es decir, el grado en que el peso de la observación disminuye con el tiempo. El valor de un factor de suavizado siempre está entre 0 y 1.

Python

# Python program to
# calculate exponential moving averages
import pandas as pd
  
arr = [1, 2, 3, 7, 9]
  
# Convert array of integers to pandas series
numbers_series = pd.Series(arr)
  
# Get the moving averages of series
# of observations till the current time
moving_averages = round(numbers_series.ewm(
  alpha=0.5, adjust=False).mean(), 2)
  
# Convert pandas series back to list
moving_averages_list = moving_averages.tolist()
  
print(moving_averages_list)

Producción:

[1.0, 1.5, 2.25, 4.62, 6.81]

Aplicaciones

  1. Análisis de series temporales: se utiliza para suavizar la variación a corto plazo y resaltar las observaciones a largo plazo, como tendencias y ciclos.
  2. Análisis financiero: se utiliza en el análisis financiero de los mercados bursátiles, como el cálculo de los precios de las acciones, los rendimientos y el análisis de las tendencias del mercado.
  3. Ingeniería ambiental: se utiliza para analizar las condiciones ambientales considerando varios factores, como la concentración de contaminantes, etc.
  4. Análisis de rendimiento de la computadora: se utiliza para analizar el rendimiento de la computadora mediante el cálculo de métricas como la utilización promedio de la CPU, la longitud promedio de la cola del proceso, etc.

Publicación traducida automáticamente

Artículo escrito por saxenaanjali239 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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