在接下来的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中列出的计算?谢谢。
答案 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)