2012-03-12 8 views
15

Mam problemy z finansowaniem Matplotlib. Wygląda na to, że ich wykresy świecowe najlepiej sprawdzają się w codziennych danych i mam problemy z ich pracą z intraday (co 5 minut, od 9:30 do 4   po południu) danych.Tablice świecowe w ciągu dnia za pomocą Matplotlib

Wkleiłem przykładowe dane w pastebin. Najważniejsze jest to, co dostaję z bazy danych, a dno jest dopełniane datą sformatowaną jako liczba porządkowa do użycia w Matplotlib.

Link to sample data

Kiedy rysuję moje wykresy istnieją ogromne luki w nim osie ssać, a zoom jest równie straszne. http://imgur.com/y7O8A

Enter image description here

Jak zrobić ładny czytelny wykres z tymi danymi? Moim ostatecznym celem jest uzyskanie wykresu, który wygląda tak: zdalnie

Enter image description here

http://i.imgur.com/EnrTW.jpg

Punkty dane mogą być w różnych odstępach od 5 minut do 30 minut.


Wykonałem także dane pandasowe danych, ale nie jestem pewien, czy pandy mają funkcję świecznika.

+1

Z danych podasz, wygląda na to dane zostały zebrane codziennie codziennie codziennie 30min od 9:30 do 4:00 PM. Różnica może odzwierciedlać czas między godziną 16:00 a 9:30 między dniami, w których nie pozyskano danych. Nawiasem mówiąc, korzystając z [pandas] (http://pandas.pydata.org/) librairy możesz bezpośrednio obsługiwać i analizować swoje surowe dane, a także je nanoszyć. – gcalmettes

+0

Pandy nie są w stanie wykreślić danych ohlc/candlestick ... – NoviceCoding

+1

Link do pastebin nie jest już dostępny – alexandroid

Odpowiedz

41

Jeśli dobrze rozumiem, jedną z głównych obaw jest różnica między danymi dziennymi. Aby się ich pozbyć, jedną z metod jest sztuczne "równomierne rozmieszczenie" danych (ale oczywiście stracisz wszelkie wskazania czasowe w ciągu dnia).

W ten sposób, w ten sposób, będziesz w stanie uzyskać wykres, który wygląda jak ten, który zaproponowałeś jako przykład.

Skomentowany kod i wynikowy wykres znajdują się poniżej.

import numpy as np 
import matplotlib.pyplot as plt 
import datetime 

from matplotlib.finance import candlestick 
from matplotlib.dates import num2date 

# data in a text file, 5 columns: time, opening, close, high, low 
# note that I'm using the time you formated into an ordinal float 
data = np.loadtxt('finance-data.txt', delimiter=',') 

# determine number of days and create a list of those days 
ndays = np.unique(np.trunc(data[:,0]), return_index=True) 
xdays = [] 
for n in np.arange(len(ndays[0])): 
    xdays.append(datetime.date.isoformat(num2date(data[ndays[1],0][n]))) 

# creation of new data by replacing the time array with equally spaced values. 
# this will allow to remove the gap between the days, when plotting the data 
data2 = np.hstack([np.arange(data[:,0].size)[:, np.newaxis], data[:,1:]]) 

# plot the data 
fig = plt.figure(figsize=(10, 5)) 
ax = fig.add_axes([0.1, 0.2, 0.85, 0.7]) 
    # customization of the axis 
ax.spines['right'].set_color('none') 
ax.spines['top'].set_color('none') 
ax.xaxis.set_ticks_position('bottom') 
ax.yaxis.set_ticks_position('left') 
ax.tick_params(axis='both', direction='out', width=2, length=8, 
       labelsize=12, pad=8) 
ax.spines['left'].set_linewidth(2) 
ax.spines['bottom'].set_linewidth(2) 
    # set the ticks of the x axis only when starting a new day 
ax.set_xticks(data2[ndays[1],0]) 
ax.set_xticklabels(xdays, rotation=45, horizontalalignment='right') 

ax.set_ylabel('Quote ($)', size=20) 
ax.set_ylim([177, 196]) 

candlestick(ax, data2, width=0.5, colorup='g', colordown='r') 

plt.show() 

graph

+1

Dziękuję bardzo za tego pana, nie byłem programowany w zeszłym tygodniu, bo wcześniej dałbym ci nagrodę. Dzięki jeszcze raz. – NoviceCoding

Powiązane problemy