IPython представляет собой мощный инструмент для работы с языком Python. Базовые компоненты IPython – это интерактивная оболочка для с широким набором возможностей и ядро для Jupyter. Jupyter notebook является графической веб-оболочкой для IPython, которая расширяет идею консольного подхода к интерактивным вычислениям.

Основные отличительные особенности данной платформы – это комплексная интроспекция объектов, сохранение истории ввода на протяжении всех сеансов, кэширование выходных результатов, расширяемая система “магических” команд, логирование сессии, дополнительный командный синтаксис, подсветка кода, доступ к системной оболочке, стыковка с pdb отладчиком и Python профайлером.

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

В Jupyter notebook вы можете разрабатывать, документировать и выполнять приложения на языке Python, он состоит из двух компонентов: веб-приложение, запускаемое в браузере, и ноутбуки – файлы, в которых можно работать с исходным кодом программы, запускать его, вводить и выводить данные и т.п.

Веб приложение позволяет:

  • редактировать Python код в браузере, с подсветкой синтаксиса, автоотступами и автодополнением;
  • запускать код в браузере;
  • отображать результаты вычислений с медиа представлением (схемы, графики);
  • работать с языком разметки Markdown и LaTeX.

Ноутбуки – это файлы, в которых сохраняются исходный код, входные и выходные данные, полученные в рамках сессии. Фактически, он является записью вашей работы, но при этом позволяет заново выполнить код, присутствующий на нем. Ноутбуки можно экспортировать в форматы PDF, HTML.

Установка и запуск

Jupyter Notebook входит в состав Anaconda. Описание процесса установки можно найти в первом уроке. Для запуска Jupyter Notebook перейдите в папку Scripts (она находится внутри каталога, в котором установлена Anaconda) и в командной строке наберите:

В результате будет запущена оболочка в браузере.

Примеры работы

Будем следовать правилу: лучше один раз увидеть… Рассмотрим несколько примеров, выполнив которые, вы сразу поймете принцип работы с Jupyter notebook.

Запустите Jupyter notebook и создайте папку для наших примеров, для этого нажмите на New в правой части экрана и выберите в выпадающем списке Folder.

По умолчанию папке присваивается имя “Untitled folder”, переименуем ее в “notebooks”: поставьте галочку напротив имени папки и нажмите на кнопку “Rename”.

Зайдите в эту папку и создайте в ней ноутбук, воспользовавшись той же кнопкой New, только на этот раз нужно выбрать “Python [Root]”.

В результате будет создан ноутбук.

.

Код на языке Python или текст в нотации Markdown нужно вводить в ячейки:

Если это код Python, то на панели инструментов нужно выставить свойство “Code”.

Если это Markdown текст – выставить “Markdown”.

Для начал решим простую арифметическую задачу: выставите свойство “Code”, введите в ячейке “2 + 3” без кавычек и нажмите Ctrl+Enter или Shift+Enter, в первом случае введенный вами код будет выполнен интерпретатором Python, во втором – будет выполнен код и создана новая ячейка, которая расположится уровнем ниже так, как показано на рисунке.

Если у вас получилось это сделать, выполните еще несколько примеров.

Основные элементы интерфейса Jupyter notebook

У каждого ноутбука есть имя, оно отображается в верхней части экрана. Для изменения имени нажмите на его текущее имя и введите новое.

Из элементов интерфейса можно выделить, панель меню:

и рабочее поле с ячейками:

Ноутбук может находиться в одном из двух режимов – это режим правки (Edit mode) и командный режим (Command mode). Текущий режим отображается на панели меню в правой части, в режиме правки появляется изображение карандаша, отсутствие этой иконки значит, что ноутбук находится в командном режиме.

Для открытия справки по сочетаниям клавиш нажмите “Help->Keyboard Shortcuts”

В самой правой части панели меню находится индикатор загруженности ядра Python. Если ядро находится в режиме ожидания, то индикатор представляет собой окружность.

Если оно выполняет какую-то задачу, то изображение измениться на закрашенный круг.

Запуск и прерывание выполнения кода

Если ваша программа зависла, то можно прервать ее выполнение выбрав на панели меню пункт Kernel -> Interrupt.

Для добавления новой ячейки используйте Insert->Insert Cell Above и Insert->Insert Cell Below.

Для запуска ячейки используете команды из меню Cell, либо следующие сочетания клавиш:

Ctrl+Enter – выполнить содержимое ячейки.

Shift+Enter – выполнить содержимое ячейки и перейти на ячейку ниже.

Alt+Enter – выполнить содержимое ячейки и вставить новую ячейку ниже.

Как сделать ноутбук доступным для других людей?

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

  • передать непосредственно файл ноутбука, имеющий расширение “.ipynb”, при этом открыть его можно только с помощью Jupyter Notebook;
  • сконвертировать ноутбук в html;
  • использовать https://gist.github.com/ ;
  • использовать http://nbviewer.jupyter.org/.

Вывод изображений в ноутбуке

Печать изображений может пригодиться в том случае, если вы используете библиотеку matplotlib для построения графиков. По умолчанию, графики не выводятся в рабочее поле ноутбука. Для того, чтобы графики отображались, необходимо ввести и выполнить следующую команду:

%matplotlib inline

Пример вывода графика представлен на рисунке ниже.

Магия

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

%lsmagic

Для работы с переменными окружения используется команда %env.

Запуск Python кода из “.py” файлов, а также из других ноутбуков – файлов с расширением “.ipynb”, осуществляется с помощью команды %run.

Для измерения времени работы кода используйте %%time и %timeit.

%%time позволяет получить информацию о времени работы кода в рамках одной ячейки.

%timeit запускает переданный ей код 100000 раз (по умолчанию) и выводит информацию среднем значении трех наиболее быстрых прогонах.

Информацию по остальным магическим командам можете найти здесь:

Интересные примеры ноутбуков, в которых довольно полно раскрыты возможности Jupyter Notebook можно найти в ресурсах, перечисленных ниже.

P.S.

Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. На нашем сайте вы можете найти вводные уроки по этой теме. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.

Я рекомендую всем начинающим изучать питон. Но при этом я настоятельно не рекомендую использовать Jupyter notebook или подобные «среды разработки» (в кавычках, потому что на самом деле Jupyter вовсе не среда разработки). Попробую объяснить, почему.

Для начала, что такое Jupyter notebook. Это среда, позволяющая вам писать отдельные куски кода на питоне («ячейки»), а потом в более-менее произвольном порядке их исполнять. Если вы в ней не работали, то довольно сложно представить, что это; возможно, вы существенную часть текста не поймете. Но и не страшно 🙂

Итак, что мне не нравится в Jupyter в контексте обучения программированию, алгоритмам и в контексте олимпиад.

Во-первых, и, пожалуй, самое главное — это очень сильное размытие понятия «программы». В обычных средах разработки — в том же Wing (который я рекомендую), в том же PyCharm (который многие используют), да в чем угодно — вы создаете файл с программой, и запускаете целиком программу, от начала и до конца.

В Jupyter же вы создаете «ноутбук», в нем много «ячеек», и вы запускаете эти ячейки в более-менее произвольном порядке. Можно, конечно, запустить весь ноутбук от начала до конца, но это делают относительно редко. Обычно напишут одну ячейку, запустят, напишут вторую ячейку, запустят, потом найдут ошибку в первой, перезапустят, и т.д. Понимания того, что программу обычно запускают все-таки всю целиком, у вас не возникает. У меня даже не поворачивается язык назвать то, что вы пишете в Jupyter, программой — это не программа, это набор слабо связанных фрагментов кода.

Во-вторых (на самом деле, это очень тесно связано с первой проблемой выше), когда вы работаете в Jupyter notebook, у вас получается очень сложное глобальное состояние. Вы запускали какие-то ячейки, какие-то не запускали, какие-то перезапускали, при этом всё это редактировали и правили баги, и в итоге становится очень сложно понять, что у вас записано в каких переменных, откуда это взялось и как вы этого добились. Очень легко попасть в такую ситуацию, что вы получили некоторый результат, но воспроизвести его заново не можете. Поэтому это тем более не программа.

(Конечно, вы можете все делать в одной ячейке, или регулярно запускать весь ноутбук от начала до конца, но тогда, во-первых, зачем вам Jupyter, во-вторых, все равно уже чисто из-за оформления, всех этих In и Out, кажется, это не выглядит как программа.)

В-третьих, «программы» на Jupyter очень плохо переносимы. Если вы написали обычную нормальную программу на питоне, например, в среде Wing IDE, вы ее спокойно можете открыть в PyCharm или где угодно еще; или даже просто запустить из консоли обычным интерпретатором питона. Вы ее можете послать себе на почту и открыть на телефоне (у меня реально школьники пишут программы на телефоне o_O ). С Jupyter это не выйдет.

(В частности, на олимпиадах надо сдавать именно файл с программой; очень плохо понятно, как организовать автоматическую проверку Jupyter notebook’ов на таком же уровне абстракции, как проверяются обычные программы, и именно поэтому на олимпиадах нельзя писать в Jupyter.)

Аналогично, если школьник решил написать какую-то серьезную программу на питоне, серьезное приложение, с какими-нибудь внешними библиотеками типа тех же pygame или tkinter — он сможет спокойно это сделать в Wing IDE и потом без особых проблем распространять программу, надо будет лишь почитать соответствующую документацию. А в Jupyter это сложнее сделать.

В-четвертых, если вы ставите целью именно научиться программировать, а не освоить конкретную технологию, то не надо изучать какую-то нестандартную среду. Среда должна быть самой простой, позволяющей сразу и понятным образом перейти к написанию программ. Wing IDE является как раз такой средой. Jupyter — нет, там как минимум надо еще понять эту систему ячеек.

Более того, вам как программисту потом, возможно, придется писать во многих разных средах и на разных языках. Если вы писали в Wing, то вы без проблем вообще перейдете на любой другой редактор для любого другого языка. Если вы писали в Jupyter, то перейти будет сильно сложнее.

В контексте обучения алгоритмам я всегда говорю, что алгоритмы отделены от языка. Чтобы писать алгоритмы, надо, конечно, выучить какой-то язык, но это скорее побочный продукт. Чем проще язык, чем меньше он мешает именно изучению алгоритмов — тем лучше. Ну и уж тем более про среды разработки — чем проще среда разработки и чем меньше она мешает собственно обучению программированию и алгоритмам, тем лучше.

Еще одна вещь, которую я говорю всем ученикам, аргументируя выбор питона — это его универсальность. Где бы вы потом ни стали бы работать, чем бы ни стали заниматься, если это хоть как-то, пусть косвенно, связано с программированием, питон вам вполне возможно пригодится. Ну или пригодится какой-нибудь другой похожий язык.

С Jupyter notebook ситуация совсем другая. Несмотря на его популярность, он все-таки очень нишевый продукт. Он популярен в машинном обучении и смежных темах, но это лишь небольшая часть того, где применяется питон, и тем более небольшая часть того, где люди программируют вообще. Зачем учить такую нишевую технологию — непонятно.

(И даже в машинном обучении все-таки Jupyter, как я понимаю, используется только для прототипирования, продакшен-код, скорее всего, будет написан уже на чистом питоне.)

Отмечу, кстати, что среди профессиональных программистов (не машинлернеров, не датасайнтистов, а именно программистов, это разные вещи), насколько я понимаю, отношение в Jupyter тоже неоднозначное. Я, например, его не использую; даже если мне надо что-то запротипировать, несколько простых питоновских файлов мне намного удобнее. И аналогичные мнения я слышал и от других серьезных разработчиков. (Это не отменяет популярность Jupyter, я про то, что есть и люди, кому это неудобно.)

В общем, люди, не учитесь программированию в Jupyter.

Jupyter Notebook – это крайне удобный инструмент для создания красивых аналитических отчетов, так как он позволяет хранить вместе код, изображения, комментарии, формулы и графики:

Ниже мы расскажем о некоторых фишках, которые делают Jupyter очень крутым. О них можно прочитать и в других местах, но если специально не задаваться этим вопросом, то никогда и не прочитаешь.

Jupyter поддерживает множество языков программирования и может быть легко запущен на любом сервере, необходим только доступ по ssh или http. К тому же это свободное ПО.

Основы

Список хоткеев вы найдете в Help > Keyboard Shortcuts (список периодически дополняется, так что не стесняйтесь заглядывать туда снова).

Отсюда можно получить представление о взаимодействии с блокнотом (notebook). Если вы будете постоянно работать c Jupyter, большинство комбинаций вы быстро выучите.

  • Esc + F позволит найти и заменить только в коде, не учитывая вывод;
  • Esc + O — переключиться на вывод ячейки;
  • Можно выбрать сразу несколько ячеек и удалить/скопировать/вырезать/вставить. Это полезно при необходимости перемещать части блокнота.

Экспорт блокнота

Простейший способ — сохранить блокнот в формате IPython Notebook (.ipynb), но так как их используют не все, есть и другие варианты:

  • Преобразовать блокнот в html-файл;
  • Опубликовать его в gists, который умеет обрабатывать файлы этого формата (см. пример);
  • Сохранить ваш блокнот, например, в dropbox, а затем открыть ссылку в nbviewer;
  • Блокноты умеет открывать github (есть некоторые ограничения, но в большинстве случаев работает), что очень полезно, так как позволяет хранить историю исследования (если исследование доступно широкой публике).

Построение графиков

Есть несколько вариантов построения графиков:

  • matplotlib (фактически, стардарт), включается командой %matplotlib inline ;
  • %matplotlib notebook — интерактивный режим, но работает очень медленно, так как обработка графика происходит на стороне сервера;
  • mpld3 — альтернативная библиотека визуализации (использующая D3) для matplotlib. Она довольно хороша, хотя и неполна.
  • bokeh лучше подходит для построения интерактивных графиков;
  • plot.ly строит красивые графики, но это будет стоить денег.

Magic-команды

Магические команды (magics) превращают обычный python в магический python. Magic-команды — это ключ к могуществу IPython’а.

Можно управлять переменными среды для вашего блокнота без перезапуска Jupyter-сервера. Некоторые библиотеки (такие, как theano) используют переменные среды, чтобы контролировать поведение, и %env — самый удобный способ.

Выполнение shell-команд

В Notebook можно вызвать любую shell-команду. Это особенно удобно для управления виртуальной средой.

Подавление вывода последней строки

Иногда вывод не нужен, и в этом случае можно или использовать команду pass с новой строки, или поставить точку запятой в конце строки:

Просмотр исходников функций/классов/чего угодно с помощью вопросительного знака (?, ??)

вызовет следующее всплывающее окно:

Используйте %run для выполнения кода на Python

%run может выполнить код на языке Python из файлов с расширением .py — это поведение хорошо задокументировано.

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

Обратите внимание, что %run — это не то же, что импорт python-модуля.





Загрузит код напрямую в ячейку. Можно выбрать файл локально или из сети.

Если раскомментировать и выполнить код ниже, содержание ячейки заменится на содержание файла.

%store — ленивая передача данных между блокнотами

%who для анализа переменных глобального пространства имен

Тайминг

Если вы хотите замерить время выполнения программы или найти узкое место в коде, на помощь придет IPython.

Профилирование: %prun, %lprun, %mprun

%lprun позволяет профилировать с точностью до строк кода, но, кажется, в последнем релизе Python он не работает, так что в этот раз обойдемся без магии:

Дебаг с помощью %debug

У Jupyter есть собственный интерфейс для ipdb, что позволяет зайти внутрь функции и посмотреть, что в ней происходит.

Это не PyCharm — потребуется время, чтобы освоить, но при необходимости дебага на сервере это может быть единственным вариантом (кроме pdb через терминал).

Немного более простой способ — команда %pdb, которая активирует дебаггер, когда выбрасывается исключение:

Запись формул в LateX

Маркдаун ячейки могут отрисовывать формулы LateX с помощью MathJax.

Маркдаун — важная часть блокнотов, так что не забывайте использовать его выразительные возможности!

Использование разных языков внутри одного блокнота

Если вы соскучились по другим языкам программирования, можете использовать их в Jupyter Notebook:

  • %%python2
  • %%python3
  • %%ruby
  • %%perl
  • %%bash
  • %%R,

но, разумеется, среда должна быть настроена соответствующим образом.

Анализ Big Data

Существует несколько решений, чтобы запрашивать/обрабатывать большие объемы данных:

  • ipyparallel (бывший ipython cluster) — хороший инструмент для простых операций map-reduce на Python. Мы используем его в rep для обучения большого количества моделей машинного обучения параллельно.
  • pyspark
  • spark-sql magic %%sql

Ваши коллеги могут экспериментировать с вашим кодом, ничего не устанавливая

Такие сервисы, как mybinder, предоставляют доступ к Jupiter Notebook со всеми установленными библиотеками, так что пользователь может с полчаса поиграться с вашим кодом, имея под рукой только браузер.

Вы также можете установить вашу собственную системы с помощью jupyterhub, что очень удобно, если вы проводите мини-курс или мастер-класс и вам некогда думать о машинах для студентов.

Написание функций на других языках

Иногда скорости NumPy бывает недостаточно, и мне необходимо написать немного быстрого кода. В принципе, можно собрать нужные функции в динамические библиотеки, а затем написать обертку на Python…

Но гораздо лучше, когда скучная часть работы сделана за нас, правда?

Ведь можно написать нужные функции на Cython или Fortran и использовать их напрямую из кода на Python.

Для начала нужно установить модули

Лично я предпочитаю Fortran, на котором, я считаю, удобно писать функции для обработки большого объема численных данных. Подробнее о его использовании можно почитать здесь.

Должен заметить, что есть и другие способы ускорить ваш код на Python. Примеры можно найти в моем блокноте.

Множественный курсор

С недавнего времени Jupyter поддерживает множественный курсор, такой, как в Sublime или IntelliJ!


Источник: swanintelligence.com/multi-cursor-in-jupyter.html

Расширения Jupyter-contrib

устанавливаются с помощью

Это целое семейство различных расширений, включая, например, jupyter spell-checker и code-formatter, которых по умолчанию в Jupyter нет.

RISE: презентации в Notebook

Расширение, написанное Damian Avila, позволяет демонстрировать блокноты как презентации. Пример такой презентации: bollwyvl.github.io/live_reveal/#/7

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

Система вывода Jupyter

Блокноты отображаются в HTML, и вывод ячейки тоже может быть в формате HTML, так что вы можете выводить все, что душе угодно: видео, аудио, изображения.

В этом примере я просматриваю содержимое директории с картинками в моем репозитории и отображаю первые пять из них.





Я мог бы получить тот же список bash-командой,

потому что magic-команды и bash-вызовы возвращают переменные Python:

Повторное подключение к ядру

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

Теперь опция Reconnect to kernel позволяет заново подключиться к работающему ядру, не прерывая вычислений, и увидеть последний вывод (хотя какая-то часть вывода все же будет потеряна).

Пишите ваши посты в Notebook

такие, как этот. Используйте nbconvert, чтобы экспортировать в HTML.