Я использую пакет Folium для построения карты "Choropleth" с python. Отображаемые данные взяты из API, который отслеживает самые последние показатели заражения Covid-19 в каждой стране. Столбец, совместно используемый файлом стран.geo json (файл json карты мира) и данными, которые я извлек, является названием страны. Большинство стран закрашены цветом (успешно), в то время как некоторые страны не идентичны и поэтому закрашены серым, например, "США" в кадре данных pandas и "Соединенные Штаты Америки" в .geo Файл json не совпадает и поэтому не отображает их данные на карте.
covid_data = requests.get('https://covid2019-api.herokuapp.com/v2/current')
covid_data = covid_data.json()
covid_data = pd.DataFrame.from_dict(covid_data['data'])
location confirmed deaths recovered active
US 636350 28326 52096 555928
Spain 177644 18708 70853 88083
Я храню данные API в пределах pandas DataFrame, потому что он лучше всего работает с Folium. Мой хакерский способ преобразования данных из названий стран, которые не идентичны, с помощью кода: covid_data.location[covid_data.location=='US'] = 'United States of America'
. Таким образом, название страны теперь одинаково как для файла .geo json, так и для файла. DataFrame
location confirmed deaths recovered active
United States of America 636350 28326 52096 555928
Spain 177644 18708 70853 88083
теперь совпадает с
{ "type": "Feature", "properties": { "ADMIN": "United States of America", "ISO_A3": "USA"} "geometry": {}} (countries.geojson)
Перед редактированием кадра данных карта отображалась, но при изменении US на Соединенные Штаты Америки выдается ошибка
return color_range [color_idx], fill_opacity IndexError: список индексов выходит за пределы диапазона
Таким образом, это означает, что я установил Choropleth threshold_scale равным 636 360 (что является самым высоким # в «Подтверждено»), но нет данных, соответствующих этому #. Поэтому, если я изменю значение threshold_scale на следующее наибольшее число, 177 644 (то есть в Италии), я получу ошибку
ValueError: Ожидается, что все значения попадут в один из предоставленных интервалов (или будут Nan). Пожалуйста, проверьте> параметр bins
и / или ваши данные.
Вот остальная часть кода, чтобы помочь решить эту проблему,
#this variable is to get the highest value of the rates as the max threshold used for coloring
covid_data_max = covid_data['confirmed'].max()
covid_data_max = covid_data_max.item()
world_geo = r'countries.geojson'
world_map = folium.Map(location=[4.68, 8.33],
tiles='Mapbox Bright', zoom_start=3)
world_map = folium.Choropleth(
geo_data=world_geo,
name='choropleth',
data=covid_data,
columns=['location','confirmed'],
key_on='properties.ADMIN',
threshold_scale = [0,int((covid_data_max/15)),int((covid_data_max/10)),int((covid_data_max/4)),covid_data_max],
fill_color='BuPu',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='Number of deaths per country',
highlight=True,
line_color='black'
).add_to(world_map)
folium.LayerControl().add_to(world_map)
world_map.save(r'./templates/map.html')
Вы можете увидеть изображение карта (по какой-то причине пороговое значение включает номера США):
Дайте мне знать, если есть что-нибудь еще, что я могу предоставить!