如何高效按quote_datetime分组求取fwd_premium_abs最小值
问题背景
我有如下格式的时间序列数据:
| quote_datetime | Moneyness | underlying_bid | askC | askP | bidC | bidP | fwd_premium_abs |
|---|---|---|---|---|---|---|---|
| 2020-02-25 14:10:00 | 0.980861244 | 3134.6 | 73.8 | 10.8 | 66.5 | 10.4 | 63.4 |
| 2020-02-25 14:10:00 | 0.990861244 | 3134.6 | 73.4 | 11.8 | 63.5 | 11.4 | 65.4 |
| 2020-02-25 14:11:00 | 0.990861244 | 3135.6 | 70.4 | 12.8 | 61.5 | 14.4 | 64.4 |
| 2020-02-25 14:11:00 | 0.990861244 | 3135.6 | 72.4 | 10.1 | 60.1 | 12.4 | 67.4 |
我需要针对每个唯一的quote_datetime值,计算fwd_premium_abs的最小值。之前用for循环实现:
for j in df['quote_datetime'].unique(): temp = df[df['quote_datetime']==j]['fwd_premium_abs'].min()
但这种方式效率极低,处理大规模数据集时计算成本很高,想知道更优的实现方式。
部分数据的字典格式参考:
{'strike': {0: 3075.0, 1: 3075.0, 2: 3075.0, 3: 3075.0, 4: 3075.0}, 'Date': {0: datetime.date(2020, 2, 25), 1: datetime.date(2020, 2, 25), 2: datetime.date(2020, 2, 25), 3: datetime.date(2020, 2, 25), 4: datetime.date(2020, 2, 25)}, 'quote_datetime': {0: Timestamp('2020-02-25 14:10:00'), 1: Timestamp('2020-02-25 14:12:00'), 2: Timestamp('2020-02-25 14:19:00'), 3: Timestamp('2020-02-25 14:20:00'), 4: Timestamp('2020-02-25 14:22:00')}, 'Moneyness': {0: 0.9808612440191388, 1: 0.9808612440191388, 2: 0.9808612440191388, 3: 0.9808612440191388, 4: 0.9808612440191388}, 'underlying_bid': {0: 3134.6, 1: 3135.8, 2: 3137.29, 3: 3136.91, 4: 3136.99}, 'askC': {0: 73.8, 1: 74.4, 2: 76.7, 3: 74.8, 4: 74.2}, 'askP': {0: 10.8, 1: 10.9, 2: 10.5, 3: 10.7, 4: 10.7}, 'bidC': {0: 66.5, 1: 69.1, 2: 70.1, 3: 71.7, 4: 71.2}, 'bidP': {0: 10.4, 1: 10.3, 2: 9.4, 3: 10.2, 4: 10.2}, 'fwd_premium_abs': {0: 63.4, 1: 64.10000000000001, 2: 67.3, 3: 64.6, 4: 64.0}}
高效解决方案
方法1:直接分组求最小值(返回聚合结果)
使用pandas内置的groupby+min操作,这是矢量化的聚合计算,底层由C实现,效率远高于Python循环:
# 按quote_datetime分组,计算每组fwd_premium_abs的最小值 min_result = df.groupby('quote_datetime')['fwd_premium_abs'].min()
返回结果是一个Series,索引为quote_datetime的唯一值,对应值为该组的fwd_premium_abs最小值。
方法2:将结果合并回原DataFrame(保留原数据结构)
如果需要给原DataFrame的每行标记对应quote_datetime组的最小值,用transform方法:
# 新增一列存储对应组的最小值 df['min_fwd_premium'] = df.groupby('quote_datetime')['fwd_premium_abs'].transform('min')
transform会将组内最小值广播到该组的所有行,保持原DataFrame的行数和索引不变。
为什么这两种方法更高效?
Python层面的for循环会逐次遍历每个唯一值,每次都要做数据筛选,属于循环式计算;而groupby相关操作是pandas优化的矢量化操作,一次性完成分组和聚合,避免了循环带来的额外开销,在大规模数据集上速度能提升几十到上百倍。
内容的提问来源于stack exchange,提问作者yash
相关产品推荐
相关产品推荐

