CSV-Daten mit Python aus dem Internet laden

Aktualisiert am 19. Juni 2021

In den bisherigen Python-Panda-Tutorials wurden die Datensätze lokal gespeichert (z.B. im Tutorial “Python, Pandas und Verkehrsunfälle in Kiel”), um sie anschließend grafisch darzustellen.

In diesem Beispiel möchte ich hingegen zeigen, dass eine CSV-Datei nicht erst lokal gespeichert werden muss, sondern dass sie mit dem Modul requests direkt aus dem Internet geladen werden können.

Demonstrieren möchte ich dies anhand einer Statistik der Stadt Kiel zu Straßenverkehrsunfällen.

CSV-Daten mit requests laden

Beginnen wir damit alle erforderlichen Module zu importieren:

import requests
import matplotlib.pyplot as plt
import pandas as pd
import io

Dann definieren wir die URL zum Datensatz. Wie bereits erwähnt, greife ich hierbei auf einen Datensatz der Stadt Kiel zurück:

CSV_URL = 'https://www.kiel.de/opendata/kiel_gesetze_justiz_strassenverkehsunfaelle_verkehrstote_verletzte_fahrerflucht.csv'

Anschließend kommt requests zum Einsatz, wobei die Daten der Variablen csv_data zugewiesen werden:

csv_data = requests.get(CSV_URL).content

Jetzt kann ein Dataframe erzeugt werden, d.h. wir verwenden das Modul Pandas um die Daten zu parsen.

Falls Euch der Begriff Dataframe noch nicht begegnet ist: Die Pandas-Bibliothek enthält einige nützliche Datenstrukturen, u.a. das Dataframe-Objekt. Dabei handelt es sich um eine Zwei-Dimensionale Tabelle mit Zeilen und Spalten (so wie man es beispielsweise aus einer Tabellenkalkulation wie Excel oder Numbers kennt).

df = pd.read_csv(io.StringIO(csv_data.decode('utf-8')), sep=';')

Die ersten fünf Zeilen lassen sich übrigens wie folgt ausgeben:

print(df.head())

Daten visualisieren

Dies war der interessante Teil. Anstatt eine lokale CSV-Datei zu verwenden, wurde das Modul requests genutzt, um die Daten aus dem Internet zu laden. Als Zeichencodierung habe ich „utf-8“ angegeben und zusätzlich ein Semikolon als Trennzeichen definiert. Der restliche Code entspricht meinem alten Beispiel:

fig, ax = plt.subplots()

x = df['Jahr']
y = df['Unfaelle']

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

plt.plot(y, "*-", 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()

Mit

plt.savefig('kiel_unfaelle.png')

könnte man die Grafik zusätzlich auch speichern.

Der Code steht — wie üblich — bei Github zum Download zur Verfügung.

Weiterführende Links