2017-11-24 6 views
0

Ich versuche, eine Tabelle basierend auf mehreren Filtern anzuzeigen.Bokeh DataTable Mehrere Eingänge/Widgets/Filter

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) 

Hier das Update ist nur dann wirksam, wenn der Schieber von nb_words geändert wird.
Allerdings möchte ich dem Benutzer mehrere Auswahlen gleichzeitig erlauben.
Zum Beispiel aktualisiert Die Tabelle wird angemessen, wenn der Benutzer mit

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

Wie die Tabelle mit mehrer Widgets aktualisieren?

Antwort

0

Basierend auf https://demo.bokehplots.com/apps/movies, musste ich eine andere Funktion erstellen, select_text(). Hier ist das endgültige Skript:

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()