Время прочтения: 5 мин.

Думаю, ни для кого не секрет, что Python может всё или почти всё. Например, для построения графиков можно использовать matplotlib, для анализа и манипуляции данными — pandas, а для работы с массивами разработана numpy. А есть ли библиотека, которая может выполнять различные математические операции, например, интегрирование и дифференцирование, обработку изображений и сигналов, расчёт статистических распределений и функций? Конечно, есть! Это библиотека SciPy.

SciPy (сокращение от Scientific Python или научный Python) – библиотека, которая является расширением библиотеки NumPy и предназначена для выполнения сложных инженерных, статистических и научных расчётов, а так же для анализа данных и построения графиков.

Чем Scipy отличается от NumPy?

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

Второе отличие – методы и функции, которые содержатся в библиотеках. NumPy содержит немалое количество функций и методов для решения задач линейной алгебры, а также расчёта преобразования Фурье и обработки сигналов и изображений. Однако они неполноценные. В SciPy, наоборот, эти функции и методы реализованы в полном объеме, и их гораздо больше.

Третье отличие – концепция массивов. Массивы из библиотеки NumPy — это многомерные массивы объектов, которые имеют одинаковый тип, то есть они однородны или гомогенны. В SciPy концепция массивов немного другая, поскольку она более функциональна и не имеет ограничений на однородность. То есть массивы SciPy могут быть как гомогенными, так и гетерогенными.

Четвёртое отличие – язык написания библиотек и скорость.

Библиотека NumPy написана на языке C и, как следствие, имеет более высокую скорость вычислений. Однако за неё приходится платить функциональностью библиотеки. Библиотека SciPy написана на языке Python и поэтому имеет более низкую скорость выполнения, однако низкая скорость компенсируется предоставляемой функциональностью.

Каковы возможности библиотеки SciPy?

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

import scipy
help(scipy)

Перейду от слов к делу и посмотрю код

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

Integrate

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

# подключим пакет интегрирования из библиотеки scipy
from scipy import integrate
# опишем подынтегральную функцию
def target_function_f(x):
 return 2.0 * x ** 2
# выполним интегрирование
result = integrate.quad(target_function_f, 0.0, 4.0)
# посмотрим результат
print(result)
(42.66666666666667, 4.736951571734002e-13)

Отмечу, что в пакете integrate, помимо функции quad(), которая возвращает кортеж из двух элементов (первый — значение интеграла, второй — точность вычисления) реализованы другие методы нахождения интегралов. Вот некоторые из них: trapz() (метод трапеций), sims() (метод Симпсона), romb() (метод Ромберга) и т.д.

Io

Данный пакет предоставляет функции для работы и управления файлами самых разных форматов, включая MATLAB, файлы IDL, Matrix Market, Fortran, и даже WAV. Ниже рассмотрю кусок кода, который покажет каким образом можно добавить данные из файла формата MATLAB.

# импортируем пакет io из библиотеки scipy
from scipy import io as spio
import numpy as np
# создадим массив, который запишем в MATLAB файл;
x = np.ones((3,3))
# покажем только что созданный массив;
print('Array from Python')
print(x)
# запишем массив в MATLAB файл;
spio.savemat('f.mat', {'a':x})
# загрузим массив из MATLAB файла;
data = spio.loadmat('f.mat',struct_as_record=True)
# покажем только что загруженный массив;
print('Array from Matlab File')
print(data['a'])

Stats

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

В основе проверки на «нормальность» лежит проверка гипотез. Для проверки буду использовать две гипотезы. Истинная гипотеза говорит о нормальном распределении данных, а ложная подтверждает отсутствие нормального распределения.

Для проведения проверки буду использовать критерией Шапиро-Уилка. В результате проверки получу значение вычисленной статистики и p-значение. Для определения принадлежности результата к гипотезе буду использовать критический параметр альфа со значением 0,05. В случае если p-значение будет меньше 0,05, можно утверждать, что гипотеза ложная и данные не имеют нормального распределения, иначе данные распределены нормально.

Для проверки буду использовать набор данных с информацией о продаже видеоигр по всему миру с сайта Kaggle по ссылке. Проверяемым атрибута выберу EU_Sales (продажи в Европе):

import pandas as pd
# загрузим набор данных
data = pd.read_csv('vgsales.csv')
# просмотрим несколько строк из набора данных
data.head()
# выведем некоторые статистики
data.describe()
import scipy as sc
# запустим тест Шапиро-Уилка
statistics, p_Value = sc.stats.shapiro(data['EU_Sales'])
# выведем результаты теста Шапиро-Уилка
print('Stats=%.3f, pValue=%.3f' % (statistics, p_Value))
alpha = 0.05
#Выведем результаты о принятии или отклонении гипотезы о нормальности
if p_Value > alpha:
 print('Данные распределены нормально')
else:
 print('Данные не имеют нормального распределения')
Stats=0.256, pValue=0.000
Данные не имеют нормального распределения

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