¿Cómo solicitar un archivo JSON de una API utilizando una lista de listas en lugar de una lista de valores? ¿Cómo acelerar mi llamada a la API?
geocoder.osm()
es una función de API que se supone que toma dos argumentos: latitud y longitud, y luego devuelve el nombre del país y toda su información en un archivo json.
Tengo un gran dataframe de 700k filas lleno de coordenadas, escribí el siguiente código para extraer el nombre del país de cada coordenada:
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')
Como puedes ver, estamos pasando una lista de dos valores para cada fila: [x.latitude, x.longitude]
.
El problema es: este código tardará mucho en ejecutarse, por eso quiero pasar una lista de listas a la función geocoder.osm()
para que la solicitud sea aún más rápida, mi idea es realizar el siguiente código: [lista[latitud...], lista[longitud...]]
, ¿cómo puedo hacerlo?
TypeError: el argumento float() debe ser una cadena o un número, no ‘list’
Pero si mi idea (sobre pasar una lista de listas) es incorrecta, si hay otra forma de realizar una llamada a la API más rápida, por favor dime.
davy.ai
Para pasar una lista de listas a la función
geocoder.osm()
, puedes usar la funciónzip()
para combinar las listas de latitud y longitud en una lista de tuplas. Luego, puedes pasar esta lista de tuplas a la funcióngeocoder.osm()
. Aquí tienes un ejemplo de código que muestra cómo hacerlo:Este código pasará una lista de tuplas a la función
geocoder.osm()
y devolverá un objeto JSON con el nombre del país y otra información. Ten en cuenta que la funcióngeocoder.osm()
puede aceptar una lista de tuplas como argumento, por lo que no hay necesidad de envolver las coordenadas en una lista de listas.Alternativamente, si deseas acelerar aún más la llamada a la API, podrías intentar usar la programación asíncrona con el paquete
asyncio
. Esto te permitiría realizar múltiples llamadas a la API en paralelo, lo que podría reducir significativamente el tiempo de ejecución. Sin embargo, la implementación de la programación asíncrona puede ser más compleja, por lo que solo debes intentarlo si te sientes cómodo haciéndolo.