6

我试图在 pandas 数据框中绘制数据,使用索引(日期和时间)作为 x 轴,并将数据框中的其余数据作为实际数据。这是我现在正在尝试的:

from matplotlib.finance import candlestick2

bars[['open','high','low','close']].head()


tickdatetime         open        high        low         close          

2012-09-20 09:00:00  1447.50     1447.50     1447.00     1447.00

2012-09-20 09:01:00  1447.00     1447.25     1447.00     1447.25

2012-09-20 09:02:00  1447.25     1447.75     1447.25     1447.50

2012-09-20 09:03:00  1447.75     1447.75     1447.25     1447.50

2012-09-20 09:04:00  1447.25     1447.50     1447.25     1447.50

fig,ax = plt.subplots()
ax.plot_date(bars.ix.to_pydatetime(), s, 'v-')
fig,ax = plt.subplots()
ax.plot_date(bars.ix.to_pydatetime(), s, 'v-')
ax = fig.add_axes([0.1, 0.2, 0.85, 0.7])
ax.autoscale_view()
linecol, rectcol =  candlestick2(ax,bars['open'],bars['close'],bars['high'],bars['low'],width=.5,colorup='g',colordown''r',alpha=1) 
z  = rectcol.get_zorder()
linecol.set_zorder(0.9*z)

但我收到此错误:

AttributeError                            Traceback (most recent call last)
<ipython-input-57-d62385067ceb> in <module>()
1 fig,ax = plt.subplots()
----> 2 ax.plot_date(bars.ix.to_pydatetime(), s, 'v-')
3 
4 #ax = fig.add_axes([0.1, 0.2, 0.85, 0.7])
5 ax.autoscale_view()

AttributeError: '_NDFrameIndexer' object has no attribute 'to_pydatetime'

我知道 bar.plot() 是一个很好的接口来自动处理这个问题,但我希望能够做一些事情,比如使用烛台2、更多的子图等。

我认为我的问题的根源只是试图从数据框中获取索引值,并将索引值转换为日期时间,但我还不能这样做。

任何想法表示赞赏!

4

1 回答 1

5

正如常舍所说,bars.index是你想要的,不是bars.ixbars.index返回一个 Index 对象,它本质上是一个带有索引的 Series。这就是你想要的。bar.ix 返回一个 _NDFrameIndexer,它似乎记录得很差,但却是整个 DataFrame 的某种视图(例如 try bars.ix[2])。

在您的代码中用 bar.index 替换 bar.ix 将删除错误(如果您还删除了导致不匹配 ' 的错字),并在前两个子图上制作日期刻度。但是,值得注意的是,它不会在您的烛台图上制作日期刻度:您的代码不会这样做,尽管使用 bar.index 肯定可以轻松完成。

但是,如果您想在您的烛台 2 绘图上放置日期刻度,那就有点困难了。这里的问题是烛台 2,正如您输入的内容所见,根本不使用 x 轴值。它在 0,1,2... 处绘制烛台,依此类推。如果您尝试使用日期设置 x 轴,无论是刻度还是限制,那么一切都会搞砸,因为您的绘图将在 x 轴上完全不同的某个地方。

解决此问题的一种简单方法(不涉及使用烛台代替烛台2)是让您的 x 轴保持为数据的整数索引,而是根据您的日期设置刻度标签。因此,例如:

fig = figure() 
ax = fig.add_subplot(111) 
candlestick2(ax,bars['open'],bars['close'],bars['high'],bars['low'],width=.5,colorup='g',colordown='r',alpha=1)
ax.set_xticks(arange(0,len(bars))) 
ax.set_xticklabels(bars.index,rotation=70)

这会绘制您的日期,(a) 确保您的刻度位于整数位置,然后根据日期设置这些刻度的标签。我还旋转了它们,以便您可以实际看到它们。ax.set_xticklabels 接受字符串,因此您可以根据需要修改日期格式。

于 2013-03-07T22:09:38.523 回答