Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Воган Ли - Python для хакеров (Библиотека программиста) - 2023.pdf
Скачиваний:
6
Добавлен:
07.04.2024
Размер:
14.76 Mб
Скачать

Проект#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 . Выводим результаты и видим, что ключи являются кортежами, а значения — числами, что позволяет отобразить