Найти в Дзене

3.4. Рассчёты и визуализация на Python.

Общие сведения о библиотеках представлены в прошлой статье. Оттуда мы знаем, что есть инструменты математических расчётов и визуализации данных, которые реализованы в библиотеках, пакетах и модулях языка. Среди них есть встроенные и подгружаемые по мере необходимости. При этом, даже из имеющихся в стандартной библиотеке пакетах не нужно подгружать все модули, чтобы загружать память, а достаточно только необходимые в моменте. Кроме того, важно и время выполнения кода. За этим может проследить модуль timeit.
1. numpy и math Библиотека math является стандартной в Python и содержит много полезных математических функций и констант. Официальная документация Python выделяет следующие виды функций этого модуля: - Функции теории чисел и функции представления -Тригонометрия -Степенные и логарифмические функции -Функции преобразования угла -Гиперболические функции и т.д. Всего, вроде, около 40, и можно грузить конкретный нужный модуль. Математика Существенную прибавку в скорости обеспечивает б
Оглавление

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

1. numpy и math

Библиотека math является стандартной в Python и содержит много полезных математических функций и констант. Официальная документация Python выделяет следующие виды функций этого модуля:

- Функции теории чисел и функции представления

-Тригонометрия

-Степенные и логарифмические функции

-Функции преобразования угла

-Гиперболические функции и т.д.

Всего, вроде, около 40, и можно грузить конкретный нужный модуль.

Математика

  • pow — возводит число в степень;
  • abs — возвращает модуль числа;
  • round — округление до указанного количества знаков после запятой.

Существенную прибавку в скорости обеспечивает библиотека numpy (Numerical Python, читается как "нампАй"). Библиотека numpy частично написана на языках Си и Фортран, благодаря чему и работает быстро. Таким образом, numpy сочетает в себе вычислительную мощность языков Си и Фортран и простоту синтаксиса Python.

Библиотека numpy является нестандартной библиотекой.

Установить библиотеку можно командой pip install numpy. После ввода команды начнётся загрузка установочного пакета и дополнительных библиотек, от которых зависит numpy. Затем начнётся процесс установки. Если установка пройдёт успешно, то вы увидите вывод в командной строке

Для импорта numpy обычно используют следующий код: import numpy as np.

Библиотека numpy работает с объектами-массивами, которые способны хранить много значений и быть многомерными (ndarray). При этом в отличие от списков массивы могут хранить только значения одного типа. За счёт этого массивы в numpy занимают меньше памяти и работают быстрее, чем списки. Создать массив можно разными способами. Один из них – использовать функцию array() для преобразования списка в массив, пример a = np.array([1, 2, 3, 4]). Для доступа к элементам массива необходимо указать индекс элемента в квадратных скобках. Индексация начинается с нуля.

Наиболее важными атрибутами класса ndarray являются:

  • ndarray.ndim – размерность (количество осей) массива;
  • ndarray.shape – кортеж, значения которого содержат количество элементов по каждой из осей массива;
  • ndarray.size – общее количество элементов массива;
  • ndarray.dtype – объект, описывающий тип данных элементов массива;
  • ndarray.itemsize – размер памяти в байтах, занимаемый одним элементом массива.

Пример, np.sqrt(np.arange(3)) результатом
выполнения будет
array([0. , 1. , 1.41421356]). Таким образом, будет создан массив из чисел 0, 1, 2, из которых по очереди будет взят квадратный корень.

Подробности.

Основной элемент библиотеки NumPy — объект ndarray (что значит N-размерный массив). Этот объект является многомерным однородным массивом с заранее заданным количеством элементов. Однородный — потому что практически все объекты в нем одного размера или типа. На самом деле, тип данных определен другим объектом NumPy, который называется dtype (тип-данных). Каждый ndarray ассоциирован только с одним типом dtype.

Функция plot служит для построения и оформления двумерных графиков

Первое, что пришло в голову построить:

-2

Но перед этим был импортирован модуль другой библиотеки

import matplotlib.pyplot as plt.

2. SciPy

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

