为含Ticker的DataFrame生成独立Matplotlib图表及报错解决
多股票交易信号图表绘制报错修复及独立图表实现
问题背景
现有包含5家纳斯达克上市公司数据的多层索引DataFrame(索引为Ticker和Date),结构如下:
signal short_mavg long_mavg positions Ticker Date AAPL 2020-01-02 0.0 75.087502 75.087502 NaN 2020-01-03 0.0 74.722500 74.722500 0.0 2020-01-06 0.0 74.798332 74.798332 0.0 2020-01-07 0.0 74.748125 74.748125 0.0 2020-01-08 0.0 74.958000 74.958000 0.0
运行绘图代码时,在绘制买卖信号的行抛出错误:TypeError: 'value' must be an instance of str or bytes, not a tuple,同时需要实现每个股票的独立图表绘制。
原报错代码片段:
ax1.plot(signals.loc[signals.positions == 1.0].index, signals.short_mavg[signals.positions == 1.0], '^', markersize=10, color='m')
报错原因
DataFrame采用多层索引(Ticker + Date),signals.loc[...].index返回的是包含(Ticker, Date)的元组对象,matplotlib的plot函数无法直接解析这种元组作为x轴数据,因此抛出类型错误。
解决方案
按Ticker分组,为每个股票单独生成图表,同时提取Date作为x轴的有效数据:
完整修复代码
import matplotlib.pyplot as plt # 按Ticker分组遍历每个股票的数据 for ticker, group in signals.groupby(level='Ticker'): # 创建新的图表画布 fig = plt.figure(figsize=(12,6)) ax1 = fig.add_subplot(111, ylabel='Price in $') # 提取当前股票的收盘价数据 close_data = all_data.xs(ticker, level='Ticker')['Close'] # 绘制收盘价曲线 close_data.plot(ax=ax1, color='r', lw=2., label='Close Price') # 绘制短期/长期均线 group[['short_mavg', 'long_mavg']].plot(ax=ax1, lw=2., label=['Short MA', 'Long MA']) # 筛选买入信号并绘制 buy_signals = group[group.positions == 1.0] ax1.plot(buy_signals.index.get_level_values('Date'), buy_signals['short_mavg'], '^', markersize=10, color='m', label='Buy Signal') # 筛选卖出信号并绘制 sell_signals = group[group.positions == -1.0] ax1.plot(sell_signals.index.get_level_values('Date'), sell_signals['short_mavg'], 'v', markersize=10, color='k', label='Sell Signal') # 添加图表标题和图例 ax1.set_title(f'Trading Signals for {ticker}') ax1.legend() # 显示当前股票的独立图表 plt.show()
关键修复点
- 使用
groupby(level='Ticker')拆分每个股票的数据组,实现独立图表生成 - 用
index.get_level_values('Date')从多层索引中提取单独的日期作为x轴数据,避免元组类型错误 - 通过
xs(ticker, level='Ticker')从all_data中精准提取对应股票的收盘价数据 - 为每个图表添加标题和图例,提升可读性
内容的提问来源于stack exchange,提问作者Aayush Kaushal
相关产品推荐
相关产品推荐

