CSV-Daten mit Python aus dem Internet laden

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. Außerdem war es in der Regel notwendig, einen anderen Zeichensatz zu verwenden — nämlich UTF-8 —, damit beispielsweise Umlaute richtig dargestellt werden.

Diese Zwischenschritte kann man sich jedoch auch sparen, wie ich im nachfolgenden Beispiel demonstrieren möchte.

Zunächst müssen folgende Module importiert werden:


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

Dann definieren wir die URL zum Datensatz. Dabei greife ich wiederum auf den Datensatz der Stadt Kiel zu den Verkehrsunfällen der vergangenen Jahre zurück.

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

Diese Daten werden nun geladen und der Variablen csv_data zugewiesen:


csv_data = requests.get(CSV_URL).content

Nun 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 kennt).


df = pd.read_csv(io.StringIO(csv_data.decode('latin1')), sep=';')

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


print(df.head())

Dies war der interessante Teil. Anstatt eine CSV-Datei herunterzuladen und lokal zu speichern, wurde das Modul requests genutzt, um die Daten aus dem Internet zu laden. Und um Probleme mit der Darstellung zu vermeiden, wurde der Datensatz nicht zu UTF-8 konvertiert, sondern stattdessen mit csv_data.decode('latin1') jener Zeichensatz definiert, in dem die Daten vorliegen. Der restliche Code entspricht meinem alten Beispiel:


fig, ax = plt.subplots()

df_cleaned = df.dropna(how='all')
df_years = df_cleaned['Jahr'].astype(np.uint16)

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

print("Jahr = ", x)

plt.title("Traffic Accidents in Kiel", size="x-large")
plt.ylabel("Quantity", size="x-large")
plt.xlabel("Year", size="x-large")

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

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 sofort speichern.

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