>백엔드 개발 >파이썬 튜토리얼 >대규모 데이터 세트에 대해 Python과 Pandas에서 지리적 좌표 사이의 거리를 어떻게 빠르게 계산할 수 있습니까?

대규모 데이터 세트에 대해 Python과 Pandas에서 지리적 좌표 사이의 거리를 어떻게 빠르게 계산할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-02 18:58:02312검색

How Can You Quickly Calculate Distances Between Geographic Coordinates in Python and Pandas for Large Datasets?

Python 및 Pandas의 빠른 Haversine 근사

Haversine 공식을 사용하여 지리적 좌표 간의 거리를 계산하는 것은 대규모 데이터 세트의 경우 시간이 많이 걸릴 수 있습니다. 정확성이 중요하지 않고 포인트가 짧은 거리(예: 50마일 미만) 내에 있는 애플리케이션의 경우 프로세스 속도를 크게 높일 수 있는 최적화가 있습니다.

벡터화된 Numpy 구현

Haversine 수식은 NumPy 배열을 사용하여 벡터화할 수 있습니다. 이 접근 방식은 NumPy의 최적화된 수학 함수를 활용하여 전체 배열에서 계산을 수행함으로써 명시적인 루프가 필요하지 않고 성능이 향상됩니다.

<code class="python">import numpy as np

def haversine_np(lon1, lat1, lon2, lat2):
    lon1, lat1, lon2, lat2 = map(np.radians, [lon1, lat1, lon2, lat2])

    dlon = lon2 - lon1
    dlat = lat2 - lat1

    a = np.sin(dlat/2.0)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2.0)**2

    c = 2 * np.arcsin(np.sqrt(a))
    km = 6378.137 * c
    return km</code>

Pandas 통합

벡터화된 Pandas 데이터프레임을 사용한 NumPy 기능은 간단합니다. haversine_np에 대한 입력은 데이터 프레임의 열로 직접 제공될 수 있습니다. 예:

<code class="python">import pandas as pd

# Randomly generated data
lon1, lon2, lat1, lat2 = np.random.randn(4, 1000000)
df = pd.DataFrame(data={'lon1':lon1,'lon2':lon2,'lat1':lat1,'lat2':lat2})

# Calculate distances using vectorized NumPy function
km = haversine_np(df['lon1'], df['lat1'], df['lon2'], df['lat2'])

# Append distances to dataframe
df['distance'] = km</code>

벡터화의 이점

벡터화를 사용하면 Python에서 본질적으로 느린 명시적 루프가 필요하지 않습니다. 대신 벡터화된 작업은 NumPy의 최적화된 기본 C 코드를 활용하여 배열에서 직접 수행됩니다. 이로 인해 특히 대규모 데이터 세트의 경우 성능이 크게 향상됩니다.

참고:

이 최적화된 접근 방식은 상당한 속도 향상을 제공하지만 정확도에는 약간의 절충점이 있습니다. 벡터화되지 않은 원래 수식. 그러나 거리가 50마일 미만이고 정확도가 가장 중요하지 않은 경우에는 정밀도의 한계 손실보다 성능상의 이점이 더 큽니다.

위 내용은 대규모 데이터 세트에 대해 Python과 Pandas에서 지리적 좌표 사이의 거리를 어떻게 빠르게 계산할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.