2016-11-30 3 views
6

Это мой dataframe:Оптимизация итерационного вычисления значений на основе скорости роста

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) 

Мне нужно рассчитать значение на основе скорости роста для каждого столбца У меня есть dataframe с 400 столбцами и их соответствующими темпами роста.

Я вычислил скорость роста по следующей формуле: (one year old value)*(1+current month growth rate). это рассчитанное значение будет использоваться для получения значения следующего года и т. д. Например, у меня 400 столбцов и их соответствующий темп роста. Временной ряд содержит 30-летние данные

В настоящее время я использую 2 для цикла, чтобы получить каждый столбец, а затем второй для повторения по периоду времени для каждого столбца и получения значений, вычисленных в предыдущем цикле. Требуется несколько часов, чтобы пройти более 500 строк и 400 столбцов. Есть ли лучший способ для этого `

Мой фрагмент кода ниже:

GRPBY = список колонки в dataframe

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

Пожалуйста, включите [mcve] (http://stackoverflow.com/help/mcve): (? Что такое 'grwth') дают нам достаточно просто данные, чтобы играть, но не более –

+0

Look для series.rolling.apply –

+0

GRWTH - это список столбцов – Sanjay

ответ

1

Вы можете использовать значение года в качестве индекса, а затем использовать простой цикл для присвоения данных, т.е.

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 

Надеется, что это помогает