2017-11-24 21 views
0

複数のフィルタに基づいてテーブルを表示しようとしています。Bokeh DataTable複数の入力/ウィジェット/フィルタ

def update(): 
    current = df[(df['nb_words'] >= slider.value[0]) & (df['nb_words'] <= slider.value[1])].dropna() 
    source.data = { 
     'id'     : current.id, 
     'author'    : current.author, 
     'nb_words'    : current.nb_words, 
     'text'     : current.text, 
     'topic'    : current.topic, 
     'national'    : current.national 
} 

nb_words = RangeSlider(title="Min nb employees", start=0, end=1000, value=(0, 1000), step=10, format="0,0") 
topic = CheckboxButtonGroup(labels=list(df.topic.unique())) 
national = RadioButtonGroup(labels=['Yes', 'No'], active=0) 
text = TextInput() 

nb_words.on_change('value', lambda attr, old, new: update()) 

data_table = DataTable(source=source, columns=columns, width=1000, fit_columns=False) 
controls = widgetbox(nb_words, button) 
table = widgetbox(data_table) 

このアップデートは、nb_wordsのスライダが変更された場合にのみ有効です。
しかし、私は一度に複数の選択をユーザーに許可したいと思います。ユーザーが複数のウィジェットを使用してテーブルを更新する方法

- 20 <= nb_words <= 200 
- topic = ["topic1", "topic2"] 
- national = 1 
- and text that contains the word "fantastic" 

で行を選択した場合
たとえば、テーブルが適切に更新されますか?

答えて

0

https://demo.bokehplots.com/apps/moviesに基づいて、select_text()という別の関数を作成する必要がありました。最終的なスクリプトは次のとおりです。

nb_words = RangeSlider(title="Min nb words", start=0, end=1000, value=(0,1000), step=10, format="0,0") 
text = TextInput(title="Enter a Keyword") 

source = ColumnDataSource(data=dict()) 


def select_text(): 
    text_value = text.value.strip() 
    selected = df[ 
     (df.nb_words >= slider.value[0]) & 
     (df.nb_words <= slider.value[1]) 
    ] 
    if (text_value != ""): 
     selected = selected[selected.text.str.lower().str.contains(text_value)==True] 
    return selected 



def update(): 
    current = select_text() 
    source.data = dict(
       id = current.id, 
       author = current.author, 
       nb_words = current.nb_words, 
       text = current.text, 
       topic = current.topic, 
       national = current.national, 
    ) 

controls = [nb_words, text] 
for control in controls: 
    control.on_change('value', lambda attr, old, new: update()) 


columns = [TableColumn(field="id", title="ID"), 
      ... 
      TableColumn(field="national", title="National"), 
      ] 

data_table = DataTable(source=source, columns=columns, width=1000, fit_columns=False) 


sizing_mode = 'fixed' 
inputs = widgetbox(*controls, sizing_mode = sizing_mode) 
table = widgetbox(data_table) 

curdoc().add_root(row(inputs, table)) 
curdoc().title = "Topic Selection" 

update() 
関連する問題