JSON
Ноутбук, используемый в примере:
Json файл, используемый в примере:
Тип статьи | Инструкция |
---|---|
Компетенции | JupyterLab, Python, Petl, Pandas, JSON |
Необходимые права | Доступ к JupyterLab |
Версии компонентов | Jupyter core - 4.7.1, Petl - 1.7.2 , pandas - 1.2.3, Sqlalchemy - 1.3.23 |
Статус | БЕТА |
Сложность | ЛЕГКО |
Полезные ссылки | Petl, Pandas, JSON |
Дополнительные сведения | ОС Ubuntu 18.04 |
В данной статье рассматривается пример обработки данных из JSON файла. Данный файл содержит в себе небольшую информацию из электронной библиотеки Gutenberg.
Для обработки данных, создания таблицы и выгрузки в Excel файл будет использована библиотека Petl, т.к. она имеет более низкий порог вхождения. Но для выгрузки данных в PostgreSQL используется библиотека Pandas, т.к. в ней это реализовано более гибко и просто.
Функционал обеих библиотек схож, и вы можете использовать ту, что вам больше нравится.
Целью этого задания является получение данных из JSON файла для выгрузки их в платформу и построения дашборда.
Пример не является шаблонным: в каждом случае задачи разнятся, и работать с данными придется по-другому.
Вот особенности данного кейса:
Количество получаемых данных небольшое - порядка 80 строк, но для демонстрации правильного подхода все выгруженные и обработанные данные сохраняются в Excel файл и базу данных PostgreSQL. Для загрузки данных в платформу вы можете использовать любой из вариантов. Когда получаемых данных много - правильнее всего использовать запись в базу данных.
Здесь не рассматривается:
Данные будут забираться вручную. Для регулярной автоматический выгрузки необходимо настроить планировщик Chronicle.
Для дальнейшей загрузки в платформу можно воспользоваться стандартными средствами в платформе: “создание загрузчика” и “планы загрузки”. Всё описано в разделе документации (ссылка для версии 2.20):
Загрузка данных и формирование структуры в аналитической базе данных ViQubeПодробности работы подключенных Python библиотек. Это необходимо изучать отдельно.
Для работы нам понадобятся такие библиотеки, как: JSON, Petl, Pandas, SQLAlchemy.
Если они у вас не установлены, то вы можете воспользоваться статьей по установке библиотек:
Установка Python библиотекТеперь можно приступать к работе в JupyterLab.
- Создаем ноутбук, например, с названием json_example.
Первым блоком подключаем все необходимые нам для работы Python библиотеки.
import petl as etl # для загрузки и обработки данных import json # для чтения файла json import pandas as pd # для выгрузки таблицы в postgresql import sqlalchemy # для создания подключения к базе данных
Вторым блоком выгрузим данные из нашего JSON файла и запишем их в переменную
text
. Для загрузки данных воспользуемся методом load() модуля JSON.# выгружаем данные из JSON файла with open('example.json', 'r', encoding='utf-8') as f: text = json.load(f)
Теперь переменнаяtext
выглядит так:
Наши данные – это список, который содержит в себе словари.Как видно из скриншота, дата публикации отображается в неудобном для загрузки формате. Поэтому мы напишем функцию, которая будет приводить дату в нужный для нас формат.
# функция для установки правильного формата дат def make_date(item): day = item['bibliography']['publication']['day'] month = item['bibliography']['publication']['month'] year = item['bibliography']['publication']['year'] return f"{year:04d}-{month:02d}-{day:02d}"
Функция принимает на вход вложенный словарь, записывает из него в переменные день, месяц и год, а затем возвращает эти данные в формате "Год-месяц-день".Чтобы библиотека Petl смогла создать таблицу из иерархического словаря, нам нужно изменить структуру этого словаря.
# переструктурирование словаря df_dict = [{ 'name': item['bibliography']['author']['name'], 'title': item['bibliography']['title'], 'publication': make_date(item), 'downloads': item['metadata']['downloads'], 'words': item['metrics']['statistics']['words']} for item in text]
Каждому ключу словаря соответствует конкретное значение из первоначального словаря. Для даты публикации вызывается определенная выше функцияmake_date
()
, которой передается вложенный объект.
На данном этапе переменнаяdf_dict
содержит следующую информацию:
Теперь у нас есть список словарей, из которых можно с лёгкостью создать таблицу Petl.Чтобы создать таблицу воспользуемся методом fromdicts() библиотеки Petl.
table = etl.fromdicts(df_dict) # создание таблицы petl
Так выглядит наша таблица:Добавим в таблицу столбец с первой буквой фамилии автора, чтобы можно было фильтровать авторов по алфавиту на дашборде. Для этого мы воспользуемся методом addfield() библиотеки Petl. В качестве параметров, мы передаем методу переменную с имеющейся таблицей, название нового столбца, значение нового столбца. В качестве значения, которые нужно добавить в столбец, мы передаем анонимную функцию (лямбда выражение). Эта функция будет проходить по столбцу 'name', брать оттуда каждое значение и записывать первую букву этого значения в новый столбец.
table = etl.addfield(table, 'Last_name_letter', lambda x: x['name'][0]) # добавление столбца с первой буквой фамилии
В таблице появился новый столбец 'Last_name_letter':Мы можем экспортировать нашу таблицу в Excel файл для дальнейшей загрузки на платформу. Для этого воспользуемся методом toxlsx() библиотеки Petl. В качестве параметров передаем методу название Excel файла и флаг mode='overwrite', который указывает, что файл будет перезаписываться при повторном запуске кода.
table.toxlsx('example.xlsx', mode='overwrite') # экспорт в Excel файл
Мы получили Excel таблицу, которую можно загружать на платформу:
Помимо экспорта в Excel продемонстрируем подход с сохранением данных в PostgreSQL. Установим подключение к базе данных с помощью метода create_engine() библиотеки Sqlachemy.
engine = sqlalchemy.create_engine('postgresql://{user}:{user_password}@{url}:{port}/{database_name}') # подключение к базе данных
Где {user} - имя пользователя базы данных, {user_password} - пароль, {url} - адрес базы данных, {port} - порт, {database_name} - название базы данных, в которой будет создана таблица.Далее создадим объект DataFrame библиотеки Pandas из нашей таблицы Petl. Воспользуемся методом DataFrame() и укажем ему, что названия колонок - это table[0], а значения - это срез от первого элемента таблицы Petl до последнего table[1:].
df = pd.DataFrame(columns=table[0], data=table[1:]) # создание DataFrame из petl-таблицы
Получим таблицу Pandas:Теперь экспортируем таблицу в базу данных PostgreSQL с помощью метода to_sql() библиотеки Pandas. В параметрах передаем название таблицы, переменную подключения engine, которую определили выше, флаги index=False и if_exists='replace', и словарь с типами данных для столбцов. Флаг index=False говорит, что не нужно создавать столбец с индексами. Флаг if_exists='replace' указывает, что таблицу нужно перезаписать, если она уже существует. В словаре dtype мы указываем название столбца в качестве ключа, а в качестве значения указывается тип данных библиотеки Sqlalchemy и его длина. Типы данных можно посмотреть тут.
Например, для столбца ‘name’ мы укажем тип данных VARCHAR с длинной 50. Указывается такая длина, т.к. в нашем примере имени автора не будет больше 50-ти символов.# экспорт в базу данных df.to_sql('books_json', engine, index=False, if_exists='replace', dtype={ 'name': sqlalchemy.VARCHAR(50), 'title': sqlalchemy.VARCHAR(255), 'downloads': sqlalchemy.Integer(), 'words': sqlalchemy.Integer(), 'publication': sqlalchemy.Date(), 'Last_name_letter': sqlalchemy.CHAR() })
Мы получили таблицу Excel и таблицу в базе данных PostgreSQL.
Excel таблица:
Таблица в базе данных:
Где 1 - это типы данных столбцов, 2 - данные таблицы.
Так выглядит дашборд, построенный из этих данных:
Полученные файлы можно брать и загружать в платформу через стандартный загрузчик. На этом работа в ViXtract завершена.🥳