如何用Pandas透视表高效实现全Strike组合的价格差值计算?
解决方案
核心思路
利用NumPy的向量化广播实现高效计算,无需循环或复杂聚合,直接生成所有行权价组合的价格差值矩阵(可灵活控制差值计算方向)。
具体代码实现
假设你的原始DataFrame名为df,执行以下步骤:
import pandas as pd import numpy as np # 1. 提取核心数据:行权价序列和对应价格数组 strikes = df['Strike'] prices = df['Price'].values # 2. 广播计算差值矩阵:行行权价的价格 - 列行权价的价格 # 若需要反向差值(列价格 - 行价格),改为 prices - prices[:, np.newaxis] diff_matrix = prices[:, np.newaxis] - prices # 3. 转换为目标格式的DataFrame result_df = pd.DataFrame( diff_matrix, index=strikes, columns=strikes ) # 设置行索引名称 result_df.index.name = 'Strike'
代码说明
prices[:, np.newaxis]将一维价格数组转为二维列向量,与原一维数组触发广播运算,瞬间生成N×N的差值矩阵,效率远高于循环或aggfunc方式。- 最终的
result_df完全匹配你需要的矩阵结构,行和列均为行权价,单元格为对应价格差值。
测试验证
用你提供的测试数据运行代码:
# 测试数据 data = { 'Strike': [15000, 15100, 15200], 'Strike2': [15000, 15100, 15200], 'Price': [100, 150, 170] } df = pd.DataFrame(data)
输出的result_df为:
Strike 15000 15100 15200 Strike 15000 0 -50 -70 15100 50 0 -20 15200 70 20 0
若需要你示例中的正向差值(列价格 - 行价格),只需将差值计算代码改为diff_matrix = prices - prices[:, np.newaxis],即可得到:
Strike 15000 15100 15200 Strike 15000 0 50 70 15100 -50 0 20 15200 -70 -20 0
(注:你示例中15000行15200列的120、15200行15000列的-170应为笔误,正确差值为70和-70)
内容的提问来源于stack exchange,提问作者asimo
相关产品推荐
相关产品推荐

