出于某种原因,此代码未绘制任何内容。我最初的猜测是 p 参数有问题,但我不太确定,所以请帮助我。在第一部分,我们下载所有数据,然后我们使用它并尝试在最后绘制,但它只打开新窗口而没有任何类型的绘图。
import pandas as pd
from bokeh.plotting import figure
from bokeh.io import output_file, save, show
from bokeh.layouts import column
from bokeh.models import ColumnDataSource, CDSView, BooleanFilter, \
HoverTool, LinearAxis, NumeralTickFormatter, Range1d, RangeTool
stock_url = 'https://docs.google.com/spreadsheets/d/e/2PACX-1vTiM1scE44za7xyuheW_FrUkdSdOKipDgDOWa_03ixmJCWK_ReSqhjzax66nNHyDKARXWIXgFI_EW9X/pub?gid=1661368486&single=true&output=csv'
stock = pd.read_csv(stock_url)
metrics_url = 'https://docs.google.com/spreadsheets/d/e/2PACX-1vRDaf4y17OWjQqxODuxA4q4hsvXRkSqN0na1KtTIpvOZUdc7xHbrkhcygFfDIyVQWI2UbC3YcKUbser/pub?gid=981872466&single=true&output=csv'
metrics = pd.read_csv(metrics_url)
stock['Date'] = pd.to_datetime(stock['Date'])
metrics['Quarter Ended'] = pd.to_datetime(metrics['Quarter Ended'])
def create_candlestick_chart(symbol='AAPL'):
source = ColumnDataSource(data=dict(
date=stock[stock['Symbol'] == symbol]['Date'],
high=stock[stock['Symbol'] == symbol]['High'],
low=stock[stock['Symbol'] == symbol]['Low'],
open=stock[stock['Symbol'] == symbol]['Open'],
close=stock[stock['Symbol'] == symbol]['Close'],
volume=stock[stock['Symbol'] == symbol]['Volume'],
))
p = figure(
width=800,
height=400,
title=symbol,
x_range=(min(stock[stock['Symbol'] == symbol]['Date']), max(stock[stock['Symbol'] == symbol]['Date'])),
x_axis_type='datetime',
x_axis_location='above',
background_fill_color='#fbfbfb',
tools='pan,wheel_zoom,box_zoom,reset,save',
toolbar_location='right',
)
p.xgrid.grid_line_color = '#e5e5e5'
p.ygrid.grid_line_alpha = 0.5
p.xaxis.major_label_text_font_size = '10px'
p.yaxis.axis_label = 'Stock Price in USD'
p.yaxis.formatter = NumeralTickFormatter(format='$0.00')
p.y_range.start = min(stock[stock['Symbol'] == symbol]['Low']) * 0.9
p.y_range.end = max(stock[stock['Symbol'] == symbol]['High']) * 1.1
inc = source.data['close'] > source.data['open']
dec = source.data['open'] > source.data['close']
inc_view = CDSView(source=source, filters=[BooleanFilter(inc)])
dec_view = CDSView(source=source, filters=[BooleanFilter(dec)])
w = 12 * 60 * 60 * 1000
stock_segment = p.segment(
x0='date', y0='high', x1='date', y1='low', color='black', source=source
)
stock_inc = p.vbar(
x='date', top='close', bottom='open', width=w, fill_color='#D5E1DD', line_color='black', view=inc_view,
source=source
)
stock_dec = p.vbar(
x='date', top='open', bottom='close', width=w, fill_color='#F2583E', line_color='black', view=dec_view,
source=source
)
y_volume = figure(
y_range=p.y_range,
width=80,
height=p.height,
tools='',
toolbar_location=None,
background_fill_color='#fbfbfb'
)
p.extra_y_ranges['volume'] = Range1d(
start=0,
end=max(source.data['volume']) * 2
)
y_volume.vbar(
x='date',
top='volume',
source=source,
width=0.5,
alpha=0.5,
color='navy',
y_range_name='volume'
)
y_volume.axis.major_label_text_font_size = '10px'
y_volume.axis.axis_label = 'Volume'
y_volume.xaxis.visible = False
y_volume.yaxis.formatter = NumeralTickFormatter(format='0.00a')
y_volume_axis = LinearAxis(
y_range_name='volume',
axis_label='Volume',
formatter=NumeralTickFormatter(format='0.00a')
)
p.add_layout(y_volume_axis, 'right')
stock_volume = p.vbar(
x='date',
top='volume',
source=source,
width=0.5,
alpha=0.5,
color='navy',
y_range_name='volume',
view=inc_view,
name='inc_volume'
)
stock_volume = p.vbar(
x='date',
top='volume',
source=source,
width=0.5,
alpha=0.5,
color='red',
y_range_name='volume',
view=dec_view,
name='dec_volume'
)
hover_stock = HoverTool()
hover_stock.tooltips = [
('Date', '@date{%F}'),
('Open', '@open{$0.00}'),
('Close', '@close{$0.00}'),
('High', '@high{$0.00}'),
('Low', '@low{$0.00}'),
('Volume', '@volume{0,0}'),
]
hover_stock.formatters = {
'@date': 'datetime',
}
hover_stock.renderers = [
stock_inc,
stock_dec,
]
p.add_tools(hover_stock)
p.output_backend = 'svg'
return p
p = create_candlestick_chart()
show(p)