Python Pandas 矩阵乘法多项运算合二为一

Python Pandas Matrix Multiplication Multiple Operations in one

我正在尝试使用 pandas 矩阵乘法。我有四个步骤

  1. 通过将 2500 列除以 2500 列创建 2500 个新列
  2. 使用上面的结果并从所有列中减去 1
  3. 使用点 2 的结果,将所有 2500 列除以 1 列
  4. 使用第3点的结果,将1列加到所有2500

有没有更好的方法,也许在一行代码中?目前速度很慢,而且 CPU 很重。

代码片段如下:

df_baseScenario[end_columns+ "fwd_rate"] =  df_baseScenario[start_columns].divide(df_baseScenario[end_columns].values,axis=0)
df_baseScenario[end_columns+ "fwd_rate"] =  df_baseScenario[end_columns+ "fwd_rate"].subtract(1)
df_baseScenario[end_columns+ "fwd_rate"] =  df_baseScenario[end_columns+ "fwd_rate"].multiply(1/df_baseScenario['Calc_Period'].values,axis=0)
df_baseScenario[end_columns+ "fwd_rate"] =  df_baseScenario[end_columns+ "fwd_rate"].add(df_baseScenario['Rate Index Spread'].values,axis=0)

我按相关文本创建代码,不按示例代码创建代码:

df_baseScenario = pd.DataFrame({'Calc_Period':[1,2,3],
                   'Rate Index Spread':[4,5,6],
                   'D':[1,3,5],
                   'E':[5,3,6],
                   'F':[7,4,3],
                   'G':[4,2,9],
                   'H':[5,7,8],
                   'I':[8,5,4]})

print (df_baseScenario)
start_columns = ['D','E','F']
end_columns = ['G','H','I']

df = df_baseScenario[start_columns].mul(df_baseScenario[end_columns].values)  \
                                    .sub(1) \
                                    .div(df_baseScenario['Calc_Period'], axis=0) \
                                    .add(df_baseScenario['Rate Index Spread'], axis=0)
#assign calumne names by end_columns
df.columns = end_columns
#add prefix
df = df.add_suffix('fwd_rate')
print (df)
   Gfwd_rate  Hfwd_rate  Ifwd_rate
0   7.000000  28.000000  59.000000
1   7.500000  15.000000  14.500000
2  20.666667  21.666667   9.666667

#concat columns to original
print (pd.concat([df_baseScenario, df], axis=1))
   Calc_Period  D  E  F  G  H  I  Rate Index Spread  Gfwd_rate  Hfwd_rate  \
0            1  1  5  7  4  5  8                  4   7.000000  28.000000   
1            2  3  3  4  2  7  5                  5   7.500000  15.000000   
2            3  5  6  3  9  8  4                  6  20.666667  21.666667   

   Ifwd_rate  
0  59.000000  
1  14.500000  
2   9.666667  

为了使其更短和更易读,您可以按如下方式使用链接:

df = df_baseScenario
df["fwd_rate"] = df[start_cols] \
    .divide(df[end_cols].values, axis=0) \
    .subtract(1) \
    .multiply(1/df['Calc_Period'], axis=0) \
    .add(df['Rate Index Spread'], axis=0)