Двухтабличная агрегация: выручка на юзера по сегменту
// Условие
Есть две таблицы: df (users с тарифным планом) и orders (заказы со статусом). Нужно посчитать LTV-подобную метрику по сегментам.
plan посчитай выручку на одного покупателя: sum(amount по completed-заказам) / nunique(user_id среди покупателей).Это не средний чек (mean amount) — это суммарная выручка делённая на число уникальных покупателей.
Верни DataFrame:
plan, revenue_per_user (float). Сортировка по revenue_per_user desc. Планы без покупателей в результат не включай.// Данные
user_id, plan (free/premium/enterprise)orders:
order_id, user_id, amount, status — доступна напрямую в namespace// Решение
Подсказка
Отфильтруй 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 здесь правильный: планы без ни одного покупателя в результат не включаем.