Автор статьи: Роман Козлов

Руководитель курса BI-аналитика

Введение

В наше время объемы информации растут неимоверными темпами. С каждым днем, все больше и больше данных генерируется и хранится в компьютерах, смартфонах, облачных сервисах и т.д.

Рост объемов хранения данных в последние годы привел к развитию и использованию более сложных и гибких структур для их хранения. Одной из таких структур является JSON (JavaScript Object Notation), который быстро стал популярным и широко используется благодаря своей легкости в чтении и гибкости. JSON позволяет организовывать данные в виде вложенных ключ- значение пар, что позволяет эффективно хранить и передавать структурированные данные.

Вложенные структуры данных в формате JSON встречаются в самых разных областях. Например, они используются в API для обмена информацией между клиентами и серверами, в NoSQL базах данных для хранения и обработки больших объемов полуструктурированных данных, а также в различных приложениях и сервисах, где требуется гибкость и эффективность в работе с данными. Все это делает важным умение обрабатывать и анализировать сложные структуры данных, такие как JSON, и интегрировать их в процессы обработки и анализа данных с использованием инструментов, таких как Pandas.

В этой статье мы рассмотрим различные подходы к работе со вложенными структурами данных в Pandas, а также обсудим процесс нормализации JSON- структур. На примерах мы продемонстрируем, как можно эффективно извлекать и обрабатывать вложенные данные, преобразовывая их в удобный для анализа формат.

Иерархическая структура в JSON формате данных.

JSON (JavaScript Object Notation) был разработан в начале 2000-х годов Дугласом Крокфордом как простой и удобный формат обмена данными.

Основная идея заключалась в том, чтобы предоставить легковесный и понятный формат для представления структурированных данных, который можно использовать как в браузерах, так и на серверах. JSON произошел от подмножества языка программирования JavaScript, но со временем стал независимым от него, и теперь поддерживается многими другими языками программирования.

Одной из причин, по которой JSON стал популярным форматом хранения данных, является его простота и удобочитаемость как для людей, так и для компьютеров. JSON использует структуру ключ-значение и поддерживает вложенность, что позволяет эффективно хранить иерархические данные. Такая гибкость делает JSON подходящим для разнообразных приложений, включая обмен данными между сервером и клиентом, хранение конфигурационных файлов и даже в качестве альтернативы традиционным реляционным базам данных.

JSON предоставляет возможность комбинировать различные типы данных, такие как числа, строки, булевы значения, списки и объекты (словари), что позволяет представлять сложные структуры данных и облегчает обмен данными между различными системами и языками программирования.

Из-за гибкости и удобства в представлении иерархических данных в структуре json-объектов часто встречаются такие комбинации данных как списки словарей

Списки словарей в JSON-структурах имеют ряд преимуществ:

  1. Порядок элементов: В отличие от обычных словарей, списки поддерживают порядок элементов, что позволяет сохранять последовательность данных.

  2. Гибкость: Списки словарей могут содержать различное количество элементов и словарей с различным набором ключей, что позволяет хранить данные разной структуры и сложности.

  3. Поддержка вложенности: JSON позволяет хранить вложенные структуры данных, такие как списки словарей внутри других словарей или списков. Это позволяет представлять иерархические данные, такие как деревья или графы.

Json-объект с использованием структуры списка словарей может выглядеть следующим образом:

[
  {
    "id":1
    "name":"Alice",
    "subjects":[
      {
        "subject":"math",
        "score":85
      },
      {
        "subject":"history",
        "score":90
      }
    ]
},
{
    "id":2,
    "name":"Bob",
    "subjects":[
      {
        "subject":"math",
         "score":95
      },
      {
        "subject":"history",
        "score":88
      }
    ]
  }
]

 

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

Метод раскрытия иерархии из списка словарей. Метод explode

Преобразование списка словарей в привычный нам табличный формат Dataframe из Pandas может быть сложным, особенно если структура данных неоднородна или содержит несколько уровней вложенности. В таких случаях, можно применять метод explode, чтобы преобразовать данные в удобный для анализа формат.

Метод explodeв Pandas предназначен для преобразования столбцов с вложенными списками или списками словарей в отдельные строки, копируя при этом значения остальных столбцов. Это позволяет упростить структуру данных для дальнейшего анализа. В случае, если в JSON-структурах есть списки словарей, метод explode может быть особенно полезным.

Рассмотрим пример работы с методом explodeна примере JSON-структуры, содержащей списки словарей. Предположим, у нас есть JSON-объект из предыдущего примера:

your_json_string = [
  {
    "id": 1,
    "name": "Alice", 
    "subjects": [
      {
        "subject": "math", 
        "score": 85
      },
      {
        "subject": "history", 
        "score": 90
      }
   ]
},
{
    "id": 2,
    "name": "Bob", 
    "subjects": [
      {
        "subject": "math", 
        "score": 95
      },
      {
        "subject": "history", 
        "score": 88
      }
    ]
  }
]

Сначала импортируем необходимые библиотеки и загрузим JSON-данные в Pandas DataFrame:

import pandas as pd 
import json

data = json.loads(your_json_string) 
df = pd.DataFrame(data)

 Получим Dataframe, выглядящий следующим образом:

Чтобы развернуть столбец subjects, который содержит списки словарей, применим метод explode :

exploded_df = df.explode("subjects",ignore_index = True)

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

 

Как видно, столбец subjects теперь содержит отдельные словари, а не списки словарей. Это упрощает дальнейшую обработку и анализ данных, поскольку теперь каждая строка соответствует отдельному словарю из исходного списка.  

Нормализация данных. Метод json_normalize

Следующим шагом может быть дополнительное преобразование этих словарей в отдельные столбцы, чтобы сделать данные еще более удобными для анализа и визуализации. Для решения этой задачи можно использовать метод json_normalizeиз библиотеки Pandas для преобразования JSON-структур в табличный формат.

pd.json_normalize(exploded_df['subjects'])

С помощью метода pd.json_normalizeнормализуются данные внутри столбца subject, где хранятся вложенные данные по успеваемости студентов по предметам.  

Для объединения исходного DataFrame exploded_df с нормализованным DataFrame, созданным из столбца subjects , используем метод pd.concat().

Объединяем данные по горизонтали с использованием параметра axis=1 и не забываем с помощью метода drop() удалить столбецsubjectsиз исходного DataFrame ,т.к. они будут просто дублировать нормализованные данные.

pd.concat([exploded_df.drop('subjects', axis = 1), \ 
pd.json_normalize(exploded_df['subjects'])], axis = 1)

Так с помощью сочетания методов explode и json_normalize мы получили из сложной json_структуры, содержащей внутри ключей значения в виде списков словарей, понятную и удобную для аналитики табличную форму записи данных.

Стоит отметить, что методjson_normalizeприменяется к данным словарного типа, поэтому в качестве аргумента мы передали в него не весь датафрейм, а только тот столбик, данные внутри которого как раз организованы таким образом.

Заключение

В данной серии статей мы изучили множество методов и техник обработки и анализа данных с использованием Python и библиотеки Pandas. Охватывая широкий спектр проблем и задач, мы осветили различные аспекты работы с данными, такими как разделение данных на интервалы, квантильное разделение, применение скользящих окон для вычислений, смещение данных для временных рядов, преобразование вложенных структур данных, нормализация сложных JSON-структур.

Использование методов, описанных в серии статей, позволяет углубить подход к анализу исследуемых данных и облегчить работу с ними. Они предоставляют обширный инструментарий для обработки, очистки и преобразования данных, что является важным этапом в любом проекте анализа данных.

Разделение данных на интервалы и квантильное разделение помогают в создании сегментов или групп данных, что может быть полезным для различных целей, таких как идентификация групп клиентов, определение диапазонов значений показателей и выявление статистических закономерностей. Эти методы также могут помочь упростить анализ данных, путем преобразования непрерывных значений в дискретные категории.

Применение скользящих окон и смещение данных для временных рядов являются ключевыми методами при работе с последовательностями данных. Они позволяют определить тренды, сезонные изменения и другие особенности временных рядов, а также могут быть использованы для создания моделей прогнозирования и оценки их точности.

Работа с вложенными структурами данных и JSON-структурами становится все более актуальной из-за роста сложности и разнообразия источников данных. Методы преобразования и нормализации этих структур позволяют аналитикам извлекать полезную информацию из сложных и вложенных данных, облегчая их обработку и интеграцию с другими наборами данных.

Освоение и использование всех этих методов в комбинации с другими инструментами анализа данных позволяет углубиться в изучение исследуемых данных и выявить скрытые закономерности и взаимосвязи. Это, в свою очередь, может привести к новым инсайтам, улучшению принятия решений и оптимизации процессов, основанных на данных.

В завершение хочу порекомендовать бесплатный вебинар, на котором мои коллеги расскажут о том, что такое гипотезы и правильном их формулировании. Кому и когда подойдут А/В - тесты и когда А/В тесты не подходят? А также расскажут про альтернативные способы проверки гипотез.

Вебинар подойдет: аналитикам, менеджерам продукта, маркетологам.

Комментарии (0)