2013-10-25 31 views
7

Tôi muốn tạo một ô hình nến hàng ngày từ dữ liệu tôi đã tải xuống từ yahoo bằng cách sử dụng gấu trúc. Tôi đang gặp khó khăn trong việc tìm ra cách sử dụng hàm matplotlib trong ngữ cảnh này. Đây là mã:Vẽ dữ liệu nến từ một khung dữ liệu trong 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']) 

Cảm ơn

Andrew.

Trả lời

1

Tìm thấy câu hỏi này khi tôi cũng đang tìm cách sử dụng candlestick với một khung dữ liệu gấu trúc được trả về từ một trong các dịch vụ DataReader như get_data_yahoo. Cuối cùng tôi đã tìm ra nó. Một trong những chìa khóa là câu hỏi khác này, được trả lời bởi Wes McKinney và RJRyV. Dưới đây là liên kết:

Pandas convert dataframe to array of tuples

Mấu chốt là để đọc các định nghĩa hàm candlestick.py để xác định làm thế nào nó dự kiến ​​sẽ nhận được dữ liệu. Ngày cần được chuyển đổi đầu tiên, sau đó toàn bộ khung dữ liệu cần được chuyển đổi thành một loạt các bộ dữ liệu.

Đây là mã cuối cùng phù hợp với tôi. Có thể có một số biểu đồ Candlestick khác ra có một nơi nào đó hoạt động trực tiếp trên một khung dữ liệu gấu trúc được trả về từ một trong các dịch vụ báo giá cổ phiếu. Điều đó sẽ rất tuyệt.

# 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

Tôi tình cờ gặp một mục nhập quá lớn: http://pastebin.com/ne7Fjdiq thực hiện điều này tốt. Tôi cũng gặp sự cố khi nhận cú pháp gọi ngay. Nó thường xoay quanh việc chuyển đổi dữ liệu của bạn theo những cách đơn giản để có được chức năng hoạt động đúng. Vấn đề của tôi là với datetime. Phải có một cái gì đó trong dữ liệu định dạng của tôi. Một khi tôi thay thế chuỗi ngày với phạm vi (maxdata) thì nó hoạt động.

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

Tôi không có danh tiếng bình luận @ câu trả lời Randall-Goodwin, nhưng đối với gấu trúc 0.16.2 dòng:

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

phải:

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

vì matplotlib không hỗ trợ numpy datetime64 dtype

2

Đây là giải pháp:

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

Sử dụng bokeh:

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

Mã trên chia hai từ ở đây: http://bokeh.pydata.org/en/latest/docs/gallery/candlestick.html

Các vấn đề liên quan