2016-11-30 20 views
1

我有一個數據幀,看起來如下熊貓數據幀:使用行的函數的輸出x表示行相同功能的輸入x + 1

SIM    Sim_1  Sim_2         
2015   100.0000 100.0000 
2016   2.504613 0.123291 
2017   3.802958 -0.919886  
2018   4.513224 -1.976056  
2019   -0.775783 3.914312  

下面的函數

df = sims.shift(1, axis = 0)*(1+sims/100) 

返回一個數據幀,看起來像這樣

SIMULATION  Sim_1  Sim_2   
2015   NaN   NaN   
2016  102.504613 100.123291  
2017   2.599862 0.122157  
2018   3.974594 -0.901709  

在2016年的價值是完全應該被計算的一個。但2017年的價值應該將2016年的公式輸出(102.504613和100.123291)作爲2017年的計算輸入。這裏公式取原始值(2.599862和0.122157) 是否有一種簡單的方法可以在pyhton中運行?

+0

如果你能拿出一個量化的公式那麼是,否則你會需要一個循環。就像'(1 + df ['Sim_1']/100).cumprod()'也許? – IanS

+0

您的預期產出是? – Psidom

+0

您可以使用for循環並計算值。 –

回答

2

您試圖顯示100個給定後續回報的增長。你的問題是最初的100不在同一個空間。如果你用零代替(0%回報),那麼做一個cumprod,你的問題就解決了。

sims.iloc[0] = 0 
sims.div(100).add(1).cumprod().mul(100) 

enter image description here

+0

感謝您的回答!還有一個問題:是否有辦法向後進行相同的計算,例如從上面的數據框中的cumprod計算每個時期的單一回報? – Carmen

+1

@Carmen查找pct_change – piRSquared

0

僅僅實現這個的原始方法:

for i in range(len(df2)): 
    try: 
    df2['Sim1'][i] = float(df2['Sim1'][i]) + float(df2['Sim1'][i-1]) 
    df2['Sim2'][i] = float(df2['Sim2'][i]) + float(df2['Sim2'][i-1]) 
    except: 
    pass 

可能有更好的方法來優化這個。