Посчитать ARPU тестовой группы и неявного контроля
gmv_by_user сопоставляет каждому id пользователя его GMV; test_users — список id тестовой группы. Все из gmv_by_user, кого нет в test_users, — контрольная группа. ARPU = суммарный GMV группы / число пользователей в ней. Верните (arpu_test, arpu_control).
Пользователь с нулевым GMV всё равно считается в знаменателе.
def arpu(gmv_by_user: dict[int, float], test_users: list[int]) -> tuple[float, float]:
# ваш код здесь
Напишите реализацию.
Делят пользователей на тест (кто в test_users) и контроль (все остальные в gmv_by_user), затем делят суммарный GMV каждой группы на число её пользователей. Ловушка — знаменатель: пользователь с нулевым GMV всё равно считается пользователем, поэтому делят на число пользователей, а не платящих.
- ✗Исключать пользователей с нулевым GMV из знаменателя
- ✗Отчитываться одним общим ARPU для обеих групп
- ✗Забывать, что контроль — все, кого нет в тест-множестве
- →Почему пользователь с нулевым GMV должен остаться в знаменателе?
- →Как расширить это до ARPPU (только платящие)?
Partition users by the test set, then divide each group's summed GMV by its user count — keeping zero-GMV users in the denominator.
def arpu(gmv_by_user, test_users):
test = set(test_users)
test_gmv = test_n = control_gmv = control_n = 0
for uid, gmv in gmv_by_user.items():
if uid in test:
test_gmv += gmv; test_n += 1
else:
control_gmv += gmv; control_n += 1
return (round(test_gmv / test_n, 2), round(control_gmv / control_n, 2))
For {1:100, 2:100, 3:300, 4:400, 5:700, 6:0} and test=[1,2,6]: test GMV is 200 over 3 users → 66.67; control GMV is 1400 over 3 users → 466.67. User 6 contributes 0 GMV but still counts in the test denominator.