2016-11-30 18 views
6

に基づいた値の反復計算を最適化する。これは、私のデータフレームである:成長率

Date    A   new_growth_rate 
2011/01/01  100    
2011/02/01  101    
. 
2012/01/01  120   0.035 
2012/02/01  121   0.035 
. 
2013/01/01  131   0.036 
2013/01/01  133   0.038 

これは私が必要なものです:私は、各列 の成長率に基づいて値を計算する必要が

Date    A   new_growth_rate 
2011/01/01  100    
2011/02/01  101    
. 
. 
2012/01/01  103.62   .035 A=100/(1-0.035) 
2012/02/01  104.66   .035 A=101/(1-0.035) 
. 
. 
2013/01/01  107.49   .036 A=103.62/(1-0.036) 
2013/02/01  108.68   .038 A=104.66/(1-0.038) 

私は400列とそれに対応する成長率のデータフレームを持っています。

私は以下の式を使用して成長率を計算しました:(one year old value)*(1+current month growth rate)。この計算された値は、来年の値を取得する際に使用されます。このように私は400列とそれに対応する成長率を持っています。時系列は30年のデータを持っています

現在、私は各列を取得するために2つのループ1を使用しています。そして、各列の期間にわたって繰り返し、前のループで計算された値を取得します。 500行と400列のデータセットを処理するには数時間かかります。 ?このための良い方法は、 `あり

私のコードスニペットは以下の通りです:あなたはインデックスとして年の値を使用して、使用することができます

df_new=pd.DataFrame() 
for i,row in grpby.iterrows(): 
    df_csr=grwth.loc[(grwth['A']==row['A'])].copy() 
     a = pd.to_datetime("2011-12-01",format='%Y-%m-%d') 
     b = a 
     while b <a+relativedelta.relativedelta(months=420): 
      b=b+relativedelta.relativedelta(months=1) 
      val= df_csr.loc[df_csr['Date']==(b+relativedelta.relativedelta(months=-12))].copy() 
      val2=val.get_value(val.index[0],'Val') 
      grwth_r=df_csr.loc[df_csr['date']==b]['new_growth_rate'].copy() 
      grwth_r2=grwth_r.get_value(grwth_r.index[0],'new_growth_rate') 
      df_csr.loc[df_csr['Date']==b,'Val']=val2/(1-grwth_r2) 
     df_new=pd.concat([df_new,df_csr]) 
+4

を役に立てば幸い:(? 'grwth'あるもの)より私たちと遊ぶだけの十分なデータが得られなく –

+0

ルックfor series.rolling.apply –

+0

GRWTHは列のリストです – Sanjay

答えて

1

データフレームの列の

GRPBY =リストデータは、IE割り当てるためのループのためのシンプルな

df['Date'] = pd.to_datetime(df['Date']) 
df = df.set_index('Date') 
years = (df.index.year).unique() 

for i,j in enumerate(years): 
    if i != 0: 
     prev = df.loc[df.index.year == years[i-1]] 
     curr = df.loc[df.index.year == j] 
     df.loc[df.index.year == j,'A'] = prev['A'].values/(1-curr['new_growth_rate'].values) 

出力:

 
        A new_growth_rate 
Date         
2011-01-01 100.000000    NaN 
2011-02-01 101.000000    NaN 
2012-01-01 103.626943   0.035 
2012-02-01 104.663212   0.035 
2013-01-01 107.496829   0.036 
2013-01-01 108.797518   0.038 

は[MCVE](http://stackoverflow.com/help/mcve)記載してください、それは

関連する問題