使用matplotlib对pandas DataFrame进行重采样以绘制金融OHLC图表
我有一个数据框 df,里面有一个不规则的时间序列,这个序列在一天内有超过1000条记录,基本上长这样:
2014-05-10 00:07:04 10
2014-05-10 00:07:48 -20
2014-05-10 00:07:51 -30
2014-05-10 00:09:28 70
2014-05-10 00:09:59 80
2014-05-10 00:10:05 0
2014-05-10 00:10:11 80
2014-05-10 00:10:22 40
2014-05-10 00:11:12 10
2014-05-10 00:12:44 80
2014-05-10 00:12:59 80
2014-05-10 00:13:15 80
2014-05-10 00:16:20 40
我正在这样重新采样这个数据框:
ticks = df.ix[:, ['price']]
tick_bars = ticks.price.resample('15min', how='ohlc')
这样做后,得到的结果大概是这样的:
open high low close
Timestamp
2014-05-10 00:00:00 10 80 -30 80
2014-05-10 00:15:00 40 80 -30 10
2014-05-10 00:30:00 10 80 -30 70
2014-05-10 00:45:00 0 80 -30 70
2014-05-10 01:00:00 70 70 20 40
2014-05-10 01:15:00 70 80 -20 0
完成这个操作后:
from matplotlib.finance import candlestick
我尝试通过下面的方式绘制 OHLC 图表:
candlestick(tick_bars)
结果是这样的:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-66-26a465709cae> in <module>()
----> 1 candlestick(tick_bars)
TypeError: candlestick() takes at least 2 arguments (1 given)
tick_bars 已经包含了 OLHC 数据,还有用于 x 轴的时间戳。不过我对 matplotlib 不是很熟悉,所以不知道缺少哪个参数。
我有几个问题:
1) 缺少的参数是什么?
2) 我怎么能把绘图限制在特定的时间范围内(比如从上午11点到下午2点),而不是绘制整个序列?
3) 有没有其他工具可以用来绘制 OHLC 图表,而不是 matplotlib?
谢谢
2 个回答
0
重新采样的结果会把时间作为数据框的索引。当这样做时,调用一个mpl(Matplotlib)函数时,索引不会被传递给这个函数。所以如果你输入 tick_bars.values,你会发现看不到时间。
可以试试下面的代码:
tick_bars.reset_index(inplace = True)
candlestick(ax,tick_bars.values)
这样做会明确地传递时间。
1
经过很多研究和向朋友请教,这里是我找到的一些有效的方法:
tick_bars['t'] = tick_bars.index.map(dates.date2num)
fig, ax = plt.subplots()
candlestick(ax, tick_bars[['t', 'open', 'close', 'high', 'low']].values, width=1.0 / 3600 * 24)
ax.xaxis_date()
得到这个图表(需要一些样式调整)

出于某种未知的原因,时间这个索引需要转换成小数。这个图表看起来可能有点“奇怪”,因为我使用的是从均匀分布中随机生成的数据,并且有一些明显的上限和下限。此外,缩放也需要手动调整……
我需要找一个更好的库来绘制OHLC图表。