2016-08-08 32 views
1

Okay, also versuche ich mir eine Lösung dafür vorzustellen. Ich habe eine Datenbank mit über einer Million Zeilen, die einen Städtenamen in den USA und eine Reihe von Koordinaten für diese Stadt enthält. Das Problem ist, dass es mehrere Städte mit dem gleichen Namen gibt: Springfield, NJ und Springfield, MA, zum Beispiel. Also muss ich die staatliche Information bekommen.Wie sollte ich über 1.100.000 Zeilen Koordinateninformationen geolocation gehen?

Es gibt auch Duplikate innerhalb der Daten. Es gibt nur ungefähr 6500 Sätze einzigartiger Koordinaten, also könnte ich diese lokalisieren und sie dann den anderen Einträgen in der Datenbank zuordnen. Ist das ein realisierbarer Plan? Wie würde ich darüber gehen?

Hier sind einige Beispiele dafür, was in dieser Datenbank-Einträge wie folgt aussehen:

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 

ich das geocoder Paket für Geolocation verwende. Hier ist ein Code, den ich geschrieben habe, der damit umgehen könnte:

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 

Ich bin nur nicht sicher, wie dies zu tun ist. Es stellt sich heraus, dass Geocoding ziemlich teuer ist, daher ist die Verwendung der Duplikate wahrscheinlich der beste Weg. Irgendwelche Vorschläge, wie man das erreicht?

+0

Sie können möglicherweise eine SQL-Abfrage verwenden, um eindeutige Daten, z. B. Koordinaten, zu erhalten. Versuchen Sie etwas wie "SELECT DISTINCT Stadt, Koordinaten FROM Tabelle". Sie müssen jedoch die richtigen Spalten- und Tabellennamen ersetzen. – NendoTaka

+0

Ich habe noch nie SQL benutzt und habe nicht wirklich genug Zeit um zu lernen. Gibt es eine Möglichkeit, dies in Python und Pandas zu erreichen? – user1917407

+0

Sie könnten eine geschachtelte Liste erstellen mit einer for-Schleife nach dem Abrufen der Daten und nur überprüfen, ob die neuen Daten ein Duplikat – NendoTaka

Antwort

2

ich die Hash-Tabelle Idee mögen, aber hier ist eine Alternative mit einigen Pandas Zeug:

1) erhält eine eindeutige Liste von (lat, lon) COORDS

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

2) Schleife durch einzigartige coords und stellen Sie den Zustand für alle gleichwertigen Linien

for l in unique_ll: 
    df.loc[df['latlon'] == l, 'state'] = convert_to_state(l[0],l[1]) 
+0

Du solltest erwähnen: 'importiere pandas als pd; df = pd.read_csv (Dateiname); ' –

3

Fast sicher die beste Art und Weise tun, zusätzliche Arbeit zu vermeiden, wird eine Hash-Tabelle zu verwenden, um zu überprüfen, ob etwas bereits eine Zuordnung hatte:

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)] 

diese Weise können Sie einen einfachen O tun (1) überprüfen, um zu sehen, wenn Sie bereits die Daten haben, die nicht viel zusätzliche Berechnung sind, und Sie die Arbeit nicht wiederholen, wenn Sie es tatsächlich schon getan haben.

Wenn Sie Recht haben und es nur 6500 Sätze von eindeutigen Koordinaten gibt, sollten Sie in Bezug auf die Speicherauslastung für diese Technik in Ordnung sein, aber wenn Sie falsch liegen und es noch andere gibt, können Sie etwas Speicher abrufen Probleme, wenn mehr von diesen Millionen etwas einzigartig sind.

1

Es gibt eine Geo-Info-Dienst SmartyStreets, die eine Liste Werkzeug hat, die Listen von Suchanfragen und gibt eine Reihe von Informationen verarbeitet (kann Uplo eine Tabelle oder Kopieren und Einfügen). Sie konzentrieren sich auf die Adressvalidierung, so dass sie erwarten, dass Suchbegriffe Adressen sind. Sie können jedoch nur Postleitzahlen an Städte und Staaten anpassen. Hast du Zugriff auf diese Informationen?

Hier ist ein link to the demo.