• analiticas
  • Posts
  • Parametri avanzati per la media mobile

Parametri avanzati per la media mobile

Padroneggia la funzione rolling() per calcolare la media mobile con Python e pandas.

In una micro-lezione precedente avevamo già visto come calcolare la media mobile con Python e pandas.

In questa micro-lezione esploreremo due parametri avanzati della funzione rolling().

Le librerie e il dataframe

Importiamo le librerie necessarie:

import pandas as pd
import numpy as np

Adesso creiamo un dataframe (puoi omettere questo passaggio se hai già un set di dati su cui stai lavorando):

date = pd.date_range(start='2023-01-01', end='2023-01-10')
vendite = [100, 120, 80, 110, 90, 95, 130, 115, 105, 125]

df = pd.DataFrame({'Data': date, 'Vendite': vendite})

Il nostro dataframe iniziale apparirà così:

Data

Vendite

2023-01-01

100

2023-01-02

120

2023-01-03

80

2023-01-04

110

2023-01-05

90

2023-01-06

95

2023-01-07

130

2023-01-08

115

2023-01-09

105

2023-01-10

125

Come visto in nella micro-lezione precedente, possiamo inserire facilmente una nuova colonna contenente la media mobile.

Ecco qui un esempio con la media mobile su 3 giorni:

df['Media_Mobile_3g'] = df['Vendite'].rolling(window=3).mean()

Ed ecco qui il nostro dataframe:

Data

Vendite

Media_Mobile_3g

2023-01-01

100

NaN

2023-01-02

120

NaN

2023-01-03

80

100.000000

2023-01-04

110

103.333333

2023-01-05

90

93.333333

2023-01-06

95

98.333333

2023-01-07

130

105.000000

2023-01-08

115

113.333333

2023-01-09

105

116.666667

2023-01-10

125

115.000000

Il parametro center

Normalmente la funzione rolling() calcola la media mobile alla fine del periodo specificato dal parametro window.

Quindi se scegliamo un periodo di 3 giorni, la media mobile sarà calcolata il terzo giorno.

Possiamo cambiare questo comportamento utilizzando il parametro center. Questo ci permette posizionare il calcolo della media mobile al centro del periodo selezionato.

Possiamo farlo così:

df['Media_Mobile_3g'] = df['Vendite'].rolling(window=3, center=True).mean()

Visivamente, questa è la differenza tra media mobile “non centrata” e “centrata”:

Media mobile non centrata

Media mobile centrata

Ma che impatto ha centrare la media mobile?

I trend restano i medesimi (dato che i valori della media mobile non cambiano). Tuttavia la posizione dei valori risulterà “spostata”.

Ecco qui un grafico realizzato con Plotly Express su un dataframe un po’ più grande che ci permette di vedere la differenza tra la media mobile “centrata” e “non centrata”.

rolling() paragone parametro center

Più il periodo specificato dal parametro window è grande, più sarà visibile la differenza tra i due tipi di media mobile.

Il parametro win_type

Un altro parametro avanzato e molto interessante di rolling() è win_type.

Questo ci permette di scegliere il “peso” da assegnare ai valori all’interno della finestra mobile, invece di considerarli tutti uguali.

Normalmente, la media mobile classica (senza specificare win_type) assegna ad ogni valore della finestra lo stesso peso.

Ma in alcuni casi può essere utile dare più importanza ai valori più vicini al centro della finestra.

Con win_type puoi scegliere tra diversi tipi di finestre. Ecco qui alcuni esempi:

  • boxcar: la classica media mobile, tutti i valori hanno lo stesso peso. È il valore di default.

  • triang: finestra “triangolare” in cui i valori centrali pesano di più.

  • hamming, hann, blackman, bartlett, panzen, ecc.: finestre che smussano i dati in modo diverso.

Per specificare il parametro win_type possiamo fare così:

df['Triang'] = df['Vendite'].rolling(window=3, win_type='triang').mean()

Quando usarlo?

  • Se vuoi una media mobile semplice, non serve specificarlo.

  • Se vuoi smussare ancora di più i dati o ridurre il rumore, prova una finestra come “hamming” o “hann”.

  • Se vuoi dare più peso ai valori centrali di ogni finestra (per esempio per ridurre l’impatto di picchi improvvisi), usa “triang”.

Attenzione!

Per usare win_type occorre il pacchetto scipy.

Se non ce l’hai, puoi installarlo con pip install scipy o direttamente dall’interfaccia di Anaconda o Miniconda.

Ecco qui una rappresentazione grafica delle differenza tra i vari tipi di win_type:

tipi di win_type, grafico

Rispetto alla media mobile classica (boxcar), gli altri tipi di finestra danno un peso maggiore ai valori centrali e meno ai valori situati in prossimità degli estremi della finestra, in maniera diversa tra loro.

Questo può aiutare a ridurre l’effetto di “scalino” che a volte si vede nei dati smussati.

Conclusione

Calcolare la media mobile con rolling() ci permette di sperimentare con i parametri avanzati di questa funzione.

Ai fini di capire meglio l’effetto di questi parametri sui tuoi dati, ti consiglio di visualizzarli di volta in volta, come abbiamo fatto in questa micro-lezione.

Se vuoi imparare la data analysis con micro-lezioni che vanno dritto al sodo, iscriviti alla newsletter:

Alla prossima micro-lezione 👋