Если коротко: 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, рамка зелёная) — редактируете код внутри. Половина мучений новичка — от того, что он не понимает, в каком режиме находится.
Вот минимум, который стоит довести до автоматизма:
Shift+Enter— выполнить ячейку и перейти к следующей.Ctrl+Enter— выполнить и остаться на месте (удобно перезапускать одну и ту же ячейку, подкручивая параметр).Alt+Enter— выполнить и вставить новую ячейку снизу.- В command mode:
A— вставить ячейку сверху,B— снизу,DD(два раза D) — удалить. M— превратить ячейку в markdown,Y— обратно в code.Z— отменить удаление ячейки (спасает нервы).Ctrl+/— закомментировать выделенные строки.
Отдельно советую освоить 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 полезен, когда исследование доросло до продакшна и его пора переносить в нормальный скрипт.
Воспроизводимость — отдельная тема, и на собеседованиях её любят спрашивать, так что загляните в разбор частых вопросов для аналитика. Смысл в том, чтобы другой человек (или вы через полгода) получил ровно те же числа. Что для этого делаю я:
- Перед тем как отдать ноутбук, всегда Restart & Run All — проверяю, что он честно проходит сверху вниз.
- Фиксирую версии библиотек. Хотя бы
pip freeze > requirements.txt, чтобы у коллеги встал тот же pandas. - Ставлю seed там, где есть случайность — сэмплирование, сплит на A/B.
np.random.seed(42)илиrandom_state=42в методах pandas и sklearn. Иначе цифры будут плясать от запуска к запуску. - Не завязываюсь на ручные шаги «а тут я поправил файлик в Excel». Вся обработка — кодом в ноутбуке, чтобы её можно было повторить.
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 и кейсы без ограничений — но и на бесплатном доступе вполне можно начать и почувствовать формат.