Existe uma alternativa mais lenta ou mais controlada para .apply ()?

Então, isso pode parecer uma pergunta estranha, mas eu tenho um DataFrame pandas com endereços nele, que eu quero geocodificar para que eu possa obter a latitude e longitude.

Eu tenho código que funciona usando .apply() graças a este segmento muito útil ( nova coluna com coordenadas usando geopy pandas ), mas meu problema é que todas as APIs abertas têm limites estritos para quantas solicitações por segundo eles permitem, e também solicitações por dia.

Não consegui encontrar nenhuma maneira de controlar meu código para que correspondam aos limites das APIs. Meu DF tem 25 mil linhas, mas só consegui geocodificar com êxito se criar um subconjunto dele com até cinco linhas.

Eu não tenho muita experiência com python e pandas, mas no SAS os passos DATA repetem uma linha de cada vez, então eu poderia ter um comando sleep que iria limitar os pedidos. Qual seria a melhor maneira de implementar algo assim com python / pandas?

EDIT: Então, com base nas respostas até agora, eu queria confirmar, meu código iria mudar de: df_small['city_coord'] = df_small['Address'].apply(geolocator.geocode).apply(lambda x: (x.latitude, x.longitude))
para:

 df_small = df_clean[:5] def f(x, delay=1): # run your code sleep(delay) return geolocator.geocode(x) df_small['city_coord'] = df_small['Address'].apply(f).apply(lambda x: (x.latitude, x.longitude)) 

Para iterar com um atraso, você pode usar df.iterrows() e time.sleep() :

 from time import sleep for row in df.iterrows(): # run your code sleep(1) # how many seconds to wait 

Ou você pode simplesmente colocar time.sleep() dentro da própria function apply (como o @RafaelC sugere nos comentários):

 def f(x, delay=1): # run your code sleep(delay) df.apply(f) 
Intereting Posts