我正在尝试执行计算,然后循环遍历相同的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术语引起的。我禁用了#34;无效"警告,因为它没有导致实际计算的问题。错误计算的第一个数据框是sinw
和cosw
。所有随后计算的数据帧都具有NaN值。
答案 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