Ipython notebook. Часть II – пример работы
Задача: Показать ipython notebook в действии. В частности будем рисовать нашу любимую температуру из файла NCEP реанализа.
�?нструменты: ipython notebook, scipy, Basemap
Попробуем использовать ipython notebook, , для чего-нибудь полезного и в процессе ближе познакомимся с его возможностями.
Напомню, что для того, чтобы примеры приведённые в этом посте работали нужно удостовериться, что у вас установлены следующие пакеты:
Для создания вашей первой сессии в notebook вам просто нужно набрать
При этом откроется браузер и появится список всех книжек находящихся в папке, если до этого их в папке не было, ipython создаст для вас первую книжку (скорее всего с именем Untitled0) самостоятельно. Кликнув на неё вы попадёте в рабочую область notebook, а ваш курсор будет приветливо помигивать в первой ячейке.
Ячейки бывают нескольких видов. Две самых главных: Code - в них вы будете исполнять свой код, и Markdown - в которых можно писать тексты и форматировать их при помощи . Разобраться как переключать вид ячеек, соединять их, двигать, удалять, копировать - не сложно, достаточно потратить пару минут на изучение выпадающего меню и иконок действий.
Чтобы выполнить код или отобразить отформатированный текст в случае маркдаун ячейки, необходимо нажать Shift+Enter. При этом код выполнится (или текст отформатируется) и произойдёт переход к следующей ячейке. В случае с Code ячейками можно также пользоваться комбинацией Ctrl+Enter - в этом случае код выполнится, но ячейка останется активной, а код в ней выделится. Это удобно, когда нужно производить некоторые простые действия, которые не нужно сохранять в notebook, например листинг файлов.
Давайте попробуем сделать уже что-нибудь полезное. В качестве примера, по сложившейся традиции, я выбрал работу с netCDF файлом приземной температуры воздуха NCEP реанализа. Мы будем смотреть, что у файла внутри и рисовать карту.
Сами файлы находятся . Файл должен находиться в одной папке с записной книжкой, в которой вы его будете обрабатывать.
Для начала откроем его:
f = netcdf.netcdf_file('air.sig995.2012.nc', 'r')
Мы создали объект f, который представляет наш netCDF файл. Тут нужно немножко рассказать о справочной системе ipython notebook, которая во многом напоминает чистый ipython, но, на мой взгляд, удобнее. Для того, чтобы узнать, что за зверь такой наш вновь созданный объект f, мы можем просто поставить после него знак вопроса, выполнить код и получить по нему справку.
Это сработает для любой переменной, функции, объекта или метода. Если просто справка вас не устраивает и хочется копнуть поглубже, то поставьте два вопросительных знака и ipython постарается найти для вас файл с исходным кодом, например, функции, и ту часть в нём, где эта функция определена. В нашем случае открылся исходный код, в котором вводится класс netcdf_file:
Если мы хотим посмотреть доступные нам методы для f, то достаточно поставить точку, и нажать TAB:
остаётся просто выбрать из списка то, что вам нужно и нажать на Enter.
Давайте посмотрим на список переменных в нашем файле (тут я решил обойтись без скриншота
):
f.variables
Out[16]:
{'air': <scipy.io.netcdf.netcdf_variable at 0xa854aac>,
'lat': <scipy.io.netcdf.netcdf_variable at 0xa8547ac>,
'lon': <scipy.io.netcdf.netcdf_variable at 0xa85488c>,
'time': <scipy.io.netcdf.netcdf_variable at 0xa85496c>}
Эта информация может пригодиться, поэтому оставляем её в notebook и переходим в следующую ячейку. Мы можем "добыть" ту переменную, которую собираемся отображать - air
Здесь происходит присвоение значения, а этим лучше лишний раз не заниматься, поэтому переходим в следующую ячейку, где сможем узнать всё про внутренний мир нашей новоиспечённой переменной. В частности нам доступно довольно много методов
При помощи которых мы можем узнать, например, единицы измерения, полное имя и коэффициенты перевода в честные градусы K
Дальше мы подготавливаем данные для отрисовки. К notebook это отношения особого не имеет, поэтому коротенько:
airData = air[:]
# переводим в цельсии
airDataCels = ((airData*air.scale_factor)+air.add_offset)-273.15
# вытаскиваем сразу данны по широтам и долготам
lat = f.variables['lat'][:]
lon = f.variables['lon'][:]
# импортируем numpy, который нам понадобится в дальнейшем
import numpy
# делаем из одномерных широт и долгот двумерные
lons, lats = numpy.meshgrid(lon,lat)
При этом надо понимать, что в процессе написания даже этого небольшого куска кода я получал информацию о переменных, что-то пробовал, проверял всё ли получается. Но при этом в отличии от работы в консольном ipython "мусорный" вывод результатов исполнения команд, тот который нужен только раз, не заслоняет действительно необходимый и полезный. Так, например, я могу не вызывать снова и снова размерность моей основной переменной, чтобы проверять правильно ли создаются матрицы для широты и долготы достаточно вывести её один раз и она всегда будет перед глазами на знакомом месте.
Пришло время нам нарисовать нашу карту. Для того, чтобы графика генерируемая Matplotlib встраивалась в notebook нужно выполнить:
Дальше мы делаем четыре отдельные ячейки. �?мпортируем Basemap
Во второй ячейке мы будем генерировать простейшую карту при помощи Basemap.
Обычно саму карту (проекцию, нулевые широты и долготы) мы меняем редко, а процесс её генерации не быстрый, так что лучше оставить этот код в отдельной ячейке, чтобы исполнять его только тогда, когда это необходимо.
То же справедливо и для перевода наших широт и долгот в координаты рисунка, их достаточно сделать один раз:
А вот следующий код помещаем весь в одну ячейку, поскольку каждый раз, когда мы захотим перерисовать карту, изменив интересующий нас день нужно будет исполнять весь этот код:
fig = plt.figure(figsize=(15,15))
# Выбираем день года
dayNumber = 85
# Рисуем береговую линию
m.drawcoastlines(linewidth=1)
# Рисуем границы стран
m.drawcountries(linewidth=0.5)
# Рисуем границу карты
m.drawmapboundary
# Создаём карту с залитыми изолинииями, 20 интервалов
cs = m.contourf(x,y,airDataCels[dayNumber,:,:],20)
# Создаём легенду
cbar = m.colorbar(cs,location='bottom',pad="5%")
# Подписываем легенду
cbar.set_label(r'$^{\circ}\mathrm{C}$')
# Переводим время в человеческое
difference1 = datetime.timedelta(hours=time[dayNumber])
present = first_date+difference1
# Отрисовываем заголовок
plt.title(present.ctime())
В результате у вас в тело notebook будет вставлена карта, которую вы сможете тут же обновлять, меняя день (dayNumber) и исполняя только код из последней ячейки. Никаких всплывающих окон или файлов на диске - всё в одном месте и код и результат:
Надеюсь, что я убедил вас хотя бы попробовать ipython notebook. Буду рад услышать ваши отзывы о нём в комментариях.
Вынесу сюда комментарий от Сергея:
"Можно добавить, что готовый ноутбук можно выложить текстовым (JSON) файлом на любой pastebin, и потом его показывать, вместе с формулами и графиками всем желающим, используя сервис
Очень удобно, чтоб делиться с коллегами графиками и результатами расчетов."
Вещь, конечно, достойная. Спасибо за описание.
Но вот что-то у меня ругается. (
—————————————————————————
AttributeError Traceback (most recent call last)
in ()
7
8 cs = m.contourf(x, y, airDataCels[dayNumber, :, :], 20)
—-> 9 cbar = m.colorbar(cs, location=’bottom’, pad=’%5′)
10 cbar.set_label(r’$^{\circ}\mathrm{C}$’)
11
AttributeError: ‘Basemap’ object has no attribute ‘colorbar’
Выглядит очень привлекательно. Но не нашел не одного публичного сервера с хотя бы demo режимом, что-бы ощутить все на собственной шкуре. Установка на рабочий компьютер по моему как-то не соответствует самой идее notebook-а.
Вообще реализация во многом напоминает SAGE
Спасибо за статьи. Действительно очень полезный инструмент, и стало чуть понятней, почему он пользуется такой популярностью. Про markdown, LaTeX, Octave – всё это было для меня новостью. Хотя некоторое время уже использую блокнот.
Насчёт сервера – многие используют бесплатный доступ к Амазону, устанавливают там какой-нибудь линукс, а поверх – блокнот. Тут есть пример:
Правда, куда проще установить блокнот на свой компьютер.
Насчёт SAGE – тут есть история вопроса и сравнение систем:
- ключевые различия можно найти поиском по странице, дав запрос “the Sage notebook took the route of using the filesystem for notebook operations”.
Спасибо за статьи. Действительно очень полезный инструмент, и стало чуть понятней, почему он пользуется такой популярностью. Про markdown, LaTeX, Octave – всё это было для меня новостью. Хотя некоторое время уже использую блокнот.
Насчёт сервера – многие используют бесплатный доступ к Амазону, устанавливают там какой-нибудь линукс, а поверх – блокнот.
Правда, куда проще установить блокнот на свой компьютер.
Насчёт SAGE – мне попадалась история вопроса и сравнение этих систем, по большому счёту идеи об ipython notebook и SAGE развивались параллельно.
Можно добавить, что готовый ноутбук можно выложить текстовым (JSON) файлом на любой pastebin, и потом его показывать, вместе с формулами и графиками всем желающим, используя сервис
Очень удобно, чтоб делиться с коллегами графиками и результатами расчетов.
Отличная реализация.
А такую идею я видел в системе Оберон, Н.Вирта, очень не хватало такой возможности в среде Linux.