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

使用Matplotlib绘制股价与日期时触发TypeError错误求助

问题原因与修复方案

核心错误原因

你代码里的第14行prices = pt.sort_values('date')犯了关键错误:这行把prices从原本的单列价格数据改成了整个DataFrame。Matplotlib处理y轴数据时,会把DataFrame的每行(本质是numpy数组)当成分类值,而数组属于不可哈希类型,直接触发TypeError: unhashable type: 'numpy.ndarray'。另外你之前把股价转成字符串的操作完全没必要——股价是数值类型,应该用数值绘图。

修复步骤

  1. 修正价格列的获取:排序后只保留目标价格列,放弃字符串转换,保持数值类型
  2. 同步日期与价格的排序:先对整个DataFrame按日期排序,再提取对应的日期和价格列,保证两者顺序完全匹配
  3. 调整代码执行顺序:先创建画布,再设置坐标轴范围,避免轴未初始化导致的异常
  4. 可选优化:用plt.plot替代plt.plot_date——plot_date默认是散点模式,折线图用plot更合适,且同样支持日期轴

修正后的完整代码

# 先创建画布,确保绘图上下文正确
fig = plt.figure(figsize=(12, 8))

# 先对整个DataFrame按日期排序,再提取对应列
pt_sorted = pt.sort_values('date')
date = pt_sorted['date']  # 同步排序后的日期列
prices = pt_sorted[target_col]  # 保留数值类型的价格列

# 设置坐标轴范围
plt.xlim([start_date, end_date + timedelta(days=30)])
plt.ylim([max(df_max, f_max), min(df_min, f_min)])
plt.gca().invert_yaxis()

# 绘图:用plot绘制折线更直观
plt.plot(date, prices, color='blue', label='Actual Stock Prices')
plt.plot(date[-len(y_pred_scaled):], y_pred_scaled, color='red', label='Predicted Stock Prices on Test Data')
plt.plot(future_dates, future_prices, color='yellow', label='Future Prices')

plt.title("Prices of Stocks (Apple)")
plt.xlabel("Dates")
plt.ylabel("Prices")
plt.legend(loc='best')
plt.grid(True)
plt.show()

额外检查项

  • 确保y_pred_scaled的长度和date[-len(y_pred_scaled):]完全一致
  • 确认future_dates和future_prices是一维序列(比如Pandas Series或numpy一维数组),不要传入多维数组

内容的提问来源于stack exchange,提问作者Dark D'wine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:52:51