散景服务器渲染许多NaN值的速度很慢(但在笔记本电脑中足够快)

时间:2018-09-11 10:17:52

标签: python visualization bokeh

我正在尝试使用bokeh构建仪表板,并且目前卡在这样的大线条图中:

The plot

即使这在我的木星笔记本中绘制得相当快(大约一秒钟),但在我的bokeh服务器中却要花很长时间(几分钟)。调试控制台中的“网络”选项卡显示在此期间未接收到新数据,因此我想那可能不是我的python代码阻止了渲染吗?

我还有一个复选框组,而且回调甚至需要超过一分钟的时间才能到达bokeh服务器。

我正在绘制40,000+条线段,这些线段在7条线中连接并散布着NaN值的负载。 (因为我相信在散景中绘制大线条比绘制多条线条更好?)。

我的情节是这样的:

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 :(得分:1)

我知道了,所以对于以后找到它的任何人:

大量连续的NaN值实际上是一个问题(我猜想是如何绘制图的)。我使用了一个熊猫数据框上的过滤器创建了我的数据集,然后将其转换为一个numpy数组,并在后面加上了NaN以创建单独的行。 为了减少NaN的数量,我只是将Pandas中不包含有用值的行删除了。

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

虽然这不会删除所有行上所有连续的NaN值,但它显着减少了数量,并极大地缩短了渲染时间。 (从几分钟到一秒左右)

我意识到这对我来说是一个非常具体的解决方案,但是无论哪种方式,NaN都在将相应的DO绘制为数据点!

有趣的是,这不是jupyter笔记本中的问题。