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

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() 

报错原因分析

这个错误本质是数据结构兼容性问题:

  1. BlockManager是pandas内部用于管理DataFrame数据的底层结构,refs属性缺失说明加载后的DataFrame结构异常,大概率是当时yfinance抓取雅虎财经数据时,雅虎临时调整了数据返回格式,导致pandas_datareader无法正常解析成标准DataFrame。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:56:06