Geopandas — построение диаграммы с данными континента

#python #python-3.x #geopandas

#python #python-3.x #панды #геопанды #география

Вопрос:

Я пытаюсь отобразить данные на континентах с помощью геопанды.

У меня есть следующее количество заявок из моей сводной таблицы по количеству зарегистрированных заявок из каждой страны:

     Number of Tickets
region
Africa            370
Americas         1130
Asia              873
Europe            671
Oceania           445
  

В моем фрейме данных списка заявок у меня есть зарегистрированные случаи из каждой страны. Каждая страна сопоставляется с регионом и континентом. Следуя логике, каждому зарегистрированному тикету присваивается страна, регион и континент.

Чтобы иметь возможность отображать данные, я объединяю фрейм данных Geopandas (геометрия страны) с фреймом данных моего билета с 3-буквенными кодами стран и удостоверяюсь, что результирующий фрейм данных является фреймом геоданных:

 tickets_region = pd.merge(world, tickets, left_on='ISO_A3', right_on='code-3')

type(tickets_region)
geopandas.geodataframe.GeoDataFrame
  

Я пытаюсь отобразить данные с помощью следующего кода:

 fig, ax = plt.subplots()
ax = tickets_region.plot('continent', cmap='Reds',scheme='headtailbreaks')
ax.tick_params(left=False, labelleft=False, bottom=False, labelbottom=False)
plt.title('Number of Tickets by Continent')
plt.box(False)
plt.show()
  

Однако этот блок кода никогда не заканчивается, потребляет память и циклы процессора, и мне приходится нажимать Ctrl-C, чтобы вырезать его. Тот же код работает с ‘code-3’ (3-буквенные коды стран.)

Я предполагаю, что это связано с географией «континента», не определенной в файле geojson, но я ожидаю, что она будет заполнена Python путем суммирования количества билетов. Я вижу, что в моем ожидании где-то нарушена логика, но я не могу этого увидеть.

Есть идеи о том, как я могу заставить работать график континента?

Спасибо.

Редактировать: фрейм данных «world» — это файл geojson, загружаемый с https://datahub.io/core/geo-countries

Ответ №1:

Вы можете использовать метод dissolve() из фрейма данных GeoPandas. Вы можете ознакомиться с документацией GeoPandas здесь. Ваш код может быть изменен следующим образом :

 tickets_region = tickets_region.dissolve(by='continent', aggfunc='sum')

fig, ax = plt.subplots()
ax = tickets_region.plot(column='Number of Tickets', cmap='Reds',scheme='headtailbreaks')
ax.tick_params(left=False, labelleft=False, bottom=False, labelbottom=False)
plt.title('Number of Tickets by Continent')
plt.box(False)
plt.show()
  

Комментарии:

1. Извините за последний ответ Пьера-Лоика. Я тестирую растворение, как вы упомянули, но это не оказывает никакого влияния на 20 тыс. строк: IPython просто перестает отвечать на запросы. Я все еще работаю над вашим ответом — и появится, когда у меня будет решение.

2. большое спасибо, и да, это решение. Я просто хотел бы отметить, что использование .dissolve не заканчивается при запуске с тысячами строк. Я бы предложил сначала перейти к обобщению данных (pivot_table, pivot …), А затем использовать .dissolve. В противном случае это занимает много циклов процессора и потребляет много памяти.

Ответ №2:

Недавно я использовал этот поток для проведения анализа. В данных не хватало координат континентов для построения графика, поэтому возникла идея импортировать существующий набор данных и объединить их вместе. Вот импорт и dissolve код:

 import geopandas as gpd

world = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres")).drop(['gdp_md_est'], axis=1)
world = world.dissolve(by='continent', aggfunc='sum')
world = world.merge(d, how='inner', left_on='continent', right_index=True)
  

Записная книжка Kaggle доступна по адресу https://www.kaggle.com/code/pavfedotov/gtc-map