重新采样pandas df以使用matplotlib绘制金融OLHC图表

时间:2014-05-11 23:38:55

标签: python matplotlib plot pandas

我有一个数据帧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)是否有替代matplotlib来绘制OHLC图表?

谢谢

2 个答案:

答案 0 :(得分: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()

获取此图表(需要一些样式) enter image description here

由于未知原因,索引(时间)需要转换为十进制数。该图表可能看起来“奇怪”,因为我使用了从均匀分布生成的随机数据,带有一些明显的大写和地板。此外,缩放需要手动完成......

需要找到一个更好的库来绘制OHLC图表。

答案 1 :(得分:0)

重新采样的结果将时间作为数据帧的索引。发生这种情况时,在df上调用mpl函数不会传递索引。因此,如果键入tick_bars.values,则可以看到。你不会看到时间。

尝试

tick_bars.reset_index(inplace = True)
candlestick(ax,tick_bars.values)

这明确地传递了时间。