- 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()
.
Il programma della micro-lezione
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”.

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
:

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 👋