2016-07-28 6 views
0

Ich versuche, Berechnungen durchzuführen, dann durch den gleichen Pandas Datenrahmen und die gleiche Berechnung, aber mit einer geänderten Variablen (eine Schleife, die jedes Mal erhöht, wenn es Schleifen) durchführen. Wenn der Schleifenbereich auf 1 festgelegt ist, werden alle Zeilen ordnungsgemäß berechnet und der neue Datenrahmen erstellt. Wenn Sie jedoch versuchen, das Programm tatsächlich zu durchlaufen, werden überall NaN-Werte außer der ersten Zeile angezeigt.Looping durch mehrere Datenfelder wird nicht korrekt berechnet

Omega-Schleife

for i in range(10): 
    #Determine first and last Julian dates of data 
    t1 = df.ix[:0,'jd'] 
    t2 = df.ix[n-1:,'jd'] 
    t2 = t2.reset_index(drop=True) 
    tj = t2-t1  

    #Iterate over each observation within each star file 
    jd = df['jd'] 
    dmag = df['dmag'] 

    sinw = np.sin(2*omega*jd) 
    sum1 = sinw.sum() 

    cosw = np.cos(2*omega*jd) 
    sum2 = cosw.sum() 

    #Calculate tau 
    tau = ((np.arctan(sum1/sum2))/(2*omega)) 

    avgdmag = dmag.sum()/n 


    #Calculate sample variance 
    tot = (df['dmag']-avgdmag)**2 
    tot2 = tot.sum() 

    var = tot2/(n-1) 

    #Calculate sums for power series 
    sum3 = sum3 + ((dmag - avgdmag)*np.cos(omega*(jd-tau))) 
    sum4 = sum4 + (np.cos(omega*(jd-tau)))**2 
    sum5 = sum5 + ((dmag - avgdmag)*np.sin(omega*(jd-tau))) 
    sum6 = sum6 + (np.sin(omega*(jd-tau)))**2 

    #Calculate power series and normalized power series 
    px = (((sum3**2)/sum4)+((sum5**2)/sum6))/2 
    pn = px/var 


    #Step through sequential frequencies 
    omega = omega + (1/tj) 

Ich erhielt auch eine Laufzeit von NumPy durch den Omega Begriff am Ende verursacht warnen. Ich deaktivierte "ungültige" Warnungen, da es kein Problem mit den tatsächlichen Berechnungen verursachte. Der erste falsch berechnete Datenrahmen ist sinw und cosw. Und alle nachfolgend berechneten Datenfelder haben NaN-Werte.

+0

für i in Reichweite (10): --- Ich sehe nicht "ich" in der Schleife. – Merlin

+0

Ich hatte ursprünglich nur "ich" drucken, damit ich den Fortschritt sehen konnte, aber ich brauche nicht "i" in den Berechnungen zu verwenden. Obwohl, könnte ich meinen 'omega' Begriff am Ende als Schrittgröße in der' range() 'Funktion verwenden? – Justin

Antwort

0

Es ist, weil Ihre eine pd.Series der Länge 1 ist, nicht skalar, wie Sie erwarten würden. Nach der ersten Schleife wird omega = omega + 1/tj eine Serie der Länge 1 (mit 0 als Index). Dann wird in der 2. Schleife auch tau = ((np.arctan(sum1/sum2))/(2*omega)) eine solche Serie. Beim Aktualisieren sum3, jd - tau (eine Reihe von Länge n minus eine Reihe von Länge 1) gibt Ihnen eine Serie mit allen NaN mit Ausnahme von Index 0, wo beide Serien übereinstimmen. Danach haben alle folgenden Serien viele NaN s.

Die Lösung ist tj als Skalar zu berechnen, wie tj = df.loc[n-1,'jd'] - df.loc[0,'jd'] (unter der Annahme n = len(df)).

Wie auch immer, Ihr Stück Code kann zur besseren Lesbarkeit neu geschrieben werden.

tj = df.loc[n-1,'jd'] - df.loc[0,'jd'] #tj is loop invariant 
for _ in range(10): 
    sum1 = np.sin(2*omega*df['jd']).sum() 
    sum2 = np.cos(2*omega*df['jd']).sum() 
    tau = np.arctan(sum1/sum2)/(2*omega) 
    avgdmag = df['dmag'].mean() 
    var = df['dmag'].var() #unbiased sample variance 

    sum3 += ((df['dmag'] - avgdmag)*np.cos(omega*(df['jd']-tau))) 
    sum4 += (np.cos(omega*(df['jd']-tau)))**2 
    sum5 += ((df['dmag'] - avgdmag)*np.sin(omega*(df['jd']-tau))) 
    sum6 += (np.sin(omega*(df['jd']-tau)))**2 

    px = (((sum3**2)/sum4)+((sum5**2)/sum6))/2 
    pn = px/var 

    omega += 1/tj 
+0

Ausgezeichnet. Das hat einwandfrei funktioniert. Danke für die Hilfe. Noch ein bisschen neu für all das, also sind die Abkürzungen und Vereinfachungen gut für mich zu lernen und zu integrieren. – Justin