lehrkraefte:ks:informatik-glf4-22-4msi

2. Note: Bewertete Analyse: Abgabe 20. Mai 2022 um 17:00 auf Teams

Dokumentation der eigenen Analyse in einem PDF-Dokument, welches

  1. Eine Einleitung enthält, welche
    • Beschreibt (Screenshot; Shortcut: PrtScr oder Alt+PrtScr) woher die Daten kommen und wie diese aussehen.
    • Beschreibt, welche Daten erhoben werden.
  2. Eine Frage formuliert, welche auf Grund von Excel-Analysen (mindestens eine Pivot-Tabelle) der eigenen Daten beantwortet kann.
  3. Mindestens eine Analyse der eigenen Daten welche die Frage aus dem vorigen Punkt beantwortet. Z.B. Wann mache ich xxx am häufigsten?
  4. Einen Abschnitt, welcher Zusammenfasst, was du in diesem Teil der Informatik gelernt hast, bzgl.
    • Excel
    • Python
    • BigData und sozialen Netzen im Allgemeinen.

Bewertungskriterien:

  • Nachvollziehbarkeit der Ausführungen und Analysen
  • Dokumentation der Analysen (Erklärungen, Screenshots, etc.)
  • Ausführlichkeit der Analysen
  • Darstellung des Berichts

Tipps Word

  • PrtScr erstellt ein Bildschirmfoto des ganzen Bildschirms in der Zwischenbalge (CTRL+V zum Einfügen)
  • Alt+PrtScrn erstellt ein Bildschirmfoto des aktiven Fensters in der Zwischenbalge (CTRL+V zum Einfügen)
  • Win+PrtScrn erstellt ein Bildschirmfoto und speichert es im Bilder-Ordner von Windows
  • Win+Shift+S öffnet einen Dialog um ein Bildschirmfoto aufzunehmen und einen Bereich auszuwählen und speichert es dann in der Zwischenbalge (CTRL+V zum Einfügen)

Ziele

Erste Analysen mit Pivot-Tabellen in Excel deiner Daten von Youtube oder Instagram aus der letzten Lektion.

Auftrag

  1. CSV in Excel öffnen
    1. Folgende Excel-Funktionen nachlesen resp. ausprobieren:
    2. Spalten erstellen mit den den notwendigen Informationen, z.B. Stunde am Tag, Wochentag, etc. (siehe oben) und diese dann als Excel-Datei speichern.
  2. Folgende Fragen mit Filter oder Pivot beantworten:
    • Zu welcher Tageszeit schaue ich am meisten Videos?
    • An welchem Wochentag schaue ich am meisten Videos?
    • Wie viele Videos schaue ich durchschnittlich pro Tag?

Ziele

Du kennst deine Daten aus Instagram oder Youtube und hast sie in strukturierter Form in Excel vorliegen.

Auftrag

  • Schau dir das Einführungsvideo an.
  • Navigiere zur heruntergeladenen ZIP-Datei, das heisst, geh mit dem Windows-Explorer (Win+E) zu diesem Ordner. Mit einem Rechtsklick kannst du die Datei entpacken.
  • Untersuche die heruntergeladene Datei (das heisst, entpacke sie und öffne die enthaltenen Dateien und Ordner)
  • Wähle unten deinen Code für Instagram (deutsch oder englisch) resp Youtube (deutsch oder englisch). Passe den Dateipfad im Code an und führe den Code aus.
  • Überprüfe die erhaltene CSV-Datei in Excel

Hast du keine eigenen Daten kannst du diese Datei verwenden (Rechtsklick → herunterladen). Für Interessiere: Der Code zur Aufbereitung der Youtube-Daten (Instagram ist analog) ist in diesem Video erklärt

Achtung: Entweder ins Homeverzeichnis kopieren (da habt nur ihr Leserechte) oder unbedingt nachher wieder permanent löschen (Shift+Del).

Code

Instagram Deutsch

insta_detusch.py
import re        # Regular Expressions
import datetime  # Datum/Zeit 
import os        # Files suchen
 
# Erklärungen zu diesem Code sind Analog dem Youtube-Extraktor.
 
rootdir = "C:/pfad/zum/entpackten/instagram/ordner/"
 
# Resultat, das am Schluss geschrieben werden soll
csv = ""   # Comma separated values
# Wie viele Kontrollausgaben?
debug = 10
 
# Alle HTML-Dateien im Verzeicznis anzeigen            
for root, dirs, files in os.walk(rootdir):
    for file in files:
        if file.endswith(".html"):
            filepath = os.path.join(root, file) 
            # Datei oeffnen
            f = open(filepath, "r")
            html = f.read()  # Alles einlesen
            f.close()        # Datei schliessen
 
 
            # Datum der Form 30.12.2021, 22:13 einlesen
            # Alle nötigen Angaben werden in Klammern "ge-captured"
            daten = re.findall("(\d{1,2}).(\d{1,2}).(\d{1,4}), (\d{1,2}):(\d{1,2})", html)
            if(debug>0):
                print(file,": ",len(daten))
                debug-=1
 
 
            # Alle Einträge durchgehen, d enthält jeweils den nächsten Eintrag
            for d in daten:
                # Einträge in Zahlen umwandeln
                # Monat plus die anderen Einträge (ohne AM/PM) in Zahlen umgewandelt 
                #   Die Zeichenkette "42" ist nicht das gleiche wie die Zahl 42.
 
                e = [int(x) for x in d]
                if debug>0:
                    # Ausgabe zur Kontrolle, sollte folgendes Format Produzieren
                    print(e) # [1, 6, 2021, 21, 23, 12]
                    debug -= 1  # Um 1 vermindern
 
                # Datum daraus generieren (macht die Datumsmanipulation einfacher).
                # Jahr, Monat, Tag, Stunde, Minute, Sekunde
                datum = datetime.datetime(e[2], e[1], e[0], e[3], e[4],0)
 
                if debug>0:
                    # Ausgabe zur Kontrolle, produziert folgendes Format
                    print(datum)   # 2021-01-06 21:23:12
                    debug -= 1  # Um 1 vermindern
 
                # Wochentag (Mo=0, Di=1, ..., So=6)
                # Sämtliche Methoden für datetime-Objekte sind hier beschrieben: https://docs.python.org/3/library/datetime.html#datetime-objects
                wday = datum.weekday()
 
                # Formatierte Ausgabe des Datums, siehe https://www.w3schools.com/python/python_datetime.asp
                # \n heisst neue Zeile.
                csv += datum.strftime("%Y-%m-%d %H:%M:%S;"+os.path.splitext(file)[0]+"\n")  #Das Format soll so angepasst werden, damit die Tabellenkalkulation dann damit umgehen kann.
 
            # Ausgabe in Datei schreiben
        f = open("resultat.csv", "w")
        f.write(csv)
        f.close()

Instagram Englisch

insta_englisch.py
import re        # Regular Expressions
import datetime  # Datum/Zeit 
import os        # Files suchen
 
# Erklärungen zu diesem Code sind Analog dem Youtube-Extraktor.
 
rootdir = "C:/pfad/zum/entpackten/instagram/ordner/"
mnum = {"Jan":1, "Feb":2, "Mar":3, "Apr":4, "May":5, "Jun":6, "Jul":7, "Aug":8, "Sep":9, "Oct":10,"Nov":11, "Dec":12}; 
 
# Resultat, das am Schluss geschrieben werden soll
csv = ""   # Comma separated values
# Wie viele Kontrollausgaben?
debug = 10
 
# Alle HTML-Dateien im Verzeicznis anzeigen            
for root, dirs, files in os.walk(rootdir):
    for file in files:
        if file.endswith(".html"):
            filepath = os.path.join(root, file) 
            # Datei oeffnen
            f = open(filepath, "r")
            html = f.read()  # Alles einlesen
            f.close()        # Datei schliessen
 
 
            # Datum der Form 30.12.2021, 22:13 einlesen
            # Alle nötigen Angaben werden in Klammern "ge-captured"
            daten = re.findall("([A-Z][a-z][a-z]) (\d{1,2}), (\d{4}), (\d{1,2}):(\d{1,2}) ([AP]M)", html)
 
 
            if(debug>0):
                print(file,": ",len(daten))
                debug-=1
 
 
            # Alle Einträge durchgehen, d enthält jeweils den nächsten Eintrag
            for d in daten:
                # Einträge in Zahlen umwandeln
                # Monat plus die anderen Einträge (ohne AM/PM) in Zahlen umgewandelt 
                #   Die Zeichenkette "42" ist nicht das gleiche wie die Zahl 42.
 
                e = [mnum[d[0]]] + [int(x) for x in d[1:-1]]
                if d[5]=="PM":  # Nachmittag? Plus 12 Stunden (Ausser Mitternacht = 0)
                   e[3]=(e[3]+12) % 24
                if debug>0:
                    # Ausgabe zur Kontrolle, sollte folgendes Format Produzieren
                    print(e) # [1, 6, 2021, 21, 23, 12]
                    debug -= 1  # Um 1 vermindern
 
                # Datum daraus generieren (macht die Datumsmanipulation einfacher).
                # Jahr, Monat, Tag, Stunde, Minute, Sekunde
                datum = datetime.datetime(e[2], e[1], e[0], e[3], e[4],0)
 
                if debug>0:
                    # Ausgabe zur Kontrolle, produziert folgendes Format
                    print(datum)   # 2021-01-06 21:23:12
                    debug -= 1  # Um 1 vermindern
 
                # Wochentag (Mo=0, Di=1, ..., So=6)
                # Sämtliche Methoden für datetime-Objekte sind hier beschrieben: https://docs.python.org/3/library/datetime.html#datetime-objects
                wday = datum.weekday()
 
                # Formatierte Ausgabe des Datums, siehe https://www.w3schools.com/python/python_datetime.asp
                # \n heisst neue Zeile.
                csv += datum.strftime("%Y-%m-%d %H:%M:%S;"+os.path.splitext(file)[0]+"\n")  #Das Format soll so angepasst werden, damit die Tabellenkalkulation dann damit umgehen kann.
 
            # Ausgabe in Datei schreiben
        f = open("resultat.csv", "w")
        f.write(csv)
        f.close()

Youtube Englisch

youtube_englisch.py
import re        # Regular Expressions
import datetime  # Datum/Zeit 
 
# Erklärungen zu diesem Code gibt es auch als Video hier:
# https://web.microsoftstream.com/video/4c478e5b-609d-4429-bc20-78b9f8abab93
# und für Datensparsame und solche ohne BLDSG-Account auch hier:
# https://fginfo.ksbg.ch/~ivo/videos/informatik/vierte-klasse/daten-extraktion-youtube-watchtime-extraktion.mp4
 
# Daten einlesen
# Entweder vollständiger Pfad zur Datei oder (wie z.B. C:\Users\Hansli\Desktop\watch-history.html) oder
# nur Dateiname, wenn die Datei im gleichen Verzeichnis wie das Pythonprogramm liegt.
f = open("jan14-history.html", "r")
html = f.read()  # Alles einlesen
f.close()        # Datei schliessen
 
 
# Datum der Form Jan 6, 2021, 9:23:12 PM CET
# Alle nötigen Angaben werden in Klammern "ge-captured"
daten = re.findall(r"([A-Z][a-z][a-z]) (\d{1,2}), (\d{4}), (\d{1,2}):(\d{1,2}):(\d{1,2}) ([AP]M) CET", html)
 
#Erste 3 Einträge zur Kontrolle ausgeben
print(daten[0:3])
 
# Zuordnung der Monatsnamen zu Monatsnummern, z.B. ist mnum["Jul"] gleich 7
mnum = {"Jan":1, "Feb":2, "Mar":3, "Apr":4, "May":5, "Jun":6, "Jul":7, "Aug":8, "Sep":9, "Oct":10,"Nov":11, "Dec":12}; 
 
# Resultat, das am Schluss geschrieben werden soll
csv = ""   # Comma separated values
 
# Wie viele Kontrollausgaben?
debug = 10
 
# Alle Einträge durchgehen, d enthält jeweils den nächsten Eintrag
for d in daten:
    # Einträge in Zahlen umwandeln
    # Monat plus die anderen Einträge (ohne AM/PM) in Zahlen umgewandelt 
    #   Die Zeichenkette "42" ist nicht das gleiche wie die Zahl 42.
    e = [mnum[d[0]]] + [int(x) for x in d[1:-1]]
    if d[6]=="PM":  # Nachmittag? Plus 12 Stunden (Ausser Mitternacht = 0)
        e[3]=(e[3]+12) % 24
 
    if debug>0:
        # Ausgabe zur Kontrolle, sollte folgendes Format Produzieren
        print(e) # [1, 6, 2021, 21, 23, 12]
        debug -= 1  # Um 1 vermindern
 
    # Datum daraus generieren (macht die Datumsmanipulation einfacher).
    # Jahr, Monat, Tag, Stunde, Minute, Sekunde
    datum = datetime.datetime(e[2], e[0], e[1], e[3], e[4], e[5])
 
    if debug>0:
        # Ausgabe zur Kontrolle, produziert folgendes Format
        print(datum)   # 2021-01-06 21:23:12
        debug -= 1  # Um 1 vermindern
 
    # Wochentag (Mo=0, Di=1, ..., So=6)
    # Sämtliche Methoden für datetime-Objekte sind hier beschrieben: https://docs.python.org/3/library/datetime.html#datetime-objects
    wday = datum.weekday()
 
    # Formatierte Ausgabe des Datums, siehe https://www.w3schools.com/python/python_datetime.asp
    # \n heisst neue Zeile.
    csv += datum.strftime("%Y-%m-%d %H:%M:%S\n")  #Das Format soll so angepasst werden, damit die Tabellenkalkulation dann damit umgehen kann.
 
# Ausgabe in Datei schreiben
f = open("resultat.csv", "w")
f.write(csv)
f.close()

Youtube Deutsch

youtube_deutsch.py
import re        # Regular Expressions
import datetime  # Datum/Zeit 
 
# VERSION FUER DEUTSCHE EXPORTE, Datumsangabe in der Form 09.02.2012, 14:15:59 MEZ
 
# Erklärungen zu diesem Code gibt es auch als Video hier:
# https://web.microsoftstream.com/video/4c478e5b-609d-4429-bc20-78b9f8abab93
# und für Datensparsame und solche ohne BLDSG-Account auch hier:
# https://fginfo.ksbg.ch/~ivo/videos/informatik/vierte-klasse/daten-extraktion-youtube-watchtime-extraktion.mp4
 
# Daten einlesen
# Entweder vollständiger Pfad zur Datei oder (wie z.B. C:\Users\Hansli\Desktop\watch-history.html) oder
# nur Dateiname, wenn die Datei im gleichen Verzeichnis wie das Pythonprogramm liegt.
f = open("Wiedergabeverlauf", "r")
html = f.read()  # Alles einlesen
f.close()        # Datei schliessen
 
 
# Datum der Form Jan 6, 2021, 9:23:12 PM CET
# Alle nötigen Angaben werden in Klammern "ge-captured"
 
# Datum der Form 09.02.2012, 14:15:59 MESZ
daten = re.findall(r"(\d{2})\.(\d{2})\.(\d{4}), (\d{2}):(\d{2}):(\d{2}) ME([S]{0,1})Z", html)
 
 
#Erste 3 Einträge zur Kontrolle ausgeben
print(daten[0:3])
 
# Zuordnung der Monatsnamen zu Monatsnummern, z.B. ist mnum["Jul"] gleich 7
mnum = {"Jan":1, "Feb":2, "Mar":3, "Apr":4, "May":5, "Jun":6, "Jul":7, "Aug":8, "Sep":9, "Oct":10,"Nov":11, "Dec":12}; 
 
# Resultat, das am Schluss geschrieben werden soll
csv = ""   # Comma separated values
 
# Wie viele Kontrollausgaben?
debug = 10
 
# Alle Einträge durchgehen, d enthält jeweils den nächsten Eintrag
for d in daten:
    # Einträge in Zahlen umwandeln
    # Monat plus die anderen Einträge (ohne AM/PM) in Zahlen umgewandelt 
    #   Die Zeichenkette "42" ist nicht das gleiche wie die Zahl 42.
    e = [int(x) for x in d]
 
    if debug>0:
        # Ausgabe zur Kontrolle, sollte folgendes Format Produzieren
        print(e) # [1, 6, 2021, 21, 23, 12]
        debug -= 1  # Um 1 vermindern
 
    # Datum daraus generieren (macht die Datumsmanipulation einfacher).
    # Jahr, Monat, Tag, Stunde, Minute, Sekunde
    datum = datetime.datetime(e[2], e[1], e[0], e[3], e[4], e[5])
 
    if debug>0:
        # Ausgabe zur Kontrolle, produziert folgendes Format
        print(datum)   # 2021-01-06 21:23:12
        debug -= 1  # Um 1 vermindern
 
    # Wochentag (Mo=0, Di=1, ..., So=6)
    # Sämtliche Methoden für datetime-Objekte sind hier beschrieben: https://docs.python.org/3/library/datetime.html#datetime-objects
    wday = datum.weekday()
 
    # Formatierte Ausgabe des Datums, siehe https://www.w3schools.com/python/python_datetime.asp
    # \n heisst neue Zeile.
    csv += datum.strftime("%Y-%m-%d %H:%M:%S\n")  #Das Format soll so angepasst werden, damit die Tabellenkalkulation dann damit umgehen kann.
 
# Ausgabe in Datei schreiben
f = open("resultat.csv", "w")
f.write(csv)
f.close()

Lade deine Daten bei Youtube, Instagram, TikTok o.ä. herunter resp. beantrage das Herunterladen. Trage dann hier ein, wo du die Daten «bestellt» hast.

Wege zu Daten

  • Instagram: Webseite: Mehr → Deine Aktivität → Deine Informationen herunterladen. Als Format sollte mindestens HTML gewählt werden.1)
  • Youtube: «Kopf» → Meine Daten auf Youtube
  • Irgendeine andere Platform

Fordere die Daten an und trage im Formular ein, welche Daten du angefordert hast. Hast du mehrere Daten angefordert, kannst du diese mehrfach eintragen.

Ziele

Wiederholung elementare Python (und Progammier-)Konzepte:

  1. Du kannst elementare Programme schreiben und ausführen.
  2. Du kannst elementare Kontroll- und Schleifenstrukturen benennen und einsetzen.
  3. Du weisst was Funktionen sind und kannst eigene Funktionen definieren und ausführen.

Auträge

  1. Bearbeite dein Problem weiter, welches du vorletztes Mal gewählt hast und in TigerJython implementierst (Geburtstagsproblem, Overbooking, Epidemie). Die Arbeitsblätter und Lösungen sind hier abgelegt. Das Suffix MuLoe steht für die Musterlösung zum zugehörigen Problem.
  2. Notiere allfällige Fragen zur Prüfung nächste Woche auf diesem Padlet.

Inhalte Prüfung

  1. Grundidee Monte-Carlo Simulation
  2. Simulation in Excel
    1. Zufallszahlen
    2. Rollender Durchschnitt / Stabilisierung
    3. Grundkonzepte (Zellebzüge, $-Zeichen, etc.)
  3. Simulation in Python (Simulationsskript)
    1. Zufallszahlen
    2. Schleifen (for-Schleifen)
    3. Wenn-dann-Codes
  4. Vor- und Nachteile Python versus Excel.

Beispiel Code

bsp.py
from random import randint #nur randint von random importieren
print(randint(1,10))
 
def parabel(x):
    y = x*x
    return(y)
 
print(parabel(-3))
 
def vergleichewuerfel():
    w1 = randint(1,6)
    w2 = randint(1,6)
    if w1==5 and w2==5:
        returnvalue = 1
    else:
        returnvalue = 0
    return(returnvalue)
 
zaehlvariable = 0
n = 10000000
for i in  range(n):
        zaehlvariable += vergleichewuerfel()
 
print(zaehlvariable/n)

Ziele

Wiederholung elementare Python (und Progammier-)Konzepte:

  1. Du kannst elementare Programme schreiben und ausführen.
  2. Du kannst elementare Kontroll- und Schleifenstrukturen benennen und einsetzen.
  3. Du weisst was Funktionen sind und kannst eigene Funktionen definieren und ausführen.

Ziel dieser Lektion(en) wird sein, dass du die wichtigsten Pyhton-Konzepte nochmals wiederholst. Zu den wichtigsten Konzepten hat es Aufgaben und Lösungen unten, ebenfalls sind die Seiten aus der Theorie des Buchs der Grundlagenfachs (oder als PDF)

Aufträge

Wiederhole resp. lies die folgenden Konzepte nach

  1. ''for''-Schleifen. Schreibe ein Programm, welches die folgenden Ausgaben hat
    1. alle geraden Zahlen bis 200
    2. alle ungeraden Zahlen bis 200
    3. alle Vielfachen von 7 bis 300
    4. alle Quadratzahlen bis 10000. Um Zahlen zu exponentieren, verwendet man * *. Um also $3^2$ zu berechnen, gibt man 3 2 ein.
  2. Kontroll-Strukturen. Schreibe ein Programm, welches die Ausgaben, des Fizz Buzz-Spiel ausgibt. Um die Teilbarkeit einer Zahl zu überprüfen, kannst du den Modulo-Operator verwenden: 7%3 z.B. ergibt den Rest der bei der Division von 7 durch 3 entsteht.
    1. Schreibe ein Prorgamm, welches aus der Liste [1,3,2,1,7,-1,7,2.1]
    2. den dritten Wert ausgibt
    3. den Durchschnitt des zweiten und dritten Wert ausgibt
    4. den Durchschnitt aller Werte ausgibt
    5. den höchsten Wert (ohne 7 fix zu nennen) mit 12 überschreibt.
    6. die Werte an der ersten und dritten Stelle tauscht.
    7. Ergänze das Programm unten so, dass dir die höchste Zahl (das Maximum) der Zufallsliste ausgegeben wird. Verwende dabei den Befehl max nicht sondern ausschliesslich die Vergleichsoperatoren < und > sowie if o.ä.
      findemaximum.py
       from random import randint
       
      #Funkion zum Erzeugen von zufälligen Listen
      def zufallszahlen(n):
          zufallsliste = [randint(0, 1000) for i in range(n)]
          return zufallsliste
       
      liste = zufallszahlen(100)
      print(liste)
      print(len(liste))
      print(range(len(liste)))
      for i in range(len(liste)):
      #ergänze den Code.  
    1. Verwende deinen Code von oben, um eine Funktion zu schreiben, welche als Argument eine beliebige Liste hat und als Rückgabewert, den grössten Wert dieser Liste hat. Erweitere die Funktion mit einem zweiten Argument, so dass man spezifieren kann, ob man den grössten oder den kleinsten Wert zurückerhalten möchte. Verwende dazu die beiden Code-Skelette unten:
      function_skeleton.py
       def findMax(liste):  
         #Hier kommt dein Code
         return(maximalerwert)
    2. Schreibe eine Funktion, welche für ein Argument $i$ alle Werte bis (ohne) zu diesem Wert ausdruckt. Verwende dafür eine for-Schlaufe. Nenne deine Funktion innereFunktion. Der Output deiner Funktion sollte z.B. sein
       innereFunktion(4)
      0
      1
      2
      3
  3. Geschachtelte Schleifen. Schreibe eine Funktion, welche untenstehenden Output hat. Verwende dabei die Funktion innereFunktion von oben. Die horizontalen Abtrennungen kann man mit print(“======”) erreichen.
    0
    ======
    0
    1
    ======
    0
    1
    2
    ======
    0
    1
    2
    3
    ======
    0
    1
    2
    3
    4
    ======
  4. Löse die obere Aufgabe ohne den Aufruf deiner Funktion innereFunktion.

Lösungen

Lösungen

Lösungen

  1. Schlaufen:
    loesungen_1.py
     from math import floor
    ## I
    for i in range(100):
        print(2*i)
    # oder
    for i in range(2,200,2):
        print(i)
    ## II
    for i in range(100):
        print(2*i+1)
    #oder
    for i in range(1,200,2):
        print(i)
     
    ## III
    for i in range(7,300,7):
        print(i)
    # oder manuell floor runden ab.
    for i in range(int(floor((300-7)/7))+1):
        print(7+i*7)
     
    ## IV; exponentieren erfolt mit **
    for i in range(100+1):
        print(i**2)
  2. FizzBuzz:
    fizzbuzz.py
     for i in range(1, 100):
        if i % 3 == 0 and i % 7 == 0:
            print ("FizzBuzz")
        elif i % 3 == 0:
            print "Fizz"
        elif i % 7 == 0:
            print "Buzz"
        else:
            print i
  3. Listenspielerein
    listenspielerei.py
    li = [1,3,2,1,7,-1,7,2.1]
    # A
    print(li[2])
     
    # B 
    av = (li[1]+li[2])/2
    print(av)
     
    # C
    lenli = len(li)  
    sumvar = 0
     
    for i in range(lenli):
        sumvar = sumvar+li[i]
     
    print(sumvar/lenli)
     
    # D: Funktioniert das immer? Macht das, was gewollt ist?
    for i in range(lenli):
        if(li[i]==max(li)): 
            li[i]=12
     
    print(li)
     
    # E
    li = [1,3,2,1,7,-1,7,2.1]
     
    a = li[2]
    li[2] = li[0]
    li[0] = a
    print(li)
     
  4. Max
    findemaximum_loesung.py
    #I 
    from random import randint
    # Funkion zum Erzeugen von zufälligen Listen
    def zufallszahlen(n):
        zufallsliste = [randint(0, 10000) for i in range(n)]
        return zufallsliste
     
     
    liste = zufallszahlen(100)
    print(liste)
    print(len(liste))
    print(range(len(liste)))
    maxno = 0
    for i in range(len(liste)):
        if liste[i] >= maxno:
            maxno = liste[i]
     
    print(maxno)
     
     
    def findMax(liste):
        maxno = 0
        for i in range(len(liste)):
            if liste[i] >= maxno:
                maxno = liste[i]
        return maxno
     
     
    print(findMax(zufallszahlen(30000)))
    #II
    def innereFunktion(j):
      for i in range(j):
        print(i)
     
    innereFunktion(4)
    #III
    for j in range(10):
      innereFunktion(j)
    ###
    for j in range(10):
      for i in range(j):
         print(i)
      print("=======")

Ziele

  • Jede:r kennt die wichtigsten Tastatur-Shortcuts in Excel
  • Jede:r wählt sich ein Problem, um dieses dann in Python mit einer Simulation umzusetzen

Aufträge

  • Erstelle eine Excel-Datei mit Inhalten in den Zellen D3 bis F11. Platziere nachher den Cursor in eine der Zellen und versuche die Shortcuts unten durch.
  • Arbeite die Dokumentation Simulationsskript bis und mit Seite 6 durch. Die Aufgaben 1, 2, 5 und 6 kannst du auslassen.
  • Wähle nachher ein Problem, welches du in TigerJython implementierst (Geburtstagsproblem, Overbooking, Epidemie). Arbeite dabei entlang eines Arbeitsblattes aus dieser Auswahl. Das Suffix MuLoe steht für die Musterlösung zum zugehörigen Problem.

Knaus' Best-of-Shortcuts

Alle Excel-Shortcuts finden sich in dieser Liste. Die Shortcuts bis und mit F1 funktionieren bei den meisten gängingen (Office) Applikationen.

Shortcut Beschreibung
Ctrl+Pfeil Bewegt den Cursor ans Ende des Blocks der aktiven Zelle in Richtung des Pfeils
Shift+Pfeil Markiert die Zellen in Richtung des Pfeils
Shift+Ctrl+Pfeil Markiert die Zellen in Richtungs des Pfeils bis Ende des Blocks
Ctrl+Z Letzter Schritt rückgängig machen
Ctrl+Y Letzer Schritt wiederholen (z.B. Formatierung)
F1
F2 Zeigt die Abhängikeiten einer Formel in der aktiven Zelle graphisch an
F4 Fixiert Zeile und Spalte, Zeile und Spalte bei erneutem Drücken
F9 Berechnet ein Arbeitsblatt neu (inkl. neuer Zufallszahl)
Ctrl+PgDn/PgUp Wechselt nach rechts/links durch die Arbeitsblätter
Ctrl+- Markierte Zeile/Spalte löschen
Ctrl++ Zeile/Spalte einfügen

Ziele

  • Jede:r hat die wichtigsten Konzepte und Funktionen (siehe Aufträge letzte Woche) festgehalten
  • Jede:r kann Vor- und Nachteile einer Simulation in Excel benennen.

Aufträge

  • Aufträge von letzter Woche abschliessen.
  • Klassendiskussion anfangs L2 Padlet
  • Python Simulationsskript durcharbeiten.

Ziele

  • Jede:r kann mit Excel Zufallszahlen simulieren und visuell darstellen, wie die untersuchte Grösse sich mit zunehmender Anzahl Versuche stabilisiert.
  • Jede:r kann eine Aussage darüber treffen, wann sich die Simulation einer Zufallsgrösse stabilisiert.
  • Jede:r kann mit named ranges (benannte Bereiche) arbeiten

Aufträge

  • Warm-up resp. Intermezzo
    • Betrachte das Video zu Referenzieren in Excel: Wie kann über Blätter hinweg referenziert werden und wie Zellen fixiert werden.
    • Erstelle eine Multiplikationstabelle mit den Zahlen 1 bis 10 multipliziert mit 1 bis 10 wobei der Rest bei einer Division durch $p$ angegeben wird.
  • Simuliere den Verlauf eines Durchschnitts ($y$-Achse) gegenüber der Anzahl Simulationen ($x$-Achse). Verwende dabei MITTELWERT() resp. AVERAGE() und fixiere die erste Zeile des Bereichs mit $-Zeichen um einen rollenden Durcschnitt zu erhalten. Verwende dabei eine Grösse (Ein Würfel, “3er-Wurf”, Geburtstagsproblem, Overbooking, o.ä.) deiner Wahl und füge dann ein $XY$-Diagramm ein. (Einfügen → Diagramm) und gib ein Bild (Screenshot mit Win+Shift+S) auf Teams ab.
  • Schliesse die Aufträge von letzter Woche ab, insb. das “3er-Wurf”-Problem
  • Simuliere das Geburstagsproblem in Excel.
    • Verwende dazu mehrere Tabellenblätter: Im ersten simulierst du alle Personen einer Klasse pro Zeile, in der zweiten zählst du für jeden Tag im Jahr ($1,2,\ldots,365$) wie viele Personen an diesem Tag Geburtstag haben
    • Lies die Hilfe von ZÄHLEWENN() durch.
  • Simuliere das Overbooking Problem
    • Lies dir die Theorie (Mathe: optional) unten durch, schaue das Intro-Video und beantworte dann mit der zu erstellenden Simulation die gestellten Fragen.
    • Simuliere jeden Platz als Spalte für einen Flug einzeln, ob die Reisenden erscheinen (`1`) oder nicht (`0`). Zähle dann die Anzahl erschienen Reisenden.
    • Definiere die Antretenswahrscheinlichkeit als Zelle (named range oder benannte Bereiche (Hilfe zu benannte Bereiche) und beziehe deine Formeln darauf.
    • Berechne den Durchschnitt der angetretenen Plätze pro Flug und betrachte die Verteilung als Histogramm.
  • Halte (auf Papier, digital) fest, was du bis jetzt neu in Excel gelernt hast, das heisst, notiere Formeln, Ideen, Funktionen,Shortcuts (F2, Ctrl+ →, etc.) u.ä. darauf.

Overbooking-Problem

Immer wieder verpassen Leute ihren gebuchten Flug, z.B. wegen Krankheit oder einer Verspätung bei der Anreise. Deshalb geht die Fluggesellschaft ein Risiko ein und verkauft mehr Sitzplätze als sie eigentlich zur Verfügung hat.

Wir werden hier ein Beispiel durchrechnen:

  • Wir gehen davon aus, dass durchschnittlich $5\%$ aller Reisenden ihren Flug nicht antreten.
  • Für einen Flug mit $100$ Plätzen werden $110$ Tickets verkauft. Wie gross ist die Wahrscheinlichkeit, dass alle Reisenden ihre Flugreise durchführen können?
    • Wie gross wäre diese, wenn $120$ Plätze verkauft werden würden?
    • Welchen Einfluss hat die Antretenswahrscheinlichkeit?
Mathematischer Hintergrund

Es handelt sich hier um eine Binomial-verteilte Zufallsgrösse $X$. Die Erfolgswahrscheinlichkeit auf einer Stufe $p$ entspricht der Antretenswahrscheinlichkeit. Die verkauften Plätze entsprechen $n$. Damit ist die erwartete Anzahl der angetretenen Plätz der Erwartungswert $\mu=n\cdot p$.

Damit ist die Wahrscheinlichkeit, dass es $k$ Personen gibt, welche ihren Flug antreten

$$ \mathrm{P}(X=k)=\begin{pmatrix}n \\ k\end{pmatrix}\cdot p^k\cdot (1-p)^{n-k}$$

Ziele

Jede:r kann mit Excel Zufallszahlen und Würfel simulieren und auf Grund einer Simulation entscheiden, ob z.B. ein Spiel fair ist, ein Flugzeug durschnittlich ausgebucht ist o.ä.

Aufträge

  • Lies die einführende Theorie unten kurz durch
  • Simuliere das folgende Spiel “3er Wurf”
  • Simuliere das Geburtstagsproblem.

3er Wurf

Du darfst drei Würfel werfen. Treten dabei Sechser auf, so hast du gewonnen und ich gebe dir eine Murmel. Wenn keine Sechser vorkommen, habe ich gewonnen und du gibst mir eine Murmel. Ist das Spiel fair? Diskutiere zuerst mit der Person neben dir und versuche dann die Frage mit Excel zu beantworten.

Auftrag

Erstelle eine Excel-Tabelle in der du würfelst. Ein Würfel soll in einer Spalte stehen. Wenn du die Funktionen OR() resp. AND() (ODER() resp. UND()) benutzt, kannst du mehrere Bedingungen überprüfen. Simuliere mehre Durchführungen dieses Experiments (eine Zeile ist eine Durchführung) und zähle, wie oft du eine Murmel erhalten hast, resp. wie of du eine Murmel hast geben müssen.

  • Wie kann in Excel gewürfelt werden? Würfel
  • Wie erhalte ich Zufallszahlen von $[0,1]$ zu $\{1,2,3,4,5,6\}$? Zufallszahlen

Theorie

Die Simulation ist eine Arbeitsweise zur Analyse von komplexen Systemen und Zusammenhängen. Typischerweise sind das Fragestellungen, bei welchen man mit theoretischer und formelmässiger Behandlung an Grenzen stösst.

In der Forschung und Industrie, aber auch in der Finanzwelt spielen Computersimulationen eine wichtige Rolle. Computersimulationen haben gegenüber realen Experimenten und Untersuchungen den Vorteil, dass sie kostengünstig und umweltschonend durchführbar sowie ungefährlich sind. Allerdings können sie die Wirklichkeit meist nie exakt wiedergeben. Die Gründe dafür sind vielfältig:

  • Die Wirklichkeit kann wegen Messfehlern nie exakt in Zahlen gefasst werden (ausser bei Abzählungen).
  • Das Zusammenwirken der Komponenten ist oft nicht exakt bekannt, da die zu Grunde liegenden Gesetze nicht exakt sind oder nicht alle Einflüsse berücksichtigt werden.

Immerhin werden Computersimulationen mit steigender Rechenleistung der Computer immer präziser, man denke etwa an die Wetterprognosen für die nächsten Tage.[^1]


1)
JSON wäre praktischer, ist aber «mühsamer» um direkt anzuschauen
  • lehrkraefte/ks/informatik-glf4-22-4msi.txt
  • Last modified: 2023/03/24 09:00
  • by Simon Knaus