时间序列绘图

pandas时间序列的绘图功能在日期格式化方面比matplotlib原生的要好。来看下面这个例子,我先从Yahoo!Finance下载了几只美国股票的一些价格数据:

  1. In [539]: close_px_all = pd.read_csv('ch09/stock_px.csv', parse_dates=True, index_col=0)
  2.  
  3. In [540]: close_px = close_px_all[['AAPL', 'MSFT', 'XOM']]
  4.  
  5. In [541]: close_px = close_px.resample('B', fill_method='ffill')
  6.  
  7. In [542]: close_px
  8. Out[542]:
  9. <class 'pandas.core.frame.DataFrame'>
  10. DatetimeIndex: 2292 entries, 2003-01-02 00:00:00 to 2011-10-14 00:00:00
  11. Freq: B
  12. Data columns:
  13. AAPL 2292 non-null values
  14. MSFT 2292 non-null values
  15. XOM 2292 non-null values
  16. dtypes: float64(3)

对其中任意一列调用plot即可生成一张简单的图表,如图10-4所示。

  1. In [544]: close_px['AAPL'].plot()

时间序列绘图 - 图1

图10-4:AAPL每日价格

当对DataFrame调用plot时,所有时间序列都会被绘制在一个subplot上,并有一个图例说明哪个是哪个。这里我只绘制了2009年的数据,如图10-5所示,月份和年度都被格式化到了X轴上。

  1. In [546]: close_px.ix['2009'].plot()

时间序列绘图 - 图2

图10-5:2009年的股票价格

时间序列绘图 - 图3

图10-6:苹果公司在2011年1月到3月间的每日股价

图10-6展示了苹果公司在2011年1月到3月间的每日股价。

  1. In [548]: close_px['AAPL'].ix['01-2011':'03-2011'].plot()

季度型频率的数据会用季度标记进行格式化,这种事情如果纯手工做的话那是很费精力的。如图10-7所示。

  1. In [550]: appl_q = close_px['AAPL'].resample('Q-DEC', fill_method='ffill')
  2.  
  3. In [551]: appl_q.ix['2009':].plot()

pandas时间序列在绘图方面还有一个特点:当右键点击译注7并拖拉(放大、缩小)时,日期会动态展开或收缩,且绘图窗口中的时间区间会被重新格式化。当然,只有在交互模式下使用matplotlib才会有此效果。

时间序列绘图 - 图4

图10-7:苹果公司在2009年到2011年间的每季度股价

译注7:应该是按住(hold)而不是点击(click)。