Перейти к содержимому
На этой странице

Python-инструменты Data Scientist

Все темы Data Scientist

Подтемы:

Как можно ускорить процесс последовательного добавления большого количества объектов к списку в Python с использованием библиотеки NumPy?

Повторные вызовы numpy.append() обычно не ускоряют накопление: каждый создаёт новый массив и копирует данные. Если размер известен, заранее выделите массив через numpy.empty() и заполняйте его. Если размер неизвестен, накапливайте элементы в списке Python и один раз преобразуйте его через numpy.array().


Что быстрее для числового DataFrame: df**2 или df.apply(lambda x: x**2), и почему?

Использование операции df**2 будет быстрее, чем df.apply(lambda x: x**2), потому что операция df**2 векторизована и выполняется нативно на массивах NumPy, в то время как apply применяет функцию к каждой строке или столбцу отдельно, что менее эффективно.


Какая концепция эффективного Pandas? Как хорошо и красиво писать код на Pandas?

Концепция эффективного использования Pandas включает следующие аспекты:

  1. Векторизация операций: Используйте встроенные методы Pandas для выполнения операций на всем DataFrame или Series одновременно, избегая явных циклов Python.

  2. Использование методов работы с данными: Вместо циклов Python используйте методы Pandas, такие как apply(), map(), groupby() и др., для выполнения операций над данными более эффективно.

  3. Оптимизация работы с памятью: Используйте различные методы для уменьшения потребления памяти, такие как использование более компактных типов данных, удаление ненужных столбцов или строк и загрузка данных порциями при необходимости.

  4. Использование индексации и селекции: Используйте индексацию и селекцию для эффективного доступа к данным, избегая использования циклов и лишних операций копирования.

  5. Применение эффективных алгоритмов: Используйте оптимизированные алгоритмы Pandas для выполнения сложных операций, таких как слияние таблиц, объединение и группировка данных.

  6. Обработка пропущенных данных: Используйте методы Pandas для обработки пропущенных данных, такие как fillna(), dropna() и interpolate(), чтобы гарантировать целостность и точность анализа.

  7. Использование цепочек методов (method chaining): Используйте цепочки методов для создания более компактного и читаемого кода, избегая лишних промежуточных переменных.


Как работают в Pandas’е методы: assign, pipe?

Метод assign() в Pandas используется для создания новых столбцов в DataFrame на основе существующих данных. Он принимает именованные аргументы в виде выражений или функций, которые определяют значения новых столбцов. Метод возвращает новый DataFrame с добавленными столбцами.

Например:
import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df_new = df.assign(C=df['A'] + df['B'], D=lambda x: x['A'] * 2)

pipe() передаёт DataFrame одной функции вместе с дополнительными аргументами и возвращает её результат, который может иметь любой тип. Последовательность функций строят цепочкой вызовов .pipe(f).pipe(g).

Например:
import pandas as pd

def square_and_sum(df):
    df['A'] = df['A'] ** 2
    df['B'] = df['B'] ** 2
    return df.sum()

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
result = df.pipe(square_and_sum)

Какой аналог LEFT JOIN в Pandas, если хотим пару DataFrame объединить?

В Pandas аналогом операции LEFT JOIN является метод merge(), который позволяет объединять два DataFrame по заданным ключам, сохраняя все строки из левого DataFrame и соответствующие строки из правого DataFrame, если ключи совпадают.

Например:
import pandas as pd

df1 = pd.DataFrame({'key': ['A', 'B', 'C'], 'value': [1, 2, 3]})
df2 = pd.DataFrame({'key': ['A', 'B', 'D'], 'value': [4, 5, 6]})

result = pd.merge(df1, df2, on='key', how='left')

В этом примере df1 и df2 объединяются по ключу 'key', и результатом будет DataFrame, содержащий все строки из df1 и только соответствующие им строки из df2.


Чем groupby.transform отличается от groupby.agg в Pandas?

groupby().agg() сворачивает каждую группу до одной или нескольких агрегированных строк. groupby().transform() возвращает результат, выровненный с исходными строками, и поэтому подходит для центрирования, нормализации или добавления среднего группы как новой колонки. Функция для transform должна вернуть скаляр либо результат, совместимый с размером группы. В ML групповые статистики считают только на train или внутри фолда. Иначе строка получает информацию из validation или будущего.


Чем loc отличается от iloc в Pandas?

loc выбирает строки и столбцы по меткам, а iloc по целочисленным позициям. У loc['a':'c'] правая метка обычно включена, у iloc[0:3] позиция 3 исключена. Это особенно коварно при числовом индексе: loc[1] ищет метку 1, iloc[1] берет вторую строку. Индексированную булеву Series обычно передают в loc, где она выравнивается по индексу. Для присваивания безопасна одна операция: df.loc[mask, 'col'] = value.


Чем pivot отличается от pivot_table в Pandas?

