Сервер Bokeh медленно отображает множество значений NaN (но достаточно быстро в ноутбуке) - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь создать приборную панель, используя боке, и в настоящее время застрял на большом линейном графике, подобном этому:

The plot

Несмотря на то, что в моем блокноте Юпитера это довольно быстро (возможно, около секунды), на моем сервере bokeh это занимает вечность (несколько минут). вкладка сети в моей консоли отладки показывает, что за это время не было получено никаких новых данных, так что я думаю, это не может быть мой код Python, блокирующий рендеринг?

У меня также есть группа флажков, и снова требуется больше минуты, прежде чем обратный вызов даже достигнет сервера bokeh.

Я строю 40000+ линейных сегментов, связанных и перемежающихся с нагрузками значений NaN в 7 линиях. (Как я считаю, рисовать большие линии лучше, чем рисовать много линий в боке?).

Я строю свой сюжет так:

f = figure(toolbar_location=None, title='Schade verloop over leeftijd', output_backend="webgl")
f.xaxis.axis_label = 'Leeftijd'
f.yaxis.axis_label = 'Schade'
for i, col, lbl in zip(range(7), colors, labels):
    r = f.line(x='x_line', y='y_line', line_width=2, source=sources[i], line_color=col, legend=lbl)
f.legend.location = "top_left"
f.legend.click_policy = "hide"

И небольшой подраздел моих данных:

xs = [np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
 np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
 np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
 np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
 np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
 np.array([np.nan, np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,
           np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,11.18082192, 12.02739726, 13.25205479, 14.22739726,np.nan,np.nan,np.nan,  6.55616438,  7.53150685,  8.52054795,
         9.47123288, 10.44109589,np.nan]),
np.array([np.nan,np.nan,np.nan,  0.70410959,  1.63835616,
         2.73972603,  3.64931507,np.nan,np.nan,np.nan,np.nan,  4.00821918,  5.04383562,  6.00821918,  7.05479452,
        np.nan,np.nan,np.nan,np.nan,  4.56164384,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,11.18082192,np.nan,np.nan,np.nan,np.nan,np.nan,  5.94794521,  6.55616438,  7.53150685,  8.52054795,
        np.nan,np.nan,np.nan])]

ys = [np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
 np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
 np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
 np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
 np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
        np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
 np.array([        np.nan,         np.nan,         np.nan,         np.nan,         np.nan,
                np.nan,         np.nan,         np.nan,         np.nan,         np.nan,
                np.nan,         np.nan,         np.nan,         np.nan,         np.nan,
                np.nan,         np.nan,         np.nan,         np.nan,         np.nan,
                np.nan,         np.nan,         np.nan,         np.nan,         np.nan,
                np.nan,         np.nan,         np.nan,         np.nan,         np.nan,
                np.nan,         np.nan,         np.nan,         np.nan,         np.nan,
        -0.15652901,  0.14953203,  0.62195036,  0.64414847,         np.nan,
                np.nan,         np.nan, -0.33739475, -0.27092199, -0.32020045,
        -0.35019554, -0.21857558,         np.nan]),
 np.array([        np.nan,         np.nan,         np.nan, -0.42062806, -0.50175937,
        -0.39375614, -0.45259168,         np.nan,         np.nan,         np.nan,
                np.nan, -0.38755729, -0.45590074, -0.38985249, -0.30375873,
                np.nan,         np.nan,         np.nan,         np.nan, -0.10799712,
                np.nan,         np.nan,         np.nan,         np.nan,         np.nan,
                np.nan,         np.nan,         np.nan,         np.nan,         np.nan,
                np.nan,         np.nan,         np.nan,         np.nan,         np.nan,
        -0.15652901,         np.nan,         np.nan,         np.nan,         np.nan,
                np.nan, -0.2219407 , -0.33739475, -0.27092199, -0.32020045,
                np.nan,         np.nan,         np.nan])]

который помещается в ColumnDataSource следующим образом:

single_sources = [ColumnDataSource({'x_line': xs[i], 'y_line': ys[i]}) for i in range(7)]

моя общая структура: main.py:

tab1 = Lineplot_Tab()
tabs = Tabs(tabs=[tab1])
curdoc().add_root(tabs)
curdoc().title = 'Dos dashboard'

Lineplot_Tab.py

def Lineplot_tab():
    # Some stuff with setting constants
    # And loading some general data (pretty large I guess)

    def make_full_dataset(checkboxselection):
        # Loads sizable data based on the selection in the checkboxes,
        # finally returns the ColumnDataSources

    def make_plot(sources):
        # The code for making the figure (as above)

    def update():
        plot_data_new, _, _ = make_full_dataset(checkbox_selection)
        for i in range(7):
            plot_data[i].data = plot_data_new[i].data

    active = [0]
    weg_selector = CheckboxGroup(labels=wegen, active=active)
    weg_selector.on_change('active', update)

    wegen_selectie = [wegen[i] for i in weg_selector.active]
    plot_data, colors, labels = make_full_dataset(wegen_selectie)

    p = make_plot(plot_data, colors, labels)

    controls = WidgetBox(weg_selector)
    layout = row(controls, p)

    tab = Panel(child=layout, title='Schadeverloop')
    return tab

Я использую сервер как:

bokeh serve --show --allow-websocket-origin=* --websocket-max-message-size=52428800000  dashboard

Надеюсь, кто-то увидит, что я делаю не так, я бы хотел использовать Bokeh для создания этой панели инструментов!

1 Ответ

0 голосов
/ 11 сентября 2018

Я понял это, так что для любого, кто обнаружит это позже:

Большое количество последовательных значений NaN на самом деле является проблемой (что-то о том, как отображается график, я предполагаю).Я создал свой набор данных, используя фильтр поверх фрейма данных Pandas, а затем превратил его в массив с массивом NaN, прикрепленным к спине, для создания отдельных линий.Чтобы уменьшить количество NaN, я просто отбросил строки в Pandas, которые не содержали полезных значений.

vals = vals.dropna(axis=0,how='all')

Хотя это не удаляет все последовательные значения NaN во всех строках, это значительно уменьшило количество и очень помоглово время рендеринга.(от нескольких минут до примерно секунды)

Я понимаю, что это довольно специфичное для меня решение, но в любом случае, NaN в построении графиков ДОЛЖНЫ считаться точками данных!

Тем не менее, интересно, что это не такпроблема в блокноте jupyter.

...