Python Bokeh DataTable-分页大型源数据集

时间:2019-01-07 09:52:05

标签: python datatable datasource bokeh paginate

我很难克服以下问题: 我需要可视化bokeh DataTable中的大型数据集(> 1M行,3-5列)。所有数据的检索都是昂贵的(从mongodb花费几分钟-即使已建立索引)。少量数据行的检索非常快(因为对mongodb集合进行了索引)

我决定实施分页=> (1)设置一个具有10行的简短bokeh数据表 (2)当用户选择了最后一行时,更新表以查看下一页(读取后10行)并将选择移到表的第一行。

第一步工作正常。但是,我发现移动选择的实现只是部分成功。高亮显示已更改,但选择未更改,因此用户无法在按下向下箭头或PgDown键的情况下执行移至下一页的操作。谁能帮助我解决选择问题,或建议另一个方法,解决如何通过在bokeh中显示昂贵的全数据检索长表来解决问题?

这是我的测试代码:

from bokeh.plotting import figure, curdoc
from bokeh.models.sources import ColumnDataSource
from bokeh.layouts import row
from bokeh.models.widgets import DataTable, TableColumn
import random

table_rows_count = 10

def get_next_page():
    data = list(range(get_next_page.zero_row_position, get_next_page.zero_row_position + table_rows_count))
    ret = dict(index=data, x=data, y=data,z = random.sample(range(100), table_rows_count))
    get_next_page.zero_row_position += table_rows_count
    return ret
get_next_page.zero_row_position = 0


def data_table_selected(attr, old, new):
    selected_row = new[0]
    print(f'selected row: {selected_row} : {source1.selected.indices}')
    if selected_row == table_rows_count-1:
        source1.data = get_next_page()
        source1.selected.indices = [0]
        print(f'after update: selected row: {selected_row} : {source1.selected.indices}')

data = get_next_page()
source1 = ColumnDataSource(data)

fig1 = figure(plot_width=300, plot_height=300)
fig1.circle(x='x', y='y', size=table_rows_count, source=source1)

columns = [
        TableColumn(field="y", title="XY"),
        TableColumn(field="z", title="Text"),
    ]
data_table = DataTable(source=source1, columns=columns, width=400, height=280)
data_table.source.selected.on_change('indices', data_table_selected)

curdoc().add_root(row(fig1, data_table))

0 个答案:

没有答案