Python Pandas 矩阵乘法多项运算合二为一
Python Pandas Matrix Multiplication Multiple Operations in one
我正在尝试使用 pandas 矩阵乘法。我有四个步骤
- 通过将 2500 列除以 2500 列创建 2500 个新列
- 使用上面的结果并从所有列中减去 1
- 使用点 2 的结果,将所有 2500 列除以 1 列
- 使用第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)
我正在尝试使用 pandas 矩阵乘法。我有四个步骤
- 通过将 2500 列除以 2500 列创建 2500 个新列
- 使用上面的结果并从所有列中减去 1
- 使用点 2 的结果,将所有 2500 列除以 1 列
- 使用第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)