Получить места в данном географическом районе (оптимизация кода) - PullRequest
0 голосов
/ 10 марта 2019

У меня есть DataFrame с широтой и долготой мест (restaurants) и DataFrame с широтой и долготой окрестностей (area).

Я бы хотел для каждого района подсчитать количество ресторанов в 3-х километровой зоне (numberR).

Я написал следующий код, и он работает:

df=pd.DataFrame()
numberR=[]
radius=3

for element in range(0,area['lon'].count()): #for every neighborhood  
    df=pd.DataFrame()
    df['destLat']=restaurants['lat']
    df['originLat']=areas['lat'][element]
    df['destLon']= restaurants['lng']
    df['originLon']=area['lon'][element]

    for i, row in df.iterrows():
        #for every restaurant I compute the distance from my neighborhood in km
        l=[haversine(df.originLon[i],df.originLat[i],df.destLon[i],df.destLat[i]) for i, row in df.iterrows()]

    numberR.append(sum(x<radius for x in l))

Однако я хотел бы ускорить код, поскольку он очень медленный.

Есть ли у вас какие-либо идеи о том, как можно добиться того же результата за меньшее время?

Заранее спасибо.

PS haversine - хорошо известная функция для определения расстояния в километрах, начиная с широты и долготы.

1 Ответ

1 голос
/ 10 марта 2019

Я бы порекомендовал вам использовать функции из scipy.spacial.distance .

from scipy.spatial.distance import cdist

distances = cdist(areas, restaurants, metric=haversine)  # metric accepts a callable
sum(distances > 3)  # sums columns

Функция cdist вычисляет расстояния между каждой парой строк двух DataFrames.

Кроме того, вы должны изменить функцию haversine, чтобы иметь возможность принимать строки DataFrame.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...