Python Bokeh DataTable - подкачка большого исходного набора данных - PullRequest
0 голосов
/ 07 января 2019

Мне сложно преодолеть следующее: Мне нужно визуализировать большой набор данных (> 1M строк, 3-5 столбцов) в боке DataTable. Извлечение всех данных стоит дорого (от mongodb занимает несколько минут - даже если они проиндексированы). Извлечение нескольких строк данных происходит очень быстро (так как коллекция mongodb проиндексирована)

Я решил реализовать пейджинг => (1) Настройте короткое боке с данными из 10 рядов (2) Когда пользователь выбирает последнюю строку, обновите таблицу для просмотра следующей страницы (прочитайте следующие 10 строк) и переместите выделение в первую строку таблицы.

Первый шаг работает отлично. Тем не менее, я обнаружил, что реализация движущегося выделения лишь частично успешна. Подсветка изменена, но выбор не сделан, поэтому пользователь не может перейти к следующей странице с нажатой стрелкой вниз или клавишей PgDown. Может ли кто-нибудь помочь мне или решить проблему выбора, или посоветовать другому методу, как преодолеть проблему с представлением длинной таблицы с дорогостоящим поиском всех данных в боке?

Вот мой тестовый код:

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))
...