2 votes

Obtenir le nom du pays à partir des coordonnées prend trop de temps

J'ai des données provenant des sites web de la NASA qui ont un tas de coordonnées et à partir de ces coordonnées, j'essaye de trouver à quel pays elles appartiennent via la géographie toutes les heures. Mais malheureusement, il faut beaucoup de temps pour obtenir les noms de pays.

Comment puis-je réduire le temps de traitement ?

Voici mon code ;

import pandas as pd
import numpy as np
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="geoapiExercises")

df=pd.read_csv("https://firms.modaps.eosdis.nasa.gov/data/active_fire/modis-c6.1/csv/MODIS_C6_1_Europe_24h.csv")
df.latitude=df.latitude.astype(str)
df.longitude=df.longitude.astype(str)

country_list=[]

for i in range(len(df)):
    try:
        location = geolocator.reverse(df.latitude[i]+","+df.latitude[i])
        country=location.raw["address"]["country"]
        country_list.append(country)
    except:
        country_list.append("None")
        print(i)
        continue

df_s=pd.Series(country_list)
df["Country"]=df_s
df.to_csv("map_data_R00.csv",index=False)

2voto

Chris Wesseling Points 2881

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X