2017-05-12 4 views
1

J'ai deux ensembles de données que j'ai besoin de joindre ensemble sur une distance entre deux conditions de coordonnées. J'ai créé une fonction en utilisant Haversines formula pour calculer distance_km mais je rencontre des contraintes de performance pour le temps qu'il faut.Joindre deux données sur la plus proche distance entre les coordonnées python

Dataset 1:

building_id | lat | lng 
-------------|-------|-------- 
     1  | 32.11 | -71.22 
     2  | 32.44 | -72.25 
     3  | 31.75 | -71.36``` 

Dataset 2:

building_id | lat | lng 
------------|-------|-------- 
     4  | 31.65 | -73.52 
     5  | 32.78 | -70.21 
     6  | 36.15 | -72.49 

Chaque jeu de données a plus de 10 000 bâtiments en eux et je voudrais correspondre ensemble de données 2 à jeu de données 1 mais seulement quand la distance en km est inférieure à 0,0075.

J'itérer actuellement par chaque ligne de jeu de données 1 et regardant tous les combos lat lng de jeu de données 2 pour déterminer la distance minimale

dataset_2_latlng_dict = dict(zip(dataset_2.lng,dataset_2.lat)) 

for index, row in dataset_1.iterrows(): 
    lat = row['lat'] 
    lng = row['lng'] 
    all_dist = [] 
    final_list = [] 
    for key, value in dataset_2_latlng_dict.iteritems(): 
     distance = utils.distance_km(key,value,lng,lat) 
     all_dist.extend([distance]) 
     final_list = sorted(all_dist, key=float) 
    dataset_1['min_distance'] = final_list[0] 
+0

Avez-vous un ensemble de données plus volumineux qui pourrait être utilisé pour les tests? –

Répondre

0

Vous n'avez pas fourni de données, donc je quitterai ce répondre comme descriptif seulement.

Comme prévu, il n'y a aucune raison de calculer les distances de chacun des autres bâtiments. La spécification de 7,5 mètres signifie que le lat et les longs seront TRÈS près de correspondre directement pour tous les bâtiments qui sont proches les uns des autres.

La distance entre les lignes de latitude varie entre 110,6 km à l'équateur et 111,7 km aux pôles. Si nous ajoutons une marge d'erreur et un arrondi pour faciliter cette analyse, nous pouvons utiliser une estimation de 100 km par degré. Cela signifie que la distance maximale de 0,0075 km devient 0,000075 degrés de latitude maximum. Donc, tout bâtiment qui répondra à la norme de distance de 0,0075 km devra nécessairement respecter la norme de 0,000075 degrés de latitude. Si vous limitez l'exécution des calculs à des bâtiments situés à moins de 0,000075 degrés de latitude, vous ne devrez effectuer le calcul que pour un sous-ensemble beaucoup plus petit de bâtiments. Par conséquent, vous pouvez simplement trier les listes d'emplacements par latitude, puis parcourir les listes en comparant les distances uniquement pour les bâtiments dont la latitude correspond à 0,000075 degrés (7,5 mètres) d'un bâtiment sur l'autre liste.