Jupyter Notebook — важный инструмент для специалиста по науке о данных. С его помощью можно выполнять базовые задачи, такие как очистка данных, визуализация, создание моделей машинного обучения и многие другие. В Jupyter Notebook можно использовать Python и R (в зависимости от ядра), сохранять результаты выполнения кода в ячейках и делиться ими с другими людьми.
В Python можно группировать данные и создавать сводные таблицы с помощью встроенных функций из библиотеки pandas.
Классический способ создания сводных таблиц — с помощью старого доброго метода pivot_table. Как и у большинства методов Python, его синтаксис прост и удобен для чтения.
Однако чем сложнее логика слоя сводной таблицы, тем больше времени потребуется для ее написания. Более того, результирующая сводная таблица всегда является статической, а не интерактивной. При каждой смене расположения данных в сводной сетке, необходимо переписывать код. Возможно, вам не придется вносить много изменений, однако это время можно было бы потратить на то, чтобы лучше разобраться в данных.
Самая интересная особенность этого подхода заключается в возможности сохранить полученный ноутбук с интерактивными компонентами визуализации данных в HTML и отправить его партнерам по команде. Они смогут открыть его в браузере, поэкспериментировать со сводной таблицей и диаграммами, сделать собственные наблюдения, сохранить отчет и отправить его обратно. Такой подход может значительно повысить продуктивность анализа данных в целом.
Мы будем работать в JupyterLab — пользовательском интерфейсе для Jupyter Notebooks, в котором можно найти все элементы классического Jupyter, такие как ноутбуки и файловый браузер. Помимо этого, JupyterLab предлагает более расширенную функциональность: возможность устанавливать расширения, разворачивать, сворачивать и перетаскивать ячейки, а также предоставляет функцию автозаполнения вкладок.
Запускаем JupyterLab. Для начала импортируем необходимые библиотеки Python: pandas, JSON и модуль display из IPython. Во всех этих библиотеках встроен дистрибутив Anaconda, однако, если вы не работаете с ним, то установите эти библиотеки глобально или в виртуальной среде.
marshal
или pickle
, то знакомы с этим API.Для визуализации данных мы будем использовать библиотеку JavaScript Flexmonster Pivot Table & Charts.
Для демонстрации воспользуемся набором данных «Цены на авокадо» из Kaggle. Это легкий набор, содержащий разумное количество полей. Вы можете выбрать любой понравившийся вам набор данных.
▶ Загрузите данные. С помощью pandas прочитайте данные CSV на фрейме данных. Удалите «Unnamed: 0» — столбец индекса, который часто появляется при чтении файлов CSV.
df = pd.read_csv('avocado.csv') df.drop(columns=['Unnamed: 0'], inplace=True) ▶ Вызовите метод to_json()
на фрейме данных, чтобы преобразовать его в строку JSON и сохранить в переменную json_data
.
json_data = df.to_json(orient='records')
Параметр orient
определяет ожидаемый формат строки JSON. Устанавливаем его в значение records. Это значение переводит объект в структуру, подобную списку: [{column -> value}, … , {column -> value}]. Именно с этим форматом работает Flexmonster.
▶ Теперь создадим экземпляр Flexmonster с помощью вложенного словаря. Здесь нужно указать все необходимые параметры инициализации и передать декодированные данные компоненту. Для декодирования JSON воспользуемся методом json.loads()
.
flexmonster = {
"container": "#pivot-container",
"componentFolder": "https://cdn.flexmonster.com/",
"width": "100%",
"height": 430,
"toolbar": True,
"report": {
"dataSource": {
"type": "json",
"data": json.loads(json_data) # decoding JSON
},
"slice": {
"reportFilters": [
{
"uniqueName": "Date.Year",
"filter": {
"members": [
"date.year.[2018]"
]
}
},
{
"uniqueName": "Date.Month",
"filter": {
"members": [
"date.month.[january]"
]
}
}
],
"rows": [
{
"uniqueName": "region"
},
{
"uniqueName": "type"
}
],
"columns": [
{
"uniqueName": "[Measures]"
}
],
"measures": [
{
"uniqueName": "Total Volume",
"aggregation": "sum"
},
{
"uniqueName": "Total Bags",
"aggregation": "sum"
}
],
"sorting": {
"column": {
"type": "desc",
"tuple": [],
"measure": {
"uniqueName": "Total Volume",
"aggregation": "sum"
}
}
}
},
"options": {
"grid": {
"type": "classic"
}
},
"formats": [
{
"name": "",
"decimalPlaces": 2
}
]
}
}
Как видите, мы сразу устанавливаем срез, опции и форматы. Если пропустить этот шаг, то в сводной таблице отобразится срез по умолчанию.
▶ Теперь преобразуем объект Python в JSON с помощью json.dumps()
:
flexmonster_json_object = json.dumps(flexmonster)
▶ Следующий шаг — определение функции, которая отображает сводную таблицу непосредственно в ячейку. Для этого определяем многострочную строку и передаем ее в импортированную функцию HTML:
def render_pivot_table(json_component):
layout = '''
<script src="https://cdn.flexmonster.com/flexmonster.js"></script>
<h1>Flexmonster Integration with Jupyter Notebook</h1>
<div id="pivot-container"></div>
<script>
new Flexmonster({0});
</script>
'''.format(json_component)
return HTML(layout)
▶ И, наконец, передаем JSON в функцию рендеринга и вызываем ее:
render_pivot_table(flexmonster_json_object)
На странице отображается интерактивная сводная таблица. Набор данных готов к работе: вы можете переупорядочить поля в сетке, изменять агрегаты, настраивать фильтрацию и сортировку, форматировать значения и многое другое для создания уникального отчета. Более того, если вы пропустите способ отображения записей в фрейме данных, то сможете переключиться из сводного режима в плоское представление. Таким образом, можно увидеть данные в исходном виде, но с интерактивной функциональностью.
Сводная таблица выглядит следующим образом:
Вы также можете применить условное форматирование, чтобы сосредоточиться на самых важных значениях.
Теперь немного усложним логику, добавив больше элементов в ноутбук. Две сводные диаграммы сделают визуализацию данных более универсальной. Для этого определяем дополнительную функцию, которая принимает несколько компонентов JSON и отображает их на странице. Ее логика выглядит так же, как и логика одной сводной таблицы. Компоненты сводных диаграмм определяются так же, как компоненты сводных таблиц.
В срезах отчетов для сводных диаграмм можно установить фильтры Top X для ограничения количества категорий, отображаемых в диаграммах, чтобы сделать их более аккуратными и компактными.
Интерактивная панель индикаторов в Jupyter Notebook готова к работе!
Мы рассмотрели новый способ манипулирования и представления данных в Jupyter Notebook с помощью Python и библиотеки визуализации данных JavaScript. Как вы могли заметить, настройка не требует много кода и времени.
Выполнив ее однажды, вы сможете исследовать данные в привычном рабочем пространстве.
Этот подход освобождает вас от переписывания фрагментов кода при каждой необходимости взглянуть на данные под новым углом, а также прекрасно сочетается с главной идеей Jupyter Notebooks — сделать визуализацию и анализ данных интерактивными и гибкими.
Полную версию кода можно найти на GitHub. ????
Краткий список основных функций, с помощью которых можно улучшить отчеты:
В большинстве случаев реальные данные неаккуратны и непоследовательны: поля могут быть названы с использованием разных случаев, непонятных сокращений и т. д. Для уточнения можно воспользоваться отображением (mapping) — свойством отчета, которое устанавливает конфигурации представлений, применяемых к источнику данных. Еще одним преимуществом этой функциональности форматирования является явная настройка типов данных. С ее помощью можно указать компоненту способ обработки полей, что повлияет на выбор агрегатов, доступных для иерархий полей.
В примере GitHub показано, как определить объект mapping и установить его в сводную таблицу.
Сводная таблица содержит методы и события JavaScript API. Вы можете настроить сохранение отчетов в различных форматах локально или в удаленных точках, таких как серверы, с помощью метода exportTo
.
Чтобы ввести новые формулы в отчет, можно добавить расчетные значения.
Перевод статьи Veronika Rovnik: Interactive Reporting in Jupyter Notebook
Комментарии