如何在Python中无未来偏差重采样OHLC DataFrame并优化性能
需求说明
我有一个以秒级时间戳为索引的Pandas DataFrame,包含金融工具价格相关的Open、High、Low、Close列。
需要实现以下目标:
- 将DataFrame按15分钟(或任意指定频率)重采样,但绝对不能引入未来数据
- 保留原秒级频率的DataFrame结构,同时为每一行新增四列,实时展示当前正在形成的15分钟K线的OHLC值(即
Open_15m、High_15m、Low_15m、Close_15m) - 15分钟K线的起始时间严格限定在hh:00:00、hh:15:00、hh:30:00、hh:45:00,例如09:00:00-09:15:00期间计算该时段的滚动OHLC,到09:15:00时重置并开始下一个15分钟周期的计算
我已经写出逻辑正确的代码,但处理数百万行的大数据时速度极慢,需要用NumPy、Numba等工具做性能优化。
原实现代码
# 找到最近的15分钟起始时间(向下取整) def nearest_quarter_hour(timestamp): return timestamp.floor('15T') # 为每个时间戳标记对应的15分钟起始时间 df['15_min_floor'] = df.index.map(nearest_quarter_hour) # 按15分钟起始时间分组,计算滚动OHLC rolling_df = df.groupby('15_min_floor').rolling(window='15T').agg({ 'Open': lambda x: x.iloc[0], # 窗口内第一个值 'High': 'max', 'Low': 'min', 'Close': lambda x: x.iloc[-1] # 窗口内最后一个值 }).reset_index(level=0, drop=True) # 重命名滚动计算后的列 rolling_df.columns = [f'{col}_15' for col in rolling_df.columns] # 合并到原DataFrame result_df = pd.concat([df, rolling_df], axis=1)
内容的提问来源于stack exchange,提问作者MilTom
相关产品推荐
相关产品推荐

