python - pandas - 高效计算组合算术
问题描述
我有一个看起来像这样的 DataFrame:
BestBid BestOffer
Strike
800 1253.900024 1256.599976
900 1154.199951 1156.800049
1000 1054.400024 1056.900024
1050 1004.500000 1007.000000
1100 954.599976 957.000000
... ...
2350 0.050000 0.400000
2400 0.000000 0.200000
2450 0.000000 0.600000
2500 0.000000 0.600000
3000 0.000000 0.600000
我想计算索引的所有成对组合的网格,并计算对这些对的一些算术运算。我下面的代码是我如何迭代地(并且缓慢地)执行它:
output = pd.DataFrame(index=df.index, columns=df.index)
for pair in itertools.combinations(df.index, 2):
if pair[0] >= pair[1]:
continue
low= pair[0]
high= pair[1]
spread = df.loc[high, 'BestBid'] - df.loc[low, 'BestOffer']
output.loc[low, high] = spread
output
最终看起来像:
800 900 1000 1050 1100 1125 1150 1175 1200 1220 1225 1240 ... 2220 2225 2230 2240 2250 2275 2300 2350 2400 2450 2500 3000
800 NaN -102.4 -202.2 -252.1 -302 -326.9 -352.1 -376.8 -401.7 -421.7 -426.7 -441.6 ... -1256.05 -1255.85 -1256.25 -1256.45 -1256.5 -1256.45 -1256.55 -1256.55 -1256.6 -1256.6 -1256.6 -1256.6
900 NaN NaN -102.4 -152.3 -202.2 -227.1 -252.3 -277 -301.9 -321.9 -326.9 -341.8 ... -1156.25 -1156.05 -1156.45 -1156.65 -1156.7 -1156.65 -1156.75 -1156.75 -1156.8 -1156.8 -1156.8 -1156.8
1000 NaN NaN NaN -52.4 -102.3 -127.2 -152.4 -177.1 -202 -222 -227 -241.9 ... -1056.35 -1056.15 -1056.55 -1056.75 -1056.8 -1056.75 -1056.85 -1056.85 -1056.9 -1056.9 -1056.9 -1056.9
1050 NaN NaN NaN NaN -52.4 -77.3 -102.5 -127.2 -152.1 -172.1 -177.1 -192 ... -1006.45 -1006.25 -1006.65 -1006.85 -1006.9 -1006.85 -1006.95 -1006.95 -1007 -1007 -1007 -1007
1100 NaN NaN NaN NaN NaN -27.3 -52.5 -77.2 -102.1 -122.1 -127.1 -142 ... -956.45 -956.25 -956.65 -956.85 -956.9 -956.85 -956.95 -956.95 -957 -957 -957 -957
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2350 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN -0.4 -0.4 -0.4 -0.4
2400 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN -0.2 -0.2 -0.2
2450 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN -0.6 -0.6
2500 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN -0.6
3000 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
请注意,如果该对的第一个元素较大,我不执行该操作会使其速度稍快一些。这基本上是n^2的计算时间,在 pandas 中是否有更快或矢量化的方式来执行此操作?
解决方案
IIUC 中的每个值组合的计算为BestBid
负?如果是这样,这是我想出的一种方法,它应该更快,基本上从头开始构建一个数据透视表:BestOffer
Strike
pt = pd.DataFrame(index=df.index, columns=df.index)
for column in pt.columns:
pt[column] = df.loc[column, "BestBid"] - df["BestOffer"]
推荐阅读
- python - CountVectorizer 错误:没有这样的文件或目录
- visual-studio - Xamarin.Forms ViewCell / Visual Studio 2019 - “'someType' 的部分声明不得指定不同的基类”
- java - 如何使这个循环10次然后结束
- java - 在Android中,在某些方法之间放置括号是什么意思?
- raspberry-pi - 在节日 tts 中添加声音
- java - 覆盖 toString 方法?
- java - 如何从 byteArray 打开文件
- c# - 是否无法使用 IServiceCollection::AddHostedService() 添加类?
- javascript - 如何在跨度上获得这种“文本消失”效果?
- android - 如何创建与图片相同的ui