Условие
Вам выпала почетная роль продуктового аналитика, который участвует в запуске мобильной игры в жанре тамагочи. В ней игрокам предстоит играть и развлекать своего питомца, а так же кормить его. Ваш продакт-менеджер хочет максимизировать число активных игроков, поскольку от нее зависит 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 - 1date_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