Для полноценного научного анализа в Python нужно устанавливать и NumPy, и SciPy, поскольку последняя построена на базе NumPy. Если вы импортируете SciPy, то NumPy отдельно импортировать не нужно.

набор пакетов следующий:

-3

Чтобы узнать о них подробнее, используйте функции help(), info() или source().

3. Pandas

Pandas – это библиотека Python, которая предоставляет быстрые, гибкие и выразительные структуры данных, предназначенные для того, чтобы сделать работу простой и интуитивно понятной. Уроки по пандас здесь и шпаргалка на хабре, а это ШАД.

Работа pandas с данными строится поверх библиотеки NumPy.

Основными типами данных в Pandas являются Series и DataFrame. Series – это проиндексированный одномерный массив значений. Он похож на простой словарь типа dict, где имя элемента будет соответствовать индексу, а значение – значению записи. DataFrame — это проиндексированный многомерный массив значений, соответственно каждый столбец DataFrame, является структурой Series.

-4

Основные возможности библиотеки:

  • Объект DataFrame для манипулирования индексированными массивами двумерных данных
  • Инструменты для обмена данными между структурами в памяти и файлами различных форматов
  • Встроенные средства совмещения данных и способы обработки отсутствующей информации
  • Переформатирование наборов данных, в том числе создание сводных таблиц
  • Срез данных по значениям индекса, расширенные возможности индексирования, выборка из больших наборов данных
  • Вставка и удаление столбцов данных
  • Возможности группировки позволяют выполнять трёхэтапные операции типа «разделение, изменение, объединение» (англ. split-apply-combine).
  • Слияние и объединение наборов данных
  • Иерархическое индексирование позволяет работать с данными высокой размерности в структурах меньшей размерности
  • Работа с временными рядами: формирование временных периодов и изменение интервалов и так далее

4. matplotlib

Вообще, почти все функции пакета matplotlib работают именно с массивами numpy: принимают их в качестве аргументов или возвращают. Поэтому при работе с matplotlib желательно знать основы numpy.

Модуль pyplot — это коллекция функций в стиле команд, которая позволяет использовать matplotlib почти так же, как MATLAB. Каждая функция pyplot работает с объектами Figure и позволяет их изменять. Например, есть функции для создания объекта Figure, для создания области построения, представления линии, добавления метки и так далее.

-5

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

plt.grid()

-6

И можно даже два графика изобразить в одних осях:

-7

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

plt.plot(x, y) plt.plot(x2, y2)

Получим аналогичный эффект – два графика в одних координатах.

-8

Axes создается автоматически при первом вызове функции plot(), если ранее, до этого не было создано ни одного Axes. А раз создается система координат, то создается и объект Figure, на котором размещаются оси. Поэтому в нашей программе, при первом вызове функции plot() было создано два объекта:

  • Figure – объект для отображения всех данных, связанных с графиком;
  • Axes – двумерная координатная ось декартовой системы.

Если третьим параметром в plot() указать строку с двумя дефисами:

plt.plot(x, y, '--')

то график будет изображен не сплошной линией, а штрихами.

-9

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

b = blue, r = red, g = green, c = cyan, w = white

-10

Если два графика в одних осях пишем

lines = plt.plot(x, y, '--g', x2, y2, ':m').

указать цвета не только предопределенными символами, но, например, в шестнадцатиричной записи HEX:

lines = plt.plot(x, y, '--g', x2, y2, ':m', color='#0000CC')

Цветовой код можно посмотреть в палитре.
Или в виде кортежей формата: RGB и RGBA

lines = plt.plot(x, y, '--g', x2, y2, ':m', color=(0, 0, 0))

lines = plt.plot(x, y, '--g', x2, y2, ':m', c=(0, 0, 0, 0.5))

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

plt.plot(x2, y2, ':o')

отображает график с круглыми точками:

-11
типы маркеров
типы маркеров

Например, так:

-13

Другой способ определения маркера – использование параметра marker:

-14

