Überprüfen eines Codes

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
derCode-Neuling
User
Beiträge: 2
Registriert: Montag 23. Mai 2022, 11:11

Hallo Zusammen, das ist mein erster Post in diesem Forum und ich bin für jeden Dankbar der hilft.

Ich wollte ein Code für die Klassiker Aufgabe, wo es um Filme und deren Bewertungen geht, schreiben und komme an einem Punkt nicht weiter.
Bei meiner Funktion

Code: Alles auswählen

def genres_and_ratings(dataframe,first,second,Erscheinungsjahr):
, soll der Nutzer zwei Kategorien festlegen können (first & Second), sowie das Erscheinungsjahr nach dem gefiltert wird und das alles aus einem gegeben Dataframe. Jetzt wollte ich eine Bedingung einbauen, dass falls es das Genre nicht gibt (z.B. wenn der Nutzer "sdjjkfs" eingibt), das Programm ein Print Befehl ausführt

Code: Alles auswählen

print("Es liegt kein Film im Genre", first, "&", second, "im Jahr", Erscheinungsjahr, "vor")
.

sollte es das Genre geben, so soll das Programm in eine if Schleife laufen:

Code: Alles auswählen

    if not first.empty or not second.empty:
        one = merged1
        two = merged2
        plt.hist(one,weights = np.ones(len(one))/len(one),bins = 10,
            range = (0,5), colour = "green", label = first, 
                 histtype = "step",density = False)
        plt.hist(two,weights = np.ones(len(two))/len(two),bins = 10,
            range = (0,5), colour = "red", label = first, 
                 histtype = "step",density = False)
Ich bekomme allerdings die Fehlermeldung:
str' object has no attribute 'empty'

Wie kann ich weiter vorgehen?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

`first` und `second`, `merged1` und `merged2` oder `one` und `two` sind allesamt schlechte Variablennamen, weil sie nicht beschreiben, was den nun das erste oder zweite ist.
Wenn man das selbe für das erste Genre und das zweite Genre macht, dann schreibt man dafür eine Funktion, die zwei mal aufgerufen wird.
Du schreibst, dass Du für den Wert "ghfdkj" in `first` eine Sonderbehandlung willst, dann ist es wenig Sinnvoll zu prüfen, ob `first` ein leerer String ist, was man übrigens einfach mit `not first` macht. Woher hast Du die Annahme, dass es ein Attribut `empty` geben könnte?
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@derCode-Neuling: Die Namen die Sirius3 aufzählt, fallen im Grunde alle unter die Faustregel, dass man keine Namen nummeriert. Bei `merged1` und `merged2` sieht man das direkt, aber auch `first` und `second`, und `one` und `two` sind nummerierte Namen. Entweder will man sich dort bessere Namen überlegen, oder gar keine Einzelnamen und -werte, sondern eine Datenstruktur. Warum sind das exakt zwei Genres? Was ist wenn der Benutzer nur ein Genre wählen möchte? Oder wenn es drei sind? Es würde hier Sinn machen eine Liste mit Genres zu verwenden. Das löst auch die Codewiederholung beim Plotten, weil man aus einer Liste mit Genres auch eine Liste mit Ergebnissen bekommt, die man dann in einer Schleife plotten kann.

Die Fehlermeldung ist ja recht eindeutig: Zeichenketten haben kein `empty`-Attribut. Du wolltest da vielleicht `merged1.empty` statt `first.empty`, denn `DataFrame`- oder `Series`-Objekte haben ein `empty`-Attribut. Da rächt sich vielleicht schon die generische, nichtssagende Namenswahl, denn wenn `first` und `merged1` besser benannt wären, beispielsweise `first_genre_name` und `first_genre_data`, wäre Dir das selbst beim Lesen unter Umständen schon aufgefallen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase). `Erscheinungsjahr` ist keine Klasse, sollte also auch nicht wie ein Klassenname geschrieben werden.

Code: Alles auswählen

def genres_and_ratings(dataframe, genre_names, erscheinungsjahr):

    ...

    if not all(genre_data.empty for genre_data in genre_datas):
        for genre_name, genre_data in zip(genre_names, genre_datas):
            plt.hist(
                genre_data,
                weights=np.ones(len(genre_data)) / len(genre_data),
                bins=10,
                range=(0, 5),
                label=genre_name,
                histtype="step",
                density=False,
            )
    else:
        print(
            "Es liegt kein Film im Genre",
            " & ".join(genre_names),
            "im Jahr",
            erscheinungsjahr,
            "vor.",
        )
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten