2016-07-28 7 views
0

計算を実行しようとしていて、同じパンダデータフレームをループして同じ計算を実行しますが、変更された変数(ループするたびに増加する変数)ループ範囲を1に設定すると、すべての行が正しく計算され、新しいデータフレームが作成されます。ただし、実際にプログラムをループさせようとすると、最初の行を除くすべてのNaN値になります。複数のデータフレームのルーピングが正しく計算されない

オメガループ

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) 

Iはまた、端部にオメガ用語によって引き起こさnumpyのから実行時の警告を受けました。私は実際の計算に問題を引き起こさなかったので、無効な警告を無効にしました。誤って計算される最初のデータフレームは​​とcoswです。その後計算されるデータフレームはすべてNaN値を持ちます。

+0

私は範囲(10)内にあります:---私はループ内で "i"を見ません。 – Merlin

+0

私はもともと「i」だけ印刷していたため、進捗状況を確認できましたが、計算に「i」を使用する必要はありません。しかし、私は 'range()'関数のステップサイズとして、最後に 'omega'を使用できますか? – Justin

答えて

0

あなたのtjは長さ1のpdであるため、スカラーではありません。最初のループの後、omega = omega + 1/tjは、長さ1の系列になります(インデックスは0です)。その後、第2ループでは、tau = ((np.arctan(sum1/sum2))/(2*omega))もこのようなシリーズになります。 sum3を更新する場合、jd - tau(長さnシリーズから長さ1シリーズを差し引いたもの)を更新すると、両方のシリーズが一致するインデックス0を除いて、すべてNaNのシリーズが得られます。その後、すべてのシリーズにはNaNがたくさんあります。

解決策は、 tj = df.loc[n-1,'jd'] - df.loc[0,'jd']n = len(df)と仮定)などのスカラーとしてtjを計算することです。

とにかく、あなたのコードは読みやすくするために書き直すことができます。

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

優れています。それは完璧に働いた。お手伝いありがとう。それでも少し新しいので、ショートカットと単純化は私が学び、組み込むのに良いことです。 – Justin

関連する問題