D'accord, j'essaie donc d'envisager une solution pour cela. J'ai une base de données avec plus d'un million de lignes qui comprend un nom de ville aux États-Unis et un ensemble de coordonnées pour cette ville. Le problème est qu'il existe plusieurs villes du même nom: Springfield, NJ et Springfield, MA, par exemple. J'ai donc besoin d'obtenir les informations sur l'état.

Il existe également des doublons dans les données. Il n'y a qu'environ 6500 ensembles de coordonnées uniques, donc en théorie, je pourrais les localiser et les affecter aux autres entrées de la base de données. Est-ce un plan réalisable? Comment pourrais-je m'y prendre?

Voici quelques exemples de ce à quoi ressemblent les entrées de cette base de données:

2015-09-01 00:00:00,Buffalo,"42.9405299,-78.8697906",10.1016/s0894-7317(12)00840-1,42.9405299,-78.8697906,43.0,-79.0
2015-09-01 00:00:00,New York,"40.7830603,-73.9712488",10.1016/j.jmv.2014.04.008,40.783060299999995,-73.9712488,41.0,-74.0
2015-09-01 00:00:04,Scottsdale,"33.4941704,-111.9260519",10.1016/j.euroneuro.2014.05.008,33.494170399999994,-111.9260519,33.0,-112.0
2015-09-01 00:00:09,Provo,"40.2338438,-111.6585337",10.1016/j.toxac.2014.07.002,40.233843799999995,-111.6585337,40.0,-112.0
2015-09-01 00:00:13,New York,"40.7830603,-73.9712488",10.1016/j.drugalcdep.2014.09.015,40.783060299999995,-73.9712488,41.0,-74.0
2015-09-01 00:00:16,Fremont,"37.5482697,-121.9885719",10.1016/j.ajic.2012.04.160,37.548269700000006,-121.98857190000001,38.0,-122.0
2015-09-01 00:00:24,Provo,"40.2338438,-111.6585337",10.1016/j.chroma.2015.01.036,40.233843799999995,-111.6585337,40.0,-112.0

J'utilise le package geocoder pour la géolocalisation. Voici un code que j'ai écrit qui pourrait gérer cela:

def convert_to_state(lati, long):
    lat, lon = float(lati), float(long)
    g = geocoder.google([lat, lon], method='reverse')
    state_long, state_short = g.state_long, g.state
    return state_long, state_short

Je ne sais pas comment faire ça. Il s'avère que le géocodage est assez cher, donc l'utilisation des doublons est probablement la meilleure façon de progresser. Avez-vous des suggestions pour y parvenir?

1
user1917407 8 août 2016 à 03:48

3 réponses

Meilleure réponse

J'aime l'idée de table de hachage, mais voici une alternative utilisant des trucs de pandas:

1) Obtenez une liste unique de cordes (lat, lon)

df['latlon'] = [(x,y) for x,y in zip(df['lati'].tolist(),df['long'].tolist())]
unique_ll = df['latlon'].unique()

2) parcourez des cordons uniques et définissez l'état de toutes les lignes équivalentes

for l in unique_ll:
    df.loc[df['latlon'] == l, 'state'] = convert_to_state(l[0],l[1])
2
SO44 8 août 2016 à 03:10

La meilleure façon d'éviter de faire un travail supplémentaire sera certainement d'utiliser une table de hachage pour vérifier si quelque chose a déjà un mappage:

processed_coords = {}
def convert_to_state(lati, long):
    lat, lon = float(lati), float(long)
    if (lat, lon) not in processed_coords:
        g = geocoder.google([lat, lon], method='reverse')
        state_long, state_short = g.state_long, g.state
        processed_coords[(lat,lon)] = (state_long, state_short)
        return state_long, state_short
    else:
        return processed_coords[(lat,lon)]

De cette façon, vous effectuez une simple vérification O (1) pour voir si vous avez déjà les données, ce qui n'est pas beaucoup de calcul supplémentaire, et vous ne refaites pas le travail si vous l'avez déjà fait.

Si vous avez raison et qu'il n'y a que 6500 ensembles de coordonnées uniques, vous devriez être bien en termes d'utilisation de la mémoire pour cette technique, mais si vous vous trompez et qu'il y en a plus uniques, vous pouvez rencontrer des problèmes de mémoire si plus de ces millions de quelque chose sont uniques.

3
James 8 août 2016 à 01:12

Il y a un service de géo-info SmartyStreets qui a un outil de liste qui traite les listes de recherches et renvoie un tas d'informations (peut télécharger une feuille de calcul ou copier-coller). Ils se concentrent sur la validation des adresses et s'attendent donc à ce que les termes de recherche soient des adresses.Cependant, il peut correspondre uniquement aux codes postaux des villes et des États. Avez-vous accès à ces informations?

Voici un lien vers la démo.

1
Joseph Hansen 29 sept. 2016 à 16:28