使用pd.DataFrame从Morningstar获取股票数据返回NaN值求助
解决从Morningstar获取股票数据返回NaN的问题
我之前也碰到过一模一样的情况,问题根源出在Morningstar数据源返回的数据结构上——它默认返回的是带**多层索引(MultiIndex)**的DataFrame,直接提取Close列合并会导致索引对齐失败,最终全是NaN。下面是具体的解决步骤和修改后的代码:
问题原因分析
当你用data.DataReader(ticker, 'morningstar', ...)获取数据时,返回的DataFrame索引是(日期, 股票代码)的双层结构。如果直接提取data['Close']并构建新DataFrame,不同ticker的索引无法正确匹配,就会生成全NaN的结果。
修改后的代码
import pandas as pd from pandas_datareader import data all_data = {} for ticker in ['AAL', 'ALK','WTI']: # 获取单只股票的完整数据 stock_data = data.DataReader(ticker, 'morningstar', '2014-06-01','2016-06-13') # 移除第二层的股票代码索引,只保留日期作为唯一索引 stock_data = stock_data.reset_index(level=1, drop=True) # 仅提取Close列存入字典 all_data[ticker] = stock_data['Close'] # 构建包含三只股票收盘价的DataFrame price = pd.DataFrame(all_data) print(price.head(5))
额外注意事项
- 确保你的
pandas_datareader是最新版本,旧版本可能存在Morningstar接口兼容问题,可以用pip install --upgrade pandas-datareader更新。 - 如果仍然出现问题,可以尝试将日期参数转为
datetime对象,比如start=pd.to_datetime('2014-06-01'),避免字符串格式解析错误。 - 若后续Morningstar数据源停止支持,你可以考虑改用Yahoo Finance(
data.DataReader(ticker, 'yahoo', ...))等替代数据源,这些数据源的返回结构更直观,不容易出现索引对齐问题。
内容的提问来源于stack exchange,提问作者Catherine Zhang
相关产品推荐
相关产品推荐

