Pandas处理历史价格数据:分组聚合重塑DataFrame问题求解
问题说明
运行现有代码得到的是纵向堆叠的长表格式,效果如下:
目标是将ticker展开为单独列,按时间对齐聚合为宽表,效果如下:
问题根因
- 代码存在笔误:
get_final_df的入参是tickers,循环遍历却写了未定义的symbol_list,运行会直接报错 - 循环拼接完的结果是长表结构,缺少「长表转宽表」的透视步骤
- 用
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
相关产品推荐
相关产品推荐

