Задачи на 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, продуктовые метрики — всё в одном месте.
Читайте также
- Pandas шпаргалка для аналитика
- Задачи на SQL на собеседовании
- GROUP BY SQL: шпаргалка
- Вопросы по Python на собеседовании аналитика
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 медленно, но корректно, чем через векторизацию с багом.