Ein Leitfaden zur Zeitreihenvisualisierung mit Python 3

Einführung

Die Zeitreihenanalyse gehört zu einem Zweig der Statistik, in dem geordnete, häufig zeitliche Daten untersucht werden. Bei entsprechender Anwendung kann die Zeitreihenanalyse unerwartete Trends aufdecken, hilfreiche Statistiken extrahieren und sogar Trends für die Zukunft prognostizieren. Aus diesen Gründen wird es in vielen Bereichen angewendet, darunter Wirtschaft, Wettervorhersage und Kapazitätsplanung, um nur einige zu nennen.

In diesem Lernprogramm werden einige gängige Techniken für die Zeitreihenanalyse vorgestellt und die iterativen Schritte zur Bearbeitung und Visualisierung von Zeitreihendaten beschrieben.

Voraussetzungen

In diesem Handbuch wird beschrieben, wie Sie Zeitreihen auf einem lokalen Desktop oder einem Remote-Server analysieren. Das Arbeiten mit großen Datenmengen kann speicherintensiv sein. In beiden Fällen benötigt der Computer mindestens2GB of memory, um einige der Berechnungen in diesem Handbuch durchzuführen.

In diesem Tutorial verwenden wirJupyter Notebook, um mit den Daten zu arbeiten. Wenn Sie es noch nicht haben, sollten Sie unserentutorial to install and set up Jupyter Notebook for Python 3 folgen.

[[Schritt-1 - Installieren von Paketen]] == Schritt 1 - Installieren von Paketen

Wir werden die Bibliothekpandasnutzen, die viel Flexibilität bei der Bearbeitung von Daten bietet, und die Bibliothekstatsmodels, mit der wir statistische Berechnungen in Python durchführen können. Zusammengenommen erweitern diese beiden Bibliotheken Python, um mehr Funktionalität zu bieten und unser analytisches Toolkit erheblich zu erweitern.

Wie bei anderen Python-Paketen können wirpandas undstatsmodels mitpip installieren. Gehen wir zunächst zu unserer lokalen Programmierumgebung oder zur serverbasierten Programmierumgebung über:

cd environments
. my_env/bin/activate

Erstellen wir von hier aus ein neues Verzeichnis für unser Projekt. Wir werden estimeseries nennen und dann in das Verzeichnis wechseln. Wenn Sie dem Projekt einen anderen Namen geben, müssen Sietimeseries im gesamten Handbuch durch Ihren Namen ersetzen

mkdir timeseries
cd timeseries

Wir können jetztpandas,statsmodels und das Datenplotpaketmatplotlib installieren. Ihre Abhängigkeiten werden ebenfalls installiert:

pip install pandas statsmodels matplotlib

An diesem Punkt können wir jetzt mitpandas undstatsmodels arbeiten.

[[Schritt-2 - Laden von Zeitreihendaten]] == Schritt 2 - Laden von Zeitreihendaten

Um mit unseren Daten zu arbeiten, starten wir Jupyter Notebook:

jupyter notebook

Um eine neue Notebook-Datei zu erstellen, wählen Sie im Pulldown-Menü oben rechtsNew>Python 3 aus:

Create a new Python 3 notebook

Dadurch wird ein Notizbuch geöffnet, in das wir die erforderlichen Bibliotheken laden können (beachten Sie die Standardkürzel, mit denen aufpandas,matplotlib undstatsmodels verwiesen wird). Am oberen Rand unseres Notizbuchs sollten wir Folgendes schreiben:

import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt

Nach jedem Codeblock in diesem Lernprogramm sollten SieALT + ENTER eingeben, um den Code auszuführen und in einen neuen Codeblock in Ihrem Notizbuch zu wechseln.

Praktischerweise enthältstatsmodels integrierte Datensätze, sodass wir einen Zeitreihendatensatz direkt in den Speicher laden können.

Wir werden mit einem Datensatz namens "Atmosphärisches CO2 aus kontinuierlichen Luftproben am Mauna Loa Observatory, Hawaii, USA" arbeiten, der von März 1958 bis Dezember 2001 CO2-Proben sammelte. Wir können diese Daten wie folgt einbringen:

data = sm.datasets.co2.load_pandas()
co2 = data.data

Sehen wir uns an, wie die ersten 5 Zeilen unserer Zeitreihendaten aussehen:

print(co2.head(5))
Output              co2
1958-03-29  316.1
1958-04-05  317.3
1958-04-12  317.6
1958-04-19  317.5
1958-04-26  316.4

