Создание карт с помощью Python: «Карты с маркерами» - часть 2
Карты с маркерами
Давайте загрузим и импортируем данные об инцидентах в полицейском участке с помощью метода pandas `read_csv ()`.
Загрузите набор данных и считайте его во фрейм данных pandas:
df_incidents = pd.read_csv('https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/Data_Files/Police_Department_Incidents_-_Previous_Year__2016_.csv') print('Dataset downloaded and read into a pandas dataframe!')
Давайте посмотрим на первые пять элементов в нашем наборе данных.
df_incidents.head()
Таким образом, каждая строка состоит из 13 характеристик:
1. IncidntNum: номер инцидента
2. Категория: категория преступления или инцидента
3 . Descript: описание преступления или инцидента
4. DayOfWeek: день недели, в который произошло происшествие
5. Дата: дата, когда произошел инцидент.
6. Время: время дня, когда произошел инцидент
7. PdDistrict : Район отделения полиции
8. Решение: раскрытие преступления с точки зрения того, был ли преступник арестован или нет.
9. Адрес : Ближайший адрес к месту происшествия
10. X: долгота места преступления
11. Y: широта значение местоположения преступления
12. Местоположение: набор значений широты и долготы
13. PdId: идентификатор полицейского участка.
Давайте узнаем, сколько записей в нашем наборе данных.
df_incidents.shape
(150500, 13)
Итак, фреймворк состоит из 150 500 преступлений, имевших место в 2016 году. В целях снижения вычислительных затрат.
Давайте работать с первыми 100 инцидентами в этом наборе данных.
# get the first 100 crimes in the df_incidents dataframe limit = 100 df_incidents = df_incidents.iloc[0:limit, :]
Теперь, когда мы немного сократили данные, давайте представим себе, где эти преступления имели место в городе Сан-Франциско. Мы будем использовать стиль по умолчанию и инициализируем уровень масштабирования до 12.
# San Francisco latitude and longitude values latitude = 37.77 longitude = -122.42 # create map and display it sanfran_map = folium.Map(location=[latitude, longitude], zoom_start=12) # display the map of San Francisco sanfran_map
Теперь давайте наложим на карту места совершения преступлений. Для этого в Folium можно создать группу функций с ее собственными функциями и стилем, а затем добавить ее в sanfran_map.
#instantiate a feature group for the incidents in the dataframe incidents = folium.map.FeatureGroup() #loop through the 100 crimes and add each to the incidents feature group for lat, lng, in zip(df_incidents.Y, df_incidents.X): incidents.add_child( folium.features.CircleMarker( [lat, lng], radius=5, # define how big you want the circle markers to be color=’yellow’, fill=True, fill_color=’blue’, fill_opacity=0.6 ) ) # add incidents to map sanfran_map.add_child(incidents)
Вы также можете добавить всплывающий текст, который будет отображаться при наведении курсора на маркер.
Давайте заставим каждый маркер отображать категорию преступления при наведении курсора.
# instantiate a feature group for the incidents in the dataframe incidents = folium.map.FeatureGroup() # loop through the 100 crimes and add each to the incidents feature group for lat, lng, in zip(df_incidents.Y, df_incidents.X): incidents.add_child( folium.features.CircleMarker( [lat, lng], radius=5, # define how big you want the circle markers to be color=’yellow’, fill=True, fill_color=’red’, fill_opacity=0.6 ) ) # add pop-up text to each marker on the map latitudes = list(df_incidents.Y) longitudes = list(df_incidents.X) labels = list(df_incidents.Category) for lat, lng, label in zip(latitudes, longitudes, labels): folium.Marker([lat, lng], popup=label).add_to(sanfran_map) # add incidents to map sanfran_map.add_child(incidents)
Разве это не круто? Теперь вы можете узнать, какая категория преступлений возникла на каждом маркере.
Если вы обнаружите, что карта перегружена всеми этими маркерами, есть решение этой проблемы:
- Правильное решение - сгруппировать маркеры в разные кластеры. Затем каждый кластер представлен количеством преступлений в каждом районе. Эти кластеры можно рассматривать как карманы Сан-Франциско, которые затем можно анализировать отдельно.
Чтобы реализовать это, мы начинаем с создания экземпляра объекта MarkerCluster и добавления к этому объекту всех точек данных во фрейме данных.
from folium import plugins # let’s start again with a clean copy of the map of San Francisco sanfran_map = folium.Map(location = [latitude, longitude], zoom_start = 12) # instantiate a mark cluster object for the incidents in the dataframe incidents = plugins.MarkerCluster().add_to(sanfran_map) # loop through the dataframe and add each data point to the mark cluster for lat, lng, label, in zip(df_incidents.Y, df_incidents.X, df_incidents.Category): folium.Marker( location=[lat, lng], icon=None, popup=label, ).add_to(incidents) # display map sanfran_map
Обратите внимание, как при полном уменьшении масштаба все маркеры группируются в один кластер, глобальный кластер, из 100 маркеров или преступлений, которые - общее количество преступлений в нашем фрейме данных. Как только вы начнете увеличивать масштаб, глобальный кластер начнет разбиваться на более мелкие кластеры. При полном масштабировании появятся отдельные маркеры.
Спасибо за просмотр
Чтобы узнать больше о подобном контенте, нажмите здесь.