Reframe* (Lösungen)#

In den folgenden Aufgaben lösen Sie erneut die Aufgaben, welche Sie bereits im Hauptteil des Tutoriums gelöst haben, dieses mal eben in einem anderen Syntax.

Hinweis: Aufgaben, die durch einen Asterisk (*) markiert sind, sind Bonusaufgaben. Diese Aufgaben können im Tutorium behandelt werden, dies ist jedoch von den Übungsleitern nicht geplant.

Aufgabe 5: Bibliothek*#

Programmieren Sie die folgenden textuellen Anfragen mittels Python reframe.

Sie erhalten erneut die Bibliotheksdatenbank.

from reframe import Relation

Benutzer = Relation("../resources/05_relationale_algebra/Benutzer.csv")
Leiht_aus = Relation("../resources/05_relationale_algebra/Leiht_aus.csv")
Exemplar = Relation("../resources/05_relationale_algebra/Exemplar.csv")
Buch = Relation("../resources/05_relationale_algebra/Buch.csv")

print(Benutzer)
print(Leiht_aus)
print(Exemplar)
print(Buch)
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[1], line 1
----> 1 from reframe import Relation
      3 Benutzer = Relation("../resources/05_relationale_algebra/Benutzer.csv")
      4 Leiht_aus = Relation("../resources/05_relationale_algebra/Leiht_aus.csv")

ModuleNotFoundError: No module named 'reframe'

Aufgabe 5.1*#

Welche englischsprachigen Bücher (Titel) gibt es?

Hide code cell content

#### Musterlösung
Buch.select('Sprache == "en"').project(["Titel"])

Aufgabe 5.2*#

Welche Benutzer haben noch nie ein Buch ausgeliehen?

Hide code cell content

#### Musterlösung
Benutzer.project(["Bid"]).minus(Leiht_aus.project(["Bid"])).njoin(Benutzer).project(["Vorname"])

Aufgabe 5.3*#

Welche Benutzer (Vornamen) haben ein Exemplar mit dem Buchtitel „Bierbrauen fuer jedermann“ ausgeliehen?

Hide code cell content

#### Musterlösung
Buch.select('Titel == "Bierbrauen fuer jedermann"').njoin(Exemplar).njoin(Leiht_aus).njoin(
    Benutzer
).project(["Vorname"])

Aufgabe 5.4*#

Alle Benutzer (Vornamen), die mindestens zwei Exemplare ausgeliehen haben.

Hide code cell content

#### Musterlösung
Leiht_aus.groupby(["Bid"]).count("Signatur").select("count_Signatur >= 2").njoin(Benutzer).project(
    ["Vorname"]
)

Aufgabe 6: Regatta-Informationssystem*#

Programmieren Sie die folgenden textuellen Anfragen mittels Python reframe.

Sie erhalten erneut die Bibliotheksdatenbank.

Bootsklasse = Relation("../resources/05_relationale_algebra/Bootsklasse.csv")
Wettfahrt = Relation("../resources/05_relationale_algebra/Wettfahrt.csv")
Platzierung = Relation("../resources/05_relationale_algebra/Platzierung.csv")
Teilnehmer = Relation("../resources/05_relationale_algebra/Teilnehmer.csv")

print(Bootsklasse)
print(Wettfahrt)
print(Platzierung)
print(Teilnehmer)

Aufgabe 6.1*#

Aus welchem Material (Bauart) wurde das Boot mit der Segelnummer „GER 4318“ gebaut und welcher Klasse gehört es an?

Hide code cell content

#### Musterlösung
Teilnehmer.select('SegelNr == "GER 4318"').njoin(
    Bootsklasse.rename("Klasse", "Bootsklasse")
).project(["Bauart", "Bootsklasse"])

Aufgabe 6.2*#

Zu welcher Zeit starteten die Teilnehmer am „29.5.03“ und welche Boote der Klasse „Optimist“ nahmen an dieser Regatta teil?

Hide code cell content

