Рубрики
Без рубрики

Как использовать iPywidgets, чтобы сделать ноутбук Jupyter Interactive

Вы когда-нибудь создавали ноутбуку Jupyter на основе Python, и анализировали данные, которые вы хотите исследовать в … Теги с Python.

Вы когда-нибудь создавали ноутбук Jupyter на основе Python, и проанализировали данные, которые вы хотите исследовать несколькими различными способами? Например, вы можете посмотреть на сюжет данных, но фильтруйте его десять разных способов. Каковы ваши варианты просмотра этих десяти разных результатов?

  1. Скопируйте и вставьте ячейку, изменяя фильтр для каждой ячейки, затем выполняя ячейку. Вы закончите десять разных ячеек с десятью различными значениями.
  2. Измените одну и ту же ячейку, выполните ее и просмотрите результаты, затем измените его снова, десять раз.
  3. Параметрирование ноутбука (возможно, используя инструмент, как Пасмилл ) и выполните весь ноутбук с десятью различными наборами параметров.
  4. Некоторая комбинация вышеперечисленного.

Все они не идеальны, если мы хотим быстрое взаимодействие и возможность исследовать данные. Эти параметры также склонны к ошибкам ввода ошибок или многих дополнительных редактирования. Они могут отлично подходить для оригинального разработчика ноутбука, но позволяя пользователю, который не предаст синтаксис Python для изменения переменных и повторных элементов ячеек, не может быть лучшим вариантом. Что, если вы могли бы просто дать пользователю простую форму, с помощью кнопки, и они могли изменить форму и увидеть результаты, которые они хотят?

Оказывается, вы можете сделать это довольно легко в Jupyter, не создавая полный WebApp. Это возможно с iPywidgets , также известный как виджеты. Я покажу вам основы в этой статье создания нескольких простых форм для просмотра и анализа некоторых данных.

Какие виджеты?

Виджеты Jupyter – это специальные биты кода, которые будут встроить JavaScript и HTML в свой ноутбук и представить визуальное представление в вашем заставке при выполнении в ноутбуке. Эти компоненты позволяют пользователю взаимодействовать с виджетами. Виджеты могут выполнять код в определенных действиях, что позволяет вам обновлять ячейки без пользователей, чтобы повторно выполнить их или даже изменить любой код.

Начиная

Во-первых, вам нужно убедиться, что iPywidgets установлен в вашей среде. Это будет зависеть от того, какая среда Jupyter вы используете. Для пожилых jupyter и jupyterlab устанавливает, обязательно проверьте детали в Документы Отказ Но для базовой установки просто используйте PIP

pip install ipywidgets

или для кондей

conda install -c conda-forge ipywidgets

Это должно быть все, что вам нужно сделать в большинстве ситуаций, чтобы заняться всеми.

Пример

Вместо того, чтобы пройти через все виджеты и сразу же получать в деталях, давайте схватим некоторые интересные данные и исследуйте его вручную. Затем мы будем использовать виджеты, чтобы сделать более интерактивную версию некоторых из этих исследований данных. Давайте схватим некоторые данные из Чикагский портал данных – В частности, их набор данных текущих активных бизнес-лицензий. Обратите внимание, что если вы просто запустите код, как показано ниже, вы получите только 1000 строк данных. Проверьте документацию о том, как схватить все данные.

Примечание. Все этот код был написан в ноутбуке Jupyter с помощью Python 3.8.6. Хотя эта статья показывает выход, лучший способ испытать виджеты – это взаимодействовать с ними в собственной среде. Вы можете скачать ноутбук этой статьи здесь Отказ

import pandas as pd
df = pd.read_csv('https://data.cityofchicago.org/resource/uupf-x98q.csv')
df[['LEGAL NAME', 'ZIP CODE', 'BUSINESS ACTIVITY']].head()

Как мы можем видеть из данных, деловая активность довольно многословна, но почтовый индекс – это простой способ выполнить несколько простых поисков и фильтров данных. Для наших меньших наборов данных давайте просто будем захватить Zip-коды, которые имеют 20 или более предприятий.

zips = df.groupby('ZIP CODE').count()['ID'].sort_values(ascending=False)
zips = list(zips[zips > 20].index)
zips

[60618, 60622, 60639, 60609, 60614, 60608, 60619, 60607]

Теперь разумный сценарий для фильтрации данных может быть создан фильтрация отчета по почтовому индексу, показывающий юридическое имя и адрес бизнеса, заказанного сроком действия срока действия лицензии. Это было бы довольно простым (даже если несколько грязным) выражением в пандах. Например, в этом наборе данных мы можем взять лучший почтовый индекс и посмотрите на несколько столбцов, как это.

df.loc[df['ZIP CODE'] == zips[0]].sort_values(by='LICENSE TERM EXPIRATION DATE', ascending=False)[['LEGAL NAME', 'ADDRESS', 'LICENSE TERM EXPIRATION DATE']]

Теперь, что если кто-то хотел иметь возможность запустить этот отчет для разных zip-кодов, глядя на разные столбцы, а сортировка по другим столбцам? Пользователь должен будет удобно редактировать ячейку выше, повторяя его, и, возможно, выполняя другие клетки для поиска имен столбцов и другие значения.

Используя виджеты

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

Виджет типов

Поскольку большинство из нас знакомы с формами в наших веб-браузерах, имеет смысл думать о виджетах как части типичных форм. Виджеты могут представлять численные, логические или текстовые значения. Они могут быть селекторами предварительно существующих списков или могут принять бесплатный текст (или текст пароль). Вы также можете использовать их для отображения отформатированного вывода или изображений. Полный список виджетов описывает их более подробно. Вы также можете создавать собственные пользовательские виджеты, но для наших целей мы сможем сделать всю работу со стандартными виджетами.

Виджет – это просто объект, который может отображаться в ноутбуке Jupyter после создания. Он оказывает себя (и его базовый контент) и (возможно) разрешить взаимодействие пользователя.

Делать форму

Для нашей формы нам нужно будет собрать четыре части информации:

  1. Почтовый индекс для фильтрации
  2. Столбец, чтобы сортировать на
  3. Независимо от того, поднимается ли вид или уходит
  4. Столбцы для отображения.

Эти четыре части информации будут захвачены следующими элементами формы:

  1. Выброс выбора
  2. Выброс выбора
  3. Флажок
  4. Многофункциональный список

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

import ipywidgets as widgets

widgets.Dropdown(
    options=zips,
    value=zips[0],
    description='Zip Code:',
    disabled=False,
)

Конечно, просто создание объекта не позволяет нам использовать его, поэтому нам нужно назначить его переменной, а также отображать Функция может быть использована для его видимости, то же самое, что мы видим выше.

zips_dropdown = widgets.Dropdown(
    options=zips,
    value=zips[0],
    description='Zip Code:',
    disabled=False,
)

display(zips_dropdown)

Мы можем легко сделать то же самое для столбцов.

columns_dropdown = widgets.Dropdown(
    options=df.columns,
    value=df.columns[4],
    description='Sort Column:',
    disabled=False,
)

display(columns_dropdown)

А для логических ценностей у вас есть несколько вариантов. Вы можете сделать Флажок или Кнопка-переключатель . Я пойду с первым.

sort_checkbox = widgets.Checkbox(
    value=False,
    description='Ascending?',
    disabled=False)
display(sort_checkbox)

Наконец, для этого примера мы хотим выбрать все столбцы, которые мы хотим увидеть в выходе. Мы будем использовать а ВыборMultiPle. для этого. Обратите внимание, что если вы используете клавиши Shift и Ctrl (или команду на MAC), чтобы выбрать несколько вариантов.

columns_selectmultiple = widgets.SelectMultiple(
    options=df.columns,
    value=['LEGAL NAME'],
    rows=10,
    description='Visible:',
    disabled=False
)
display(columns_selectmultiple)

Последнее, мы покажем кнопку, которую мы можем нажать, чтобы заставить обновления. (Обратите внимание, что мы не будем в конечном итоге, нуждаемся в этом в конце, есть более простой способ взаимодействия с нашими элементами, но кнопки могут быть полезны для многих ситуаций).

button = widgets.Button(
    description='Run',
    disabled=False,
    button_style='', # 'success', 'info', 'warning', 'danger' or ''
    tooltip='Run report',
    icon='check' # (FontAwesome names without the `fa-` prefix)
)
display(button)

Обработка выхода

Прежде чем подключить нашу кнопку до функции, нам нужно убедиться, что мы можем захватить вывод нашей функции. Если мы хотим просмотреть Dataframe или печати текста или регистрируйте некоторую информацию в STDOUT, нам нужно иметь возможность запечатлеть эту информацию и очистить ее, если это необходимо. Это то, что Вывод Виджет для. Обратите внимание, что вам не нужно использовать выходной виджет, но если вы хотите, чтобы ваш вывод появился в определенной ячейке, вам нужно будет использовать это. Клетка, где Вывод Виджет отображается, что сделают результаты.

out = widgets.Output(layout={'border': '1px solid black'})

Зацепляя все это

Теперь, когда мы создали все наши компоненты пользовательского интерфейса, как мы отображим их все в одном месте и подключите их к созданию действий?

Во-первых, давайте создадим простой макет со всеми предметами вместе.

box = widgets.VBox([zips_dropdown, columns_dropdown, sort_checkbox, columns_selectmultiple, button])
display(box)

Обработка событий

Для виджетов, которые могут создавать события, вы можете предоставить функцию, которая получит событие. Для Кнопка событие – это по щелчку , и требуется функция, которая примет один аргумент, Кнопка сам. Если мы используем Вывод Мы создали выше (в качестве контекстно-менеджера с использованием a с помощью aficate), нажав кнопку, приведет к добавлению кнопки «Нажатие текста» для добавления к выходу клетки. Обратите внимание, что ячейка, которая получает выход, будет тем, где Вывод был оказан.

def on_button_clicked(b):
    with out:
        print("Button clicked.")

button.on_click(on_button_clicked, False)

Лучший способ крюк

Приведенный выше пример прост, но не показывает нам, как мы получили значения от других входов. Другой способ сделать это, чтобы использовать взаимодействовать . Он работает как функция, либо функциональный декоратор для автоматического создания виджетов, которые позволяют в интерактивно изменять входы в функцию. На основании названного типа аргумента он создаст виджет, который позволяет вам изменить это значение. Использование взаимодействовать это быстрый способ обеспечить взаимодействие пользователя вокруг функции. Функция будет называться каждый раз, когда виджет обновляется. Когда вы перемещаете ползунок, квадрат числа будет напечатан, если флажок проверен, и номер будет напечатан без изменений в противном случае.

def my_function2(x, y):
    if y:
        print(x*x)
    else:
        print(x)

interact(my_function2,x=10,y=False);

Обратите внимание, что вы можете предоставить больше информации для взаимодействовать Чтобы обеспечить более подходящие элементы пользовательского интерфейса (см. Документы для примеров). Но так как мы уже сделали виджеты, мы могли бы просто использовать их вместо этого. Лучший способ сделать это – использовать другую функцию, интерактивный . интерактивный Подобно взаимодействующим, но позволяет взаимодействовать с виджетами, которые были созданы (или их напрямую), и отображать значения, когда вы хотите. Так как мы уже сделали некоторые виджеты, мы можем просто позволить интерактивный Знайте о них, предоставляя каждому из них в качестве аргументов ключевых слов. Первый аргумент – это функция, и аргументы этой функции должны соответствовать последующим аргументам ключевых слов для интерактивных. Каждый раз, когда мы меняем одну из значений в форме, функция будет вызываться со значениями из виджетов формы. Благодаря нескольким строкам кода у нас теперь есть интерактивный инструмент для поиска и фильтрации этих данных.

Но сначала я сделаю камеру с выходом для получения дисплея.

report_output = widgets.Output()
display(report_output)



from ipywidgets import interactive

def filter_function(zipcode, sort_column, sort_ascending, view_columns):
    filtered = df.loc[df['ZIP CODE'] == zipcode].sort_values(by=sort_column, ascending=sort_ascending)[list(view_columns)]
    with report_output:
        report_output.clear_output()
        display(filtered)

interactive(filter_function, zipcode=zips_dropdown, sort_column=columns_dropdown,
                    sort_ascending=sort_checkbox, view_columns=columns_selectmultiple) 

Теперь та же форма, созданная ранее выше, отображается в ячейке. Выход появится в какой клетке «|» Дисплей (Report_Output) линия была выполнена. Как вы измените любой из элементов формы, полученный отфильтрованный Dataframe будет отображаться в этой ячейке.

Резюме

Это был просто краткий обзор использования iPywidgets сделать ноутбуки Jupyter более интерактивными. Даже если вам удобно редактировать код Python и повторно выполнять клетки для обновления и изучения данных, виджеты могут быть отличным способом сделать эту разведку более динамичным и удобным, наряду с менее подверженным ошибкам. Если вам нужно поделиться ноутбуками с людьми, которые не комфортно редактируют код Python, виджеты могут быть спасением и действительно помогать данным оживленным.

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

Пост Как использовать iPywidgets, чтобы сделать ваш ноутбук Jupyter Interactive появился первым на Wrighters.io Отказ

Оригинал: “https://dev.to/wrighter/how-to-use-ipywidgets-to-make-your-jupyter-notebook-interactive-5dem”