Live-coding на собеседовании Data Scientist

Зачем DS проходят live-coding

Live-coding в DS-собесе проверяет: умеет ли кандидат писать код, который реально работает, под временным давлением. Это не олимпиадный уровень, как у инженеров, но и не «копировать из учебника».

Формат: 30-60 минут, кандидат пишет код в shared editor или на доске, интервьюер задаёт вопросы и предлагает усложнения. Темы: Python, pandas/numpy, базовые алгоритмы, иногда SQL. На собесе Data Scientist live-coding идёт обычно отдельным раундом или комбинируется с ML-теорией.

Python: что проверяют

Базовые структуры данных

  • Lists. Indexing, slicing, comprehensions. [x**2 for x in range(10) if x % 2]
  • Dicts. Lookup O(1), dict.get(key, default), defaultdict, Counter
  • Sets. Уникальность, intersection / union, O(1) lookup
  • Tuples. Immutable, как ключи словаря

Не нужно: глубокое знание устройства CPython. Нужно: уверенное использование стандартной библиотеки.

Алгоритмы

Что точно спросят:

  • Hash maps / dictionaries — самый частый паттерн
  • Two pointers
  • Sliding window
  • Простой DP (Fibonacci, lcs, lps)
  • Графы — BFS / DFS
  • Sorting и его применение

Что реже:

  • Сложный DP
  • Backtracking
  • Segment trees, Fenwick trees
  • Графовые алгоритмы (Dijkstra, MST) — нечасто

Уровень — обычно LeetCode Easy/Medium. Не Hard.

Pandas / numpy

Маст-хэв для DS. Типичные операции:

# Загрузка
df = pd.read_csv('data.csv')

# Фильтрация
df[df['amount'] > 100]
df[(df['country'] == 'RU') & (df['amount'] > 100)]

# Группировки
df.groupby('user_id')['amount'].sum()
df.groupby(['user_id', 'date']).agg({'amount': 'sum', 'count': 'count'})

# Merge
df.merge(users, on='user_id', how='left')

# Pivot
df.pivot_table(index='user_id', columns='date', values='amount', aggfunc='sum')

# Дата-операции
df['date'] = pd.to_datetime(df['date'])
df['month'] = df['date'].dt.to_period('M')

# Rolling
df['ma7'] = df['value'].rolling(7).mean()

Подготовка — pandas-шпаргалка.

Numpy

import numpy as np

# Vectorization
arr = np.array([1, 2, 3, 4])
result = arr ** 2 + arr  # быстрее, чем list comprehension

# Broadcasting
matrix = np.random.rand(100, 50)
mean = matrix.mean(axis=0)  # mean каждой колонки
normalized = matrix - mean  # broadcasting

# Линейная алгебра (примеры операций):
# np.dot(A, B) — матричное умножение
# np.linalg.inv(A) — обратная матрица
# np.linalg.eig(A) — собственные значения и векторы

Типичные задачи

1. Word count / Counter (Python)

«Подсчитай частоту слов в строке».

from collections import Counter

def word_count(text):
    words = text.lower().split()
    return Counter(words)

Усложнения: игнорировать пунктуацию, считать только слова длиннее N, вернуть top-k.

2. Two Sum (Python, classic)

«В массиве найди два числа, дающих в сумме target».

def two_sum(nums, target):
    seen = {}
    for i, n in enumerate(nums):
        if target - n in seen:
            return [seen[target - n], i]
        seen[n] = i

O(n) time, O(n) space.

3. Rolling average (pandas)

«Посчитай 7-дневное среднее метрики».

df['date'] = pd.to_datetime(df['date'])
df = df.sort_values('date')
df['ma7'] = df['value'].rolling(window=7, min_periods=1).mean()

4. Top-K по группе (pandas)

«Для каждого user_id найди топ-3 транзакции по сумме».

top3 = df.sort_values(['user_id', 'amount'], ascending=[True, False])\
         .groupby('user_id').head(3)

5. Retention cohort (pandas)

«Посчитай D7 retention по когортам регистрации».

