Используйте совокупность панд, чтобы ускорить анализ данных

У вас когда-нибудь возникали судороги при вводе одного и того же, но другого кода для вычисления различной статистики по одной и той же (сегментированной) функции?

Как насчет того, чтобы заблудиться в море похожих фрагментов кода, пытающихся вычислить различную статистику по различным (сегментированным) функциям — звучит знакомо?

Я чувствую твою боль. Раньше был — больше нет! Итак, в этом последующем посте мы рассмотрим простые (но эффективные) способы использования agg для:

  1. Применение разных функций к одному и тому же объекту
  2. Применение наборов функций к наборам функций
  3. Используйте кортежи для еще большей гибкости
  4. Используйте функции из других пакетов,

Я упомянул функции, которые группируются или сегментируются. Хотя вам не нужно использовать agg с оператором groupby, я думаю, что это дает более интересные примеры и хорошо следует из моей предыдущей части. Говоря об этом, я бы порекомендовал прочитать его, если вы хотите освежить в памяти groupby , apply и transform :



Хватит беззастенчивой саморекламы — вперед! Прежде всего, взгляните на данные, которые мы собираемся использовать.

Данные

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

Я внес некоторые изменения в имена столбцов и изменения формата, но в остальном данные как есть:

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

В данных больше признаков, чем следует из приведенного выше снимка; не удивляйтесь, если мы используем несколько «новых» ниже!

Совокупность

… or agg .

Я думаю, что документация недооценивает силу agg :

Агрегировать с помощью одной или нескольких операций по указанной оси.

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

Давайте приступим!

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

Несколько функций на одной функции

Давайте посмотрим, как мы можем рассчитать минимальный, максимальный и асимметрию возраста клиента для каждого клиента и гендерного сегмента.

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

Кроме того, «асимметрия» — это статистическое понятие, которое отражает степень асимметрии, присущую распределению.

# set up
segments = ['attrition_flag','gender']
feature = 'customer_age'
functions = ['min','max','skew']

# apply it
df.groupby(segments)[feature].agg(functions)

… который дает:

Довольно просто, верно? Несколько замечаний:

  1. Я приложил все усилия, чтобы уточнить, какие именно сегменты, функции и функции используются, определив каждый из них перед применением. Это в основном для того, чтобы предоставить четкий пример, поэтому не стесняйтесь сокращать свой код.
  2. Мы используем встроенные функции pandas, поэтому можем ссылаться на них, используя их имена (отсюда и спецификация в строковой форме). Позже мы увидим, как мы можем использовать функции из других пакетов, а также пользовательские функции, включая лямбда-функции.
  3. Мы предоставляем функции, которые мы применяем к agg, в виде списка. При необходимости мы можем добавить в список дополнительные функции.

Давайте немного продвинемся вперед и начнем применять различные функции к ряду различных функций.

Несколько функций на несколько функций

Истинная сила agg — производство самых разнообразных сводных статистических данных одним махом.

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

# set up
segments = ['attrition_flag','gender']
features = ['customer_age','months_on_book']
functions = ['min','max']

# apply
df.groupby(segments)[features].agg(functions)

… который дает:

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

Как насчет применения ряда различных функций к различным функциям? Для этого нам понадобится словарь.

# set up
segments = ['attrition_flag','gender']
functions = {
    'customer_age':['min','max'],
    'months_on_book':['median','std']
}

# apply
df.groupby(segments).agg(functions)

… который дает:

Обратите внимание, как использование словаря со списком применяемых функций дает нам гораздо больше гибкости с точки зрения того, что мы применяем? Аккуратный!

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

Больше кортежей, больше гибкости

Выше мы видели, как использование списков и кортежей в вызове agg возвращает DataFrame с иерархическим индексом³ (или MultiIndex на жаргоне).

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

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

  1. Возвращает DataFrame с плоскими индексами. (Забудьте об этих reset_index() звонках).
  2. Позвольте нам указать имена каждого возвращаемого столбца.

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

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

# set up
segments = ['attrition_flag','gender']

# apply
df.groupby(segments).agg(
    customer_age_min = ('customer_age','min'),
    customer_age_max = ('customer_age','max'),
    months_on_book_median = ('months_on_book','median'),
    months_on_book_std = ('months_on_book','std')
)

дает:

Использование кортежей позволяет нам указывать имена суммируемых функций. Это полезно, если вы хотите очень точно указать имена DataFrame .

Синтаксис этого вызова agg немного необычен. Здесь мы указываем имя результирующего столбца за пределами кортежа, а затем внутри кортежа указываем имя суммируемой функции (в строковом формате), за которой следует функция. В псевдокоде это что-то вроде name of result = (name of feature, function).

Мы по-прежнему используем встроенные функции pandas, поэтому можем ссылаться на них по имени (в строковом формате). Давайте посмотрим, как мы можем использовать другие функции.

Экзотические функции

Часто нам нужно использовать более экзотические или специальные функции суммирования.

Я немного либерален со словом «экзотика» — я действительно имею в виду функцию из другого пакета. Тем не менее, иногда нам действительно нужно использовать действительно сделанные на заказ функции, которые мы пишем сами.

Итак, приступим! Мы объединим ряд идей, чтобы применить различные функции к каждому сегменту attrition_flag x gender.

# exotic functions
import numpy as np

# bespoke function
def scaled_median(s):
    # scales Series median by ratio of Series max to Series min
    return s.median() * s.max() / s.min()

# segments
segments = ['attrition_flag','gender']

# apply
df.groupby(segments).agg(
    customer_age_min = ('customer_age',np.min),
    customer_age_max = ('customer_age',np.max),
    months_on_book_std = ('months_on_book',np.std),
    months_on_book_scaled_median = ('months_on_book',scaled_median)
)

который дает:

Работаем над этим:

  1. Мы берем некоторые функции из numpy . Здесь нет ничего слишком «экзотического» — это просто numpy реализация минимального, максимального и стандартного отклонения. Не забудьте импортировать пакет, содержащий «экзотические» функции!
  2. Мы создаем специальную функцию под названием scaled_median. Также здесь нет ничего особенного, так как это надуманная функция для демонстрации.
  3. Вызов agg использует кортежный подход. Здесь не так много нового, кроме того, как мы ссылаемся на функции. Поскольку мы больше не используем встроенные методы, мы не можем называть их по именам: вместо этого мы указываем их имена и их происхождение (например, np.min ).

Более формальное определение функции можно заменить лямбда-функцией, если вы чувствуете себя более питонически; Я не делал этого здесь для целей форматирования.

Давайте позвоним туда и посмотрим, что мы сделали.

Подведение итогов

На этот раз мы увидели, как применять разные функции к одному и тому же (сгруппированному) объекту, используя agg.

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

И последнее, но не менее важное: мы увидели, как мы можем использовать преимущества функций из других пакетов и пользовательских функций, которые мы написали.

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

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

Как всегда, спасибо за чтение. Надеюсь, здесь есть несколько полезных советов, и, пожалуйста, дайте мне знать о любых удобных трюках, которые вы используете!

Если вас интересуют другие приемы pandas и matplotlib, вас также могут заинтересовать:



… и



Ссылки и ресурсы

  1. жыли. (2020). Прогноз оттока клиентов по кредитным картам [набор данных]. Zenodo., предоставленного по лицензии Creative Comons — Attribution 4.0 International.
  2. pandas.DataFrame.agg — документация pandas 1.5.3 (pydata.org)
  3. MultiIndex / расширенное индексирование — документация pandas 1.5.3 (pydata.org)