Вопросы по Python на собеседовании аналитика

Коротко

Python на собеседовании аналитика — это НЕ про декораторы, метаклассы и GIL. Это про Pandas, обработку данных и визуализацию. Если вы готовитесь по материалам для Python-разработчиков — вы тратите время не туда.

Ниже — реальные вопросы, которые задают на собеседованиях аналитиков в продуктовых компаниях. Каждый с примером кода и объяснением.

Аналитику не нужно знать Python на уровне разработчика. Нужно уметь загрузить данные, обработать, проанализировать и визуализировать. Всё остальное — бонус.

Pandas: работа с данными

Как прочитать CSV и посмотреть первые строки?

import pandas as pd

df = pd.read_csv('data.csv')
df.head()

head() по умолчанию показывает 5 строк. Для быстрой разведки данных используйте также df.shape, df.dtypes и df.describe() — это даёт понимание размера таблицы, типов данных и базовой статистики.

Как отфильтровать DataFrame по условию?

# Пользователи старше 25 лет с подпиской premium
filtered = df[(df['age'] > 25) & (df['subscription'] == 'premium')]

Частая ошибка — использовать and вместо &. В Pandas для поэлементного сравнения нужен &, а каждое условие — в скобках.

Как сделать GROUP BY в Pandas?

# Средний чек по городам
df.groupby('city')['amount'].mean()

# Несколько агрегаций сразу
df.groupby('city')['amount'].agg(['mean', 'median', 'count'])

Аналог SQL: SELECT city, AVG(amount) FROM orders GROUP BY city. Метод agg() позволяет применить несколько функций за один вызов.

Как объединить две таблицы (аналог JOIN)?

# LEFT JOIN по user_id
result = pd.merge(orders, users, on='user_id', how='left')

# JOIN по разным названиям колонок
result = pd.merge(orders, users, left_on='buyer_id', right_on='id', how='inner')

Параметр how работает как тип JOIN в SQL: 'left', 'right', 'inner', 'outer'. Если ключ называется одинаково — используйте on, если по-разному — left_on и right_on.

Как построить сводную таблицу?

# Сумма продаж по категории и месяцу
pivot = df.pivot_table(
    values='revenue',
    index='category',
    columns='month',
    aggfunc='sum',
    fill_value=0
)

pivot_table — это аналог сводных таблиц в Excel. fill_value=0 заменяет пропуски нулями, что удобно для дальнейшего анализа.

Как посчитать кумулятивную сумму (running total)?

# Нарастающая выручка по дням
df = df.sort_values('date')
df['cumulative_revenue'] = df['revenue'].cumsum()

Аналог SQL: SUM(revenue) OVER (ORDER BY date). Метод cumsum() работает на отсортированных данных.

Обработка данных

Как найти и обработать пропуски?

# Сколько пропусков в каждом столбце
df.isnull().sum()

# Заполнить пропуски медианой
df['age'] = df['age'].fillna(df['age'].median())

# Удалить строки с пропусками
df_clean = df.dropna(subset=['email', 'user_id'])

На собеседовании важно не просто знать fillna / dropna, а объяснить выбор стратегии. Медиана — для числовых данных с выбросами. Удаление — когда пропущены ключевые поля. Заполнение нулями — когда пропуск означает отсутствие события.

Как удалить дубликаты?

# Полные дубликаты
df = df.drop_duplicates()

# Дубликаты по конкретным столбцам, оставляем последнюю запись
df = df.drop_duplicates(subset=['user_id', 'date'], keep='last')

Параметр keep='last' оставляет последнюю запись из дубликатов. Это полезно, когда в данных есть обновления — хотите оставить самую свежую версию.

Как изменить тип данных и работать с датами?

# Конвертация строки в дату
df['created_at'] = pd.to_datetime(df['created_at'])

# Извлечение компонентов даты
df['month'] = df['created_at'].dt.month
df['day_of_week'] = df['created_at'].dt.dayofweek
df['date'] = df['created_at'].dt.date

Работа с датами — частый источник багов. Всегда проверяйте формат даты после конвертации через df['created_at'].head().

Как применить функцию к столбцу?

# apply — для сложной логики
df['age_group'] = df['age'].apply(lambda x: 'young' if x < 30 else 'adult')

# map — для замены значений по словарю
status_map = {'active': 1, 'inactive': 0, 'blocked': -1}
df['status_code'] = df['status'].map(status_map)

apply — универсальный, но медленный на больших данных. Где возможно, используйте векторные операции: np.where(df['age'] < 30, 'young', 'adult') работает в разы быстрее.

Визуализация

Как построить базовый график?

import matplotlib.pyplot as plt

# Линейный график
df.groupby('date')['revenue'].sum().plot(figsize=(12, 6))
plt.title('Выручка по дням')
plt.xlabel('Дата')
plt.ylabel('Выручка, руб.')
plt.tight_layout()
plt.show()

tight_layout() предотвращает обрезание подписей — добавляйте всегда.

Как выбрать тип графика для задачи?

import seaborn as sns

# Распределение → гистограмма
sns.histplot(df['amount'], bins=30)

