Метка: jupyter notebook

​​Анимация Jupyter Notebook

Сегодня мы будем анимировать график прямо внутри Jupyter Notebook. Сперва сделаем плавную отрисовку графика. Переключим режим отображения графиков в notebook:

%matplotlib notebook

Импортируем все, что нужно:

import matplotlib.pyplot as plt
from matplotlib import animation
import numpy as np

Сгенерируем наши данные:

# время (200 точек)
t = np.linspace(0, 2 * np.pi, 200)
x = np.sin(t)  # синусоида

Создадим пустой график:

fig, ax = plt.subplots()
# пределы отображения
ax.axis([0, 2 * np.pi, -2, 2])
l, = ax.plot([], [])

Функция animate будет вызываться при отрисовка каждого кадра, аргумент i – номер кадра:

def animate(i):
    # рисуем данные только от 0 до i
    # на первом кадре будет 0 точек, 
    # а на последнем - все
    l.set_data(t[:i], x[:i])

Запускаем анимацию:

fps = 30  # карды в сек
# frames - число кадров анимации
ani = animation.FuncAnimation(fig, animate, frames=len(t), interval=1000.0 / fps)

Если мы хотим анимировать сами данные, например, заставить синусоиду «плясать», то на каждом шаге перегенерируем данные заново, используя переменную i:

def animate(i):
    x = np.sin(t - i / len(t) * np.pi * 2) * np.sin(t * 15)
    l.set_data(t, x)

Можно сохранить в GIF:

ani.save('myAnimation.gif', writer='imagemagick', fps=30)

Сам ноутбук я загрузил на GitHub, но поиграться онлайн с ним не получится, надо скачать себе и запустить локально. Анимированные графики отрисовываются в реальном времени, поэтому требуют достаточно много ресурсов. Пример 3D анимации:

Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈 

Интерактивность в Jupyter Notebook

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

  • Слайдер для выбора значения числа
  • Текстовое поле для ввода чисел или строк
  • Выпадающий список выбора
  • Чекбоксы (галочка да/нет)
  • Выбор даты
  • Выбор цвета и другие…

Установка виджетов (если еще не установлены):

pip install ipywidgets
jupyter nbextension enable --py widgetsnbextension

Или через conda одной командой:

conda install -c conda-forge ipywidgets

📎 Пример. Нарисуем синусоиду с изменяемой частотой и фазой:

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

from ipywidgets import interact

@interact(f=(1, 5, 0.1), phase=(0, 3.14, 0.1))
def plot_f(f, phase):
    x = np.linspace(0, 10, 100)
    y = np.sin(f * x + phase)
    plt.plot(x, y, 'r')
    plt.show()

Мы делаем интерактивными параметры f и phase. Их имена совпадают с аргументами обернутой функции plot_f(f, phase). А значения — кортеж вида (min, max, step), т.е. минимальное значение, максимальное и шаг слайдера. Как только мы изменим положение движков, то график будет автоматически перерисован.

Пример интерактивного графика в Jupyter Notebook

Магия Jupyter Notebook

Jupyter Notebook предлагает богатейшие возможности по прототипированию кода, проверке гипотез, демонстраций и научных трудов в сравнении со стандартным интерпретатором Python.

Уставновка:

pip install jupyter

Запуск. В терминале пишем:

jupyter notebook

После чего запускается процесс, поднимается веб-сервер и открывается окно браузера с веб-интерфейсом, где вы можете создавать, открывать, редактировать и исполнять файлы типа .ipynb. Не закрывайте этот процесс, пока работаете с блокнотом.

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

Рассмотрим некоторые из них:

%magic — выведет документацию по всем-всем доступным магическим функциям.

%lsmagic — просто список этих функций.

%timeit – измеряет среднее время выполнения кусочка кода, при этом вывод гораздо более информативен, чем обычный вызов timeit.timeit; и не требует лишних import.

Сравните вот это (из Jupyter):

def test():
  return sum(range(1000))
%timeit test()

12.5 µs ± 378 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

С этим (из интерпретатора):

>>> import timeit
>>> def test(): return sum(range(1000))
...
>>> timeit.timeit("test()", "from __main__ import test")
12.405041060002986

По-моему, первый вариант выигрывает по удобству и информативности.

%%timeit – многострочный вариант предыдущей функции. Пример:

%%timeit x = 10
x += 20
x /= 2
48.7 ns ± 0.435 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%pinfo [имя] или [имя]? – покажет документацию по функции или классу [имя]. Примеры:

import numpy as np
%pinfo np.random.uniform

Или

import numpy as np
np.random.uniform?

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

%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)

%env — показать текущие переменные среды.

%env [имя]=[значение] — управление переменными среды. Пример:

%env OMP_NUM_THREADS=4

%cd – показывает или меняет рабочую директорию.

Можно вызывать системные команды прямо из блокнота через знак восклицания. Примеры:

!ls
!pip install click
# резульат выполнения системной команды можно получить в перемунную и использовать далее
output = !pip list | grep tensorflow

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

P.S. Многие магические функции также работают и в интерпретаторе IPython.

🧙 Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