GdW KW 46¶
Beispiele für einfache Python-Konstrukte.
tips.csv aus https://www.kaggle.com/jsphyg/tipping
Wir lesen den Datensatz tips.csv lediglich ein, um für Fingerübungen eine Quelle für ein paar Datenstrukturen zu haben.
Bibliotheken und Daten laden¶
Falls in der folgenden Zelle Fehler auftreten, ggf. vorher im Terminal ausführen:
conda install pandas numpy matplotlib
conda install seaborn
für seaborn siehe auch https://seaborn.pydata.org/installing.html:
pip install seaborn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from pandas import Series, DataFrame
Wir laden den Datensatz explizit aus der (hier von Kaggle bezogenen) csv-Datei:
df = pd.read_csv('tips.csv')
type(df)
pandas.core.frame.DataFrame
(Der Tips-Datensatz wäre auch Teil von Seaborn:)
df = sns.load_dataset("tips")
Explorative Datenanalyse (EDA)¶
df.head(3)
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
df.describe(include='all')
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
count | 244.000000 | 244.000000 | 244 | 244 | 244 | 244 | 244.000000 |
unique | NaN | NaN | 2 | 2 | 4 | 2 | NaN |
top | NaN | NaN | Male | No | Sat | Dinner | NaN |
freq | NaN | NaN | 157 | 151 | 87 | 176 | NaN |
mean | 19.785943 | 2.998279 | NaN | NaN | NaN | NaN | 2.569672 |
std | 8.902412 | 1.383638 | NaN | NaN | NaN | NaN | 0.951100 |
min | 3.070000 | 1.000000 | NaN | NaN | NaN | NaN | 1.000000 |
25% | 13.347500 | 2.000000 | NaN | NaN | NaN | NaN | 2.000000 |
50% | 17.795000 | 2.900000 | NaN | NaN | NaN | NaN | 2.000000 |
75% | 24.127500 | 3.562500 | NaN | NaN | NaN | NaN | 3.000000 |
max | 50.810000 | 10.000000 | NaN | NaN | NaN | NaN | 6.000000 |
EDA und so weiter: in höheren Semestern, in Mathematik etc.: Siehe z.B. https://www.kaggle.com/sanjanabasu/tips-dataset
Übung KW 45 GdW¶
Spaltennamen = df.columns.tolist()
Spaltennamen
['total_bill', 'tip', 'sex', 'smoker', 'day', 'time', 'size']
Rechnung = df['total_bill'].tolist()
display(type(Rechnung))
list
print(Rechnung)
[16.99, 10.34, 21.01, 23.68, 24.59, 25.29, 8.77, 26.88, 15.04, 14.78, 10.27, 35.26, 15.42, 18.43, 14.83, 21.58, 10.33, 16.29, 16.97, 20.65, 17.92, 20.29, 15.77, 39.42, 19.82, 17.81, 13.37, 12.69, 21.7, 19.65, 9.55, 18.35, 15.06, 20.69, 17.78, 24.06, 16.31, 16.93, 18.69, 31.27, 16.04, 17.46, 13.94, 9.68, 30.4, 18.29, 22.23, 32.4, 28.55, 18.04, 12.54, 10.29, 34.81, 9.94, 25.56, 19.49, 38.01, 26.41, 11.24, 48.27, 20.29, 13.81, 11.02, 18.29, 17.59, 20.08, 16.45, 3.07, 20.23, 15.01, 12.02, 17.07, 26.86, 25.28, 14.73, 10.51, 17.92, 27.2, 22.76, 17.29, 19.44, 16.66, 10.07, 32.68, 15.98, 34.83, 13.03, 18.28, 24.71, 21.16, 28.97, 22.49, 5.75, 16.32, 22.75, 40.17, 27.28, 12.03, 21.01, 12.46, 11.35, 15.38, 44.3, 22.42, 20.92, 15.36, 20.49, 25.21, 18.24, 14.31, 14.0, 7.25, 38.07, 23.95, 25.71, 17.31, 29.93, 10.65, 12.43, 24.08, 11.69, 13.42, 14.26, 15.95, 12.48, 29.8, 8.52, 14.52, 11.38, 22.82, 19.08, 20.27, 11.17, 12.26, 18.26, 8.51, 10.33, 14.15, 16.0, 13.16, 17.47, 34.3, 41.19, 27.05, 16.43, 8.35, 18.64, 11.87, 9.78, 7.51, 14.07, 13.13, 17.26, 24.55, 19.77, 29.85, 48.17, 25.0, 13.39, 16.49, 21.5, 12.66, 16.21, 13.81, 17.51, 24.52, 20.76, 31.71, 10.59, 10.63, 50.81, 15.81, 7.25, 31.85, 16.82, 32.9, 17.89, 14.48, 9.6, 34.63, 34.65, 23.33, 45.35, 23.17, 40.55, 20.69, 20.9, 30.46, 18.15, 23.1, 15.69, 19.81, 28.44, 15.48, 16.58, 7.56, 10.34, 43.11, 13.0, 13.51, 18.71, 12.74, 13.0, 16.4, 20.53, 16.47, 26.59, 38.73, 24.27, 12.76, 30.06, 25.89, 48.33, 13.27, 28.17, 12.9, 28.15, 11.59, 7.74, 30.14, 12.16, 13.42, 8.58, 15.98, 13.42, 16.27, 10.09, 20.45, 13.28, 22.12, 24.01, 15.69, 11.61, 10.77, 15.53, 10.07, 12.6, 32.83, 35.83, 29.03, 27.18, 22.67, 17.82, 18.78]
Aufgabe: Wie viele Rechnungen haben wir?¶
XXXXXX
244
Aufgabe: Die Rechnungswerte sortiert¶
RechnungSortiert = XXXXXXXXXX
print(RechnungSortiert)
[3.07, 5.75, 7.25, 7.25, 7.51, 7.56, 7.74, 8.35, 8.51, 8.52, 8.58, 8.77, 9.55, 9.6, 9.68, 9.78, 9.94, 10.07, 10.07, 10.09, 10.27, 10.29, 10.33, 10.33, 10.34, 10.34, 10.51, 10.59, 10.63, 10.65, 10.77, 11.02, 11.17, 11.24, 11.35, 11.38, 11.59, 11.61, 11.69, 11.87, 12.02, 12.03, 12.16, 12.26, 12.43, 12.46, 12.48, 12.54, 12.6, 12.66, 12.69, 12.74, 12.76, 12.9, 13.0, 13.0, 13.03, 13.13, 13.16, 13.27, 13.28, 13.37, 13.39, 13.42, 13.42, 13.42, 13.51, 13.81, 13.81, 13.94, 14.0, 14.07, 14.15, 14.26, 14.31, 14.48, 14.52, 14.73, 14.78, 14.83, 15.01, 15.04, 15.06, 15.36, 15.38, 15.42, 15.48, 15.53, 15.69, 15.69, 15.77, 15.81, 15.95, 15.98, 15.98, 16.0, 16.04, 16.21, 16.27, 16.29, 16.31, 16.32, 16.4, 16.43, 16.45, 16.47, 16.49, 16.58, 16.66, 16.82, 16.93, 16.97, 16.99, 17.07, 17.26, 17.29, 17.31, 17.46, 17.47, 17.51, 17.59, 17.78, 17.81, 17.82, 17.89, 17.92, 17.92, 18.04, 18.15, 18.24, 18.26, 18.28, 18.29, 18.29, 18.35, 18.43, 18.64, 18.69, 18.71, 18.78, 19.08, 19.44, 19.49, 19.65, 19.77, 19.81, 19.82, 20.08, 20.23, 20.27, 20.29, 20.29, 20.45, 20.49, 20.53, 20.65, 20.69, 20.69, 20.76, 20.9, 20.92, 21.01, 21.01, 21.16, 21.5, 21.58, 21.7, 22.12, 22.23, 22.42, 22.49, 22.67, 22.75, 22.76, 22.82, 23.1, 23.17, 23.33, 23.68, 23.95, 24.01, 24.06, 24.08, 24.27, 24.52, 24.55, 24.59, 24.71, 25.0, 25.21, 25.28, 25.29, 25.56, 25.71, 25.89, 26.41, 26.59, 26.86, 26.88, 27.05, 27.18, 27.2, 27.28, 28.15, 28.17, 28.44, 28.55, 28.97, 29.03, 29.8, 29.85, 29.93, 30.06, 30.14, 30.4, 30.46, 31.27, 31.71, 31.85, 32.4, 32.68, 32.83, 32.9, 34.3, 34.63, 34.65, 34.81, 34.83, 35.26, 35.83, 38.01, 38.07, 38.73, 39.42, 40.17, 40.55, 41.19, 43.11, 44.3, 45.35, 48.17, 48.27, 48.33, 50.81]
Aufgabe: Drucke die kleinsten (resp. größten) 5 Beträge aus RechnungSortiert¶
print(XXXXXXX)
print(XXXXXXX)
[3.07, 5.75, 7.25, 7.25, 7.51]
[45.35, 48.17, 48.27, 48.33, 50.81]
Basis-Statistiken¶
Berechne für die Liste Rechnung
:
Mittelwert (auch Erwartungswert, Schwerpunkt der Verteilung): Summe aller Rechnungen geteilt durch Anzahl
Median: nicht der Mittelwert der Liste, sondern der Wert des mittleren Elements der sortierten Liste
durchschnittliches Abweichungsquadrat (auch Stichprobenvarianz, empirische Varianz): Durchschnitt aller quadrierten Abweichungen vom Mittelwert, https://de.wikipedia.org/wiki/Empirische_Varianz
Standardabweichung: Quadratwurzel der Varianz
Aufgabe: Mittelwert¶
Mittelwert = XXXXXXXXXXX
Mittelwert
19.785942622950824
Aufgabe: Median¶
Median = XXXXXXXXX
Median
17.81
Aufgabe: Varianz¶
SummeQuadrierteAbweichungen = 0
for XXXXXXXX :
XXXXXX
Varianz = XXXXXX
display(Varianz)
78.92813148851113
Aufgabe: Standardabweichung¶
Standardabweichung = XXXXXXX
display(Standardabweichung)
8.88415057777113
Vergleichen Sie ihre Ergebnisse mit der Ausgabe von df.describe()
oben: Was fällt Ihnen auf?
Aufgabe: Funktion Basisstatistiken
¶
Definiere eine Funktion Basisstatistiken
, die den Mittelwert und die Standardabweichung einer Liste von Zahlen zurückgibt.
def Basisstatistiken(Zahlenliste):
...
Umsätze nach Wochentagen¶
SpalteWochentage = df.day.tolist()
Wochentage = set(SpalteWochentage)
Wochentage
{'Fri', 'Sat', 'Sun', 'Thur'}
UmsaetzeWochentage = { day: {'Umsaetze': df.loc[df.day==day].total_bill.tolist() }
for day in Wochentage }
print(UmsaetzeWochentage)
{'Sat': {'Umsaetze': [20.65, 17.92, 20.29, 15.77, 39.42, 19.82, 17.81, 13.37, 12.69, 21.7, 19.65, 9.55, 18.35, 15.06, 20.69, 17.78, 24.06, 16.31, 16.93, 18.69, 31.27, 16.04, 38.01, 26.41, 11.24, 48.27, 20.29, 13.81, 11.02, 18.29, 17.59, 20.08, 16.45, 3.07, 20.23, 15.01, 12.02, 17.07, 26.86, 25.28, 14.73, 10.51, 17.92, 44.3, 22.42, 20.92, 15.36, 20.49, 25.21, 18.24, 14.31, 14.0, 7.25, 10.59, 10.63, 50.81, 15.81, 26.59, 38.73, 24.27, 12.76, 30.06, 25.89, 48.33, 13.27, 28.17, 12.9, 28.15, 11.59, 7.74, 30.14, 20.45, 13.28, 22.12, 24.01, 15.69, 11.61, 10.77, 15.53, 10.07, 12.6, 32.83, 35.83, 29.03, 27.18, 22.67, 17.82]}, 'Fri': {'Umsaetze': [28.97, 22.49, 5.75, 16.32, 22.75, 40.17, 27.28, 12.03, 21.01, 12.46, 11.35, 15.38, 12.16, 13.42, 8.58, 15.98, 13.42, 16.27, 10.09]}, 'Thur': {'Umsaetze': [27.2, 22.76, 17.29, 19.44, 16.66, 10.07, 32.68, 15.98, 34.83, 13.03, 18.28, 24.71, 21.16, 10.65, 12.43, 24.08, 11.69, 13.42, 14.26, 15.95, 12.48, 29.8, 8.52, 14.52, 11.38, 22.82, 19.08, 20.27, 11.17, 12.26, 18.26, 8.51, 10.33, 14.15, 16.0, 13.16, 17.47, 34.3, 41.19, 27.05, 16.43, 8.35, 18.64, 11.87, 9.78, 7.51, 19.81, 28.44, 15.48, 16.58, 7.56, 10.34, 43.11, 13.0, 13.51, 18.71, 12.74, 13.0, 16.4, 20.53, 16.47, 18.78]}, 'Sun': {'Umsaetze': [16.99, 10.34, 21.01, 23.68, 24.59, 25.29, 8.77, 26.88, 15.04, 14.78, 10.27, 35.26, 15.42, 18.43, 14.83, 21.58, 10.33, 16.29, 16.97, 17.46, 13.94, 9.68, 30.4, 18.29, 22.23, 32.4, 28.55, 18.04, 12.54, 10.29, 34.81, 9.94, 25.56, 19.49, 38.07, 23.95, 25.71, 17.31, 29.93, 14.07, 13.13, 17.26, 24.55, 19.77, 29.85, 48.17, 25.0, 13.39, 16.49, 21.5, 12.66, 16.21, 13.81, 17.51, 24.52, 20.76, 31.71, 7.25, 31.85, 16.82, 32.9, 17.89, 14.48, 9.6, 34.63, 34.65, 23.33, 45.35, 23.17, 40.55, 20.69, 20.9, 30.46, 18.15, 23.1, 15.69]}}
UmsaetzeWochentage
ist ein Dictionary, dessen Werte selbst wiederum aus einem Dictionary und Listen bestehen.
Gesucht: Ergänzung dieser Datenstruktur um durchschnittlicherTagesumsatz
für jeden Tag.
for Tag in UmsaetzeWochentage:
TagUmsaetze = UmsaetzeWochentage[Tag]['Umsaetze']
UmsaetzeWochentage[Tag]['durchschnittlicherTagesumsatz'] = round(sum(TagUmsaetze) / len(TagUmsaetze), 2)
print(UmsaetzeWochentage['Fri'])
{'Umsaetze': [28.97, 22.49, 5.75, 16.32, 22.75, 40.17, 27.28, 12.03, 21.01, 12.46, 11.35, 15.38, 12.16, 13.42, 8.58, 15.98, 13.42, 16.27, 10.09], 'durchschnittlicherTagesumsatz': 17.15}
UmsaetzeWochentage['Fri']['durchschnittlicherTagesumsatz']
17.15