Объяснение функций Grouper и Agg в Pandas

Open in Colab


telegram

Введение

Время от времени полезно сделать шаг назад и посмотреть на новые способы решения старых задач. Недавно, работая над проблемой, я заметил, что в pandas есть функция Grouper, которую я никогда раньше не вызывал. Я изучил, как ее можно использовать, и оказалось, что она полезна для того типа сводного анализа, который я обычно выполняю.

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

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

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

Группировка данных временных рядов

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

Рассмотрим пример данных о продажах и некоторые простые операции для получения общих продаж по месяцам, дням, годам и т.д.

Обратим внимание на типы данных:

Столбец date приведем к типу datetime:

Прежде чем я продвинусь дальше, полезно познакомиться с псевдонимами смещения (Offset Aliases). Эти строки используются для представления различных временных частот, таких как дни, недели и годы.

Например, если вы хотите суммировать все продажи по месяцам, то можете использовать функцию resample. Особенность использования resample заключается в том, что она работает только с индексом. В этом наборе данные не индексируются по столбцу date, поэтому resample не будет работать без реструктуризации (restructuring).

Используйте set_index, чтобы сделать столбец date индексом, а затем выполните resample:

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

Можно посмотреть ежемесячные результаты для каждого клиента:

Это работает, но выглядит немного неуклюжим...

К счастью, Grouper упрощает данную процедуру!

Вместо того, чтобы играть с переиндексированием, мы можем использовать обычный синтаксис groupby, но предоставить немного больше информации о том, как сгруппировать данные в столбце date:

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

Приятным дополнением является то, что для обобщенния в другом временном интервале, достаточно измените параметр freq на один из допустимых псевдонимов смещения.

Например, годовая сводка, использующая декабрь в качестве последнего месяца, будет выглядеть так:

Если ваши годовые продажи были не календарными, то данные можно легко изменить, передав параметр freq.

Призываю вас поиграть с разными смещениями, чтобы понять, как это работает. При суммировании данных временных рядов это невероятно удобно!

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

Новая и улучшенная агрегатная функция

В pandas 0.20.0 была добавлена новая функция agg, которая значительно упрощает суммирование данных аналогично groupby.

Чтобы проиллюстрировать ее функциональность, предположим, что нам нужно получить сумму в столбцах ext price и quantity (количество), а также среднее значение unit price (цены за единицу).

Процесс не очень удобный:

Это работает, но немного беспорядочно...

Новый agg упрощает процесс:

Хорошие результаты, но включение суммы unit price не очень полезно.

К счастью, мы можем передать словарь в agg и указать, какие операции применять к каждому столбцу.

Я считаю этот подход действительно удобным, когда хочу суммировать несколько столбцов. Раньше я выполнял отдельные вычисления и создавал результирующий DateFrame по строке за раз - было утомительно.

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

Для своих задач я нашел лямбда-функцию, которая использует value_counts:

Затем, если я хочу включить наиболее часто используемые sku (артикулы) в сводную таблицу:

Это довольно круто, но есть одна вещь, которая меня всегда беспокоила в этом подходе: в столбце написано <lambda>.

В идеале я хочу указать most frequent (наиболее часто). Раньше я прыгал через несколько обручей, чтобы произвести переименование, но, работая над этой статьей, я наткнулся на другой подход - явное определение имени лямбда-функции:

Теперь, когда я выполняю агрегирование:

Получили гораздо более приятные названия столбцов! Конечно, это мелочь, но я несомненно рад, что понял ее.

В качестве завершающего финального бонуса вот еще один трюк.

Агрегатная (aggregate) функция, использующая словарь, полезна, но проблема заключается в том, что она не сохраняет порядок.

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

Заключение

Библиотека pandas продолжает расти и развиваться с течением времени. Иногда бывает полезно убедиться, что не появилось более простых решений. Функция Grouper и обновленная функция agg действительно полезны при агрегировании и обобщении данных.