Как я могу визуализировать данные на карте, используя только страну и регион в Python - PullRequest
0 голосов
/ 20 апреля 2020

У меня сейчас есть набор данных, который выглядит примерно так:

enter image description here

фрейм данных:

data = {'Line Item': ["India_Tamil_display 5", "India_Tamil_display 5","Indonesia_Arabic_display 1","Indonesia_Arabic_display 1","Indonesia_Arabic_display 1"],
        'Region': ["Puducherry", "Tamil Nadu", "Banten,Indonesia", "Central Java","East Java"],
        'Impressions' :[43,56,23,56,98],
        'Reach' : [32,45,12,43,76]
        }

Меня попросили визуализируйте впечатления / охват / просмотр видео на карте в Python. Это моя первая визуализация карт в Python, и я понятия не имею, как это сделать, используя только название страны и региона. Поиск в Интернете в течение нескольких часов, но ни одно из решений не имеет смысла. Это небольшое задание, поэтому я сомневаюсь, что это что-то очень важное, например, сначала получить широту и долготу. Любая помощь будет оценена. Спасибо

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

from geopy.geocoders import Nominatim
from geopy.extra.rate_limiter import RateLimiter
geolocator = Nominatim(user_agent="myGeocoder")
location = geolocator.geocode("West Java")
print(location.address)
print((location.latitude, location.longitude))

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Импорт

import pandas as pd
from geopy.geocoders import Nominatim
from geopy.extra.rate_limiter import RateLimiter
import matplotlib.pyplot as plt
import os
# path to proj4-5.2.0-ha925a31_1 for Anaconda distribution
# without this line KeyError: 'PROJ_LIB' may occur when importing Basemap
os.environ['PROJ_LIB'] = r'E:\Anaconda3\pkgs\proj4-5.2.0-ha925a31_1\Library\share'
from mpl_toolkits.basemap import Basemap

Данные

data = {'Region': ["Puducherry", "Tamil Nadu", "Banten,Indonesia", "Central Java", "East Java"],
        'Impressions' :[43,56,23,56,98],
        'Reach' : [32,45,12,43,76]}

df = pd.DataFrame(data)

geolocator = Nominatim(user_agent="myGeocoder")

def geo_location(region: str):
    location = geolocator.geocode(region)
    return pd.Series([location.latitude, location.longitude])

df[['lat', 'long']] = df['Region'].apply(geo_location)

# df.head()

           Region  Impressions  Reach        lat        long
       Puducherry           43     32  11.934057   79.830645
       Tamil Nadu           56     45  10.909433   78.366535
 Banten,Indonesia           23     12  -6.478003  105.541028
     Central Java           56     43  -5.625965  110.371649
        East Java           98     76  -7.697740  112.491420

Участок

# Set the dimension of the figure
my_dpi=96
plt.figure(figsize=(2600/my_dpi, 1800/my_dpi), dpi=my_dpi)

# Make the background map
# m=Basemap(llcrnrlon=-180, llcrnrlat=-65, urcrnrlon=180, urcrnrlat=80)  # full map
m=Basemap(llcrnrlon=60, llcrnrlat=-15, urcrnrlon=155, urcrnrlat=40)  # SE Asia
m.drawmapboundary(fill_color='#A6CAE0', linewidth=0)
m.fillcontinents(color='grey', alpha=0.3)
m.drawcoastlines(linewidth=0.1, color="white")

# Add a point per position
m.scatter(df['long'], df['lat'], s=df['Impressions'], alpha=0.4, cmap="Set1")

plt.show()

enter image description here

0 голосов
/ 21 апреля 2020

Вы можете использовать Geo pandas, который собирает много полезных геоинструментов:

import geopandas as gp
import geopy
import contextily as ctx

Сначала создайте геоданные с вашими данными:

data = {'Line Item': ["India_Tamil_display 5", "India_Tamil_display 5","Indonesia_Arabic_display 1","Indonesia_Arabic_display 1","Indonesia_Arabic_display 1"],
    'Region': ["Puducherry", "Tamil Nadu", "Banten,Indonesia", "Central Java","East Java"],
    'Impressions' :[43,56,23,56,98],
    'Reach' : [32,45,12,43,76]
    }

dfg = gp.GeoDataFrame(data)

Добавьте в GeoDataFrame a geometry столбец с использованием внутреннего инструмента геокодирования Geo pandas:

dfg['geometry'] = gp.tools.geocode(dfg.Region, provider='nominatim', user_agent="add-your-app-name-here").geometry 
dfg.crs = "EPSG:4326"
dfg.head()

dfg.head ()

Наконец, нанесите карту, используя контекстно для добавления базовой карты:

dfg = dfg.to_crs(epsg=3857)
ax = dfg.plot(figsize=(16, 10), alpha=0.75, edgecolor='k', marker='o', color='red', markersize=dfg.Reach*5)
ctx.add_basemap(ax)
ax.set_axis_off()

Reach Map

Не стесняйтесь играть с Geo pandas, чтобы узнать, как добавлять слои и другие эстетики вашей карты.

Для больших наборов данных вы можете использовать Geopy RateLimiter , чтобы установить задержку запроса в секундах.

...