Skip to content

13 Hilfreiche Tools

Jürgen Hansmann edited this page Mar 15, 2024 · 11 revisions

Hilfreiche Tools

Für viele Aufgaben, die im Arbeitsalltag anfallen, gibt es bereits sehr hilfreiche Python-Werkzeuge, die viele Funktionen zur Verfügung stellen. Im Folgenden werden einige davon kurz vorgestellt.

pandas

Das pandas-Projekt hilft beim Einlesen, Analysieren, Bearbeiten und Visualisieren von Daten in verschiedenen Formaten.

Daten aus Excel oder aus .csv-Files importieren

Das Einlesen von Daten aus Excel-Tabellen oder .csv-Files in ein Python-Script geht mit pandas beispielsweise so:

import pandas as pd

df_excel = pd.read_excel("Koordinaten.xlsx")
df_csv = pd.read_csv('data.csv')

Im obigen Beispiel kann man import ... as ... verwenden, damit man nicht jedesmal den vollen Modulnamen im Code tippen muss, sondern nur die abgekürzte Variante (sozusagen ein alias), die man hinter dem as frei definieren kann. Das df in dem Beispiel oben ist ein pandas.DataFrame, der die Daten aus der eingelesenen Excel-Tabelle oder .csv-Datei enthält. Mit diesen können wir jetzt in Python weiterarbeiten und sie dann wieder in ein Excel-File schreiben:

df_excel.to_excel('Koordinaten_bearbeitet.xlsx')
df_csv.to_csv('data_bearbeitet.csv')

Eingelesene Daten bearbeiten

Wir können jetzt mit dem pandas DataFrame df in unserem Python-Script arbeiten. Beispielsweise können wir alle X-Koordinaten aus der Spalte X bearbeiten und dann die neuen Werte in eine neue Spalte X neu schreiben. Falls wir beispielsweise, aus welchem Grund auch immer, alle X-Werte mit 2 multiplizieren möchten und anschliessen den Wert 1000 addieren möchten, und diese Werte dann in der neuen Spalte X neu speichern möchten, geht das mit nur einer Zeile:

df['X neu'] = df['X'] * 2 + 1000

Damit wird mit nur einer einzelnen Anweisung die Multiplikation und Addition für alle X-Werte vorgenommen. Man braucht dazu also nicht mit einer Schleife über alle Werte zu iterieren. Siehe hierzu auch hier


