Python Pandas矩阵乘法多个操作于一体

时间:2017-01-03 13:19:07

标签: python performance pandas numpy matrix-multiplication

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

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

    有没有办法更好地写这个,也许是在一行代码中?目前它很慢并且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)
    

2 个答案:

答案 0 :(得分:1)

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

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)

答案 1 :(得分: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