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

Pandas处理历史价格数据:分组聚合重塑DataFrame问题求解

问题说明

运行现有代码得到的是纵向堆叠的长表格式,效果如下:
当前输出结果
目标是将ticker展开为单独列,按时间对齐聚合为宽表,效果如下:
期望输出效果

问题根因
  1. 代码存在笔误:get_final_df的入参是tickers,循环遍历却写了未定义的symbol_list,运行会直接报错
  2. 循环拼接完的结果是长表结构,缺少「长表转宽表」的透视步骤
  3. 用df.append()逐行追加的写法已经在pandas 1.4+版本被弃用,性能差还会弹出兼容警告
修复后完整代码
import os
from datetime import date, timedelta
import pandas as pd

def prepare_data(symbol, look_back_period):
    start_date = date.today() - timedelta(days=look_back_period)
    end_date = date.today()
    prices_df = get_symbol_prices(symbol=symbol, start_date=start_date, end_date=end_date)
    prices_df = prices_df[['close']]
    prices_df.index.name = 'datetime'
    prices_df['symbol'] = symbol
    return prices_df


def get_final_df(tickers, look_back_period):
    # 用列表收集单标的数据,最后一次性拼接,性能远好于逐行append
    df_container = []
    for symbol in tickers:
        df_container.append(prepare_data(symbol=symbol, look_back_period=look_back_period))
    long_format_df = pd.concat(df_container)
    # 透视转宽表:行是时间,列是标的代码,值为对应收盘价
    wide_format_df = long_format_df.pivot(columns='symbol', values='close')
    return wide_format_df


def main():
    historical_df = get_final_df(tickers=TICKERS, look_back_period=LOOK_BACK_PERIOD)
    output_path = 'E:/HISTORICALPORTFOLIO.csv'
    historical_df.to_csv(output_path)
补充说明
  • 如果原始数据存在同一时间同一标的的重复记录,直接用pivot会报错,替换成下面的透视表写法即可,自动取重复项的最后一条值:
wide_format_df = long_format_df.pivot_table(
    index='datetime',
    columns='symbol',
    values='close',
    aggfunc='last'
)
  • 导出的csv会自动把datetime索引放在第一列,后续每列对应一个标的的收盘价序列,和目标排布完全一致。

内容的提问来源于stack exchange,提问作者steeltoaster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 21:27:19