如何对多股票多级列索引OHLC数据进行重采样
问题说明
通过yfinance拉取多只股票OHLC数据时,返回结果为两级列索引的DataFrame:第一级索引为OHLC字段名,第二级为股票名称。
单只股票下载场景下,按周重采样聚合的代码可正常运行;传入多只股票代码触发多级列结构时,代码运行报错。尝试stack、unstack调整数据结构未找到可行的重采样路径。
原实现代码:
import requests import pandas as pd import numpy as np import yfinance as yf from datetime import datetime, timedelta N_DAYS_AGO = 15 now = datetime.now() today = datetime(now.year,now.month,now.day, now.hour) n_days_ago = today - timedelta(days=N_DAYS_AGO) df = yf.download(['SPY','TLT'], start=n_days_ago, end=now, interval = "60m") #单只股票时无报错 ohlc_dict = { 'Adj Close':'last', 'Open':'first', 'High':'max', 'Low':'min', 'Close':'last', 'Volume':'sum' } df_sample = df.resample('W-FRI', closed='left').agg(ohlc_dict) df_sample #传入2只股票时运行报错
报错原因
原聚合逻辑使用的ohlc_dict为单级列匹配设计:字典key直接对应列名,value对应该列的聚合方法。多股票返回的MultiIndex列结构下,pandas无法将单层key的字典与多级列做匹配,因此触发报错。
最简解决方案
无需反复转换行列结构,仅需针对多级列的每一列,匹配其第一级(字段层级)对应的聚合规则传入agg即可,仅需替换原重采样行的代码:
df_sample = df.resample('W-FRI', closed='left').agg( {col: ohlc_dict[col[0]] for col in df.columns} )
该实现完全保留原聚合逻辑:
- Adj Close、Close取重采样周期内最后一个值
- Open取周期内第一个值
- High取周期内最大值
- Low取周期内最小值
- Volume取周期内累计和
返回结果仍保留「OHLC字段-股票代码」的两级列索引,和yfinance原始返回的结构完全一致。若需要规整列顺序,可追加一行排序代码:
df_sample = df_sample.sort_index(axis=1)
内容的提问来源于stack exchange,提问作者Jon 310
相关产品推荐
相关产品推荐

