Думаю, ни для кого не секрет, что 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 по ссылке: https://www.kaggle.com/datasets/gregorut/videogamesales?resource=download. Проверяемым атрибута выберем 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, рассмотрели возможности некоторых модулей. Более подробную и детальную информацию о данной библиотеке можно найти на официальном сайте документации, по ссылке: https://scipy.org/.

Комментарии (0)