2014-02-17 2 views
1

위치 및 타워 목록이 있습니다. 나는 각 위치마다 가장 가까운 타워가 무엇인지 알아 내려고 노력 중이다. 나는 작동하는 방법을 생각해 냈지만, 매우 비효율적 인 방법이라고 확신한다.데이터 프레임 (가장 가까운 이웃)의 각 지점에 가장 가까운 지점을 얻는 Python 방법

어떻게하면 더 파이썬적인 방식으로이 작업을 수행 할 수 있습니까?

약 4,000 개의 위치와 11,000 개의 타워가 있습니다. 저는 현재 해요 :

  1. 복용 거리
  2. 에 의해 정렬 모든 타워
  3. 까지의 거리를 찾는 각 위치
  4. 통해 반복 후 'nearest_tower의 데이터 프레임에 그를 추가 가까운 하나입니다.

여기에 코드입니다 :

nearest_tower = pd.DataFrame() 

for i, location_rows in d[["Name", "Lat", "Long"]].T.iteritems(): 
    tower_coords["Distance_km"] = tower_coords.apply(lambda row: distance_on_unit_sphere(location_rows ["Lat"], location_rows ["Long"], row['DIGITAL_LATITUDE'], row['DIGITAL_LONGITUDE'])*6373, axis=1) 
    a = tower_coords.sort(['Distance_km'], ascending = 1)[:1][["SITE_NUMBER", "DIGITAL_LATITUDE", "DIGITAL_LONGITUDE", "Distance_km"]] 
    a["Location_Name"] = location_rows ["Name"] 
    a["Location_Lat"] = location_rows ["Lat"] 
    a["Location_Long"] = location_rows ["Long"] 
    nearest_tower = nearest_tower.append(a) 
    print(i) 

Tower_coords은 ​​다음과 같습니다

SITE_NUMBER DIGITAL_LATITUDE  DIGITAL_LONGITUDE 
1    67.21      -30.432 
... 
+0

tower_coords 란 무엇입니까? 그게 어떻게 생겼어? – usethedeathstar

+0

아마도 로컬 타워까지의 거리가 힙에 놓여지면 가장 가까운 타워를 간단하게 튕겨 낼 수 있습니다. 그러나 아마도이 문제를 해결하기 위해 더 효율적인 데이터 구조가 있습니다. kd 트리처럼 @Hbcdev는 –

+0

을 언급합니다. @usethedeathstar 파일 추가 예제는 타워의 경도와 위도를 보여줍니다. – Ger

답변

1

첫번째로는, 가장 가까운을 찾을 수 min (Python doc here)를 사용합니다. iterable 다음에 key 인수를 제공 할 수 있습니다 (람다 함수가 됨).

a 개체 대신 해시 (Hash) 형 구조 대신 클래스를 사용하는 것이 더 좋을 것입니다. PyPy와 같은 구현은 해시와 같은 액세스보다 클래스 속성 액세스를 더 효율적으로 처리 할 수 ​​있습니다.

이 전체 기능은 map 작동으로 만들 수 있습니다. 하나의 구조체를 가져 와서 요소간에 1-1 대응을 사용하여 다른 구조체에 매핑하면 map이됩니다.

마지막으로 Pythonic이 아니지만 중요합니다. 가장 가까운 점을 효율적으로 찾으려면 k-d tree 구조를 사용해야합니다.

0

Here is a solution 다른 질문으로 루핑보다 빠르지 만 많은 메모리를 사용하는 복잡한 데이터 유형 (파이썬과 낸피 내장형)을 사용합니다.

언급 된 @Hbcdev와 같은 k-d 트리 검색을 수행하는 팬더 기스 터 proposing a get_nearest method에 문제가 있습니다. 나는 팬더에서 kNN 검색을 구현하는 방법을 알아 내려고 노력 중이다.

편집 : 누군가 여기 팬더에서 how to do a k-d tree search을 설명합니다!