import pandas as pd
import random
def offset_coordinate(old, distance = 100):
= old + random.normalvariate(0, distance)
new return new
= pd.read_csv("data/zeckenstiche.csv") zeckenstiche
Übung 10
Für diese Übung brauchen wir
- Die Python-Module
pandas
sowierandom
- Die Funktion
offset_coordinate
aus Übung 9.5 - zeckenstiche.csv importiert als
pandas DataFrame
in 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.
Ü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
"test1"] = "test1"
zeckenstiche[
"test2"] = 10
zeckenstiche[
"test3"] = range(10) zeckenstiche[
# 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:
"x"].apply(offset_coordinate)
zeckenstiche[#\______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
"x_sim"] = zeckenstiche["x"].apply(offset_coordinate)
zeckenstiche["y_sim"] = zeckenstiche["y"].apply(offset_coordinate) zeckenstiche[
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:
"x"].apply(offset_coordinate, distance = 200) zeckenstiche[
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
= zeckenstiche.plot("x", "y", kind = "scatter", color = "red")
basemap "x_sim", "y_sim", kind = "scatter", ax = basemap, color = "blue")
zeckenstiche.plot(
"equal") plt.axis(
(np.float64(2681088.05),
np.float64(2681174.95),
np.float64(1250638.1171760987),
np.float64(1250740.1834372114))