2017-10-08 46 views
0
df.at[0,'Initial'] = 10000 
df.loc[1:99,'Initial'] = df['Initial'].shift(1) + (df['Initial'].shift(1) * df['Pct Change']) 


Initial 
10000.000000 
10063.995538 
NaN 
NaN 
NaN... 

与此代码我创建的10000起始值和它应该添加前值+(前值* PCT更改)数据帧不累加值正确(索引)

但是嗨,大家好它在第二行后继续生产NaN

有任何建议吗?

Initial   Pct Change 
10000.000000 -0.000710 
10063.995538  0.006400 
NaN    0.002827 
NaN    0.009148 
NaN    0.000694 

我喜欢在初始的3线为10063.995538 +(10063.995538 * 0.002827) 但它产生的NaN 不知这种语法df.loc [1:99, '初始']是错误的?

我只能做出初步适当做这个填充:

df.at[0,'Initial'] = 10000 
df.loc[1:,'Initial'] = df['Initial'].shift(1) + (df['Initial'].shift(1) * df['Pct Change']) 
df.loc[2:,'Initial'] = df['Initial'].shift(1) + (df['Initial'].shift(1) * df['Pct Change']) 
df.loc[3:,'Initial'] = df['Initial'].shift(1) + (df['Initial'].shift(1) * df['Pct Change']) 
`....` 

但为什么不df.loc [1:99, '初始']工作的?

+0

什么是初始'Initial'的值? –

+0

嗨,我用 df.at [0,'初始'] =​​ 10000 我没有任何其他行关于初始以外的这2行 –

+0

从你的代码,我假设你想做一些迭代计算。不幸的是,这段代码不会让你走得太远,因为它处理的是'Initial'列中的当前值,除了第一列之外,所有这些都恰好是'NaN'。 –

回答

1

无需循环,尝试一下cumprod

df['Initial']=np.append(10000,df.iloc[1:,].PctChange.add(1).cumprod().values*10000) 
df 
Out[261]: 
    PctChange  Initial 
0 -0.000710 10000.000000 
1 0.006400 10064.000000 
2 0.002827 10092.450928 
3 0.009148 10184.776669 
4 0.000694 10191.844904 
+0

太棒了。非常好。 * 10000我花了一段时间才明白。这就是为什么我添加numpy标签。 Numpy通常会赢得 – Dark

+0

@Bharathshetty只是一个多...〜:) – Wen

+1

通常我在concat上使用* 10000来扩展数据框。这就是为什么我花了一些时间。从最终的两端相乘。我真的很感谢你的数学技能:) – Dark

1

其更好,你去一个for循环,当谈到这种操作,即

df.loc[0,'Initial'] = 10000 
for i in range(1,len(df)): 
    df.loc[i,'Initial'] = df.loc[i-1,'Initial'] + (df.loc[i-1,'Initial'] * df.loc[i,'Pct Change']) 
 
     Initial Pct Change 
0 10000.000000 -0.000710 
1 10064.000000 0.006400 
2 10092.450928 0.002827 
3 10184.776669 0.009148 
4 10191.844904 0.000694 
+0

伟大的这是一个很好的选择,谢谢:) –

+0

如果你有兴趣摆脱for循环... – Wen

+0

我正在分析它。 – Dark