Я хочу создать 2 выпадающих меню и 1 панель слайдов в ноутбуке jupyter

#python #drop-down-menu #jupyter-notebook #sidebar #ipywidgets

#python #выпадающее меню #jupyter-notebook #боковая панель #ipywidgets

Вопрос:

У меня есть фрейм данных, который содержит категорию товара, item_id, продажи за все дни и общие продажи каждого продукта (сумма (ось = 1)).

Следующие 4 фрейма данных содержат 2 столбца item_id и sales в зависимости от категории, и их имена household_sort, hobbies_sort, foods_sort и sales_total, которые включают общие продажи каждого продукта.

Я хочу создать 3 зависимых виджета (2 выпадающих меню и 1 панель слайдов) в jupyter notebook.Сначала мне нужно выпадающее меню о некоторых категориях продуктов (например, продажи продуктов питания), которые определены в словаре cat в приведенном ниже коде.После ползунка, где пользователь укажет пределы общего объема продаж из категории первого выпадающего меню.Наконец, выпадающее меню с идентификатором элемента в соответствии с предыдущим, я попробовал этот код, но я не могу изменить значения второго выпадающего меню.

 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]) amp; (hobbies_sort['total']<=range_slider.value[1])]['item_id'],
     'HOUSEHOLD_SALES':household_sort[(household_sort['total']>= range_slider.value[0]) amp; (household_sort['total']<=range_slider.value[1])]['item_id'],
     'FOODS_SALES':foods_sort[(foods_sort['total']>= range_slider.value[0]) amp; (foods_sort['total']<=range_slider.value[1])]['item_id'],
     'TOTAL_SALES':sales_total[(sales_total['total']>=range_slider.value[0]) amp; (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)
  

Комментарии:

1. Проблема в том, что второе выпадающее меню не получает идентификатор элемента, соответствующий критериям. как я могу решить эту проблему?

Ответ №1:

Проблема

Оба выпадающих списка по существу не связаны. Поскольку вы заполняете значения на стороне сервера, вы можете связать как виджеты, используя observe , так и выбранный обработчик событий.

Решение

Добавьте обработчик событий (ссылку) следующим образом, который обновляет параметры, доступные во втором раскрывающемся списке, на основе выбранной категории в первом. Вы можете добавлять столько событий, сколько пожелаете, и выполнять любые вычисления в обработчике. Это было протестировано на Python 3 в Jupyter Notebook v5.7.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]) amp; (hobbies_sort['total']<=range_slider.value[1])]['item_id'],
     'HOUSEHOLD_SALES':lambda : household_sort[(household_sort['total']>= range_slider.value[0]) amp; (household_sort['total']<=range_slider.value[1])]['item_id'],
     'FOODS_SALES':lambda : foods_sort[(foods_sort['total']>= range_slider.value[0]) amp; (foods_sort['total']<=range_slider.value[1])]['item_id'],
     'TOTAL_SALES':lambda : sales_total[(sales_total['total']>=range_slider.value[0]) amp; (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 Events.html

Комментарии:

1. я хочу взять значения range_slider и на основе этого установить ограничения для продаж, а оттуда показать идентификатор элемента во втором выпадающем меню, который принимает значения из словаря

2. @Spyros Я обновил решение, чтобы упростить пересчет значений категорий на основе ползунка и первого выпадающего списка. Каждое значение категории теперь является лямбда-функцией, которая вызывается для извлечения значений на основе первого выпадающего списка и ползунка диапазона

3. все правильно, большое спасибо, но почему, когда я запускаю его в Edit, он работает нормально, а когда я сохраняю и фиксирую, и я вижу блокнот, 2-й выпадающий список не меняется. Знаете ли вы причину? kaggle.com/spyrospetsis/prospatheia-gia-to-wow это ссылка, и ваш код находится в конце блокнота

4. Сохраненный и зафиксированный блокнот представляет собой статический файл, фактически json, в котором хранятся статический код и результаты предыдущего запуска из каждой ячейки. Для обработки событий и выполнения внутреннего кода python, который вы использовали для определения набора возможных опций для второго выпадающего списка, вашему коду на python требуется работающая среда python.