我有一个看起来像这样的DataFrame:
whl
我想计算索引的所有成对组合的网格,并计算对上的一些算术运算。下面的代码是我反复(缓慢)进行操作的方式:
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
请注意,如果该对中的第一个元素较大,我将不进行操作,从而使其速度稍快一些。这实际上是 n ^ 2 的计算时间,在熊猫中有没有更快或矢量化的方法?
答案 0 :(得分:2)
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"]
答案 1 :(得分:2)
numpy
允许您无循环执行这些计算。在这里,我们使用outer
减法来获得所有成对的差异。然后遮盖下三角形。
import pandas as pd
import numpy as np
df1 = pd.DataFrame(-1*np.subtract.outer(df['BestOffer'].to_numpy(),
df['BestBid'].to_numpy()),
index=df.index.to_numpy(),
columns=df.index.to_numpy())
# `NaN` the lower triangle
df1 = df1.mask(np.tril(np.ones(df1.shape)).astype(bool))
800 900 1000 1050 1100 2350 2400 2450 2500 3000
800 NaN -102.400025 -202.199952 -252.099976 -302.000000 -1256.549976 -1256.599976 -1256.599976 -1256.599976 -1256.599976
900 NaN NaN -102.400025 -152.300049 -202.200073 -1156.750049 -1156.800049 -1156.800049 -1156.800049 -1156.800049
1000 NaN NaN NaN -52.400024 -102.300048 -1056.850024 -1056.900024 -1056.900024 -1056.900024 -1056.900024
1050 NaN NaN NaN NaN -52.400024 -1006.950000 -1007.000000 -1007.000000 -1007.000000 -1007.000000
1100 NaN NaN NaN NaN NaN -956.950000 -957.000000 -957.000000 -957.000000 -957.000000
2350 NaN NaN NaN NaN NaN NaN -0.400000 -0.400000 -0.400000 -0.400000
2400 NaN NaN NaN NaN NaN NaN NaN -0.200000 -0.200000 -0.200000
2450 NaN NaN NaN NaN NaN NaN NaN NaN -0.600000 -0.600000
2500 NaN NaN NaN NaN NaN NaN NaN NaN NaN -0.600000
3000 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN