Вы когда-нибудь создавали записную книжку Jupyter на основе Python и анализировали данные, которые хотели исследовать разными способами? Например, вы можете захотеть просмотреть график данных, но отфильтровать его десятью различными способами. Есть ли способ увидеть эти десять разных результатов?
- Скопируйте и вставьте ячейку, измените способ фильтрации каждой ячейки и выполните эту ячейку. Вы получите десять разных ячеек, десять разных значений.
- Измените ту же ячейку, выполните ее и посмотрите результаты, затем измените ее снова, десять раз.
- Параметризируйте блокнот (возможно, используя что-то вродеPapermillтакой инструмент), выполните всю записную книжку с десятью различными наборами параметров.
- некоторое сочетание вышеперечисленного.
Это не идеально, если нам нужна возможность быстро взаимодействовать и исследовать данные. Эти параметры также подвержены опечаткам или большому количеству дополнительной работы по редактированию. Они могут хорошо работать для исходного разработчика записной книжки, но использование пользователем, не понимающим синтаксиса Python, для изменения переменных и повторного выполнения ячеек может быть не лучшим вариантом. Что, если бы вы могли дать пользователю простую форму с кнопкой, и они могли бы изменить форму и увидеть желаемый результат?
Оказывается, вы можете легко сделать это в Jupyter, не создавая полноценное веб-приложение. Это можно сделать с помощью[ipywidgets](https://ipywidgets.readthedocs.io/en/latest/index.html)
Также известен как виджет. В этой статье я покажу вам основы создания нескольких простых форм для просмотра и анализа некоторых данных.
Что такое виджет?
Виджеты Jupyter — это специальные фрагменты кода, которые встраивают JavaScript и html в вашу записную книжку и отображают их визуально в вашем браузере при выполнении в записной книжке. Эти компоненты позволяют пользователям взаимодействовать с гаджетами. Эти виджеты могут выполнять код для определенных операций, позволяя вам обновлять ячейки, не требуя от пользователя повторного выполнения или даже изменения какого-либо кода.
начать использовать
Во-первых, нужно убедитьсяipywidgets
уже установлен в вашей среде. Это будет зависеть в некоторой степени от среды Jupyter, которую вы используете. Для более старых установок Jupyter и JupyterLab обязательно ознакомьтесь сДокументацияподробности в.Но для базовой установки просто используйте pip
pip install ipywidgets
или для конды
conda install -c conda-forge ipywidgets
В большинстве случаев это должно быть все, что вам нужно сделать, чтобы все заработало.
пример
Вместо того, чтобы сразу рассматривать все виджеты и вдаваться в подробности, давайте возьмем некоторые интересные данные и изучим их вручную. Затем мы будем использовать виджеты для более интерактивного изучения этих данных. Давайте начнем сЧикагский портал данныхполучить некоторые данные--В частности, их набор данных о текущих активных коммерческих лицензиях. Обратите внимание, что если вы просто запустите приведенный ниже код, вы получите только 1000 строк данных. Пожалуйста, ознакомьтесь с документацией, чтобы узнать, как получить все данные.
Примечание. Весь этот код был написан в Jupyter Notebook с использованием 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()
Как мы видим из данных, бизнес-операции довольно многословны, но почтовый индекс — это простой способ выполнить простой поиск и фильтрацию данных. Для нашего меньшего набора данных давайте просто возьмем почтовые индексы с 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]
Теперь разумным сценарием для фильтрации данных может быть создание отчета, отфильтрованного по почтовому индексу, с указанием официального названия и адреса компании, отсортированных по дате истечения срока действия лицензии. Это довольно простое (хотя и несколько запутанное) выражение в pandas. Например, в этом наборе данных мы могли бы взять верхний почтовый индекс и посмотреть на несколько таких столбцов.
df.loc[df['ZIP CODE'] == zips[0]].sort_values(by='LICENSE TERM EXPIRATION DATE', ascending=False)[['LEGAL NAME', 'ADDRESS', 'LICENSE TERM EXPIRATION DATE']]
А что, если кто-то захочет запустить этот отчет для разных почтовых индексов, просмотреть разные столбцы и отсортировать по другим столбцам? Пользователь должен иметь возможность свободно редактировать указанную выше ячейку, повторно запускать ее и, возможно, выполнять другие ячейки в поисках имен столбцов и других значений.
Используйте виджеты
Вместо этого мы можем использовать виджеты для создания формы и позволять этому взаимодействию выполняться визуально. В этой статье вы узнаете достаточное количество виджетов для создания формы и динамического отображения результатов.
Тип гаджета
Поскольку большинство из нас знакомы с формами в веб-браузерах, имеет смысл рассматривать виджеты как часть типичной формы. Виджеты могут представлять числа, логические или текстовые значения. Они могут быть селекторами уже существующих списков или могут принимать свободный текст (или зашифрованный текст). Вы также можете использовать их для отображения форматированного вывода или изображений. группаполный списокОни описаны более подробно. Вы также можете создавать свои собственные виджеты, но для наших целей мы сможем выполнять всю работу со стандартными виджетами.
Виджет — это просто объект, который можно отобразить в блокноте Jupyter после его создания. Он представит себя (и лежащий в его основе контент) и (потенциально) позволит взаимодействовать с пользователем.
сделать форму
Для нашей формы нам нужно будет собрать четыре элемента информации.
- почтовый индекс для фильтрации
- столбец для сортировки
- сортировать ли по возрастанию или по убыванию
- Столбец для отображения.
Эти четыре части информации будут захвачены следующими элементами формы.
- выпадающий список выбора
- выпадающий список выбора
- флажок
- список с множественным выбором
Эти три виджета обеспечат быстрое знакомство с виджетом, и как только вы узнаете, как создать и использовать один виджет, другие виджеты будут похожи. Прежде чем мы сможем создать виджет, нам нужно импортировать библиотеку. Давайте сначала посмотрим на выпадающее меню.
import ipywidgets as widgets
widgets.Dropdown(
options=zips,
value=zips[0],
description='Zip Code:',
disabled=False,
)
Конечно, простое создание объекта не позволяет нам его использовать, поэтому нам нужно присвоить его переменной,display
Как мы видели выше, для его рендеринга можно использовать функции.
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)
А для логических значений у вас есть несколько вариантов. ты можешь сделатьCheckBox
илиToggleButton
. Я выберу первое.
sort_checkbox = widgets.Checkbox(
value=False,
description='Ascending?',
disabled=False)
display(sort_checkbox)
Наконец, для этого примера мы хотим иметь возможность выбирать все столбцы, которые мы хотим видеть в выводе. мы будем использоватьSelectMultiple
. Обратите внимание, используете ли вы клавиши Shift и Ctrl (или Command на 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
, или печатать текст, или записывать какую-либо информацию в стандартный вывод, мы должны иметь возможность захватывать эту информацию и при необходимости очищать ее. ЭтоOutput
Роль виджетов. Обратите внимание, что вам не обязательно использовать виджет вывода, но если вы хотите, чтобы ваш вывод отображался в ячейке, вам нужно будет использовать его. показыватьOutput
Ячейка виджета отобразит результат.
out = widgets.Output(layout={'border': '1px solid black'})
соединить все это
Теперь, когда у нас есть все сгенерированные компоненты пользовательского интерфейса, как нам отобразить их все в одном месте и подключить к сгенерированным действиям?
Во-первых, давайте создадим простой макет, чтобы собрать все элементы вместе.
box = widgets.VBox([zips_dropdown, columns_dropdown, sort_checkbox, columns_selectmultiple, button])
display(box)
обрабатывать события
Для виджетов, которые могут генерировать события, вы можете предоставить функцию, которая получает событие. дляButton
, событиеon_click
, который принимает функцию, которая будет принимать один аргумент, т.е.Button
сам. Если мы используем созданный вышеOutput
(как использоватьwith
оператор), нажатие кнопки приведет к добавлению текста «Кнопка нажата» к выходным данным ячейки. Обратите внимание, что ячейка, которая получает вывод, будет отображаемой.Output
Место.
def on_button_clicked(b):
with out:
print("Button clicked.")
button.on_click(on_button_clicked, False)
лучший способ соединить вещи
Приведенный выше пример прост, но не говорит нам, как получить значения из других входных данных. Другой способ - использоватьinteract
. Он работает и как функция, и как декоратор функции, автоматически создавая виджеты, которые позволяют интерактивно изменять ввод функции. На основе именованного типа параметра будет создан виджет, который позволит вам изменить это значение. использоватьinteract
— это быстрый способ обеспечить взаимодействие пользователя с функцией. Эта функция будет вызываться каждый раз при обновлении виджета. При перемещении ползунка, если флажок установлен, будет напечатан квадрат числа, в противном случае число будет напечатано без изменений.
def my_function2(x, y):
if y:
print(x*x)
else:
print(x)
interact(my_function2,x=10,y=False);
Обратите внимание, что вы можете предоставить дополнительную информациюinteract
, чтобы предоставить более подходящие элементы пользовательского интерфейса (примеры см. в документации). Но теперь, когда мы создали виджеты, мы можем просто использовать эти виджеты. Лучше всего использовать другую функцию,interactive
.interactive
, точно так же, как интерактивный, но позволяет вам взаимодействовать с созданными вами виджетами (или предоставлять их напрямую) и отображать значения, когда вы хотите. Так как мы уже сделали некоторые виджеты, мы можем просто сделатьinteractive
, узнайте о каждом виджете, указав их в качестве аргументов ключевого слова. Первый аргумент — это функция, аргументы которой должны совпадать с последующими аргументами ключевого слова для взаимодействия. Эта функция будет вызываться каждый раз, когда мы меняем значение в форме на значение из виджета формы. Всего несколько строк кода, и теперь у нас есть интерактивный инструмент для просмотра и фильтрации этих данных.
Но сначала я сделаю ячейку с выводом для получения дисплея.
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)
Теперь та же самая таблица, созданная ранее выше, отображается в ячейке. Вывод появится при выполненииdisplay(report_output)
какая ячейка строки. При изменении любого элемента формы результирующий отфильтрованныйDataFrame
, появится в этой ячейке.
Суммировать
Это только для использованияipywidgets
, краткий обзор того, как сделать Jupyter Notebooks более интерактивным. Даже если вам удобно редактировать код Python и повторно выполнять ячейки для обновления и изучения данных, виджеты могут стать отличным способом сделать это исследование более динамичным и удобным, а также менее подверженным ошибкам. Если вам нужно поделиться блокнотами с людьми, которые не привыкли редактировать код Python, виджеты могут стать спасением и действительно помочь данным ожить.
Просто читать об этих гаджетах не так весело, как запускать примеры и использовать их самостоятельно. Попробуйте примеры, а затем опробуйте виджеты в своей записной книжке.
The postHow to use ipywidgets to make your Jupyter notebook interactiveappeared first onwrighters.io.