Übung 9

Für diese Übung brauchen wir

  1. Die Python-Module pandas sowie random
  2. Die Funktion offset_coordinate aus Übung 8.5
  3. zeckenstiche.csv importiert als pandas DataFrame in der Variabel zeckenstiche
import pandas as pd
import random

def offset_coordinate(old, distance = 100):
    new = old + random.normalvariate(0, distance)
    return new

zeckenstiche = pd.read_csv("data/zeckenstiche.csv")
ModuleNotFoundError: No module named 'pandas'

Übung 9.1

Mache dich nochmals damit vertraut, einzelne Spalten zu selektieren. Schau dir DataFrames nochmals an wenn du nicht mehr weisst wie das geht.

Musterlösung
zeckenstiche["x"]
zeckenstiche["y"]

Übung 9.2

Mache dich nochmals damit vertraut, wie man neue Spalten erstellt. Schau dir DataFrames nochmals an wenn du nicht mehr weisst wie das geht. Erstelle ein paar neue Spalten nach dem Beispiel unten um die Hangriffe zu üben. Lösche die Spalten im Anschluss wieder mit del zeckenstiche['test1'] etc.

Musterlösung
zeckenstiche["test1"] = "test1"

zeckenstiche["test2"] = 10

zeckenstiche["test3"] = range(10)
# zeckenstiche könnte danach folgendermassen aussehen:
zeckenstiche
NameError: name 'zeckenstiche' is not defined
# unnötigen Spalten wieder entfernen:
del zeckenstiche['test1']
del zeckenstiche['test2']
del zeckenstiche['test3']
NameError: name 'zeckenstiche' is not defined

Übung 9.3

pandas kennt eine ganze Familie von Methoden, um Spalten zu Manipulieren und Daten zu Aggregieren (apply, map, mapapply, assign). Es würde den Rahmen dieses Kurses sprengen, die alle im Detail durchzugehen, es lohnt sich aber sehr sich mit diesen auseinanderzusetzen wenn man sich näher mit Python befassen möchte.

Im unserem Fall brauchen wir lediglich die Methode apply um die Funktion offset_coordinate() auf die Zeckenstichkoordinaten anzuwenden. Dabei gehen wir wie folgt for:

zeckenstiche["x"].apply(offset_coordinate)
#\______1_______/ \_2_/\_______3_________/

# 1. Spalte selektieren (["x"])
# 2. Methode "apply" aufrufen
# 3. Function übergeben

Verwende dieses Schema um auch offset_coordinate auf die y Spalte anzuwenden und speichere den Output dieser beiden Operationen als neue Spalten x_sim sowie y_sim. Die DataFrame zeckenstiche sollte danach wie folgt aussehen:

Musterlösung
zeckenstiche["x_sim"] = zeckenstiche["x"].apply(offset_coordinate)
zeckenstiche["y_sim"] = zeckenstiche["y"].apply(offset_coordinate)
zeckenstiche
NameError: name 'zeckenstiche' is not defined

Übung 9.4

In Übung 9.3 haben wir unsere Funktion offset_coordinate aufgerufen, ohne den Parameter distance zu spezifizieren. Dies war möglich, weil wir für distance einen Defaultwert festgelegt hatten (100 Meter). Wir können aber auch zusätzliche Parameter kommagetrennt nach der Funktion angeben. Dies sieht folgendermassen aus:

zeckenstiche["x"].apply(offset_coordinate, distance = 200)

Nutze diese Möglichkeit, um den Offset (distance) auf maximal 10 Meter zu reduzieren.

Musterlösung
zeckenstiche["x_sim"] = zeckenstiche["x"].apply(offset_coordinate, distance = 10)
zeckenstiche["y_sim"] = zeckenstiche["y"].apply(offset_coordinate, distance = 10)

Übung 9.5

Um die Original x/y-Werte sowie die simulierten Daten im gleichen Plot darzustellen, wird folgendermassen vorgegangen: Der erste Datensatz wird mit .plot() visualisiert, wobei der Output einer Variabel (z.B. basemap) zugewiesen wird. Danach wird der zweite Datensatz ebenfalls mit .plot() visualisiert, wobei auf den ersten Plot via dem Argument ax verwiesen wird.

Bei den roten Punkten handelt es sich um die Original-Zeckenstichen, bei den blauen um die simulierten (leicht verschoben) Zeckenstiche. Visualisiere deine eigenen Zeckenstiche auf diese Weise.

from matplotlib import pyplot as plt

basemap = zeckenstiche.plot("x", "y", kind = "scatter", color = "red")
zeckenstiche.plot("x_sim", "y_sim", kind = "scatter", ax = basemap, color = "blue")

plt.axis("equal")
ModuleNotFoundError: No module named 'matplotlib'