Я создал функцию ed_montecarlo, которая запускает симуляцию Монте-Карло с заданным числом итераций и возвращает результаты в виде фрейма данных pandas с несколькими столбцами (не все из которых используются здесь). В настоящее время я пытаюсь связать это на график с Bokeh и иметь ползунок, который при изменении перезапустит функцию, используя новое значение ползунка.
Мой код выглядит следующим образом:
def modify_doc(doc):
source = ColumnDataSource(ed_montecarlo(num=1000))
TOOLS = "pan,wheel_zoom,box_zoom,reset,save"
iter_scatter= figure(x_axis_label='Iteration Number', y_axis_label='Margin', title='Scatter Plot of Iterrations',
tools=TOOLS, plot_height=400, plot_width=550)
iter_scatter.yaxis[0].formatter = NumeralTickFormatter(format="$0.00")
dots = iter_scatter.scatter(x='index', y='Margin', source=source, fill_alpha=.5, line_color=None,
hover_fill_color='firebrick', hover_alpha=.9, hover_line_color=None, size=10)
iter_scatter.line(x='index', y='Median Margin', source=source, line_color='cyan', line_width=5, line_alpha=0.8)
band = Band(base='index', lower='25th Margin', upper='75th Margin', source=source, level='underlay',
fill_alpha=0.3, line_width=3, line_alpha=.8, line_color='cyan', fill_color='cyan')
iter_scatter.add_layout(band)
iter_scatter.add_tools(HoverTool(tooltips=[('Iterration', '@index'),
('Margin', '$@Margin{%0.2f}')],
formatters={'Margin': 'printf',},
renderers = [dots], mode='mouse'))
def callback(attr, old, new):
num = iter_slider.value
iter_slider = Slider(start=100, end=5000, step=100, value=1000, title='Number of Iterations')
iter_slider.on_change('value', callback)
doc.add_root(column(iter_slider, iter_scatter))
show(modify_doc)
Когда я запускаю приведенный выше код, диаграмма рассеяния отображается правильно, используя 1000 итераций, однако, когда я перемещаю ползунок, он не будет повторно запускать функцию Монте-Карло и обновлять график. Что мне не хватает? Я долго бился головой об этом.