Übung 10

Für diese Übung brauchen wir

  1. Die Python-Module pandas sowie random
  2. Die Funktion offset_coordinate aus Übung 9.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")

Ü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.

Ü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 ü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
ID accuracy x y x_sim y_sim
0 2550 439.128951 2681116 1250648 2.681232e+06 1.250747e+06
1 10437 301.748542 2681092 1250672 2.680961e+06 1.250613e+06
2 9174 301.748542 2681128 1250683 2.681053e+06 1.250678e+06
3 8773 301.748542 2681111 1250683 2.681087e+06 1.250616e+06
4 2764 301.748529 2681131 1250692 2.681091e+06 1.250899e+06
5 2513 301.748529 2681171 1250711 2.681210e+06 1.250682e+06
6 9185 301.748542 2681107 1250712 2.681163e+06 1.250478e+06
7 28521 301.748542 2681124 1250720 2.681236e+06 1.250811e+06
8 26745 301.748542 2681117 1250725 2.681157e+06 1.250571e+06
9 27391 301.748542 2681138 1250725 2.681169e+06 1.250636e+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.

Ü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(2681088.05),
 np.float64(2681174.95),
 np.float64(1250638.1171760987),
 np.float64(1250740.1834372114))