Wenn unsere Pakete importiert und der CO2-Datensatz fertig ist, können wir mit der Indizierung unserer Daten fortfahren.

[[Schritt 3 - Indizieren mit Zeitreihendaten]] == Schritt 3 - Indizieren mit Zeitreihendaten

Möglicherweise haben Sie bemerkt, dass die Daten als Index für den DataFrame unserespandasfestgelegt wurden. Wenn Sie mit Zeitreihendaten in Python arbeiten, sollten Sie sicherstellen, dass Datumsangaben als Index verwendet werden. Überprüfen Sie dies also immer, indem Sie Folgendes ausführen:

co2.index
OutputDatetimeIndex(['1958-03-29', '1958-04-05', '1958-04-12', '1958-04-19',
               '1958-04-26', '1958-05-03', '1958-05-10', '1958-05-17',
               '1958-05-24', '1958-05-31',
               ...
               '2001-10-27', '2001-11-03', '2001-11-10', '2001-11-17',
               '2001-11-24', '2001-12-01', '2001-12-08', '2001-12-15',
               '2001-12-22', '2001-12-29'],
              dtype='datetime64[ns]', length=2284, freq='W-SAT')

Das Felddtype=datetime[ns] bestätigt, dass unser Index aus Datumsstempelobjekten besteht, währendlength=2284 undfreq='W-SAT' angeben, dass wir ab Samstag 2.284 wöchentliche Datumsstempel haben.

Es kann schwierig sein, mit wöchentlichen Daten zu arbeiten. Verwenden wir stattdessen die Monatsmittelwerte unserer Zeitreihen. Dies kann durch Verwendung der praktischenresample-Funktion erreicht werden, mit der wir die Zeitreihen in Buckets (1 Monat) gruppieren, auf jede Gruppe (Mittelwert) einfunction anwenden und das Ergebnis kombinieren können ( eine Zeile pro Gruppe).

y = co2['co2'].resample('MS').mean()

Hier bedeutet der BegriffMS, dass wir die Daten in Buckets nach Monaten gruppieren und sicherstellen, dass wir den Beginn eines jeden Monats als Zeitstempel verwenden:

y.head(5)
Output1958-03-01    316.100
1958-04-01    317.200
1958-05-01    317.120
1958-06-01    315.800
1958-07-01    315.625
Freq: MS, Name: co2, dtype: float64

Ein interessantes Merkmal vonpandas ist die Fähigkeit, Datumsstempelindizes zu verarbeiten, mit denen wir unsere Daten schnell aufteilen können. Beispielsweise können wir unseren Datensatz in Scheiben schneiden, um nur Datenpunkte abzurufen, die nach dem Jahr1990 liegen:

y['1990':]
Output1990-01-01    353.650
1990-02-01    354.650
               ...
2001-11-01    369.375
2001-12-01    371.020
Freq: MS, Name: co2, dtype: float64

Oder wir können unseren Datensatz in Scheiben schneiden, um nur Datenpunkte zwischen Oktober1995 und Oktober1996 abzurufen:

y['1995-10-01':'1996-10-01']
Output1995-10-01    357.850
1995-11-01    359.475
1995-12-01    360.700
1996-01-01    362.025
1996-02-01    363.175
1996-03-01    364.060
1996-04-01    364.700
1996-05-01    365.325
1996-06-01    364.880
1996-07-01    363.475
1996-08-01    361.320
1996-09-01    359.400
1996-10-01    359.625
Freq: MS, Name: co2, dtype: float64

Wenn unsere Daten für die Arbeit mit temporären Daten ordnungsgemäß indiziert sind, können wir mit möglicherweise fehlenden Werten umgehen.

[[Schritt 4 - Behandlung fehlender Werte in Zeitreihendaten]] == Schritt 4 - Behandlung fehlender Werte in Zeitreihendaten

Daten aus der realen Welt sind in der Regel unübersichtlich. Wie wir aus der Grafik ersehen können, ist es nicht ungewöhnlich, dass Zeitreihendaten fehlende Werte enthalten. Die einfachste Möglichkeit, dies zu überprüfen, besteht darin, die Daten direkt zu zeichnen oder den folgenden Befehl zu verwenden, mit dem fehlende Daten in ouput angezeigt werden:

y.isnull().sum()
Output5

Diese Ausgabe gibt an, dass unsere Zeitreihen 5 Monate mit fehlenden Werten enthalten.

Im Allgemeinen sollten wir fehlende Werte "ausfüllen", wenn sie nicht zu zahlreich sind, damit die Daten keine Lücken aufweisen. Wir können dies inpandas mitfillna() command tun. Der Einfachheit halber können wir fehlende Werte mit dem nächstgelegenen Nicht-Null-Wert in unserer Zeitreihe ausfüllen, obwohl es wichtig ist zu beachten, dass manchmal ein gleitender Mittelwert vorzuziehen wäre.

y = y.fillna(y.bfill())

Wenn fehlende Werte eingegeben wurden, können wir erneut überprüfen, ob Nullwerte vorhanden sind, um sicherzustellen, dass unsere Operation funktioniert hat:

y.isnull().sum()
Output0

Nach Durchführung dieser Operationen sehen wir, dass wir alle fehlenden Werte in unserer Zeitreihe erfolgreich ausgefüllt haben.

[[Schritt-5 - Visualisierung von Zeitreihendaten]] == Schritt 5 - Visualisierung von Zeitreihendaten

Wenn Sie mit Zeitreihendaten arbeiten, können Sie durch Visualisierung eine Menge aufdecken. Ein paar Dinge, auf die Sie achten sollten, sind:

  • seasonality:does the data display a clear periodic pattern?

  • trend:does the data follow a consistent upwards or downward slope?

  • noise:are there any outlier points or missing values that are not consistent with the rest of the data?

Wir können denpandas-Wrapper um diematplotlib-API verwenden, um ein Diagramm unseres Datensatzes anzuzeigen:

y.plot(figsize=(15, 6))
plt.show()

Timeseries Visualization Figure 1

Einige unterscheidbare Muster erscheinen, wenn wir die Daten zeichnen. Die Zeitreihe weist ein offensichtliches Saisonalitätsmuster sowie einen insgesamt zunehmenden Trend auf. Wir können unsere Daten auch mit einer Methode visualisieren, die als Zeitreihenzerlegung bezeichnet wird. Wie der Name schon sagt, können wir mit der Zeitreihenzerlegung unsere Zeitreihen in drei verschiedene Komponenten zerlegen: Trend, Saisonalität und Rauschen.

Glücklicherweise bietetstatsmodels die praktische Funktionseasonal_decompose, um sofort eine saisonale Zerlegung durchzuführen. Wenn Sie mehr darüber erfahren möchten, finden Sie die Referenz für die ursprüngliche Implementierung in folgendem Artikel: „http://www.wessa.net/download/stl.pdf[STL: Ein auf Löss basierendes Verfahren zur Dekomposition saisonaler Trends ]. "

Das folgende Skript zeigt, wie in Python eine saisonale Zeitreihenzerlegung durchgeführt wird. Standardmäßig gibtseasonal_decompose eine relativ kleine Zahl zurück, sodass die ersten beiden Zeilen dieses Codeblocks sicherstellen, dass die Ausgabezahl groß genug ist, damit wir sie visualisieren können.

from pylab import rcParams
rcParams['figure.figsize'] = 11, 9

decomposition = sm.tsa.seasonal_decompose(y, model='additive')
fig = decomposition.plot()
plt.show()

Timeseries Seasonal-Trend Decomposition Visualization Figure 2

Durch die Verwendung der Zeitreihenzerlegung ist es einfacher, schnell einen sich ändernden Mittelwert oder eine Variation der Daten zu identifizieren. Die obige Grafik zeigt deutlich den Aufwärtstrend unserer Daten sowie deren jährliche Saisonalität. Diese können verwendet werden, um diestructure unserer Zeitreihen zu verstehen. Die Intuition hinter der Zeitreihenzerlegung ist wichtig, da viele Prognosemethoden auf diesem Konzept der strukturierten Zerlegung aufbauen, um Prognosen zu erstellen.

Fazit

Wenn Sie diesem Handbuch gefolgt sind, haben Sie jetzt Erfahrung mit der Visualisierung und Bearbeitung von Zeitreihendaten in Python.

Um Ihre Fähigkeiten weiter zu verbessern, können Sie einen anderen Datensatz laden und alle Schritte in diesem Lernprogramm wiederholen. Beispielsweise möchten Sie möglicherweise eine CSV-Datei mit der Bibliothekpandaslesen oder den Datensatzsunspotsverwenden, der mit der Bibliothekstatsmodelsvorinstalliert ist:data = sm.datasets.sunspots.load_pandas().data.