Задачи на Python на собеседовании аналитика

Что спрашивают по Python

Для аналитика Python на собеседовании — это 80% pandas + 20% базовый Python. Алгоритмические задачи (Leetcode-стиль) спрашивают редко — чаще просят написать обработку таблицы, очистить данные, объединить датафреймы, посчитать метрику.

Ниже — 15 типичных задач от базовых до средне-сложных. Они покрывают всё, что реально встречается в интервью на позиции junior-middle аналитика.

Блок 1: базовый Python

Задача 1. Подсчёт частот элементов

Дан список ['a', 'b', 'a', 'c', 'b', 'a']. Посчитайте, сколько раз встречается каждый элемент.

from collections import Counter

data = ['a', 'b', 'a', 'c', 'b', 'a']
print(Counter(data))
# Counter({'a': 3, 'b': 2, 'c': 1})

Альтернатива без импорта:

result = {}
for x in data:
    result[x] = result.get(x, 0) + 1

На собесе хотят оба варианта — показать, что знаете Counter, но умеете написать и руками.

Задача 2. Уникальные элементы с сохранением порядка

Из списка [3, 1, 2, 1, 3, 4] получите [3, 1, 2, 4] — уникальные значения в порядке первого появления.

seen = set()
result = [x for x in data if not (x in seen or seen.add(x))]

Или через dict (в Python 3.7+ dict сохраняет порядок):

result = list(dict.fromkeys(data))

Частая ловушка: set(data) не сохраняет порядок. Если спросили именно «в порядке появления» — set не подходит.

Задача 3. Группировка без pandas

Есть список словарей заказов, сгруппируйте по user_id и посчитайте сумму.

from collections import defaultdict

orders = [
    {'user_id': 1, 'amount': 100},
    {'user_id': 2, 'amount': 200},
    {'user_id': 1, 'amount': 150},
]
result = defaultdict(int)
for o in orders:
    result[o['user_id']] += o['amount']
# {1: 250, 2: 200}

Задача 4. List comprehension с фильтром

Из списка чисел оставить только чётные и возвести в квадрат.

nums = [1, 2, 3, 4, 5, 6]
result = [x**2 for x in nums if x % 2 == 0]
# [4, 16, 36]

Задача 5. Парсинг строки даты

Строка '2026-04-15', преобразуйте в объект datetime и получите день недели.

from datetime import datetime

d = datetime.strptime('2026-04-15', '%Y-%m-%d')
print(d.strftime('%A'))  # 'Wednesday'
print(d.weekday())        # 2 (среда — 2, понедельник — 0)

Больше таких примеров с разборами — в Telegram-тренажёре. Короткие сессии, прогресс по темам, объяснения после каждого ответа.

Блок 2: pandas

Задача 6. Фильтрация и сортировка

Дан DataFrame orders с колонками user_id, amount, status. Выведите top-5 пользователей по сумме оплаченных заказов.

import pandas as pd

top = (
    orders[orders['status'] == 'paid']
    .groupby('user_id')['amount'].sum()
    .sort_values(ascending=False)
    .head(5)
)

Задача 7. Количество уникальных значений по группе

Посчитайте, сколько уникальных товаров купил каждый пользователь.

orders.groupby('user_id')['product_id'].nunique()

nunique — основная функция для unique count, которую на собесах все путают с count/value_counts.

Задача 8. Пивот таблица

Из длинной таблицы (user_id, month, revenue) получите широкую: строки — пользователи, столбцы — месяцы, значения — revenue.

pivot = df.pivot_table(
    index='user_id',
    columns='month',
    values='revenue',
    aggfunc='sum',
    fill_value=0
)

Подробнее — pivot_table в pandas.

Задача 9. Merge (объединение) двух DataFrame

Есть df_users (user_id, city) и df_orders (user_id, amount). Добавьте к заказам город пользователя.

result = df_orders.merge(df_users, on='user_id', how='left')

На собесе спрашивают отличия merge:

  • how='inner' (по умолчанию) — только пересечение.
  • how='left' — все строки левого + совпадения из правого.
  • how='right' — наоборот.
  • how='outer' — объединение обоих.

Задача 10. Заполнение пропусков

В колонке amount есть NaN. Заполните средним по городу пользователя.

df['amount'] = df.groupby('city')['amount'].transform(
    lambda x: x.fillna(x.mean())
)

transform возвращает серию той же длины, что и исходная — ключ для обогащения строк групповыми агрегатами.

Задача 11. Скользящее среднее

Посчитайте скользящее среднее DAU за 7 дней.

df['dau_7d'] = df.sort_values('date')['dau'].rolling(window=7).mean()

Подробнее — rolling в pandas.

Задача 12. Разделить пользователей на квартили

Для каждого пользователя рассчитайте квартиль по сумме покупок.

user_spend = df.groupby('user_id')['amount'].sum()
df['quartile'] = pd.qcut(
    df['user_id'].map(user_spend),
    q=4,
    labels=['Q1', 'Q2', 'Q3', 'Q4']
)

qcut — разбиение по квантилям. cut — разбиение по произвольным границам.

Задача 13. Найти дубликаты

Есть таблица users. Найдите пользователей с дубликатами по email.

dupes = df[df.duplicated(subset=['email'], keep=False)]
  • keep=False — все дубликаты (и первое вхождение, и последующие).
  • keep='first' — только последующие.
  • keep='last' — только предыдущие.

Задача 14. Retention D7

На DataFrame с user_id, first_login_date, event_date — посчитайте, какой процент пользователей вернулся на 7-й день.

cohort_d7 = df[
    df['event_date'] == df['first_login_date'] + pd.Timedelta(days=7)
]
retention = cohort_d7['user_id'].nunique() / df['user_id'].nunique()

Подробнее — как считать retention.

Задача 15. Cohort analysis

Постройте когортную таблицу: строки — месяц регистрации, столбцы — количество месяцев с регистрации, значения — retention rate.

df['cohort'] = df.groupby('user_id')['date'].transform('min').dt.to_period('M')
df['period'] = df['date'].dt.to_period('M')
df['cohort_index'] = (df['period'] - df['cohort']).apply(lambda x: x.n)

cohort_table = (
    df.groupby(['cohort', 'cohort_index'])['user_id'].nunique().reset_index()
)
cohort_pivot = cohort_table.pivot(
    index='cohort', columns='cohort_index', values='user_id'
)
retention = cohort_pivot.divide(cohort_pivot[0], axis=0)

Это классическая задача уровня middle. Решается за 20 минут с запинками — нормальный результат.


Как готовиться

Задачи по Python на аналитика — это про уверенность в pandas. Если вы не помните с ходу, как сделать groupby-transform или pivot_table — тренируйтесь на реальных датасетах (Kaggle, Yandex Workshop).

Тренажёр Карьерник содержит блок Python и pandas: от базовых list comprehension до groupby.transform и когортного анализа. Каждая задача с разбором — чтобы понять логику, а не зазубривать синтаксис.

Совет: на собесе, решая задачу на pandas, проговаривайте шаги вслух: «фильтрую → группирую → считаю → сортирую». Даже если забыли точное имя метода — интервьюер подскажет, если видит, что думаете правильно.

Если готовишься к собесу — бот @kariernik_bot закрывает 80% технических вопросов. SQL, Python, A/B, продуктовые метрики — всё в одном месте.

Читайте также

FAQ

Спрашивают ли алгоритмы на собеседовании аналитика?

Редко. На позиции junior-middle аналитика почти никогда — задачи на pandas, SQL, иногда простая работа со строками и списками. Алгоритмические задачи (Leetcode easy/medium) появляются на позиции senior или в data-heavy командах, где граница с DS размыта.

pandas или SQL важнее для аналитика?

Оба одинаково. SQL — для работы с базой и быстрых выгрузок. pandas — для обработки, очистки, когорт, нестандартных метрик. На собесе обычно просят решить одну задачу двумя способами: «а теперь то же самое на pandas».

Нужно ли знать NumPy и scikit-learn?

NumPy — да, хотя бы базовые массивы и векторизация. scikit-learn — в объёме «знаю, что такое train_test_split и LinearRegression». Глубже требуют только для позиций, близких к Data Science. Для аналитика достаточно владеть pandas и statsmodels.

Что важнее: быстро написать или написать правильно?

Правильно. Интервьюеры часто сначала не говорят, что тест синтаксически валиден — главное, что правильная логика. Лучше написать через .apply медленно, но корректно, чем через векторизацию с багом.