Ускорьте вложенные циклы над фреймом данных с помощью apply () - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть фрейм данных, использующий Pandas в Python, который содержит координаты широты и долготы в каждой строке. Моя цель - добавить еще один столбец с именем «close_by», содержащий количество других записей в наборе данных, которые находятся в пределах 1 мили, используя haversine.

Я видел другие руководства для подобных проблем, как: https://engineering.upside.com/a-beginners-guide-to-optimizing-pandas-code-for-speed-c09ef2c6a4d6 Но они включают использование df.apply () для обновления каждой строки, чтобы добавить расстояние между координатами и некоторой статической определенной точкой. Мне не повезло найти или найти решение.

По сути, это то, что я пытаюсь оптимизировать:

for index1, row1 in business_data.iterrows():
    for index2, row2 in business_data.iterrows():
        distance = mpu.haversine_distance((business_data.at[index1,'latitude'], business_data.at[index1,'longitude']), (business_data.at[index2,'latitude'], business_data.at[index2,'longitude']))
        distance = distance * 0.621371

        if distance <= 1:
            business_data.at[index1,'close_by'] = row1["close_by"] + 1

У меня около 50 000 строк, и на моем компьютере это занимает около 5 секунд на строку.

Спасибо за любые предложения!

1 Ответ

1 голос
/ 16 апреля 2019

Судя по всему, mpu.haversine_distance() использует math вместо numpy функций, так что это не векторизуемо.

Используя эту векторизованную функцию расстояния хаверсин , выможет легко векторизовать вашу проблему:

df = pd.DataFrame([
    {'latitude': 49.001, 'longitude': 11.0},
    {'latitude': 49.0, 'longitude': 11.0},
    {'latitude': 49.001, 'longitude': 11.001},
    {'latitude': -49.0, 'longitude': 11.0},
])


lon = df['longitude'].to_numpy()
lat = df['latitude'].to_numpy()

radius = 1.0

df['close_by'] = np.count_nonzero(haversine_np(lon, lat, lon[:, None], lat[:, None]) < radius, axis=0) - 1

df
#   latitude    longitude   nearby
# 0 49.001      11.000      2
# 1 49.000      11.000      2
# 2 49.001      11.001      2
# 3 -49.000     11.000      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...