Archiv der Kategorie: Programmierung

Die Tupel-Fallgrube

Was viele nicht wissen, ist dass bei der Deklarierung eines Python Tupels die runden Klammern eigentlich nicht zum syntaktischen Konstrukt gehören, sondern nur zur optischen Abgrenzung verwendet werden. Dies bedeutet folgendes:

Eingabe:

x = (1, 2, 3)
print(x)

Ausgabe:

(1, 2, 3)

Doch ebenso:

Eingabe:

x = 1, 2, 3
print(x)

Ausgabe:

(1, 2, 3)

Dies erscheint erst einmal nicht schlimm, oder sogar vielleicht elegant, da man sich Tipparbeit sparen kann, doch diese quasi Inkonsistenz in der Syntax kann zu schwierig zu findenden Fehlern führen, wie z.B. folgendem:

Eingabe:

x = min(1, 2, 3),
print(x)

man beachte das “,” hinter dem call von min(). Dies führt dann hierzu:

Ausgabe:

(1,)

also einem Tupel, obwohl man einen Integer-Wert erwartet. Ein solcher Bug kann schwer zu finden bzw. zu erkennen sein.
Deshalb ergibt type hinting auch bei Python Sinn.

Vektorisierte Operationen mit Pandas

Aktuell beschäftige ich mich intensiv mit Python im Kontext von Data Science.
Hierbei kommt man natürlich nicht an Pandas vorbei. Und natürlich gibt es, wie so gut bei jedem Problem, welches man durch Programmcode lösen möchte, mehrere Wege zum Ziel.

Bei der Verwendung von Pandas Dataframes könnte man auf die Idee kommen, folgenden Code zu schreiben, um alle Werte einer Spalte zu verarbeiten und das Ergebnis in eine neue Spalte zu schreiben:

df['wert_quadrat'] = df.apply(lambda row: row['wert'] ** 2, axis=1)

Der Code quadriert den Wert in der Spalte “wert” und erzeugt dann eine neue Spalte “wert_quadrat” mit dem Ergebnis.
Dies funktioniert, doch es gibt eine elegantere und vor allem performantere Lösung: vektorisierte Operationen!

Hier die gleiche Operation als vektorisierte Operation:

df['wert_quadrat'] = row['wert'] ** 2

Je nach Größe des Datensatzes kann man hierdurch erhebliche Performancegewinne erzielen, da bei vektorisierten Operationen kein Python-Loop durchgeführt wird, bei dem für jede Zeile die entsprechende Python-Funktion ausgeführt wird, sondern die Operation wird an die zugrundeliegende numpy arrays deligiert, welche die Operation in Maschinencode ausführt.