2013-03-07 5 views
6

Usiłuję wykreślić dane w dataframe pandy, przy użyciu indeksu, który jest data i godzina, jako osi x, a pozostałe dane w ramce danych jako rzeczywiste dane. Oto, co próbuję teraz:Jak wyciągnąć wskaźnik daty z pomocą dataframe pandy używać jako osi x w matplotlib

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) 

ale otrzymuję ten błąd:

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' 

Rozumiem, że bars.plot() jest ładny interfejs do obsługi to automatycznie, ale chcę być w stanie robić rzeczy takie jak używanie świecy2, więcej wątków, itp.

Myślę, że głównym powodem mojego problemu jest po prostu próba pobrania wartości indeksowych z ramki danych i przekonwertowania wartości indeksu na czasy nie udało się jeszcze tego zrobić.

Wszelkie pomysły są mile widziane!

+1

Należy użyć bars.index zamiast bars.ix –

Odpowiedz

5

Jak zauważyła Chang, bars.index jest tym, czego potrzebujesz, a nie bars.ix. bars.index zwraca obiekt indeksu, który zasadniczo jest serią z indeksami. To jest to, czego chcesz. bars.ix zwraca _NDFrameIndexer, coś, co wydaje się bardzo słabo udokumentowane, ale jest pewnego rodzaju widokiem całej struktury DataFrame (np. spróbuj bars.ix[2]).

Zastąpienie bars.ix kodem bars.index w kodzie spowoduje usunięcie błędu (jeśli usuniesz literówkę, która powoduje niedopasowanie), i zaznacz daty na pierwszych dwóch wątkach. Warto jednak zauważyć, że nie zrobi to tyknięcia na twoim świeczniku: twój kod nie robi tego, choć z bars.index można to zrobić bez większych trudności.

Jeśli chcesz umieścić datę kleszcze na candlestick2 działki jednak, że będzie nieco trudniej. Problem polega na tym, że świecznik2, jak widać po wprowadzeniu do niego, nie wykorzystuje w ogóle wartości osi X. Układa świeczniki o wartości 0,1,2 ... i tak dalej. Jeśli spróbujesz ustawić oś x z twoimi datami, czy to jako kleszcze, czy granice, wtedy wszystko będzie popsute, ponieważ twoja fabuła będzie gdzieś zupełnie inna na osi X.

Jeden prosty sposób rozwiązać ten, który nie wiąże się z użyciem świecznik zamiast candlestick2, to niech twoi oś x pobyt jak tylko całkowite indeksy danych i zamiast ustawić swoją kleszcz etykiety podstawie swoich dat. Tak więc, na przykład:

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) 

Ten wykreślania datę (a) zapewnia, że ​​kleszcze są w miejscach całkowitych, a następnie ustawia etykiety tych kleszczy na podstawie dat. Obróciłem je tak, abyś mógł je zobaczyć. ax.set_xticklabels przyjmuje łańcuchy, więc możesz dowolnie modyfikować formatowanie daty.

+0

Chang ona dziękuję bars.index jest to, co potrzebne. cge, masz rację, próbuję zrobić kleszcze na mojej działce z lichtarzami. Próbowałem to rozgryźć, ale nie mogę dowiedzieć się, jak wskazać instancję osi na bars.index. Znalazłem wiele głównych/pomniejszych pozycji lokalizatora za pomocą dni i tygodni, ale myślę, że chcę, żeby kod po prostu wykonał domyślne formatowanie, dzięki czemu mogę ponownie użyć go do wykresów, które wykonują dane dzienne/tygodniowe/drobiazgowe itd. Bez mieszanie z kodem lokalizatora. Czy masz jakieś pomysły na to, w jaki sposób mogę uzyskać daty, które pojawią się na wykresie świecowym za pomocą bars.index? Dzięki. – Jeff

+0

to jest to, co próbowałem do tej pory, ale moja oś X jest pusta. 'fig = figure() ax = fig.add_subplot (111) topór.xaxis_date() ax.set_xticks (bars.index.to_pydatetime()) świecznik2 (topór, pręty ["otwarte"], pręty ["zamknij"], paski ["wysokie"], paski ["niskie"], szerokość = .5, colorup = 'g', colordown = 'r', alpha = 1) ' – Jeff

+0

Wypróbuj to, co dodałem i zobacz, czy to działa. Twoja oś X jest pusta, ponieważ świeca 2 używa liczb całkowitych x, a nie dat, które są w paskach. – cge

Powiązane problemy