TGViewer
Продуктовый взгляд | Аналитика данных Продуктовый взгляд | Аналитика данных @prodanalysis · 2.29K subscribers
Post #78 6.15K
Продолжаем разбирать отбор на стажировку в Яндекс. Специально для наших подписчиков выкладываем разбор одной из задач из контеста на позицию аналитика

Условие

Вам выпала почетная роль продуктового аналитика, который участвует в запуске мобильной игры в жанре тамагочи. В ней игрокам предстоит играть и развлекать своего питомца, а так же кормить его. Ваш продакт-менеджер хочет максимизировать число активных игроков, поскольку от нее зависит KPI (премия). Активным игроком на момент текущей даты мы называем игрока, который за последние 30 дней не менее 5 раз заходил в игру.

Вам предоставляется доступ к базе данных игры в формате tsv (данные разделены знаком табуляции).

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

Формат ввода
Считывается текстовый файл input.txt
Формат вывода
Выведите наибольшее количество активных участников целым числом.
Примечания
Активные клиенты текущего дня определяются по последним 30 дням, включая текущий Первый тест для пробы.


Решение
1) Переформулируем задачу
Активным игроком на момент текущей даты мы называем игрока, который за последние 30 дней заходил в игру ≥ 5 раз.
Нужно пройти по всем датам, которые есть в базе данных, и посчитать для каждой даты сколько было уникальных активных игроков, а затем взять максимум из этих чисел.

2) Читаем входные данные
Входной файл input.txt содержит много не нужных колонок, нам понадобятся только client_id и timestamp.
Так как timestamp изначально дано как "целое число" (то есть время в секундах) нужно его преобразовать в формат "YYYY-MM-DD". При преобразовании нужно указать, что время в секундах unit='s' и округляем до начала дня .floor('D') (к примеру 1696439123 -> 2023-10-04 13:25:23 -> floor('D') = 2023-10-04 00:00:00)

df = pd.read_csv('input.txt', sep='\t')
df['date'] = pd.to_datetime(df['timestamp'], unit='s').dt.floor('D')


3) Посчитаем сколько визитов сделал каждый игрок в каждую дату

Это можно сделать с помощью метода .size(). У нас получится таблица с мультииндектом, поэтому с помощью .reset_index() преобразуем в таблицу с обычными индексами 1, ..., n - 1

date_visits = (df.groupby(['date', 'client_id']).size().rename('counts_visits').reset_index())


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

Для этого поставим в качестве индексов даты и сгруппируем по игрокам. С помощью метода .rolling('30D', closed='both') для каждого игрока мы можем просуммировать в окне длины 30 дней количество визитов

date_visits = date_visits.set_index('date')
rolling = (date_visits.groupby('client_id')['counts_visits'].rolling('30D', closed='both').sum().reset_index())


5) Помечаем активных игроков (то есть у которых ≥ 5 визитов)

rolling['active'] = rolling['counts_visits'] >= 5


6) Опять создадим таблицу, где уже просуммируем сколько было активных пользователей в конкретный день

count_active_users =rolling.groupby('date')['active'].sum()


7) Ответ

print(count_active_users.max())


@ProdAnalysis
  • ❤ 5
  • 👍 3
More from @prodanalysis
  1. Sep 27, 2026Ты поступишь в ШАД Старт набора на наши ШАДовские курсы: без воды и лишней теории, 3 месяц…
  2. Sep 22, 2026Яндекс изменил отбор на аналитиков Раньше процесс состоял из технической секции, алгособес…
  3. Sep 18, 2026Хороший маркетинг обязан нравиться всем? Кейс Сидни Суини говорит, что нет Последние пару…
  4. Sep 16, 2026Если собираетесь на собеседование — держите полезную подборку Хотим поделиться каналом «Ги…
  5. Sep 14, 2026Что происходит с ML после того, как модель обучена Рекомендуем канал Data New Gold. Владим…
  6. Sep 14, 2026Товарищи, Поступашкам нужны контент мейкеры в основной канал по аналитике и другим дисципл…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →