You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效按quote_datetime分组求取fwd_premium_abs最小值

高效计算按quote_datetime分组的fwd_premium_abs最小值

问题背景

我有如下格式的时间序列数据:

quote_datetimeMoneynessunderlying_bidaskCaskPbidCbidPfwd_premium_abs
2020-02-25 14:10:000.9808612443134.673.810.866.510.463.4
2020-02-25 14:10:000.9908612443134.673.411.863.511.465.4
2020-02-25 14:11:000.9908612443135.670.412.861.514.464.4
2020-02-25 14:11:000.9908612443135.672.410.160.112.467.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 12:48:29