Простой Python — страница 49 из 66

Python хорошо приспособлен для выпаса данных, и вы уже видели в этом приложении, что он хорош для работы с мультимедиа. Но как насчет игр?

Оказывается, Python — это настолько хорошая платформа для написания игр, что об этом пишут книги. Вот несколько из них:

• Invent Your Own Computer Games with Python, автор Эл Свайгарт (Al Sweigart) (http://inventwithpython.com/);

• The Python Game Book, автор Хорст Йенс (Horst Jens) (книга в формате docuwiki) (http://thepythongamebook.com/).

В Python wiki вы можете найти статью (https://wiki.python.org/moin/PythonGames), в которой содержится еще большее количество ссылок.

Самой известной платформой для написания игр, скорее всего, является pygame (http://pygame.org/). Вы можете загрузить исполняемый установщик для своей платформы с сайта Pygame и прочесть построчный пример создания игры (http://bit.ly/line-chimp).

Аудио и музыка

Что насчет звука, музыки и котов, которые поют Jingle Bells?

Сейчас мы поговорим о первых двух пунктах.

Стандартная библиотека содержит несколько рудиментарных модулей для работы с аудио в разделе служб мультимедиа (http://docs.python.org/3/library/mm.html). Кроме того, существует страница, на которой обсуждаются сторонние модули (https://wiki.python.org/moin/Audio).

Следующие библиотеки могут помочь вам генерировать музыку:

• pyknon (https://github.com/kroger/pyknon) — используется в книге Music for Geeks and Nerds, автор Педро Крогер (Pedro Kroger) (Create-Space);

• mingus (https://code.google.com/p/mingus/) — это музыкальный секвенсер, который может читать и создавать MIDI-файлы;

• remix (http://echonest.github.io/remix/python.html) оправдывает свое название — это API для создания ремиксов. Одним из примеров его использования является morecowbell.dj, который добавляет в загруженные песни звук колокольчиков;

• sebastian (https://github.com/jtauber/sebastian/) — это библиотека для музыкальной теории и анализа;

• Piano (http://bit.ly/py-piano) — позволяет вам играть на пианино с помощью клавиатуры, а именно клавиш C, D, E, F, A, B и C.

Наконец, рассмотрим библиотеки, которые помогут вам организовать свою коллекцию или дать вам доступ к музыкальным данным:

• Beets (http://beets.radbox.org/) — управляет вашей коллекцией музыки;

• API Echonest (http://developer.echonest.com/) — позволяет получить доступ к метаданным музыки;

• Monstermash (http://bit.ly/mm-karlgrz) — объединяет фрагменты песен, он создан с помощью Echonest, Flask, ZeroMQ и Amazon EC2;

• Shiva (http://bit.ly/shiva-api) — это RESTful API и сервер (https://github.com/tooxie/shiva-server), предназначенные для организации коллекции по вашему усмотрению;

• получите обложки альбомов для своей музыки по адресу http://jameh.github.io/mpd-album-art/.

Приложение Б. За работой

— Дела! — вскричал призрак, снова заламывая руки. — Забота о ближнем — вот что должно было стать моим делом…

Чарльз Диккенс. Рождественские повести

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

В области бизнеса мы используем все технологии из предыдущих глав — базы данных, веб-системы и сети. Продуктивность Python делает его более популярным и у корпораций (http://bit.ly/py-enterprise), и у стартапов (http://bit.ly/py-startups).

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

• динамическими языками вроде Python;

• Сетью как универсальным графическим интерфейсом пользователя;

• RESTful API как независимыми от языка интерфейсами служб;

• реляционными и NoSQL-базами данных;

• «большими данными» и аналитикой;

• облаками для развертывания и экономии капитала.

The Microsoft Office Suite

Бизнес сильно зависит от приложений Microsoft Office и форматов файлов. Несмотря на то что эти библиотеки не очень широко известны и в некоторых случаях плохо задокументированы, они могут пригодиться. Рассмотрим некоторые из них, они работают с документами Microsoft Office:

• docx (https://pypi.python.org/pypi/docx). Эта библиотека создает, считывает и записывает файлы для Microsoft Office Word 2007 с расширением. docx;

• python-excel (http://www.python-excel.org/). Здесь с помощью PDF-руководства рассматриваются модули xlrd, xlwt и xlutils. Excel также может читать и записывать файлы, содержащие значения, разделенные запятыми (Comma-Separated Value, CSV), с которыми вы уже умеете работать с помощью стандартного модуля csv;

• oletools (http://bit.ly/oletools). Эта библиотека извлекает данные из форматов Office.

Следующие модули автоматизируют приложения операционной системы Windows:

• pywin32 (http://sourceforge.net/projects/pywin32/). Этот модуль автоматизирует множество приложений Windows. Однако он использует только Python 2 и имеет скудную документацию — обратите внимание на эти статьи: http://bit.ly/pywin32-lib и http://bit.ly/pywin-mo;

• pywinauto (https://code.google.com/p/pywinauto/). Этот модуль также автоматизирует приложения Windows и использует только Python 2 — обратите внимание на эту статью;

• swapy (https://code.google.com/p/swapy/). Генерирует код на Python для pywinauto из встроенных элементов управления.

OpenOffice (http://openoffice.org/) — это альтернатива Office, имеющая открытый исходный код. Она работает в операционных системах Linux, Unix, Windows и OS X и также читает и записывает форматы файлов Office. Кроме того, это приложение устанавливает версию Python 3 для себя. Вы можете запрограммировать OpenOffice с помощью Python (https://wiki.openoffice.org/wiki/Python) и библиотеки PyUNO (http://www.openoffice.org/udk/python/python-bridge.html).

OpenOffice принадлежал компании Sun Microsystems, и когда компания Oracle приобрела компанию Sun, некоторые люди стали опасаться, что OpenOffice в будущем станет недоступен. В результате появился LibreOffice (https://www.libreoffice.org/). В DocumentHacker (http://bit.ly/docu-hacker) вы можете прочитать об использовании библиотеки Python UNO вместе с LibreOffice.

Для создания OpenOffice и LibreOffice пришлось выполнить реверс-инжиниринг форматов файлов Microsoft, что не так легко сделать. Модуль Universal Office Converter (http://dag.wiee.rs/home-made/unoconv/) зависит от библиотеки UNO в OpenOffice или LibreOffice. Он может преобразовывать файлы многих форматов: документы, электронные таблицы, графику и презентации.

Если у вас имеется таинственный файл, python-magic (https://github.com/ahupp/python-magic) может угадать его формат, проанализировав определенные последовательности байтов.

Библиотека python open document (http://appyframework.org/pod.html) позволяет вам предоставить код Python внутри шаблонов для создания динамических документов.

Формат PDF распространен также в области бизнеса, несмотря на то что он создан не компанией Microsoft. Движок ReportLab (http://www.reportlab.com/opensource/) имеет бесплатную и коммерческую версии генератора PDF, созданные с помощью Python. Если вам нужно отредактировать PDF-файл, вы можете найти помощь на сайте StackOverflow (http://bit.ly/add-text-pdf).

Выполняем бизнес-задачи

Вы можете найти модуль Python практически для чего угодно. Посетите сайт PyPI (https://pypi.python.org/pypi) и введите что-нибудь в строку поиска. Многие модули являются интерфейсами для общедоступных API различных служб. Вам могут быть интересны примеры, связанные с бизнес-задачами:

• отправка через Fedex (https://github.com/gtaylor/python-fedex) или UPS (https://github.com/openlabs/PyUPS);

• отправка почты с помощью API stamps.com (https://github.com/jzempel/stamps);

• прочтите дискуссию о применении Python для корпоративного интеллекта (http://bit.ly/py-biz);

• если кофемашины слетают с полок в Аноке, это результат действий покупателя или полтергейст? Cubes — это веб-сервер и браузер данных Online Analytical Processing (OLAP) (http://cubes.databrewery.org/);

• OpenERP — это крупная коммерческая система Enterprise Resource Planning (ERP) (https://www.openerp.com/), написанная с помощью Python и JavaScript, содержащая тысячи модулей-надстроек.

Обработка бизнес-данных

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

Электронные таблицы стали хорошим изобретением, и с течением времени бизнес пристрастился к ним. Многие непрограммисты стали заниматься программированием, поскольку эти таблицы стали называть макросами, а не программами. Но Вселенная постоянно расширяется, и данные пытаются выдержать ее темп. Более старые версии Excel были ограничены 65 536 рядами, а более новые не могли обработать больше миллиона. Когда данные организаций переросли один компьютер, ситуация стала похожа на то, как если бы штат перерос сотню человек, — внезапно вам становятся нужны новые слои, промежуточные уровни и коммуникация.

Программы, работающие с большим количеством данных, появились не из-за того, что данные на одном компьютере значительно разрослись, — они стали результатом попытки обобщить все данные, появляющиеся в бизнесе. Реляционные базы данных обрабатывают миллионы рядов, не взрываясь при этом, но они могут работать только с определенным количеством рядов или обновлений за раз. Старые добрые текстовые или бинарные файлы могут занимать гигабайты памяти, но если вам нужно обработать их все одновременно, требуется иметь достаточное количество памяти. Традиционное программное обеспечение для этого не подходит. Компаниям вроде Google и Amazon пришлось изобрести решения, позволяющие работать с данными такого масштаба. Netflix — это пример такого решения, созданный в облаке AWS от Amazon, который использует Python для объединения RESTful API, безопасности, развертывания и баз данных.

Извлечение, преобразование и загрузка

Подводные части айсбергов данных содержат всю работу по получению данных. Если говорить языком бизнеса, распространенными терминами являются «извлечение», «преобразование», «загрузка» (extract, transform, load, ETL). Синонимы вроде «выпас данных» могут создать впечатление, будто вы приручаете непокорного зверя — такая метафора может оказаться близкой. Эта задача может показаться решенной с точки зрения инженерии, но по большей части это искусство. Мы рассмотрим науку о данных более подробно в приложении В, поскольку именно на эту область разработчики тратят бо́льшую часть времени.

Если вы видели фильм «Волшебник страны Оз», то, помимо летающих обезьян, должны помнить фрагмент в конце, когда добрая волшебница сказала Дороти, что она может отправиться домой в Канзас, просто стукнув каблучком о каблучок. Даже когда я был моложе, я думал: «И она говорит об этом только сейчас?!» Хотя теперь я понимаю, что фильм был бы гораздо короче, если бы волшебница дала такой совет раньше.

Вот только мы живем не в фильме, здесь мы говорим о мире бизнеса, где сокращение времени на выполнение задач — это хорошо. Позвольте мне поделиться с вами парой советов. Большинство инструментов, которые вам понадобятся для повседневной работы с данными в бизнесе, вы уже знаете, поскольку прочитали о них в этой книге. Среди таких инструментов высокоуровневые структуры данных вроде словарей и объектов, тысячи стандартных и сторонних библиотек, а также сообщество экспертов, которое можно найти в поисковике.

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

1. Извлечение данных из файлов странных форматов или баз данных.

2. «Очистку» данных, которая охватывает множество областей, заполненных острыми объектами.

3. Преобразование дат, времени и наборов символов.

4. Выполнение каких-либо действий над данными.

5. Сохранение полученного результата в базе данных.

6. Откат к первому шагу: намылить, смыть, повторить.

Рассмотрим пример: вам нужно переместить данные из электронной таблицы в базу данных. Вы можете сохранить таблицу в формате CSV и использовать библиотеки Python, показанные в главе 8. Или же найти модуль, который считывает непосредственно бинарный формат электронной таблицы. Ваши пальцы знают, как набрать строку python excel в поисковике и найти сайты вроде Working with Excel files in Python (http://www.python-excel.org/). Вы можете установить один из необходимых пакетов с помощью pip и найти драйвер базы данных для Python, чтобы выполнить последнюю часть задания. Я упоминал SQLAlchemy и непосредственные драйверы базы данных в той же главе. Теперь вам нужно написать промежуточный код, и именно здесь структуры данных и библиотеки Python могут сэкономить ваше время.

Попробуем выполнить поставленную задачу, а затем выполнить ее снова, но уже используя библиотеки, которые позволяют сэкономить немного времени. Мы считаем CSV-файл, агрегируем все числа в одной колонке, упорядочив их по уникальному значению, и выведем результат на экран. Если бы мы решали задачу с помощью SQL, то использовали бы SELECT, JOIN и GROUP BY.

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

animal,bites,stitches,hush

bear,1,35,300

marmoset,1,2,250

bear,2,42,500

elk,1,30,100

weasel,4,7,50

duck,2,0,10

Мы хотим узнать, какое животное обходится нам дороже всего, поэтому агрегируем общую сумму взяток для каждого типа животного (количеством укусов и швов пусть займется интерн). Мы используем модуль csv, который рассматривали в разделе «CSV» главы 8 и счетчик Counter из подраздела «Подсчитываем элементы с помощью функции Counter()» раздела «Стандартная библиотека Python» главы 5. Сохраните этот код как zoo_counts.py:

import csv

from collections import Counter

counts = Counter()

with open('zoo.csv', 'rt') as fin:

····cin = csv.reader(fin)

····for num, row in enumerate(cin):

········if num > 0:

············counts[row[0]] += int(row[-1])

for animal, hush in counts.items():

····print("%10s %10s" % (animal, hush))

Мы пропустили первый ряд, поскольку в нем содержались только имена колонок. counts — это объект типа Counter, он управляет инициализацией суммы для каждого типа животного, устанавливая ее равной 0. Мы также применили форматирование, чтобы выровнять выводимую информацию по правому краю. Запустим наш код:

$ python zoo_counts.py

······duck·········10

·······elk········100

······bear········800

····weasel·········50

··marmoset········250

Ага! Это был медведь! Он был нашим основным подозреваемым все время, но теперь у нас есть доказательства.

Далее воссоздадим этот пример с инструментальным средством для обработки данных Bubbles (http://bubbles.databrewery.org/). Вы можете установить его, введя следующую команду:

$ pip install bubbles

Он требует наличия SQLAlchemy. Если у вас его нет, вам поможет команда pip install sqlalchemy. Так выглядит тестовая программа (назовите файл bubbles1.py), адаптированная из документации (http://bit.ly/py-bubbles):

import bubbles

p = bubbles.Pipeline()

p.source(bubbles.data_object('csv_source', 'zoo.csv', infer_fields=True))

p.aggregate('animal', 'hush')

p.pretty_print()

А теперь момент истины:

$ python bubbles1.py

2014-03-11 19:46:36,806 DEBUG calling aggregate(rows)

2014-03-11 19:46:36,807 INFO called aggregate(rows)

2014-03-11 19:46:36,807 DEBUG calling pretty_print(records)

+--+--+---+

|animal··|hush_sum|record_count|

+--+--+---+

|duck····|······10 |···········1 |

|weasel··|······50 |···········1 |

|bear····|·····800 |···········2 |

|elk·····|·····100 |···········1 |

|marmoset|·····250 |···········1 |

+--+--+---+

2014-03-11 19:46:36,807 INFO called pretty_print(records)

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

Сравнивая два примера, можно заметить, что пример с bubbles использовал один вызов функции (aggregate), чтобы заменить чтение и подсчет данных в формате CSV вручную. В зависимости от того, что вам нужно, инструментальные средства работы с данными могут сберечь вам много времени.

В более реалистичном примере наш файл может содержать тысячи строк (он становится опасным), в которых можно встретить опечатки вроде bare, запятые в числах и т. д. Чтобы найти хорошие примеры практических задач, связанных с данными, и их решений на Python и Java, обратитесь к книге Грега Уилсона (Greg Wilson) Data Crunching: Solve Everyday Problems Using Java, Python, and More (издательство Pragmatic Bookshelf).

Инструменты очистки данных могут сэкономить кучу времени, и Python имеет множество таких инструментов. Например, PETL (http://petl.readthedocs.org/) позволяет выполнять извлечение и переименование рядов и колонок. В приложении В рассматриваются особенно полезные инструменты для работы с данными: Pandas, NumPy и IPython. В дополнение к их широкой известности в научной среде они стали популярными инструментами среди разработчиков, работающих с финансами и данными. На конференции PyData в 2012 году компания AppData (http://bit.ly/py-big-data) рассматривала, как эти три и другие инструменты Python помогают обработать 15 Тбайт данных ежедневно. Это не опечатка — Python может обрабатывать очень большие объемы реальных данных.

Дополнительные источники информации

Иногда вам нужны данные, которые появляются где-то в другом месте. Рассмотрим некоторые источники данных из области бизнеса и правительственной информации.

• data.gov (https://www.data.gov/). Открывает доступ к тысячам наборов данных и инструментов. Его API созданы на основе CKAN, системы управления данными Python.

• Opening government with Python (http://sunlightfoundation.com/). Посмотрите видеоролики (http://bit.ly/opengov-py) и слайды (http://goo.gl/8Yh3s).

• python-sunlight (http://bit.ly/py-sun). Библиотеки, позволяющие получить доступ к Sunlight API (http://sunlightfoundation.com/api/).

• Froide (http://stefanw.github.io/froide/). Платформа, основанная на django, для управления свободой информационных запросов.

• 30 places to find open data on the Web (http://blog.visual.ly/data-sources/). Различные полезные ссылки.

Python в области финансов