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

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

Сообщение Anonymous »

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

Метод GPD Buffer () для получения круга центра (lat_building; long_building) и радиуса X км, как полигон, < /li>
gpd.s Polygon, < /li>
< /ol>
... Это работает чудесно и работает быстро. Единственным решением, которое у меня есть, было бы создать несколько геодатафреймов с изменяющимся X, но это неэффективно. Поэтому я хотел бы рассчитать расстояние (метры) между каждой парой точек в (dataframe1, dataframe2), чтобы затем отфильтровать полученный фрейм данных на расстоянии столбца. в качестве sjoin ().
есть функции, чтобы найти ближайшую точку, но это побеждает цель поиска всех врачей в радиусе х км.#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»