PythonJupyterинструменты

Jupyter Notebook для аналитика: гайд с нуля

2026-07-11 12 мин

Если коротко: Jupyter Notebook нужен аналитику, потому что он держит рядом код, таблицу, график и текст — в одном живом документе. Вы пишете пару строк на Python, тут же видите датафрейм, строите гистограмму, дописываете абзац с выводом. Получается черновик исследования, который можно переоткрыть через месяц и понять, что вы вообще считали и почему. Обычный скрипт .py так не умеет: он выполняется целиком и выдаёт результат в конце, а мысль между шагами теряется. Ниже разберу, как ноутбук устроен, где он подставляет новичков и как держать его в порядке, чтобы к пятнице он не превратился в свалку из тридцати ячеек, половина которых больше не запускается.

Зачем аналитику вообще нужен Jupyter Notebook?

Работа аналитика — это не «написал программу и запустил». Это диалог с данными: загрузил, посмотрел, удивился, отфильтровал, пересчитал, построил график, снова удивился. Ноутбук идеально ложится на этот цикл, потому что каждая ячейка выполняется отдельно и сразу показывает результат под собой. Не нужно гонять весь файл ради одной строки — поменял агрегацию, нажал Shift+Enter, увидел новую таблицу.

Второй смысл — ноутбук совмещает вычисление и рассказ. Вы не просто считаете конверсию, вы объясняете рядом, почему берёте именно этот сегмент и что означает провал в марте. Когда результат уходит продакту или тимлиду, он читается как история с картинками, а не как голый вывод функции. Для разовых исследований, разбора A/B-теста или проверки гипотезы это незаменимо. А вот регулярный продакшн-ETL в ноутбуке держать не стоит — там уже нужен нормальный скрипт с тестами. Если хочется просто потрогать Python прямо в браузере без установки, у нас для этого есть интерактивный тренажёр Python, но для настоящей работы ноутбук вы всё равно поставите локально.

Как устроены ячейки code и markdown?

Ноутбук — это последовательность ячеек. Основных типов два: code и markdown.

Ячейка code содержит Python и при запуске выполняется, а её результат появляется прямо под ней — будь то число, датафрейм или график. Слева стоит счётчик вроде In [5], а результат помечается Out [5]. Число в скобках — это не номер ячейки на экране, а порядковый номер выполнения. Запомните этот момент, он аукнется в разделе про грязное состояние.

import pandas as pd

orders = pd.read_csv("orders.csv", parse_dates=["created_at"])
orders.head()

Последнее выражение в ячейке Jupyter покажет автоматически, без print. Если написать имя датафрейма в конце — увидите красивую HTML-таблицу. Если нужно вывести что-то из середины ячейки, тогда уже print обязателен.

Ячейка markdown — это текст: заголовки, списки, ссылки, выделения. Именно она превращает ноутбук из простыни кода в читаемый документ. Пишете в ней обычный markdown, запускаете тем же Shift+Enter — и вместо исходника видите отрендеренный текст.

## Разбор оттока за Q2

Смотрю пользователей, у которых не было ни одного события 30 дней.
Гипотеза: провал связан с релизом 12 апреля.

Хорошая привычка — заголовком markdown отбивать каждый смысловой блок анализа: «Загрузка данных», «Чистка», «Проверка гипотезы». Тогда ноутбук читается сверху вниз как отчёт.

Что такое магические команды и зачем %timeit и %matplotlib?

Магические команды — это встроенные в Jupyter шорткаты, которые начинаются с процента. Они не часть Python, а надстройка ноутбука, и решают бытовые задачи: замерить время, настроить графики, подгрузить расширение.

Строчные магии начинаются с одного % и действуют на одну строку. Например, %timeit многократно прогоняет выражение и показывает среднее время — удобно, когда сомневаешься, какой из двух способов агрегации быстрее.

%timeit orders.groupby("user_id")["amount"].sum()

Ячейковые магии начинаются с двойного %% и действуют на всю ячейку. %%time покажет, сколько выполнялась ячейка целиком — незаменимо, когда тяжёлый merge подвисает и хочется понять, он ли виноват.

%%time
big = orders.merge(users, on="user_id", how="left")
big = big[big["created_at"] >= "2026-01-01"]

Отдельно стоит %matplotlib inline — она говорит рисовать графики прямо под ячейкой, а не открывать их в отдельном окне. В современных сборках это часто включено по умолчанию, но если график не появляется, первым делом добавьте эту строку в начало. Из полезного ещё %who (показать все определённые переменные) и %load_ext autoreload с %autoreload 2 — если вы правите свой .py-модуль рядом, ноутбук будет подхватывать изменения без перезапуска ядра.

Какие горячие клавиши реально экономят время?

Ноутбук живёт в двух режимах. Command mode (жмёте Esc, рамка ячейки синяя) — управляете ячейками целиком. Edit mode (жмёте Enter, рамка зелёная) — редактируете код внутри. Половина мучений новичка — от того, что он не понимает, в каком режиме находится.

Вот минимум, который стоит довести до автоматизма:

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

Почему порядок выполнения ячеек ломает ноутбук?

Это главная ловушка Jupyter, на которой обжигаются все. Ячейки на экране расположены сверху вниз, но выполняются они в том порядке, в каком вы нажимали Shift+Enter. Ноутбук помнит не расположение, а состояние ядра — то есть все переменные, которые вы успели создать в текущей сессии.

