Пожалуйста, посетите мой проект на GitHub для просмотра CSV и ноутбуков.
Я использовал этот ноутбук и этот csv .
Я пытаюсь кластеризовать колледжи на основе их окружения (для чего я буду использовать API квадрата четырехугольников). Для этого мне нужно передать широту и долготу колледжа (для изучения мест). Но проблема в том, что когда я пытаюсь определить широту и долготу колледжа, используя его название + область + город + страна, это дает мне широту другой страны (иногда в середине десерта). Пожалуйста, посмотрите код и исправьте его, а также фрейм данных для понимания поля 'area'.
Я пробовал два типа аргументов местоположения для получения длинного лат для колледжа: ТИП 1:
try: название колледжа + область + город + страна, за исключением AttributeError (если location возвращает ноль latдлинный): район + город + страна
ТИП 2:
название колледжа + город
ТИП 1:
# METHOD 1
def do_geocode(address):
try:
return geolocator.geocode(address)
except GeocoderTimedOut:
time.sleep(3)
return do_geocode(address)
def get_latlong():
latitude = []
longitude = []
collegeName = df['college_name'].to_list()
loc = df['location'].to_list()
for i in range(len(collegeName)):
address = collegeName[i] +', '+loc[i]
geolocator = Nominatim(user_agent="foursquare_agent")
geocode = RateLimiter(geolocator.geocode, min_delay_seconds=1)
new['location'] = df['name'].apply(geocode)
location = do_geocode(address)
try:# try with college name in address
latitude.append(location.latitude)
longitude.append(location.longitude)
except AttributeError: # if location not found lat long are null
try: # try again without the college name in address
address = loc[i]
location = do_geocode(address)
latitude.append(location.latitude)
longitude.append(location.longitude)
except: # if an address is not found at all simply write None to list
latitude.append(None)
longitude.append(None)
clear_output() # if we dont too much space taken by output
print('Obtained ' +str(i)+ ' latitude and logitudes.') # Tests your patience
ТИП 2:
# METHOD 2
from geopy.geocoders import Nominatim # convert an address into latitude and longitude values
from geopy.exc import GeocoderTimedOut
from geopy.extra.rate_limiter import RateLimiter
from tqdm import tqdm
tqdm.pandas()
def get_latlong():
geolocator = Nominatim(user_agent="foursquare_agent")
geocode = RateLimiter(geolocator.geocode, min_delay_seconds=1)
df['address'] = df['clg_city'].progress_apply(geocode)
Фрейм данных: df ['location'] 1. Сан-Франциско, США
Вашингтон, округ Колумбия, Вашингтон, округ Колумбия, США
Нью-Йорк, Буффало, США
Англия, Лондон, СШАКоролевство
Уэльс, Понтипридд, Великобритания
df ['clg_city']
Школамедицинских сестер и медицинских профессий Сан-Франциско
Школа бизнеса им. Когода, Американский университет, Вашингтон, округ Колумбия
Университет в Буффало, Государственный университет Нью-ЙоркаШкола инженерных и прикладных наук Буффало
Школа менеджмента Лондон Лондон
Университет Южного Уэльса Понтипридд
1-й метод дает много длинных, но неправильных. Второй метод дает только несколько длинных лат.
Как вы предлагаете мне решить эту проблему, я хочу получить длинный лат для колледжа (по названию и любому столбцу, который у меня есть, с точностью250 м или более) любыми необходимыми средствами (кроме, конечно, вручную).