Übung: Excel-File einlesen, bearbeiten und wieder speichern
DataFrameFilter.py

  1. Lies die Datei ../resources/Zufallskoordinaten_WGS84.xlsx (https://raw.githubusercontent.com/hansmannj/py-tutorial/master/resources/Zufallskoordinaten_WGS84.xlsx) ein.
  2. Speichere dann in einer neuen Datei Koordinaten_gefiltert.xlsx nur eine Untermenge der Koordinaten ab. Beispielsweise kannst Du diejenigen Koordinaten herausfiltern, deren Z-Wert > 1000 und < 2000 ist.
  3. Zeige dem User an, wieviele Prozent der ursprünglichen Daten innerhalb des von Dir gewählten Z-Werte Intervalls liegen. Man kann z.B. mit df.shape die Dimensionen des DataFrames abfragen.

Tipp:

Im pandas-Tutorial findest Du Lösungen zu einer ähnlichen Fragestellung, lasse Dich inspirieren. Auch ein Blick in den User Guide lohnt sich. Lasse Dich nicht entmutigen, pandas ist ein sehr umfangreiches Tool und wir brauchen hier nur einen Bruchteil davon. Viele der von pandas gelieferten Funktionen haben eine grosse Anzahl an möglichen Parametern. Meist sind aber nur wenige davon obligatorisch und die vielen Optionen, die es gibt, brauchen wir im Moment noch nicht.

Folium

Mit folium (hier geht's zur Dokumentation) kann man mit recht wenig Aufwand interaktive Karten erzeugen. Beispielsweise kann man Geodaten, die in Python bearbeitet wurden, auf einer Karte darstellen. Mit wenigen Zeilen kann man eine interaktive Karte erstellen und als .html-File exportieren. Diese kann man dann in einem Browser öffnen.

import folium


m = folium.Map(location=[46.95456, 7.42067])
m.save("index.html")

Jupyter Notebooks

In Jupyter Notebooks https://jupyter.org/ kann man Zellen mit veränderbaren und ausführbarem Python-Code erstellen, und auch direkt Text-Zellen einfügen, die ausführliche Erläuterungen enthalten. Dies ist beispielsweise sehr praktisch, wenn man den Code, den man schreibt, schnell und einfach prüfen möchte. Man kann sich beispielsweise den Wert von Variablen anschauen. Auch kann man sich importierte Daten schnell anzeigen lassen oder einfach statistisch auswerten. Ausserdem eignet sich ein gut strukturiertes und dokumentiertes Notebook auch für die Präsentation von Analysen und Ergebnissen. Die interaktive Karte aus dem Beispiel oben, könnte man in einem Jupyter Notebook direkt anschauen, ohne sie zunächst in ein .html zu exportieren. Wenn man auf seinem Rechner jupyter installiert hat (pip install jupyter), kann man einen lokalen Jupyter Server starten:

jupyter notebook

Es öffnet sich dann automatisch ein Browserfenster und zeigt den Inhalt des Verzeichnisses an, in dem man den obigen Befehl ausgeführt hat. In diesem Browserfenster kann man dann ein neues Notebook erstellen. Einzelne Code-Zellen kann man mit <Shift> + <Enter> ausführen.


Übung: Profillinie von Bern nach Locarno
profillinie.py

In dieser Übung kannst Du vieles von dem einsetzen, das Du in den letzten Tagen gelernt hast. Es geht darum, ein Höhenprofil auf einer Linie zwischen Bern (2598633.75, 1200386.75) und Locarno (2711536, 1113566.625) zu erstellen und zu plotten. Hierzu kannst Du wie folgt vorgehen:

  1. Eine Funktion bekommt eine vorgegebene Anzahl an Punkten n, die auf der Linie liegen sollen, sowie die X- und Y-Koordinaten des Start- und den Endpunkts übergeben. Sie ermittelt für diese n Punkte jeweils die Z-Koordinate. Idealerweise liefert die Funkton einen pandas DataFrame zurück, indem die X, Y und Z-Werte gespeichert sind.
    (Bitte n nicht zu gross wählen, damit es nicht zuviele Requests gibt.)
  2. Findest Du eine einfache Möglichkeit, das Höhenprofil entlang der Profillinie überhöht zu plotten und in eine Datei zu speichern?
  3. Anschliessend möchten wir gern die Profillinie in eine folium-Karte plotten. Geht das mit den aktuellen Koordinaten, oder wäre es einfacher, die Koordinaten zu transformieren?

Tipp:

  • Zum ermitteln der Z-Koordinaten gibt es sicher einen Web-Service von swisstopo
  • Falls Du zeilenweise über den DataFrame iterieren möchtest, um beispielsweise einen swisstopo-Service zu nutzen, der Koordinaten transformiert, schaue Dir in der pandas Dokumentation .iterrows() an.
  • Mit .iterrows() kannst Du auch wieder über den DataFrame mit den transformierten Koordinaten iterieren, um sie beispielsweise mit folium.CircleMarker(.....).add_to(....) Deiner Karte hinzuzufügen.

cx_freeze

Mit cx_freeze kann man aus .py Dateien eigenständig ausführbare .exe Dateien erstellen, die Du dann mit Freundinnen oder Freunden teilen kannst. Wie das geht, ist hier beschrieben: https://cx-freeze.readthedocs.io/en/latest/setup_script.html# Zunächst muss man mit pip install --upgrade cx_Freeze das Tool installieren. Anschliessend kopiertst Du am besten die .py-Datei, aus der Du eine .exe machen möchtest, in einen neuen, leeren Ordner. Im selben Ordern bitte auch eine Datei mit dem Namen setup.py erstellen. Die setup.pysollte dann, gemässe der Modul-Doku, etwa so aussehen:

import sys
from cx_Freeze import setup, Executable


# base="Win32GUI" should be used only for Windows GUI app
base = "Win32GUI" if sys.platform == "win32" else None

setup(
    name="pyVinci",
    version="0.1",
    description="Super tolles Python-Programm mit GUI!",
    executables=[Executable("pyVinci.py", base=base)],
)

Anschliessend bitte in der command line in dasselbe Verzeichnis wechseln, in dem auch die .py-Datei und die setup.py liegen. Dort dann:

python setup.py build

ausführen. Wenn alles gut läuft, dann liegt Deine nagelneue .exe nun im Unterverzeichnis /build/exe.win-amd64-3.11/DATEI.EXE.