Media mobile per NumPy Array in Python
-
Usa il metodo
numpy.convolve
per calcolare la media mobile per gli array NumPy -
Usa il metodo
scipy.convolve
per calcolare la media mobile per gli array NumPy -
Usa il modulo
bottleneck
per calcolare la media mobile -
Usa il modulo
pandas
per calcolare la media mobile
La media mobile viene spesso utilizzata nello studio dei dati delle serie temporali calcolando la media dei dati a intervalli specifici. Viene utilizzato per appianare alcune fluttuazioni a breve termine e studiare le tendenze nei dati. Le medie mobili semplici sono molto utilizzate durante lo studio delle tendenze dei prezzi delle azioni.
La media mobile ponderata pone maggiormente l’accento sui dati recenti rispetto ai dati più vecchi.
Il grafico sottostante fornirà una migliore comprensione delle medie mobili.
In questo tutorial, discuteremo come implementare la media mobile per array numpy in Python.
Usa il metodo numpy.convolve
per calcolare la media mobile per gli array NumPy
La funzione convolve()
viene utilizzata nell’elaborazione del segnale e può restituire la convoluzione lineare di due array. Ciò che viene fatto in ogni fase è prendere il prodotto interno tra la serie di quelli e la finestra corrente e prendere la loro somma.
Il codice seguente lo implementa in una funzione definita dall’utente.
import numpy as np
def moving_average(x, w):
return np.convolve(x, np.ones(w), "valid") / w
data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])
print(moving_average(data, 4))
Produzione:
[ 8. 9.25 13.5 18. 18.5 18.5 17. 15. 14. ]
Usa il metodo scipy.convolve
per calcolare la media mobile per gli array NumPy
Possiamo anche usare la funzione scipy.convolve()
allo stesso modo. Si presume che sia un po’ più veloce. Un altro modo per calcolare la media mobile usando il modulo numpy è con la funzione cumsum()
. Calcola la somma cumulativa dell’array. Questo è un metodo molto semplice e non ponderato per calcolare la media mobile.
Il codice seguente restituisce la media mobile utilizzando questa funzione.
def moving_average(a, n):
ret = np.cumsum(a, dtype=float)
ret[n:] = ret[n:] - ret[:-n]
return ret[n - 1 :] / n
data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])
print(moving_average(data, 4))
Produzione:
[ 8. 9.25 13.5 18. 18.5 18.5 17. 15. 14. ]
Usa il modulo bottleneck
per calcolare la media mobile
Il modulo bottleneck
è una raccolta di metodi rapidi di numpy. Questo modulo ha la funzione move_mean()
, che può restituire la media mobile di alcuni dati.
Per esempio,
import bottleneck as bn
import numpy as np
def rollavg_bottlneck(a, n):
return bn.move_mean(a, window=n, min_count=None)
data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])
print(rollavg_bottlneck(data, 4))
Produzione:
[ nan nan nan 8. 9.25 13.5 18. 18.5 18.5 17. 15. 14. ]
Poiché l’intervallo della finestra temporale è 4, all’inizio sono presenti tre valori nan perché non è stato possibile calcolare la media mobile.
Usa il modulo pandas
per calcolare la media mobile
I dati delle serie temporali sono per lo più associati a un DataFrame pandas
. Pertanto la libreria è ben attrezzata per eseguire diversi calcoli su tali dati.
Possiamo calcolare la media mobile dei dati di una serie temporale utilizzando le funzioni rolling()
e mean()
come mostrato di seguito.
import pandas as pd
import numpy as np
data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])
d = pd.Series(data)
print(d.rolling(4).mean())
Produzione:
0 NaN
1 NaN
2 NaN
3 8.00
4 9.25
5 13.50
6 18.00
7 18.50
8 18.50
9 17.00
10 15.00
11 14.00
dtype: float64
Per prima cosa convertiamo l’array numpy in un oggetto della serie temporale e poi usiamo la funzione rolling()
per eseguire il calcolo sulla finestra mobile e calcoliamo la media mobile usando la funzione mean()
.
Anche qui, poiché l’intervallo della finestra temporale è 4, ci sono tre valori nan all’inizio perché non è stato possibile calcolare la media mobile per loro.
Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.
LinkedIn