Media mobile per NumPy Array in Python

Manav Narula 30 gennaio 2023
  1. Usa il metodo numpy.convolve per calcolare la media mobile per gli array NumPy
  2. Usa il metodo scipy.convolve per calcolare la media mobile per gli array NumPy
  3. Usa il modulo bottleneck per calcolare la media mobile
  4. Usa il modulo pandas per calcolare la media mobile
Media mobile per NumPy Array in Python

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.

Media mobile semplice

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.

Autore: Manav Narula
Manav Narula avatar Manav Narula avatar

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

Articolo correlato - Python NumPy