Вопрос или проблема
Для интерактивного анализа данных с использованием Jupyter и ipywidgets я создаю несколько виджетов в зависимости от данных.
Именно, в конечном итоге у меня есть несколько GridBoxes с флажками, ползунками диапазона и выбором цвета, которые я размещаю в Tab-Widget.
Теперь я попробовал использовать
categories = ["A", "B", "C"] # извлечь из набора данных
cbox = widgets.GridBox(children=[ widgets.Checkbox(value=True, description=v) for v in categories ])
rbox = widgets.GridBox(children=[ widgets.IntRangeSlider(value=[1,10], max=20, min=0, description=v) for v in categories ])
def analysis(variables, ranges):
print("Здравствуйте. В настоящее время я ничего не делаю с введенными данными!")
display(widgets.Tab(children=[cbox, rbox], titles=('Переменные', 'Диапазоны')))
display(widgets.interactive_output(analysis, {"variables":cbox, "ranges":rbox}))
Что не работает:
AttributeError: 'GridBox' has no attribute 'value'
Я также попробовал:
display(widgets.interactive_output(analysis, {"variables":cbox.children, "ranges":rbox.children}))
что тоже не работает.
Можно ли передать какой-либо тип контейнера в мою интерактивную функцию, или мне нужно прибегать к kwargs? А если да, то как вы бы сделали это эффективно?
Я использую версию ipywidgets 8.1.5
Ответ или решение
Для выполнения интерактивного анализа данных с использованием Jupyter и ipywidgets, особенно когда у вас есть динамически созданные контейнеры с виджетами, действительно необходимо учитывать правильный способ передачи значений из контейнеров в вашу функцию анализа.
Ваша ошибка возникает потому, что GridBox
не имеет атрибута value
, так как это просто контейнер для других виджетов. Вместо этого вам нужно извлекать значения непосредственно из каждого виджета внутри контейнера. Используйте widgets.interactive
в сочетании с lambda
фукцией или передавайте значения из каждого виджета с помощью kwargs
.
Вот пример, как вы можете это реализовать:
import ipywidgets as widgets
from IPython.display import display
# Пример категорий — их можно получить из набора данных
categories = ["A", "B", "C"]
# Создадим GridBox с Checkboxes
cbox = widgets.GridBox(children=[widgets.Checkbox(value=True, description=v) for v in categories])
# Создадим GridBox с RangeSliders
rbox = widgets.GridBox(children=[widgets.IntRangeSlider(value=[1, 10], max=20, min=0, description=v) for v in categories])
# Функция анализа, принимающая значения из виджетов
def analysis(*args):
variables = [checkbox.value for checkbox in cbox.children]
ranges = [slider.value for slider in rbox.children]
print("Переменные:", variables)
print("Диапазоны:", ranges)
# Используем interactive_output для связывания значений виджетов с функцией анализа
def extract_values(*args):
return [checkbox.value for checkbox in cbox.children] + [slider.value for slider in rbox.children]
# Отобразим вкладки с виджетами
tab = widgets.Tab(children=[cbox, rbox])
tab.set_title(0, 'Переменные')
tab.set_title(1, 'Диапазоны')
display(tab)
# Связываем интерактивность
output = widgets.interactive_output(analysis, {"variables": cbox.children, "ranges": rbox.children})
display(output)
# Вызываем функцию для инициализации и отображения
extract_values()
# Устанавливаем привязку к функциям для динамического обновления
for child in cbox.children + rbox.children:
child.observe(lambda change: extract_values(), 'value')
В этом примере вы создаете два GridBox
для чекбоксов и ползунков, а затем определяете функцию analysis
, которая извлекает значения из каждого виджета и выводит их. Для того чтобы привести это в интерактивный формат, используется функция interactive_output
.
Вы также можете добавлять наблюдателей (observe
) к каждому виджету, чтобы функция extract_values
вызывалась каждый раз, когда изменяются значения виджетов, что позволяет обновить состояние интерфейса. Это обеспечивает динамическое обновление при взаимодействии с пользовательским интерфейсом.
Таким образом, используя этих подход, вы сможете эффективно вызывать вашу функцию анализа с текущими значениями, извлекая их из контейнеров виджетов.