# Сравнение категорий → barplot
sns.barplot(data=df, x='category', y='revenue')

# Связь двух переменных → scatterplot
sns.scatterplot(data=df, x='age', y='spending')

# Распределение по группам → boxplot
sns.boxplot(data=df, x='city', y='salary')

Правило выбора графика: распределение — histplot/boxplot, тренд во времени — lineplot, сравнение категорий — barplot, связь переменных — scatterplot. На собеседовании могут спросить, почему выбрали именно этот тип.

Как построить несколько графиков рядом?

fig, axes = plt.subplots(1, 2, figsize=(14, 5))

axes[0].bar(categories, values)
axes[0].set_title('Выручка по категориям')

axes[1].plot(dates, daily_users)
axes[1].set_title('DAU')

plt.tight_layout()
plt.show()

subplots используют для сравнения графиков на одном слайде. Часто просят на собеседовании: «покажите метрику в разрезе двух сегментов».

SQL vs Python

Когда использовать SQL, а когда Python?

  • SQL — когда данные в базе и нужен ad-hoc запрос, агрегация, JOIN нескольких таблиц
  • Python — когда нужна сложная обработка (скользящие окна с кастомной логикой, статистические тесты), визуализация или данные не в базе (CSV, API)
  • Оба — типичный воркфлоу: выгрузить данные через SQL, обработать и визуализировать в Python

Как перевести SQL-запрос в Pandas?

# SQL: SELECT city, AVG(amount) FROM orders WHERE status = 'completed'
#      GROUP BY city HAVING AVG(amount) > 1000

result = (
    df[df['status'] == 'completed']
    .groupby('city')['amount']
    .mean()
    .loc[lambda x: x > 1000]
)

Цепочка вызовов в Pandas читается как SQL снизу вверх: фильтрация (WHERE) → группировка (GROUP BY) → агрегация (AVG) → фильтрация по агрегату (HAVING).

Что быстрее — SQL или Pandas?

Для данных в базе — SQL почти всегда быстрее: запрос выполняется на сервере, а не на вашем ноутбуке. Pandas быстрее, когда данные уже в памяти и нужна сложная трансформация, которую неудобно писать в SQL.

Типы данных и структуры

В чём разница между list и dict?

# list — упорядоченная коллекция, доступ по индексу
users = ['Анна', 'Борис', 'Вика']
users[0]  # 'Анна'

# dict — пары ключ-значение, доступ по ключу
metrics = {'dau': 1500, 'retention_d1': 0.45, 'arpu': 320}
metrics['dau']  # 1500

На практике аналитика: list — для последовательностей (список колонок, список файлов), dict — для маппингов (перекодировка значений, конфигурация).

Что такое mutable и immutable?

# list — mutable (изменяемый)
a = [1, 2, 3]
a.append(4)  # [1, 2, 3, 4]

# tuple — immutable (неизменяемый)
b = (1, 2, 3)
# b.append(4)  # AttributeError

# string — immutable
s = 'hello'
# s[0] = 'H'  # TypeError
s = 'H' + s[1:]  # создаёт новую строку

Для аналитиков это менее важная тема, но иногда спрашивают на скрининге. Ключевое: list и dict — mutable, tuple, string и int — immutable.

Чего НЕ спрашивают у аналитиков

Если вы готовитесь по материалам для Python-разработчиков, вы встретите темы, которые на собеседовании аналитика не всплывут:

  • Декораторы — это для бэкенд-разработчиков
  • Метаклассы — это для авторов фреймворков
  • GIL (Global Interpreter Lock) — это для тех, кто пишет многопоточный код
  • Async/await — аналитики не пишут асинхронные сервисы
  • Паттерны проектирования — аналитики не проектируют архитектуру приложений

Не тратьте время на эти темы. Лучше решите ещё 5 задач на Pandas groupby.

FAQ

Насколько глубоко нужно знать Python для собеседования аналитика?

На уровне уверенной работы с Pandas: загрузка данных, фильтрация, группировка, объединение таблиц, базовая визуализация. Это покрывает 90% вопросов. Алгоритмы, ООП и структуры данных спрашивают редко и только на Senior-позициях.

Могут ли дать live-coding на Python на собеседовании аналитика?

Да, в некоторых компаниях (Яндекс, Тинькофф, Озон) дают задачу в Jupyter Notebook или CoderPad. Обычно это: загрузить датасет, обработать, посчитать метрику, построить график. Тренируйтесь писать код руками, а не копировать из Stack Overflow.

Что важнее — SQL или Python для аналитика?

SQL — безусловный приоритет. Его спрашивают везде. Python — на втором месте, и его вес растёт: всё больше компаний требуют Python даже для junior-позиций. Если времени мало, закройте SQL на 100% и Python на базовом уровне (Pandas + визуализация).

Нужно ли знать NumPy для собеседования аналитика?

NumPy напрямую спрашивают редко, но он работает под капотом Pandas. Полезно знать np.where() для условных колонок и np.mean() / np.median() для быстрых вычислений. Глубокого знания NumPy для аналитика не требуется.