基于交易记录DataFrame过滤股票分钟级DataFrame的高效方案求解
解决方案
你遇到的报错原因是对长度、索引均不匹配的两个Series直接做等值比较:db_buy和你生成的tickers行数不同,索引没有对应关系,因此触发了ValueError: Can only compare identically-labeled Series objects错误。
无需手写循环,直接用pandas内置的分组、关联操作即可完成需求,效率远高于自定义循环:
步骤1:计算每个股票的时间阈值
先对db_buy按股票代码分组,取每个股票最早的成交时间,再往前推25个工作日,作为该股票行情数据的筛选起始时间,同时统一时间格式和df的time字段对齐:
import pandas as pd from pandas.tseries.offsets import BDay # 按股票代码分组,取每个代码最早的买入时间 symbol_cutoff = db_buy.groupby('Symbol')['Time'].min().reset_index() # 计算25个工作日之前的时间,转成和df的time一致的秒级Unix时间戳 # 如果df的time是毫秒级,这里就把 // 10**9 改成 // 10**6 symbol_cutoff['start_ts'] = (symbol_cutoff['Time'] - BDay(25)).astype('int64') // 10**9
步骤2:过滤行情df
针对超大规模df推荐用如下两步过滤,内存占用低、执行速度快:
# 第一步:先过滤掉所有不在买入记录里的股票,减少后续计算量 valid_symbols = symbol_cutoff['Symbol'].tolist() df = df[df['symbol'].isin(valid_symbols)].copy() # 第二步:关联每个股票的时间阈值,过滤满足时间要求的行情 df = df.merge(symbol_cutoff[['Symbol', 'start_ts']], left_on='symbol', right_on='Symbol', how='left') df = df[df['time'] > df['start_ts']].drop(columns=['Symbol', 'start_ts'])
如果你的df规模不大,也可以直接合并为更简洁的逻辑:
df = df.merge(symbol_cutoff, left_on='symbol', right_on='Symbol').query('time > start_ts').drop(columns=['Symbol', 'Time', 'start_ts'])
内容的提问来源于stack exchange,提问作者Trippy Dippy
相关产品推荐
相关产品推荐

