如何加速Pandas重采样中idxmax/idxmin列计算及高低点判断?
解决Pandas重采样OHLCV并高效判断高低点出现顺序的问题
核心思路
用resample的向量化聚合替代逐组apply,同时处理空序列避免报错,最后用向量运算生成high_first字段,全程避免低效的逐行循环。
完整代码实现
import pandas as pd import numpy as np # 示例数据 data = { 'datetime': ['2022-01-01 10:00:00', '2022-01-01 10:01:00', '2022-01-01 10:02:00', '2022-01-01 10:03:00', '2022-01-01 10:04:00', '2022-01-01 10:05:00'], 'open': [10, 11, 12, 10, 10, 11], 'high': [12, 14, 12, 15, 12, 11], 'low': [9, 9, 8, 9, 8, 9], 'close': [11, 12, 10, 11, 11, 10], 'volume': [100, 200, 150, 300, 250, 180] } df = pd.DataFrame(data) # 1. 预处理:转换datetime类型并设为索引 df['datetime'] = pd.to_datetime(df['datetime']) df = df.set_index('datetime') # 2. 定义聚合规则,处理空序列避免报错 agg_rules = { 'open': 'first', # 区间第一个开盘价 'high': ['max', lambda x: x.idxmax() if not x.empty else pd.NaT], # 区间最高价+对应时间 'low': ['min', lambda x: x.idxmin() if not x.empty else pd.NaT], # 区间最低价+对应时间 'close': 'last', # 区间最后一个收盘价 'volume': 'sum' # 区间成交量总和 } # 3. 5分钟间隔重采样 resampled = df.resample('5min').agg(agg_rules) # 4. 扁平化多级列名,方便后续操作 resampled.columns = ['open', 'high', 'high_time', 'low', 'low_time', 'close', 'volume'] # 5. 用向量运算生成high_first(替代低效apply) # 逻辑:高点时间早于/等于低点时间则为1,否则为0;空分组返回NA resampled['high_first'] = np.where( resampled['high_time'].notna() & resampled['low_time'].notna(), (resampled['high_time'] <= resampled['low_time']).astype(int), pd.NA ) # 可选:删除无交易数据的空分组 resampled = resampled.dropna(subset=['open', 'close']) # 查看结果 print(resampled.reset_index())
关键优化点
- 抛弃低效逐组apply:
resample.agg是Pandas底层优化的向量化操作,比自定义apply快几个数量级,数据量越大优势越明显。 - 解决空序列报错:在聚合高低点时间戳时,用lambda函数判断序列是否为空,为空则返回
pd.NaT,直接规避ValueError。 - 向量运算生成判断字段:用
np.where替代逐行apply,利用Pandas的向量计算能力,进一步提升运行速度。
输出结果
运行代码后得到的结果与你期望的完全一致:
| datetime | open | high | high_time | low | low_time | close | volume | high_first |
|---|---|---|---|---|---|---|---|---|
| 2022-01-01 10:00:00 | 10 | 15 | 2022-01-01 10:03:00 | 8 | 2022-01-01 10:02:00 | 11 | 1000 | 0 |
| 2022-01-01 10:05:00 | 11 | 11 | 2022-01-01 10:05:00 | 9 | 2022-01-01 10:05:00 | 10 | 180 | 1 |
内容的提问来源于stack exchange,提问作者nurettin
相关产品推荐
相关产品推荐

