2017-10-12 17 views
0

パンダのデータフレームに接続されている私のプロットにBokeh経由でスライダを追加しようとしています。Bokeh Slider with Pandas datetime index

このプロットでは、datetimeインデックスを使用して、1年間の大気質インデックスの表示方法を示しています。

2016年1月から12月まで、毎月のスライダを追加したいと思います。 パンダのデータフレームに接続されているプロットにスライダを接続するコードで明確な例は見つかりません。誰か助けてください!

私は次のコードを見つけることができましたが、プロットはランダムなデータで生成されました。このコードの出力は、まさに私がやろうとしていることですが、時系列データを使っています。

from bokeh.io import output_notebook, show, vform 
from bokeh.plotting import figure, Figure 
from bokeh.models import ColumnDataSource, Slider, CustomJS 
import numpy as np 

output_notebook() 

x = np.sort(np.random.uniform(0, 100, 2000)) 

y = np.sin(x*10) + np.random.normal(scale=0.1, size=2000) 
fig = Figure(plot_height=400, x_range=(0, 2)) 

source = ColumnDataSource(data={"x":x, "y":y}) 

line = fig.line(x="x", y="y", source=source) 
callback = CustomJS(args=dict(x_range=fig.x_range), code=""" 
var start = cb_obj.get("value"); 
x_range.set("start", start); 
x_range.set("end", start+2); 
""") 

slider = Slider(start=0, end=100, step=2, callback=callback) 
show(vform(slider, fig)) 

私も(以下/ linked here)スライダーのこのタイプを作るのソースコードを見つけましたが、私はそれを実装する方法がわからないと思います。あなたが言うことができるように、私はBokehをかなり新しくしています。助けてください!

class DateRangeSlider(AbstractSlider): 
""" Slider-based date range selection widget. """ 

@property 
def value_as_datetime(self): 
    ''' Convenience property to retrieve the value tuple as a tuple of 
    datetime objects. 

    ''' 
    if self.value is None: 
     return None 
    v1, v2 = self.value 
    if isinstance(v1, numbers.Number): 
     d1 = datetime.utcfromtimestamp(v1/1000) 
    else: 
     d1 = v1 
    if isinstance(v2, numbers.Number): 
     d2 = datetime.utcfromtimestamp(v2/1000) 
    else: 
     d2 = v2 
    return d1, d2 

value = Tuple(Date, Date, help=""" 
Initial or selected range. 
""") 

start = Date(help=""" 
The minimum allowable value. 
""") 

end = Date(help=""" 
The maximum allowable value. 
""") 

step = Int(default=1, help=""" 
The step between consecutive values. 
""") 

format = Override(default="%d %b %G") 

答えて

0

私はちょうど私のプロジェクトで似たような状況を通して働きました。私は日付が混在しているので、パンダのdatetime機能は使用しませんでしたが、データを消去すると簡単に更新できました。重要な部分は、コールバック関数でColumnDataSourceの.data属性を調整することです。

この例では、コールバック関数はJavascriptで記述されています。私は参考文献の例のコードを使用しましたが、私はパンダのデータフレームの小さな回避策を実行しなければなりませんでした。以下の例では、データはパンダのデータフレームのリストです。

これは、グラフの現在のデータを別のパンダデータフレームのデータで置き換えます。私のように、すべてのデータが1つのデータフレームに含まれている場合、表示するデータを返すためにパンダフィルタリングを行うこともできます。私がやったことをするとき

data_to_use = data[data['Month'] == month[slider.value]] 

繰り返しますが、私はColumnDataSourceにdata_to_useを変換してから、私のグラフのソースの.dataの属性を交換しなければなりませんでした。

0

BokehギャラリーのGapminderの例では年を使用していますが、同様のアプローチがデータセットの月間に有効です。何ヶ月か心配しているだけなので、datetimeインデックスで作業する必要はありません。リストとして取得するだけです。

gapminder