Übungsaufgaben zur Lektion 3

Vorab

Eine Anleitung für die Bearbeitung und Abgabe der Übunsgaufgaben in Python findet Ihr im Abgabebereich des Moodlekurses ( Link ).

Kurzform: Eine Aufgabe besteht immer aus einer "Funktion", die für einen definierten Input (Argumente) einen definierten Output zurückgeben soll (engl.: return). Überprüft die Korrektheit dieses Outputs und damit Eurer Lösung mit testme(funktionsname). Wenn Ihr fertig seid, erzeugt unter im Abschnitt Gesamtauswertung Euer Zertifikat und gebt es dann in Moodle zusammen mit diesem Notebook ab.

Hier ein Beispiel für eine Funktion: Die Funktion heißt beispiel, hat die Argumente (den Input) x und y und gibt die Variable ergebnis zurück. Das Ergebnis ist in diesem Fall die Summe der Argumente x und y.

In [ ]:
def beispiel(x, y):
    ergebnis = x + y
    return(ergebnis)
In [ ]:
beispiel(1,1)
In [ ]:
beispiel(2,-3)

Testzentrum importieren!

Damit die Tests bei Euch laufen, müsst Ihr folgende Zeile ausführen. Und dann geht es los!

In [ ]:
from testzentrum import *

Weitere benötigte Pakete importieren

In [ ]:
import pandas as pd

Datenumfang

Die Funktion eintraege soll ausgeben, wie viele Einträge ein Dataframe df insgesamt hat. Erweitert sie entsprechend.

Hinweis: Mit "Einträge" sind hier die Äquivalente zu "Zellen" einer Tabelle gemeint.

In [ ]:
def eintraege(df):
    pass
In [ ]:
testme(eintraege)

Von Anfang ...

Erweitert die Funktion erster so, dass sie den ersten Eintrag eines Dataframes df ausgibt - also den Eintrag, der in der ersten Spalte in der ersten Zeile steht. Nutzt dafür iloc.

In [ ]:
def erster(df):
    pass
In [ ]:
testme(erster)

...bis Ende

Die Funktion letzter soll den letzten Eintrag der Spalte spalte des Dataframes df zurückgeben. Achtung: Das scheint eigentlich trivial, ist aber ein bisschen tricky. In pandas spricht man einzelne Zeilen eines DataFrame mit dem eingebauten Zeilenindex (DataFrame.index) und .loc[...] an.

Den dritten Eintrag der Spalte temp des DataFrame df wählt man also wie folgt aus:

# Python-Indizierung beachten: erster Index ist die 0!
df.loc[df.index[2],"temp"]

Den letzten Eintrag einer Liste oder eines Arrays wählt kann man übrigens mit dem Index -1 auswählen. Praktisch!

# Beispiel anhand einer Liste
>>> a = [2,5,9,6]
>>> a[-1]
6

Tja, warum einfach, wenn's auch kompliziert geht. Also nochmal: Gibt den letzten Eintrag der Spalte spalte zurück. Kriegst Du das hin?

In [ ]:
def letzter(df, spalte):
    pass
In [ ]:
testme(letzter)

Mittelmäßig

Die Funktion mittelmass soll den Median (median) der Spalte spalte des Dataframes df zurückgeben.

Achtung: Wenn der Spaltenname als Funktionsargument (also als Variable) übergeben wird, erfolgt der Zugriff mit df[spalte]. Der Ausdruck df.spalte hingegen funktioniert dann nicht.

In [ ]:
def mittelmass(df, spalte):
    pass
In [ ]:
testme(mittelmass)

Was fehlt?

Bevor man Berechnungen anstellt, kann es sinnvoll sein zu überprüfen, ob denn überhaupt in jeder Zelle ein gültiger Wert vorhanden ist. Die Funktion fehlend soll daher die Anzahl an NaN-Einträgen in einer bestimmten Spalte spalte eines Dataframes df zurückgeben. Macht Euch dafür die Funktion pandas.DataFrame.isna zunutze.

Hinweis: Überlegt euch, was passiert, wenn man True und False Werte addiert...

In [ ]:
def fehlend(df, spalte):
    pass
In [ ]:
testme(fehlend)

Ein Teil reicht

Aus einem DataFrame wollen wir Zeilen auswählen, in denen die Spalte spalte bestimmte Bedingungen erfüllt: Die Werte der Spalte spalte sollen größer als xmin und kleiner als xmax sein. Wir wählen nun zunächst alle Zeilen des DataFrame df aus, die diese Bedingung erfüllen. Die Funktion teilmenge soll dann die Menge der Elemente in dieser Auswahl zurückgeben (also die Zahl der verbleibende Zeilen mal der Zahl der Spalten).

Hinweis: Für die Auswahl der Zeilen verwendet Ihr die Syntax df.loc[condition]. Mal ein Beispiel:

condition = (df[spalte] > 5) & (df[spalte] < 99)
df_auswahl = df.loc[condition]
...

Schaut genau hin: Die Einzelbedingungen müssen in Klammern gefasst werden, bevor sie über das logische & verknüpft werden.

In [ ]:
def teilmenge(df, spalte, xmin, xmax):
    pass
In [ ]:
testme(teilmenge)

Im schatt'gen Walde, wie auf lichter Flur

Wir nutzen nun einen DataFrame df mit zwei Spalten: Die erste Spalte standort spezifiziert die Landnutzung am Standort (also z.B. "Wald", "Wiese"), die zweite Spalte temp enthält die gemessene Lufttemperatur.

Nun interessiert uns aus einem großen Datensatz der Mittelwert der Temperatur (Spalte temp), die an Standorten (Spalte standort) mit einer bestimmten Landnutzung lanu gemessen wurden. Wir müssen also zunächst diejenigen Zeilen von df auswählen, in denen die Spalte standort den Wert lanu annimmt. Für die verbleibenden Zeilen ermitteln wir den Mittelwert der Spalte temp und runden diesen auf zwei Dezimalstellen. Hinweis: Der Befehl zur Rundung eines Wertes x auf zwei Nachkommastellen lautet round(x, 2). Den gerundeten Mittelwert gibst Du schließlich mit return zurück.

In [ ]:
def mitteltemp(df, lanu):
    pass
In [ ]:
testme(mitteltemp)

Auf Jahr und Tag

Der DataFrame df enthält zwei Spalten: Die Spalte datum enthält das Datum der Messwerte in der Spalte messung. Das Datumsformat ist %d.%m.%Y, also z.B. "09.11.1989" für den Tag des Mauerfalls. Nutze in der Funktion aufjahrundtag zunächst die Spalte datum, um einen datetime-Index für den DataFrame zu erzeugen. Die Funktion soll dann den Messwert zurückgeben, der für ein Datum ondate in der Spalte messung steht.

Hinweis: Die Erzeugung eines datetime-Index findet Ihr im Notebook zur Säkularstation. Hier nochmal der prinzipielle Ablauf:

df["datum"] = pd.to_datetime(df["datum"], format=...)
df = df.set_index("datum")

Die Auswahl erfolgt dann wieder mittels df.loc[...]

In [ ]:
def aufjahrundtag(df, ondate):
    pass
In [ ]:
testme(aufjahrundtag)

Gesamtauswertung

In [ ]:
get_certificate(testmysolutions=[eintraege, erster, letzter, mittelmass, fehlend, teilmenge, mitteltemp, aufjahrundtag],
                lesson=3)
In [ ]: