Каждая строка успешно преобразуется сначала в вещественное, а затем в целое число. Обратите внимание: данные хранятся в числовом формате, чтобы их можно было использовать для построения карты распределения населения.
Получение кодов стран
Прежде чем переходить к построению карты, необходимо разобраться еще с одним аспектом данных. Инструментарий Pygal для работы с географическими картами ожидает получить данные в четко определенном формате: страны должны задаваться кодами стран, а численность населения — значениями. Существует несколько стандартных наборов кодов стран, часто применяемых при работе с геополитическими данными; коды, включенные в population_data.json, состоят из трех букв, но Pygal использует систему с двухбуквенными кодами. Нужно найти способ получения двухбуквенных кодов стран по их названиям.
Коды стран Pygal хранятся в модуле i18n (сокращение от «internationalization»). В словаре COUNTRIES двухбуквенные коды стран являются ключами, а названия стран — значениями. Чтобы просмотреть коды, импортируйте словарь из модуля i18n и выведите его ключи и значения:
countries.py
from pygal.i18n import COUNTRIES
(1) for country_code in sorted(COUNTRIES.keys()):
. .print(country_code, COUNTRIES[country_code])
В цикле for ключи сортируются в алфавитном порядке (1) . Затем программа выводит каждый код страны и страну, с которой этот код связан:
ad Andorra
ae United Arab Emirates
af Afghanistan
...
zw Zimbabwe
Напишем функцию, которая перебирает COUNTRIES и возвращает коды стран. Функция будет размещаться в отдельном модуле с именем country_codes, чтобы ее можно было позднее импортировать в программу визуализации:
country_codes.py
from pygal.i18n import COUNTRIES
(1) def get_country_code(country_name):
. ."""Возвращает для заданной страны ее код Pygal, состоящий из 2 букв."""
(2) . .for code, name in COUNTRIES.items():
(3) . . . .if name == country_name:
. . . . . .return code
. .# Если страна не найдена, вернуть None.
(4) . .return None
. . . . . .
print(get_country_code('Andorra'))
print(get_country_code('United Arab Emirates'))
print(get_country_code('Afghanistan'))
Название страны передается функции get_country_code() и сохраняется в параметре country_name (1) . Затем программа перебирает пары «код—название» в COUNTRIES (2). Если название страны будет найдено, функция возвращает код страны (3), а если нет — после цикла добавляется строка, возвращающая None (4). Наконец, программа передает названия трех стран для проверки функции. Как и ожидалось, программа выводит три двухбуквенных кода:
ad
ae
af
Прежде чем переходить к использованию функции, удалите три команды print из country_codes.py.
Затем функция get_country_code() импортируется в world_population.py:
world_population.py
import json
from country_codes import get_country_code
...
# Вывод населения каждой страны за 2010 год.
for pop_dict in pop_data:
if pop_dict['Year'] == '2010':
country_name = pop_dict['Country Name']
population = int(float(pop_dict['Value']))
(1) . . . .code = get_country_code(country_name)
. . . .if code:
(2) . . . . . .print(code + ": "+ str(population))
(3) . . . .else:
. . . . . .print('ERROR - ' + country_name)
После извлечения названия и населения в code сохраняется код страны — или None, если код недоступен (1) . Если код получен, то код и население страны выводятся командой print (2). Если код недоступен, выводится сообщение об ошибке с названием страны, для которого не удалось найти код (3). Запустите программу, и вы увидите коды стран с населением и несколько сообщений об ошибках:
ERROR - Arab World
ERROR - Caribbean small states
ERROR - East Asia & Pacific (all income levels)
...
af: 34385000
al: 3205000
dz: 35468000
...
ERROR - Yemen, Rep.
zm: 12927000
zw: 12571000
Ошибки происходят по двум причинам. Во-первых, классификация в наборе данных не всегда осуществляется по странам; часть статистики относится к регионам или экономическим группам. Во-вторых, в части статистики используется другая запись полных названий стран (Yemen, Rep. вместо Yemen). Пока опустим данные стран, вызывающие ошибки, и посмотрим, как будет выглядеть карта с успешно прочитанными данными.
Построение карты мира
С имеющимися кодами стран карта мира строится легко и просто. В Pygal поддерживается тип диаграммы Worldmap, упрощающий работу с географическими наборами данных. В качестве примера использования Worldmap мы создадим простую карту с данными по Северной, Центральной и Южной Америке:
americas.py
import pygal
(1) wm = pygal.Worldmap()
wm.title = 'North, Central, and South America'
(2)wm.add('North America', ['ca', 'mx', 'us'])
wm.add('Central America', ['bz', 'cr', 'gt', 'hn', 'ni', 'pa', 'sv'])
wm.add('South America', ['ar', 'bo', 'br', 'cl', 'co', 'ec', 'gf',
. .'gy', 'pe', 'py', 'sr', 'uy', 've'])
. .
(3)wm.render_to_file('americas.svg')