tensorflow kmean으로 gps 분류 연습 예제, 2일차
내가 참조한 예제에서 원래 제작자는 임의의 샘플을 만들고, 그 중에서 한 개를 중심으로 선택하였다. 나는 데이터를 가지고 있어, 임의의 샘플을 만들 필요가 없다. 이에 따라 내가 가진 여러 개의 데이터 중, 임의 한 점을 중심으로 선택해야 했다. 내가 가진 예제는 이 부분이 없어, 예제를 이해하고, 새로 작성하는데 시간이 오래 걸렸다. 여러 삽질끝에 대략 아래와 같이 했다.
1일차에는 그룹을 설정하지 않았는데, 이렇게 되면 의미가 없다. 이를 수정하기 위해서 gps 좌표를 요일별로 모은 다음 출력으로 내보냈다. 요일별 모은 데이터에서 두 개의 요일을 선택했고, 여기에서 아무점이나 중심으로 선택했다. 일단 sql에서 요일별로 gps 값을 다시 출력하여 아래와 같은 값을 얻었다.
latitude longitude updated 0 37.3700 126.935 6 1 37.3698 126.935 6 2 37.3698 126.935 6 3 37.3697 126.935 6 4 37.3697 126.935 6 79 37.0344 126.773 5 80 37.0344 126.773 5 81 37.0344 126.773 5 82 37.0343 126.773 5 83 37.0343 126.773 5 235 37.0325 126.773 4 236 37.0325 126.773 4 237 37.0325 126.773 4 238 37.0325 126.773 4 239 37.0325 126.773 4 401 37.0344 126.773 3 402 37.0344 126.773 3 403 37.0344 126.773 3 404 37.0343 126.773 3 405 37.0343 126.773 3 544 37.0344 126.773 2 545 37.0344 126.773 2 546 37.0344 126.773 2 547 37.0344 126.773 2 548 37.3687 126.935 2 695 37.0343 126.773 1 696 37.0344 126.773 1 697 37.0343 126.773 1 698 37.0343 126.773 1 699 37.0343 126.773 1 900 37.3696 126.935 7 901 37.3695 126.935 7 902 37.3695 126.935 7 903 37.3716 126.935 7 904 37.3716 126.935 7
pandas에서 dataFrame을 groupby로 정렬하면 python이 데이터 형식을 변경해 버린다. 요일로 선택한 데이터를 dataFrame으로 사용하기 위해서 아래와 같이 했다. append 할 경우, 새로운 dataFrame을 만들어야지, 기존 dataFrame에 넣으면 붙지 않는다.
ipdGroupbyUpdated = ipd.groupby('updated') print ipdGroupbyUpdated.head() #updated에서 1일차 날짜, 3일차 날짜를 구해서 별도의 dataframe을 설정.. #pd.show_versions() print ipdGroupbyUpdated.get_group(1) #print type(ipdGroupbyUpdated.get_group(1)) ipdSliced=ipdGroupbyUpdated.get_group(1) print "1일차 데이터" print ipdSliced.head() print type(ipdSliced) ipdSliced1=ipdGroupbyUpdated.get_group(7) print "3일차 데이터" print ipdSliced1.head() print type(ipdSliced1)
찾아보면 더 쉬운 방법이 있겠지만, 여기까지 하는데도 충분히 힘들었다.
두 개 요일로 선택한 좌표를 그림을 그리기 위해서, 아래과 같이 함수를 정의하고, dataFrame을 인자로 넘겨 주었다. 굳이 함수로 정의한 이유는 원래의 예제가 함수로 되어 있었기 때문이다.
def plot_clusters(df_ipd, centroids): print("plot_clusters was called") import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt for key, val in df_ipd.groupby('updated'): tmp_centoid=df_ipd[df_ipd.updated==key].sample() #print "tmp_centoid 출력\n" #print tmp_centoid[['longitude','latitude']] #print tmp_centoid[['longitude']] plt.scatter(val['longitude'], val['latitude'], label=key) plt.plot(tmp_centoid[['longitude']],tmp_centoid[['latitude']], markersize=35, marker="x", color='k', mew=10) plt.plot(tmp_centoid[['longitude']],tmp_centoid[['latitude']], markersize=30, marker="x", color='m', mew=5)
for문이 groupby의 기준인 날짜기준으로 key값을 변경하면서 루프를 만든다. dataFrame에서 임의의 점을 찾기 위해 tmp_centoid[‘longitude’]와 같은 방식을 선택했다. 마지막에 있는 marker관련 2개의 줄은 X의 색을 칠하는 부분이다. 필요 없다고 판단하여 한 줄만 사용하니 색이 안칠해 졌다.
대략 아래와 같은 그림을 얻을 수 있다..
전에 데이터와 달리 위도/경도의 축을 바꿨다.