2016-11-30 6 views
6

के आधार पर यह मेरा dataframe है:अनुकूलन मूल्यों की पुनरावृत्ति गणना विकास दर

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) 

मैं प्रत्येक स्तंभ के लिए विकास दर के आधार पर की गणना करने के लिए मूल्य की जरूरत है:

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 

यह मैं क्या जरूरत है मेरे पास 400 कॉलम और उनकी इसी वृद्धि दर के साथ डेटाफ्रेम है।

मैंने निम्नलिखित सूत्र का उपयोग करके विकास दर की गणना की है: (one year old value)*(1+current month growth rate)। यह गणना मूल्य अगले वर्ष मूल्य प्राप्त करने के लिए उपयोग किया जाएगा और आगे। इस तरह मेरे पास 400 कॉलम और उनकी इसी वृद्धि दर है। समय श्रृंखला प्रत्येक स्तंभ के लिए समय अवधि में पुनरावृति और पाश के लिए पिछले गणना मूल्यों को प्राप्त करने के लिए दूसरे डेटा

वर्तमान में मैं पाश एक के लिए 2 का उपयोग कर रहा प्रत्येक स्तंभ पाने के लिए के 30 साल और उसके बाद है। 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

देखो 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 

आशा है कि यह मदद करता है

संबंधित मुद्दे