Скачать ipynb
02_jupyter

Python для анализа данных

1. О том, что такое Jupyter Notebook

В ноутбуке есть интерактивный контент, в связи с чем его рекомендуется просматривать его в jupyter notebook/lab.

jupyter_art.png

"Why Jupyter is data scientists’ computational notebook of choice" — статья с таким заголовком вышла в октябрьском номере Nature в 2018 году. Она посвящена Jupyter Notebook — опенсорсному веб-приложению для интерактивной разработки, которое за последние несколько лет покорило сердца миллионов и стало де-факто стандартом в аналитике, науке о данных, машинном обучении и много где ещё. Количество .ipynb-файлов на GitHub выросло с $2 \cdot 10^5$ в 2015 году до $2.5 \cdot 10^6$ в 2018. Ниже мы разберём основные причины такой взрывной популярности:

Лабораторный журнал 21 века

Работа аналитика или учёного отличается от индустриальной разработки отсутствием чёткого техзадания. В этих сферах правильная постановка задачи это уже половина решения. На начальную фазу — тщательный анализ исходных данных (exploratory data analysis (EDA)) и последующую постановку гипотез — уходит много времени. Как следствие, до самого конца неясно, как организовать процесс разработки: что в итоге важно, а о чём можно будет забыть. В таких условиях тратить силы на скурпулёзное написание кода бессмысленно — на первый план выходит умение быстро прототипировать, ставить эксперименты. Кроме того, свои результаты приходится постоянно презентовать как коллегам, там и заказчику или начальству. Jupyter Notebook убивает этих двух зайцев одним выстрелом:

jupyter_lab.png

По своей сути Jupyter это интерактивный лабораторный журнал: он позволяет создавать отчёт с помощью markdown с формулами из latex, писать и запускать в нем код, дополнять отчет иллюстрациями, в том числе интерактивными, пересчитывать всё на лету и обмениваться результатами в читаемом формате. Это дало новую жизнь парадигме reproducible research — в формате .ipynb или R-Markdown пишут статьи и даже книги, где заинтересованный читатель может сразу же воспроизводить описанные результаты. Автор не уверен, что впечатляет его больше — потенциальный полёт человечества к Юпитеру или то, насколько более демократичной Jupyter Notebook сделал высокую науку. Которая, к слову, страдает от того, что 70% учёных не смогли воспроизвести чужие результаты, а ещё 50% — свои согласно опросу в Nature.

Нелинейная последовательность исполнения

Jupyter позволяет запускать клетки с кодом в произвольном порядке и, в отличие от IPython, в нём это делать удобно. Конечно, это повышает требования к разработчику, который должен помнить, какая конкретно последовательность ячеек решает задачу, и провоцирует писать очень плохой код, но в реалиях, когда полный перезапуск пайплайна требует нескольких часов на суперкомпьютере, это не прихоть, а необходимость.

Вавилонская башня от программирования

Вопреки расхожему мнению, Jupyter поддерживает не только Julia, Python и R (Ju-Py-teR, именно потому), но более 40 языков, включая C++, да-да, компилируемый язык, check it out. Более того, для того, чтобы писать код на нескольких языках одновременно, обычно это Bash, Python и R, не нужно создавать разные ноутбуки. Это инструмент, который не ограничивает возможности разработчика.

Переносимость и платформонезависимость

Jupyter позволяет развернуть дружелюбный интерфейс на любой удалённой машине, от учебного сервера до гигантской распределённой map-reduce сети. Учитывая, что работать с данными на своём ноутбуке почти никогда не приходится, что либо нельзя контракту, либо в оперативку не влезает, возможность оставить в прошлом сумрачную серверную консоль многие восприняли с облегчением. В сочетании с инструментами в духе conda, jupyter позволяет развернуть привычное и настроенное под себя окружение, не задумываясь о том, с каким железом и в какой системе приходится работать. Более того, Jupyter Hub позволяет создать точку входа, через которую над проектом могут совместно работать несколько человек. Это позволяет специалисту настроить окружение один раз, после чего им смогут пользоваться сотни человек. Неудивительно, что многие онлайн-курсы переходят на формат jupyter-ноутбуков.

Вывод

Jupyter-ноутбуки это мощный инструмент, который облегчит вашу жизнь. Тем не менее, работа с ним требует дисциплины. Далее разберём как best practices, так и распространённые антипаттерны, которых следует избегать.

Мы разберём такие темы как:

  1. jupyter_contrib_nbextensions — плагины, которые превращают jupyter в удобный кодовый редактор;
  2. основы работы с командной строкой (здесь jupyter похож на vim);
  3. jupyter magics — метаязык, который позволяет навешивать триггеры на клетки и интерактивно менять переменные окружения. Если простыми словами, то эта штука позволяет засекать время исполнения клеток, менять формат отображения графиков, запускать внешние скрипты и многое другое, что обычно делают через терминал.

2. Основы

Установка всего необходимого в conda-env обсуждалась в прошлом ноутбуке. Для того, чтобы поднять jupyter-сервер, активируйте conda-env и наберите в терминале:

jupyter notebook

Когда вы откроете jupyter-ноутбук, в меню Help можно будет найти интерактивные вводные руководства. Советуем ознакомиться с ними, если интерфейс вам вновинку.

Всего ячейки бывают трёх типов:

  • code — собственно, код;
  • markdown — текст с формулами на latex (в одинарных или двойных $);
  • raw — неформатированный текст.

Изменить тип можно либо в меню (Cell —> Cell Type), либо с помощью клавиатурных сокращений (см. ниже). В целом, базовый интерфейс довольно интуитивный, в нём полезно разобраться самостоятельно.

3. Плагины

Встроенный редактор довольно удобный, но с плагинами он становится по-настоящему хорош. Установка библиотеки jupyter_contrib_nbextensions, которая отвечает за поддержку плагинов, освещалась в прошлом ноутбуке. Давайте разберёмся, какие плагины из стандартного списка наиболее полезны:

  • Ruler — отображает красным границу в 80 символов в строке. Этот плагин нужно поставить обязательно, чтобы не расстраивать проверяющих тем, что при конвертации в pdf у вас опять что-то не влезло в одну строку.
  • Codefolding, Codefolding in editor — незаменимый плагин, который позволяет сворачивать код для лучшей читаемости.
  • ExecuteTime — автоматически запоминает, когда ячейка начала выполняться и сколько времени это заняло.
  • Notify — посылает push-уведомление в браузере, когда ячейка закончила выполняться. Если она отрабатывала достаточно долго.
  • Move selected cells — позволяет одновременно перемещать выделенные ячейки вверх или вниз.
  • Limit Output — ограничивает размер вывода ячейки. С этим плагином всё не упадёт, если из-за ошибки в коде вы решите распечатать многогигабайтную таблицу прямо в окошке браузера, что бывает чаще, чем хотелось бы.

Этим список плагинов не исчерпывается, остальные можете выбрать на свой вкус.

4. Работа с командной строкой Jupyter

Command mode

В jupyter есть command mode — режим, где можно вводить команды для быстрого редактирования текста. Как и в vim, из которого эта концепция была позаимствована, его можно активировать кнопкой Esc, после чего возможны варианты. Esc + h откроет справку:

command_mode.png

В ней перечислено много команд, из которых чаще всего используются такие:

  • Esc + F — найти и заменить;
  • Esc + I — прервать исполнение;
  • Esc + 0 — перезапустить ядро;
  • Esc + Shift + ↑↓ — выделить ячейку выше/ниже текущей;
  • Esc + Ctrl + Enter — запустить выделенные ячейки (в естественном порядке);
  • Esc + D + D — удалить все выделенные ячейки (включая текущую);
  • Esc + Z — отменить удаление ячеек;
  • Esc + C — скопировать выделенные ячейки;
  • Esc + X — вырезать выделенные ячейки;
  • Esc + V — вставить ранее скопированные ячейки;
  • Esc + A — вставить ячейку выше;
  • Esc + B — вставить ячейку ниже;
  • Esc + Shift + M — объединить выделенные ячейки (или текущую ячейку с нижней);
  • Esc + M — заменить код на markdown;
  • Esc + Y — наоборот, markdown —> код.

Edit mode

Эти сокращения доступны в редакторе. Здесь всё стандартно. Если вы не привыкли пользоваться такими сокращениями, то настоятельно рекомендуем потратить время и научиться: это сэкономит вам много времени в будущем.

edit_mode.png

Самые полезные команды (кроме очевидных) таковы:

  • Shift + Tab — показать описание функции, курсор должен стоять сразу после открывающей скобки;
  • Ctrl + / — закомментировать строку;
  • Ctrl + D — удалить строку;
  • Ctrl + ↑ — перейти к началу ячейки;
  • Ctrl + ↓ — перейти к концу ячейки;
  • Ctrl + Shift + - — разбить ячейку по текущей строке;
  • Shift + ↑↓ — выделить ячейку выше/ниже текущей;
  • Ctrl + Enter — запустить выделенные ячейки;
  • Shift + Enter — запустить ячейку и перейти на одну ниже, что удобно, когда последовательно запускаете сразу много.

5. Магия Jupyter

jupyter magics — метаязык, команды которого обычно начинаются с % или %%.Работают они или нет — зависит от реализации. Стандартные jupyter-magics поставляются с ядром IPython. Для других языков или ядер набор команд может быть другим.

Давайте посмотрим, какие команды есть.

P.S. Если вам захочется узнать больше, можете посмотреть замечательный доклад с PyCon Canada.

In [ ]:
%lsmagic
Out[ ]:
Available line magics:
%alias  %alias_magic  %autoawait  %autocall  %automagic  %autosave  %bookmark  %cat  %cd  %clear  %colors  %conda  %config  %connect_info  %cp  %debug  %dhist  %dirs  %doctest_mode  %ed  %edit  %env  %gui  %hist  %history  %killbgscripts  %ldir  %less  %lf  %lk  %ll  %load  %load_ext  %loadpy  %logoff  %logon  %logstart  %logstate  %logstop  %ls  %lsmagic  %lx  %macro  %magic  %man  %matplotlib  %mkdir  %more  %mv  %notebook  %page  %pastebin  %pdb  %pdef  %pdoc  %pfile  %pinfo  %pinfo2  %pip  %popd  %pprint  %precision  %prun  %psearch  %psource  %pushd  %pwd  %pycat  %pylab  %qtconsole  %quickref  %recall  %rehashx  %reload_ext  %rep  %rerun  %reset  %reset_selective  %rm  %rmdir  %run  %save  %sc  %set_env  %store  %sx  %system  %tb  %time  %timeit  %unalias  %unload_ext  %who  %who_ls  %whos  %xdel  %xmode

Available cell magics:
%%!  %%HTML  %%SVG  %%bash  %%capture  %%debug  %%file  %%html  %%javascript  %%js  %%latex  %%markdown  %%perl  %%prun  %%pypy  %%python  %%python2  %%python3  %%ruby  %%script  %%sh  %%svg  %%sx  %%system  %%time  %%timeit  %%writefile

Automagic is ON, % prefix IS NOT needed for line magics.

А если вы хотите почитать краткую справку по IPython, используйте команду

In [ ]:
%quickref

Видно, что команды делятся на два типа: line magics и cell magics. Как следует из названия, разница между ними в том, что cell magics влияют на состояние всей ячейки, и работают только если написаны в самом её начале, в то время как line magics могут быть написаны в любом месте и либо влияют на строку с кодом, скажем, замеряют время исполнения, как %timeit, либо выполняют какую-то системную команду (как %ls). Если вы забыли, что делает конкретная команда, то добавьте перед ней знак вопроса — откроется справка.

In [ ]:
?%time

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

In [ ]:
?range

Давайте посмотрим на эти команды поближе:

%load_ext, %autoreload

%load_ext позволяет загружать сторонние модули (например, Cython). Нам важно, что с её помощью можно активировать самую важную команду — %autoreload. Без неё вам пришлось бы перезапускать ядро каждый раз, когда вы меняете библиотеки со своим кодом. autoreload делает это за вас, в больших проектах это незаменимо.

In [ ]:
%load_ext autoreload
# здесь 2 означает, что все библиотеки будут подгружаться заново,
# если только явно не указано иное
%autoreload 2 

import jupyter_lesson

%matplotlib

Скорее всего, эту команду вам придётся писать в начале каждого домашнего задания. Она определяет, каким образом будут отображаться ваши графики. Есть два основных варианта: inline и notebook. Разберёмся, в чём между ними разница:

In [ ]:
%matplotlib notebook 

jupyter_lesson.plot_batman()

Видно, что открылось интерактивное окошко, в котором можно масштабировать участки графика по своему усмотрению. Это удобно, когда хочется рассмотреть детали, но требовательно к ресурсам при сложных визуализациях. А ещё работает не всегда.

In [ ]:
%matplotlib inline

jupyter_lesson.plot_batman()

В этом режиме в ноутбук просто вставляется статическая картинка. Именно этим режимом вы будете пользоваться чаще всего.

%time, %timeit, %%time

Эти три команды замеряют, как долго исполняется код. Коменда %timeit запускает команду несколько раз. По результатам вычисляется среднее и стандартное отклонение. Это уместно, если функция зависит от случайных битов. Для примера напишем функцию, которая генерирует случайное число и засыпает на одну секунду, если оно нечётное.

In [ ]:
import time
import numpy as np

def sleep_if_odd():
    rvs = np.random.randint(low=0, high=int(1e9)) 
    randbit = rvs % 2
    if randbit % 2 == 1:
        time.sleep(1)
In [ ]:
%time sleep_if_odd()
CPU times: user 68 µs, sys: 16 µs, total: 84 µs
Wall time: 92.7 µs

При использовании %timeit можно указать, сколько раз нужно запустить функцию. Синтаксис — %timeit -n Дефолтное значение — 7.

In [ ]:
%timeit -n 10 sleep_if_odd()
529 ms ± 116 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

Видно, что только результаты %timeit отражают реальное поведение функции. Это стоит иметь в виду при тестировании кода.

%system, %%bash

Позволяет выполнять системные команды так, будто вы работаете в терминале.

In [ ]:
%system date
Out[ ]:
['Mon Feb  8 10:13:57 MSK 2021']

Отметим, что для этого есть удобный альтернативный синтаксис:

In [ ]:
!date
Mon Feb  8 10:14:07 MSK 2021

С помощью команды %%bash можно вызвать многострочный скрипт на баше:

In [ ]:
%%bash

for word in {'IPython', 'and', 'bash' 'are', 'friends!'}
do
    echo $word
done
{IPython,
and,
bash
are,
friends!}

%%writefile, %pycat

Эти функции позволяют вам сохранить ячейку с кодом в питоновский файл и вывести его содержимое с подсветкой синтаксиса.
Это пригодится вам при работе с Google Colab (там нельзя менять .py-файлы, только перезаписывать).

In [ ]:
%%writefile test.py
print("Hello, World!")
Overwriting test.py
In [ ]:
%pycat test.py
In [ ]:
!rm test.py