web-dev-qa-db-ja.com

Bokeh(0.11)サーバーアプリでプロットを更新/更新するための高速で適切な方法は何ですか?

データフレームの(x、y)座標を使用して散布図を生成するボケ(v0.11)サーバーアプリがあります。ユーザーがプロット上のポイントを選択するか、テキストボックスにコンマ区切りのポイントの名前を入力すると(つまり、「p55、p1234」)、それらのポイントが散布図で赤に変わるような相互作用を追加したいと思います。

これを達成する1つの方法を見つけました(下記の戦略#3)が、大きなデータフレームの場合は非常に遅くなります。もっと良い方法があると思います。誰かが私を助けてくれますか?明らかな関数呼び出しがないのですか?

  • 戦略1(<1ms for 100 points)は、存在するプロットのColumnDataSourceデータにドリルし、選択されたポイントを変更しようとします。
  • 戦略2(100ポイントあたり〜70ms)は、新しく作成されたColumnDataSourceでプロットの既存のColumnDataSourceを上書きします。
  • 戦略3(100ポイントあたり〜400ms)は戦略2であり、図を再作成します。

コードはPastebinに置かれます: http://Pastebin.com/JvQ1UpzY 最も関連する部分は以下にコピーされます。

def refresh_graph(self, selected_points=None, old_idxs=None, new_idxs=None):
    # Strategy 1: Cherry pick current plot's source.
    # Compute time for 100 points: < 1ms.
    if self.strategy == 1:
        t1 = datetime.now()
        for idx in old_idxs:
            self.graph_plot.data_source.data['color'][idx] = 'steelblue'
        for idx in new_idxs:
            self.graph_plot.data_source.data['color'][idx] = 'red'
        print('Strategy #1 completed in {}'.format(datetime.now() - t1))
    else:
        t3 = datetime.now()
        self.coords['color'] = 'steelblue'
        self.coords.loc[selected_points, 'color'] = 'red'
        new_source = bkmodels.ColumnDataSource(self.coords)
        self.graph_plot = self.graph_fig.scatter('x', 'y', source=new_source, color='color', alpha=0.6)
        print('Strategy #3 completed in {}'.format(datetime.now() - t3))
    return

理想的には、Strategy#1を使用できるようにしたいのですが、クライアントブラウザー内でポイントを更新できません。

助けてくれてありがとう!

参考:RHEL 6.Xを使用しています

18
user2700854

あなたがストリーミングデータである場合、関連する答えがここにあります: ボケでの時系列ストリーミング

すべてを一度に更新する必要がある場合は、それを行うことができます。私の提案は、戦略1です。ここに:

https://github.com/bokeh/bokeh/blob/master/examples/app/sliders.py

特筆すべき点は、source.dataのすべてを一度に更新する必要があることです。前提の1つは、列データソースのすべての列が常に同じ長さであるということです。個々の列を更新すると、この仮定を破るリスクが生じ、問題が発生する可能性があります。したがって、次のようなものを使用して、すべてを一度に更新したいとします。

# Generate the new curve
x = np.linspace(0, 4*np.pi, N)
y = a*np.sin(k*x + w) + b

source.data = dict(x=x, y=y)
9
bigreddot