#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. Спасибо за добрые слова! Последний быстрый вопрос, есть идеи о том, как увеличить время обработки?