Sobes.tech
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-минутному разрыву и считает дневные агрегаты по пользователям.