循环遍历多个数据帧无法正确计算

时间:2016-07-28 15:54:28

标签: python-3.x numpy pandas

我正在尝试执行计算,然后循环遍历相同的pandas数据帧并执行相同的计算,但使用更改的变量(每次循环时增加一个变量)。如果循环范围设置为1,则所有行都会正确计算并创建新的数据帧。但是,尝试实际循环程序会导致NaN值除了第一行以外的所有位置。

Omega循环

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的运行时警告,该警告是由最后的omega术语引起的。我禁用了#34;无效"警告,因为它没有导致实际计算的问题。错误计算的第一个数据框是sinwcosw。所有随后计算的数据帧都具有NaN值。

1 个答案:

答案 0 :(得分:0)

这是因为你的tj是长度为1的pd.Series,而不是你期望的标量。在第一个循环之后,omega = omega + 1/tj变为长度为1的系列(索引为0)。然后在第二个循环中,tau = ((np.arctan(sum1/sum2))/(2*omega))也变成了这样一个系列。更新sum3时,jd - 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