#### Musterlösung
Wettfahrten = (
    Wettfahrt.select('Datum == "29.5.03"')
    .project(["FahrtNr", "Zeit"])
    .rename("FahrtNr", "Wettfahrt")
)

Wettfahrten.njoin(Platzierung).njoin(Teilnehmer).select('Bootsklasse == "Optimist"').project(
    ["Zeit", "Name"]
)

Aufgabe 6.3*#

An welchen Wettfahrten haben ausschließlich Holzboote teilgenommen?

Hide code cell content

#### Musterlösung
Teilnehmer_mit_Bootsklassen = Teilnehmer.rename("Name", "TName").njoin(
    Bootsklasse.rename("Klasse", "Bootsklasse")
)
# print(Teilnehmer_mit_Bootsklassen)
Wettfahrten_mit_Platzierungen = Wettfahrt.njoin(Platzierung.rename("Wettfahrt", "FahrtNr"))
# print(Wettfahrten_mit_Platzierungen)
Teilnehmer_mit_Bootsklassen.select('Bauart == "Holz"').njoin(
    Wettfahrten_mit_Platzierungen
).project(["FahrtNr", "Name"]).minus(
    Teilnehmer_mit_Bootsklassen.njoin(Wettfahrten_mit_Platzierungen)
    .select('Bauart != "Holz"')
    .project(["FahrtNr", "Name"])
)

Aufgabe 6.4*#

Welche Bootsklassen nehmen am „Franz Huber Gedenk Preis“ oder am „Moorpokal“ teil?

Hide code cell content

#### Musterlösung
Wettfahrten = Wettfahrt.select('Name == "Franz Huber Gedenk Preis" | Name == "Moorpokal"')
# print(Zwischenergebnis)
Wettfahrten.njoin(Platzierung.rename("Wettfahrt", "FahrtNr")).njoin(
    Teilnehmer.rename("Name", "TName")
).project(["Bootsklasse"])

Aufgabe 6.5*#

Welche Boote (SegelNr, Name) konnten das Rennen „Blaues Band“ nicht beenden („dnf“)?

Hide code cell content

#### Musterlösung
Platzierung.rename("Wettfahrt", "FahrtNr").rightouterjoin(
    Wettfahrt.select('Name == "Blaues Band"').rename("Name", "WName")
).select('Platz == "dnf"').njoin(Teilnehmer).project(["SegelNr", "Name"])

Aufgabe 6.6*#

Wie viele Boote haben am „Franz Huber Gedenk Preis“ teilgenommen?

Hide code cell content

#### Musterlösung
Wettfahrt.select('Name == "Franz Huber Gedenk Preis"').njoin(
    Platzierung.rename("Wettfahrt", "FahrtNr")
).count().rename("count", "Anzahl")

Aufgabe 6.7*#

An welchen Wettfahrten (Name) haben Boote aller Bauarten teilgenommen.

Hide code cell content

#### Musterlösung
Teilnehmer.min("Baujahr").rename("min", "Baujahr").njoin(Teilnehmer).njoin(
    Platzierung.rename("Wettfahrt", "FahrtNr")
).njoin(Wettfahrt.rename("Name", "WName")).project(["WName"])

Aufgabe 6.8*#

An welchen Wettfahrten (Name) haben Boote aller Bauarten teilgenommen haben.

Hinweis: reframe hat keinen eigenen Divisions-Operator.

Hide code cell content

#### Musterlösung

a = Bootsklasse.project(["Bauart"]).count()
b = Bootsklasse.rename("Klasse", "Bootsklasse").njoin(Teilnehmer)
c = b.njoin(Platzierung.rename("Wettfahrt", "FahrtNr"))
d = c.njoin(Wettfahrt.rename("Name", "WName")).project(["FahrtNr", "Bauart"])
e = d.groupby(["FahrtNr"]).count("Bauart").njoin(a.rename("count", "count_Bauart"))
f = e.project(["FahrtNr"]).njoin(Wettfahrt).project(["Name"])
f