Bokeh CustomJSFilter на столбце в групповом фрейме данных - PullRequest
0 голосов
/ 08 ноября 2019

Я анализирую большое количество данных (из моделирования MonteCarlo). Мне нужно отобразить всю траекторию множества частиц. Я хочу использовать ползунок диапазона, чтобы выбрать временной диапазон в симуляции, потому что скоро у меня будет много частиц (около 370 КБ)

. Я могу легко отобразить их на фигуре Боке, используя:

    output_file(filename)

    groups = df.groupby('part_num')

    mxTime = np.ceil(df['time'].max().compute() * 10.0) / 10.0
    mnTime = np.floor(df['time'].min().compute() * 10.0) / 10.0

    names = list(df['part_num'].unique())
    x = [list(groups.get_group(sdf)['x']) for sdf in names]
    y = [list(groups.get_group(sdf)['y']) for sdf in names]
    z = [list(groups.get_group(sdf)['z']) for sdf in names]
    t = [list(groups.get_group(sdf)['time']) for sdf in names]

    source = ColumnDataSource(dict( x = x, 
            y = y, z = z, t = t,
            color = inferno(len(x))))
    plot_xy = bp.figure(match_aspect = True, output_backend = "webgl", 
       x_axis_label= 'X [m]', y_axis_label= 'Y [m]', plot_width = 300, 
       plot_height = 300)
    bp.save(plot_xy)

Проблема возникает, когда мне приходится писать код CustomJSFilter. Я попробовал упрощенный подход, который не работает:

    range_slider = RangeSlider(start = mnTime, end = mxTime, 
       value=(mnTime, mnTime + np.max([0.1 * (mxTime - mnTime), 0.1])), 
       step=.1, title="Time range")
    callback = CustomJS(args = dict(source = source), code="""
        source.change.emit();
    """)
    range_slider.js_on_change('value', callback)'''
    js_filter = CustomJSFilter(args = dict(slider = range_slider, source = source), code="""
    var indices = [];
    for (var i = 0; i <= source.data['t'].length; i++) {
        if ((source.data['t'][i] > slider.value[0]) & (source.data['t'][i] < slider.value[1])) { 
            indices.push(i)
        }
    }
    return indices;
    """)

    view = CDSView(source=  source, filters = [js_filter])

Я хотел бы перебрать различные группы в моем ColumnDataSource, чтобы выбрать только временной диапазон, заданный RangeSlider.

Редактировать: После комментария bigreddot, здесь есть более подробная информация о моей проблеме. Когда я использую этот кусок кода, на экране ничего не появляется. Я использовал его с кадром данных, у которого нет группы, и это сработало. Я согласен, что было бы лучше использовать и indexfilter, но в обоих случаях (моя первая попытка или indexfilter) я не знаю, как выбрать действительные индексы, если набор данных был «сгруппирован».

Спасибо за любую помощь, вы можете предоставить:)

...