두서 없이 블로그 하는것 같군...
python - pandas를 통해 두 지점의 위경도 리스트를 불러온 후, 두 지점의 위경도 구하는 코딩을 구현해봤다.
그냥 두 지점을 거리를 구하는 것은 구글 검색하면 쉽게 나와서 공식은 어렵지 않게 만들었는데, (복붙했다)
pandas에서 구할려다 보니 잘 안되서, 고민을 너무 많이 했다.. (역시 나는 코딩 센스가 없다.)
import pandas as pd import numpy as np from math import sin, cos, sqrt, atan2, radians |
#대략 이런 포맷이다.
df1 = df[['xpos','ypos','long','lat']] df1.head() |
# 두 지점의 위경도 거리를 구하는 함수를 만들었다.
R = 6373.0
def mydistance(a1,b1,a2,b2):
x1 = radians(a1)
y1 = radians(b1)
x2 = radians(a2)
y2 = radians(b2)
dlon = x2 - x1
dlat = y2 - y1
a = sin(dlat / 2)**2 + cos(y1) * cos(y2) * sin(dlon / 2)**2
c = 2 * atan2(sqrt(a), sqrt(1 - a))
return R * c
mydistance(127.001502,37.288405,127.002441,37.290188)
## 이 부분이 나에게 가장 고민을 많이 하게 만든 부분이다.
pandas에서 바로 커스텀 함수(mydistance)로 위경도 거리 구하면 될줄 알았다.
그런데 안됐다.
아래 처럼, 전부 리스트로 추출한후, 계산 한 함수를 돌려보니 계산이 됐다.
pandas에서는 바로 안되고, 리스트로 추출하니까 되는지 아직도 모르겠다. 일단 됐으니까,,
그런데, 이 파일은 그나마 몇 백개 안되니까 몇 초안에 계산이 되었는데,
아래처럼 리스트 추출해서 계산한다면, 몇천만줄, 몇억줄은 내 맥북 멈출것 같은 느낌이 들어서 쎄하다.
아래처럼 위경도 거리구하면 계산 속도가 느리다.
좀 더 빨리 할수 있는 방법이 있을것 같지만, 내 능력 밖이다.
df1_xpos = [] df1_ypos = [] df1_long = [] df1_lat = [] for i in range(len(df1)): df1_xpos.append(df1['xpos'][i]) df1_ypos.append(df1['ypos'][i]) df1_long.append(df1['long'][i]) df1_lat.append(df1['lat'][I]) |
df1_distance = [] for i,j,k,l in zip(df1_xpos,df1_ypos,df1_long,df1_lat): df1_distance.append(mydistance(i,j,k,l)) |
df1_distance |
[0.21501830417233017,
0.21501830417233017, 0.21501830417233017, 0.21731888422264176, 0.21731888422264176, 0.21731888422264176, 0.21731888422264176, 0.0491964065334208, 0.0491964065334208,
....
]
### Jupiter notebook에 작성한것을 블로그에 이쁘게 올리는 방법을 알고 싶다.
### 위경도 거리구한 df1_dis1와 기존 df1와 concat하여, 내가 원하는 데이터프레임(df2)을 구하였다.
df1_dis1.head() |
df2 = pd.concat([df1, df1_dis1], axis=1) df2.head()
|
df2.rename(columns = {0 : 'distance'}, inplace = True) df2.head() |
'python' 카테고리의 다른 글
python타입 바꾸기 (0) | 2019.03.01 |
---|---|
python pandas의 pivot 해보자 (0) | 2018.03.07 |
python encoding 종류 (0) | 2018.03.03 |
python 공부해볼까? (0) | 2018.03.02 |
Mac기준, jupyter notebook - python 한글폰트 설정하기 (0) | 2018.03.02 |