跨两个数据帧相乘

时间:2019-12-12 20:36:28

标签: python pandas

在接下来的30年中,我需要降低df1中的汇率。我不知道我是否甚至需要df2,但我放在那儿是为了解释我的问题。

  df1
        Rate
   0    2.5 
   1    4.5
   2    2.5
   3    4.8
   4    3.8
   5    3.4 

  df2    
          0 1 2 3 4 .....30
    Year  0 1 2 3 4 .....30

结果应如下所示:

  df3
                 0                         1                         .....30
   0    2.5  (1+2.5)^(-df2.iloc[0,0])    (1+2.5)^(-df2.iloc[0,1)     (1+2.5)^(-df2.iloc[0,29]
   1    4.5  (1+4.5)^(-df2.iloc[0,0])    (1+4.5)^(-df2.iloc[0,1)     (1+4.5)^(-df2.iloc[0,29]
   2    2.5  (1+2.5)^(-df2.iloc[0,0])    (1+2.5)^(-df2.iloc[0,1)     (1+2.5)^(-df2.iloc[0,29]
   3    4.8  (1+4.8)^(-df2.iloc[0,0])    (1+4.8)^(-df2.iloc[0,1)     (1+4.8)^(-df2.iloc[0,29]
   4    3.8  (1+3.8)^(-df2.iloc[0,0])    (1+3.8)^(-df2.iloc[0,1)     (1+3.8)^(-df2.iloc[0,29]
   5    3.4  (1+3.4)^(-df2.iloc[0,0])    (1+3.4)^(-df2.iloc[0,1)     (1+3.4)^(-df2.iloc[0,29]

我尝试了我的代码:

 y=np.power(1+df1.loc['Rate].to_numpy(),-df2.iloc[0].to_numpy())

是否可以在Rate之后在df1中添加30列并执行df3中列出的计算?谢谢。

1 个答案:

答案 0 :(得分:2)

使用df2中的常规值,您可以使用广播:

pd.DataFrame((1+df1.Rate.to_numpy())[:, None]**-df2.to_numpy())
#     0         1         2         3         4 ...
#0  1.0  0.285714  0.081633  0.023324  0.006664
#1  1.0  0.181818  0.033058  0.006011  0.001093
#2  1.0  0.285714  0.081633  0.023324  0.006664
#3  1.0  0.172414  0.029727  0.005125  0.000884
#4  1.0  0.208333  0.043403  0.009042  0.001884
#5  1.0  0.227273  0.051653  0.011739  0.002668

或者您可以认识到,使用您的特定值,它就像Vandermonde matrix,但具有负功效,所以

pd.DataFrame(np.vander(1+df1.Rate, N=31, increasing=True))**-1
#     0         1         2         3         4 ...
#0  1.0  0.285714  0.081633  0.023324  0.006664
#1  1.0  0.181818  0.033058  0.006011  0.001093
#2  1.0  0.285714  0.081633  0.023324  0.006664
#3  1.0  0.172414  0.029727  0.005125  0.000884
#4  1.0  0.208333  0.043403  0.009042  0.001884
#5  1.0  0.227273  0.051653  0.011739  0.002668

为完整起见,请使用concat来加入结果:

pd.concat([df1, pd.DataFrame(np.vander(1+df1.Rate, N=31, increasing=True), index=df1.index)**-1], axis=1)