Senior
17
Задача на Python: построить сессии пользователей по событиям (разрыв > 30 минут = новая сессия) и посчитать дневные агрегаты.
Компании, где спрашивали
ScoreWarrior
Ответ от нейросети
sobes.tech AI
Для построения сессий пользователей по событиям с разрывом более 30 минут и подсчёта дневных агрегатов можно использовать pandas:
import pandas as pd
data = [
{'user_id': 1, 'event_time': '2024-04-01 10:00:00'},
{'user_id': 1, 'event_time': '2024-04-01 10:20:00'},
{'user_id': 1, 'event_time': '2024-04-01 11:00:00'}, # >30 мин после предыдущего
{'user_id': 2, 'event_time': '2024-04-01 09:00:00'},
{'user_id': 2, 'event_time': '2024-04-01 09:10:00'},
]
df = pd.DataFrame(data)
df['event_time'] = pd.to_datetime(df['event_time'])
# Сортируем по пользователю и времени
df = df.sort_values(['user_id', 'event_time'])
# Вычисляем разницу между событиями для каждого пользователя
df['time_diff'] = df.groupby('user_id')['event_time'].diff().dt.total_seconds().div(60) # в минутах
# Новая сессия, если разрыв > 30 минут или первое событие
df['new_session'] = (df['time_diff'] > 30) | (df['time_diff'].isna())
# Присваиваем номер сессии
df['session_id'] = df.groupby('user_id')['new_session'].cumsum()
# Добавляем дату для агрегации
df['date'] = df['event_time'].dt.date
# Пример агрегатов: количество сессий и событий в день на пользователя
agg = df.groupby(['user_id', 'date']).agg(
sessions_count=('session_id', 'nunique'),
events_count=('event_time', 'count')
).reset_index()
print(agg)
Этот код выделяет сессии по 30-минутному разрыву и считает дневные агрегаты по пользователям.