2016-11-30 6 views
1

Iは次のように見えるデータフレームを有するパンダのデータフレーム: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) 

は、2016年の値が正確に計算されるべきものである。この

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

のように見えるデータフレームを返します。しかし、2017年の値は2017年の計算のための入力として2016年の式(102.504613と100.123291)の出力を取るべきです。ここで公式は元の値(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

あなたの答えをありがとう!もう1つ質問:同じ計算を後方に行う方法はありますか?上記のデータフレーム内のカンプroッドからの各期間のシングルリターンを計算しますか? – Carmen

+1

@カルメンルックアップ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 

これを最適化するためのより良い方法があるかもしれません。

関連する問題