2017-10-08 27 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