Книга: Автостопом по Python
Назад: 9. Программные интерфейсы
Дальше: 11. Хранение данных

10. Манипуляции с данными

В этой главе приводятся популярные библиотеки Python, предназначенные для работы с данными, которые могут быть численными, текстовыми, а также изображениями и аудио. Практически все эти библиотеки используются для решения уникальных задач, поэтому в этой главе мы лишь опишем их, не сравнивая друг с другом. Вы можете установить библиотеки из PyPI с помощью команды pip, если не указано иное:

$ pip install library

В табл. 10.1 кратко описываются библиотеки.

Таблица 10.1. Инструменты для работы с данными

Библиотека Python

Лицензия

Причины использовать

IPython

Лицензия Apache 2.0

Предоставляет улучшенный интерпретатор Python, имеющий историю ввода, интегрированный отладчик, а также возможность строить графики в терминале (с помощью версии с Qt)

NumPy

Лицензия BSD 3-clause

Предоставляет многомерные массивы и инструменты линейной алгебры, оптимизированные для скорости

SciPy

Лицензия BSD

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

Matplotlib

Лицензия BSD

Позволяет строить научные графики

Pandas

Лицензия BSD

Предоставляет ряды и объекты DataFrame, которые можно сохранять, объединять, группировать, выполнять агрегацию, индексировать окна и создавать их подмножества — очень похоже на R Data Frame или содержимое запроса SQL

Scikit-Learn

Лицензия BSD 3-clause

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

Rpy2

Лицензия GPLv2

Предоставляет интерфейс к R, который позволяет выполнять функции этого языка изнутри Python, а также передавать данные между двумя средами

SymPy

Лицензия BSD

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

nltk

Лицензия Apache

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

pillow / PIL

Стандартная  лицензия PIL  (наподобие лицензии MIT)

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

cv2

Лицензия Apache 2.0

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

Scikit-Image

Лицензия BSD

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

Практически все эти библиотеки зависят от библиотек, написанных на C, в частности от SciPy или одной из ее зависимостей NumPy. Это означает, что у вас могут возникнуть проблемы с их установкой, если вы работаете в ОС Windows. Если вы используете Python в основном для анализа научных данных и не знакомы с компилированием кода на C и FORTRAN в ОС Windows, рекомендуем выбрать Anaconda или один из других вариантов, представленных в разделе «Коммерческие дистрибутивы Python» главы 2. В противном случае всегда сначала пробуйте выполнять команду pip install, а если она даст сбой, обращайтесь к руководству по установке SciPy ().

Научные приложения

Python часто используется для создания высокопроизводительных научных приложений. Широко применяется в академических и научных проектах, поскольку код на нем легко писать и язык имеет высокую производительность. В Python для научных вычислений зачастую используются внешние библиотеки, обычно написанные на более быстрых языках (вроде C или FORTRAN для работы с матрицами). Основные используемые библиотеки — части «стека SciPy»: NumPy, SciPy, SymPy, Pandas, Matplotlib и IPython. Подробное знакомство с ними выходит за рамки темы этой книги. Однако вы можете найти полное введение для экосистемы научного Python в Python Scientific Lecture Notes (/).

IPython

IPython (/) — это улучшенная версия интерпретатора Python, име­ющая цветной интерфейс, более подробные сообщения об ошибках и режим встраивания, который позволяет отображать графики в терминале (в версии на основе Qt). Он является ядром по умолчанию для Jupyter (рассматриваются в разделе «Jupyter Notebooks» главы 7), а также интерпретатором по умолчанию для Spyder IDE (рассмат­ривается в подразделе «Spyder» раздела «IDE» главы 3). IPython поставляется вместе с Anaconda, описанной в разделе «Коммерческие дистрибутивы Python» главы 2.

NumPy

NumPy (/) является частью проекта SciPy, но она выпущена как отдельная библиотека, поэтому те, кому нужна лишь базовая функциональность, могут использовать ее, не устанавливая остальную часть SciPy.

NumPy с умом обходит проблему запуска более медленных алгоритмов в Python путем использования многомерных массивов и функций, которые работают с массивами. Любой алгоритм можно представить как функцию для массивов, что позволяет запускать алгоритмы быстро. Бэкендом выступает библиотека Automatically Tuned Linear Algebra Software (ATLAS) (/), а также другие низкоуровневые библиотеки, написанные на C и FORTRAN. NumPy совместима с версиями Python 2.6+ и 3.2+.

Рассмотрим пример умножения матриц с помощью array.dot(), а также «трансляции», представляющей собой поэлементное умножение, где строка или столбец повторяются для отсутствующих измерений:

>>> import numpy as np

>>>

>>> x = np.array([[1,2,3],[4,5,6]])

>>> x array([[1, 2, 3],

       [4, 5, 6]])

>>>

>>> x.dot([2,2,1])

array([ 9, 24])

>>>

>>> x  * [[1],[0]]

array([[1, 2, 3],

       [0, 0, 0]])

SciPy

SciPy (/) использует NumPy для выполнения математических функций. SciPy задействует массивы NumPy в качестве базовой структуры данных. Она поставляется с модулями для решения распространенных задач научного программирования, включая линейную алгебру, анализ, особые функции и константы, а также обработку сигналов.

Рассмотрим пример, в котором используются физические константы SciPy:

>>> import scipy.constants

>>> fahrenheit = 212

>>> scipy.constants.F2C(fahrenheit)

100.0

>>> scipy.constants.physical_constants['electron mass']

(9.10938356e-31, 'kg', 1.1e-38)

Matplotlib

Matplotlib (/) — это гибкая библиотека для сборки интерактивных 2D и 3D графиков, которые также могут быть сохранены как собранные вручную численные показатели. API во многом отражает API MATLAB (/), что упрощает переход пользователей MATLAB на Python. В галерее Matplotlib по адресу содержится множество примеров, а также исходный код к ним, что позволяет воссоздать их самостоятельно.

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

Для того чтобы строить графики, задействуйте Bokeh (/), использующую собственные библиотеки для визуализации, или Plotly (/), основанную на библиотеке D3.js (/), написанной на JavaScript, однако бесплатная версия Plotly может потребовать, чтобы вы хранили свои графики на их сервере.

Pandas

Pandas (/) (имя основано на фразе Panel Data — «панель с данными») — это библиотека, предназначенная для манипуляций с данными. Основана на NumPy, которая предоставляет множество полезных функций для получения доступа, индексирования, объединения и группирования данных. Основная структура данных (DataFrame) похожа на структуру, которую можно найти в среде статистического ПО R (то есть гетерогенные таблицы данных — имеющие в одних столбцах строки, а в других числа — с возможностью индексирования имени, операций с временными рядами, а также автоматического выстраивания данных). С ней также можно работать как с таблицей SQL или Excel Pivot Table, используя методы вроде groupby() или функции вроде pandas.rolling_mean().

Scikit-Learn

Scikit-Learn () — это библиотека, посвященная машинному обучению, которая предоставляет способы понижения размерности, заполнение отсутствующих данных, регрессию и модели классификации, модели деревьев, кластеры, автоматическую подстройку параметров моделей, построение графиков (с помощью Matplotlib) и многое другое. Она хорошо задокументирована и поставляется с огромным количеством примеров (). Scikit-Learn работает с массивами NumPy, но обычно может взаимодействовать с порциями данных от Panda без особых проблем.

Rpy2

Rpy2 () — это привязка к Python для статистического пакета R, позволяющая выполнять функции R из кода Python и передавать данные между двумя средами. Rpy2 — это объектно-ориентированная реализация привязки Rpy (/).

decimal, fractions и numbers

В Python определен фреймворк абстрактных базовых классов, предназначенный для разработки численных типов — от типа Number, который является основным численным типом, до типов Integral, Rational, Real и Complex. Разработчики могут создавать подклассы для этих классов при разработке других численных типов в соответствии с инструкциями, приведенными в библиотеке numbers (). Существует также класс decimal.Decimal, который отслеживает численную точность (предназначен для бухгалтерского дела и других задач, где требуется точность). Иерархия типов работает в соответствии с ожиданиями:

>>> import decimal

>>> import fractions

>>> from numbers import Complex, Real, Rational, Integral

>>>

>>> d = decimal.Decimal(1.11, decimal.Context(prec=5))  # precision

>>>

>>> for x in (3, fractions.Fraction(2,3), 2.7, complex(1,2), d):

...     print('{:>10}'.format(str(x)[:8]),

...           [isinstance(x, y) for y in (Complex, Real, Rational, Integral)])

...

         3 [True, True, True, True]

       2/3 [True, True, True, False]

       2.7 [True, True, False, False]

    (1+2j) [True, False, False, False]

  1.1 10000 [False, False, False, False]

Экспоненциальные, тригонометрические и другие распространенные функции находятся в библиотеке math, а соответствующие функции для комплексных чисел — в библиотеке cmath. Библиотека random предоставляет псевдослучайные числа, используя в качестве основного генератора Mersenne Twister (). На момент выхода версии Python 3.4 модуль statistics стандартной библиотеки предоставляет возможность определить среднее значение и медиану, а также квадратичное отклонение и дисперсию для выборки и совокупности.

SymPy

SymPy () — это библиотека, которую следует использовать при работе с символьной математикой в Python. Она полностью написана на Python и имеет опциональные расширения для ускорения работы, а также построения графиков и интерактивных сессий.

Символьные функции SymPy работают с объектами SymPy, такими как символы, функции и выражения, для создания других символьных выражений, например так:

>>> import sympy as sym

>>>

>>> x = sym.Symbol('x')

>>> f = sym.exp(-x**2/2) / sym.sqrt(2 * sym.pi)

>>> f sqrt(2)*exp(-x**2/2)/(2*sqrt(pi))

Их можно интегрировать как символьно, так и численно:

>>> sym.integrate(f, x)

erf(sqrt(2)*x/2)/2

>>>

>>> sym.N(sym.integrate(f, (x, -1, 1)))

0.68268 94921 37086

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

Манипуляции с текстом и его анализ

Инструменты для работы со строками в Python — одна из причин, почему многие начинают использовать язык. Мы кратко рассмотрим основные инструменты из стандартной библиотеки Python, а затем перейдем к библиотеке, которую применяют практически все члены сообщества для анализа текста: Natural Language ToolKit (nltk) ().

Инструменты для работы со строками стандартной библиотеки Python

Если в языке имеются символы, которые ведут себя особенным образом, когда записаны в нижнем регистре, работать с ними поможет метод str.casefold():

>>> 'Grünwalder Straße'.upper()

'GRÜNWALDER STRASSE'

>>> 'Grünwalder Straße'.lower()

'grünwalder straße'

>>> 'Grünwalder Straße'.casefold()

'grünwalder strasse'

Библиотека Python для работы с регулярными выражениями всеобъемлющая и мощная — мы видели ее в действии в пункте «Регулярные выражения (читаемость имеет значение)» на с. 177, поэтому мы не будем рассматривать ее подробно. Отметим лишь, что документация, которую можно получить с помощью вызова help(re), достаточно информативна, так что вам не придется открывать браузер во время написания кода.

Модуль difflib из стандартной библиотеки позволяет определить разницу между строками и имеет функцию get_close_matches(), которая может помочь при опечатках, когда существует известный набор правильных ответов (например, для сообщений об ошибке на сайте, посвященном путешествиям):

>>> import difflib

>>> capitals = ('Montgomery', 'Juneau', 'Phoenix', 'Little Rock')

>>> difflib.get_close_matches('Fenix', capitals)

['Phoenix']

nltk

Natural Language ToolKit (nltk) — это инструмент для анализа текста. Изначально выпущен Стивеном Бердом (Steven Bird) и Эдвардом Лопером (Edward Loper), чтобы помочь студентам усвоить курс Берда о Natural Language Processing (NLP), преподававшийся в University of Pennsylvania в 2001 году. Со временем вырос до размеров большой библиотеки, покрывающей множество языков и содержащей алгоритмы, связанные с последними исследованиями в области. Доступен под лицензией Apache 2.0, его загружают из PyPI более 100 000 раз в месяц. Его создатели выпустили книгу Natural Language Processing with Python (издательство O’Reilly): информация изложена в виде курса, который познакомит вас с Python и NLP.

Вы можете установить nltk из командной строки с помощью pip. Он полагается на библиотеку NumPy, поэтому сначала установите ее:

$ pip install numpy

$ pip install nltk

Если вы используете Windows и не можете заставить работать NumPy, установленный с помощью pip, можете попробовать выполнить инструкции, приведенные по адресу , на ресурсе Stack Overflow.

Размер и область видимости библиотеки могут отпугнуть некоторых пользователей, поэтому рассмотрим небольшой пример, иллюстрирующий, насколько просто работать с этим инструментом. Для начала нам понадобится получить набор данных () из отдельно загружаемого набора корпусов (/), включая инструменты для тегирования для нескольких языков и набора данных, на которых будут тестироваться алгоритмы. Они имеют лицензию, отличающуюся от лицензии nltk, поэтому убедитесь, что вы проверили лицензию выбранного набора данных. Если знаете название корпуса текста, который нужно загрузить (в нашем случае это Punkt tokenizer, который мы можем использовать для разбиения текстовых файлов на предложения или отдельные слова), можете сделать это с помощью командной строки:

$ python3 -m nltk.downloader punkt --dir=/usr/local/share/nltk_data

Или можете загрузить его в рамках интерактивной сессии — stopwords содержит список слов, из-за которых значительно увеличивается общее количество слов текста вроде the, in или and во многих языках:

>>> import nltk

>>> nltk.download('stopwords', download_dir='/usr/local/share/nltk_data')

[nltk_data] Downloading package stopwords to /usr/local/share/nltk_data...

[nltk_data]   Unzipping corpora/stopwords.zip.

True

Если вы не знаете название необходимого вам корпуса, можете запустить интер­активный загрузчик из интерпретатора Python, вызвав метод nltk.download() без передачи первого аргумента:

>>> import nltk

>>> nltk.download(download_dir='/usr/local/share/nltk_data')

Далее можно загрузить самую свежую версию набора данных и запустить ее в обработку. В этом фрагменте кода мы загружаем сохраненную копию «Дзена Питона»:

14304.png 

14310.png 

14314.png Корпуса загружаются медленно, поэтому нам нужно сделать это для того, чтобы действительно загрузить корпус stopwords.

14329.png Токенизатор требует наличия обученной модели — Punkt tokenizer (используемый по умолчанию) поставляется с моделью, обученной для английского языка (также выбран по умолчанию).

14348.png Биграмма — это пара соседних слов. Мы проходим по биграммам и считаем, сколько раз они встречаются.

14362.png Ключом для функции sorted() является количество элементов, они отсортированы в обратном порядке.

14374.png Конструкция '{:>25}' выравнивает справа строку с общей длиной, равной 25 символам.

14387.png Наиболее часто встречающейся биграммой «Дзена Питона» является фраза better than («лучше, чем»).

14399.png В этот раз для того, чтобы избежать большого количества слов the и is, мы удалим stopwords.

14410.png В версиях Python 3.1 и выше для подсчета можно использовать метод collec­tions.Counter.

В этой библиотеке еще много интересного — выделите выходные и исследуйте ее!

SyntaxNet

Библиотека SyntaxNet от Google, созданная на основе TensorFlow, предоставляет обученный анализатор для английского языка (по имени Parsey McParseface) и фреймворк для сборки других моделей, даже для других языков, если у вас будут под рукой соответствующие данные. В настоящий момент библиотека доступна только для Python 2.7; подробные инстуркции по ее загрузке и использованию вы можете найти на странице .

Работа с изображениями

Тремя наиболее популярными библиотеками для обработки изображений и выполнения действий с ними в Python являются Pillow (дружественная параллельная версия библиотеки Python Imaging Library (PIL), которая подходит для преобразования форматов и простой обработки изображений), cv2 (привязка к Python для библиотеки Open-Source Computer Vision (OpenCV), которую можно использовать для определения лиц в реальном времени, а также для реализации других продвинутых алгоритмов) и более новая Scikit-Image (предоставляет возможности по простой обработке изображений, а также примитивы вроде пятен и фигур и функциональность для обнаружения границ). В следующих разделах приведена более подробная информация о каждой из них.

Pillow

Python Imaging Library (PIL) (/) — одна из основных библиотек для выполнения различных действий с изображениями в Python. Последняя ее версия выпущена в 2009 году, она не была портирована на Python 3. К счастью, активно разрабатывается параллельная версия, которая называется Pillow (/) (ее проще устанавливать, она работает во всех операционных системах и поддерживает Python 3).

Перед установкой Pillow вам нужно установить ее зависимости. Более подробные инструкции для своей платформы вы можете найти по адресу (после этого все выглядит довольно понятно):

$ pip install Pillow

Рассмотрим пример использования Pillow (для команды import from применяется имя PIL, а не Pillow):

from PIL import Image, ImageFilter

# Считываем изображение

im = Image.open( 'image.jpg' )

# Показываем изображение

im.show()

# Применяем фильтр к изображению

im_sharp = im.filter( ImageFilter.SHARPEN )

# Сохраняем отфильтрованное изображение в новый файл

im_sharp.save( 'image_sharpened.jpg', 'JPEG' )

# Разбиваем изображение на соответствующие bands (то есть на красный, зеленый

# и синий для RGB)

r,g,b = im_sharp.split()

# Просматриваем данные EXIF, встроенные в изображение

exif_data = im._getexif()

exif_data

Другие примеры применения библиотеки Pillow смотрите в руководстве к ней по адресу .

cv2

Библиотека OpenSource Computer Vision (OpenCV) () предлагает более широкие возможности для работы с изображениями и их обработки, нежели PIL. Написана на C и C++ и концентрируется на распознавании образов машиной в реальном времени. Например, она содержит первую модель, использованную при распознавании лиц в реальном времени (уже обученная на тысячах лиц; в примере по адресу показывается ее применение в коде Python), модель распознавания лиц, а также модель распознавания людей среди всего остального. Реализована на нескольких языках и распространена повсеместно.

В Python обработка изображений с помощью OpenCV реализована с использованием библиотек cv2 и NumPy. Третья версия OpenCV имеет связки для версий Python 3.4 и выше, но библиотека cv2 все еще связана с OpenCV2, которая не имеет привязки к этим версиям Python. Инструкции по установке, размещенные по адресу , содержат подробную информацию для ОС Windows и Fedora, используется версия Python 2.7. Если вы работаете с OS X, то вы сами по себе. Наконец, существует вариант установки для ОС Ubuntu с использованием Python 3 (). Если процесс установки станет сложным, вы можете загрузить Anaconda; они имеют бинарные файлы cv2 для всех платформ (можете прочесть статью Up & Running: OpenCV3, Python 3, & Anaconda по адресу , чтобы узнать, как применять cv2 и Python 3 в Anaconda).

Рассмотрим пример использования cv2:

from cv2 import *

import numpy as np

# Считываем изображение

img = cv2.imread('testimg.jpg')

# Показываем изображение

cv2.imshow('image',img)

cv2.waitKey(0)

cv2.destroyAllWindows()

# Применяем к изображению фильтр Grayscale

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Сохраняем отфильтрованное изображение в новый файл

cv2.imwrite('graytest.jpg',gray)

В сборнике руководств к OpenCV по адресу представлено еще больше примеров для Python.

Scikit-Image

Популярность более новой библиотеки Scikit-Image (/) растет отчасти благодаря тому, что большая часть ее исходного кода написана на Python, также она имеет отличную документацию. У нее нет полнофункциональных алгоритмов, как cv2, которую вы все еще можете использовать для алгоритмов, работающих с видео в реальном времени, но она полезна для ученых (например, они используют функции вроде определения пятен). Кроме того, библиотека включает инструменты для стандартной обработки изображений вроде фильтрации и настройки контрастности. Например, Scikit-image использовалась для создания изображений малых лун Плутона (/). На основной странице Scikit-Image можно найти дополнительные примеры (/).

ATLAS — это развивающийся программный проект, который предоставляет протестированные производительные библиотеки для работы с линейной алгеброй. Он предоставляет интерфейсы на языках C и FORTRAN 77 для программ из хорошо известных Basic Linear Algebra Subset (BLAS) и Linear Algebra PACKage (LAPACK).

Одним из популярных инструментов, использующим числа Python, является SageMath (/) — всеобъемлющий инструмент, который определяет классы для представления полей, колец, алгебр и доменов, а также предоставляет символьные инструменты, унаследованные из SymPy, и численные инструменты, унаследованные из NumPy, SciPy и многих других библиотек, написанных как на Python, так и на других языках.

В операционной системе Windows на момент написания книги nltk доступен только для Python 2.7. Попробуйте запустить его на Python 3; метки «Python 2.7» могли устареть.

Алгоритм Punkt tokenizer создан Тибором Киссом (Tibor Kiss) и Яном Странком (Jan Strunk) в 2006 году (). Представляет собой не зависящий от языка способ определять границы предложения, например конструкция Mrs. Smith and Johann S. Bach listened to Vivaldi будет корректно определена как одно предложение. Алгоритм необходимо обучить на большом наборе данных, но алгоритм для английского языка, используемый по умолчанию, уже обучен.

Эти шаги сработали для нас: для начала используйте команду brew install opencv или brew install opencv3 --with-python3. Далее следуйте инструкциям (вроде связывания с NumPy). Наконец, добавьте каталог, содержащий общий файл объекта OpenCV (например, /usr/local/Cellar/opencv3/3.1.0_3/lib/python3.4/site-packages/) к вашему пути; или введите команду add2virtualenvironment (), установленную вместе с библиотекой virtualenvwrapper, если собираетесь использовать библиотеку только в виртуальной среде.

Назад: 9. Программные интерфейсы
Дальше: 11. Хранение данных