如何使用列表列表而不是值列表从 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 它解释了一切。