Woche 11 Bsp. Prüfungsplan#

Ergebnissicherung der Übung 2025-01-09, besprochen in der Vl 2025-01-10. Vorgestellt als praxisrelevantes Spielfeld für allerlei selbstgebaute Challenges.

Gegeben der Prüfungsplan der Fak. IF als Tabelle (Auszug, Zahlen stimmen nicht): pplan.ods, pplan.csv

Nachlesen: https://www.jbusse.de/python-101/woche_06.html#csv-einlesen

import pandas as pd
csv_Datei = "pplan.csv"
# df ... data frame
df = pd.read_csv(csv_Datei, sep=";")
df
ID Tag Datum Beginn Dauer Stg. Fach Raum Kürzel Prüfer Aufsicht Zweitprüfer
0 1001 Mo 27.01.25 13:00:00 60 min. DVM/ WI Pr Programmieren I (1. Gruppe) C1 13/ D1 04 BUJ Busse, Prof. Dr. BUJ,SLS OSN
1 1002 Mo 27.01.25 15:00:00 60 min. DVM/ WI Pr Programmieren I (2.Gruppe) C1 13/ D1 04 BUJ Busse, Prof. Dr. BUJ , SLS OSN
2 1003 Di 12.02.25 08:00:00 60 min. KI Programmieren I G0 12/13 OSN Oserbergen, Prof. Dr. OSN,BUJ WAR
3 1004 Di 12.02.25 08:00:00 60 min. WIF Seminar J 107 BUJ Prof. Busse WAR OSN
df_index = df.to_dict(orient="index")
df_index
{0: {'ID': 1001,
  'Tag': 'Mo',
  'Datum': '27.01.25',
  'Beginn': '13:00:00',
  'Dauer': '60 min. ',
  'Stg.': 'DVM/ WI Pr',
  'Fach': 'Programmieren I (1. Gruppe)',
  'Raum': 'C1 13/ D1 04 ',
  'Kürzel': 'BUJ',
  'Prüfer': 'Busse, Prof. Dr. ',
  'Aufsicht': 'BUJ,SLS',
  'Zweitprüfer': 'OSN'},
 1: {'ID': 1002,
  'Tag': 'Mo',
  'Datum': '27.01.25',
  'Beginn': '15:00:00',
  'Dauer': '60 min. ',
  'Stg.': 'DVM/ WI Pr',
  'Fach': 'Programmieren I (2.Gruppe)',
  'Raum': 'C1 13/ D1 04 ',
  'Kürzel': 'BUJ',
  'Prüfer': 'Busse, Prof. Dr. ',
  'Aufsicht': 'BUJ , SLS',
  'Zweitprüfer': 'OSN'},
 2: {'ID': 1003,
  'Tag': 'Di',
  'Datum': '12.02.25',
  'Beginn': '08:00:00',
  'Dauer': '60 min. ',
  'Stg.': 'KI ',
  'Fach': 'Programmieren I ',
  'Raum': 'G0 12/13',
  'Kürzel': 'OSN',
  'Prüfer': 'Oserbergen, Prof. Dr.',
  'Aufsicht': 'OSN,BUJ ',
  'Zweitprüfer': 'WAR '},
 3: {'ID': 1004,
  'Tag': 'Di',
  'Datum': '12.02.25',
  'Beginn': '08:00:00',
  'Dauer': '60 min. ',
  'Stg.': 'WIF',
  'Fach': 'Seminar',
  'Raum': 'J 107',
  'Kürzel': 'BUJ',
  'Prüfer': 'Prof. Busse',
  'Aufsicht': 'WAR ',
  'Zweitprüfer': 'OSN'}}

Aufgabe: Namen zu Kürzeln#

gesucht ist ein Dict, das zu den Kürzeln aus der Spalte Kürzel die zugehörigen Namen aus Prüfer extrahiert.

erste einfach Lösung:

# hier die Lösung

kuerzel_namen = {}

for zeile in df_index.values():
    k = zeile["Kürzel"]
    p = zeile["Prüfer"]
    kuerzel_namen[k] = p

kuerzel_namen
{'BUJ': 'Prof. Busse', 'OSN': 'Oserbergen, Prof. Dr.'}
# Test
kuerzel_namen == {'BUJ': 'Prof. Busse', 'OSN': 'Oserbergen, Prof. Dr.'}
True

Aufgabe: Namens-Variationen#

Problem: für das Kürzel “BUJ” sind in der Spalte “Prüfer” verschiedene (!) Formen des Prüfernamens eingetragen. In obiger Zeile gewinnt die letzte Zuweisung.

Weil wir damit rechnen, dass so etwas typisch ist in unserer Datenhaltung, wollen wir ein etwas komplexeres Dict haben: zu jedem Kürzel eine Menge aller für diesen Prüfer verzeichneten Prüfernamen. Im Idealfall hat die Menge genau ein Element, aber man weiß ja nie …

# hier die Lösung

kuerzel_namen_2 = {}

for zeile in df_index.values():
    k = zeile["Kürzel"]
    p = zeile["Prüfer"]
    if k not in kuerzel_namen_2:
        kuerzel_namen_2[k] = set()  # key anlegen, mit leerer Menge initialisieren
    kuerzel_namen_2[k].add(p)
    
kuerzel_namen_2
{'BUJ': {'Busse, Prof. Dr. ', 'Prof. Busse'}, 'OSN': {'Oserbergen, Prof. Dr.'}}
# Test
kuerzel_namen_2 == {'BUJ': {'Busse, Prof. Dr. ', 'Prof. Busse'}, 'OSN': {'Oserbergen, Prof. Dr.'}}
True

Aufgabe: Alle Namens-Kürzel#

insbesondere in den Spalten Aufsicht und Zweitprüfer.

Um uns die Arbeit einfacher zu machen, exportieren wir unser DataFrame in eine andere Datenstruktur, mämlich orient="list":

df_list = df.to_dict(orient="list")
df_list
{'ID': [1001, 1002, 1003, 1004],
 'Tag': ['Mo', 'Mo', 'Di', 'Di'],
 'Datum': ['27.01.25', '27.01.25', '12.02.25', '12.02.25'],
 'Beginn': ['13:00:00', '15:00:00', '08:00:00', '08:00:00'],
 'Dauer': ['60 min. ', '60 min. ', '60 min. ', '60 min. '],
 'Stg.': ['DVM/ WI Pr', 'DVM/ WI Pr', 'KI ', 'WIF'],
 'Fach': ['Programmieren I (1. Gruppe)',
  'Programmieren I (2.Gruppe)',
  'Programmieren I ',
  'Seminar'],
 'Raum': ['C1 13/ D1 04 ', 'C1 13/ D1 04 ', 'G0 12/13', 'J 107'],
 'Kürzel': ['BUJ', 'BUJ', 'OSN', 'BUJ'],
 'Prüfer': ['Busse, Prof. Dr. ',
  'Busse, Prof. Dr. ',
  'Oserbergen, Prof. Dr.',
  'Prof. Busse'],
 'Aufsicht': ['BUJ,SLS', 'BUJ , SLS', 'OSN,BUJ ', 'WAR '],
 'Zweitprüfer': ['OSN', 'OSN', 'WAR ', 'OSN']}

Prüfer-Kürzel befinden sich nun in den Spalten Kürzel und Zweitprüfer.

Kürzel in der Spalte Kürzel:

k_pruefer = set(df_list["Kürzel"])
k_pruefer
{'BUJ', 'OSN'}

Kürzel in der Spalte Zweitprüfer:

k_zweitpruefer = set(df_list["Zweitprüfer"])
k_zweitpruefer
{'OSN', 'WAR '}

oder mehr fancy:

k_alle = set()

for spaltenkopf in ["Kürzel", "Zweitprüfer"]:
    k_alle = k_alle.union( set( df_list[spaltenkopf]))

k_alle
{'BUJ', 'OSN', 'WAR '}