pandasОбъединение таблицMediumБесплатно~8 мин

Двухтабличная агрегация: выручка на юзера по сегменту

// Условие

Есть две таблицы: df (users с тарифным планом) и orders (заказы со статусом). Нужно посчитать LTV-подобную метрику по сегментам.

Что нужно
Для каждого plan посчитай выручку на одного покупателя: sum(amount по completed-заказам) / nunique(user_id среди покупателей).

Это не средний чек (mean amount) — это суммарная выручка делённая на число уникальных покупателей.

Верни DataFrame: plan, revenue_per_user (float). Сортировка по revenue_per_user desc. Планы без покупателей в результат не включай.

// Данные

df (users): user_id, plan (free/premium/enterprise)
orders: order_id, user_id, amount, status — доступна напрямую в namespace
▶ Решить в pandas-тренажёре

// Решение

Подсказка

Отфильтруй orders по status == 'completed' перед join. Потом df.merge(orders_completed, on='user_id', how='inner') — inner join оставит только тех, кто хоть раз купил.

После merge — .groupby('plan').agg(total_revenue=('amount','sum'), buyers=('user_id','nunique')). Потом .assign(revenue_per_user=lambda x: x['total_revenue'] / x['buyers']).

Ключевая ловушка: mean(amount) — средний чек; sum(amount)/nunique(user_id) — выручка на юзера. Это разные вещи с разными бизнес-смыслами.

Сначала попробуй сам → Показать решение
df = load_data()  # users
# orders уже в namespace

result = (df.merge(orders[orders['status'] == 'completed'], on='user_id', how='inner')
          .groupby('plan', as_index=False)
          .agg(total_revenue=('amount', 'sum'),
               buyers=('user_id', 'nunique'))
          .assign(revenue_per_user=lambda x: x['total_revenue'] / x['buyers'])
          [['plan', 'revenue_per_user']]
          .sort_values('revenue_per_user', ascending=False)
          .reset_index(drop=True))

print(result)

Главная ловушка этой задачи — mean(amount) ≠ sum(amount)/nunique(user_id). Первое — средний чек (сколько платят за один заказ), второе — LTV-подобная метрика (сколько принёс один покупатель). Если у enterprise-юзера 10 заказов по 50 000 ₽, то mean=50 000, но revenue_per_user=500 000. Перед аналитическим заданием всегда уточняй у заказчика, какую именно метрику он хочет — это меняет формулу. Inner join здесь правильный: планы без ни одного покупателя в результат не включаем.

// Похожие задачи