如何使用列表列表而不是值列表从 API 请求 json 文件?如何加快我的 API 通话速度?
how to request a json file from an API using a list of lists instead of a list of values? how to speed up my API call?
geocoder.osm()
是一个 API 函数,应该有两个参数:纬度和经度,然后 returns 国家名称及其所有信息作为 json 文件.
我有一个包含 70 万行坐标的大数据框,我编写了以下代码来提取每个坐标的国家/地区名称:
import geocoder
import itertools
count=itertools.count(start=0)
def geo_rev(x):
print('starting: ',next(count))
g = geocoder.osm([x.latitude, x.longitude], method='reverse').json
try:
if g:
return [g.get('country'),g.get('city')]
else:
return ['no country','no city']
except ValueError:
pass
data[['Country','City']]=data[['latitude','longitude']].apply(geo_rev,axis=1,result_type='expand')
如您所见,我们正在为每一行传递一个包含两个值的列表:[x.latitude, x.longitude]
。
问题是:这段代码将永远执行,这就是为什么我想为函数geocoder.osm()
传递一个列表列表来使请求更快,我的思路是执行如下代码:[list[latitude...],list[longitude...] ]
,怎么做到的?
TypeError: float() argument must be a string or a number, not 'list'
但是如果我的想法(关于传递列表的列表)是错误的,如果有另一种方法可以使 API 调用更快,请告诉我。
我不确定问题是什么,但是如果您需要尝试获取列表的元素,请尝试使用“for i in list_name”,它会一个一个地获取元素.如果您需要两个列表的元素,请尝试 "for i in range(len(list_name)): function(list_name[0][i],list_name[1][i ])"
我找到了我的问题的答案,使用列表列表看起来很难做到这一点然后我尝试使用 Threading ,线程对 asyncio 等 API 的执行速度非常高speed probably even ten times or twenty times faster
它不会等待每个请求都收到它的文件,而是同时发送几个请求,然后同时接收它们的文件,以下代码将正常工作:
import geocoder
import itertools
import concurrent.futures
lst=list(zip(data.latitude.tolist(), data.longitude.tolist()))
countries=[]
count=itertools.count(start=0)
def geo_rev(x):
print('starting: ',next(count))
g = geocoder.osm([x[0], x[1]], method='reverse').json
try:
if g:
return g.get('country')
else:
return 'no country'
except ValueError:
pass
with concurrent.futures.ThreadPoolExecutor() as executor:
results=executor.map(geo_rev, lst)
for result in results:
countries.append(result)
data['Country']=[x for x in countries]
感谢 Corey Schafer Video 它解释了一切。
geocoder.osm()
是一个 API 函数,应该有两个参数:纬度和经度,然后 returns 国家名称及其所有信息作为 json 文件.
我有一个包含 70 万行坐标的大数据框,我编写了以下代码来提取每个坐标的国家/地区名称:
import geocoder
import itertools
count=itertools.count(start=0)
def geo_rev(x):
print('starting: ',next(count))
g = geocoder.osm([x.latitude, x.longitude], method='reverse').json
try:
if g:
return [g.get('country'),g.get('city')]
else:
return ['no country','no city']
except ValueError:
pass
data[['Country','City']]=data[['latitude','longitude']].apply(geo_rev,axis=1,result_type='expand')
如您所见,我们正在为每一行传递一个包含两个值的列表:[x.latitude, x.longitude]
。
问题是:这段代码将永远执行,这就是为什么我想为函数geocoder.osm()
传递一个列表列表来使请求更快,我的思路是执行如下代码:[list[latitude...],list[longitude...] ]
,怎么做到的?
TypeError: float() argument must be a string or a number, not 'list'
但是如果我的想法(关于传递列表的列表)是错误的,如果有另一种方法可以使 API 调用更快,请告诉我。
我不确定问题是什么,但是如果您需要尝试获取列表的元素,请尝试使用“for i in list_name”,它会一个一个地获取元素.如果您需要两个列表的元素,请尝试 "for i in range(len(list_name)): function(list_name[0][i],list_name[1][i ])"
我找到了我的问题的答案,使用列表列表看起来很难做到这一点然后我尝试使用 Threading ,线程对 asyncio 等 API 的执行速度非常高speed probably even ten times or twenty times faster
它不会等待每个请求都收到它的文件,而是同时发送几个请求,然后同时接收它们的文件,以下代码将正常工作:
import geocoder
import itertools
import concurrent.futures
lst=list(zip(data.latitude.tolist(), data.longitude.tolist()))
countries=[]
count=itertools.count(start=0)
def geo_rev(x):
print('starting: ',next(count))
g = geocoder.osm([x[0], x[1]], method='reverse').json
try:
if g:
return g.get('country')
else:
return 'no country'
except ValueError:
pass
with concurrent.futures.ThreadPoolExecutor() as executor:
results=executor.map(geo_rev, lst)
for result in results:
countries.append(result)
data['Country']=[x for x in countries]
感谢 Corey Schafer Video 它解释了一切。