Szeregi czasowe - przetwarzanie danych i wizualizacja

Szeregi czasowe to sekwencja obserwacji indeksowanych w równych odstępach czasu. W związku z tym porządek i ciągłość powinny być zachowane w każdym szeregu czasowym.

Zbiór danych, którego będziemy używać, to wielowariantowa seria czasowa zawierająca dane godzinowe z około jednego roku, dotyczące jakości powietrza w mocno zanieczyszczonym włoskim mieście. Zestaw danych można pobrać z linku podanego poniżej -https://archive.ics.uci.edu/ml/datasets/air+quality.

Konieczne jest upewnienie się, że -

  • Szeregi czasowe są równomiernie rozłożone i

  • Nie ma w nim zbędnych wartości ani luk.

W przypadku, gdy szereg czasowy nie jest ciągły, możemy próbkować go w górę lub w dół.

Wyświetlam df.head ()

W [122]:

import pandas

W [123]:

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

W [124]:

len(df)

Z [124]:

9471

W [125]:

df.head()

Na zewnątrz [125]:

W przypadku wstępnego przetwarzania szeregów czasowych upewniamy się, że w zbiorze danych nie ma wartości NaN (NULL); jeśli tak, możemy zastąpić je 0 lub średnią albo wartościami poprzedzającymi lub następnymi. Zastąpienie jest preferowanym wyborem zamiast upuszczenia, aby zachować ciągłość szeregów czasowych. Jednak w naszym zbiorze danych kilka ostatnich wartości wydaje się mieć wartość NULL i dlatego ich spadek nie wpłynie na ciągłość.

Upuszczanie NaN (Not-a-Number)

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

W [127]:

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

W [128]:

df.isna().sum()

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

Szeregi czasowe są zwykle przedstawiane jako wykresy liniowe w funkcji czasu. W tym celu połączymy teraz kolumnę daty i godziny i przekonwertujemy ją na obiekt datetime z ciągów. Można to osiągnąć za pomocą biblioteki datetime.

Konwersja do obiektu datetime

W [129]:

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

<class 'str'>

W [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'>

Zobaczmy, jak niektóre zmienne, takie jak temperatura, zmieniają się wraz ze zmianą w czasie.

Wyświetlanie działek

W [131]:

df.index = df.DateTime

W [132]:

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

Na zewnątrz [132]:

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

W [208]:

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

Na zewnątrz [208]:

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

Wykresy pudełkowe to kolejny przydatny rodzaj wykresów, które pozwalają skondensować wiele informacji o zbiorze danych w jednym wykresie. Pokazuje średnią, 25% i 75% kwartyl oraz wartości odstające jednej lub wielu zmiennych. W przypadku, gdy liczba wartości odstających jest niewielka i jest bardzo odległa od średniej, możemy wyeliminować wartości odstające, ustawiając je na wartość średnią lub 75% kwartyl.

Wyświetlanie wykresów pudełkowych

W [134]:

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

Na zewnątrz [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': []
}