2016-11-30 13 views
6

Đây là dataframe tôi:Tối ưu hóa tính toán lặp đi lặp lại các giá trị dựa trên tốc độ tăng trưởng

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 

Đây là những gì tôi cần:

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) 

tôi cần phải tính giá trị gia tăng dựa trên tốc độ tăng trưởng cho mỗi cột Tôi có một khung dữ liệu với 400 cột và tốc độ tăng trưởng tương ứng của chúng.

Tôi đã tính toán tốc độ tăng trưởng bằng cách sử dụng công thức sau: (one year old value)*(1+current month growth rate). giá trị được tính toán này sẽ được sử dụng để nhận giá trị năm tiếp theo, v.v. Như thế này tôi có 400 cột và tốc độ tăng trưởng tương ứng của chúng. Chuỗi thời gian có 30 năm dữ liệu

Hiện tại tôi đang sử dụng 2 cho vòng lặp một để lấy từng cột và sau đó lặp lại trong khoảng thời gian cho mỗi cột và nhận giá trị được tính trước đó cho vòng lặp. Phải mất vài giờ để đi qua 500 hàng và 400 cột dữ liệu. Có cách nào tốt hơn cho này `

đoạn mã của tôi là dưới đây:?

grpby = danh sách các cột trong 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

Vui lòng gửi kèm một [mcve] (http://stackoverflow.com/help/mcve): (? Những gì là 'grwth') cho chúng ta chỉ đủ dữ liệu để chơi với nhưng không –

+0

Look cho series.rolling.apply –

+0

GRWTH là danh sách cột – Sanjay

Trả lời

1

Bạn có thể sử dụng giá trị năm như một chỉ số và sau đó sử dụng một đơn giản cho vòng lặp để gán các dữ liệu tức là

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) 

Output:

 
        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 

Hy vọng nó giúp

Các vấn đề liên quan