Python 3.x 如何为数量不确定的选项创建线条图的Bokeh选择菜单?

Python 3.x 如何为数量不确定的选项创建线条图的Bokeh选择菜单?,python-3.x,pandas,bokeh,Python 3.x,Pandas,Bokeh,我一直在努力获得一个选择菜单和Bokeh绘图,并在我正在使用的数据集上运行。可以找到数据集。我没有使用JavaScript的经验,但我相信我的选择菜单没有连接到我的绘图。因此,我有一个绘图大纲,但没有显示数据。当我使用bokeh service-show test.py从控制台运行脚本时,我在JS控制台中得到了前7个通知。屏幕截图中红色括号中的最后三个出现在我尝试在选择菜单中切换到其他项目时 目标:显示本例中id号“ndc”在选择菜单中被选中的行的数据图 这是我的代码修改,从我用来开始。也使用了

我一直在努力获得一个选择菜单和Bokeh绘图,并在我正在使用的数据集上运行。可以找到数据集。我没有使用JavaScript的经验,但我相信我的选择菜单没有连接到我的绘图。因此,我有一个绘图大纲,但没有显示数据。当我使用bokeh service-show test.py从控制台运行脚本时,我在JS控制台中得到了前7个通知。屏幕截图中红色括号中的最后三个出现在我尝试在选择菜单中切换到其他项目时

目标:显示本例中id号“ndc”在选择菜单中被选中的行的数据图

这是我的代码修改,从我用来开始。也使用了Bokeh文档本身,以及其他一些文档

import pandas as pd
from bokeh.io import curdoc, output_notebook, output_file
from bokeh.layouts import row, column
from bokeh.models import Select, DataRange1d, ColumnDataSource
from bokeh.plotting import figure

# output_notebook()
output_file('test.html')

def get_dataset(src, drug_id):
    src.drop('Unnamed: 0', axis = 1, inplace = True)
    df = src[src.ndc == drug_id].copy()
    df['date'] = pd.to_datetime(df['date'])
    df = df.set_index(['date'])
    df.sort_index(inplace=True)
    source = ColumnDataSource(data=df)
    return source


def make_plot(source, title):
    plot = figure(plot_width=800, plot_height = 800, tools="", x_axis_type = 'datetime', toolbar_location=None)

    plot.xaxis.axis_label = 'Time'
    plot.yaxis.axis_label = 'Price ($)'
    plot.axis.axis_label_text_font_style = 'bold'
    plot.x_range = DataRange1d(range_padding = 0.0)
    plot.grid.grid_line_alpha = 0.3 

    plot.title.text = title
    plot.line(x= 'date', y='nadac_per_unit', source=source)
    return plot


def update_plot(attrname, old, new):
    ver = vselect.value
    plot.title.text = "Drug Prices"
    src = get_dataset(df, ver)
    source.date.update(src.date)


df = pd.read_csv('data/plotting_data.csv')
ver = '54034808' #Initial id number
cc = df['ndc'].astype(str).unique() #select-menu options

vselect = Select(value=ver, title='Drug ID', options=sorted((cc)))

source = get_dataset(df, ver)
plot = make_plot(source, "Drug Prices")

vselect.on_change('value', update_plot)
controls = row(vselect)

curdoc().add_root(row(plot, controls))

您的代码中存在一些问题:

您想删除未命名的:0列。此操作只能执行一次,当您再次尝试此操作时,它将抛出一个错误,因为此列不再存在。 您尝试过滤数据帧的方式不起作用,将导致数据帧为空。您可以基于如下列值选择行:df.loc[df['column\u name']==some\u value] 更新ColumnDataSource对象可以通过用新数据替换source.data来完成。 作为pd进口熊猫 从bokeh.io导入curdoc、输出\u笔记本、输出\u文件 从bokeh.layouts导入行、列 从bokeh.models导入选择,DataRange1d,ColumnDataSource 从bokeh.plotting导入图形 输出笔记本 输出文件'test.html' def get_数据集SRC,药物id: src.drop'Unnamed:0',axis=1,inplace=True df=src.loc[src['ndc']==intdrug\u id] df['date']=pd.to_datetimedf['date'] df=df.set_索引['date'] df.sort\u indexinplace=True source=ColumnDataSourcedata=df 返回源 def make_plotsource,标题: plot=figureplot\u width=800,plot\u height=800,tools=,x\u axis\u type='datetime',toolbar\u location=None plot.xaxis.axis_标签='Time' plot.yaxis.axis_标签='Price$' plot.axis.axis\标签\文本\字体\样式='bold' plot.x_range=DataRange1drange_padding=0.0 plot.grid.grid_line_alpha=0.3 plot.title.text=标题 plot.linex='date',y='nadac\u每单位',source=source 返回图 def update_plotattrname,旧,新: ver=vselect.value df1=df.loc[df['ndc']==intnew] df1['date']=pd.to_datetimedf1['date'] df1=df1.set_索引['date'] df1.sort_indexinplace=True newSource=ColumnDataSourcedf1 source.data=newSource.data df=pd.read_csv'data/plotting_data.csv' 版本='54034808'初始id号 cc=df['ndc'].astypestr.unique选择菜单选项 vselect=Selectvalue=ver,title='drugid',options=sortedcc source=获取数据集df,版本 plot=制造图来源、药品价格 vselect.在更改“值”时,更新绘图 控件=行选择 curdoc.add_rootrowplot,控件
你是个天才。当我提到变更时,我知道我经常与之抗争的前两点,并最终为“匿名删除”创建了一个if语句,为第二个项目创建了一些其他解决方案,但第三点是关键点。