Время прочтения: 4 мин.
Визуализация данных – это то, что помогает нам легче понять и обработать большие или маленькие массивы «сухих» цифр.
В этой статье я расскажу о своем опыте работы с одним из инструментов визуализации в форме интерактивной карты на Jupyter Notebook – Folium. Folium позволяет объединить экосистему языка программирования Python и Open Source библиотеку для построения интерактивных карт для сайтов Leaflet.js.
Цель создания интерактивной карты в моем случае – показать наглядно филиалы банка, в которых предоставляется услуга регистрации в Единой биометрической системе для клиентов физических лиц по данным официального сайта банка и bio.rt.ru, а также долю таких филиалов по регионам российской Федерации.
Для работы с Folium импортируем библиотеку:
import folium
И создаем главный объект, к которому будем добавлять остальные – карту:
m = folium.Map(location=[63.391522, 96.328125], zoom_start=3)
Здесь location – координаты центра отображаемой карты, zoom_start – первоначальный масштаб.
Добавим к карте регионы РФ с заполнением цветом в соответствии с долей филиалов банка с услугой регистрации – хороплет. Для отображения контуров регионов необходим файл в формате GeoJSON, и его можно взять здесь из архива – это admin_level_4.geojson. Данные для заполнения цветом возьмем из предварительно подготовленного датафрейма DF с долями share и REGION_ID регионов, совпадающими с ID регионов из файла GeoJSON.
rel_ = folium.Choropleth(
geo_data = path_to_ GeoJSON_file,
name = 'Отношение числа филиалов с ЕБС ко всем',
data = DF,
columns=['REGION_ID', 'share'],
key_on='id',
bins = 5,
fill_color='BuGn',
nan_fill_color='darkblue',
nan_fill_opacity=0.5,
fill_opacity=0.7,
line_opacity=0.2,
legend_name= 'Отношение числа филиалов с ЕБС ко всем',
highlight = True,
show = False
)
Добавляем слой хороплета к карте:
rel_.add_to(m)
Теперь можно увидеть общую картину по доступности услуги регистрации в ЕБС в филиалах банка по регионам РФ.
Добавим на карту отдельные филиалы банка с разделением по доступности услуги регистрации –маркеры двух цветов. Данные с официального сайта банка и bio.rt.ru, включая координаты филиалов, собираем через request, выделяем из них координаты и наименования филиалов.
Чтобы карта была функциональной и удобной, маркеры филиалов мы объединим в кластеры в зависимости от масштаба, что избавит нас от загромождения элементами.
Создадим группы для маркеров:
feature_group_EBS = folium.FeatureGroup(name = 'Филиалы с регистрацией ЕБС',
show = False)
feature_group_nonEBS = folium.FeatureGroup(name = 'Филиалы без регистрации ЕБС',
show = False)
Подготовим кластеры:
from folium.plugins import MarkerCluster
marker_cluster_EBS = MarkerCluster(name = ' cluster_ EBS ',
popups = 'Филиалы с регистрацией ЕБС ',
show = False,
icon_create_function=icon_green)
marker_cluster_nonEBS = MarkerCluster(name = ' cluster_nonEBS ',
popups = 'Филиалы без регистрации ЕБС ',
show = False,
icon_create_function = icon_red)
Параметр popups покажет соответствующую информацию при клике на кружок кластера. С помощью icon_create_function можно добавить строку на JavaScript, которой можно задать нужный цвет кластера (по умолчанию он меняется каждый раз в зависимости от количества маркеров в кластере).
Добавляем маркеры филиалов в соответствующие кластеры:
for lt, ln, filial_name in zip(latitude_EBS, longitude_EBS, name_EBS):
marker_EBS = folium.Marker(
[lt, ln],
popup = filial_name,
icon = folium.Icon(color='green',icon='ok-sign'))
marker_cluster_EBS.add_child(marker_EBS)
Добавляем кластеры в слой соответствующей группы:
feature_group_EBS.add_child(marker_EBS)
feature_group_nonEBS.add_child(marker_nonEBS)
Группы добавляем на карту:
feature_group_EBS.add_to(m)
feature_group_nonEBS.add_to(m)
Важно наличие на карте элемента по контролю слоев, с помощью которого можно включить/выключить показ элементов. Ранее в параметрах хороплета, маркеров и кластеров параметр show указан со значением False – при загрузке на карте слои не показаны.
folium.LayerControl(collapsed=True).add_to(m)
Результат можно выгрузить в отдельный HTML файл и просматривать в любом браузере, при условии доступности ресурса www.openstreetmap.org:
m.save('map.html')
В итоге, можно оценить распространённость услуги как по регионам, так и отдельным населенным пунктам.
Связка Jupyter Notebook и Folium предоставляет максимально гибкий инструмент по визуализации данных, имеющих картографическую привязку.