Мои запросы API работают, только если я ограничиваю свой df до 1000 строк, но не для полного df, состоящего из 33000 строк

#python #pandas #api

#python #панды #API

Вопрос:

Итак, я создал фрейм данных, который содержит только почтовые индексы, и я использую api, который выводит информацию о долготе / широте в формате json, когда я передаю ему почтовые индексы df. Я создал функцию для этого конвертера и использовал для нее panda apply. Я могу распечатать свой фрейм данных, только если удалю все, кроме первых 1000 строк.

 
#code only works if I trim it down to first 1000
#geo_data.drop(geo_data.index[1000:33227],inplace=True)

def postcode_converter(x):
    longitude,latitude= None,None
    new_url='https://api.getthedata.com/postcode/' str(x)
    new_url=new_url.strip()
    r = requests.get(new_url)
    time.sleep(0.1) 
    r= r.text
    try:
        result= json.loads(r)
        longitude=result['data']['longitude']
        latitude=result['data']['latitude']
    except Exception:
        pass
    return (longitude,latitude)

geo_data['longitude'],geo_data['latitude']=zip(*geo_data['postcode'].apply(postcode_converter))
print(geo_data) 
 

Ответ №1:

Поскольку это бесплатный API, я думаю, что у них есть какая-то форма ограничения скорости, чтобы остановить злоупотребление, поэтому он останавливается после 1000 запросов.

Просматривая их веб-сайт, вы можете загрузить те же данные, которые вы запрашиваете, в виде плоского файла .csv здесь: https://www.getthedata.com/open-postcode-geo

Читая этот файл в другой фрейм данных, вы можете просто выполнить слияние в поле почтового индекса, чтобы получить свои данные геолокации.

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

1. Спасибо за ответ! Я должен был уточнить, что эта задача является частью моего обучения api на работе, и весь смысл в том, чтобы попрактиковаться в работе с ним, несмотря на то, что они уже являются csv с почтовым индексом / широтой / долготой. Есть ли способ обойти 1000 запросов, возможно, выполнив это партиями по 1000 и объединив все dfs вместе? Не уверен, как это сделать, поскольку я довольно новичок в программировании, поэтому был бы признателен за любые рекомендации / подсказки! Спасибо.

2. Мой код на удивление сработал, недавно я добавил ‘time.sleep (0.1)’ в конвертер, но для его запуска потребовалось более часа.

3. @Dirie Рад слышать, что это сработало! Как правило, большинство бесплатных API будут иметь встроенную форму ограничения скорости — ваше решение использования time.sleep() является хорошим. Удачи вам в обучении!

4. Спасибо за добрые слова! Последний быстрый вопрос, есть идеи о том, как увеличить время обработки?