2016-05-05 7 views
-1

Ich habe den folgenden Code, der gut arbeitet:Nameerror name ‚var‘ nicht in IF-Anweisung definiert

for index, row in dfcodes.iterrows(): 
# for each security code identify those with 3 down candles and narrowing raneg for first 3 days of 6 day set 
scode=row['Security_Code'] 

tdate='2016-01-15' 
df=fetch_last(scode,tdate,6) 
dfreverse=df.sort('TradeDate', ascending=True) 

#look for 3 consecutive down candles with narrowing range and then 2 up candles 
dfdownbars=dfreverse.head(5) 
ncnt=1 

for index,row in dfdownbars.iterrows(): 
    otmp = row['Opening_Price'] 
    ctmp = row['Closing_Price'] 
    rtmp = abs(row['Opening_Price'] - row['Closing_Price']) 
    dtmp = row['TradeDate'] 
    if ctmp<otmp and ncnt==1: 
     o1 = otmp 
     c1 = ctmp 
     r1 = rtmp 
     d1 = dtmp 
     ncnt+=1 
    elif ctmp<otmp and otmp<o1 and ctmp<c1 and rtmp<=r1 and ncnt==2: 
     o2 = otmp 
     c2 = ctmp 
     r2 = rtmp 
     d2 = dtmp 
     ncnt += 1 
    elif ctmp<otmp and otmp<o2 and rtmp<=r2 and ncnt==3: 
     o3 = otmp 
     c3 = ctmp 
     r3 = rtmp 
     d3 = dtmp 
     ncnt += 1 
    else: 
     break 

aber sobald ich einen 4. elif füge ich die folgende Fehlermeldung erhalten:

elif ctmp> otmp und CTMP> c3 und Nzähl == 4: Nameerror: name 'c3' ist nicht

definiert

dh der fehlerhafte Code nun wie folgt aussieht:

for index, row in dfcodes.iterrows(): 
# for each security code identify those with 3 down candles and narrowing raneg for first 3 days of 6 day set 
scode=row['Security_Code'] 

tdate='2016-01-15' 
df=fetch_last(scode,tdate,6) 
dfreverse=df.sort('TradeDate', ascending=True) 

#look for 3 consecutive down candles with narrowing range and then 2 up candles 
dfdownbars=dfreverse.head(5) 
ncnt=1 

for index,row in dfdownbars.iterrows(): 
    otmp = row['Opening_Price'] 
    ctmp = row['Closing_Price'] 
    rtmp = abs(row['Opening_Price'] - row['Closing_Price']) 
    dtmp = row['TradeDate'] 
    if ctmp<otmp and ncnt==1: 
     o1 = otmp 
     c1 = ctmp 
     r1 = rtmp 
     d1 = dtmp 
     ncnt+=1 
    elif ctmp<otmp and otmp<o1 and ctmp<c1 and rtmp<=r1 and ncnt==2: 
     o2 = otmp 
     c2 = ctmp 
     r2 = rtmp 
     d2 = dtmp 
     ncnt += 1 
    elif ctmp<otmp and otmp<o2 and rtmp<=r2 and ncnt==3: 
     o3 = otmp 
     c3 = ctmp 
     r3 = rtmp 
     d3 = dtmp 
     ncnt += 1 
    elif ctmp > otmp and ctmp > c3 and ncnt==4: # first up candle after 3 downs 
     o4 = otmp 
     c4 = ctmp 
     r4 = rtmp 
     ncnt += 1 
    else: 
     break 

cnt -= 1 

Kann mir jemand sagen, warum die Variable 'c3' in der finalen 'elif'-Anweisung nicht erkannt wird, wenn alle Variablen c1 - c3 erkannt wurden, bevor ich das letzte' elif 'hinzugefügt habe? By the way, ich bin Iterieren durch eine Pandas Datenrahmen

Jede mögliche Unterstützung viel

Glen

+0

Ja, 'c3' ist nur in einem anderen' elif' Block definiert. Da immer nur ein Block in einer 'if ... elif .. else'-Anweisung ausgeführt wird, können Sie keine Namen verwenden, die nur in einem dieser Blöcke im Test einer anderen zugewiesen sind. –

+0

weil, wenn das 'elif' erreicht wurde, das heißt, die Bedingung darüber wurde nicht erfüllt. Implizieren, dass 'c3' nie erklärt wurde. – hjpotter92

+0

Dass 'o1' und' o2' keine Fehler sind, liegt daran, dass Python nicht einmal auf spätere Testbedingungen schaut, wenn ein früherer schon übereinstimmt. Wenn also 'ctmp

Antwort

0

TL geschätzt; DR: Sie werden wahrscheinlich funktionieren, wenn Sie zunächst prüfen Nzähl:

`if ncnt==4 and ctmp > otmp and ctmp > c3:` 

Für eine längere Antwort müssen Sie zuerst akzeptieren, dass Sie etwas ein wenig schwierig und ungewöhnlich tun. Sie definieren Namen innerhalb der else-Klauseln und vertrauen darauf, dass Ihr Programm diese Cluses ausführt, um die Namen zu definieren, bevor sie später im Code überprüft werden.

Das heißt, daß in der ersten Iteration der for-Schleife ist, drücken Sie diese Zeile:

if ctmp<otmp and ncnt==1: 

, weil es wahr ist, dass Sie den Code ausführen, um neue Variablen zu definieren o1, c1 und r1. Wenn die Bedingung bei der ersten Iteration falsch waren, würden Sie diese Zeile nächsten Treffer:

elif ctmp<otmp and otmp<o1 and ctmp<c1 and rtmp<=r1 and ncnt==2: 
    o2 = otmp 

Python beginnen würde Variablen aufzublicken, versuchen, den Wert von o1 zu erhalten und Sie umgehend die NameError: name 'o1' is not defined Ausnahme geben.

Es gibt zwei echte Optionen:

  1. allthe Namen definieren, bevor Sie sie verwenden, sie wahrscheinlich auf 0. Dies ist die bevorzugte Methode ist und Sie von Menschen vermeidet mit der Aufrechterhaltung der Code Jahren damit beauftragt stolzierte nach unten die Linie.

  2. Überprüfen Sie sorgfältig zuerst Ihren Zustand. Dieser Code ist eine kleine Zustandsmaschine mit dem von ncnt notierten aktuellen Zustand. Wenn Ihr Code zuerst überprüft hat, dass er sich im korrekten Status befand, würden Sie niemals auf die ungültige Variable verweisen. Besserer Code würde ncount umbenennen und Ihre if-Anweisung mit if nState == 3 and o3 > something... starten. Sobald der nState falsch ist, wird die if-Anweisung beendet, ohne auf Variablen zu schauen, die noch nicht existieren.

Codierung beibehalten.

+0

Thk du Charles. Alles ergibt jetzt Sinn. Habe eine Weile nicht codiert und denke nicht so, wie ich sollte. – glen

Verwandte Themen