如何创建求和组合的透视/矩阵DataFrame?np.add.outer与广播孰快?
解决方案
一、DataFrame 重组与求和实现
实现思路
- 拆分数据:从原始DataFrame中分离出看涨期权(CE)和看跌期权(PE)的价格数据
- 格式调整:将CE的索引、PE的列名调整为目标格式(如
4000CE、4000PE) - 生成求和矩阵:利用numpy的向量化运算生成所有CE与PE组合的价格和
- 转换为目标DataFrame:将矩阵包装成指定格式的DataFrame
代码示例
import pandas as pd import numpy as np # 构造原始DataFrame raw_df = pd.DataFrame({ 'Strike': [4000, 4000, 4100, 4100], 'Right': ['CE', 'PE', 'CE', 'PE'], 'Price': [45, 55, 30, 60] }) # 拆分CE和PE数据 ce_prices = raw_df[raw_df['Right'] == 'CE'].set_index('Strike')['Price'] pe_prices = raw_df[raw_df['Right'] == 'PE'].set_index('Strike')['Price'] # 调整索引和列名到目标格式 ce_index = [f"{strike}CE" for strike in ce_prices.index] pe_columns = [f"{strike}PE" for strike in pe_prices.index] # 生成求和矩阵(两种方式任选其一) # 方式1:使用np.add.outer sum_matrix = np.add.outer(ce_prices.values, pe_prices.values) # 方式2:使用numpy广播 sum_matrix = ce_prices.values[:, np.newaxis] + pe_prices.values # 转换为目标DataFrame result_df = pd.DataFrame(sum_matrix, index=ce_index, columns=pe_columns)
运行后即可得到目标格式:
4000PE 4100PE 4000CE 100 105 4100CE 85 90
二、np.add.outer 与 numpy广播的速度对比
np.add.outer(a, b)本质是numpy广播机制的封装,底层实现和手动广播(a[:, np.newaxis] + b)完全一致- 实际测试中两者执行速度几乎无差异,都依赖numpy的向量化运算优化
- 仅在极端性能敏感场景下,手动广播可能因少一层函数调用有极其微小的优势,但业务场景下完全可以忽略。优先选择代码可读性更高的方式即可
内容的提问来源于stack exchange,提问作者asimo
相关产品推荐
相关产品推荐

