Nach längerer Zeit präsentiere ich wieder einen Open-Data-Beitrag. Diesmal geht es um die Darstellung der Passagierzahlen im Kieler Hafen (Kreuzfahrten). Der Datensatz wird als CSV-Datei von der Stadt Kiel bereitgestellt.
Die CSV-Datei „kiel_transport_verkehr_hafen_passagiere_insgesamt.csv“ enthält die Passagierzahlen für den Fähr- wie auch für den Kreuzfahrverkehr. Uns interessieren hier lediglich die Kreuzfahrten, die in der letzten Spalte dargestellt sind.
Tipp: Die farbliche Darstellung des Inhalts der CSV-Datei wird durch die Erweiterung „Rainbow CSV“ ermöglicht. Diese Erweiterung gibt es sowohl für Visual Studio Code als auch für Sublime Text.
Im Grund hat man zwei Möglichkeiten, diese Datei zu nutzen. Zum einen kann man sie herunterladen und dann den Pfad zu dieser Datei im Python-Skript angeben. Zum anderen kann requests
verwendet werden, um den Inhalt der Datei zu lesen. Dafür benötigt man dann die URL zur CSV-Datei. Letzteren Weg schlage ich hier ein:
#!/usr/bin/env python3
import io
import requests
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
CSV_URL = 'https://www.kiel.de/opendata/kiel_transport_verkehr_hafen_passagiere_insgesamt.csv'
Mit requests
kann der Inhalt abgerufen werden, wobei die URL als Argument übergeben wird:
csv_data = requests.get(CSV_URL).content
In diesem Beispiel kommt pandas zum Einsatz, das mit einem Data Frame als Datenstruktur arbeitet. Der Inhalt der CSV-Datei wird dabei der Variable df
mithilfe der Methode read_csv()
zugewiesen. Mit head()
kann man sich dann die ersten fünf Zeilen der Datenstruktur anzeigen lassen:
df = pd.read_csv(io.StringIO(csv_data.decode('utf-8')), sep=';')
print(df.head())
Dies führt zu folgender Ausgabe:
Land Stadt Kategorie Merkmal Jahr im Faehrverkehr im Kreuzfahrverkehr
0 de-sh Kiel transport_verkehr Passagiere 1988 1.425.427 433.514
1 de-sh Kiel transport_verkehr Passagiere 1989 1.650.365 435.610
2 de-sh Kiel transport_verkehr Passagiere 1990 1.758.481 460.218
3 de-sh Kiel transport_verkehr Passagiere 1991 1.800.188 441.485
4 de-sh Kiel transport_verkehr Passagiere 1992 1.880.993 405.664
Als nächstes kommt matplotlib zum Einsatz. Mit der Methode subplots()
gibt es eine einfache Möglichkeit, ein Sublot zu erstellen. Diese Methode gibt ein Tupel zurück, das zwei Objekte enthält, die grafische Darstellung und die Axen. Der Inhalt des Tupels wird dabei entpackt, d.h. den Variablen fig
und ax
zugewiesen (wobei häufig nur ax
benötigt wird).
fig, ax = plt.subplots()
Diese Zeile ist die Kurzform von:
fig = plt.figure()
ax = fig.add_subplot(111)
Es mag sein, dass ein Datensatz nicht vollständig ist. So wäre es zum Beispiel denkbar, dass für bestimmte Jahre keine Daten vorliegen. Daher ist es sinnvoll die Daten mit der Methode dropna()
zu bereinigen:
df_cleaned = df.dropna(how='all')
Als nächstes wird die (bereinigte) Spalte „Jahr“ der Variable df_years
zugewiesen:
# Unsigned integer (0 to 65535)
df_years = df_cleaned['Jahr'].astype(np.uint16)
Diesen Zwischenschritt könnte man auch weglassen. Er wird hier lediglich gemacht, um als (Numpy-)Datentyp uint16
festlegen zu können.
Die Werte, also die Jahre, werden anschließend der Variable x
zugewiesen (Werte für die X-Achse):
x = df_years.values
Des Weiteren benötigen wir auch die Werte für die Y-Achse, mithin die Passagierzahlen:
y = df_cleaned['im Kreuzfahrverkehr'].values
Als nächstes können wir uns um die Überschrift sowie die Bezeichnungen für die X- und die Y-Achse kümmern:
plt.title("Kiel - Passagierzahlen (Kreuzfahrverkehr)")
plt.ylabel("Passagiere (in Tausend)", size="x-large")
plt.xlabel("Jahr", size="x-large")
Die nächste Zeile legt das Aussehen der Linie fest:
plt.plot(y, "*-", markersize=6, linewidth=1, color='b')
Jetzt kommt die Variable ax
zum Einsatz, d.h. die X-Achse soll die Jahreszahlen darstellen:
ax.set_xticks(range(len(x)))
ax.set_xticklabels(x, rotation='vertical')
Und schließlich möchten wir, dass die Grafik auch angezeigt wird:
plt.show()
Den kompletten Code findet Ihr zum Herunterladen auf Github. Außerdem habe ich hierzu auch ein Jupyter Notebook erstellt und es zum Projekt Kiel Open Data hinzugefügt.