Serie temporali: elaborazione e visualizzazione dei dati

Time Series è una sequenza di osservazioni indicizzate in intervalli di tempo equidistanti. Pertanto, l'ordine e la continuità dovrebbero essere mantenuti in qualsiasi serie temporale.

Il set di dati che utilizzeremo è una serie temporale multi-variata con dati orari per circa un anno, per la qualità dell'aria in una città italiana significativamente inquinata. Il set di dati può essere scaricato dal link indicato di seguito -https://archive.ics.uci.edu/ml/datasets/air+quality.

È necessario assicurarsi che:

  • La serie temporale è equidistante e

  • Non ci sono valori ridondanti o lacune in esso.

Nel caso in cui la serie temporale non sia continua, possiamo sovracampionarla o ridimensionarla.

Mostra df.head ()

In [122]:

import pandas

In [123]:

df = pandas.read_csv("AirQualityUCI.csv", sep = ";", decimal = ",")
df = df.iloc[ : , 0:14]

In [124]:

len(df)

Fuori [124]:

9471

In [125]:

df.head()

Fuori [125]:

Per la preelaborazione delle serie temporali, ci assicuriamo che non ci siano valori NaN (NULL) nel set di dati; se ci sono, possiamo sostituirli con 0 o valori medi o precedenti o successivi. La sostituzione è una scelta preferita rispetto all'eliminazione in modo da mantenere la continuità delle serie temporali. Tuttavia, nel nostro set di dati gli ultimi pochi valori sembrano essere NULL e quindi la caduta non influirà sulla continuità.

Eliminare NaN (non un numero)

In [126]:

df.isna().sum()
Out[126]:
Date             114
Time             114
CO(GT)           114
PT08.S1(CO)      114
NMHC(GT)         114
C6H6(GT)         114
PT08.S2(NMHC)    114
NOx(GT)          114
PT08.S3(NOx)     114
NO2(GT)          114
PT08.S4(NO2)     114
PT08.S5(O3)      114
T                114
RH               114
dtype: int64

In [127]:

df = df[df['Date'].notnull()]

In [128]:

df.isna().sum()

Fuori [128]:

Date             0
Time             0
CO(GT)           0
PT08.S1(CO)      0
NMHC(GT)         0
C6H6(GT)         0
PT08.S2(NMHC)    0
NOx(GT)          0
PT08.S3(NOx)     0
NO2(GT)          0
PT08.S4(NO2)     0
PT08.S5(O3)      0
T                0
RH               0
dtype: int64

Le serie storiche vengono solitamente tracciate come grafici a linee rispetto al tempo. Per questo ora combineremo la colonna data e ora e la convertiremo in un oggetto datetime da stringhe. Questa operazione può essere eseguita utilizzando la libreria datetime.

Conversione in oggetto datetime

In [129]:

df['DateTime'] = (df.Date) + ' ' + (df.Time)
print (type(df.DateTime[0]))

<class 'str'>

In [130]:

import datetime

df.DateTime = df.DateTime.apply(lambda x: datetime.datetime.strptime(x, '%d/%m/%Y %H.%M.%S'))
print (type(df.DateTime[0]))

<class 'pandas._libs.tslibs.timestamps.Timestamp'>

Vediamo come alcune variabili come la temperatura cambiano con il cambiamento nel tempo.

Mostra trame

In [131]:

df.index = df.DateTime

In [132]:

import matplotlib.pyplot as plt
plt.plot(df['T'])

Fuori [132]:

[<matplotlib.lines.Line2D at 0x1eaad67f780>]

In [208]:

plt.plot(df['C6H6(GT)'])

Fuori [208]:

[<matplotlib.lines.Line2D at 0x1eaaeedff28>]

I box plot sono un altro tipo utile di grafici che consentono di condensare molte informazioni su un set di dati in un unico grafico. Mostra la media, il 25% e il 75% del quartile e i valori anomali di una o più variabili. Nel caso in cui il numero di valori anomali sia ridotto ed è molto distante dalla media, possiamo eliminare i valori anomali impostandoli sul valore medio o sul valore del quartile del 75%.

Mostra boxplots

In [134]:

plt.boxplot(df[['T','C6H6(GT)']].values)

Fuori [134]:

{'whiskers': [<matplotlib.lines.Line2D at 0x1eaac16de80>,
   <matplotlib.lines.Line2D at 0x1eaac16d908>,
   <matplotlib.lines.Line2D at 0x1eaac177a58>,
   <matplotlib.lines.Line2D at 0x1eaac177cf8>],
   'caps': [<matplotlib.lines.Line2D at 0x1eaac16d2b0>,
   <matplotlib.lines.Line2D at 0x1eaac16d588>,
   <matplotlib.lines.Line2D at 0x1eaac1a69e8>,
   <matplotlib.lines.Line2D at 0x1eaac1a64a8>],
   'boxes': [<matplotlib.lines.Line2D at 0x1eaac16dc50>,
   <matplotlib.lines.Line2D at 0x1eaac1779b0>],
   'medians': [<matplotlib.lines.Line2D at 0x1eaac16d4a8>,
   <matplotlib.lines.Line2D at 0x1eaac1a6c50>],
   'fliers': [<matplotlib.lines.Line2D at 0x1eaac177dd8>,
   <matplotlib.lines.Line2D at 0x1eaac1a6c18>],'means': []
}