使用Matplotlib绘制股价与日期时触发TypeError错误求助
问题原因与修复方案
核心错误原因
你代码里的第14行prices = pt.sort_values('date')犯了关键错误:这行把prices从原本的单列价格数据改成了整个DataFrame。Matplotlib处理y轴数据时,会把DataFrame的每行(本质是numpy数组)当成分类值,而数组属于不可哈希类型,直接触发TypeError: unhashable type: 'numpy.ndarray'。另外你之前把股价转成字符串的操作完全没必要——股价是数值类型,应该用数值绘图。
修复步骤
- 修正价格列的获取:排序后只保留目标价格列,放弃字符串转换,保持数值类型
- 同步日期与价格的排序:先对整个DataFrame按日期排序,再提取对应的日期和价格列,保证两者顺序完全匹配
- 调整代码执行顺序:先创建画布,再设置坐标轴范围,避免轴未初始化导致的异常
- 可选优化:用
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
相关产品推荐
相关产品推荐

