Sobes.tech
Senior

Python task: build user sessions based on events (new session if gap > 30 minutes) and calculate daily aggregates.

sobes.tech AI

Answer from AI

To build user sessions based on events with a gap of more than 30 minutes and to calculate daily aggregates, you can use 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 min after previous
    {'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'])

# Sort by user and time

df = df.sort_values(['user_id', 'event_time'])

# Calculate the difference between events for each user

df['time_diff'] = df.groupby('user_id')['event_time'].diff().dt.total_seconds().div(60)  # in minutes

# New session if gap > 30 minutes or first event

df['new_session'] = (df['time_diff'] > 30) | (df['time_diff'].isna())

# Assign session number

df['session_id'] = df.groupby('user_id')['new_session'].cumsum()

# Add date for aggregation

df['date'] = df['event_time'].dt.date

# Example aggregates: number of sessions and events per day per user

agg = df.groupby(['user_id', 'date']).agg(
    sessions_count=('session_id', 'nunique'),
    events_count=('event_time', 'count')
).reset_index()

print(agg)

This code segments sessions based on a 30-minute gap and calculates daily aggregates per user.