2013-10-25 5 views
7

나는 팬더를 사용하여 야후에서 다운로드 한 데이터로부터 매일 촛대 줄거리를 만들고 싶습니다. 이 상황에서 촛대 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

나는 get_data_yahoo와 같은 DataReader 서비스 중 하나에서 반환 된 팬더 데이터 프레임과 함께 촛대를 사용하는 방법을 찾고있을 때이 질문을 발견했습니다. 나는 결국 그것을 알아 냈다. 열쇠 중 하나는 Wes McKinney와 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

좋은 퍼스널 용지 항목을 우연히 발견 : http://pastebin.com/ne7Fjdiq 잘 수행합니다. 나도 전화 구문을 제대로 이해하는 데 어려움을 겪고 있었다. 일반적으로 함수를 간단한 방식으로 변환하여 함수가 올바르게 작동하도록하는 것이 일반적입니다. 내 문제는 datetime에있었습니다. 내 형식 데이터에 뭔가 있어야합니다. 일단 날짜 계열을 범위 (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

나는 @ 랜달-굿윈 대답을 언급 할 평판이 없지만, 팬더 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