Serie temporal: procesamiento y visualización de datos

La serie temporal es una secuencia de observaciones indexadas en intervalos de tiempo equi-espaciados. Por tanto, el orden y la continuidad deben mantenerse en cualquier serie de tiempo.

El conjunto de datos que usaremos es una serie de tiempo multivariable con datos por hora de aproximadamente un año para la calidad del aire en una ciudad italiana significativamente contaminada. El conjunto de datos se puede descargar desde el enlace que se proporciona a continuación:https://archive.ics.uci.edu/ml/datasets/air+quality.

Es necesario asegurarse de que:

  • La serie de tiempo está igualmente espaciada, y

  • No hay valores redundantes o lagunas en él.

En caso de que la serie de tiempo no sea continua, podemos aumentarla o disminuirla.

Mostrando df.head ()

En [122]:

import pandas

En [123]:

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

En [124]:

len(df)

Fuera [124]:

9471

En [125]:

df.head()

Fuera [125]:

Para preprocesar la serie de tiempo, nos aseguramos de que no haya valores NaN (NULL) en el conjunto de datos; si los hay, podemos reemplazarlos con 0 o con valores promedio o anteriores o posteriores. Reemplazar es una opción preferida sobre la eliminación para que se mantenga la continuidad de la serie de tiempo. Sin embargo, en nuestro conjunto de datos, los últimos valores parecen ser NULL y, por lo tanto, la caída no afectará la continuidad.

Eliminar NaN (no es un número)

En [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

En [127]:

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

En [128]:

df.isna().sum()

Fuera [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

Las series de tiempo generalmente se trazan como gráficos lineales contra el tiempo. Para eso, ahora combinaremos la columna de fecha y hora y la convertiremos en un objeto de fecha y hora a partir de cadenas. Esto se puede lograr utilizando la biblioteca de fecha y hora.

Conversión a objeto de fecha y hora

En [129]:

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

<class 'str'>

En [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]))

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

Veamos cómo algunas variables como la temperatura cambian con el cambio en el tiempo.

Mostrando parcelas

En [131]:

df.index = df.DateTime

En [132]:

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

Fuera [132]:

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

En [208]:

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

Fuera [208]:

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

Los diagramas de caja son otro tipo útil de gráficos que le permiten condensar mucha información sobre un conjunto de datos en un solo gráfico. Muestra la media, el cuartil del 25% y el 75% y los valores atípicos de una o varias variables. En el caso de que el número de valores atípicos sea pequeño y esté muy alejado de la media, podemos eliminar los valores atípicos estableciéndolos en un valor medio o un valor cuartil del 75%.

Mostrando diagramas de caja

En [134]:

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

Fuera [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': []
}