kleine Mathe-Spielereien

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
OSWALD
User
Beiträge: 601
Registriert: Freitag 18. März 2022, 17:32

11.8.2025
Endlich habe ich ein perfektes Programm gefunden,
in dem das CSV-Problem demonstriert wird.
Ich werde versuchen ein analoges Programm mit anderen Daten
zu entwickeln. Einen Versuch ist es jedenfalls wert.##
(wer immer stetig sich bemüht, den können wir erlösen: frei nach Goethe FaustII)
OSWALD

Code: Alles auswählen


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

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())
print(df)
#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']
print('Aufzaehlung der Unfaelle',x, y)

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')
print(plt.plot(y, '*-', markersize=6))
plt.legend(loc=(0.4, 0.8))

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

plt.show()





Benutzeravatar
__blackjack__
User
Beiträge: 14069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`requests` und `io` hier selbst zu benutzen ist nicht notwendig — man kann Pandas auch eine URL statt eines Dateinamens übergeben.

Das Label "Jahr" ist bei mir nicht sichtbar. `tight_layout()` schafft da Platz für.

Wenn man mit Statistik nicht lügen oder irreführen möchte, sollte bei solchen Plots die Bandbreite bis runter zu 0 gehen, sonst sehen Unterschiede/Änderungen in der Regel überproportional gross aus.

Code: Alles auswählen

#!/usr/bin/env python3
import matplotlib.pyplot as plt
import pandas as pd


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


def main():
    df = pd.read_csv(CSV_URL, sep=";", encoding="utf-8")
    _fig, ax = plt.subplots()

    plt.title("Straßenverkehrsunfälle in Kiel", size="x-large")
    plt.ylabel("Anzahl", size="x-large")
    plt.xlabel("Jahr", size="x-large")
    plt.plot(
        df["Unfaelle"],
        "*-",
        markersize=6,
        linewidth=1,
        color="blue",
        label="Unfälle",
    )
    # plt.legend(loc="upper center")

    x = df["Jahr"]
    ax.set_xticks(range(len(x)))
    ax.set_xticklabels(x, rotation="vertical")
    ax.set_ylim(0)

    plt.tight_layout()
    plt.show()


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten