С недавнего времени в финансовой индустрии развился значительный интерес к Python. Адаптируя программное обеспечение, показанное в приложении В, а также разрабатывая собственное, группа Pythonquants создает новое поколение финансовых инструментов.
• Quantitative economics (http://quant-econ.net/). Этот инструмент предназначен для экономического моделирования, с его помощью вы можете выполнить множество расчетов, применяя Python.
• Python for finance (http://www.python-for-finance.com/). Этот сайт представляет книгу Ивса Хилпиша (Yves Hilpisch) Derivatives Analytics with Python: Data Analytics, Models, Simulation, Calibration, and Hedging (издательство Wiley).
• Quantopian (https://www.quantopian.com/). Это интерактивный сайт, на котором вы можете писать собственный код Python и запускать его для архива данных об акциях.
• PyAlgoTrade (http://gbeced.github.io/pyalgotrade/). Еще один инструмент для тестирования на исторических данных, но уже для вашего собственного компьютера.
• Quandl (http://www.quandl.com/). Используйте этот инструмент для поиска в миллионах единиц финансовых данных.
• Ultra-finance (https://code.google.com/p/ultra-finance/). Библиотека, содержащая набор информации об акциях, которая обновляется в реальном времени.
• Python for Finance (издательство O’Reilly). Книга Ивса Хилпиша (Yves Hilpisch), содержащая примеры финансового моделирования, написанные на Python.
Безопасность бизнес-данных
Безопасность — это особая забота для бизнеса. Целые книги посвящены этой теме, поэтому мы лишь упомянем несколько советов, связанных с Python.
• В разделе «Scapy» главы 11 рассматривается scapy, язык на базе Python для экспертизы пакетов. Он используется для объяснения некоторых крупных сетевых атак.
• Сайт Python Security (http://www.pythonsecurity.org/) содержит дискуссии на тему безопасности, детали некоторых модулей Python и вспомогательные таблицы.
• Книга Ти Джея О’Коннора (TJ O’Connor) Violent Python (с подзаголовком A Cookbook for Hackers, Forensic Analysts, Penetration Testers and Security Engineers) (издательство Syngress) — это широкий обзор Python и компьютерной безопасности.
Карты
Карты стали полезными для многих бизнесов. Python очень хорошо рисует карты, поэтому мы потратим немного времени на эту тему. Менеджеры любят графики, и если вы можете быстро нарисовать красивую карту сайта вашей организации, это вам не повредит.
В ранние дни существования Интернета я посещал экспериментальный сайт по созданию карт у Xerox. Когда появились крупные сайты вроде Google Maps, они стали откровением (к тому же вызывали мысль: «Почему я не подумал об этом и не заработал миллионы?»). Теперь службы картографии и службы, основанные на определении местоположения, практически везде, они особенно удобны в мобильных устройствах.
Здесь пересекается множество терминов: картография, GIS (geographic information system — географическая информационная система), GPS (Global Positioning System — глобальная система позиционирования), анализ геопространства и многие другие. Блог Geospatial Python (http://bit.ly/geospatial-py) воплощает образ системы размером с «800-фунтовую гориллу» GDAL/OGR, GEOS и PROJ.4 (проекции) и вспомогательные системы, представленные как обезьяны.
Многие из этих служб имеют интерфейсы Python. Поговорим о некоторых из них, начиная с самых простых форматов.
Форматы
Мир картографии имеет множество форматов: векторный (линии), растровый (изображения), метаданные (слова) и их комбинации.
Esri, первая географическая система, изобрела формат шейп-файл более 20 лет назад. Файл формата шейп-файл содержит несколько файлов, содержащих как минимум следующую информацию:
•.shp — информация о фигуре (вектор);
•.shx — индекс формы;
•.dbf — база данных атрибутов.
Рассмотрим некоторые модули для работы с такими файлами.
• pyshp (https://code.google.com/p/pyshp/) — это библиотека для работы с шейп-файлами, написанная полностью на Python.
• shapely (http://toblerity.org/shapely/) решает геометрические вопросы наподобие «Какие строения в этом городе через 50 лет окажутся в зоне наводнения?».
• fiona (https://github.com/Toblerity/Fiona) оборачивает библиотеку OGR, которая работает с шейп-файлами и другими векторными форматами.
• kartograph (http://kartograph.org/) отрисовывает шейп-файлы в карты формата SVG на сервере или клиенте.
• basemap (http://matplotlib.org/basemap/) наносит двухмерные данные на карты и использует matplotlib.
• cartopy (http://scitools.org.uk/cartopy/docs/latest/) использует matplotlib и shapely для того, чтобы рисовать карты.
Получим шейп-файл для нашего следующего примера. Посетите страницу http://bit.ly/cultural-vectors. В разделе Admin 1 — States and Provinces нажмите зеленую кнопку download states and provinces (загрузить штаты и провинции), чтобы загрузить архив. После загрузки разархивируйте файл, вы должны увидеть такой результат:
ne_110m_admin_1_states_provinces_shp.README.html
ne_110m_admin_1_states_provinces_shp.sbn
ne_110m_admin_1_states_provinces_shp.VERSION.txt
ne_110m_admin_1_states_provinces_shp.sbx
ne_110m_admin_1_states_provinces_shp.dbf
ne_110m_admin_1_states_provinces_shp.shp
ne_110m_admin_1_states_provinces_shp.prj
ne_110m_admin_1_states_provinces_shp.shx
Мы будем использовать эти файлы в наших примерах.
Нарисуем карту
Для прочтения шейп-файла вам понадобится эта библиотека:
$ pip install pyshp
Теперь введите текст программы, map1.py, который я модифицировал из статьи в блоге Geospatial Python (http://bit.ly/raster-shape):
def display_shapefile(name, iwidth=500, iheight=500):
····import shapefile
····from PIL import Image, ImageDraw
····r = shapefile.Reader(name)
····mleft, mbottom, mright, mtop = r.bbox
····# map units
····mwidth = mright — mleft
····mheight = mtop — mbottom
····# scale map units to image units
····hscale = iwidth/mwidth
····vscale = iheight/mheight
····img = Image.new("RGB", (iwidth, iheight), "white")
····draw = ImageDraw.Draw(img)
····for shape in r.shapes():
········pixels = [
············(int(iwidth — ((mright — x) * hscale)), int((mtop — y) * vscale))
············for x, y in shape.points]
········if shape.shapeType == shapefile.POLYGON:
············draw.polygon(pixels, outline='black')
········elif shape.shapeType == shapefile.POLYLINE:
············draw.line(pixels, fill='black')
····img.show()
if __name__ == '__main__':
····import sys
····display_shapefile(sys.argv[1], 700, 700)
Эта программа считывает шейп-файл и проходит по отдельным фигурам. Я ищу только два типа фигур: многоугольник, который соединяет последнюю точку с начальной, и ломаную линию, которая этого не делает. Я строил свою логику на основе оригинальной статьи и беглого просмотра документации pyshp, поэтому вполне уверен в том, что знаю, как работает программа. Иногда вам просто нужно начать и затем справляться с возникающими проблемами.
Запустим наш код. Аргументом станет базовое имя для шейп-файла, не содержащее расширения:
$ python map1.py ne_110m_admin_1_states_provinces_shp
Вы должны увидеть что-то похожее на рис. Б.1.
Рис. Б.1. Предварительная карта
Что ж, программа нарисовала карту, которая напоминает Соединенные Штаты, но:
• между Аляской и Гавайями видим что-то вроде растрепанных кошкой ниток — это баг;
• страна сплющена, а мне нужна проекция;
• картинка не очень красивая — мне нужно задать стиль.
По поводу первого пункта: в логике программы есть ошибка, но что мне делать? В главе 12 рассматриваются советы для разработчиков, включая информацию об отладке, но мы можем рассмотреть и другие варианты. Я мог бы написать несколько тестов и работать, пока не исправлю ошибку, или же могу применить какую-нибудь другую библиотеку для создания карты. Возможно, более высокоуровневое решение поможет мне справиться со всеми тремя проблемами (лишние линии, сплющенный вид и примитивный стиль).
Вот несколько ссылок на картографическое программное обеспечение Python.
• basemap (http://matplotlib.org/basemap/). Основана на matplotlib, предназначена для рисования карт и перекрытия их данных.
• mapnik (http://mapnik.org/). Библиотека, написанная на C++, имеющая привязку к Python. Используется для создания векторных (линии) и растровых (изображения) карт.
• tilemill (https://www.mapbox.com/tilemill/). Студия дизайна карт, основанная на mapnik.
• Vincent (http://vincent.readthedocs.org/). Преобразуется в Vega, инструмент визуализации JavaScript, смотрите руководство http://wrobstory.github.io/2013/10/mapping-data-python.html.
• Python for ArcGIS (http://bit.ly/py-arcgis). Ссылки на ресурсы Python для коммерческого продукта ArcGIS фирмы Esri.
• Spatial analysis with python (http://bit.ly/spacial-analysis). Ссылки на руководства, пакеты и видеоролики.
• Using geospatial data with python (http://bit.ly/geos-py). Видеопрезентации.
• So you’d like to make a map using Python (http://bit.ly/pythonmap). Использует pandas, matplotlib, shapely и другие модули Python для создания карт с расположением памятных плит на зданиях.
• Python Geospatial Development (Packt). Книга Эрика Вестры (Eric Westra), содержащая примеры использования mapnik и других инструментов.
• Learning Geospatial Analysis with Python (Packt). Еще одна книга. Ее написал Джоэл Лохед (Joel Lawhead). Он сделал обзор форматов и библиотек, а также включил геопространственные алгоритмы.
Все эти модули создают красивые карты, но их труднее установить и изучить. Некоторые из них зависят от другого ПО, которого вы еще не видели, вроде numpy и pandas. Стоит ли овчинка выделки? Как разработчикам, нам часто нужно совершать подобные сделки, основываясь на неполной информации. Если вам интересны карты, попробуйте загрузить и установить один из этих пакетов и посмотреть, что вы можете с его помощью сделать. Или можете избежать установки ПО и попробовать соединиться с API удаленного сервера самостоятельно — в главе 9 показывается, как можно соединяться с веб-серверами и декодировать ответы JSON.
Приложения и данные
Мы говорили о рисовании карт, но с данными о картах вы можете сделать гораздо большее. Геокодирование преобразует адреса в географические координаты и наоборот. Существует множество геокодирующих API (http://www.programmableweb.com/apitag/geocoding) (их сравнение вы можете увидеть на сайте http://bit.ly/free-geo-api) и библиотек Python: geopy (https://code.google.com/p/geopy/), pygeocoder (https://pypi.python.org/pypi/pygeocoder) и googlemaps (http://py-googlemaps.sourceforge.net/). Если вы авторизуетесь с помощью Google или другого источника, чтобы получить ключ для API, вы сможете получить доступ к другим службам, выполняющим, например, пошаговое прокладывание маршрутов путешествий или локальный поиск.
Вот несколько ресурсов, касающихся отображения данных.
• http://www.census.gov/geo/maps-data/. Обзор файлов карт U.S. Census Bureau.
• http://www.census.gov/geo/maps-data/data/tiger.html. Множество географических и демографических карт.
• http://wiki.openstreetmap.org/wiki/Potential_Datasources. Мировые ресурсы.
• http://www.naturalearthdata.com/. Векторные и растровые данные карт в трех масштабах.
Нам следует упомянуть здесь Data Science Toolkit (http://www.datasciencetoolkit.org/). Он содержит бесплатные возможности двухстороннего геокодирования, вычисления координат политических границ и статистики и даже больше. Вы можете загрузить все данные и ПО как виртуальную машину и запустить их отдельно на своем компьютере.
Приложение В. Py в науке