Рассчитайте расстояние между всеми точками в пределах 2 данных DataFrames, без неэффективного алгоритма O (n*M)Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Рассчитайте расстояние между всеми точками в пределах 2 данных DataFrames, без неэффективного алгоритма O (n*M)

Сообщение Anonymous »

в настоящее время у меня есть проблема, в которой я хотел бы получить расстояние между точками (хранящимися как LAT и Long) в 2 отдельных данных данных. как lat/long, а у другого есть 50 000 мест врачей как lat/long. >
Моя первая мысль была использовать векторизованные функции. После некоторого исследования я выбрал геопанда и с помощью: < /p>

[*] Метод GPD Buffer () для получения круга центра (lat_building; long_building) и из Radius x км, как многоугольник,
[*] gpd.sjoin () 'Inner', чтобы затем найти любую точку, содержащуюся в полигоне,

... Это работает удивится и работает быстро. Единственным решением, которое у меня есть, было бы создать несколько геодатафреймов с изменяющимся X, но это неэффективно. Поэтому я хотел бы рассчитать расстояние (метры) между каждой парой точек в (DataFrame1, DataFrame2), а затем отфильтровать полученный DataFrame на расстоянии столбца.
Я бы предположил, что существует векторизованная функция, позволяющая расчет быстрого расстояния между 2 сериями, но документация на «Distance ()» или функциях GPD не раскрыла мне какую -либо полезную функцию, работающую векторизованными способами, такими как Sjoin (Sjoin (Sjoin ( ).
Есть функции, чтобы найти ближайшую точку, но это побеждает цель поиска всех врачей в радиусе x км. < /p>
Единственный код, который у меня есть на расчете расстояния был бы на картезианском продукте и неэффективен. < /p>
#test data with 600 pdv (buildings) and 200 pds (doctors)
data_pdv = {'pdv': range(1, 6001),
'latitude': [48.8566] * 3000 + [30.7128] * 3000,
'longitude': [2.3522] * 6000}

data_pds = {'pds': range(1, 201),
'latitude': [48.8588] * 200,
'longitude': [2.2944] * 200}

# Convert data to GeoDataFrames
gdf_pdv = gpd.GeoDataFrame(data_pdv, geometry=gpd.points_from_xy(data_pdv['longitude'], data_pdv['latitude']))
gdf_pds = gpd.GeoDataFrame(data_pds, geometry=gpd.points_from_xy(data_pds['longitude'], data_pds['latitude']))

# Create a Cartesian product of my pdv and pds (all combinations of rows)
cartesian_product = gdf_pdv.assign(key=1).merge(gdf_pds.assign(key=1), on='key').drop('key', 1)

# Calculate the geodesic distances
cartesian_product['distance'] = cartesian_product.apply(
lambda row: geodesic((row['latitude_x'], row['longitude_x']), (row['latitude_y'], row['longitude_y'])).meters,
axis=1
)

# Filter distances < 10km
output_df = cartesian_product[cartesian_product['distance'] < 10000]


Подробнее здесь: https://stackoverflow.com/questions/776 ... -inefficie
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»