es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para pasar una lista de listas a la función geocoder.osm(), puedes usar la función zip() para combinar las listas de latitud y longitud en una lista de tuplas. Luego, puedes pasar esta lista de tuplas a la función geocoder.osm(). Aquí tienes un ejemplo de código que muestra cómo hacerlo:

    import geocoder
    
    # crea una lista de latitudes y longitudes
    latitudes = [40.7128, 41.8781, 42.3601]
    longitudes = [-74.0060, -87.6298, -71.0589]
    
    # combina las latitudes y longitudes en una lista de tuplas
    coordenadas = list(zip(latitudes, longitudes))
    
    # llama la función geocoder.osm() con la lista de tuplas
    resultados = geocoder.osm(coordenadas, method='reverse').json
    
    # imprime los resultados
    print(resultados)
    

    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ón geocoder.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.

Comments are closed.