Come calcolare le medie mobili in python


Una media mobile è una tecnica che può essere utilizzata per livellare i dati delle serie temporali per ridurre il “rumore” nei dati e identificare più facilmente modelli e tendenze.

L’idea alla base di una media mobile è quella di prendere la media di un numero di periodi precedenti per arrivare ad una “media mobile” per un dato periodo.

Questo tutorial spiega come calcolare le medie mobili in Python.

Esempio: medie mobili in Python

Supponiamo di avere la seguente tabella che mostra le vendite totali di una determinata azienda in 10 periodi:

 x = [50, 55, 36, 49, 84, 75, 101, 86, 80, 104]

Metodo 1: utilizzare la funzione cumsum().

Un modo per calcolare la media mobile è utilizzare la funzione cumsum():

 import numpy as np

#define moving average function
def moving_avg(x, n):
    cumsum = np.cumsum(np.insert(x, 0, 0)) 
    return (cumsum[n:] - cumsum[:-n]) / float(n)

#calculate moving average using previous 3 time periods
n = 3
moving_avg(x, n):

array([47, 46.67, 56.33, 69.33, 86.67, 87.33, 89, 90])

Ecco come interpretare il risultato:

  • La media mobile del terzo periodo è 47. Si calcola come la media dei primi tre periodi: (50+55+36)/3 = 47 .
  • La media mobile per il quarto periodo è 46,67. Questo viene calcolato come la media dei tre periodi precedenti: (55+36+49)/3 = 46,67 .

E così via.

Metodo 2: usa i panda.

Un altro modo per calcolare la media mobile è scrivere una funzione basata sui panda:

 import pandas as pd

#define array to use and number of previous periods to use in calculation
x = [50, 55, 36, 49, 84, 75, 101, 86, 80, 104]
n=3

#calculate moving average
pd.Series(x).rolling(window=n).mean().iloc[n-1:].values

array([47, 46.67, 56.33, 69.33, 86.67, 87.33, 89, 90])

Questo metodo produce esattamente gli stessi risultati del metodo precedente, ma tende a funzionare più velocemente su array più grandi.

Tieni presente che puoi anche specificare un numero qualsiasi di periodi precedenti da utilizzare nel calcolo della media mobile. Ad esempio, potresti preferire utilizzare n=5:

 #use 5 previous periods to calculate moving average
n=5

#calculate moving average
pd.Series(x).rolling(window=n).mean().iloc[n-1:].values

array([54.8, 59.8, 69., 79., 85.2, 89.2])

Più periodi utilizzi per calcolare la media mobile, più “smussata” sarà la linea della media mobile.

Aggiungi un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *