Разбивка 380+ задач по темам:
| Тема | Задач | Уровень |
|---|---|---|
| Загрузка данных (read_csv/parquet) | 20 | Easy |
| Фильтрация и индексация | 40 | Easy → Medium |
| groupby + agg | 60 | Medium |
| groupby + transform | 30 | Medium |
| merge/join | 50 | Medium |
| pivot vs pivot_table vs melt | 30 | Medium |
| MultiIndex | 20 | Medium → Hard |
| Time series (resample, rolling) | 40 | Medium |
| Datetime функции | 20 | Easy → Medium |
| Cohort retention | 15 | Hard |
| Sessionization | 15 | Hard |
| Performance (vectorization, dtypes) | 20 | Medium → Hard |
| Real-world кейсы | 20 | Medium → Hard |
Что отличает Junior от Middle на pandas. Эти трюки экономят 50-90% памяти и ускоряют операции в 10-100×.
Классическая задача с собесов Яндекс/Ozon. Реализуй cohort retention за 3 месяца после регистрации.
import pandas as pd
# events: user_id, event_date
def cohort_retention(events: pd.DataFrame) -> pd.DataFrame:
# 1. Найти когорту (месяц первой активности) для каждого юзера
events['cohort_month'] = events.groupby('user_id')['event_date'].transform('min').dt.to_period('M')
events['event_month'] = events['event_date'].dt.to_period('M')
# 2. Период активности относительно когорты
events['months_since_acq'] = (events['event_month'] - events['cohort_month']).apply(lambda x: x.n)
# 3. Pivot: cohort × months_since → unique active users
cohort = events.groupby(['cohort_month', 'months_since_acq'])['user_id'].nunique().unstack()
cohort_sizes = cohort.iloc[:, 0]
# 4. Retention = active / cohort_size
retention = cohort.divide(cohort_sizes, axis=0) * 100
return retention.round(2)
Цитаты из реальных отзывов на сайте:
Pandas — стандарт (95% компаний). Polars быстрее на 10-100× для больших данных, но экосистема меньше. На собесе спросят pandas, polars знать как plus.
Замена Python-loop на массовую операцию через numpy/pandas. df["a"] * 2 быстрее чем [x * 2 for x in df["a"]] в 100-1000×.
apply возвращает любой результат (scalar, Series, DataFrame). transform возвращает Series той же длины — для broadcasting агрегата обратно.
Junior: 100 pandas. Middle: 200 (с time series, MultiIndex). Senior: 300+ (с performance оптимизацией). Наш тренажёр закрывает все уровни.
Object dtype для строк. Решение: astype("category") для повторяющихся, dtype="int8/int16" для целых, chunksize в read_csv, parquet вместо csv.
По 5-10 задач в день в течение 2-3 месяцев. Решай руками, не копипастом. После задачи смотри эталон — учись паттернам.