2017-06-20 6 views
0

Zum Plotten definiere ich Farben basierend auf einer Bedingung (die Bedingungen sind einige Werte in bestimmten Spalten eines Pandas Datenrahmens). Jetzt bin ich mir nicht sicher, ob ich bei der Definition der Funktion einen Fehler mache. Die Funktion ist wie folgt:"UnboundLocalError: lokale Variable referenziert vor Zuweisung" beim Aufruf einer Funktion

def getColour(C, threshold): 
    neg = 0 - threshold 
    half = threshold/2 
    if C <= (neg - half): 
     clr = '#2b83ba' 
    if ((neg - half) < C <= neg): 
     clr = '#abdda4' 
    if ((threshold + half) > C >= threshold): 
     clr = '#fdae61' 
    if (C > (threshold + half)):  
     clr = '#d7191c' 
    return clr 

Und das ist, wie ich es umsetzen: Ich durch Zeilen eines Datenrahmens durchlaufen, dann finden Spalten eine Bedingung erfüllt, die Indizes aus diesen Spalten verwenden, um Parameter aus einer Liste, Wenden Sie eine andere Funktion an, die die Ergebnisse generiert (diese Funktion funktioniert, das Skript wurde getestet und funktionierte ordnungsgemäß, wenn ich eine feste Farbe für das Plotten festlegte) und dann die Ergebnisse mit einer anderen Farbe plotten.

for index, row in Sparse.iterrows(): 
    lim = row[row.notnull()] 
    ci = [row.index.get_loc(x) for x in lim.index] 
    params = np.array(myList)[ci] 

    for i, w in enumerate(params): 
     w = w.tolist() 
     print w, w[2] 
     print ci[i] 
     colour = getColour(ci[i], threshold) 
     x, y = myFunction(w) 
     plt.plot(x,y, color=colour,linestyle='-',linewidth=1.5) 

Aber das wirft einen Fehler UnboundLocalError: local variable 'clr' referenced before assignment auf der Linie colour = getColour(ci[i], threshold).

Ich habe andere Beiträge zu diesem Fehler gelesen, aber ich kann nicht sehen, was mein Problem ist.

+0

I keine Ihrer Bedingungen vermuten, sind zu erhalten und 'clr' wird nie zugewiesen, so w Wenn Sie versuchen, "clr" zurückzugeben, erhalten Sie den Fehler. –

+2

Der wahrscheinlichste Grund für Ihren Fehler ist, dass keine Ihrer 'if'-Anweisungen' True 'getestet wurde, also wurde 'clr' nie definiert. Das bedeutet, dass Sie versucht haben, eine Variable vor ihrer Zuweisung zu verwenden, indem Sie 'return clr' ausführen. Eine einfache Lösung wäre es, 'clr' einen Standardwert wie' None', _before_ Ihre 'if' Anweisungen zu geben. –

+0

Ich sehe, du hast Recht! Ich habe die erste Version hinzugefügt und die Werte korrigiert, aber jetzt bekomme ich 'ValueError: Der Wahrheitswert einer Serie ist mehrdeutig. Benutze a.empty, a.bool(), a.item(), a.any() oder a.all(). ' – durbachit

Antwort

2

Im Allgemeinen ist es eine gute Idee, die Logik Ihrer Bedingung zu konsolidieren. Haben Ihre clr alle diese Werte? Nein, so können Sie einige elif verwenden:

def getColour(C, threshold): 
    neg = 0 - threshold 
    half = threshold/2 
    if C <= (neg - half): 
     clr = '#2b83ba' 
    elif ((neg - half) < C <= neg): 
     clr = '#abdda4' 
    elif ((threshold + half) > C >= threshold): 
     clr = '#fdae61' 
    elif (C > (threshold + half)):  
     clr = '#d7191c' 
    return clr 

Dann haben Ihr Zustand geschlungen ist? Hast du alle Fälle in deinem if? Wenn ja, ist es eine gute Idee, einen Fehler in else zu werfen. Wenn nein, dann bedeutet das sind Sie ein Fall nur vergessen:

def getColour(C, threshold): 
    neg = 0 - threshold 
    half = threshold/2 
    if C <= (neg - half): 
     clr = '#2b83ba' 
    elif ((neg - half) < C <= neg): 
     clr = '#abdda4' 
    elif ((threshold + half) > C >= threshold): 
     clr = '#fdae61' 
    elif (C > (threshold + half)):  
     clr = '#d7191c' 
    else: 
     raise ValueError('Value expected for clr') 
    return clr 

Edit: Um auf deinen Kommentar zu beantworten, ich glaube, Sie mißverstehen, was ich meinte. In Python ist es besser, einen Fehler zu melden, wenn Sie etwas Unerwartetes haben. So entweder:

  • Sie geben einen Standardfarbwert wie „White“ und Sie es verwenden normalerweise
  • Sie kehren Keine und dann der Rest des Codes sollte keine Wert überprüfen, bevor es zu lesen (und dann vielleicht werfen Fehler)
  • Sie direkt einen Fehler aus,

PEP20: Errors should never pass silently.

+0

Ja, das hilft bestimmt, danke! Ich bekomme jetzt aber ValueError: Der Wahrheitswert einer Serie ist mehrdeutig. Benutze a.empty, a.bool(), a.item(), a.any() oder a.all(). ' – durbachit

+0

@durbagit Ich antwortete auf deinen Kommentar –

+0

Ah, ich verstehe. Nein, du hast es falsch verstanden. Ich bekomme den 'ValueError: Der Wahrheitswert einer Serie ist mehrdeutig. Benutze a.empty, a.bool(), a.item(), a.any() oder a.all(). 'Nachdem ich einen Standard-Farbwert vor der if-Schleife gesetzt habe und den' raise ValueError (' Wert erwartet für clr ') Zeile in der Schleife. Es sieht so aus, als ob es nicht mit einem NaN umgehen kann. – durbachit

Verwandte Themen