2013-03-07 1 views
6

Ich versuche, Daten in einem Pandas-Datenrahmen zu plotten, mit dem Index, der ein Datum und eine Zeit ist, als x-Achse, und der Rest der Daten im Datenrahmen als die tatsächlichen Daten. Hier ist, was ich versuche jetzt:Wie man einen Datumsindex aus einem Pandas-Dataframe zieht, um als x-Achse in Matplotlib zu verwenden

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) 

aber ich bekomme diese Fehlermeldung:

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' 

Ich verstehe, dass bars.plot() ist eine nette Schnittstelle dies automatisch zu handhaben, aber ich möchte in der Lage sein, Dinge wie candlestick2, mehr Subplots, etc. zu tun.

Ich denke, die Wurzel meines Problems ist nur versuchen, die Indexwerte aus dem Datenrahmen zu bekommen, und die Indexwerte zu Datum, aber ich konvertieren Das war bisher nicht möglich.

Irgendwelche Ideen werden geschätzt!

+1

Sie sollten bars.index anstelle von bars.ix verwenden –

Antwort

5

Wie Chang Sie bemerkte, bars.index ist was Sie wollen, nicht bars.ix. bars.index gibt ein Indexobjekt zurück, das im Wesentlichen eine Serie mit Ihren Indizes darstellt. Das ist, was du willst. bars.ix gibt einen _NDFrameIndexer zurück, etwas, das sehr schlecht dokumentiert erscheint, aber eine Art Ansicht des gesamten Datenrahmens darstellt (zB probiere bars.ix[2]).

Das Ersetzen von bars.ix durch bars.index in Ihrem Code wird den Fehler entfernen (wenn Sie auch den Tippfehler entfernen, der einen nicht übereinstimmenden Fehler verursacht) und Datumstips für die ersten beiden Unterplots erstellen. Es ist jedoch erwähnenswert, dass es auf Ihrem Candlestick-Plot keine Ticks gibt: Ihr Code tut das nicht, aber mit bars.index könnte es sicherlich ohne große Schwierigkeiten gemacht werden.

Wenn Sie jedoch Datum Ticks auf Ihrem Candlestick2 Plot setzen möchten, wird das ein bisschen härter sein. Das Problem hierbei ist, dass candlestick2, wie Sie anhand dessen, was Sie eingeben, nicht x-Achsenwerte verwendet. Es zeichnet die Kerzen bei 0,1,2 ... und so weiter. Wenn Sie versuchen, Ihre x-Achse mit Ihren Daten zu setzen, ob als Ticks oder als Grenzen, dann wird alles durcheinander gebracht, da Ihre Handlung auf der x-Achse völlig anders sein wird.

Ein einfacher Weg, dieses Problem zu lösen, das ist nicht mit Leuchter statt candlestick2 verwendet, ist Ihre x-Achse als nur Integer-Indizes der Daten bleiben zu lassen und stattdessen setzen Ihren tick Etiketten basierend auf Ihren Terminen. So zum Beispiel:

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) 

Diese Ihr Datum Plots, (a) stellt sicher, dass Ihre Zecken an ganzzahligen Positionen sind, und setzt dann die Etiketten dieser Zecken auf die Tage, basiert. Ich habe sie auch gedreht, damit Sie sie sehen können. ax.set_xticklabels verwendet Zeichenfolgen, sodass Sie die Datumsformatierung beliebig ändern können.

+0

Chang Sie, danke, bars.index ist was ich brauchte. cge, Sie haben recht, ich versuche die Ticks auf meiner Candlestick-Plot zu machen. Ich habe versucht, das herauszufinden, aber ich kann nicht herausfinden, wie man die Achseninstanz auf bars.index richtet. Ich habe eine Menge Major/Minor Locator Zeug mit Tagen und Wochen gefunden, aber ich denke, ich möchte, dass der Code nur die Standardformatierung ausführt, damit ich sie für Diagramme wiederverwenden kann, die tägliche/wöchentliche/winzige usw. Daten ohne Verwirrung mit Locator-Code. Hast du irgendwelche Ideen, wie ich die Daten auf dem Candlestick-Plot mit bars.index erhalten könnte? Vielen Dank. – Jeff

+0

das habe ich bisher versucht, aber meine x-achse ist leer. 'fig = figure() ax = fig.add_subplot (111) ax.xaxis_date() ax.set_xticks (bars.index.to_pydatetime()) Candlestick2 (Axt, Balken ['open'], Balken ['close'], Balken ['high'], Balken ['low'], Breite = .5, colorup = 'g', colordown = 'r', alpha = 1) ' – Jeff

+0

Probieren Sie, was ich hinzugefügt habe, und sehen Sie, ob es für Sie funktioniert. Ihre X-Achse ist leer, da Candlestick2 ganzzahlige X-Werte verwendet und nicht die Daten in Balken. – cge

Verwandte Themen