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_2weiterarbeiten:

# 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}}