- •Об авторе
- •О научных редакторах
- •Благодарности
- •От издательства
- •Введение
- •Для кого эта книга?
- •Почему Python?
- •План книги
- •Версия Python, платформа и IDE
- •Установка Python
- •Запуск Python
- •Использование виртуальной среды
- •Вперед!
- •Глава 1. Спасение моряков с помощью теоремы Байеса
- •Теорема Байеса
- •Проект #1. Поиск и спасение
- •Стратегия
- •Установка библиотек Python
- •Код для теоремы Байеса
- •Время сыграть
- •Итоги
- •Дополнительная литература
- •Усложняем проект. Более грамотный поиск
- •Усложняем проект. Поиск лучшей стратегии с помощью MCS
- •Усложняем проект. Вычисление вероятности обнаружения
- •Глава 2. Установление авторства с помощью стилометрии
- •Проект #2: «Собака Баскервилей», «Война миров» и «Затерянный мир»
- •Стратегия
- •Установка NLTK
- •Корпусы текстов
- •Код стилометрии
- •Итоги
- •Дополнительная литература
- •Практический проект: охота на собаку Баскервилей с помощью распределения
- •Практический проект: тепловая карта пунктуации
- •Усложняем проект: фиксирование частотности
- •Глава 3. Суммаризация текста с помощью обработки естественного языка
- •Стратегия
- •Веб-скрапинг
- •Код для «У меня есть мечта»
- •Установка gensim
- •Код для суммаризации речи «Заправляйте свою кровать»
- •Проект #5. Суммаризация речи с помощью облака слов
- •Модули Word Cloud и PIL
- •Код для создания облака слов
- •Итоги
- •Дополнительная литература
- •Усложняем проект: ночные игры
- •Усложняем проект: суммаризация суммаризаций
- •Глава 4. Отправка суперсекретных сообщений с помощью книжного шифра
- •Одноразовый блокнот
- •Шифр «Ребекка»
- •Проект #6. Цифровой ключ к «Ребекке»
- •Стратегия
- •Код для шифрования
- •Отправка сообщений
- •Итоги
- •Дополнительная литература
- •Глава 5. Поиск Плутона
- •Проект #7. Воссоздание блинк-компаратора
- •Стратегия
- •Данные
- •Код блинк-компаратора
- •Использование блинк-компаратора
- •Проект #8. Обнаружение астрономических транзиентов путем дифференцирования изображений
- •Стратегия
- •Код для детектора транзиентов
- •Использование детектора транзиентов
- •Итоги
- •Дополнительная литература
- •Практический проект: представление орбитальной траектории
- •Практический проект: найди отличия
- •Усложняем проект: сосчитаем звезды
- •Глава 6. Победа в лунной гонке с помощью «Аполлона-8»
- •Цель миссии «Аполлон-8»
- •Траектория свободного возврата
- •Задача трех тел
- •Проект #9. На Луну с «Аполлоном-8»!
- •Использование модуля turtle
- •Стратегия
- •Код программы для расчета свободного возврата «Аполлона-8»
- •Выполнение симуляции
- •Итоги
- •Дополнительная литература
- •Практический проект: симуляция шаблона поисков
- •Практический проект: запусти меня!
- •Практический проект: останови меня!
- •Усложняем проект: симуляция в истинном масштабе
- •Усложняем проект: реальный «Аполлон-8»
- •Глава 7. Выбор мест высадки на Марсе
- •Посадка на Марс
- •Карта MOLA
- •Проект #10. Выбор посадочных мест на Марсе
- •Стратегия
- •Код для выбора мест посадки
- •Результаты
- •Итоги
- •Дополнительная литература
- •Практический проект: убедимся, что рисунки становятся частью изображения
- •Практический проект: визуализация профиля высот
- •Практический проект: отображение в 3D
- •Практический проект: совмещение карт
- •Усложняем проект: три в одном
- •Усложняем проект: перенос прямоугольников
- •Глава 8. Обнаружение далеких экзопланет
- •Транзитная фотометрия
- •Проект #11. Симуляция транзита экзопланеты
- •Стратегия
- •Код для транзита
- •Эксперименты с транзитной фотометрией
- •Проект #12. Получение изображений экзопланет
- •Стратегия
- •Код для пикселизатора
- •Итоги
- •Дополнительная литература
- •Практический проект: обнаружение инопланетных мегаструктур
- •Практический проект: обнаружение транзита астероидов
- •Практический проект: добавление эффекта потемнения к краю
- •Практический проект: обнаружение пятен на звездах
- •Практический проект: обнаружение инопланетной армады
- •Практический проект: обнаружение планеты с луной
- •Практический проект: измерение продолжительности экзопланетного дня
- •Усложняем проект: генерация динамической кривой блеска
- •Глава 9. Как различить своих и чужих
- •Обнаружение лиц на фотографиях
- •Проект #13. Программирование робота-часового
- •Стратегия
- •Результаты
- •Обнаружение лиц в видеопотоке
- •Итоги
- •Дополнительная литература
- •Практический проект: размытие лиц
- •Усложняем проект: обнаружение кошачьих мордочек
- •Глава 10. Ограничение доступа по принципу распознавания лиц
- •Распознавание лиц с помощью LBPH
- •Схема распознавания лиц
- •Извлечение гистограмм локальных бинарных шаблонов
- •Проект #14. Ограничение доступа к инопланетному артефакту
- •Стратегия
- •Поддержка модулей и файлов
- •Код для захвата видео
- •Код для обучения алгоритма распознавания лиц
- •Код для прогнозирования лиц
- •Результаты
- •Итоги
- •Дополнительная литература
- •Усложняем проект: добавление пароля и видеозахвата
- •Усложняем проект: похожие лица и близнецы
- •Усложняем проект: машина времени
- •Глава 11. Создание интерактивной карты побега от зомби
- •Проект #15. Визуализация плотности населения с помощью хороплетной карты
- •Стратегия
- •Библиотека анализа данных
- •Библиотеки bokeh и holoviews
- •Установка pandas, bokeh и holoviews
- •Работа с данными по уровню безработицы и плотности населения в округах и штатах
- •Разбираем код holoviews
- •Код для отрисовки хороплетной карты
- •Планирование маршрута
- •Итоги
- •Дополнительная литература
- •Усложняем проект: отображение на карте изменения численности населения США
- •Глава 12. Находимся ли мы в компьютерной симуляции?
- •Проект #16. Жизнь, Вселенная и пруд черепахи Йертл
- •Код симуляции пруда
- •Следствия симуляции пруда
- •Измерение затрат на пересечение строк или столбцов сетки
- •Результаты
- •Стратегия
- •Итоги
- •Дополнительная литература
- •Дополнение
- •Усложняем проект: поиск безопасного места в космосе
- •Усложняем проект: а вот и Солнце
- •Усложняем проект: взгляд глазами собаки
- •Усложняем проект: кастомизированный поиск слов
- •Усложняем проект: что за сложную паутину мы плетем
- •Усложняем проект: идем вещать с горы
- •Решения для практических проектов
- •Глава 2. Определение авторства с помощью стилометрии
- •Охота на собаку Баскервилей с помощью распределения
- •Тепловая карта пунктуации
- •Глава 4. Отправка суперсекретных сообщений с помощью книжного шифра
- •Составление графика символов
- •Отправка секретов шифром времен Второй мировой войны
- •Глава 5. Поиск Плутона
- •Представление орбитальной траектории
- •Глава 6. Победа в лунной гонке с помощью «Аполлона-8»
- •Симуляция шаблона поисков
- •Заведи меня!
- •Останови меня!
- •Глава 7. Выбор мест высадки на Марсе
- •Убеждаемся, что рисунки становятся частью изображения
- •Визуализация профиля высоты
- •Отображение в 3D
- •Совмещение карт
- •Глава 8. Обнаружение далеких экзопланет
- •Обнаружение инопланетных мегаструктур
- •Обнаружение транзита астероидов
- •Добавление эффекта потемнения к краю
- •Обнаружение инопланетной армады
- •Обнаружение планеты с луной
- •Измерение продолжительности экзопланетного дня
- •Глава 9. Как различить своих и чужих
- •Размытие лиц
- •Глава 10. Ограничение доступа по принципу распознавания лиц
- •Усложняем проект: добавление пароля и видеозахвата
Проект#15.Визуализацияплотностинаселенияспомощьюхороплетнойкарты 317
(табл. 11.3). Можно рассматривать его как упорядоченную коллекцию столбцов с двумя индексированными массивами.
Таблица 11.3. Объект датафрейм
Индекс |
Столбцы |
|
|
|
|
|
|
|
|
||
Страна |
Штат |
Округ |
Население |
||
|
|||||
|
|
|
|
|
|
0 |
США |
Алабама |
Отога |
54 571 |
|
|
|
|
|
|
|
1 |
США |
Алабама |
Болдуин |
182 265 |
|
|
|
|
|
|
|
2 |
США |
Алабама |
Барбур |
27 457 |
|
|
|
|
|
|
|
3 |
США |
Алабама |
Бибб |
22 915 |
|
|
|
|
|
|
Первый индекс, для строк, работает аналогично массиву индексов в сериях. Второй отслеживает серии меток, где каждая метка представляет заголовок столбца. Датафреймы также напоминают словари; имена столбцов — ключи, а серии данных в каждом столбце — значения. Такая структура позволяет с легкостью управлять ими.
Разбор всей функциональности pandas занял бы целую книгу, к тому же много соответствующей информации опубликовано онлайн. Так что мы отложим дальнейшее обсуждение этой темы до листинга, где рассмотрим конкретные примеры применения функциональности pandas.
Библиотеки bokeh и holoviews
Модуль bokeh (https://bokeh.org/) является открытой интерактивной библиотекой визуализации для современных браузеров. Он предлагает элегантные графические решения для объемных или потоковых датасетов. Графические изображения получаются при помощи HTML и JavaScript, которые на сегодня лидируют среди языков программирования, используемых для создания интерактивных веб-страниц.
Открытая библиотека holoviews (https://holoviews.org) позволяет упростить анализ и визуализацию данных. Вместо построения графика через прямые вызовы к графической библиотеке, например bokeh или matplotlib, вы создаете описание данного объекта, и графические изображения становятся автоматическими визуальными представлениями этого объекта.
В галерее примеров holoviews есть несколько хороплетных карт, визуализированных с помощью bokeh (например, http://holoviews.org/gallery/demos/bokeh/ texas_choropleth_example.html). Позже мы разберем пример с визуализацией
318 Глава 11. Создание интерактивной карты побега от зомби
данных об уровне безработицы, чтобы понять, как аналогичным образом представить данные о плотности населения.
Установка pandas, bokeh и holoviews
Если вы проработали проект из главы 1, то pandas и NumPy у вас уже установлены. Если же нет, обратитесь за инструкциями к разделу «Установка библиотек Python» на с. 31.
Один из вариантов установить holoviews вместе с последней версией всех рекомендованных пакетов для работы с этим модулем под Linux, Windows или macOS — использовать Anaconda.
conda install -c pyviz holoviews bokeh
Таким образом вы установите библиотеку графики matplotlib и более интер активную библиотеку графики bokeh, служащие в качестве бэкенда1, а также блокнот Jupyter/IPython.
Аналогичный набор пакетов можно установить с помощью pip.
pip install 'holoviews[recommended]'
Через pip также доступны дополнительные минимальные настройки, если bokeh у вас уже установлена. Эти и прочие инструкции вы найдете на страницах http:// holoviews.org/install.html и http://holoviews.org/user_guide/Installing_and_Configuring.html.
Работа с данными по уровню безработицы и плотности населения в округах и штатах
Библиотека bokeh содержит файлы данных о границах округов и информацию об уровне безработицы в США для каждого округа от 2009 года. Как уже говорилось, с помощью данных о безработице мы разберемся, как отформатировать данные о плотности населения, которые возьмем из переписного листа 2010 года.
Чтобы скачать образцы данных bokeh, подключитесь к интернету, откройте оболочку Python и введите:
>>>import bokeh
>>>import bokeh.sampledata
>>>bokeh.sampledata.download()
1 Фронтендом в данном контексте является пользовательский код, например для отрисовки карты, а бэкенд при этом выполняет всю внутреннюю работу по этой отрисовке. — Примеч. пер.
Проект#15.Визуализацияплотностинаселенияспомощьюхороплетнойкарты 319
Creating C:\Users\lee_v\.bokeh directory
Creating C:\Users\lee_v\.bokeh\data directory
Using data directory: C:\Users\lee_v\.bokeh\data
Как видите, программа сообщает вам, куда помещает данные, чтобы bokeh могла автоматически их найти. В вашем случае путь будет другой. Более подробно о скачивании образцов данных — на https://docs.bokeh.org/en/latest/docs/reference/ sampledata.html.
Найдите в скачанном каталоге файлы US_Counties.csv и unempoyment109.csv. Эти текстовые файлы находятся в распространенном формате CSV. Каждая строка файла представляет запись с несколькими полями, разделенными точками.
Файл с информацией по безработице наглядно демонстрирует трудности специа листов по обработке данных. Откройте его, и вы увидите, что там отсутствуют имена столбцов, описывающие данные в них (рис. 11.3), хотя о значении большинства полей можно догадаться и так. С этим мы разберемся позже.
Рис. 11.3. Первые строки файла unemployment09.csv
Теперь откройте файл с информацией по округам Соединенных Штатов. Вы увидите очень много столбцов, но у них хотя бы есть заголовки (рис. 11.4). Наша задача — соотнести данные о безработице (см. рис. 11.3) с географическими данными (см. рис. 11.4): то же самое мы позже проделаем с информацией о плотности населения.
Рис. 11.4. Первые строки из файла US_Counties.csv
Сами же данные о плотности населения находятся в файле census_data_popl_2010. csv каталога Chapter_11, доступного для скачивания с сайта книги. В оригинале
320 Глава 11. Создание интерактивной карты побега от зомби
этот файл назывался DEC_10_SF1_GCTPH1_US05PR_with.ann.csv — я взял его с сайта American FactFinder. Однако к моменту публикации книги правительство США уже перенесло эти данные на новый сайт (вот их новый адрес: https://www.census. gov/data/what-is-data-census-gov.html1).
Заглянув в начало файла с информацией о плотности населения, мы увидим множество столбцов с двумя строками заголовков (рис. 11.5). Нас интересует столбец М под названием Density per square mile of land area — Population (Плотность на квадратную милю суши — Население).
Рис. 11.5. Первые несколько строк census_data_popl_2010.csv
Теперь у вас есть все библиотеки Python и данные, необходимые для генерации хороплетной карты плотности населения в теории. Но прежде чем мы сможем перейти к коду, необходимо понять, как именно связывать данные о населении с географическими данными, чтобы правильно вписать информацию по округу в его контуры.
Разбираем код holoviews
Умение адаптировать уже написанный код к собственным целям — очень ценный навык для специалиста по обработке данных. Здесь может потребоваться навык реверс-инжиниринга (обратной разработки). Поскольку открытое ПО является бесплатным, порой оно плохо документировано и приходится разбираться в коде самостоятельно. Итак, попробуем выполнить реверс-инжиниринг для текущей задачи.
1 На территории России доступ к данному ресурсу ограничен. — Примеч. ред.
Проект#15.Визуализацияплотностинаселенияспомощьюхороплетнойкарты 321
В предыдущих главах мы использовали примеры из галереи, предоставляемые открытыми модулями turtle и matplotlib. Библиотека holoviews тоже имеет свою галерею (http://holoviews.org/gallery/index.html), которая включает Texas Choropleth Example, хороплетную карту уровня безработицы в Техасе от 2009 года (рис. 11.6).
Рис. 11.6. Хороплетная карта уровня безработицы в Техасе от 2009 года из галереи holoviews
Листинг 11.1 содержит код, предоставленный holoviews для этой карты. Мы построим на основе данного примера проект, но для этого потребуется разобраться с двумя основными отличиями. Во-первых, мы планируем графически отобразить плотность населения, а не уровень безработицы. Во-вторых, нам нужна карта соседних штатов, а не только Техаса.
Листинг 11.1. Код из галереи holoviews для генерации хороплетной карты Техаса
texas_choropleth_example.html
import holoviews as hv from holoviews import opts hv.extension('bokeh')
from bokeh.sampledata.us_counties import data as counties
322 Глава 11. Создание интерактивной карты побега от зомби
from bokeh.sampledata.unemployment import data as unemployment
counties = [dict(county, Unemployment=unemployment[cid]) for cid, county in counties.items()
if county["state"] == "tx"]
choropleth = hv.Polygons(counties, ['lons', 'lats'],
[('detailed name', 'County'), 'Unemployment'])
choropleth.opts(opts.Polygons(logz=True,
tools=['hover'], xaxis=None, yaxis=None, show_grid=False, show_frame=False, width=500, height=500, color_index='Unemployment',
colorbar=True, toolbar='above', line_color='white'))
Этот код импортирует набор данных из bokeh . Нам нужно узнать формат и содержимое переменных unemployment и counties. К данным по уровню безработицы мы обратимся позже с помощью переменной unemployment и индекса или ключа cid, который может означать county ID . Программа выбирает из всех штатов именно Техас на основе условной инструкции, используя код state .
Разберем все это в оболочке Python.
>>> from bokeh.sampledata.unemployment import data as unemployment>>> type(unemployment)
<class 'dict'>
>>> first_2 = {k: unemployment[k] for k in list(unemployment)[:2]}
>>> for k in first_2:
print(f"{k} : {first_2[k]}")
(1, 1) : 9.7 (1, 3) : 9.1
>>>for k in first_2:
for item in k:
print(f"{item}: {type(item)}")
1: <class 'int'>
1:<class 'int'>
1:<class 'int'>
3:<class 'int'>
Начинаем с импорта набора данных из bokeh, используя синтаксис из примера галереи. Далее используем встроенную функцию type() для проверки типа данных переменной unemployment . Вы увидите, что это словарь.
Теперь с помощью функции генерации словаря создаем новый словарь, включающий две первые строки unemployment . Выводим результаты и видим, что ключи являются кортежами, а значения — числами, что позволяет отобразить