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")Übung 10
Für diese Übung brauchen wir
- Die Python-Module
pandassowierandom - Die Funktion
offset_coordinateaus Übung 9.5 - zeckenstiche.csv importiert als
pandas DataFramein der Variabelzeckenstiche
Übung 10.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 10.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| ID | accuracy | x | y | test1 | test2 | test3 | |
|---|---|---|---|---|---|---|---|
| 0 | 2550 | 439.128951 | 2681116 | 1250648 | test1 | 10 | 0 |
| 1 | 10437 | 301.748542 | 2681092 | 1250672 | test1 | 10 | 1 |
| 2 | 9174 | 301.748542 | 2681128 | 1250683 | test1 | 10 | 2 |
| 3 | 8773 | 301.748542 | 2681111 | 1250683 | test1 | 10 | 3 |
| 4 | 2764 | 301.748529 | 2681131 | 1250692 | test1 | 10 | 4 |
| 5 | 2513 | 301.748529 | 2681171 | 1250711 | test1 | 10 | 5 |
| 6 | 9185 | 301.748542 | 2681107 | 1250712 | test1 | 10 | 6 |
| 7 | 28521 | 301.748542 | 2681124 | 1250720 | test1 | 10 | 7 |
| 8 | 26745 | 301.748542 | 2681117 | 1250725 | test1 | 10 | 8 |
| 9 | 27391 | 301.748542 | 2681138 | 1250725 | test1 | 10 | 9 |
# unnötigen Spalten wieder entfernen:
del zeckenstiche['test1']
del zeckenstiche['test2']
del zeckenstiche['test3']Übung 10.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 übergebenVerwende 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| ID | accuracy | x | y | x_sim | y_sim | |
|---|---|---|---|---|---|---|
| 0 | 2550 | 439.128951 | 2681116 | 1250648 | 2.681032e+06 | 1.250680e+06 |
| 1 | 10437 | 301.748542 | 2681092 | 1250672 | 2.681296e+06 | 1.250750e+06 |
| 2 | 9174 | 301.748542 | 2681128 | 1250683 | 2.681251e+06 | 1.250768e+06 |
| 3 | 8773 | 301.748542 | 2681111 | 1250683 | 2.681143e+06 | 1.250853e+06 |
| 4 | 2764 | 301.748529 | 2681131 | 1250692 | 2.681105e+06 | 1.250767e+06 |
| 5 | 2513 | 301.748529 | 2681171 | 1250711 | 2.681315e+06 | 1.250709e+06 |
| 6 | 9185 | 301.748542 | 2681107 | 1250712 | 2.681278e+06 | 1.250676e+06 |
| 7 | 28521 | 301.748542 | 2681124 | 1250720 | 2.681235e+06 | 1.250489e+06 |
| 8 | 26745 | 301.748542 | 2681117 | 1250725 | 2.681172e+06 | 1.250640e+06 |
| 9 | 27391 | 301.748542 | 2681138 | 1250725 | 2.681162e+06 | 1.250572e+06 |
Übung 10.4
In Übung 10.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 10.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")(np.float64(2681086.76212888),
np.float64(2681189.168639887),
np.float64(1250643.9728175884),
np.float64(1250732.5708306462))
