ПЗ №5. Научные вычисления в Python

Хорошевич Павел Александрович

Экосистема научных модулей Python

Среда разработки Jupyter Lab/Lite

Jupiter Lab - среда программирования для создания интерактивных документов.

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

Код и текстовая разметка размещаются в ячейках разных типов.

Ячейки в блокноте можно запускать в произвольном порядке.

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

Доступна онлайн-версия Jupyter Lite.

Интерфейс Jupyter Lab/Lite

Интерфейс Jupyter Lab/Lite

Модули для научных вычислений

  • NumPy - обработка массивов.

  • Matplotlib - простроение графиков.

  • Pandas - анализ табличных данных.

  • SymPy - символьные вычисления.

Обработка массивов. Модуль NumPy

Импорт. Создание массива

Импорт модуля. Принято давать ему короткий псевдоним np:

import numpy as np

Создание массива по литералам:

a = np.array([0, 1, 2, 3])

Создание двумерного массива по литералам:

b = np.array([[0, 1, 2], [3, 4, 5]])

Функции заполнения массива

Равномерное заполнение:

a = np.arange(10) # от 0 до n-1

… или с указанием начала, конца и шага заполнения:

b = np.arange(1, 9, 2)

Заполнение по количеству точек:

c = np.linspace(0, 1, 6)   # начало, конец, количество точек

Заполнение случайными числами:

rng = np.random.default_rng(27446968)

a = rng.random(4)       # равномерное распределение на отрезке [0, 1]

Арифметические действия

NumPy-массивы могут быть операндами арифметических операторов.

Арифметические операторы применяются к каждому элементу массива. Результат вычислений - массив.

a = np.array([1, 2, 3, 4])
print(a + 1)
print(2 ** a)

Использование математических функций

Модуль NumPy содержит собственные реализации математических функций, применимых к NumPy-массивам1.

a = np.arange(5)

print(np.sin(a))
print(np.log(np.exp(a)))

Пример:

x = np.linspace(0, 1, 16)
y = np.sin(x) + 2

print(x)
print(y)

Построение графиков. Модуль Matplotlib

Назначение модуля

Matplotlib — библиотека для создания статических, анимированных и интерактивных визуализаций в Python1.

  • Построение 2D-графиков: линейные, точечные, столбчатые, круговые диаграммы;

  • настройка внешнего вида: цвета, стили линий, маркеры, подписи;

  • работа с подграфиками (несколько осей на одном холсте);

  • экспорт в форматы: PNG, PDF, SVG, EPS;

  • интеграция с Jupyter Lab для интерактивной работы;

Импорт и базовый синтаксис

import matplotlib.pyplot as plt

Пример:

x = np.linspace(0, 10, 50)      # 50 точек от 0 до 10
y = x * np.sin(x)               # вычисляем значения функции

plt.plot(x, y)                  # строим линию
plt.xlabel('x')                 # подпись оси X
plt.ylabel('y = x·sin(x)')      # подпись оси Y
plt.title('График функции')     # заголовок
plt.grid(True)                  # включаем сетку
plt.show()                      # отображаем график

Оформление графиков: линии, маркеры, цвета

Порядок аргументов в методе plot(): данные (x, y), строка формата, именованные параметры.

Форма точек

Форма точек

Формат линии

Формат линии

Несколько линий на одном графике

Каждый последовательный вызов метода plot() добавляет линию к текущему графику.

plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend()
plt.show()

Параметр label - название линии. Метод legend() добавляет легенду к графику.

Подграфики

Метод subplot() позволяет компоновать графики на одном изображении в виде таблицы.

plt.sublot(<строк>, <столбцов>, <номер_графика>)

Пример размещения графиков

Пример размещения графиков
# Два графика друг под другом
plt.subplot(2, 1, 1)        # 2 строки, 1 столбец, первый график
plt.plot(x, np.sin(x))
plt.title('sin(x)')

plt.subplot(2, 1, 2)        # второй график
plt.plot(x, np.cos(x))
plt.title('cos(x)')

plt.show()
plt.subplot(2, 1, 1)
plt.subplot(2, 3, 4)
plt.subplot(2, 3, 5)
plt.subplot(2, 3, 6)

Сложная компоновка графиков

Сложная компоновка графиков

Сохранение графика в файл

Метод savefig() сохраняет текущий график в файл с указанным именем.

plt.savefig('graph.png', dpi=300) # dpi - количество точек на дюйм

Анализ табличных данных. Модуль Pandas

Назначение модуля

Pandas - модуль для работы со структурированными данными.

Основной объект: DataFrame - таблица с:

  • именованными столбцами;

  • разными типами данных в столбцах (числа, строки, даты);

  • методами для фильтрации, группировки, аггрегирования.

Создание таблицы - объекта DataFrame

Импорт модуля:

import pandas as pd

Создание DataFrame с помощью словаря и списков:

df = pd.DataFrame({
    'Месяц': ['Сен', 'Окт', 'Ноя', 'Дек'],
    'Температура': [12.5, 8.3, 3.1, -1.2],
    'Осадки': [65, 78, 82, 90]
})

Загрузка данных из файла

Используем файл csv-формата для импорта в скрипт:

data = pd.read_csv('data_films.csv', sep=',', index_col=1)
  • первый параметр - путь к файлу;

  • sep - разделитель значений в строке;

  • index_col - индекс столбца с уникальным идентификатором данных;

Чтобы вевести первые 5 строк таблицы используем метод head():

data.head()

Свойства объекта DataFrame:

data.shape   # количество строк и столбцов
data.columns # список названий колонок таблицы

Получить содержимое колонки можно с помощью оператора индексирования:

data['Director']
data[['Director', 'Title']] # получение нескольких колонок - [[]] !

Фильтрация по условию:

data[data['Rating Imdb'] > 8.5]  # строки подходящие под условие - все колонки
data[data['Rating Imdb'] > 8.5]['Title'] # только указанные колонки

Агрегация данных

Функции агрегации:

data['Rating Kinopoisk'].mean()   # среднее значение в колонке
data['Rating Kinopoisk'].median() # медианное значение
data['Fees $'].max()              # максимум
i = data['Fees $'].idxmax()       # индекс максимума (какой фильм?)
data.loc[i]                       # строка таблицы по её уникальному индексу

Группируем данные по значению колонки:

groupby_year = data.groupby(['Year']) # группировка по году выхода фильма
groupby_year['Fees $'].max()          # максимальная выручка в каждом году

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

Модуль Pandas позволяет строить графики, обращаясь напрямую к объекту DataFrame.

Гистограмма:

data['Rating Imdb'].plot.hist(bins=20) # гистограмма с 20-ю диапазонами

Линия:

plt.figure(figsize=(15, 5))
plt.plot(yearly_fees.index, yearly_fees.values)