df['signup_week'] = df.groupby('user_id')['date'].transform('min').dt.to_period('W')
df['weeks_since_signup'] = ((df['date'] - df.groupby('user_id')['date'].transform('min'))
                            .dt.days // 7)

retention = df.groupby(['signup_week', 'weeks_since_signup'])['user_id']\
              .nunique().unstack().fillna(0)
retention_pct = retention.div(retention[0], axis=0)

6. Fizz-Buzz (как разогрев)

for i in range(1, 101):
    if i % 15 == 0: print("FizzBuzz")
    elif i % 3 == 0: print("Fizz")
    elif i % 5 == 0: print("Buzz")
    else: print(i)

Простая задача, ловушка — порядок условий.

7. Простой A/B-калькулятор

«Дано две выборки, посчитай, значимо ли отличие».

from scipy import stats

def ab_test(a, b):
    t_stat, p_value = stats.ttest_ind(a, b)
    return p_value < 0.05, p_value

С усложнениями: размер выборки, доверительный интервал.

8. Логистическая регрессия from scratch

«Реализуй gradient descent для logistic regression».

Сложно сделать за время собеса, но интервьюер может попросить псевдокод или объяснение.

import numpy as np

def sigmoid(z): return 1 / (1 + np.exp(-z))

def train_logreg(X, y, lr=0.01, epochs=100):
    n, m = X.shape
    w, b = np.zeros(m), 0
    for _ in range(epochs):
        z = X @ w + b
        p = sigmoid(z)
        dw = X.T @ (p - y) / n
        db = (p - y).mean()
        w -= lr * dw
        b -= lr * db
    return w, b

SQL в DS-собесе

SQL-задачи проще, чем для аналитика, но всё равно нужны. Стандартный набор:

  • Funnel. Воронка из multi-step событий
  • Retention. Cohort retention по неделям
  • Top-K per group. Используя window functions
  • Joins. INNER / LEFT, иногда self-join
  • Aggregates. SUM/COUNT/AVG/PERCENTILE_CONT с GROUP BY
  • Window functions. ROW_NUMBER, RANK, LAG/LEAD, SUM OVER

Подробнее — SQL на собеседовании.

Подготовка: план

  1. LeetCode Easy/Medium 50-100 задач. Фокус: hash maps, two pointers, sliding window, BFS/DFS, простой DP. NeetCode 150 — хороший curated список.

  2. Pandas — до автоматизма. Groupby, merge, pivot, rolling, datetime — без думания. Pandas-шпаргалка.

  3. Numpy basics. Vectorization, broadcasting, линейная алгебра.

  4. SQL. Window functions, JOINs, аналитические запросы. SQL-раздел.

  5. Реализация простых ML алгоритмов. Логистическая регрессия, KNN, k-means из «голого» NumPy — для понимания и для возможных вопросов.

  6. Live-coding mock с другом. Самое полезное — проиграть формат с обратной связью.

Частые ошибки

  • Молча писать код. Думай вслух — интервьюер оценивает процесс, не только результат
  • Не уточнять задачу. «Что считать словом — split по пробелам или ещё пунктуация?»
  • Игнорировать edge cases. Пустой input? Дубликаты? Отрицательные числа?
  • Сложность без причины. Hash map за O(n) лучше, чем вложенный цикл за O(n²)
  • Не запускать код. Если есть возможность, прогони на примере
  • Pandas без векторизации. df.apply(...) медленнее векторных операций — на больших данных критично

FAQ

Уровень LeetCode для DS?

Easy и Medium. Hard — редко. Сравнимо с инженерами на 1-2 grade ниже.

Спрашивают ли deep CS (динамическое программирование, графовые алгоритмы)?

Простой DP — да. Сложный — редко. Графы (BFS/DFS) — иногда. Зависит от компании: Яндекс/Сбер AI сложнее, средние компании — проще.

Можно ли использовать pandas / numpy на собесе?

Да, ожидается. Без pandas writing DS-код — странно. Однако базовый Python тоже проверяют.

Что важнее — скорость или чистота кода?

Баланс. Слишком быстро без тестов — рискованно. Слишком медленно — не успеваешь.

Можно ли использовать ChatGPT?

На большинстве собесов — нет. Камера + share-screen используются. Но: умение пользоваться LLM в работе DS — отдельный плюс на разговоре про инструменты.

Смотрите также