2013-10-25 10 views
7

Ich möchte eine tägliche Candlestick-Plot von Daten erstellen, die ich von Yahoo mit Pandas heruntergeladen. Ich habe Probleme herauszufinden, wie man die Candlestick Matplotlib Funktion in diesem Kontext verwendet. Hier ist der Code:Plotten Candlestick Daten von einem Datenrahmen in 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']) 

Dank

Andrew.

Antwort

1

Diese Frage gefunden, als ich auch sah, wie man Candlestick mit einem Pandas Datenrahmen von einem der DataReader-Dienste wie get_data_yahoo zurückgegeben. Ich habe es schließlich herausgefunden. Einer der Schlüssel war diese andere Frage, beantwortet von Wes McKinney und RJRyV. Hier ist die Verbindung:

Pandas convert dataframe to array of tuples

Der Schlüssel war die candlestick.py Funktionsdefinition zu lesen, um zu bestimmen, wie es die Daten zu empfangen erwartet. Das Datum, das zuerst konvertiert werden muss, dann muss der gesamte Datenrahmen in ein Array von Tupeln konvertiert werden.

Hier ist der letzte Code, der für mich arbeitete. Vielleicht gibt es dort irgendwo ein anderes Candlestick-Diagramm, das direkt auf einem Pandas-Datenrahmen funktioniert, der von einem der Kursangebote zurückgegeben wurde. Das wäre sehr nett.

# 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

ich über einen großen Pastebin Eintrag gestolpert: http://pastebin.com/ne7Fjdiq dass dies gut funktioniert. Ich hatte auch Probleme, die Syntax des Aufrufs richtig zu machen. Es dreht sich normalerweise darum, Ihre Daten auf einfache Weise zu transformieren, damit die Funktion richtig funktioniert. Mein Problem war mit der Datetime. Es muss etwas in meinen Formatdaten sein. Sobald ich die Date-Reihe durch die Entfernung (maxdata) ersetzt habe, hat es funktioniert.

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

Ich habe keinen Ruf kommentieren @ randall-goodwin Antwort, aber für Pandas 0.16.2 Linie:

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

sein muss:

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

weil matplotlib nicht unterstützt numpy datetime64 dtype

2

Hier ist die Lösung:

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

Mit 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

-Code oben von hier gegabelt: http://bokeh.pydata.org/en/latest/docs/gallery/candlestick.html

Verwandte Themen