如何用Pandas高效实现稀疏交易数据的OHLC重采样
稀疏交易数据的OHLC重采样优化方案
我有稀疏的交易数据,想要按股票市场的OHLC(开盘/最高/最低/收盘)格式重采样以实现每日价格汇总,但现有resample结果存在两个问题:
- 当日开盘价未衔接前一日收盘价
- 无交易日期的OHLC值为
NaN,不符合“价格未变动”的逻辑
需要满足:
- 当日开盘价始终设为前一日收盘价
- 无交易日期的所有OHLC值沿用前一日收盘价
希望用Pandas的高效方法实现,避免手动循环处理大数据量时的性能问题。
示例基础代码与问题结果
原始交易数据代码
import pandas as pd # 非规则间隔的交易数据,存在缺失日期 data = { "timestamp": [ pd.Timestamp("2020-01-01 01:00"), pd.Timestamp("2020-01-01 05:00"), pd.Timestamp("2020-01-02 03:00"), pd.Timestamp("2020-01-04 04:00"), pd.Timestamp("2020-01-05 00:00"), ], "transaction": [ 100.00, 102.00, 103.00, 102.80, 99.88 ] } df = pd.DataFrame.from_dict(data, orient="columns") df.set_index("timestamp", inplace=True) print(df)
原始数据输出:
transaction timestamp 2020-01-01 01:00:00 100.00 2020-01-01 05:00:00 102.00 2020-01-02 03:00:00 103.00 2020-01-04 04:00:00 102.80 2020-01-05 00:00:00 99.88
基础重采样代码与问题结果
naive_resample = df["transaction"].resample("1D").agg({'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last'}) print(naive_resample)
基础重采样输出:
open high low close timestamp 2020-01-01 100.00 102.00 100.00 102.00 2020-01-02 103.00 103.00 103.00 103.00 2020-01-03 NaN NaN NaN NaN 2020-01-04 102.80 102.80 102.80 102.80 2020-01-05 99.88 99.88 99.88 99.88
高效解决方案(无手动循环)
通过以下步骤实现需求,全程利用Pandas向量化操作保证性能:
- 生成基础OHLC重采样数据,保留交易日的真实高低收盘价
- 用向前填充补全无交易日期的OHLC值,实现“价格未变动”逻辑
- 修正开盘价:将每个交易日的开盘价替换为前一日收盘价,首个交易日保留原始开盘价
完整实现代码
import pandas as pd # 1. 基础OHLC重采样 ohlc = df["transaction"].resample("1D").agg({ 'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last' }) # 2. 向前填充缺失值,处理无交易日期 ohlc_filled = ohlc.ffill() # 3. 修正开盘价:替换为前一日收盘价,首个交易日保留原始值 ohlc_filled['open'] = ohlc_filled['close'].shift(1).fillna(ohlc_filled['open']) print(ohlc_filled)
最终输出结果
open high low close timestamp 2020-01-01 100.00 102.00 100.00 102.00 2020-01-02 102.00 103.00 103.00 103.00 2020-01-03 103.00 103.00 103.00 103.00 2020-01-04 103.00 102.80 102.80 102.80 2020-01-05 102.80 99.88 99.88 99.88
逻辑说明
ffill()自动将前一个有效交易日的OHLC值填充到无交易日期,完美匹配“价格未变动”要求shift(1)获取前一日收盘价替换当日开盘价,fillna确保首个交易日开盘价保留原始第一笔交易价格- 全程使用Pandas内置向量化操作,无手动循环,大数据量下性能远优于纯Python实现
内容的提问来源于Stack Exchange,提问作者Mikko Ohtamaa
相关产品推荐
相关产品推荐