pivot только меняет форму данных и требует ровно одно значение для каждой пары index и columns. При дублях он падает, что часто указывает на неверную гранулярность. pivot_table умеет агрегировать такие строки через aggfunc; по умолчанию это среднее, поэтому функцию лучше задавать явно. fill_value применяют лишь когда отсутствие комбинации действительно означает ноль. Несколько значений или агрегатов могут создать MultiIndex в колонках.


Назовите магические команды Jupiter.

Вот несколько магических команд в Jupyter:

  1. %matplotlib inline: Включает отображение графиков Matplotlib в блокноте.

  2. %%time: Измеряет время выполнения кодовой ячейки.

  3. %timeit: Повторяет выполнение кода несколько раз и измеряет среднее время выполнения.

  4. %load: Загружает код из файла в текущую ячейку.

  5. %run: Запускает код Python из файла.

  6. %reset: Очищает пространство имен.

  7. %%html: Отображает HTML-разметку из ячейки.

  8. %pdb: Запускает отладчик Python (pdb).

  9. %magic: Выводит список всех магических команд.


Чем отличается % от %%?

В Jupyter Notebook магические команды начинаются либо с одного знака процента %, либо с двух знаков процента %%. Разница между ними в том, что % используется для магических команд, применяемых к одной строке кода, а %% применяется к целой ячейке кода.


Хорошо знакомы с Scikit-Learn?

В ответе укажите свой уровень работы со scikit-learn и конкретный пример. Библиотека предоставляет модели классификации, регрессии и кластеризации, преобразования данных, метрики, кросс-валидацию и подбор гиперпараметров. Не приписывайте себе практический опыт с инструментами, которые только изучали.


Какие техники с точки зрения проверки качества моделей используете (в Scikit-Learn)?

Для проверки качества моделей в scikit-learn доступны следующие инструменты. В личном ответе выберите те, которыми пользовались.

  1. Кросс-валидация: Позволяет оценить производительность модели на разных подмножествах данных, уменьшая вероятность переобучения и обобщая ее качество.

  2. Метрики оценки качества: В зависимости от задачи (классификация, регрессия и т. д.) использую различные метрики, такие как accuracy, precision, recall, F1-score, ROC AUC, MSE и другие, чтобы оценить качество модели.

  3. Grid Search и Random Search: Позволяют подобрать оптимальные гиперпараметры модели, исследуя пространство параметров и выбирая те, которые приводят к наилучшей производительности.

  4. Learning Curves: Позволяют визуально оценить, как изменение размера обучающего набора данных влияет на производительность модели, помогая выявить проблемы с переобучением или недообучением.

  5. Confusion Matrix: Позволяет оценить производительность классификационных моделей, выявляя количество верных и ошибочных предсказаний для каждого класса.


Знакомы с pipeline из Scikit-Learn?

Pipeline объединяет преобразования и итоговый estimator. В ответе приведите пример своего использования, если он есть.

Pipeline представляет собой последовательность шагов обработки данных и моделирования, которые автоматически применяются к данным в заданном порядке. Она позволяет объединить несколько этапов работы с данными, таких как предобработка, извлечение признаков и построение модели, в один интегрированный процесс.

Собеседования: Data Science

Смотри записи интервью, узнай, какие вопросы задают и как отвечают кандидаты.

Вопросы и ответы

Не нашли ответ? Напишите мне в чат. Я делаю Шпаргалку и сам отвечаю на сообщения. Расскажите, что не работает или чего вам не хватает. Может, смогу сразу взять это в работу.

Откуда взяты вопросы?

Из реальных собеседований. Основой подборки стал опыт Вадима Новосёлова: он проходил интервью и записывал вопросы. Подробнее о материалах.

Насколько эти вопросы актуальны?

Эти вопросы встречались нам на реальных собеседованиях в 2025 году. Мы регулярно проходим собеседования и пополняем подборку новыми вопросами. Основы профессии и ключевые технологии остаются востребованными годами, а детали конкретных инструментов и версий стоит сверять с текущей документацией.

На какой уровень рассчитана подборка?

Мы проходили собеседования на вакансии уровня Middle+, а иногда и на Senior-позиции. Вопросы из этих интервью вошли в подборку. Направления работы: Data Scientist, ML-инженер. Глубина обсуждения зависит от вакансии: будь готов объяснить основную идею, привести практический пример и разобрать ограничения и альтернативы решения.

Этот вопрос точно будет на моём собеседовании?

Гарантии нет: набор вопросов зависит от компании, задач команды, уровня вакансии и самого интервьюера. Эти вопросы уже встречались на реальных собеседованиях, но на твоём интервью ту же тему могут проверить другой формулировкой, практической задачей или обсуждением твоего опыта. Используй подборку, чтобы разобраться в теме: объясняй идею своими словами, приводи примеры и готовься обсудить ограничения и альтернативы решения. Так будет проще ответить и на знакомый вопрос, и на неожиданные уточнения.