Woche 07#
Wir arbeiten mit einer externen csv
-Datei. Die heißt immer gleich:
file_path = "Schuhgroesse_Kinder_Erwachsene_Daten.csv"
CSV Datei schreiben#
sg_txt = """Erhebungsdatum,Alter,Geschlecht,Körpergröße (cm),Gewicht (kg),Schuhgröße
2024-11-01,3,weiblich,95,14,22
2024-11-02,7,männlich,120,24,32
2024-11-03,5,weiblich,105,18,28
2024-11-04,10,männlich,140,35,36
2024-11-05,1,weiblich,75,10,18
2024-11-06,16,männlich,160,50,40
2024-11-07,8,weiblich,130,28,34
2024-11-08,12,männlich,150,42,38
2024-11-09,14,weiblich,155,48,39
2024-11-10,9,männlich,135,32,35
2024-11-11,25,weiblich,165,55,38
2024-11-12,34,männlich,175,75,42
2024-11-13,45,weiblich,168,70,39
2024-11-14,50,männlich,180,85,44
2024-11-15,29,weiblich,160,60,37
2024-11-16,32,männlich,172,68,41
2024-11-17,40,weiblich,158,65,38
2024-11-18,28,männlich,178,72,43
2024-11-19,55,weiblich,162,62,39
2024-11-20,38,männlich,185,80,45
"""
sg_txt
'Erhebungsdatum,Alter,Geschlecht,Körpergröße (cm),Gewicht (kg),Schuhgröße\n2024-11-01,3,weiblich,95,14,22\n2024-11-02,7,männlich,120,24,32\n2024-11-03,5,weiblich,105,18,28\n2024-11-04,10,männlich,140,35,36\n2024-11-05,1,weiblich,75,10,18\n2024-11-06,16,männlich,160,50,40\n2024-11-07,8,weiblich,130,28,34\n2024-11-08,12,männlich,150,42,38\n2024-11-09,14,weiblich,155,48,39\n2024-11-10,9,männlich,135,32,35\n2024-11-11,25,weiblich,165,55,38\n2024-11-12,34,männlich,175,75,42\n2024-11-13,45,weiblich,168,70,39\n2024-11-14,50,männlich,180,85,44\n2024-11-15,29,weiblich,160,60,37\n2024-11-16,32,männlich,172,68,41\n2024-11-17,40,weiblich,158,65,38\n2024-11-18,28,männlich,178,72,43\n2024-11-19,55,weiblich,162,62,39\n2024-11-20,38,männlich,185,80,45\n'
# wo im Dateisystem befinden wir uns?
import os
os.getcwd()
'/media/sf_abc123/l/LA_2024_ws/python-101/md'
with open(file_path, 'w') as file:
file.write(sg_txt)
CSV-Datei als Text einlesen#
with open(file_path, 'r') as file:
sg_txt_2 = file.read()
sg_txt_2
'Erhebungsdatum,Alter,Geschlecht,Körpergröße (cm),Gewicht (kg),Schuhgröße\n2024-11-01,3,weiblich,95,14,22\n2024-11-02,7,männlich,120,24,32\n2024-11-03,5,weiblich,105,18,28\n2024-11-04,10,männlich,140,35,36\n2024-11-05,1,weiblich,75,10,18\n2024-11-06,16,männlich,160,50,40\n2024-11-07,8,weiblich,130,28,34\n2024-11-08,12,männlich,150,42,38\n2024-11-09,14,weiblich,155,48,39\n2024-11-10,9,männlich,135,32,35\n2024-11-11,25,weiblich,165,55,38\n2024-11-12,34,männlich,175,75,42\n2024-11-13,45,weiblich,168,70,39\n2024-11-14,50,männlich,180,85,44\n2024-11-15,29,weiblich,160,60,37\n2024-11-16,32,männlich,172,68,41\n2024-11-17,40,weiblich,158,65,38\n2024-11-18,28,männlich,178,72,43\n2024-11-19,55,weiblich,162,62,39\n2024-11-20,38,männlich,185,80,45\n'
Es ist egal, ob wir mit sg_txt
oder sg_txt_2
weiterarbeiten:
# Test
sg_txt == sg_txt_2
True
In Zeilen aufsplitten:
sg_txt_lines = sg_txt.split("\n")
sg_txt_lines
['Erhebungsdatum,Alter,Geschlecht,Körpergröße (cm),Gewicht (kg),Schuhgröße',
'2024-11-01,3,weiblich,95,14,22',
'2024-11-02,7,männlich,120,24,32',
'2024-11-03,5,weiblich,105,18,28',
'2024-11-04,10,männlich,140,35,36',
'2024-11-05,1,weiblich,75,10,18',
'2024-11-06,16,männlich,160,50,40',
'2024-11-07,8,weiblich,130,28,34',
'2024-11-08,12,männlich,150,42,38',
'2024-11-09,14,weiblich,155,48,39',
'2024-11-10,9,männlich,135,32,35',
'2024-11-11,25,weiblich,165,55,38',
'2024-11-12,34,männlich,175,75,42',
'2024-11-13,45,weiblich,168,70,39',
'2024-11-14,50,männlich,180,85,44',
'2024-11-15,29,weiblich,160,60,37',
'2024-11-16,32,männlich,172,68,41',
'2024-11-17,40,weiblich,158,65,38',
'2024-11-18,28,männlich,178,72,43',
'2024-11-19,55,weiblich,162,62,39',
'2024-11-20,38,männlich,185,80,45',
'']
die Zeilen nach “,” aufsplitten:
sg_txt_rowlists = [ line.split(",") for line in sg_txt_lines ]
sg_txt_rowlists
[['Erhebungsdatum',
'Alter',
'Geschlecht',
'Körpergröße (cm)',
'Gewicht (kg)',
'Schuhgröße'],
['2024-11-01', '3', 'weiblich', '95', '14', '22'],
['2024-11-02', '7', 'männlich', '120', '24', '32'],
['2024-11-03', '5', 'weiblich', '105', '18', '28'],
['2024-11-04', '10', 'männlich', '140', '35', '36'],
['2024-11-05', '1', 'weiblich', '75', '10', '18'],
['2024-11-06', '16', 'männlich', '160', '50', '40'],
['2024-11-07', '8', 'weiblich', '130', '28', '34'],
['2024-11-08', '12', 'männlich', '150', '42', '38'],
['2024-11-09', '14', 'weiblich', '155', '48', '39'],
['2024-11-10', '9', 'männlich', '135', '32', '35'],
['2024-11-11', '25', 'weiblich', '165', '55', '38'],
['2024-11-12', '34', 'männlich', '175', '75', '42'],
['2024-11-13', '45', 'weiblich', '168', '70', '39'],
['2024-11-14', '50', 'männlich', '180', '85', '44'],
['2024-11-15', '29', 'weiblich', '160', '60', '37'],
['2024-11-16', '32', 'männlich', '172', '68', '41'],
['2024-11-17', '40', 'weiblich', '158', '65', '38'],
['2024-11-18', '28', 'männlich', '178', '72', '43'],
['2024-11-19', '55', 'weiblich', '162', '62', '39'],
['2024-11-20', '38', 'männlich', '185', '80', '45'],
['']]
Aufgabe: Stellen Sie obige Copreension “konventionell” dar!
sg_txt_rowlists = []
for line in sg_txt_lines:
#print(f"{line=}")
z = line.split(",")
#print(z)
sg_txt_rowlists.append(z)
sg_txt_rowlists
[['Erhebungsdatum',
'Alter',
'Geschlecht',
'Körpergröße (cm)',
'Gewicht (kg)',
'Schuhgröße'],
['2024-11-01', '3', 'weiblich', '95', '14', '22'],
['2024-11-02', '7', 'männlich', '120', '24', '32'],
['2024-11-03', '5', 'weiblich', '105', '18', '28'],
['2024-11-04', '10', 'männlich', '140', '35', '36'],
['2024-11-05', '1', 'weiblich', '75', '10', '18'],
['2024-11-06', '16', 'männlich', '160', '50', '40'],
['2024-11-07', '8', 'weiblich', '130', '28', '34'],
['2024-11-08', '12', 'männlich', '150', '42', '38'],
['2024-11-09', '14', 'weiblich', '155', '48', '39'],
['2024-11-10', '9', 'männlich', '135', '32', '35'],
['2024-11-11', '25', 'weiblich', '165', '55', '38'],
['2024-11-12', '34', 'männlich', '175', '75', '42'],
['2024-11-13', '45', 'weiblich', '168', '70', '39'],
['2024-11-14', '50', 'männlich', '180', '85', '44'],
['2024-11-15', '29', 'weiblich', '160', '60', '37'],
['2024-11-16', '32', 'männlich', '172', '68', '41'],
['2024-11-17', '40', 'weiblich', '158', '65', '38'],
['2024-11-18', '28', 'männlich', '178', '72', '43'],
['2024-11-19', '55', 'weiblich', '162', '62', '39'],
['2024-11-20', '38', 'männlich', '185', '80', '45'],
['']]
CSV-Datei mit Pandas einlesen#
import pandas as pd
sg_df = pd.read_csv(file_path)
sg_df.tail()
Erhebungsdatum | Alter | Geschlecht | Körpergröße (cm) | Gewicht (kg) | Schuhgröße | |
---|---|---|---|---|---|---|
15 | 2024-11-16 | 32 | männlich | 172 | 68 | 41 |
16 | 2024-11-17 | 40 | weiblich | 158 | 65 | 38 |
17 | 2024-11-18 | 28 | männlich | 178 | 72 | 43 |
18 | 2024-11-19 | 55 | weiblich | 162 | 62 | 39 |
19 | 2024-11-20 | 38 | männlich | 185 | 80 | 45 |
sg_df.describe()
Alter | Körpergröße (cm) | Gewicht (kg) | Schuhgröße | |
---|---|---|---|---|
count | 20.000000 | 20.000000 | 20.000000 | 20.000000 |
mean | 23.050000 | 148.400000 | 49.650000 | 36.400000 |
std | 16.737839 | 30.130244 | 23.109066 | 6.931241 |
min | 1.000000 | 75.000000 | 10.000000 | 18.000000 |
25% | 8.750000 | 133.750000 | 31.000000 | 34.750000 |
50% | 20.500000 | 159.000000 | 52.500000 | 38.000000 |
75% | 35.000000 | 169.000000 | 68.500000 | 40.250000 |
max | 55.000000 | 185.000000 | 85.000000 | 45.000000 |
pandas df nach numpy#
sg_df
in eine numpy
-Matrix umwandeln:
sg_df_np = sg_df.values
sg_df_np
array([['2024-11-01', 3, 'weiblich', 95, 14, 22],
['2024-11-02', 7, 'männlich', 120, 24, 32],
['2024-11-03', 5, 'weiblich', 105, 18, 28],
['2024-11-04', 10, 'männlich', 140, 35, 36],
['2024-11-05', 1, 'weiblich', 75, 10, 18],
['2024-11-06', 16, 'männlich', 160, 50, 40],
['2024-11-07', 8, 'weiblich', 130, 28, 34],
['2024-11-08', 12, 'männlich', 150, 42, 38],
['2024-11-09', 14, 'weiblich', 155, 48, 39],
['2024-11-10', 9, 'männlich', 135, 32, 35],
['2024-11-11', 25, 'weiblich', 165, 55, 38],
['2024-11-12', 34, 'männlich', 175, 75, 42],
['2024-11-13', 45, 'weiblich', 168, 70, 39],
['2024-11-14', 50, 'männlich', 180, 85, 44],
['2024-11-15', 29, 'weiblich', 160, 60, 37],
['2024-11-16', 32, 'männlich', 172, 68, 41],
['2024-11-17', 40, 'weiblich', 158, 65, 38],
['2024-11-18', 28, 'männlich', 178, 72, 43],
['2024-11-19', 55, 'weiblich', 162, 62, 39],
['2024-11-20', 38, 'männlich', 185, 80, 45]], dtype=object)
type(sg_df_np)
numpy.ndarray
numpy array nach Python nativ:
sg_df_np.tolist()
[['2024-11-01', 3, 'weiblich', 95, 14, 22],
['2024-11-02', 7, 'männlich', 120, 24, 32],
['2024-11-03', 5, 'weiblich', 105, 18, 28],
['2024-11-04', 10, 'männlich', 140, 35, 36],
['2024-11-05', 1, 'weiblich', 75, 10, 18],
['2024-11-06', 16, 'männlich', 160, 50, 40],
['2024-11-07', 8, 'weiblich', 130, 28, 34],
['2024-11-08', 12, 'männlich', 150, 42, 38],
['2024-11-09', 14, 'weiblich', 155, 48, 39],
['2024-11-10', 9, 'männlich', 135, 32, 35],
['2024-11-11', 25, 'weiblich', 165, 55, 38],
['2024-11-12', 34, 'männlich', 175, 75, 42],
['2024-11-13', 45, 'weiblich', 168, 70, 39],
['2024-11-14', 50, 'männlich', 180, 85, 44],
['2024-11-15', 29, 'weiblich', 160, 60, 37],
['2024-11-16', 32, 'männlich', 172, 68, 41],
['2024-11-17', 40, 'weiblich', 158, 65, 38],
['2024-11-18', 28, 'männlich', 178, 72, 43],
['2024-11-19', 55, 'weiblich', 162, 62, 39],
['2024-11-20', 38, 'männlich', 185, 80, 45]]
pandas df direkt in eine native Python-Datenstruktur#
# manchmal benötigt man es auch spaltenweise
sg_df_orientindex = sg_df.to_dict(orient='index')
type(sg_df_orientindex)
dict
sg_df_orientindex[0]
{'Erhebungsdatum': '2024-11-01',
'Alter': 3,
'Geschlecht': 'weiblich',
'Körpergröße (cm)': 95,
'Gewicht (kg)': 14,
'Schuhgröße': 22}
type(sg_df_orientindex[0])
dict
sg_df_orientindex[0]["Körpergröße (cm)"]
95
# manchmal benötigt man die Daten auch spaltenweise
sg_df_orientlist = sg_df.to_dict(orient='list')
print(sg_df_orientlist)
{'Erhebungsdatum': ['2024-11-01', '2024-11-02', '2024-11-03', '2024-11-04', '2024-11-05', '2024-11-06', '2024-11-07', '2024-11-08', '2024-11-09', '2024-11-10', '2024-11-11', '2024-11-12', '2024-11-13', '2024-11-14', '2024-11-15', '2024-11-16', '2024-11-17', '2024-11-18', '2024-11-19', '2024-11-20'], 'Alter': [3, 7, 5, 10, 1, 16, 8, 12, 14, 9, 25, 34, 45, 50, 29, 32, 40, 28, 55, 38], 'Geschlecht': ['weiblich', 'männlich', 'weiblich', 'männlich', 'weiblich', 'männlich', 'weiblich', 'männlich', 'weiblich', 'männlich', 'weiblich', 'männlich', 'weiblich', 'männlich', 'weiblich', 'männlich', 'weiblich', 'männlich', 'weiblich', 'männlich'], 'Körpergröße (cm)': [95, 120, 105, 140, 75, 160, 130, 150, 155, 135, 165, 175, 168, 180, 160, 172, 158, 178, 162, 185], 'Gewicht (kg)': [14, 24, 18, 35, 10, 50, 28, 42, 48, 32, 55, 75, 70, 85, 60, 68, 65, 72, 62, 80], 'Schuhgröße': [22, 32, 28, 36, 18, 40, 34, 38, 39, 35, 38, 42, 39, 44, 37, 41, 38, 43, 39, 45]}
sg_df_orientlist.keys()
dict_keys(['Erhebungsdatum', 'Alter', 'Geschlecht', 'Körpergröße (cm)', 'Gewicht (kg)', 'Schuhgröße'])
print(sg_df_orientlist["Körpergröße (cm)"])
[95, 120, 105, 140, 75, 160, 130, 150, 155, 135, 165, 175, 168, 180, 160, 172, 158, 178, 162, 185]
k = sg_df_orientlist["Körpergröße (cm)"]
print(k)
[95, 120, 105, 140, 75, 160, 130, 150, 155, 135, 165, 175, 168, 180, 160, 172, 158, 178, 162, 185]
min(k), max(k), sum(k), len(k), sum(k) / len(k)
(75, 185, 2968, 20, 148.4)
f"{min(k)=}, {max(k)=}, {sum(k)=}, {len(k)=}; avg: {sum(k)/len(k)=}"
'min(k)=75, max(k)=185, sum(k)=2968, len(k)=20; avg: sum(k)/len(k)=148.4'
durchschnitt = sum(k) / len(k)
durchschnitt
148.4
sg_df_orientlist.keys()
dict_keys(['Erhebungsdatum', 'Alter', 'Geschlecht', 'Körpergröße (cm)', 'Gewicht (kg)', 'Schuhgröße'])
alle_spalten_mit_numerischen_werten = []
for s in sg_df_orientlist.keys():
#print(f"{s=}")
#print(f"{type(sg_df_orientlist[s][0])=}")
ersteselement = sg_df_orientlist[s][0]
if isinstance(ersteselement, int):
print("es ist ein int!")
alle_spalten_mit_numerischen_werten.append(s)
else:
print(f"kein int, schade, sondern ein {type(ersteselement)=}")
alle_spalten_mit_numerischen_werten
kein int, schade, sondern ein type(ersteselement)=<class 'str'>
es ist ein int!
kein int, schade, sondern ein type(ersteselement)=<class 'str'>
es ist ein int!
es ist ein int!
es ist ein int!
['Alter', 'Körpergröße (cm)', 'Gewicht (kg)', 'Schuhgröße']
alle_spalten_mit_numerischen_werten = [ s for s in sg_df_orientlist.keys() if isinstance(sg_df_orientlist[s][0], int) ]
alle_spalten_mit_numerischen_werten
['Alter', 'Körpergröße (cm)', 'Gewicht (kg)', 'Schuhgröße']
Statistiken = {}
for spalte in alle_spalten_mit_numerischen_werten: # ["Körpergröße (cm)", "Gewicht (kg)" ]
k = sg_df_orientlist[spalte]
#print( min(k), max(k), sum(k), len(k), sum(k) / len(k) )
Statistiken[spalte] = { "min": min(k), "max": max(k), "avg": sum(k) / len(k) }
Statistiken
{'Alter': {'min': 1, 'max': 55, 'avg': 23.05},
'Körpergröße (cm)': {'min': 75, 'max': 185, 'avg': 148.4},
'Gewicht (kg)': {'min': 10, 'max': 85, 'avg': 49.65},
'Schuhgröße': {'min': 18, 'max': 45, 'avg': 36.4}}
“erzeugen Sie eine geeignete Funktion!”#
def berechne_statistiken(d):
"""d ... im Format sg_df_orientlist"""
alle_spalten_mit_numerischen_werten = [ s for s in d.keys() if isinstance(d[s][0], int) ]
Statistiken = {}
for spalte in alle_spalten_mit_numerischen_werten: # ["Körpergröße (cm)", "Gewicht (kg)" ]
k = sg_df_orientlist[spalte]
#print( min(k), max(k), sum(k), len(k), sum(k) / len(k) )
Statistiken[spalte] = { "min": min(k), "max": max(k), "avg": sum(k) / len(k) }
return Statistiken
berechne_statistiken(sg_df_orientlist)
{'Alter': {'min': 1, 'max': 55, 'avg': 23.05},
'Körpergröße (cm)': {'min': 75, 'max': 185, 'avg': 148.4},
'Gewicht (kg)': {'min': 10, 'max': 85, 'avg': 49.65},
'Schuhgröße': {'min': 18, 'max': 45, 'avg': 36.4}}