如何优化处理大型比特币价格DataFrame的Python代码?
比特币多周期序列提取优化方案
核心优化思路
彻底抛弃逐行循环,改用pandas向量化操作批量生成所有序列——pandas底层基于C实现,能避免Python层面循环的巨大开销,速度可提升1-2个数量级。
具体实现代码
假设你的DataFrame名为btc_df,价格列是close,以下是批量生成所有周期序列的代码:
import pandas as pd # 定义各周期参数:步长(单位:1分钟)、需要提取的序列长度 period_configs = [ (1, 60), # 1分钟周期:步长1,取60个后续值 (5, 60), # 5分钟周期:步长5,取60个后续值 (15, 60), # 15分钟周期 (60, 60), # 1小时周期 (360, 60), # 6小时周期 (5760, 60) # 4天周期(4*1440=5760分钟) ] # 批量生成所有周期的序列DataFrame period_dfs = [] for step, seq_len in period_configs: # 生成seq_len个移位后的价格列,每个列对应step*i的偏移量 shifted_columns = [btc_df['close'].shift(-(step * i)) for i in range(1, seq_len + 1)] # 合并为单周期的序列DataFrame,每行对应原始行的后续序列 single_period_df = pd.concat(shifted_columns, axis=1) single_period_df.columns = [f'{step}m_seq_{idx+1}' for idx in range(seq_len)] period_dfs.append(single_period_df) # 合并所有周期的序列,自动过滤后续数据不足的行(含NaN的行) combined_seq_df = pd.concat(period_dfs, axis=1).dropna() # 添加target值(示例为1分钟周期的最后一个值,即后续第60分钟的价格,可根据需求修改) combined_seq_df['target'] = btc_df['close'].shift(-60).loc[combined_seq_df.index] # 快速转换为(序列数组, target)的样本列表 samples = list(zip(combined_seq_df.iloc[:, :-1].to_numpy(), combined_seq_df['target'].to_numpy()))
关键优化点说明
- 向量化移位生成序列:用
shift批量生成所有偏移后的列,一次性完成所有行的序列提取,避免逐行循环的重复计算。 - 批量合并与过滤:通过
concat合并所有周期数据,dropna自动剔除后续数据不足的无效行,无需手动判断索引范围。 - 高效样本转换:用
to_numpy将整个DataFrame转为数组后再打包成列表,比iterrows/itertuples逐行遍历快数倍。
注意事项
- 内存控制:若原始数据量过大,可分批次处理(按索引分段生成序列后合并),避免内存溢出。
- 4天周期有效性:你的原始数据共221651行(约154天1分钟数据),而4天周期需要后续240天的数据,实际有效行会为0。若需求是提取历史序列而非后续序列,将
shift(-(step*i))改为shift(step*i)即可。 - target自定义:可根据实际需求修改
target的移位逻辑,比如要后续4天的价格,就改为btc_df['close'].shift(-5760*60)。
内容的提问来源于stack exchange,提问作者Coffee Pjesht
相关产品推荐
相关产品推荐

