在pandas数据框中逐行计算CAGR?

时间:2017-07-24 10:40:58

标签: python python-3.x pandas foreach

我正在处理公司数据。我有一个约1900家公司(指数)和每个公司30个变量(列)的数据集。这些变量总是成对出现三个(三个周期)。它基本上看起来像这样

df = pd.DataFrame({'id' : ['1','2','3','7'],
                       'revenue_0' : [7,2,5,4],
                       'revenue_1' : [5,6,3,1],
                       'revenue_2' : [1,9,4,8],
                       'profit_0' : [3,6,4,4],
                       'profit_1' : [4,6,9,1],
                       'profit_2' : [5,5,9,8]})

我正在尝试计算compound annual growth rate (CAGR),例如每个公司revenueid) - revenue_cagr = ((revenue_2/revenue_1)^(1/3))-1

我想将一个函数逐行传递给一组列 - 至少,这是我的想法。

def CAGR(start_value, end_value, periods): 
    ((end_value/start_value)^(1/periods))-1

是否可以逐行对一组列应用此函数(可能包含for i, row in df.iterrows():df.apply())?分别有更聪明的方法吗?

更新

期望的结果 - 例如列revenue_cagr - 应该如下所示:

df = pd.DataFrame({'id' : ['1','2','3','7'],
                           'revenue_0' : [7,2,5,4],
                           'revenue_1' : [5,6,3,1],
                           'revenue_2' : [1,9,4,8],
                           'profit_0' : [3,6,4,4],
                           'profit_1' : [4,6,9,1],
                           'profit_2' : [5,5,9,8],
                           'revenue_cagr' : [-0.48, 0.65, -0.07, 0.26],
                           'profit_cagr' : [0.19, -0.06, 0.31, 0.26]
                  })

1 个答案:

答案 0 :(得分:1)

您可以首先使用set_index + str.rsplit triples

df1 = df.set_index('id')
df1.columns = df1.columns.str.rsplit('_', expand=True, n=1)   
print (df1)
   profit       revenue      
        0  1  2       0  1  2
id                           
1       3  4  5       7  5  1
2       6  6  5       2  6  9
3       4  9  9       5  3  4
7       4  1  8       4  1  8

然后除div 2所有0 xs选择df1 = df1.xs('2', axis=1, level=1) .div(df1.xs('0', axis=1, level=1)) .pow((1./3)) .sub(1) .add_suffix('_cagr') print (df1) profit_cagr revenue_cagr id 1 0.185631 -0.477242 2 -0.058964 0.650964 3 0.310371 -0.071682 7 0.259921 0.259921 级别,添加powsubadd_suffix

df = df.join(df1, on='id')
print (df)
  id  profit_0  profit_1  profit_2  revenue_0  revenue_1  revenue_2  \
0  1         3         4         5          7          5          1   
1  2         6         6         5          2          6          9   
2  3         4         9         9          5          3          4   
3  7         4         1         8          4          1          8   

   profit_cagr  revenue_cagr  
0     0.185631     -0.477242  
1    -0.058964      0.650964  
2     0.310371     -0.071682  
3     0.259921      0.259921  

最后join原件:

sorted(by:)