无法从Pandas DataFrame中提取Backtrader生成的TradeHistory对象
提取Backtrader TradeHistory对象数据的方法
1. 先确认TradeHistory对象的可用属性
Backtrader的TradeHistory是自定义对象,首先得明确它包含哪些可提取的属性。取一条样本数据查看:
# 获取第一行的第一个TradeHistory对象 sample_trade = trade_data.iloc[0]['history'][0] # 打印所有可用属性 print(dir(sample_trade))
通常会包含datetime(或dt)、size、price、symbol、sid这类核心交易属性,根据输出挑选你需要的字段。
2. 将TradeHistory列表转为结构化字典列表
定义一个转换函数,对history列的每个对象列表做解析:
def parse_trade_history(trade_list): # 根据实际属性调整字段 return [ { "trade_datetime": trade.dt.strftime("%Y-%m-%d %H:%M:%S"), "trade_size": trade.size, "trade_price": trade.price, "trade_symbol": trade.symbol } for trade in trade_list ] # 生成解析后的列 trade_data['history_parsed'] = trade_data['history'].apply(parse_trade_history)
3. 展开为扁平DataFrame(每条交易占一行)
如果需要把嵌套的交易记录展开成常规的行结构,用explode结合json_normalize:
import pandas as pd from pandas import json_normalize # 将列表拆分为多行 exploded_df = trade_data.explode('history_parsed').reset_index(drop=True) # 把字典列展开为独立字段 flattened_trades = json_normalize(exploded_df['history_parsed']) # 合并原表其他字段 final_trade_df = pd.concat([exploded_df.drop('history_parsed', axis=1), flattened_trades], axis=1)
4. 快速提取单个属性的所有值
如果只需要某一个属性的集合(比如所有交易价格),用嵌套列表推导式:
all_trade_prices = [trade.price for trade_list in trade_data['history'] for trade in trade_list]
内容的提问来源于stack exchange,提问作者LiverLove
相关产品推荐
相关产品推荐

