Il est "lent" parce que, comme il est dit dans le Politique d'utilisation de Nominatim :
Pas d'utilisation intensive (un maximum absolu de 1 demande par seconde).
Donc au moins ça prendra environ len(df)
secondes, car je pense qu'ils appliquent un étranglement. De plus, vous avez peut-être été bloqué :
Les clients qui envoient plusieurs fois la même requête peuvent être classés comme défaillants et bloqués.
Si vous voulez accélérer le processus, vous pouvez exécuter votre propre instance du service. La documentation contient des instructions sur la manière d'installer le logiciel et d'importer leurs données .
Cela dit, votre code contient un bug : vous utilisez deux fois la latitude. De plus, l'itération sur range(len(...))
est une odeur de code en Python. J'opterais pour quelque chose comme
import pandas as pd
from geopy.geocoders import Nominatim
geolocator = Nominatim(
user_agent="StackOverflow Question (https://stackoverflow.com/a/68727013/383793)"
)
df = pd.read_csv("https://firms.modaps.eosdis.nasa.gov/data/active_fire/modis-c6.1/csv/MODIS_C6_1_Europe_24h.csv")
df = df.head() # just to show an example
def to_country_code(lat: float, long: float) -> str:
"Isn't this more generic than the country name as a string in the country's language?"
return geolocator.reverse((lat, long)).raw['address']['country_code']
df['country_code'] = df[['latitude', 'longitude']].apply(
lambda x: to_country_code(*x), axis=1
)
print(df)
latitude longitude brightness scan track acq\_date acq\_time \\
0 44.48386 22.69465 310.45 2.20 1.44 2021-08-09 1.0
1 42.92273 18.03089 306.02 3.97 1.85 2021-08-09 1.0
2 42.91645 18.02446 307.58 3.97 1.85 2021-08-09 1.0
3 41.26550 31.42957 302.74 1.01 1.01 2021-08-09 1.0
4 42.02151 20.29289 300.76 2.87 1.62 2021-08-09 1.0
satellite confidence version bright\_t31 frp daynight country\_code
0 A 80.0 6.1NRT 290.21 33.94 N ro
1 A 67.0 6.1NRT 293.46 42.59 N ba
2 A 72.0 6.1NRT 293.85 49.84 N ba
3 A 51.0 6.1NRT 292.64 5.38 N tr
4 A 33.0 6.1NRT 290.08 17.58 N al
Avant de passer à l'échelle supérieure - puisque les données relatives aux incendies ne devraient pas trop changer - vous pouvez essayer de mettre en cache les réponses de Nominatim.
Cela semble fonctionner, après avoir installé requests-cache :
requests_cache.install_cache('geopy_cache')
geolocator = Nominatim(
user_agent="StackOverflow Question (https://stackoverflow.com/a/68727013/383793)"
)
requests_cache.uninstall_cache()
Si vous avez - à juste titre - des doutes sur le monkeypatching. La bonne chose à faire serait de prendre cette question dans le bugtracker de Geopy.