Создание карт с помощью 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)

Разве это не круто? Теперь вы можете узнать, какая категория преступлений возникла на каждом маркере.

Если вы обнаружите, что карта перегружена всеми этими маркерами, есть решение этой проблемы:

  1. Правильное решение - сгруппировать маркеры в разные кластеры. Затем каждый кластер представлен количеством преступлений в каждом районе. Эти кластеры можно рассматривать как карманы Сан-Франциско, которые затем можно анализировать отдельно.

Чтобы реализовать это, мы начинаем с создания экземпляра объекта 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 маркеров или преступлений, которые - общее количество преступлений в нашем фрейме данных. Как только вы начнете увеличивать масштаб, глобальный кластер начнет разбиваться на более мелкие кластеры. При полном масштабировании появятся отдельные маркеры.

Спасибо за просмотр

Чтобы узнать больше о подобном контенте, нажмите здесь.