Woche 07 WS 2025#

ergebnis = []

for x in list("Hallo"):
    print(x)
H
a
l
l
o
ergebnis = []

h = "Hallo"

for i in range( len(h)):
    print(i, h[i])
0 H
1 a
2 l
3 l
4 o
ergebnis = []

# l1 und l2 seien gleich lang
l1 = [ 1, 2, 3 ]
l2 = [ "einz", "zwei", "drei" ]

for i in range( len( l1 )): ## oder auch l2, ist ja gleich lang
    #print(i, l1[i], l2[i])
    #print( f"{i}, {l1[i]}, {l2[i]}")
    print( f"{i=}, {l1[i]=}, {l2[i]=}")
i=0, l1[i]=1, l2[i]='einz'
i=1, l1[i]=2, l2[i]='zwei'
i=2, l1[i]=3, l2[i]='drei'

Zusammenfügen mit zip()

list( zip(l1, l2) )
[(1, 'einz'), (2, 'zwei'), (3, 'drei')]
dict( zip(l1, l2) )
{1: 'einz', 2: 'zwei', 3: 'drei'}

Aufgabe: Simulieren Sie die Funktion zip()!

ergebnis = []

# l1 und l2 seien gleich lang
l1 = [ 1, 2, 3 ]
l2 = [ "einz", "zwei", "drei" ]

for i in range( len( l1 )): ## oder auch l2, ist ja gleich lang
    ergebnis.append( (l1[i], l2[i]) )

ergebnis
[(1, 'einz'), (2, 'zwei'), (3, 'drei')]
ergebnis = {}

# l1 und l2 seien gleich lang
l1 = [ 1, 2, 3 ]
l2 = [ "einz", "zwei", "drei" ]

for i in range( len( l1 )): ## oder auch l2, ist ja gleich lang
    ergebnis[l1[i]] = l2[i]

ergebnis
{1: 'einz', 2: 'zwei', 3: 'drei'}

CSV einlesen#

abc = 1
meinedaei = "umsatz.csv"
import pandas as pd
umsatz_df = pd.read_csv(meinedaei)
umsatz_df
Region Name Umsatz
0 Nord Anna 100
1 Nord Ben 150
2 Süd Anna 120
3 Süd Anna 110
umsatz_d = umsatz_df.to_dict(orient="list")
umsatz_d
{'Region': ['Nord', 'Nord', 'Süd', 'Süd'],
 'Name': ['Anna', 'Ben', 'Anna', 'Anna'],
 'Umsatz': [100, 150, 120, 110]}

Datei mit with einlesen#

with open("umsatz.csv", "r") as file:
    content = file.read()
    # File closes automatically

print(content)  
Region,Name,Umsatz
Nord,Anna,100
Nord,Ben,150
Süd,Anna,120
Süd,Anna,110
zeilen = content.split()
zeilen
['Region,Name,Umsatz',
 'Nord,Anna,100',
 'Nord,Ben,150',
 'Süd,Anna,120',
 'Süd,Anna,110']
matrix = [ zeile.split(',') for zeile in zeilen[1:]  ]
matrix
[['Nord', 'Anna', '100'],
 ['Nord', 'Ben', '150'],
 ['Süd', 'Anna', '120'],
 ['Süd', 'Anna', '110']]

Neue Zeile hinzufügen, wieder ‘rausschreiben

matrix.append(  [ 'Ost', 'Vlad', '90' ] )
matrix
[['Nord', 'Anna', '100'],
 ['Nord', 'Ben', '150'],
 ['Süd', 'Anna', '120'],
 ['Süd', 'Anna', '110'],
 ['Ost', 'Vlad', '90']]
zeilen2 = ['region,name,sales']

for z in matrix:
    #print(z)
    zeilen2.append(  ','.join(z)  )

zeilen2
['region,name,sales',
 'Nord,Anna,100',
 'Nord,Ben,150',
 'Süd,Anna,120',
 'Süd,Anna,110',
 'Ost,Vlad,90']
content2 = "\n".join( zeilen2 )
content2
'region,name,sales\nNord,Anna,100\nNord,Ben,150\nSüd,Anna,120\nSüd,Anna,110\nOst,Vlad,90'
print(content2)
region,name,sales
Nord,Anna,100
Nord,Ben,150
Süd,Anna,120
Süd,Anna,110
Ost,Vlad,90
with open("umsatz2.csv", "w") as file:
    file.write( content2 )

Woche 07 WS 2024#

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