Tagebuch-Eintrag #29
Python CSV Daten, Diagramm, Problemlösung
Um Neujahrsanfang stöberte ich einfach aus Neugier auf Udemy.com. Und was soll ich sagen? Ich fand zwei Python-Kurse, die ich auf Anhieb sehr interessant fand. Und diese waren gerade im „Neujahrsangebot“ für rund 10,00€
Ich habe die Kurzeschreibung gelesen und Einführung angeschaut. Habe nicht lange gezögert und beide Kurse für je 10,00€ gekauft.
Diese Kurse sind:
Ich habe mit dem ersten anfangen und die letzten Tagen intensiv angeschaut und meine vorherigen Tagebuch-Einträge zum Thema CSV lesen und schreiben basieren auf diesen Python-Kurs und finde den Kurs bisher sehr gut gemacht und verständlich.
Nun bin ich bei der Aufgabe 58: Geburtsstatistiken erstellen.
Die Aufgabe lautet:
Finde heraus, wie oft der Name „Max“ als männlicher Vorname in Kalifornien zwischen 1950 und 2000 (jeweils einschließlich) vergeben wurde.
Die dazugehörige CSV-Datei wurde im Kurs bereitgestellt.
X-Y-Diagram erstellen
Die ausgelesenen Zahlen wollte ich auch in einem X-Y-Diagramm darstellen, was auch in Python-Kurs dargestellt wurde.
Das Diagramm erstelle ich mit dem Python-Modul Matplotlib. Welches ich ganz einfach über import matplotlib.pyplot as plt in den Code integrieren und nutzen kann.
Das Diagramm wird zum Schluss angezeigt.
Problem mit X-Y-Diagram
Nach dem ich den Programm-Code mit dem bisher erlernen geschrieben hatte, war ich gespannt wie und ob das funktioniert.
import matplotlib.pyplot as plt
xs = []
ys = []
name = "Max"
gender = "M"
state = "CA"
with open("data\\names.csv", "r") as names_csv:
for csv_row in names_csv:
name_list = csv_row.strip().split(",")
if name_list[1] == name and name_list[3] == gender and name_list[4] == state:
xs.append(name_list[2])
ys.append(name_list[5])
# print(xs)
# print(ys)
print("Diagramm wird geladen.")
plt.plot(xs,ys)
plt.show()
Ich importiere Matplotlib, erstelle dann zwei leere Listen für die X und Y Achsen des späteren Diagramms.
Dann definiere ich Variablen für Namen, Geschlecht und Kürzel des Bundesstaates. Bezogen auf die Aufgabe, ist es CA für Kalifornien.
Weiter im Code wird die CSV-Datei mit with-Aufruf geöffnet in der Variable names_csv zugewiesen. Die for-Schleife liest dann Zeile für Zeile aus der CSV-Datei aus und erstellt daraus eine Liste mit split()-Funktion (Zeile 8).
In der if-Abfrage definiere ich dann, wonach gesucht wird. In der Aufgabe lautet diese also: Wenn der Name Max ist und männlich und aus dem Bundesstaat Kalifornieren, dann hänge die gefundenen Werden der Listen xs und ys an (Zeile 11 und 12).
Nach der for-Schleife wird dann das Diagramm aus den Listen xs und ys erstellt (plt.plot(xs,ys) und anschließend auch dargestellt mit plt.show()
Ein erster Aufruf sah dann so aus:

Als ich das gesehen hatte, dachte ich mir, dass es etwas komisch aussieht und im Video-Training die Zahlen eindeutig zu sehen sind.
Ich konnte die Ursache für den Fehler erst mal nicht finden.
Er am nächsten schaute ich mir meinem Python-Code dazu nochmal an und keine 5 Minuten später hat es dann „Klick“ gemacht.
In der if-Schleife (Zeile 11 und 12) hatte ich vergessen name_list[2] und name_list[5] als Integer (Ganzzahlen) umzuwandeln. Also hatte ich diese Teil korrigiert und schwupp-di-wupp wurde das Diagramm richtig dargestellt.

Wie oft wurde der Name Max vergeben?
Ich war froh, dass der Fehler behoben wurde und dann fiel mir ein, dass es noch eine Aufgabe gab. Nämlich wie oft der Name Max im Zeitraum von 1950 bis 200 (einschließlich) vergeben wurde. Ich hatte nun die Ausgabe von Jahren, mit Anzahl der Personen, die den Namen Max erhielten. Nun muss ich die Anzahl zusammenaddieren.
Um das zu berechnen habe ich mir folgendes überlegt.
- Leere Liste ersten (summery)
- Anzahl an vergebenen Namen pro Jahr in diese Liste hinzufügen
- Die Anzahl zusammenrechnen
Die ersten zwei Punkte konnte ich recht einfach umsetzen. Beim zusammen rechnen kam ich ins grübeln und wusste nicht, wie ich es am besten umsetzen sollte. Y = x + x in der for-Schleife würde nicht funktionieren (hat auch nicht funktioniert ;))
Bei diese Aufgabe musste ich kurz Google zur Hilfe nehmen. Und die Lösung war die Python-Funktion sum() – also Summe aller Zahlen. In der Funktion sum() gebe ich ein, was genau zusammengerechnet werden soll. Ich meinem Fall heißt der Aufruf: sum(summary)
Das war so einfach, dass man selbst nicht drauf kommt. 😉
Mein vollständiger Programm-Code für diese Aufgabe:
import matplotlib.pyplot as plt
xs = []
ys = []
summary = []
name = "Max"
gender = "M"
state = "CA"
with open("data\\names.csv", "r") as names_csv:
counter = 0
for csv_row in names_csv:
name_list = csv_row.strip().split(",")
counter = counter + 1
if name_list[1] == name and int(name_list[2]) >= 1950 and int(name_list[2]) <= 2010 and name_list[3] == gender and name_list[4] == state:
xs.append(int(name_list[2]))
ys.append(int(name_list[5]))
summary.append(int(name_list[5]))
print("Insgesamt wurden " + str(sum(summary)) + " Personen nach " + name + " benannt.")
print("Diagramm wird geladen.")
plt.plot(xs,ys)
plt.show()
Und das dazugehörige Diagramm

Beim Schreiben des Programm-Codes habe ich übrigens nicht die Musterlösung des Udemy-Videos zur Hilfe genommen. Lediglich ein mal Google musste ich fragen. Ansonsten habe ich den Code geschrieben, wie ich es selbst bisher gelernt habe. Natürlich hat es etwas gedauert den Code zu schreiben und hier und da muss ich bei meinen vorherigen Übungen nachschauen. Insgesamt bin ich recht zufrieden 🙂
Übrigens, den Kapitel Klassen in Python werde ich auf Februar/März verschieben. Es beschäftigt mich gerade so viele interessante Themen in und mit Python. Außerdem möchte ich noch etwas mit Matplotlib üben und zwar mit zwei Kurven in einem Diagramm.