10  Übung

10.1 Aufgabe 1 Filmdatenbank

In der ersten Aufgabe wollen wir fiktive Daten für Filmbewertungen untersuchen. Das Datenset ist dabei vereinfacht und beinhaltet folgende Spalten:

  1. Film ID
  2. Benutzer ID
  3. Bewertung

Hier ist das Datenset:

import numpy as np

bewertungen = np.array([
    [1, 101, 4.5],
    [1, 102, 3.0],
    [2, 101, 2.5],
    [2, 103, 4.0],
    [3, 101, 5.0],
    [3, 104, 3.5],
    [3, 105, 4.0]
])
a) Bestimmen Sie die jemals niedrigste und höchste Bewertung, die je gegeben wurde
niedrigste_bewertung = np.min(bewertungen[:,2])

print("Die niedrigste jemals gegebene Bertung ist:", niedrigste_bewertung)

hoechste_bewertung = np.max(bewertungen[:,2])

print("Die hoechste jemals gegebene Bertung ist:", hoechste_bewertung)
Die niedrigste jemals gegebene Bertung ist: 2.5
Die hoechste jemals gegebene Bertung ist: 5.0
b) Nennen Sie alle Bewertungen für Film 1
bewertungen_film_1 = bewertungen[np.where(bewertungen[:,0]==1)]

print("Bewertungen für Film 1:\n", bewertungen_film_1)
Bewertungen für Film 1:
 [[  1.  101.    4.5]
 [  1.  102.    3. ]]
c) Nennen Sie alle Bewertungen von Person 101
bewertungen_101 = bewertungen[np.where(bewertungen[:,1]==101)]

print("Bewertungen von Person 101:\n", bewertungen_101)
Bewertungen von Person 101:
 [[  1.  101.    4.5]
 [  2.  101.    2.5]
 [  3.  101.    5. ]]
d) Berechnen Sie die mittlere Bewertung für jeden Film und geben Sie diese nacheinander aus
for ID in [1, 2, 3]:

    mittelwert = np.mean(bewertungen[np.where(bewertungen[:,0]==ID),2])

    print("Die Mittlere Bewertung für Film", ID, "beträgt:", mittelwert) 
Die Mittlere Bewertung für Film 1 beträgt: 3.75
Die Mittlere Bewertung für Film 2 beträgt: 3.25
Die Mittlere Bewertung für Film 3 beträgt: 4.166666666666667
e) Finden SIe den Film mit der höchsten Bewertung
index_hoechste_bewertung = np.argmax(bewertungen[:,2])

print(bewertungen[index_hoechste_bewertung,:])
[  3. 101.   5.]
f) Finden Sie die Person mit den meisten Bewertungen
einzigartige_person, anzahl = np.unique(bewertungen[:, 1],return_counts=True)

meist_aktiver_person = einzigartige_person[np.argmax(anzahl)]

print("Personen mit den meisten Bewertungen:", meist_aktiver_person)
Personen mit den meisten Bewertungen: 101.0
g) Nennen Sie alle Filme mit einer Wertung von 4 oder besser.
index_bewertung_besser_vier = bewertungen[:,2] >= 4

print("Filme mit einer Wertung von 4 oder besser:")

print(bewertungen[index_bewertung_besser_vier,:])
Filme mit einer Wertung von 4 oder besser:
[[  1.  101.    4.5]
 [  2.  103.    4. ]
 [  3.  101.    5. ]
 [  3.  105.    4. ]]
h) Film Nr. 4 ist erschienen. Der Film wurde von Person 102 mit einer Note von 3.5 bewertet. Fügen Sie diesen zur Datenbank hinzu.
neue_bewertung = np.array([4, 102, 3.5])

bewertungen = np.append(bewertungen, [neue_bewertung], axis=0)

print(bewertungen)
[[  1.  101.    4.5]
 [  1.  102.    3. ]
 [  2.  101.    2.5]
 [  2.  103.    4. ]
 [  3.  101.    5. ]
 [  3.  104.    3.5]
 [  3.  105.    4. ]
 [  4.  102.    3.5]]
i) Person 102 hat sich Film Nr. 1 nochmal angesehen und hat das Ende jetzt doch verstanden. Dementsprechend soll die Berwertung jetzt auf 5.0 geändert werden.
bewertungen[(bewertungen[:, 0] == 1) & 
            (bewertungen[:, 1] == 102), 2] = 5.0

print("Aktualisieren der Bewertung:\n", bewertungen)
Aktualisieren der Bewertung:
 [[  1.  101.    4.5]
 [  1.  102.    5. ]
 [  2.  101.    2.5]
 [  2.  103.    4. ]
 [  3.  101.    5. ]
 [  3.  104.    3.5]
 [  3.  105.    4. ]
 [  4.  102.    3.5]]

10.2 Aufgabe 2 - Kryptographie - Caesar-Chiffre

In dieser Aufgabe wollen wir Text sowohl ver- als auch entschlüsseln.

Jedes Zeichen hat über die sogenannte ASCII-Tabelle einen Zahlenwert zugeordnet.

Buchstabe ASCII Code Buchstabe ASCII Code
a 97 n 110
b 98 o 111
c 99 p 112
d 100 q 113
e 101 r 114
f 102 s 115
g 103 t 116
h 104 u 117
i 105 v 118
j 106 w 119
k 107 x 120
l 108 y 121
m 109 z 122
Tabelle 10.1: Ascii-Tabelle

Der Einfachheit halber ist im Folgenden schon der Code zur Umwandlung von Buchstaben in Zahlenwerten und wieder zurück aufgeführt. Außerdem beschränken wir uns auf Texte mit kleinen Buchstaben.

Ihre Aufgabe ist nun die Zahlenwerte zu verändern.

Zunächste wollen wir eine einfache Caesar-Chiffre anwenden. Dabei werden alle Buchstaben um eine gewisse Anzahl verschoben. Ist Beispielsweise der der Verschlüsselungswert “1” wird aus einem A ein B, einem M, ein N. Ist der Wert “4” wird aus einem A ein E und aus einem M ein Q. Die Verschiebung findet zyklisch statt, das heißt bei einer Verschiebung von 1 wird aus einem Z ein A.

import numpy as np

# Funktion, die einen Buchstaben in ihren ASCII-Wert umwandelt
def buchstabe_zu_ascii(c):
    return np.array([ord(c)])

# Funktion, die einen ASCII-Wert in den passenden Buchstaben umwandelt
def ascii_zu_buchstabe(a):
    return chr(a)

\[ \textrm{ASCII}_{\textrm{verschoben}} = (\textrm{ASCII} - 97 + \textrm{Versatz}) \textrm{ mod } 26 + 97\]

Zunächst sollen alle Zeichen in Ascii Code umgewandelt werden. Dann wird die Formel auf die Zahlenwerte angewendet und schlussendlich in einer dritten schleife wieder alle Werte in Buchstaben übersetzt.

import numpy as np

# Funktion, die einen Buchstaben in ihren ASCII-Wert umwandelt
def buchstabe_zu_ascii(c):
    return ord(c)

# Funktion, die einen ASCII-Wert in den passenden Buchstaben umwandelt
def ascii_zu_buchstabe(a):
    return chr(a)

klartext = "abrakadabra"
versatz = 3

umgewandelter_text = []
verschluesselte_zahl = []
verschluesselter_text= []



for buchstabe in klartext:
    umgewandelter_text.append(buchstabe_zu_ascii(buchstabe))
print(umgewandelter_text)


for zahl in umgewandelter_text:    
    verschluesselt = (zahl - 97 + versatz) % 26 + 97
    verschluesselte_zahl.append(verschluesselt)
print(verschluesselte_zahl)


for zahl in verschluesselte_zahl:    
    verschluesselter_text.append(ascii_zu_buchstabe(zahl))
print(verschluesselter_text)
[97, 98, 114, 97, 107, 97, 100, 97, 98, 114, 97]
[100, 101, 117, 100, 110, 100, 103, 100, 101, 117, 100]
['d', 'e', 'u', 'd', 'n', 'd', 'g', 'd', 'e', 'u', 'd']
import numpy as np

# Funktion, die einen Buchstaben in ihren ASCII-Wert umwandelt
def buchstabe_zu_ascii(c):
    return ord(c)

# Funktion, die einen ASCII-Wert in den passenden Buchstaben umwandelt
def ascii_zu_buchstabe(a):
    return chr(a)

klartext = "abrakadabra"
versatz = 3

umgewandelter_text = []
verschluesselte_zahl = []
verschluesselter_text= []



for buchstabe in klartext:
    umgewandelter_text.append(buchstabe_zu_ascii(buchstabe))
print(umgewandelter_text)

umgewandelter_text = np.array(umgewandelter_text)
verschluesselte_zahl = (umgewandelter_text - 97 + versatz) % 26 + 97
print(verschluesselte_zahl)

for zahl in verschluesselte_zahl:    
    verschluesselter_text.append(ascii_zu_buchstabe(zahl))
print(verschluesselter_text)
[97, 98, 114, 97, 107, 97, 100, 97, 98, 114, 97]
[100 101 117 100 110 100 103 100 101 117 100]
['d', 'e', 'u', 'd', 'n', 'd', 'g', 'd', 'e', 'u', 'd']
import numpy as np

# Funktion, die einen Buchstaben in ihren ASCII-Wert umwandelt
def buchstabe_zu_ascii(c):
    return ord(c)

# Funktion, die einen ASCII-Wert in den passenden Buchstaben umwandelt
def ascii_zu_buchstabe(a):
    return chr(a)


versatz = 3

umgewandelter_text = []
verschluesselte_zahl = []
entschluesselter_text= []



for buchstabe in verschluesselter_text:
    umgewandelter_text.append(buchstabe_zu_ascii(buchstabe))
print(umgewandelter_text)

umgewandelter_text = np.array(umgewandelter_text)
verschluesselte_zahl = (umgewandelter_text - 97 - versatz) % 26 + 97
print(verschluesselte_zahl)

for zahl in verschluesselte_zahl:    
    entschluesselter_text.append(ascii_zu_buchstabe(zahl))
print(entschluesselter_text)
[100, 101, 117, 100, 110, 100, 103, 100, 101, 117, 100]
[ 97  98 114  97 107  97 100  97  98 114  97]
['a', 'b', 'r', 'a', 'k', 'a', 'd', 'a', 'b', 'r', 'a']