Neural Mastery
← Practice
Time-Window Event Stream Sessionizationmedium

Time-Window Event Stream Sessionization

medium NumPy & Data Wrangling 15-20 min

NumPy allowed · plain Python earns 10 bonus points

Segment raw user interaction clickstreams into bounded continuous activity sessions.

Related Skills

Task

Implement sessionize_user_events(events, inactivity_timeout): sort events by (user_id, timestamp). For each user, if the difference between successive timestamps exceeds inactivity_timeout, increment the user's session counter. Assign session_id = f'{user_id}_s{counter}' to each event record. Return annotated event records.

Function Signature

sessionize_user_events(events: list[dict], inactivity_timeout: int) -> list[dict]

Examples

Example 1: Session Split after Timeout 300
Input: events = [{'user_id': 'u1', 'timestamp': 100}, {'user_id': 'u1', 'timestamp': 150}, {'user_id': 'u1', 'timestamp': 600}, {'user_id': 'u2', 'timestamp': 200}] inactivity_timeout = 300
Output: [{'user_id': 'u1', 'timestamp': 100, 'session_id': 'u1_s1'}, {'user_id': 'u1', 'timestamp': 150, 'session_id': 'u1_s1'}, {'user_id': 'u1', 'timestamp': 600, 'session_id': 'u1_s2'}, {'user_id': 'u2', 'timestamp': 200, 'session_id': 'u2_s1'}]
Explanation: u1 split into session u1_s1 and u1_s2 after gap > 300.
Example 2: All Within Single Session
Input: events = [{'user_id': 'a', 'timestamp': 10}, {'user_id': 'a', 'timestamp': 20}] inactivity_timeout = 50
Output: [{'user_id': 'a', 'timestamp': 10, 'session_id': 'a_s1'}, {'user_id': 'a', 'timestamp': 20, 'session_id': 'a_s1'}]
Explanation: No gap exceeds timeout.

Constraints

  • inactivity_timeout > 0
  • 1 <= len(events) <= 50,000
Python3Saved ✓
def sessionize_user_events(events: list[dict], inactivity_timeout: int) -> list[dict]:
"""Assign session_id '{user_id}_s{count}' whenever gap between user events exceeds inactivity_timeout.
Return event records with added 'session_id' field."""
# Implement solution logic here
pass

Case 1: Session Split after Timeout 300
Input: events = [{'user_id': 'u1', 'timestamp': 100}, {'user_id': 'u1', 'timestamp': 150}, {'user_id': 'u1', 'timestamp': 600}, {'user_id': 'u2', 'timestamp': 200}] inactivity_timeout = 300
Expected: [{'user_id': 'u1', 'timestamp': 100, 'session_id': 'u1_s1'}, {'user_id': 'u1', 'timestamp': 150, 'session_id': 'u1_s1'}, {'user_id': 'u1', 'timestamp': 600, 'session_id': 'u1_s2'}, {'user_id': 'u2', 'timestamp': 200, 'session_id': 'u2_s1'}]
Case 2: All Within Single Session
Input: events = [{'user_id': 'a', 'timestamp': 10}, {'user_id': 'a', 'timestamp': 20}] inactivity_timeout = 50
Expected: [{'user_id': 'a', 'timestamp': 10, 'session_id': 'a_s1'}, {'user_id': 'a', 'timestamp': 20, 'session_id': 'a_s1'}]