使用matplotlib对pandas DataFrame进行重采样以绘制金融OHLC图表

0 投票
2 回答
1851 浏览
提问于 2025-04-18 06:14

我有一个数据框 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图表。

撰写回答