traffic accidents in kiel

Python, Pandas und Verkehrsunfälle in Kiel

In den ersten drei Python-Beiträgen ging es um die Darstellung von Daten unter Verwendung von Matplotlib. Bevor Daten aber visualisiert werden können, muss man zunächst einmal überhaupt Zugriff auf sie haben. Außerdem bedarf es u.U. einer Datenaufarbeitung: Denn eventuell werden nur bestimmte Daten eines Datensatzes benötigt, was bedeutet, dass man diese Daten von den übrigen Daten extrahieren muss. Und nicht zuletzt mag auch eine Analyse der Daten von Interesse sein. Hier kommt Pandas ins Spiel, eine Python-Bibliothek, die eben genau diesen Anforderungen gerecht wird.

Als Datensatz für nachfolgendes Beispiel habe ich erneut eine CSV-Datei aus dem Open-Data-Portal der Stadt Kiel gewählt. Diesmal geht es um Straßenverkehrsunfälle in Kiel von 1989 bis 2015.

Vorbereitungen

Ladet die erforderliche CSV-Datei herunter. Ich habe einen kürzeren Dateinamen vergeben und sie “kiel_unfaelle.csv” genannt. Um Schwierigkeiten mit den in dem Datensatz verwendeten Umlauten zu vermeiden, habe ich die Datei zudem zu UTF–8 umgewandelt. Dies kann jeder guter Editor, wobei ich Sublime Text 3 verwendet habe.

Außerdem benötigt Ihr eine aktuelle Version von Python, die Ihr hier herunterladen könnt.

Und schließlich müssen folgende Pakete installiert sein:

  • pandas
  • numpy
  • matplotlib

Dafür kann beispielsweise pip3 in der Shell bzw. PowerShell verwendet werden:

pip3 install pandas numpy matplotlib

Zum Code

Legt eine neue Datei, zum Beispiel mit dem Namen “kiel_unfaelle.py”, an und importiert zunächst die erforderlichen Bibliotheken:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

Da für die Darstellung der Daten als Liniendiagramm die Darstellung der X-Achse anpasst werden soll, wird zunächst ein Subplot festgelegt:

fig, ax = plt.subplots()

Jetzt kommt Pandas ins Spiel: Dank dieser Bibliothek wird das Einlesen eines Datensatzes von einer CSV-Datei zum Kinderspiel:

df = pd.read_csv("kiel_unfaelle.csv", sep=";")
print(df.head())

In der Regel wird “df” als Variablennamen verwendet, was als Kurzform für dataframe steht. Die Funktion read_csv() erledigt das Einlesen der Daten, wobei ein Semikolon als Trennzeichen (delimiter) angegeben werden muss, da ein solcher in unserem Datensatz verwendet wird.

Führt nun den bisherigen Code aus, um zu testen ob das Einlesen auch tatsächlich funktioniert. Hierfür wollen wir uns nicht den kompletten Datensatz anzeigen lassen, weswegen wir head() nutzen, was dazu führt, dass lediglich die ersten fünf Zeilen des Datensatzes ausgegeben werden.

War dies erfolgreich, können wir uns nun der eigentlichen Aufgabe widmen: Ziel ist es, nur die Jahreszahlen sowie die mit “Unfälle” bezeichneten Zahlen zu verwenden. Alle übrigen Spalten interessieren uns nicht. Mit Pandas ist dies sehr einfach zu realisieren. Sollen z.B. die Jahreszahlen als Werte der X-Achse genutzt werden, wäre folgende Zeile ausreichend:

x = df['Jahr'].values

Es gibt aber noch zwei kleine Hindernisse. Laßt Euch einmal den Typ der Jahreszahlen mit

print(df['Jahr'].dtype)

anzeigen. Als Ergebnis erscheint float64. Bei den Jahreszahlen handelt es sich also um Float-Werte. Das wird nun nicht dazu führen, dass wir bei der grafischen Ausgabe der Unfälle eine Fehlermeldung erhalten würden. Allerdings würden alle Jahreszahlen als Gleitkommazahl erscheinen (z.B. 2014.0), was schon recht seltsam aussehen würde.

Und dann hätten wir da noch die letzte Zeile der CSV-Datei, die in der Tat zu einer Fehlermeldung führen würde. Es ist die Zeile ;;;;;;;;;;, also eine Zeile mit nicht vorhandenen Werten (missing values). Diese muss zunächst entfernt werden:

df_cleaned = df.dropna(how='all') 

Anschließend wird der Datentyp der Jahreszahlen (in uint16) geändert:

df_years = df_cleaned['Jahr'].astype(np.uint16)

Nun kann es tatsächlich an die Auswahl der relevanten Spalten gehen (Jahr, Unfälle):

x = df_years.values
y = df_cleaned['Unfälle'].values

Und schließlich können die Daten grafisch dargestellt werden. Da der Code mit demjenigen der vorhergehenden Beispiele identisch ist, verzichte ich hier darauf, erneut im Detail darauf einzugehen:

plt.title("Straßenverkehrsunfälle", size="x-large")
plt.ylabel("Anzahl", size="x-large")
plt.xlabel("Jahr", size="x-large")

plt.plot(y, "r*-", markersize=6, linewidth=1, color='b', label="Unfälle")

plt.legend(loc=(0.4, 0.8))

ax.set_xticks(range(len(x)))
ax.set_xticklabels(x, rotation='vertical')

plt.show()

Die Grafik kann zusätzlich mit folgender Zeile gespeichert werden:

plt.savefig('kiel_unfaelle.png')

Weiterführende Links

Der komplette Code steht bei Github zum Download bereit. So könnt Ihr sofort loslegen und als Übung eine andere CSV-Datei mit interessanten Daten auswerten.

Darüber hinaus könnten noch nachfolgende Links von Interesse sein:

Durch Benutzung dieser Website erklären Sie sich mit der Verwendung von Cookies einverstanden. Mehr Informationen

Die Verwendung von Cookies dient dazu, Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf diese Website zu analysieren. Außerdem werden Informationen zur Nutzung dieser Webseite an Partner für soziale Medien, Werbung und Analysen weitergegeben.

Schließen