Python карта регионов россии

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Создание тематических карт регионов РФ

rusakovprz/thematic_map

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

Создание тематических карт регионов РФ

Это приложение, которое позволяет отображать данные на карте регионов (субъектов федерации) России – раскрашиват регионы в тот или иной цвет в зависимости от значения определенного признака. На входе имеем файл в формате csv, который содержит две колонки – код региона и значение признака. На выходе имеем раскрашенную карту в формате png.

  • Для карты графств США процедура создания скрипта описана здесь — http://flowingdata.com/2009/11/12/how-to-make-a-us-county-thematic-map-using-free-tools/ задача заключалась в том, чтобы модифицировать скрипт для карты регионов России, добавив в него некоторые функции.
  • Процесс написания скрипта для создания png-карты из svg-файла и файла с данными подробно описан здесь — http://flowingdata.com/2009/11/12/how-to-make-a-us-county-thematic-map-using-free-tools/ . Он просто повторён для России.
  • Заложина возможность создания карты в нескольких цветовых палитрах. Варианты цветовых палитр см. на http://colorbrewer2.org . Одна из цветовых палитр — градации серого. Кроме нее, реализованно еще три варианта: оранжевый, фиолетовый, зеленый.
  • Разбивка данных на интервалы. Предусмотрены следующие возможности: ручная разбивка на 4, 5 и 6 интервалов с ручным заданием границ интервалов (обратите внимание, что коды цветов для палитр с разным количеством интервалов можно узнать на colorbrewer2.org , меняя параметр «number of data classes on your map» в левом верхнем углу страницы). Второй вариант задания интервалов должен быть автоматическим. В этом случае данные автоматически должны делиться на 5 интервалов по квинтилям (нижние 20% случаев в одном интервале, следующие 20% случаев – во втором и т.д.).
  • На карте присутствует легенда с указанием того, какой цвет какому интервалу соответствует.
  • Работа с неполными данными. Иногда для некоторых регионов отсутствуют исходные данные. В csv-файле с данными отсутствующие значения обозначаются как «NA», «.» или просто пробел. В этом случае в цветных палитрах регионы с отсутствующими данными окрашиваются на карте серым цветом. В черно-белой палитре такие регионы заштрихованы. Цвет или рисунок, присвоенный отсутствующим значениям, также выводиться в легенду (в случае когда отсутствующие значения имеются).
  • Получившаяся карта сохраняется в формате png по заданнаму пути в локальной файловой системе.
Читайте также:  Javascript дата с нулем

Примеры получаемых изображений (карт)

Источник

Визуализация данных на российской карте библиотекой Plotly

Часто для визуализации данных подходит карта: например, когда нужно показать, как статистика ведёт себя в определённых городах, областях, регионах. В таких случаях каждый регион или другая административная единица кодируется: ее границы преобразуют в полигоны и мультиполигоны с координатами широты и долготы относительно карты мира. Для Америки и Европы не составит труда найти встроенное в библиотеку Plotly решение, но в случае с картой России такого реализованного решения сходу найти не удалось. Сегодня мы разметим готовый geojson файл с административными границами регионов России, напишем парсер последних данных по коронавирусу и визуализируем статистику на карте при помощи библиотеки Plotly.

from urllib.request import urlopen import json import requests import pandas as pd from selenium import webdriver from bs4 import BeautifulSoup as bs import plotly.graph_objects as go

Правим geojson

Скачаем открытый geojson с границами российских регионов, найденный по одной из первых ссылок в Google по запросу «russia geojson». В нём уже есть кое-какие данные: например, наименования регионов. Но этот geojson-файл пока ещё не подходит под требуемый формат Plotly: в нём не размечены идентификаторы регионов.

with urlopen('https://raw.githubusercontent.com/codeforamerica/click_that_hood/master/public/data/russia.geojson') as response: counties = json.load(response)

Кроме разметки идентификаторов есть различия в наименовании регионов. Например, на сайте стопкоронавирус.рф, откуда мы будем брать свежие данные о заболевших, республика Башкортостан занесена как «Республика Башкортостан», а в нашем geojson-файле — просто «Башкортостан». Все эти различия необходимо устранить во избежание конфликтов. Кроме того, все первые буквы в названиях регионов должны начинаться с верхнего регистра.

regions_republic_1 = ['Бурятия', 'Тыва', 'Адыгея', 'Татарстан', 'Марий Эл', 'Чувашия', 'Северная Осетия – Алания', 'Алтай', 'Дагестан', 'Ингушетия', 'Башкортостан'] regions_republic_2 = ['Удмуртская республика', 'Кабардино-Балкарская республика', 'Карачаево-Черкесская республика', 'Чеченская республика'] for k in range(len(counties['features'])): counties['features'][k]['id'] = k if counties['features'][k]['properties']['name'] in regions_republic_1: counties['features'][k]['properties']['name'] = 'Республика ' + counties['features'][k]['properties']['name'] elif counties['features'][k]['properties']['name'] == 'Ханты-Мансийский автономный округ - Югра': counties['features'][k]['properties']['name'] = 'Ханты-Мансийский АО' elif counties['features'][k]['properties']['name'] in regions_republic_2: counties['features'][k]['properties']['name'] = counties['features'][k]['properties']['name'].title()

Из получившегося geojson-файла сформируем DataFrame с регионами России: возьмём идентификаторы и наименования.

