Passagierzahlen des Kieler Hafens mit Python grafisch darstellen

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.

Passagiere im Kieler Hafen

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
# -*- coding: utf-8 -*-

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, "r*-", 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()
Grafische Darstellung der Passagierzahlen im Kieler Hafen

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.