You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建求和组合的透视/矩阵DataFrame?np.add.outer与广播孰快?

解决方案

一、DataFrame 重组与求和实现

实现思路

  1. 拆分数据:从原始DataFrame中分离出看涨期权(CE)和看跌期权(PE)的价格数据
  2. 格式调整:将CE的索引、PE的列名调整为目标格式(如4000CE、4000PE)
  3. 生成求和矩阵:利用numpy的向量化运算生成所有CE与PE组合的价格和
  4. 转换为目标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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:07:17