Представьте: вы наверху написали df = pd.read_csv(...), потом внизу отфильтровали df = df[df["amount"] > 0], потом вернулись наверх и снова запустили фильтрующую ячейку. Теперь df отфильтрован дважды — а вы этого не видите, потому что на экране всё выглядит логично. Счётчики In [12], In [3], In [20] идут вразнобой, и это первый признак, что ноутбук в «грязном состоянии».

Ещё коварнее — удалённые ячейки. Вы создали переменную, поработали с ней, ячейку стёрли. Но сама переменная осталась в памяти ядра, и следующий код продолжает на неё опираться. Ноутбук работает, вы радуетесь. А коллега открывает файл, запускает сверху вниз — и получает NameError, потому что переменная нигде не определена. Классика.

Лекарство одно и простое: регулярно делайте Restart & Run All (в меню Kernel). Эта команда сбрасывает память и прогоняет все ячейки заново сверху вниз. Если ноутбук отработал без ошибок — состояние честное. Если упал — вы только что нашли скрытый баг, пока он не всплыл на демо.

# После Restart & Run All всё должно пройти линейно:
df = pd.read_csv("orders.csv")
df = df[df["amount"] > 0]
dau = df.groupby(df["created_at"].dt.date)["user_id"].nunique()

Как не превратить ноутбук в кашу?

Каша заводится сама, если не сопротивляться. Несколько правил, которые правда работают.

Первое — держите ноутбук линейным. Пишите так, чтобы он читался и выполнялся строго сверху вниз, без прыжков. Все импорты — в первой ячейке, а не разбросаны по файлу.

Второе — почаще делайте Restart & Run All, хотя бы раз в час и обязательно перед тем, как отдавать результат. Это ваша проверка, что вы не обманываете сами себя остатками старых переменных.

Третье — короткие ячейки на одну мысль. Загрузка — отдельно, чистка — отдельно, расчёт метрики — отдельно. Когда всё свалено в одну ячейку на сорок строк, вы теряете главный плюс ноутбука: возможность перезапустить маленький кусок.

Четвёртое — как только код становится длинным и повторяется, выносите его в функцию, а лучше в отдельный .py-файл рядом. Ноутбук хорош для исследования, но не для хранения бизнес-логики. Если один и тот же расчёт DAU копипастится в трёх ячейках — самое время сделать функцию calc_dau(df).

Пятое — не забывайте про markdown-заголовки. Разбитый на разделы ноутбук читать в разы приятнее, чем сплошную ленту кода. Чтобы набить руку на самих pandas-конструкциях для этих ячеек, удобно параллельно решать задачи по Python и подсматривать в справочник Python.

JupyterLab или классический Notebook — что выбрать?

Классический Jupyter Notebook — это тот самый интерфейс с одной вкладкой и лентой ячеек. Он лёгкий, привычный и до сих пор живой. JupyterLab — следующее поколение того же проекта: полноценная рабочая среда с файловым деревом слева, вкладками, возможностью открыть несколько ноутбуков и терминал рядом, перетаскивать панели.

Для нового человека я советую сразу JupyterLab. Он ставится той же командой (pip install jupyterlab, запуск через jupyter lab), формат файлов .ipynb тот же самый, а работать удобнее: видно проект целиком, легко таскать графики и держать под рукой документацию. Классический Notebook имеет смысл, если у вас слабая машина или вы подключаетесь к чужому серверу, где стоит именно он.

Есть ещё вариант открывать .ipynb в редакторе кода вроде VS Code — там ноутбуки поддерживаются нативно, и многим так удобнее совмещать с обычными скриптами. Формат везде один, так что перепрыгивать между средами можно без боли: файл .ipynb откроется хоть в Lab, хоть в классике, хоть в редакторе. Выбор — вопрос привычки, а не совместимости.

Как экспортировать ноутбук и обеспечить воспроизводимость?

Экспорт нужен, когда результат уходит человеку, у которого нет Jupyter. Штатный инструмент — nbconvert. Он превращает .ipynb в HTML (открывается в любом браузере, с графиками и таблицами), в .py (чистый скрипт без вывода) или в другие форматы.

jupyter nbconvert --to html analysis.ipynb
jupyter nbconvert --to script analysis.ipynb

HTML удобно отправлять как отчёт: получатель видит и код, и результаты, ничего не устанавливая. Экспорт в .py полезен, когда исследование доросло до продакшна и его пора переносить в нормальный скрипт.

Воспроизводимость — отдельная тема, и на собеседованиях её любят спрашивать, так что загляните в разбор частых вопросов для аналитика. Смысл в том, чтобы другой человек (или вы через полгода) получил ровно те же числа. Что для этого делаю я:

import numpy as np
np.random.seed(42)

sample = orders.sample(frac=0.1, random_state=42)

И последнее: чистите вывод перед тем, как класть ноутбук в общий репозиторий (Cell → All Output → Clear). Тяжёлые графики и таблицы раздувают файл и мешают смотреть изменения. Хорошая практика в анализе, к слову, ровно та же, что и в SQL — воспроизводимый запрос вместо «я там руками подкрутил»; если хочется потренировать эту дисциплину на запросах, есть SQL-тренажёр и подборка кейсов с реальными задачами.

Ноутбук — это половина ремесла аналитика; вторая половина — уверенный Python и SQL под ним. Если хотите прокачать и то и другое системно, с проверкой решений и разбором реальных собеседовательных задач, в Pro открыты все 402 Python-задачи, 425 SQL и кейсы без ограничений — но и на бесплатном доступе вполне можно начать и почувствовать формат.

Закрепи Python на задачах
402 Python-задачи через pandas/numpy/scipy — попробуй бесплатно.
Python-тренажёр →