熊猫-有效地计算组合算术

时间:2020-01-29 14:35:49

标签: python pandas

我有一个看起来像这样的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 的计算时间,在熊猫中有没有更快或矢量化的方法?

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