首页 > 解决方案 > Pandas 数据框和散景图未使用滑块小部件更新

问题描述

我正在尝试使用散景可视化从熊猫数据框中绘制摘要统计信息。我的目标是使用滑块过滤要绘制的数据并相应地更新绘图。但是,当我启动我的散景应用程序时,两者都没有发生。

这是我正在使用的一些模拟数据:-

Device,Column1,Column2,Column3,Column4,Hour,Day
aaa,98,59,56,57,22,Day one
aaa,29,10,22,14,15,Day one
aaa,21,4,72,25,13,Day one
aaa,87,87,13,83,1,Day one
aaa,41,46,81,25,9,Day one
aaa,85,42,16,12,15,Day one
aaa,73,5,32,19,12,Day one
aaa,84,16,30,34,5,Day one
aaa,28,11,46,63,15,Day one
aaa,50,86,83,48,17,Day one
aaa,74,37,79,48,19,Day one
aaa,40,88,67,79,17,Day one
bbb,1,19,34,6,2,Day one
bbb,5,26,75,25,13,Day one
bbb,27,1,10,84,19,Day one
bbb,62,87,4,51,2,Day one
bbb,71,24,66,6,9,Day one
bbb,49,75,18,67,7,Day one
bbb,51,15,74,35,12,Day one
bbb,38,94,65,32,8,Day one
bbb,23,1,21,26,2,Day one
bbb,83,67,76,7,1,Day one
bbb,87,25,5,86,12,Day one
bbb,58,28,33,71,22,Day one
bbb,18,8,16,13,14,Day one
bbb,89,20,71,39,19,Day one
bbb,60,22,69,79,10,Day one
bbb,93,9,9,9,12,Day one
bbb,76,34,60,21,21,Day one
bbb,39,37,52,23,15,Day one
bbb,45,87,61,96,20,Day one
ccc,92,96,29,97,8,Day one
ccc,62,72,83,45,15,Day one
ccc,42,58,28,94,12,Day one
ccc,45,76,78,24,18,Day one
ccc,58,11,33,55,8,Day one
ccc,4,14,86,9,2,Day one
ccc,21,22,2,78,22,Day one
ccc,11,3,33,41,6,Day one
ccc,57,96,72,48,10,Day one
ddd,28,59,23,66,13,Day one
ddd,62,93,71,42,11,Day one
ddd,6,96,67,50,19,Day one
ddd,4,61,28,29,7,Day one
ddd,71,80,78,2,13,Day one
ddd,59,88,19,56,5,Day one
eee,78,44,27,46,13,Day one
eee,70,54,62,31,14,Day one
eee,4,54,6,12,11,Day one
eee,49,82,37,10,1,Day one
eee,44,81,1,69,17,Day two
eee,59,60,19,9,11,Day two
eee,60,37,40,82,12,Day two
eee,8,17,26,52,18,Day two
eee,10,98,48,24,11,Day two
eee,79,85,73,54,19,Day two
eee,25,82,66,73,6,Day two
eee,8,50,21,28,18,Day two
eee,95,26,14,8,20,Day two
eee,57,22,77,68,5,Day two
eee,77,11,87,35,20,Day two
eee,13,13,16,19,17,Day two
fff,36,81,30,61,7,Day two
fff,24,66,75,94,9,Day two
fff,21,34,46,52,16,Day two
fff,44,92,2,40,0,Day two
fff,6,68,15,34,17,Day two
fff,41,68,16,57,12,Day two
fff,12,84,30,81,0,Day two
fff,42,8,38,43,2,Day two
fff,4,22,66,64,20,Day two
fff,95,37,96,36,21,Day two
fff,44,71,94,39,2,Day two
fff,7,69,28,4,0,Day two
fff,59,63,52,64,16,Day two
fff,29,3,24,83,14,Day two
fff,32,67,74,93,21,Day two
fff,6,73,15,49,14,Day two
fff,70,83,86,90,5,Day two
fff,16,73,82,72,2,Day two
fff,97,72,5,53,10,Day two
fff,36,83,12,58,12,Day two
fff,67,58,2,91,12,Day two
fff,19,81,28,64,11,Day two
fff,2,53,74,11,8,Day two
fff,68,27,78,8,19,Day two
fff,34,77,9,15,12,Day two
fff,50,51,23,88,22,Day two
fff,79,38,14,26,10,Day two
fff,4,41,50,85,9,Day two
fff,41,29,66,49,18,Day two
fff,34,3,51,17,5,Day two
fff,87,79,48,97,4,Day two
fff,66,41,51,16,12,Day two
fff,29,84,22,38,5,Day two
fff,51,50,87,29,2,Day two
fff,63,33,2,61,12,Day two
fff,38,6,20,86,1,Day two
fff,31,87,38,93,20,Day two
ggg,80,93,77,96,3,Day two

编辑

我已经修改了我的代码以添加其他功能,例如交换列,但我的问题仍然存在。我无法更新源数据以按小时过滤,然后相应地更新绘图。

from bokeh.util.sampledata import DataFrame
import numpy as np
import pandas as pd
from bokeh.io import curdoc, show

from bokeh.plotting import figure
from bokeh.layouts import row, column, widgetbox
from bokeh.palettes import Category20 as palette
from bokeh.models import Select,CustomJS, CheckboxButtonGroup, ColumnDataSource,IndexFilter,Slider,CDSView,WidgetBox ### Widgets
df = pd.read_csv("exampledata.csv")

#getting grouped means
grouped_devices=df.groupby(['Device','Day','Hour'])['Column1','Column2','Column3','Column4'].mean()
grouped_devices_counts=df.groupby(['Device','Day','Hour']).size()#get counts of devices

grouped_devices_counts=grouped_devices_counts.reset_index()
grouped_devices_counts = grouped_devices_counts.rename(columns= {0: 'Count'})#works
#merge
group_device_summary=pd.merge(grouped_devices,grouped_devices_counts, on=['Day','Hour','Device'])#works

hournum=11
group_device_summary_dayone=group_device_summary[(group_device_summary['Day']=="Day one")] 
data=group_device_summary_dayone.to_dict()
source=ColumnDataSource(group_device_summary_dayone)


p=figure(toolbar_location="above")
# Add a circle glyph to the figure p
scatter=p.circle('Column1', 'Column2', source=source,color='red',legend_label='Day one')

handlerx = CustomJS(args=dict(scatter=scatter), code="""
   scatter.glyph.x = {field: cb_obj.value};
""")
handlery = CustomJS(args=dict(scatter=scatter), code="""
   scatter.glyph.y = {field: cb_obj.value};
""")
#slider=Slider(start=0,end=23, step=1,value=hournum)
sliderhour=Slider(start=0,end=23,step=1,value=hournum)
sliderhandler = CustomJS(
    #### THIS IS THE PART I NEED HELP WITH ######
     

    args=dict(source=source),code="""
    data = source.data;
    hournum=cb_obj.value;
    newdata = group_device_summary_dayone[(group_device_summary_dayone['Hour']==hournum)];
    source.data = newdata;


    """
    )

selectx = Select(title="df-column:", options=list(group_device_summary_dayone.columns))
selectx.js_on_change('value', handlerx)
selecty = Select(title="df-column:", options=list(group_device_summary_dayone.columns))
selecty.js_on_change('value', handlery)
sliderhour.js_on_change('value',sliderhandler)
show(column(selectx,selecty,sliderhour,p))


谁能指出我需要修改哪些允许滑块功能更新我的数据框?

标签: pythonpandassliderbokehpandas-bokeh

解决方案


推荐阅读