Seite 1 von 1

Invalid syntax

Verfasst: Donnerstag 31. Januar 2019, 13:45
von Lizzy
Hi,
ich habe folgende if / elif Implementierung:

Code: Alles auswählen

Input = pd.read_excel(r'/Users/lisa/Documents/Uni/Masterarbeit /ML/Boostet/Input.xlsx')
df2 = DataFrame(Input,columns=['i', 'muL', 'sdL', 'w','class', 'prediction'])
df2.head()

Code: Alles auswählen

beta = 0
for row in df2.iterrows():
    if row['prediction'] == 2:
        beta = beta + (row['w']*(1-row['sdL']*0.0124/row['muL'])
    elif row['prediction'] == 1:
        beta = beta + (row['w']*(1-row['sdL']*0.1172/row['muL'])
    else:
       beta = beta + (row['w']*(1-row['sdL']*0.003/row['muL'])
        
print beta

Und bekomme immer den Fehler invalid Syntax (für elif). Weiß jemand was hier falsch ist?

Danke :)

Re: Invalid syntax

Verfasst: Donnerstag 31. Januar 2019, 13:57
von __deets__
Bitte den gesamten Stacktrace zeigen. So sieht das naemlich korrekt aus, auch wenn du eine Unsauberkeit im else-clause hast - die Einrueckung ist nicht 4 Spaces.

Code: Alles auswählen

beta = 0
row = dict(prediction=2)
for row in [row]:
    if row['prediction'] == 2:
        beta = beta + 1
    elif row['prediction'] == 1:
        beta = beta + 2
    else:
       beta = beta + 3

print(beta)

Re: Invalid syntax

Verfasst: Donnerstag 31. Januar 2019, 14:08
von Lizzy
Danke für die Antwort. Was macht bei deinem Code das dict(predicition=2)?

Und was fehlt bei meinem Code? Ich habe eigentlich alles angegeben

Das ist die Fehlermeldung

Code: Alles auswählen

File "<ipython-input-41-9bc064f883d9>", line 5
    elif row['prediction'] == 1:
       ^
SyntaxError: invalid syntax


Re: Invalid syntax

Verfasst: Donnerstag 31. Januar 2019, 14:12
von pillmuncher
Der Fehler kommt von der Zeile davor. Da fehlt eine schließende Klammer. In den folgenden Zeilen übrigens auch.

Re: Invalid syntax

Verfasst: Donnerstag 31. Januar 2019, 14:16
von Lizzy
Danke, die Klammern hab ich korrigiert.
Nun folgende Fehlermeldung:

Code: Alles auswählen

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-43-472ff704b29d> in <module>
      1 beta = 0
      2 for row in df2.iterrows():
----> 3     if row['prediction'] == 2:
      4         beta = beta + (row['w']*(1-row['sdL']*0.0124/row['muL']))
      5     elif row['prediction'] == 1:

TypeError: tuple indices must be integers or slices, not str


Re: Invalid syntax

Verfasst: Donnerstag 31. Januar 2019, 14:21
von __deets__
Das Objekt das du in row hast ist nicht was du denkst das es ist. Du tust so als ob es ein mapping/dictionary/Woerterbuch waere, mit Strings als Schluesseln. Es ist aber ein Tupel, also mit Stellen/Nummerbasiertem Zugriff. Warum dem so ist kannst du der Pandas-Dokumentation zur Methode iterrows entnehmen.

https://pandas.pydata.org/pandas-docs/s ... rrows.html

Re: Invalid syntax

Verfasst: Donnerstag 31. Januar 2019, 14:28
von Lizzy
Aber wie kann ich dann auf zB den Wert von w in der jeweiligen Zeile zugreifen?

Re: Invalid syntax

Verfasst: Donnerstag 31. Januar 2019, 14:32
von __deets__
Das ist in der Dokumentation recht genau beschrieben, Beispiel inklusive.

"Iterate over DataFrame rows as (index, Series) pairs."

Und

row = next(df.iterrows())[1]

Der Sinn der [1] besteht darin, auf den zweiten Wert, die eigentliche Serie von Daten, zuzugreifen.

Re: Invalid syntax

Verfasst: Donnerstag 31. Januar 2019, 14:49
von __blackjack__
@Lizzy: Wobei das alles ”falsch” aussieht — wenn da Pandas verwendet wird, warum wird dann nicht Pandas auch tatsächlich verwendet? Das benutzt man ja gerade damit man *keine* ``for``-Schleifen über die Zeilen schreiben muss.

Re: Invalid syntax

Verfasst: Donnerstag 31. Januar 2019, 14:55
von Lizzy
@blackjack: Ehrlich gesagt kenn ich mich mit Python / Pandas nicht wirklich aus, wenn das irgendwie mit Pandas geht dann gerne, ich weiß nur nicht wie

Re: Invalid syntax

Verfasst: Donnerstag 31. Januar 2019, 15:38
von __blackjack__
Man braucht doch nur aus dem 'prediction'-Series-Objekt zum Beispiel mittels `map()`-Methode und einer kleinen Funktion, ein `Series`-Objekt mit den Faktoren erstellen und schon sollte man einfach mit den Series-Objekten rechnen können.