lines = plt.plot(x, y, '-go', x2, y2, 's:m', marker='d') - для обоих графиков будет присвоен один и тот же маркер типа 'd'.

Для задания цвета маркера, отличного от цвета линии, применяется параметр markerfacecolor:

lines = plt.plot(x, y, '-go', x2, y2, 's:m', marker='d', markerfacecolor='w')

здесь он белый - цвет заливки маркера.

Все эти же действия по оформлению графика можно выполнять и с помощью функции setp().

plt.setp(lines[0], linestyle='-.', marker='s', markerfacecolor='b', linewidth=4)

Какие еще именованные параметры есть у функций setp() и plot()

-15

можно делать заливку областей графика с помощью функции:

fill_between(x,  y1,  y2=0,  where=None,  interpolate=False,  step=None,  *, data=None, **kwargs)

Основные параметры здесь следующие:

  • x, y1 – массивы значений координат x и функции y1;
  • y2 – массив (или число) для второй кривой, до которой производится заливка;
  • where – массив булевых элементов, который определяет области для заливки.
-16

Легенда - отобразить легенду можно с помощью метода ax.legend().

нам нужно для каждой линии (графика) добавить символьное имя. Это делается с помощью именованного параметра label:

ax.plot(np.arange(0, 5, 0.25), label='line1') ax.plot(np.arange(0, 10, 0.5), label='line2')

-17

Давайте сгенерируем вектор из 500 случайных величин и выведем их в виде гистограммы, используя функцию hist():

-18

Функции bar() и barh()

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

x = [f'H{i+1}' for i in range(10)]

y = np.random.randint(1, 5, len(x))

ax.bar(x, y)

Если нам нужно отображать столбики относительно оси ординат, то для этого существует функция barh(), которая работает аналогично функции bar():

ax.barh(range(len(x)-1), bars)

параметры обеих функций

-19

Круговые диаграммы

- используется функция pie(), например, следующим образом:

параметры функции

-20

Трехмерные графики в пакете matplotlib

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

Все дополнительные классы для работы в 3D находятся в модуле:

mpl_toolkits.mplot3d

и вначале мы его импортируем в нашу программу наряду с самим пакетом matplotlib и numpy:

-21

Итак, я построила трёхмерную дуру, по-Масяне, потом её анимирую.

-22

Анимация графиков - FuncAnimation и ArtistAnimation

Для упрощения создания анимации в пакете matplotlib предусмотрено два специальных класса:

  • FuncAnimation – создание анимации на основе функции;
  • ArtistAnimation – создание покадровой анимации.

с помощью импорта запускаем

from matplotlib.animation import FuncAnimation

С помощью класса ArtistAnimation анимация создается на основе уже готового списка объектов для каждого кадра. Поэтому, такой подход требует гораздо больше памяти устройства, чем с использованием класса FuncAnimation. Но плюсом является возможность создания более сложной анимационной картины.

Список для ArtistAnimation должен состоять из объектов, производных от класса:

matplotlib.artist.Artist

Данный класс хорошо подходит для анимирования 3D фигур, так как на их формирование требуется некоторое время.

5. Seaborn

— библиотека визуализации, основанная на бэкенде Matplotlib, тесно взаимодействует со структурами данных пандас. Перед началом импортируют несколько модулей:

import seaborn as sns

import pandas as pd

import numpy as np

import matplotlib

Плюсы

1. построение простых графиков в одну строчку кода

2. эстетичность - встроенные стили не требуют вмешательства.

-23

Можно почитать хабр и здесь.

6. Рисование графических примитивов в оконном интерфейсе программы - wxPython + PyGame для элементарной анимации

- пакет для графики описан в ссылке,

также там про матплотлиб, нампай, PyGame (библиотеку для рисования и манипуляцией графическими объектами), фласк и наследование +джава и джаваскрипт.

PyGame

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

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

Вообще, PyGame – это Python-обертка над С++ - библиотекой Simple Directmedia Layer (SDL) и имеет большое интернет-сообщество с официальным сайтом:

https://www.pygame.org

и подробной документацией:

https://www.pygame.org/docs/