python - Python Bokeh - 如何使用 Slider 更新数据表中的计算结果?
问题描述
我有一个数据列表,我想使用前 X 个数据点运行一些统计数据。X 可以是 12 到最大数据数之间的任何整数。我想使用 Bokeh Slider 来控制 X 的值。输出是 Bokeh 数据表。每个统计数据代表一列。问题是我的代码不会更新表格。
为了简化我的问题,我使用了 [0,1,2,3, ...,49] (50 个数字顺序)作为数据列表。我想计算两个基本统计数据:(1)计数:观察次数,(2)平均值:所有观察的平均值。Slider 的默认值是最大点,即 50。如果我将值更改为 10,我应该看到 Count = 10 和 Average = 5(= 0 到 10 的平均值)。
import pandas as pd
from bokeh.io import show, output_file
from bokeh.models import Slider, ColumnDataSource
from bokeh.models.widgets import DataTable, TableColumn
from bokeh.layouts import column
output_file('Slider_Controlled_Calculation.html')
sample_data = [i for i in range(50)]
max_count = len(sample_data)
partial_data = sample_data[:]
df_table = pd.DataFrame(columns = ['Count', 'Average'])
df_table['Count'] = [len(partial_data)]
df_table['Average'] = [sum(partial_data) / len(partial_data)]
mySource = ColumnDataSource(data=df_table)
# Define a callback
def update_table(attr, old, new):
i = slider.value
partial_data = sample_data[:i]
df_table['Count'] = [len(partial_data)]
df_table['Average'] = [sum(partial_data) / len(partial_data)]
columns = [TableColumn(field=Ci, title=Ci) for Ci in df_table.columns]
data_table = DataTable(source=mySource, columns=columns, width=400, height=280)
# Create a slider
slider = Slider(start = 12, end = max_count, step = 1, value = max_count, title = 'Select Calc Range')
slider.on_change('value', update_table)
layout = column(slider, data_table)
show(layout)
解决方案
from bokeh.io import curdoc
from bokeh.layouts import column
from bokeh.models import Slider, ColumnDataSource, DataTable, TableColumn
N = 50
sample_data = list(range(N))
def get_new_data(i):
partial_data = sample_data[:i]
return dict(Count=[len(partial_data)],
Average=[sum(partial_data) / len(partial_data)])
ds = ColumnDataSource(data=get_new_data(None))
def update_table(attr, old, new):
ds.data = get_new_data(new)
columns = [TableColumn(field=Ci, title=Ci) for Ci in ['Count', 'Average']]
data_table = DataTable(source=ds, columns=columns, width=400, height=280)
slider = Slider(start=12, end=N, step=1, value=N, title='Select Calc Range')
slider.on_change('value', update_table)
# `show` will not work with Python callbacks. You have to use `bokeh serve`.
curdoc().add_root(column(slider, data_table))
推荐阅读
- html - 我正在尝试使我的图形元素(作为链接工作)是内联的,但我没有尝试过
- css - pseduo-backround image::after in CSS for full HTML body 向下滚动时不会重复
- flutter - 将 If/Else 与 Timer Flutter 一起使用
- c++ - 有什么办法可以改进DPDK的acl lib
- json - 如何为 web api 方法输入参数增加 maxJsonLength 的大小?
- javascript - 更新 url 并保存 axios 响应
- postgresql - 通过返回查询执行返回一组记录的 postgres 函数中的查询性能缓慢
- node.js - 如何在 Node.js 中同时路由
- sql - 在 SQL 中创建视图时从字符串中删除最后 5 个字符
- r - Hugo Academic Group 未呈现主题