繁体   English   中英

Python Bokeh - 如何使用 Slider 更新数据表中的计算结果?

[英]Python Bokeh - How to update calculation results in Data Table using 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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM