【问题标题】:Looping through multiple dataframes does not calculate properly循环遍历多个数据帧无法正确计算
【发布时间】:2016-07-29 11:43:20
【问题描述】:

我正在尝试执行计算,然后循环遍历相同的 pandas 数据帧并执行相同的计算,但使用更改的变量(每次循环时都会增加)。如果循环范围设置为 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)

最后我还收到了来自 NumPy 的运行时警告,该警告是由 omega 术语引起的。我禁用了“无效”警告,因为它不会导致实际计算出现问题。第一个错误计算的数据帧是sinwcosw。并且所有随后计算的数据帧都有 NaN 值。

【问题讨论】:

  • for i in range(10): --- 我没有在循环中看到“i”。
  • 我最初只是打印“i”以便我可以看到进度,但我不需要在计算中使用“i”。虽然,我可以在末尾使用我的omega 术语作为range() 函数中的步长吗?

标签: python-3.x numpy pandas


【解决方案1】:

这是因为您的 tj 是长度为 1 的 pd.Series,而不是您期望的标量。在第一个循环之后,omega = omega + 1/tj 变为长度为 1 的系列(以 0 作为索引)。然后在第二个循环中,tau = ((np.arctan(sum1/sum2))/(2*omega)) 也变成了这样的一个系列。更新 sum3 时,jd - tau(长度为 n 的系列减去长度为 1 的系列)会为您提供一个包含所有 NaN 的系列,但索引 0 处两个系列都匹配。之后所有后续系列都有很多NaNs。

解决方法是将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

【讨论】:

  • 优秀。那工作完美无缺。感谢您的帮助。对这一切还是有点陌生​​,所以快捷方式和简化对我来说是很好的学习和融入。
猜你喜欢
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多