我的pd.df看起来像这样:
opt_symbol opt_expiry strike type bid ask mid stock_close t r sigma delta
timestamp
2004-09-06 SX5E_20040917_2450_C 2004-09-17 2450.0 c 300.3 305.3 302.80 2748.39 0.030137 0.021294 0.382167 0.962062
2004-09-06 SX5E_20040917_2450_P 2004-09-17 2450.0 p 0.4 2.0 1.20 2748.39 0.030137 0.021294 0.329829 -0.020329
2004-09-06 SX5E_20040917_2500_C 2004-09-17 2500.0 c 250.6 255.6 253.10 2748.39 0.030137 0.021294 0.332540 0.953602
2004-09-06 SX5E_20040917_2500_P 2004-09-17 2500.0 p 0.5 0.9 0.70 2748.39 0.030137 0.021294 0.258007 -0.015715
2004-09-06 SX5E_20040917_2550_C 2004-09-17 2550.0 c 101.0 206.1 153.55 2748.39 0.030137 0.021294 0.001000 1.000000
2004-09-06 SX5E_20040917_2550_P 2004-09-17 2550.0 p 1.2 1.3 1.25 2748.39 0.030137 0.021294 0.231905 -0.028909
2004-09-06 SX5E_20040917_2600_C 2004-09-17 2600.0 c 152.3 156.7 154.50 2748.39 0.030137 0.021294 0.238183 0.915981
2004-09-06 SX5E_20040917_2600_P 2004-09-17 2600.0 p 1.6 2.3 1.95 2748.39 0.030137 0.021294 0.197547 -0.049031
2004-09-06 SX5E_20040917_2650_C 2004-09-17 2650.0 c 104.6 108.5 106.55 2748.39 0.030137 0.021294 0.196382 0.865464
2004-09-06 SX5E_20040917_2650_P 2004-09-17 2650.0 p 3.7 6.0 4.85 2748.39 0.030137 0.021294 0.179948 -0.114458
2004-09-06 SX5E_20040917_2700_C 2004-09-17 2700.0 c 20.0 63.8 41.90 2748.39 0.030137 0.021294 0.001000 1.000000
2004-09-06 SX5E_20040917_2700_P 2004-09-17 2700.0 p 9.8 11.0 10.40 2748.39 0.030137 0.021294 0.152608 -0.239481
我需要找到具有相同['timestamp','opt_expiry','strike']的行对,其中delta!= 1的绝对总和(可能在一定的容差范围内)。然后,我想将较高的sigma值分配给另一行。对于最后两行,[-2]的西格玛将设置为[-1]
不确定我了解你。
我这样理解
df['y']=np.where((df.groupby(['timestamp','opt_expiry','strike'])['delta'].apply(lambda x:x.abs().round()))!=1, df.sigma.shift(1), -2)
df
因此,四舍五入到小数点后一位时,绝对值将为1的任何组都应用np.where。如果存在该组,则为它分配最大的sigma,其余的分配为-2。