You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化处理大型比特币价格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()))

关键优化点说明

  1. 向量化移位生成序列:用shift批量生成所有偏移后的列,一次性完成所有行的序列提取,避免逐行循环的重复计算。
  2. 批量合并与过滤:通过concat合并所有周期数据,dropna自动剔除后续数据不足的无效行,无需手动判断索引范围。
  3. 高效样本转换:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:30:43