Как использовать вызовы API в l oop для создания Pandas Dataframe? - PullRequest
1 голос
/ 13 июля 2020

Я пытаюсь создать фреймворк, содержащий 3 разные категории из Foursquare в 8 разных городах, но ничего из того, что я пробую, не работает ... Может ли кто-нибудь помочь?

Переменные

cities = ['Santiago', 'Belo Horizonte', 'Miami', 'Philadelphia', 'Toronto', 'Madrid', 'San Petersburg', 'Ahmadabad']
countries = [' Chile', ' Brazil', ' USA', ' USA', ' Canada', ' Spain', ' Russia', ' India']
pop = [5.7, 5.45, 5.48, 5.36, 5.16, 5.17, 5.35, 5.3]
query = ['College', 'University', 'Police Station', 'Medical Center']
categories = ['4bf58dd8d48988d1a8941735', '4bf58dd8d48988d12e941735', '4bf58dd8d48988d104941735']

Присоединение городов и стран для геолокации

addresses = [i + j for i, j in zip(cities, countries)]

Учетные данные API

CLIENT_ID = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
CLIENT_SECRET = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
VERSION = '20200604'
radius = 10000
LIMIT = 1000

А теперь ПРОБЛЕМА. В идеале все делалось бы сразу, автоматически:

latlon = []
for i in addresses:
    geolocator = Nominatim(user_agent="foursquare_agent")
    location = geolocator.geocode(i)
    latitude = location.latitude
    longitude = location.longitude
    for j in categories:
        categoryId = j
        url = 'https://api.foursquare.com/v2/venues/search?&categoryId={}&client_id={}&client_secret={}&ll={},{}&v={}&radius={}&limit={}'.format(categoryId, CLIENT_ID, CLIENT_SECRET, latitude, longitude, VERSION, radius, LIMIT)
        results = requests.get(url).json()
        venues = results['response']['name']['location.lat']['location.lng']['city']
        latlon.append(
        {
            'City': i,
            'Latitude': ['venue.location.lat'],
            'Longitude': ['venue.location.lng'],
            'Category': ['venue.categories'],
            'Pop': pop
        })
    
    
dataset = pd.DataFrame(latlon)

Пробовал разные варианты, но всегда есть проблема. Желаемый результат:

| город | категория | широта | долгота | поп | | --- | --- | --- | --- | --- | | Ab c | Xyz | 123 | 123 | 123 | | Ab c | Zyx | 123 | 123 | 123 | | Cba | Xyz | 123 | 123 | 123 | ... наверное пара тысяч строк

Есть мысли?

1 Ответ

0 голосов
/ 17 июля 2020

Попробуй сделать пошагово. Это еще не все, но должно помочь вам в правильном направлении:

def get_coordinates(location):
    geolocator = Nominatim(user_agent="foursquare_agent")
    location = geolocator.geocode(location)
    latitude = location.latitude
    longitude = location.longitude
    return latitude, longitude


def get_venues(coordinates):
    result = []
    for category in categories:
        url = 'https://api.foursquare.com/v2/venues/search?&categoryId={}&client_id={}&client_secret={}&ll={},{}&v={}&radius={}&limit={}'\
        .format(category, CLIENT_ID, CLIENT_SECRET, coordinates[0], coordinates[1], VERSION, radius, LIMIT)
        r = requests.get(url).json()
        for v in r['response']['venues']:
            result.append(v)
    return result


df = pd.DataFrame(zip(cities, countries, population), columns=['city', 'country', 'population'])

df['address'] = df['city'] + " " + df['city']

df['coordinates'] = df['address'].apply(get_coordinates)

df['venues'] = df['coordinates'].apply(get_venues)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...