散景图未绘制

问题描述 投票:0回答:0

出于某种原因,此代码未绘制任何内容。我最初的猜测是 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)
python pandas visualization bokeh
© www.soinside.com 2019 - 2024. All rights reserved.