Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

...

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

    Блок кода
    languagepy
    themeRDark
    linenumberstrue
    import petl as etl # для загрузки и обработки данных
    import json # для чтения файла json 
    import pandas as pd # для выгрузки таблицы в postgresql
    import sqlalchemy # для создания подключения к базе данных



  3. Вторым блоком выгрузим данные из нашего JSON файла и запишем их в переменную text. Для загрузки данных воспользуемся методом load() модуля JSON.

    Блок кода
    languagepy
    themeRDark
    linenumberstrue
    # выгружаем данные из JSON файла
    with open('example.json', 'r', encoding='utf-8') as f: 
        text = json.load(f)


    Теперь переменная text выглядит так:



    Наши данные – это список, который содержит в себе словари.

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

    Блок кода
    languagepy
    themeRDark
    linenumberstrue
    # функция для установки правильного формата дат
    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}"


    Функция принимает на вход вложенный словарь, записывает из него в переменные день, месяц и год, а затем возвращает эти данные в формате "Год-месяц-день".

  5. Чтобы библиотека Petl смогла создать таблицу из иерархического словаря, нам нужно изменить структуру этого словаря.

    Блок кода
    languagepy
    themeRDark
    linenumberstrue
    # переструктурирование словаря
    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.

  6. Чтобы создать таблицу воспользуемся методом fromdicts() библиотеки Petl.

    Блок кода
    languagepy
    themeRDark
    linenumberstrue
    table = etl.fromdicts(df_dict) # создание таблицы petl


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



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

    Блок кода
    languagepy
    themeRDark
    linenumberstrue
    table = etl.addfield(table, 'Last_name_letter', lambda x: x['name'][0]) # добавление столбца с первой буквой фамилии


    В таблице появился новый столбец 'Last_name_letter':



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

    Блок кода
    languagepy
    themeRDark
    linenumberstrue
    table.toxlsx('example.xlsx', mode='overwrite') # экспорт в Excel файл


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



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

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


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

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

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


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



  11. Теперь экспортируем таблицу в базу данных PostgreSQL с помощью метода to_sql() библиотеки Pandas. В параметрах передаем название таблицы, переменную подключения engine, которую определили выше, флаги index=False и if_exists='replace', и словарь с типами данных для столбцов. Флаг index=False говорит, что не нужно создавать столбец с индексами. Флаг if_exists='replace' указывает, что таблицу нужно перезаписать, если она уже существует. В словаре dtype мы указываем название столбца в качестве ключа, а в качестве значения указывается тип данных библиотеки Sqlalchemy и его длина. Типы данных можно посмотреть тут.

    Например, для столбца ‘name’ мы укажем тип данных VARCHAR с длинной 50. Указывается такая длина, т.к. в нашем примере имени автора не будет больше 50-ти символов.

    Блок кода
    languagepy
    themeRDark
    linenumberstrue
    # экспорт в базу данных
    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()
    })


...