Skip to main content
Back to problems
#1142
Easy Database

User activity for the past 30 days ii

Database
35.6% acceptance
Mar 31, 2026
107
380

No description available.

Solution

Pandas
Time O(n)
Space O(1)
LeetCode
solution.pandas
# Table: Activity
# 
# +---------------+---------+
# | Column Name   | Type    |
# +---------------+---------+
# | user_id       | int     |
# | session_id    | int     |
# | activity_date | date    |
# | activity_type | enum    |
# +---------------+---------+
# This table may have duplicate rows.
# The activity_type column is an ENUM (category) of type ('open_session', 'end_session', 'scroll_down', 'send_message').
# The table shows the user activities for a social media website.
# Note that each session belongs to exactly one user.
# 
#  
# 
# Write a solution to find the average number of sessions per user for a period of 30 days ending 2019-07-27 inclusively, rounded to 2 decimal places. The sessions we want to count for a user are those with at least one activity in that time period.
# 
# The result format is in the following example.
#
# Example 1:
# Input:
# Activity table:
# +---------+------------+---------------+---------------+
# | user_id | session_id | activity_date | activity_type |
# +---------+------------+---------------+---------------+
# | 1       | 1          | 2019-07-20    | open_session  |
# | 1       | 1          | 2019-07-20    | scroll_down   |
# | 1       | 1          | 2019-07-20    | end_session   |
# | 2       | 4          | 2019-07-20    | open_session  |
# | 2       | 4          | 2019-07-21    | send_message  |
# | 2       | 4          | 2019-07-21    | end_session   |
# | 3       | 2          | 2019-07-21    | open_session  |
# | 3       | 2          | 2019-07-21    | send_message  |
# | 3       | 2          | 2019-07-21    | end_session   |
# | 3       | 5          | 2019-07-21    | open_session  |
# | 3       | 5          | 2019-07-21    | scroll_down   |
# | 3       | 5          | 2019-07-21    | end_session   |
# | 4       | 3          | 2019-06-25    | open_session  |
# | 4       | 3          | 2019-06-25    | end_session   |
# +---------+------------+---------------+---------------+
# Output:
# +---------------------------+
# | average_sessions_per_user |
# +---------------------------+
# | 1.33                      |
# +---------------------------+
# Explanation: User 1 and 2 each had 1 session in the past 30 days while user 3 had 2 sessions so the average is (1 + 1 + 2) / 3 = 1.33.

import pandas as pd

def user_activity(activity: pd.DataFrame) -> pd.DataFrame:
  filtered = activity[(activity['activity_date'] > '2019-06-27') & (activity['activity_date'] <= '2019-07-27')]
  if filtered.empty:
    return pd.DataFrame({'average_sessions_per_user': [0.00]})
  sessions_per_user = filtered.groupby('user_id')['session_id'].nunique()
  avg = round(sessions_per_user.mean(), 2)
  return pd.DataFrame({'average_sessions_per_user': [avg]})