2016-07-28 45 views
0

我試圖通過相同的數據幀的熊貓來執行計算,然後循環,並執行相同的計算,但具有改變的變量(一個,每個它循環時間增加)。如果循環範圍設置爲1,則所有行均可正確計算並創建新的數據框。但是,嘗試實際循環程序會導致除第一行以外的所有NaN值。通過多個dataframes循環不計算正確

歐米茄環

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) 

我也收到一個運行時從由在端部中的ω術語NumPy的警告。我禁用了「無效」警告,因爲它不會對實際計算造成影響。錯誤地計算第一個數據幀是​​和cosw。隨後所有計算的數據幀都有NaN值。

+0

我在範圍內(10):---我沒有看到「我」在循環中。 – Merlin

+0

我本來只是打印出「我」,所以我能看到進步,但我並不需要使用在計算中的「i」。雖然,我可以在'range()'函數中將末尾的'omega'作爲步長嗎? – Justin

回答

0

這是因爲你的tj是長度爲1的pd.Series,不標如你所願。在第一個循環之後,omega = omega + 1/tj變爲長度爲1的系列(以0作爲索引)。然後在第二個循環中,tau = ((np.arctan(sum1/sum2))/(2*omega))也成爲這樣一個系列。當更新sum3jd - tau(長度n的系列減去長度1的系列),爲您提供了所有NaN一個系列,除了在指數0,其中兩個系列賽。之後的所有後續系列有很多NaN s。

解決的辦法是將tj作爲標量來計算,如 tj = df.loc[n-1,'jd'] - df.loc[0,'jd'](假設爲n = len(df))。

反正,你的一段代碼可以用於可讀性重寫。

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