J'ai une latitude et une longitude stockées dans un dataframe pandas ( df
) avec des points de remplissage comme NaN
para stop_id, stoplat, stoplon
et dans un autre cadre de données areadf
qui contient plus de lats/lons et un identifiant arbitraire ; c'est l'information qui doit être introduite dans le fichier df
.
J'essaye de connecter les deux pour que les colonnes d'arrêt en df
contient des informations sur l'arrêt le plus proche de ce point de latitude et de longitude, ou bien laissez-le tel quel. NaN
s'il n'y a pas d'arrêt dans un rayon R du point.
Pour l'instant, mon code est le suivant, mais il prend beaucoup de temps (>40 minutes pour ce que j'exécute actuellement, avant de changer la zone en un df et d'utiliser itertuples ; je ne suis pas sûr de l'ampleur de la différence que cela fera ?) car il y a des milliers de points de lat/lon et d'arrêts pour chaque ensemble de données, ce qui est un problème parce que je dois exécuter cela sur plusieurs fichiers. Je suis à la recherche de suggestions pour accélérer le processus. J'ai déjà apporté quelques améliorations mineures (par exemple, le passage à un cadre de données, l'utilisation d'itertuples au lieu d'iterrows, la définition de lats et de lons en dehors de la boucle pour éviter d'avoir à les récupérer de df à chaque boucle) mais je suis à court d'idées pour accélérer le processus. getDistance
utilise la formule Haversine telle que définie pour obtenir la distance entre le panneau d'arrêt et le point lat,lon donné.
import pandas as pd
from math import cos, asin, sqrt
R=5
lats = df['lat']
lons = df['lon']
for stop in areadf.itertuples():
for index in df.index:
if getDistance(lats[index],lons[index],
stop[1],stop[2]) < R:
df.at[index,'stop_id'] = stop[0] # id
df.at[index,'stoplat'] = stop[1] # lat
df.at[index,'stoplon'] = stop[2] # lon
def getDistance(lat1,lon1,lat2,lon2):
p = 0.017453292519943295 #Pi/180
a = (0.5 - cos((lat2 - lat1) * p)/2 + cos(lat1 * p) *
cos(lat2 * p) * (1 - cos((lon2 - lon1) * p)) / 2)
return 12742 * asin(sqrt(a)) * 100
Les données de l'échantillon :
df
lat lon stop_id stoplat stoplon
43.657676 -79.380146 NaN NaN NaN
43.694324 -79.334555 NaN NaN NaN
areadf
stop_id stoplat stoplon
0 43.657675 -79.380145
1 45.435143 -90.543253
Désiré :
df
lat lon stop_id stoplat stoplon
43.657676 -79.380146 0 43.657675 -79.380145
43.694324 -79.334555 NaN NaN NaN