Candidate telemetry diagnostic, error autopsy, and step-by-step query construction walkthrough.
Live aggregated metrics across candidate sandbox attempts
13 solved
First attempt fail
Evaluated submissions
Median time to solve
Unlocked answer
You're given a small event log of user activity: each row is one (user, month) pair in which that user was active, along with the month they originally signed up. Build a cohort retention matrix: rows are signup cohort (month), columns are months-since-signup (0, 1, 2, ...), and values are the retention rate — the share of that cohort active in that month.
Steps:
months_since_signup = (active_month − signup_month) in whole months.signup_month equals that cohort).signup_month, columns=months_since_signup, values=retention rate. Months with no data for a cohort should be left as NaN (not zero) — a cohort simply hasn't reached that age yet.Reset the index so signup_month is a normal column, round all rate values to 4 decimals, and assign the DataFrame to result.
Operating on a DataFrame slice without `.copy()`, producing `SettingWithCopyWarning`, or using `.apply(axis=1)` with custom Python functions when vectorized NumPy / pandas column operations could run 50x faster with 0 memory overhead.
Interviewers assess whether you write idiomatic, vectorized pandas code instead of slow row-by-row procedural Python loops.
Construct the solution logically from first principles to avoid typical edge case pitfalls.
Use boolean masks with `.loc[row_mask, col_list]` to avoid chained assignment warnings.
subset = df.loc[df['status'] == 'completed'].copy()
Use numpy/pandas native operations like `.groupby()`, `.transform()`, or column arithmetic.
df['rev_share'] = df['revenue'] / df.groupby('country')['revenue'].transform('sum')Sort values and reset index to match the required evaluation output contract.
result = df.sort_values('rev_share', ascending=False).reset_index(drop=True)import pandas as pd
events = [
{"user_id": "u1", "signup_month": "2026-01", "active_month": "2026-01"},
{"user_id": "u1", "signup_month": "2026-01", "active_month": "2026-02"},
{"user_id": "u1", "signup_month": "2026-01", "active_month": "2026-03"},
{"user_id": "u2", "signup_month": "2026-01", "active_month": "2026-01"},
{"user_id": "u2", "signup_month": "2026-01", "active_month": "2026-02"},
{"user_id": "u3", "signup_month": "2026-01", "active_month": "2026-01"},
{"user_id": "u3", "signup_month": "2026-01", "active_month": "2026-03"},
{"user_id": "u4", "signup_month": "2026-01", "active_month": "2026-01"},
{"user_id": "u5", "signup_month": "2026-01", "active_month": "2026-01"},
{"user_id": "u5", "signup_month": "2026-01", "active_month": "2026-02"},
{"user_id": "u5", "signup_month": "2026-01", "active_month": "2026-03"},
{"user_id": "u6", "signup_month": "2026-02", "active_month": "2026-02"},
{"user_id": "u6", "signup_month": "2026-02", "active_month": "2026-03"},
{"user_id": "u7", "signup_month": "2026-02", "active_month": "2026-02"},
{"user_id": "u8", "signup_month": "2026-02", "active_month": "2026-02"},
{"user_id": "u8", "signup_month": "2026-02", "active_month": "2026-03"},
{"user_id": "u9", "signup_month": "2026-02", "active_month": "2026-02"},
{"user_id": "u10", "signup_month": "2026-03", "active_month": "2026-03"},
{"user_id": "u11", "signup_month": "2026-03", "active_month": "2026-03"},
{"user_id": "u12", "signup_month": "2026-03", "active_month": "2026-03"},
]
df = pd.DataFrame(events)
def month_diff(start, end):
sy, sm = map(int, start.split("-"))
ey, em = map(int, end.split("-"))
return (ey - sy) * 12 + (em - sm)
df["months_since_signup"] = df.apply(
lambda r: month_diff(r["signup_month"], r["active_month"]), axis=1
)
cohort_sizes = df.groupby("signup_month")["user_id"].nunique()
active_counts = (
df.groupby(["signup_month", "months_since_signup"])["user_id"]
.nunique()
.reset_index(name="active_users")
)
active_counts["cohort_size"] = active_counts["signup_month"].map(cohort_sizes)
active_counts["retention_rate"] = (
active_counts["active_users"] / active_counts["cohort_size"]
)
pivot_ret = active_counts.pivot(
index="signup_month", columns="months_since_signup", values="retention_rate"
)
result = pivot_ret.round(4).reset_index()
Real code patterns candidates submit that fail the grading suite.
results = []
for i, row in df.iterrows():
results.append(row['val'] * 2)Three recurring syntax and semantic traps relevant to this problem domain.
Modifying a filtered slice like df[df.age > 30]['salary'] = 5000 modifies an ephemeral copy instead of the underlying dataframe.
df[df['active'] == True]['status'] = 'verified' # ❌ SettingWithCopyWarning
df.loc[df['active'] == True, 'status'] = 'verified' # ✅ Idiomatic inplace assignment
Calling df.groupby('category').agg(...) places 'category' into the MultiIndex/Index, making subsequent column references fail.
res = df.groupby('dept')['salary'].mean(); print(res['dept']) # ❌ KeyErrorres = df.groupby('dept', as_index=False)['salary'].mean() # ✅ Keeps column intactIterating rows with for index, row in df.iterrows() is an anti-pattern in data science interviews.
for i, r in df.iterrows(): df.at[i, 'total'] = r['price'] * r['qty'] # ❌ Slow
df['total'] = df['price'] * df['qty'] # ✅ C-speed vectorization
Launch our in-browser coding environment. Run queries, view execution plans, and get instant comparative diff grading with no setup.