Corso
Una serie temporale è un insieme di osservazioni di dati indicizzate nel tempo in ordine cronologico. Queste osservazioni sono spesso (ma non necessariamente) registrate a intervalli di tempo regolari. Le serie temporali sono usate di frequente in banking, trading, marketing, scienza e in altri settori. La rappresentazione visiva più tipica dei dati di una serie temporale è un grafico a linee in cui il tempo è riportato sull’asse x e il valore misurato – sull’asse y.
In questo tutorial, esploreremo come creare e personalizzare grafici a linee per serie temporali in matplotlib, una delle principali librerie Python per la creazione di grafici.
Primi passi con i grafici di serie temporali in matplotlib
Importare le librerie e caricare i dati
Per prima cosa, importeremo le librerie Python necessarie e caricheremo i dati – un dataset di Kaggle Daily Exchange Rates per Euro 1999-2023. Eseguiremo anche una pulizia di base dei dati:
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
from datetime import datetime
df = pd.read_csv('euro-daily-hist_1999_2022.csv')
df = df.iloc[:, [0, 4, 28, -2]]
df.columns = ['Date', 'CAD', 'NZD', 'USD']
for col in ['CAD', 'NZD', 'USD']:
df = df[df[col] != '-']
df[col] = pd.to_numeric(df[col])
df = df[df['Date'] >= '2022-12-01'].reset_index(drop=True)
print(df.head(3))
print(f'\nThe date range: {df.Date.min()}/{ df.Date.max()}')
Output:
Date CAD NZD USD
0 2023-01-27 1.4479 1.6759 1.0865
1 2023-01-26 1.4568 1.6799 1.0895
2 2023-01-25 1.4544 1.6792 1.0878
The date range: 2022-12-01/2023-01-27
Convertire stringhe di data/ora in oggetti datetime
Per lavorare in modo efficiente con le serie temporali, dobbiamo convertire le stringhe di data o ora in oggetti datetime usando la funzione pandas.to_datetime:
df['Date'] = pd.to_datetime(df['Date'])
print(df['Date'].dtypes)
Output:
datetime64[ns]
Se ti serve un ripasso su come lavorare con le serie temporali in Python, potrebbe esserti utile il corso Manipulating Time Series Data in Python.
Impostare una colonna datetime come indice del dataframe
Ora impostiamo la colonna Date come indice del dataframe usando il metodo set_index:
df = df.set_index('Date')
print(df.head(3))
Output:
CAD NZD USD
Date
2023-01-27 1.4479 1.6759 1.0865
2023-01-26 1.4568 1.6799 1.0895
2023-01-25 1.4544 1.6792 1.0878
Creare un grafico a linee di base per serie temporali in matplotlib
Per creare un semplice grafico a linee per serie temporali, usiamo il metodo standard matplotlib.pyplot.plot(x, y):
plt.plot(df.index, df['CAD'])
Output:

Creare un grafico a linee multiplo per serie temporali in matplotlib
Per creare un grafico a linee multiplo per serie temporali, eseguiamo semplicemente il metodo matplotlib.pyplot.plot(x, y) il numero di volte necessario:
plt.plot(df.index, df['CAD'])
plt.plot(df.index, df['NZD'])
plt.plot(df.index, df['USD'])

Usare il ciclo for ottimizza il codice sopra:
for col in ['CAD', 'NZD', 'USD']:
plt.plot(df.index, df[col])
Output:

Personalizzare i grafici di serie temporali in matplotlib
Per rendere il nostro grafico a linee per serie temporali più leggibile ed efficace, dobbiamo personalizzarlo. Possiamo applicare alcune regolazioni comuni di matplotlib, come personalizzare la dimensione della figura, aggiungere e personalizzare un titolo e le etichette degli assi, modificare le proprietà della linea, aggiungere e personalizzare i marker, ecc. Altre regolazioni sono specifiche dei grafici per serie temporali, come personalizzare i tick dell’asse del tempo e le loro etichette o evidenziare determinati periodi.
Personalizzare figura e assi
Usando i metodi standard di matplotlib, possiamo personalizzare la figura e gli assi di un grafico a linee per serie temporali in molti modi, come descritto nei commenti del codice qui sotto:
# Adjusting the figure size
fig = plt.subplots(figsize=(16, 5))
# Creating a plot
plt.plot(df.index, df['CAD'])
# Adding a plot title and customizing its font size
plt.title('EUR-CAD rate', fontsize=20)
# Adding axis labels and customizing their font size
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
# Rotaing axis ticks and customizing their font size
plt.xticks(rotation=30, fontsize=15)
# Changing the plot resolution - zooming in the period from 15.12.2022 till 15.01.2023
plt.xlim(pd.Timestamp('2022-12-15'), pd.Timestamp('2023-01-15'))
Output:

