Python绘制谷歌股价图表报错:AttributeError: 'BlockManager'无'refs'属性
解决AttributeError: 'BlockManager' object has no attribute 'refs' 股票数据可视化问题
问题情况
我用Python代码绘制谷歌(GOOGLE)2020年3月1日至4月12日的股票价格图表,依赖pandas_datareader、yfinance和matplotlib库。运行时持续抛出AttributeError: 'BlockManager' object has no attribute 'refs',报错集中在处理Date字段的步骤,但24小时后运行相同代码,问题自行消失,得到了预期的图表输出。
原代码如下:
import matplotlib.pyplot as plt import matplotlib.dates as mdates from pandas_datareader import data as pdr import yfinance as yf yf.pdr_override() #set the start and end date start_date = "2020-03-01" end_date = "2020-04-12" #choose stock ticker symbol ticker = "GOOGLE" #get stock price stock = pdr.get_data_yahoo(ticker, start=start_date, end=end_date) print(stock) #obtain dates stock["Date"]=stock.index.map(mdates.date2num) #choose figure size fig = plt.figure(dpi=128, figsize=(10, 6)) #format date to place on the x-axis formatter = mdates.DateFormatter('%m/%d/%Y') plt.gca().xaxis.set_major_formatter(formatter) # Plot data. plt.plot(stock['Date'], stock['Adj Close'], c='red') # Format plot. plt.title("The Stock Price", fontsize=16) plt.xlabel('Date', fontsize=10) fig.autofmt_xdate() plt.ylabel("Price", fontsize=10) plt.show()
报错原因分析
这个错误本质是数据结构兼容性问题:
BlockManager是pandas内部用于管理DataFrame数据的底层结构,refs属性缺失说明加载后的DataFrame结构异常,大概率是当时yfinance抓取雅虎财经数据时,雅虎临时调整了数据返回格式,导致pandas_datareader无法正常解析成标准DataFrame。- 24小时后自行恢复,是因为雅虎财经修复了接口格式,或者
yfinance的动态适配逻辑自动兼容了临时变更的接口。
另外,原代码中手动将索引转成Date列的操作属于冗余步骤,反而增加了触发数据结构异常的风险。
解决方案
1. 确保依赖库版本兼容
升级到最新稳定版的相关库,避免版本不匹配导致的解析问题:
pip install --upgrade pandas yfinance pandas_datareader matplotlib
2. 优化代码,避免冗余操作
不需要手动将日期索引转为数值型的Date列,直接用DataFrame的索引作为x轴绘图,matplotlib可以直接处理pandas的日期索引:
优化后的代码:
import matplotlib.pyplot as plt import matplotlib.dates as mdates from pandas_datareader import data as pdr import yfinance as yf yf.pdr_override() # 设置起止日期 start_date = "2020-03-01" end_date = "2020-04-12" # 股票代码 ticker = "GOOGLE" # 获取股票数据 stock = pdr.get_data_yahoo(ticker, start=start_date, end=end_date) print(stock) # 设置画布大小 fig = plt.figure(dpi=128, figsize=(10, 6)) # 格式化x轴日期 formatter = mdates.DateFormatter('%m/%d/%Y') plt.gca().xaxis.set_major_formatter(formatter) # 直接用索引(日期)作为x轴绘图 plt.plot(stock.index, stock['Adj Close'], c='red') # 图表格式化 plt.title("GOOGLE Stock Price (2020-03-01 to 2020-04-12)", fontsize=16) plt.xlabel('Date', fontsize=10) fig.autofmt_xdate() # 自动旋转日期标签避免重叠 plt.ylabel("Adjusted Close Price (USD)", fontsize=10) plt.show()
3. 增加异常处理(可选)
为了应对接口临时故障,可以增加异常捕获逻辑,避免程序直接崩溃:
try: stock = pdr.get_data_yahoo(ticker, start=start_date, end=end_date) except Exception as e: print(f"获取数据失败: {str(e)}") # 可添加重试逻辑或备用数据源
内容的提问来源于stack exchange,提问作者randomman
相关产品推荐
相关产品推荐

