두서 없이 블로그 하는것 같군...



python - pandas를 통해 두 지점의 위경도 리스트를 불러온 후, 두 지점의 위경도 구하는 코딩을 구현해봤다. 

그냥 두 지점을 거리를 구하는 것은 구글 검색하면 쉽게 나와서 공식은 어렵지 않게 만들었는데, (복붙했다)

pandas에서 구할려다 보니 잘 안되서, 고민을 너무 많이 했다.. (역시 나는 코딩 센스가 없다.)



import pandas as pd

import numpy as np
from math import sin, cos, sqrt, atan2, radians

#엑셀 csv파일에서 두지점의 위경도 지점 불러옴

df = pd.read_csv('../csv_data/apt_result.csv', encoding='cp949')




#대략 이런 포맷이다.


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)
Out[5]:
0.21502719071344528



## 이 부분이 나에게 가장 고민을 많이 하게 만든 부분이다. 

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 = pd.DataFrame(data = df1_distance

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

+ Recent posts