Mapping candlestick data from a data frame in Python

I would like to create a daily candlestick chart from data downloaded from yahoo using pandas. I am having trouble figuring out how to use the matplotlib candlestick function in this context. Here is the code:

#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']) 

thanks

Andrew.

+7
candlestick chart
source share
5 answers

Using 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 chart from Pandas DataFrame

The code above is forked from here: http://bokeh.pydata.org/en/latest/docs/gallery/candlestick.html

+5
source share

I have no reputation to comment on @ randall-goodwin's answer, but for pandas 0.16.2 the line:

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

it should be:

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

because matplotlib does not support numpy datetime64 dtype

+4
source share

I came across a big post in pastebin: http://pastebin.com/ne7Fjdiq , which does it well. I also had problems with the correct call syntax. It usually revolves around converting your data in simple ways to make a function work correctly. My problem was with the date. There should be something in my format data. As soon as I replaced the Date series with a range (maxdata), then it worked.

 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() 
+3
source share

Here is the solution:

 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) 
+2
source share

Found this question when I also looked at how to use a candlestick with the pandas frame returned from one of the DataReader services, such as get_data_yahoo. I finally figured it out. One of the keys was this other question answered by Wes McKinney and RJRyV. Here is the link:

Pandas converts dataframe to tuple array

The key was to read the definition of candlestick.py to determine how it should receive data. First you need to convert the date, then the entire data block must be converted to an array of tuples.

Here is the last code that worked for me. Perhaps there is somewhere else some kind of candlestick chart that works directly on the pandas dataframe returned from one of the stock quote services. That would be very nice.

 # 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() 
+1
source share

All Articles