首页 > 解决方案 > 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 中是否有更快或矢量化的方式来执行此操作?

标签: pythonpandas

解决方案


IIUC 中的每个值组合的计算为BestBid负?如果是这样,这是我想出的一种方法,它应该更快,基本上从头开始构建一个数据透视表:BestOfferStrike

pt = pd.DataFrame(index=df.index, columns=df.index)
for column in pt.columns:
    pt[column] = df.loc[column, "BestBid"] - df["BestOffer"]

推荐阅读