我想在 jupyter 笔记本上制作 2 个下拉菜单和 1 个滑动条
I want to make 2 drop menu & 1 slide bar at jupyter notebook
我有一个包含商品类别的数据框,item_id,所有天的销售额和每个产品的总销售额(总和(轴=1))。
接下来的 4 个数据框有 2 列 item_id 和销售额,具体取决于类别,它们的名称是 household_sort、hobbies_sort、foods_sort 和 sales_total其中包括每种产品的总销售额。
我想在 jupyter 上创建 3 个相关的小部件(2 个下拉菜单和 1 个滑动条)notebook.First我想要一个关于字典中定义的某些产品类别(例如食品销售)的下拉菜单代码中的 cat 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)
问题
两个下拉菜单本质上都不是 linked。由于您是在服务器端填充值,因此您可以 link 使用 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
我有一个包含商品类别的数据框,item_id,所有天的销售额和每个产品的总销售额(总和(轴=1))。
接下来的 4 个数据框有 2 列 item_id 和销售额,具体取决于类别,它们的名称是 household_sort、hobbies_sort、foods_sort 和 sales_total其中包括每种产品的总销售额。
我想在 jupyter 上创建 3 个相关的小部件(2 个下拉菜单和 1 个滑动条)notebook.First我想要一个关于字典中定义的某些产品类别(例如食品销售)的下拉菜单代码中的 cat 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)
问题
两个下拉菜单本质上都不是 linked。由于您是在服务器端填充值,因此您可以 link 使用 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