---
title: Python-инструменты Data Scientist
questionDates:
  q-transfer-0003: '2026-10-01'
  q-transfer-0004: '2026-10-01'
  q-transfer-0005: '2026-10-01'
seo:
  description: >-
    Тема «Python-инструменты Data Scientist» для собеседования Data Scientist.
    Как можно ускорить процесс последовательного добавления большого количества
    объектов к списку в Python с использованием библиотеки NumPy? Чем отличается
    % от %%?
  title: Python-инструменты Data Scientist — Data Scientist
---

[Все темы Data Scientist](/prep/data-scientist)

Подтемы:

- [NumPy](#q-14bee738d69b8178a1b8cd0cc242d77b)
- [Pandas](#q-14bee738d69b81b8a1c3cdec0e893131)
- [Работа в Jupyter](#q-14bee738d69b812f9b6deb8772e3dba6)
- [Scikit-Learn](#q-14bee738d69b81218719cd43744b836f)

## <strong>Как можно ускорить процесс последовательного добавления большого количества объектов к списку в Python с использованием библиотеки NumPy?</strong> [#q-14bee738d69b8178a1b8cd0cc242d77b]

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

:::note[Ссылки для изучения]

1. [NumPy: предварительное выделение и новый массив при append](https://mipt-stats.gitlab.io/courses/python/05_numpy.html)
   :::

---

## Что быстрее для числового DataFrame&#58; df\*\*2 или df.apply(lambda x&#58; x\*\*2), и почему? [#q-14bee738d69b81b8a1c3cdec0e893131]

Использование операции <code>df\*\*2</code> будет быстрее, чем <code>df&#46;apply&#40;lambda x&#58; x\*\*2&#41;</code>, потому что операция <code>df\*\*2</code> векторизована и выполняется нативно на массивах NumPy, в то время как <code>apply</code> применяет функцию к каждой строке или столбцу отдельно, что менее эффективно.

:::note[Ссылки для изучения]

1. [Числовые операции NumPy над массивом вместо Python-цикла](https://mipt-stats.gitlab.io/courses/python/05_numpy.html)
1. [Pandas: арифметика над Series и колонками DataFrame](https://education.yandex.ru/handbook/python/article/modul-pandas)
   :::

---

## <strong>Какая концепция эффективного Pandas? Как хорошо и красиво писать код на Pandas?</strong> [#q-14bee738d69b8174a037c1897a346ead]

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

1. <strong>Векторизация операций</strong>&#58; Используйте встроенные методы
   Pandas для выполнения операций на всем DataFrame или Series одновременно,
   избегая явных циклов Python.

1. <strong>Использование методов работы с данными</strong>&#58; Вместо циклов
   Python используйте методы Pandas, такие как <code>apply&#40;&#41;</code>,
   <code>map&#40;&#41;</code>, <code>groupby&#40;&#41;</code> и др., для
   выполнения операций над данными более эффективно.

1. <strong>Оптимизация работы с памятью</strong>&#58; Используйте различные
   методы для уменьшения потребления памяти, такие как использование более
   компактных типов данных, удаление ненужных столбцов или строк и загрузка
   данных порциями при необходимости.

1. <strong>Использование индексации и селекции</strong>&#58; Используйте
   индексацию и селекцию для эффективного доступа к данным, избегая
   использования циклов и лишних операций копирования.

1. <strong>Применение эффективных алгоритмов</strong>&#58; Используйте
   оптимизированные алгоритмы Pandas для выполнения сложных операций, таких как
   слияние таблиц, объединение и группировка данных.

1. <strong>Обработка пропущенных данных</strong>&#58; Используйте методы Pandas
   для обработки пропущенных данных, такие как <code>fillna&#40;&#41;</code>,
   <code>dropna&#40;&#41;</code> и <code>interpolate&#40;&#41;</code>, чтобы
   гарантировать целостность и точность анализа.

1. <strong>Использование цепочек методов (method chaining)</strong>&#58;
   Используйте цепочки методов для создания более компактного и читаемого кода,
   избегая лишних промежуточных переменных.

:::note[Ссылки для изучения]

1. [Pandas: операции над колонками, фильтрация и агрегация](https://education.yandex.ru/handbook/python/article/modul-pandas)
1. [Векторизация числовых массивов NumPy](https://mipt-stats.gitlab.io/courses/python/05_numpy.html)
1. [Читаемые цепочки преобразований Pandas через pipe](https://zasqlpython.ru/python-spravochnik/pipe)
   :::

---

## <strong>Как работают в Pandas'е методы&#58;</strong> <code>assign</code><strong>,</strong> <code>pipe</code><strong>?</strong> [#q-14bee738d69b811bac0be9884e3d0f95]

Метод <code>assign&#40;&#41;</code> в Pandas используется для создания новых столбцов в DataFrame на основе существующих данных. Он принимает именованные аргументы в виде выражений или функций, которые определяют значения новых столбцов. Метод возвращает новый DataFrame с добавленными столбцами.

<strong>Например&#58;</strong>

```python
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).

<strong>Например&#58;</strong>

```python
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)
```

:::note[Ссылки для изучения]

1. [assign: вычисляемые колонки в новой таблице](https://education.yandex.ru/handbook/python/article/modul-pandas)
1. [pipe: вызов функции над DataFrame и возврат её результата](https://zasqlpython.ru/python-spravochnik/pipe)
   :::

---

## <strong>Какой аналог</strong> <code>LEFT JOIN</code> <strong>в Pandas, если хотим пару DataFrame объединить?</strong> [#q-14bee738d69b81a5a5affeddbdf46b8e]

В Pandas аналогом операции LEFT JOIN является метод <code>merge&#40;&#41;</code>, который позволяет объединять два DataFrame по заданным ключам, сохраняя все строки из левого DataFrame и соответствующие строки из правого DataFrame, если ключи совпадают.

<strong>Например&#58;</strong>

```python
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')
```

В этом примере <code>df1</code> и <code>df2</code> объединяются по ключу <code>&#39;key&#39;</code>, и результатом будет DataFrame, содержащий все строки из <code>df1</code> и только соответствующие им строки из <code>df2</code>.

:::note[Ссылки для изучения]

1. [LEFT JOIN в Pandas: merge с how=left и ключами](https://habr.com/ru/articles/475210/)
   :::

---

## Чем groupby.transform отличается от groupby.agg в Pandas? [#q-transfer-0003]

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

:::note[Ссылки для изучения]

1. [Pandas: агрегация groupby.agg и возврат групповой суммы в каждую строку через transform](https://habr.com/ru/articles/475210/)
   :::

---

## Чем loc отличается от iloc в Pandas? [#q-transfer-0004]

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

:::note[Ссылки для изучения]

1. [loc и iloc в Pandas: выбор по меткам и позициям, различие границ среза](https://habr.com/ru/companies/ods/articles/322626/)
   :::

---

## Чем pivot отличается от `pivot_table` в Pandas? [#q-transfer-0005]

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

:::note[Ссылки для изучения]

1. [pivot и pivot_table: ошибка дублирующихся сочетаний и агрегация через aggfunc](https://habr.com/ru/articles/713506/)
   :::

---

## <strong>Назовите магические команды Jupiter.</strong> [#q-14bee738d69b812f9b6deb8772e3dba6]

Вот несколько магических команд в Jupyter&#58;

1. <code>&#37;matplotlib inline</code>&#58; Включает отображение графиков
   Matplotlib в блокноте.

1. <code>&#37;&#37;time</code>&#58; Измеряет время выполнения кодовой ячейки.

1. <code>&#37;timeit</code>&#58; Повторяет выполнение кода несколько раз и
   измеряет среднее время выполнения.

1. <code>&#37;load</code>&#58; Загружает код из файла в текущую ячейку.

1. <code>&#37;run</code>&#58; Запускает код Python из файла.

1. <code>&#37;reset</code>&#58; Очищает пространство имен.

1. %%html&#58; Отображает HTML-разметку из ячейки.

1. <code>&#37;pdb</code>&#58; Запускает отладчик Python (pdb).

1. <code>&#37;magic</code>&#58; Выводит список всех магических команд.

:::note[Ссылки для изучения]

1. [Магические команды IPython: списки, запуск файлов и измерение времени](https://habr.com/ru/companies/wunderfund/articles/316826/)
   :::

---

## <strong>Чем отличается</strong> <code>&#37;</code> <strong>от</strong> <code>&#37;&#37;</code><strong>?</strong> [#q-14bee738d69b81948a9cf29d98d5f8ae]

В Jupyter Notebook магические команды начинаются либо с одного знака процента <code>&#37;</code>, либо с двух знаков процента <code>&#37;&#37;</code>. Разница между ними в том, что <code>&#37;</code> используется для магических команд, применяемых к одной строке кода, а <code>&#37;&#37;</code> применяется к целой ячейке кода.

:::note[Ссылки для изучения]

1. [Магические команды в Jupyter](https://mipt-stats.gitlab.io/courses/python/02_jupyter.html)
   :::

---

## <strong>Хорошо знакомы с Scikit-Learn?</strong> [#q-14bee738d69b81218719cd43744b836f]

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

:::note[Ссылки для изучения]

1. [Scikit-learn: fit, predict, преобразования и оценка моделей](https://scikit-learn.ru/stable/getting_started.html)
   :::

---

## <strong>Какие техники с точки зрения проверки качества моделей используете (в Scikit-Learn)?</strong> [#q-14bee738d69b8152a210ead2196ba0fe]

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

1. <strong>Кросс-валидация</strong>&#58; Позволяет оценить производительность
   модели на разных подмножествах данных, уменьшая вероятность переобучения и
   обобщая ее качество.

1. <strong>Метрики оценки качества</strong>&#58; В зависимости от задачи
   (классификация, регрессия и т. д.) использую различные метрики, такие как
   accuracy, precision, recall, F1-score, ROC AUC, MSE и другие, чтобы оценить
   качество модели.

1. <strong>Grid Search и Random Search</strong>&#58; Позволяют подобрать
   оптимальные гиперпараметры модели, исследуя пространство параметров и выбирая
   те, которые приводят к наилучшей производительности.

1. <strong>Learning Curves</strong>&#58; Позволяют визуально оценить, как
   изменение размера обучающего набора данных влияет на производительность
   модели, помогая выявить проблемы с переобучением или недообучением.

1. <strong>Confusion Matrix</strong>&#58; Позволяет оценить производительность
   классификационных моделей, выявляя количество верных и ошибочных предсказаний
   для каждого класса.

:::note[Ссылки для изучения]

1. [Оценка моделей: train/test и кросс-валидация](https://scikit-learn.ru/stable/modules/cross_validation.html)
   :::

---

## <strong>Знакомы с pipeline из Scikit-Learn?</strong> [#q-14bee738d69b815fb058d695972bf236]

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

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

:::note[Ссылки для изучения]

1. [Pipeline: последовательность преобразований и модель](https://scikit-learn.ru/stable/modules/compose.html)
   :::