Personalizzare le proprietà della linea
Come per i grafici a linee comuni, è possibile cambiare le proprietà della linea in un grafico di serie temporali, come colore, stile o spessore:
plt.plot(df.index, df['CAD'], color='green', linestyle='dashed', linewidth=3)
Output:

Aggiungere e personalizzare i marker
Come in qualsiasi grafico a linee, possiamo inserire marker su un grafico di serie temporali e personalizzarne simbolo, colore, colore del bordo e dimensione:
plt.plot(df.index, df['CAD'], marker='o', markerfacecolor='yellow', markeredgecolor='red', markersize=8)

Personalizzare i tick dell’asse temporale
Creiamo innanzitutto un grafico di base per serie temporali in matplotlib con qualche personalizzazione essenziale:
fig = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
Output:

Vediamo che per impostazione predefinita matplotlib mostra alcuni tick casuali, insieme alle loro etichette. Tuttavia, potremmo voler controllare quali tick vengono visualizzati sull’asse del tempo. In questo caso, dobbiamo fornire un elenco delle date (o ore) necessarie come stringhe o timestamp pandas al metodo matplotlib.pyplot.xticks:
fig = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
# Defining and displaying time axis ticks
ticks = ['2022-12-05', '2023-01-02', '2023-01-20']
plt.xticks(ticks)
Output:

Sopra, matplotlib ha mostrato i tick selezionati e li ha etichettati automaticamente.
Se vogliamo visualizzare tutti i tick, dobbiamo fornire un elenco degli indici della serie temporale al metodo matplotlib.pyplot.xticks:
fig = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
# Defining and displaying all time axis ticks
ticks = list(df.index)
plt.xticks(ticks, rotation=45)
Output:

Personalizzare le etichette dei tick dell’asse temporale
Le etichette dei tick dell’asse temporale nel grafico sopra possono risultare eccessive. Potremmo volerle formattare per renderle più leggibili. A questo scopo, possiamo usare la classe matplotlib.dates.DateFormatter passando una stringa di formato strftime che rifletta come vorremmo visualizzare le date/ore. Poi, forniamo questo formatter al metodo matplotlib.axis.XAxis.set_major_formatter:
fig, ax = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
ticks = list(df.index)
plt.xticks(ticks, rotation=45)
# Formatting time axis tick labels
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%b %d'))
Output:

Questa pagina della documentazione fornisce un elenco completo di tutti i possibili codici di formato strftime.
Evidenziare determinati periodi
A volte, potremmo voler ombreggiare determinati periodi su un grafico a linee per serie temporali. A questo scopo, possiamo usare il metodo matplotlib.pyplot.axvspan. Accetta due argomenti obbligatori: i punti di inizio e fine del periodo di interesse in formato datetime. Il metodo può anche accettare alcuni parametri opzionali per personalizzare l’aspetto dell’area evidenziata, come colore, colore del bordo, trasparenza, spessore della linea o pattern di riempimento.
Applichiamo questa tecnica al grafico della sezione precedente:
fig, ax = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
ticks = list(df.index)
plt.xticks(ticks, rotation=45)
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%b %d'))
# Highlighting the time period from 15.12.2022 to 1.01.2023 and customizing the shaded area
plt.axvspan(datetime(2022, 12, 15), datetime(2023, 1, 1), facecolor='yellow', alpha=0.5, hatch='/', edgecolor='red', linewidth=5)
Output:

Salvare un grafico a linee per serie temporali di matplotlib su file
Possiamo scegliere di salvare un grafico a linee per serie temporali in un file immagine invece di limitarci a visualizzarlo. Per farlo, usiamo il metodo matplotlib.pyplot.savefig passando il nome del file. Per esempio, torniamo al nostro primo grafico di base:
plt.plot(df.index, df['CAD'])
# Saving the resulting plot to a file
plt.savefig('time series line plot.png')

Sopra, abbiamo salvato il grafico in un file chiamato time series line plot.png, posizionato nella stessa cartella del nostro programma corrente.
Conclusione
In sintesi, in questo tutorial abbiamo visto come creare e personalizzare grafici a linee per serie temporali in matplotlib, utilizzando sia metodi comuni di matplotlib sia approcci più avanzati, specifici delle visualizzazioni di serie temporali.
Dopo aver imparato queste tecniche fondamentali, potresti voler approfondire il lavoro con i dati di serie temporali e la loro visualizzazione in Python. In tal caso, esplora le seguenti risorse complete, per principianti e end-to-end:

