Аккуратные данные в Python

Open in Colab

Оригинал статьи доступен по ссылке

telegram

Недавно я наткнулся на статью Хэдли Уикхэма (Hadley Wickham) под названием Tidy Data (Аккуратные Данные).

Документ, опубликованный еще в 2014 году, посвящен одному аспекту очистки данных, упорядочиванию: структурированию наборов данных для упрощения анализа. В документе Уикхэм демонстрирует, как любой набор данных может быть структурирован до проведения анализа. Он подробно описывает различные типы наборов данных и способы их преобразования в стандартный формат.

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

Библиотеки для построения графиков Altair и Plotly на входе принимают фреймы данных в аккуратном формате.

В этой заметке я обобщу некоторые примеры наведения порядка, которые Уикхэм использует в своей статье, и продемонстрирую, как это сделать с помощью Python и pandas.

Определение аккуратных данных

Структура, которую Уикхэм определяет как аккуратная (tidy), имеет следующие атрибуты:

Несколько определений:

Пример беспорядочного набора данных (messy dataset):

Пример аккуратного набора данных (tidy dataset):

Убираем беспорядочные наборы данных

С помощью следующих примеров, взятых из статьи Уикхема, мы преобразуем беспорядочные наборы данных в аккуратный формат. Цель здесь не в том, чтобы проанализировать наборы данных, а, скорее, в их стандартизированной подготовке перед анализом.

Рассмотрим пять типов беспорядочных наборов данных:

1) Заголовки столбцов - это значения, а не имена переменных.
2) Несколько переменных хранятся в одном столбце.
3) Переменные хранятся как в строках, так и в столбцах.
4) В одной таблице хранятся несколько единиц объектов наблюдения (observational units).
5) Одна единица наблюдения хранится в нескольких таблицах.

Заголовки столбцов - это значения, а не имена переменных

Набор данных Pew Research Center

Этот набор данных исследует взаимосвязь между доходом и религией.

Проблема: заголовки столбцов состоят из возможных значений дохода.

Аккуратная версия этого набора данных - та, в которой значения дохода будут не заголовками столбцов, а значениями в столбце дохода. Чтобы привести в порядок этот набор данных, нам нужно его растопить (melt).

В библиотеке pandas есть встроенная функция melt, которая позволяет это сделать.

Она "переворачивает" (unpivots) фрейм данных (DataFrame) из широкого формата (wide format) в длинный (long format).

Набор данных Billboard Top 100

Этот набор данных представляет собой еженедельный рейтинг песен с момента их попадания в Billboard Top 100 до последующих 75 недель.

Проблемы:

Для приведения этих данных к аккуратным мы снова растопим (melt) столбцы недель в один столбец date.

Создадим одну строку в неделю для каждой записи. Если данных за данную неделю нет, то строку создавать не будем.

По-прежнему часто повторяются детали песни: track, time и genre.

По этой причине набор данных все еще не совсем аккуратный в соответствии с определением Уикхема. Мы рассмотрим его снова в следующем примере.

Несколько типов в одной таблице

Следуя за набором данных Billboard, рассмотрим проблему повторения из предыдущей таблицы.

Проблемы:

Сначала создадим таблицу песен, которая будет содержать сведения о каждой песне:

Затем создадим таблицу ranks, которая будет содержать только song_id, date и rank.

Несколько переменных хранятся в одном столбце

Записи по туберкулёзу от Всемирной организации здравоохранения

Этот набор данных документирует количество подтвержденных случаев туберкулеза по странам, годам, возрасту и полу.

Проблемы:

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

Сначала нужно расплавить (melt) столбцы, содержащие пол и возраст. Как только у нас будет единственный столбец, мы получим из него три столбца: sex, age_lower и age_upper.

Затем с их помощью сможем правильно построить аккуратный набор данных.

Переменные хранятся как в строках, так и в столбцах

Набор сетевых данных по глобальной исторической климатологии (Global Historical Climatology Network Dataset)

Этот набор данных представляет собой ежедневные записи погоды для метеостанции (MX17004) в Мексике за пять месяцев в 2010 году.

Проблемы:

Чтобы упорядочить этот набор данных, мы хотим переместить три неуместных переменных (tmin, tmax и days) в виде трех отдельных столбцов: tmin, tmax и date.

Один тип в нескольких таблицах

Набор данных: имена мальчиков в штате Иллинойс за 2014/15 годы

Проблемы:

Чтобы загрузить разные файлы в один DataFrame, мы можем запустить собственный скрипт, который будет добавлять файлы вместе. Кроме того, нам нужно будет извлечь переменную year из имени файла.

Следующий пример подразумевает наличие двух файлов в корневой директории: 2015-baby-names-illinois.csv и 2014-baby-names-illinois.csv

Заключительные мысли

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

telegram