2017-12-02 9 views
0

私はbokehを使用しており、そのJavaScriptとコールバックの側面を調べ始めています。Python、Bokeh、Javascript:コールバックでMongodbデータベースクエリを使用します。

私はdatepickerを含むコードを持っています: mongodbデータベースがトリガーされたときにコールバックでクエリを実行します。 私はjavascriptを知らないし、正しい方向に私を助けるためのいくつかのポインタが必要になります。

これは私がこれまでに得たコードです:

import pymongo 
import pandas as pd 
from bokeh.layouts import column 
from bokeh.models import CustomJS, DatePicker 
from bokeh.plotting import figure, show, ColumnDataSource 
from bokeh.io import curdoc 
from bokeh.models.formatters import DatetimeTickFormatter 
import datetime 

p = figure(x_axis_type="datetime",plot_width=900, height=200, title="GBP") 

mongo=pymongo.MongoClient() 
start=datetime.datetime.today().replace(hour=0,minute=0,second=0,microsecond=0) 
end=start+datetime.timedelta(hours=24) 
data=pd.DataFrame.from_records(
       mongo.prices["Russia Ruble"].find({"datetime": 
             {"$gte":start,"$lte":end}}))[["close","datetime"]] 

source = ColumnDataSource(data.to_dict(orient="list")) 

callback=CustomJS(args=dict(source=source),code=''' 
var data=source.data; 
var f=cb_obj.value 

start = f.replace(hour=0,minute=0,second=0,microsecond=0) # use a javacript equivalent of the python code here... 
end= start +datetime.timedelta(hours=24) # use a javacript equivalent of the python code here... 

data=pd.DataFrame.from_records(
      mongo.prices["Russia Ruble"].find({"datetime": 
      {"$gte":start,"$lte":end}}))[["close","datetime"]] # use a javacript equivalent of the python code here... 

source.change.emit() 

''') 

p.line(x = "datetime", y ="close", color="black", source=source) 

datepicker=DatePicker(max_date=start,value=start) 
datepicker.js_on_change("value",callback) 
curdoc().add_root(column(p,datepicker)) 

最初は、私はいくつかのJavaScriptと一緒にいくつかのPythonコードを実行することが可能であったかどうかを確認しようとした(または単にいくつかのpythonコードを...)にコールバックが、this part of the docはこれが不可能であることを明確に述べているようです。

私は自分の仕事で進歩するためにいくつかのjavascriptを学ぶ必要があるという事実を受け入れ、mongo dbとjavascriptを調べました。トピックに関する簡単なGoogleの研究は、このwould be close to what node.js is doingが示唆しているようですが、私はそれについてはあまりよく分かりません。 bokeh jsのコールバックはサーバーサイドのJavaScriptに匹敵しますか?その後、this page(フランス語では申し訳ありませんが、英語で同等のものは見つかりませんでした)は、node.jsでmongodbを使用するために、nodejsパッケージマネージャ(npm)を使用してmongodbドライバをインストールする必要があることを説明しています...私は明らかに既にオフトラックです...

要約: - 私はjavascriptコールバックで実行する必要がある簡単な操作を実行する良い方法です(つまり、選択した日付から開始時刻と終了時刻を作成するそのタイマーを使用してmongoddbデータベースからデータを照会する)

答えて

1

あなたのWebアプリケーションに関する情報と、そのサーバーの種類を投稿できますか?

残念ながら、(JavaScriptを習得しても)コールバックだけでは実現できません。

これを説明するには、ボケがボンネットの下でどのように機能するかを少し理解する必要があります。スタンドアロンhtmlやscript, div = components(plot)を使用してbokehプロットを埋め込んでいる場合、pythonはカスタマイズされた一連のjavascript関数を作成し、プロットのすべてのデータソースをページに埋め込まれた大きなスクリプトでシリアライズします。 "Figure"、 "vbar"、 "circle"などのbokehオブジェクトはモデルと呼ばれ、すべてのモデルはjavascriptで表され、生成時にそのデータが与えられます。

このスクリプトだけでは、生成された後にサーバーまたはデータベースと通信しません。むしろ、コールバックはモデルがすでに持っているプロパティを変更するだけです。たとえば、columnDataSourceモデルには特定の列があり、それらの列はすべてjavascriptに入れられているため、プロットで使用される列を変更するコールバックを持つことができます。

は、ドキュメントが言うように:

ボケのアーキテクチャは、高レベルのPythonで を作成している(など、グリフ、プロットのようなものを表す、範囲、軸) は「モデルがオブジェクト」というものです、その後、現在までに、あなたのモデルを維持するために、あなたのpythonを使用したい場合は クライアントライブラリによって消費されたJSON形式、BokehJS

に変換し、データベース、それはボケのためのユースケースでありますサーバ。Bokehサーバーは、モデルのすべてのpython表現をjavascriptのものと同期して保持する組み込み可能なサーバーです。

再び

documentationあたり:それはお互いに同期して、ブラウザでのpythonで「モデルオブジェクト」と を維持することが可能であった場合

しかし、その後、それ以上の追加や 強力な可能性をすぐに開きます:UIとPythonとブラウザとの間で同期するためにこの機能はPython のフルパワーを使用して計算またはクエリブラウザで生成ツールイベントに

応答が主な目的でありますボケサーバー。

Bokeh Serverのドキュメントを見て、それはあなたのユースケースを働くかもしれないかどうかを確認します。

理論的には、JS関数が別のルートからJSONデータを取得し、そのデータをbokehモデルにプッシュすることができますが、これはうまくいくとは思えません。 Bokehは、モデルとモデルデータポイントごとに多数のユニークな識別子を生成し、その中で検索して処理する必要があります。

bokehサーバには大きなpyconプレゼンテーションもあります。 2015年からもう少し古いものですが、これらの概念を理解するのに本当に役立ちます。 https://www.youtube.com/watch?v=O5OvOLK-xqQ

+0

あなたの返信のためのthx!はい、私はボケウィジェットで私の最初の刺し傷だったので、少し失われました。実際、私が最初に試したように '.js_on_change'の代わりに' .on_change'を使うだけで、やりたいことをするのはとても簡単です。参照ギャラリーのソースコードを参照して解決策を見つけました。 –

関連する問題