2013-10-25 2 views
7

Я хотел бы создать ежедневный график подсвечника из данных, загруженных с yahoo с помощью панд. У меня возникли проблемы с выяснением того, как использовать функцию подсвечника matplotlib в этом контексте. Вот код:Данные подсвечивания данных из фрейма данных в Python

#The following example, downloads stock data from Yahoo and plots it. 
from pandas.io.data import get_data_yahoo 
import matplotlib.pyplot as plt 

from matplotlib.pyplot import subplots, draw 
from matplotlib.finance import candlestick 

symbol = "GOOG" 

data = get_data_yahoo(symbol, start = '2013-9-01', end = '2013-10-23')[['Open','Close','High','Low','Volume']] 

ax = subplots() 

candlestick(ax,data['Open'],data['High'],data['Low'],data['Close']) 

Благодаря

Эндрю.

ответ

1

Обнаружил этот вопрос, когда я тоже смотрел, как использовать подсвечник с помощью dataframe pandas, возвращенный из одной из служб DataReader, таких как get_data_yahoo. В конце концов я понял это. Одним из ключей был этот другой вопрос, отвеченный Уэсом МакКинни и RJRyV. Вот что ссылка:

Pandas convert dataframe to array of tuples

Ключ в том, чтобы прочитать определение функции candlestick.py, чтобы определить, как ожидается, получит данные. Сначала необходимо преобразовать дату, затем весь блок данных необходимо преобразовать в массив кортежей.

Вот код, который работал для меня. Может быть, есть еще какой-то другой график подсвечника где-то, который работает непосредственно на базе данных панд, возвращенной из одной из услуг котировки акций. Это было бы очень приятно.

# Imports 
from pandas.io.data import get_data_yahoo 
from datetime import datetime, timedelta 
import matplotlib.dates as mdates 
from matplotlib.pyplot import subplots, draw 
from matplotlib.finance import candlestick 
import matplotlib.pyplot as plt 

# get the data on a symbol (gets last 1 year) 
symbol = "TSLA" 
data = get_data_yahoo(symbol, datetime.now() - timedelta(days=365)) 

# drop the date index from the dateframe 
data.reset_index(inplace = True) 

# convert the datetime64 column in the dataframe to 'float days' 
data.Date = mdates.date2num(data.Date) 

# make an array of tuples in the specific order needed 
dataAr = [tuple(x) for x in data[['Date', 'Open', 'Close', 'High', 'Low']].to_records(index=False)] 

# construct and show the plot 
fig = plt.figure() 
ax1 = plt.subplot(1,1,1) 
candlestick(ax1, dataAr) 
plt.show() 
3

я наткнулся на большой вход Pastebin: http://pastebin.com/ne7Fjdiq, что делает это хорошо. У меня тоже возникли проблемы с правильным синтаксисом вызова. Он обычно вращается вокруг преобразования ваших данных простыми способами, чтобы заставить функцию работать правильно. Моя проблема была связана с датой. В моих данных формата должно быть что-то. Как только я заменил ряд Date диапазоном (maxdata), тогда он сработал.

data = pandas.read_csv('data.csv', parse_dates={'Timestamp': ['Date', 'Time']}, index_col='Timestamp') 
ticks = data.ix[:, ['Price', 'Volume']] 
bars = ticks.Price.resample('1min', how='ohlc') 
barsa = bars.fillna(method='ffill') 
fig = plt.figure() 
fig.subplots_adjust(bottom=0.1) 
ax = fig.add_subplot(111) 
plt.title("Candlestick chart") 
volume = ticks.Volume.resample('1min', how='sum') 
value = ticks.prod(axis=1).resample('1min', how='sum') 
vwap = value/volume 
Date = range(len(barsa)) 
#Date = matplotlib.dates.date2num(barsa.index)# 
DOCHLV = zip(Date , barsa.open, barsa.close, barsa.high, barsa.low, volume) 
matplotlib.finance.candlestick(ax, DOCHLV, width=0.6, colorup='g', colordown='r', alpha=1.0) 
plt.show() 
4

У меня нет репутации комментировать @ Randall-Гудвин ответ, но для панд 0.16.2 линии:

# convert the datetime64 column in the dataframe to 'float days' 
data.Date = mdates.date2num(data.Date) 

должны быть:

data.Date = mdates.date2num(data.Date.dt.to_pydatetime()) 

потому что Matplotlib не поддерживает numpy datetime64 dtype

2

Вот решение:

from pandas.io.data import get_data_yahoo 
import matplotlib.pyplot as plt 
from matplotlib import dates as mdates 
from matplotlib import ticker as mticker 
from matplotlib.finance import candlestick_ohlc 
import datetime as dt 
symbol = "GOOG" 

data = get_data_yahoo(symbol, start = '2014-9-01', end = '2015-10-23') 
data.reset_index(inplace=True) 
data['Date']=mdates.date2num(data['Date'].astype(dt.date)) 
fig = plt.figure() 
ax1 = plt.subplot2grid((1,1),(0,0)) 
plt.ylabel('Price') 
ax1.xaxis.set_major_locator(mticker.MaxNLocator(6)) 
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) 

candlestick_ohlc(ax1,data.values,width=0.2) 
5

Использование боке:

import io 
from math import pi 
import pandas as pd 
from bokeh.plotting import figure, show, output_file 

df = pd.read_csv(
    io.BytesIO(
     b'''Date,Open,High,Low,Close 
2016-06-01,69.6,70.2,69.44,69.76 
2016-06-02,70.0,70.15,69.45,69.54 
2016-06-03,69.51,70.48,68.62,68.91 
2016-06-04,69.51,70.48,68.62,68.91 
2016-06-05,69.51,70.48,68.62,68.91 
2016-06-06,70.49,71.44,69.84,70.11 
2016-06-07,70.11,70.11,68.0,68.35''' 
    ) 
) 

df["Date"] = pd.to_datetime(df["Date"]) 

inc = df.Close > df.Open 
dec = df.Open > df.Close 
w = 12*60*60*1000 

TOOLS = "pan,wheel_zoom,box_zoom,reset,save" 

p = figure(x_axis_type="datetime", tools=TOOLS, plot_width=1000, title 
= "Candlestick") 
p.xaxis.major_label_orientation = pi/4 
p.grid.grid_line_alpha=0.3 

p.segment(df.Date, df.High, df.Date, df.Low, color="black") 
p.vbar(df.Date[inc], w, df.Open[inc], df.Close[inc], fill_color="#D5E1DD", line_color="black") 
p.vbar(df.Date[dec], w, df.Open[dec], df.Close[dec], fill_color="#F2583E", line_color="black") 

output_file("candlestick.html", title="candlestick.py example") 

show(p) 

Candlestick plot from a Pandas DataFrame

Код выше раздвоенный здесь: http://bokeh.pydata.org/en/latest/docs/gallery/candlestick.html