我有一个数据框架,其中包含商品的类别item_id、全天的销售额和每个产品的总销售额(axis=1)。
接下来的4个数据帧根据类别有2列item_id和sales,它们的名称是household_sort、hobbies_sort、foods_sort和sales_total,其中包括每个产品的总销售额。
我想创建3个相关的小工具(2个下拉菜单和1个滑动条)在jupyter notebook.First我想要一个关于某些类别的产品(例如食品销售)的下拉菜单,这是在字典猫中定义的代码below.After的幻灯条,其中用户将指定从第一个下拉menu.Finally下拉菜单类别的总销售额的限制,根据前面的项目id我尝试此代码,但我不能改变第二个下拉菜单的值。
from ipywidgets import interact, Dropdown
import ipywidgets as wg
range_slider=wg.IntRangeSlider(value=[1000,10000],min=sales_total['total'].min() - 5,max=sales_total['total'].max() + 5,description='Test:',readout_format='d')
cat={'HOBBIES_SALES':hobbies_sort[(hobbies_sort['total']>= range_slider.value[0]) & (hobbies_sort['total']<=range_slider.value[1])]['item_id'],
'HOUSEHOLD_SALES':household_sort[(household_sort['total']>= range_slider.value[0]) & (household_sort['total']<=range_slider.value[1])]['item_id'],
'FOODS_SALES':foods_sort[(foods_sort['total']>= range_slider.value[0]) & (foods_sort['total']<=range_slider.value[1])]['item_id'],
'TOTAL_SALES':sales_total[(sales_total['total']>=range_slider.value[0]) & (sales_total['total']<=range_slider.value[1])]['item_id']}
catW=Dropdown(options=cat.keys())
idW=Dropdown(options=cat[catW.value])
display(catW,range_slider,idW)
发布于 2020-09-25 20:16:53
问题
这两个下拉列表并没有本质上的联系。由于是在服务器端填充值,因此可以使用observe
和所选的事件处理程序将这两个小部件链接起来。
解决方案
添加一个事件处理程序(reference),如下所示,它根据第一个下拉列表中选择的类别更新第二个下拉列表中的可用选项。您可以根据需要添加任意数量的事件,并在处理程序中执行任何计算。这在Jupyter Notebook v5.7.3的Python 3中进行了测试
from ipywidgets import interact, Dropdown
import ipywidgets as wg
range_slider=wg.IntRangeSlider(value=[1000,10000],min=sales_total['total'].min() - 5,max=sales_total['total'].max() + 5,description='Test:',readout_format='d')
cat={'HOBBIES_SALES':lambda : hobbies_sort[(hobbies_sort['total']>= range_slider.value[0]) & (hobbies_sort['total']<=range_slider.value[1])]['item_id'],
'HOUSEHOLD_SALES':lambda : household_sort[(household_sort['total']>= range_slider.value[0]) & (household_sort['total']<=range_slider.value[1])]['item_id'],
'FOODS_SALES':lambda : foods_sort[(foods_sort['total']>= range_slider.value[0]) & (foods_sort['total']<=range_slider.value[1])]['item_id'],
'TOTAL_SALES':lambda : sales_total[(sales_total['total']>=range_slider.value[0]) & (sales_total['total']<=range_slider.value[1])]['item_id']}
catW=Dropdown(options=cat.keys())
idW=Dropdown(options=cat[catW.value]())
# Creating event handler
def ddl_event_handler(event):
idW.options=cat[event['new']]() #updating the options to the selected value
# Add an observer
catW.observe(ddl_event_handler,names="value")
#optionally specify a `display_id` to update the same area
display(catW,range_slider,idW,display_id="options_area")
参考资料和参考资料
链接小部件- https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Events.html
https://stackoverflow.com/questions/64000632
复制相似问题