XML

Ноутбук, используемый в примере:

xml_example.ipynb


XML файл, используемый в примере:

books.xml


Тип статьиИнструкция
КомпетенцииJupyterLab, Python, Petl, PandasА
Необходимые праваДоступ к JupyterLab
Версии компонентовJupyter core - 4.7.1, Petl - 1.7.2 , pandas - 1.2.3, Sqlalchemy - 1.3.23
СтатусБЕТА
СложностьЛЕГКО
Полезные ссылкиPetl, Pandas
Дополнительные сведенияОС Ubuntu 18.04


В данной статье рассматривается пример обработки данных из XML файла. Данный файл содержит в себе небольшую информацию из электронной библиотеки Gutenberg.

Для обработки данных, создания таблицы и выгрузки в Excel файл будет использована библиотека Petl, т.к. она имеет более низкий порог вхождения. Но для выгрузки данных в PostgreSQL используется библиотека Pandas, т.к. в ней это реализовано более гибко и просто.

Функционал обеих библиотек схож, и вы можете использовать ту, что вам больше нравится.

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

Вот особенности данного кейса:

  • Количество получаемых данных небольшое - порядка 80 строк, но для демонстрации правильного подхода все выгруженные и обработанные данные сохраняются в Excel файл и базу данных PostgreSQL. Для загрузки данных в платформу вы можете использовать любой из вариантов. Когда получаемых данных много - правильнее всего использовать запись в базу данных.

Здесь не рассматривается:

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

  • Для дальнейшей загрузки в платформу можно воспользоваться стандартными средствами в платформе: “создание загрузчика” и “планы загрузки”. Всё описано в разделе документации (ссылка для версии 2.20):
    Загрузка данных и формирование структуры в аналитической базе данных ViQube

  • Подробности работы подключенных Python библиотек. Это необходимо изучать отдельно.


Для работы нам понадобятся такие библиотеки, как: Petl, Pandas, SQLAlchemy.

Если они у вас не установлены, то вы можете воспользоваться статьей по установке библиотек:

Установка Python библиотек

Теперь можно приступать к работе в JupyterLab.


  1. Создаем ноутбук, например, с названием xml_example.
  2. Первым блоком подключаем все необходимые нам для работы Python библиотеки.

    import petl as etl # для загрузки и обработки данных
    import pandas as pd # для выгрузки таблицы в postgresql
    import sqlalchemy # для создания подключения к базе данных
  3. Далее мы можем создать Petl таблицу из нашего XML файла. Воспользуемся функцией Petl fromxml(). В качестве параметров мы должны указать: название XML файла; XML тег, в котором хранятся теги с интересующей нас информацией (в нашем случае это тег <row>); Python словарь, у которого в качестве ключей будут названия столбцов, которые мы хотим видеть в таблице, а в качестве значений - теги с интересующей нас информацией (в нашем случае это теги <name>, <title>, <publication> и т.д.).

    # формируем таблицу petl из XML файла
    table = etl.fromxml('books.xml', 'row', {
        'name': 'name', 
        'title': 'title', 
        'publication': 'publication', 
        'downloads':'downloads', 
        'words':'words', 
        'Last_name_letter': 'Last_name_letter'
    })


    Иерархия нашего XML файла:



    Так выглядит наша таблица:



  4. Мы можем экспортировать нашу таблицу в Excel файл для дальнейшей загрузки на платформу. Для этого воспользуемся методом toxlsx() библиотеки Petl. В качестве параметров передаем методу название Excel файла и флаг mode='overwrite', который указывает, что файл будет перезаписываться при повторном запуске кода.

    table.toxlsx('xml_example.xlsx', mode='overwrite') # экспорт в Excel файл	


    Мы получили Excel таблицу, которую можно загружать на платформу:



  5. Помимо экспорта в Excel продемонстрируем подход с сохранением данных в PostgreSQL. Установим подключение к базе данных с помощью метода create_engine() библиотеки Sqlachemy.

    engine = sqlalchemy.create_engine('postgresql://{user}:{user_password}@{url}:{port}/{database_name}') # подключение к базе данных


    Где {user} - имя пользователя базы данных, {user_password} - пароль, {url} - адрес базы данных, {port} - порт, {database_name} - название базы данных, в которой будет создана таблица.

  6. Далее создадим объект DataFrame библиотеки Pandas из нашей таблицы Petl. Воспользуемся методом DataFrame() и укажем ему, что названия колонок - это table[0], а значения - это срез от первого элемента таблицы Petl до последнего table[1:].

    df = pd.DataFrame(columns=table[0], data=table[1:]) # создание DataFrame из petl-таблицы


    Получим таблицу Pandas:



  7. Теперь экспортируем таблицу в базу данных 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_xml', 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 завершена.🥳