Перейти к содержанию

Знакомство с инструментарием: Jupyter

Введение

Как любой мастер должен знать свой инструмент, так и любой человек, решивший пройти сию курс, должен понимать тонкости рабочей среды. Как уже могли понять по прошлому занятию, всю (или большую часть) работы будем делать в Jupyter Notebook. Но бояться нечего: по сути, Jupyter – это продвинутый текстовый редактор с функцией запуска кода и получения результатов вычислений. Настолько продвинутый, что позволяет вам не только рисовать картинки и писать формулы, но даже строить целые интерактивные карты:

[Пример интерактивной визуализации прямо внутри рабочего файла с кодом](https://medium.com/@bartomolina/geospatial-data-visualization-in-jupyter-notebooks-ffa79e4ba7f8)

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

Благодаря удобству использования и доступности Jupyter в настоящее время стал крупным игроком в нише научных вычислений и быстрого прототипирования. Вдобавок он безумно удобен для обучения и передачи знаний. Почему? Давайте разбираться.

Типы ячеек

В Jupyter существует несколько типов ячеек, поговорим о двух основных: Code и Markdown. В прошлом уроке создали пустой ноутбук, чтобы проверить установку Jupyter. Ноутбуком это называется потому, что в переводе с английского notebook – это тетрадка (альтернативное название на русском языке). В тетрадке можно писать что-то осмысленное, черкаться, оставлять пометки. Сейчас должны видеть вот такой экран:

Пример пустой только что созданной тетрадки

Здесь верхней красной чертой выделено поле с названием ноутбука. Можете кликнуть по нему, переименовать во что-то осмысленное и нажать Enter, чтобы применить изменения. Нижней же чертой обозначен выпадающий список переключений типов ячеек. По умолчанию создана одна code ячейка – в ней в будущем будем писать Python-код. Попробуйте кликнуть по списку и выбрать Markdown – визуально ячейка немного изменится.

Что такое Markdown?

Markdown (произносится маркда́ун) – облегченный язык разметки, созданный с целью обозначения форматирования в простом тексте с максимальным сохранением его читаемости человеком.

Пример: Text attributes _italic_, **bold**, `monospace`.

С помощью Markdown можно разнообразить код, вставить формулы (в том числе в LaTeX формате, если он вам знаком), ссылки на статьи и многое другое. Попробуйте скопировать код из примера выше в Markdown-ячейку и нажать кнопку Run:

Пример выполненной ячейки. Красным квадратом выделена кнопка `Run`

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

Пример грамотно [оформленной Jupyter-тетрадки](https://nbviewer.jupyter.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/05-Multivariate-Gaussians.ipynb). Такую можно скинуть коллегам – и всем все будет понятно

Замечание

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

Пока не так часто придется писать Markdown-заметки самостоятельно, основная причина их создания – желание и дальнейшее удобство использования ноутбука. Есть также другая причина, по которой акцентируем на них внимание. Может произойти так, что случайно изменили тип ячейки и не заметили этого. Теперь, если в Markdown-ячейку вставить Python-код, то ничего не произойдет или возникнет ошибка. Если заметили что-то странное при выполнении кода в тетрадке – проверьте, корректен ли тип ячейки. Для выполнения кода нужно выставить тип Code.

Верхняя ячейка с `print` написана в Code-режиме и корректно выполняется, печатая строчку с приветствием. Нижняя ячейка же содержит ^^текст, а не код^^, поэтому ничего работать не будет (точнее, код отобразится как текст, но не будет выполнен)

Внимание

Посмотрите как визуально отличаются эти две ячейки. Одна из них имеет прозрачный фон, другая – серый. У Code ячейки также есть странная надпись слева (про нее еще поговорим).

Каждый раз вручную запускать код (или Markdown) через кнопку Run не очень-то удобно, поэтому можно запомнить две комбинации клавиш. Ctrl+Enter выполнит текущую ячейку и оставит «курсор» (указатель на ячейку) на том же месте, не создавая лишнюю строчку в ноутбуке. Shift+Enter повторит функциональность кнопки Run: выполнит ячейку, а затем перейдет на следующую (или создаст новую, если текущая ячейка является последней).

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

Вторая (Shift+Enter) пригодится тогда, когда хотите запустить много-много идущих подряд ячеек (можете представить, что коллега скинул вам свою тетрадку с 30 клетками и вы хотите ее запустить, чтобы получить данные).

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

Режимы работы

Пришло время разобраться с цветом курсора, выделяющего ячейки. Он может быть синим или зелёным.

Пример разного цвета указателя клетки

Никакой тайны за этим нет, это два режима: режим редактирования и командный режим. Зелёный цвет сигнализирует о том, что вы работаете с текстовым содержимым ячейки, то есть редактируете его! Можете писать код, вставлять формулы, что угодно. Но как только нажмете Esc на клавиатуре, цвет сменится на синий, что означает возможность редактирования всего ноутбука, а не отдельных ячеек в нем. Можно передвигать ячейки, удалять их (полностью, а не только текст в них), добавлять новые. Стрелочками на клавиатуре можно выбирать ячейки (скакать вверх и вниз). Как только доберетесь до нужной (а вместо этого можно просто кликнуть по ней мышкой, что полезно в ситуации, когда клетка очень далеко, в самом низу страницы) – жмите Enter, чтобы вернуться к редактированию.

Совет

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

Кнопки управления ноутбуком

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

  1. Сохранение ноутбукаCtrl+S – делайте его почаще, дабы не потерять результаты работы!
  2. Создание ячейки ниже текущейB – потому, что создается клетка снизу, то есть Below. Логика для A и Above аналогична.
  3. Вырезать ячейкуX – применимо и к целому блоку ячеек (можно выделить с зажатой клавишей Shift). Функциональность как и в Excel/Word: убрать в одном месте, чтобы вставить в другом.
  4. Копировать ячейкуC.
  5. Вставить ячейку из буфераV – после вырезания или копирования ячейки.
  6. Переместить текущую выделенную ячейкувверх.
  7. Переместить текущую выделенную ячейкувниз.

Описание всех доступных команд (и соответствующих им хоткеев) доступно при нажатии на кнопку с клавиатурой в правой части выделенного блока меню (вне красного прямоугольника).

Упражнение

Попробуйте потратить 5-7 минут на практику использования этих кнопок и сочетаний клавиш.

Первое время можете пользоваться только элементами UI-интерфейса – это нормально, главное, сопоставить кнопки и стоящую за ними функциональность.

Оставшиеся кнопки на панели

Про кнопку RunShift+Enter) уже поговорили, а что с остальными?

Кнопки управления ^^ЯДРОМ^^ ноутбука

Для того, чтобы можно было запускать код Python, запускается так называемое «ядро» (или kernel), то есть приложение, которое непосредственно выполняет (запускает) код и передает результаты обратно в Jupyter-ноутбук. За это отвечает как раз Run.

Справа от нее расположен Stop, который прерывает выполнение программы; может быть полезен в случаях, когда запустили расчеты на час, но заметили ошибку – и поэтому нужно и код переписать, и ячейку с кодом снова запустить. в этой ситуации сначала останавливаете выполнение, редактируете код, затем жмете Run – и всё готово!

Но случается беда и код не останавливается, потому что ядро Python зависает. В таких случаях нужно перезапустить ядро – и кнопка с закругленной стрелочкой Restart поможет осуществить задуманное. Будьте аккуратны – все несохраненные данные будут потеряны (значения переменных, результаты расчетов, данные для построения графиков). Сама тетрадка останется без изменений, то есть написанное сохранится. Концепция «ядра» и запуска кода станет более понятна, когда перейдем к практике.

Совет

Пока стоит держаться правила: «Накосячил? Попробуй остановить (Stop) ядро. Не получается? Тогда перезапускай (Restart) его!»

Нужно понимать, что ядро «помнит» все предыдущие выполненные ячейки (пока не будет перезагружено или выключено), а значит, можете позже в коде переиспользовать те части, которые были описаны ранее (например, переменные или физические константы). Иными словами, состояние ядра сохраняется во времени и между ячейками – оно относится к документу в целом, а не к отдельным ячейкам.

Последняя кнопка из выделенного блока имеет говорящее название: Re-start and run all. Ядро будет перезапущено (все переменные и данные удалятся), а затем каждая ячейка будет выполнена в порядке сверху вниз. Поэтому рекомендуется соблюдать структуру, чтобы запускать код с нуля (после возвращения к ноутбуку на следующий день, но с новым ядром, так как компьютер был выключен) – и он отрабатывал.

Что это за In [*]?

Та самая надпись слева от запущенной Code-ячейки. Это вспомогательная информация о том, что происходит с кодовой ячейкой (In означает Input, то есть ввод кода). Возможно несколько вариантов заполнения.

Пример трех видов информации о статусе ячейки

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

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

В последней строчке умышленно был сделан бесконечный цикл. Это означает, что код никогда не сможет выполниться и будет висеть до тех пор, пока не остановите (кнопка Stop) ядро. Поэтому там выведен индикатор выполнения ячейки – в скобках указана звездочка *. Обратите внимание: это не всегда плохой сигнал. Если код должен выполняться 2-3 минуты, то все это время будет выводиться [*]. Когда код отработает и результат будет получен, отрисуется цифра (например, [7] ).

Самая полезная клавиша

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

import numpy as np
import mat.pyplot as plt
%matplotlib inline

# Fixing random state for reproducibility
np.random.seed(19680801)

# Compute pie slices
N = 20
θ = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
radii = 10 * np.random.rand(N)
width = np.pi / 4 * np.random.rand(N)
colors = plt.cm.viridis(radii / 10.)

ax = plt.subplot(111, projection="polar")
ax.bar(θ, radii, width=width, bottom=0.0, color=colors, alpha=0.5)
plt.show();
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-30-56b3ee1d7a61> in <module>
      1 import numpy as np
----> 2 import mat.pyplot as plt
      3 get_ipython().run_line_magic('matplotlib', 'inline')
      4
      5 # Fixing random state for reproducibility

ModuleNotFoundError: No module named 'mat'

Ошибка. По сообщению видно (стрелочка в левой части указывает на проблемное место), что во второй строчке используется слово mat, при этом Python жалуется на отсутствие такого модуля. Всё дело в том, что в коде выше производится попытка рисования графика и для этого используется библиотека matplotlib. Но в одной из строк написано только mat. Это не дело, давайте исправлять. Однако всех библиотек не запомнишь – и это не нужно. Попробуйте поставить курсор после буквы t (и перед точкой) и нажать Tab; должны увидеть список подсказок и из него выбрать нужный вариант. Этот список не только сокращает время написания кода (за счет автоматического дополнения), но и позволяет избежать ошибок в написании. Обязательно пользуйтесь этим инструментом.

Если все сделали правильно, воспользовавшись подсказкой, то после очередного запуска (Run) кода появится рисунок.

Другой пример удачного использования: есть несколько переменных со сложным, но очень похожим названием. Не стоит их перепечатывать – достаточно нажать ++tab++

Что ж, большое количество новой информации позади, давайте подведем итоги!

Что узнали из лекции

  • Существует два основных типа ячеек, один предназначен для программирования (написания кода), другой – для описания (формул, определений).
  • Существует два режима работы: edit – редактирование конкретной ячейки и control – работа со всей структурой тетрадки/ноутбука.
  • Режимы работы можно различить по цвету рамки вокруг активной ячейки, а тип ячейки – по прозрачности фона и наличию надписи In[ ] слева.
  • Между режимами можно переключаться с помощью Esc и Enter.
  • Чтобы запустить ячейку (с кодом или текстом), нужно нажать на кнопку Run сверху, либо воспользоваться сочетаниями клавиш: Shift+Enter, Ctrl+Enter.
  • Нужно не забывать сохранять ноутбук (Ctrl+S), а быстро добавить ячейку кода можно с помощью плюсика слева сверху (или клавиши B).
  • Клавиши C / V позволяют копировать и вставлять ячейки в control-режиме.
  • In[3] указывает на порядок выполнения ячеек с кодом, In[*] – на процесс выполнения.
  • Если долго ждете выполнения Code-блока, можно остановить (кнопка Stop) ядро, если не помогает – Restart.
  • Ядро – это процесс, выполняющий код, и после перезагрузки оно не сохраняет переменные.
  • Tab – ваш друг, позволяющий избегать опечаток, а также реже пользоваться документацией.

Бонус-материал