region_id_list = [] regions_list = [] for k in range(len(counties['features'])): region_id_list.append(counties['features'][k]['id']) regions_list.append(counties['features'][k]['properties']['name']) df_regions = pd.DataFrame() df_regions['region_id'] = region_id_list df_regions['region_name'] = regions_list

Если сделаем всё правильно, получим такой DataFrame:

Читайте также:  Request get timeout python

Собираем данные

Будем парсить эту таблицу:

Воспользуемся библиотекой Selenium. Перейдём на сайт и получим всю страницу, а затем преобразуем её в Soup для парсинга.

driver = webdriver.Chrome() driver.get('https://стопкоронавирус.рф/information/') source_data = driver.page_source soup = bs(source_data, 'lxml')

divs_data = soup.find_all('td')

Данные в divs_data выглядят следующим образом:

Вся информация идёт в одну строчку: и новые случаи, и активные, и все прочие. Тем не менее, заметно, что каждому региону соответствует пять значений: для Москвы это первые пять, для Московской области — вторые пять и так далее. Воспользуемся этим: в каждый из пяти списков будем класть значения согласно индексу. Если это первое значение, то оно войдёт в список выявленных случаев, если второе — в список новых случаев и так далее. После пяти индекс будет обнуляться.

count = 1 for td in divs_data: if count == 1: sick_list.append(int(td.text)) elif count == 2: new_list.append(int(td.text)) elif count == 3: cases_list.append(int(td.text)) elif count == 4: healed_list.append(int(td.text)) elif count == 5: died_list.append(int(td.text)) count = 0 count += 1

Следующим шагом соберём названия регионов из таблицы — они лежат под классом col-region. Из названий нужно убрать лишние двойные пробелы и символы переноса строки.

divs_region_names = soup.find_all('th', ) region_names_list = [] for i in range(1, len(divs_region_names)): region_name = divs_region_names[i].text region_name = region_name.replace('\n', '').replace(' ', '') region_names_list.append(region_name)
df = pd.DataFrame() df['region_name'] = region_names_list df['sick'] = sick_list df['new'] = new_list df['cases'] = cases_list df['healed'] = healed_list df['died'] = died_list

И посмотрим на Челябинскую область под десятым индексом — в конце наименования остался пробел! Этот пробел в конце строки может причинить много бед, ведь тогда название не будет соответствовать названию региона в geojson-файле. Уберём его — благо, все остальные наименования на сайте в порядке.

df.loc[10, 'region_name'] = df[df.region_name == 'Челябинская область '].region_name.item().strip(' ')

Наконец, сделаем merge двух DataFrame по колонке названия региона, чтобы в получившейся таблице с данными по коронавирусу появилась колонка с идентификатором региона, необходимая для генерации карты.

df = df.merge(df_regions, on='region_name')

Визуализация данных на карте Plotly

Создадим новую фигуру — она будет являться объектом Choroplethmapbox. В параметр geojson передаём переменную counties с geojson-файлом, в параметр locations вставляем идентификаторы регионов. Параметр z — значения, которые мы хотим визуализировать. Для примера возьмём количество новых случаев в каждом регионе — они лежат в колонке new таблицы. В text передаём названия регионов. Другой параметр — colorscale — нужен для цветового сопровождения данных. Он принимает списки со значениями от 0 до 1, которые являются позициями цветов в градиенте. Чем меньше заболевших, тем зеленее будет регион. С увеличением числа заболевших цвет переходит от желтого к красному. Параметр hovertemplate — шаблон панели, появляющейся при наведении на регион. С тултипом связан ещё один аргумент — customdata. Он принимает объединенные вдоль оси объекты, которые затем можно использовать в hovertemplate для отображения новых данных.

fig = go.Figure(go.Choroplethmapbox(geojson=counties, locations=df['region_id'], z=df['new'], text=df['region_name'], colorscale=[[0, 'rgb(34, 150, 79)'], [0.2, 'rgb(249, 247, 174)'], [0.8, 'rgb(253, 172, 99)'], [1, 'rgb(212, 50, 44)']], colorbar_thickness=20, customdata=np.stack([df['cases'], df['died'], df['sick'], df['healed']], axis=-1), hovertemplate='% '+ '
' + 'Новых случаев: %' + '
' + 'Активных: %' + '
' + 'Умерло: %' + '
' + 'Всего случаев: %' + '
' + 'Выздоровело: %' + ' ', hoverinfo='text, z'))

Теперь зададим стиль карты — возьмём готовую carto-positron, нейтральный и минималистичный шаблон, который не отвлекает от основных данных. Аргумент mapbox_zoom отвечает за приближение карты, а mapbox_center принимает координаты начального центра карты. Зададим marker_line_width равный нулю, чтобы убрать границы между регионами. После зададим всем отступам в margin значение 0, чтобы карта была визуально шире. Сразу после выведем фигуру методом show().

fig.update_layout(mapbox_style="carto-positron", mapbox_zoom=1, mapbox_center = ) fig.update_traces(marker_line_width=0) fig.update_layout(margin=) fig.show()

Получилась такая карта. Из диаграммы следует, что больше всего заболевших за прошедшие сутки появилось в Москве — 608 случаев, что существенно относительно остальных регионов. Особенно в сравнении с Ненецким автономным округом, где число случаев новых заражений, на удивление, равняется нулю.

Читайте также:  Linux для программирования на php

Источник

Оцените статью