import pandas as pd
import numpy as np
import googlemaps # gps 정보
import folium # 지도
import matplotlib.pyplot as plt # 그래프
import seaborn as sns
# 데이터 읽고, 1~9호선을 제외한 노선으 제외시키는 반복문 입니다.
# 파일 읽어오고, 1~9호선을 제외한 노선으 제외시키는 반복문 입니다.
df_main = pd.read_excel("서울지하철역_유동인구현황(2020년3월).xlsx",
thousands=',',
usecols=['노선명','역명','승차총승객수','하차총승객수'], # 필요한 컬럼만 추출
encoding='CP949')
# 1~9호선을 제외한 노선을 제외시키는 반복문 입니다.
array=['경춘선','수인선','안산선','우이신설선','일산선','장항선','중앙선','경원선','경부선','경강선','경의선','경인선','공항철도 1호선',
'과천선','분당선'] # 나머지 노선들
for xx in array:
df_main = df_main[df_main['노선명']!=xx]
# 노선별로 정렬후, 노선이 같은경우 역명별 정렬을 수행
df_main.sort_values(by=['노선명','역명'],axis=0,inplace=True)
# 확인
df_main
# 일별유동인구수 열 추가 (승하차+승객수)
df_main['일별유동인구수'] = df_main['승차총승객수'] + df_main['하차총승객수']
df_main.head(5)
# len() -> 총갯수
len(df_main)
# 1.역명별,노선별 그룹하기, 2.컬럼이름바꾸기
# 밑에 처럼 "역명별 합"을 구할수있지만 이때 column에 역명이 들어가있지않습니다
df_main_sub1 = df_main.groupby(by=['역명','노선명'], as_index=False).sum()
df_main_sub1.rename(columns={"일별유동인구수":"총유동인구수"}, inplace=True)
df_main_sub1
# 노선별 넣어줄 "색상"도 미리 데이터프레임에 넣어줌.
color=[]
for x in df_main_sub1.index:
if df_main_sub1['노선명'][x] == '1호선':
color.append('#0D3692')
elif df_main_sub1['노선명'][x] == '2호선':
color.append('#333D92')
elif df_main_sub1['노선명'][x] == '3호선':
color.append('#86SZ92')
elif df_main_sub1['노선명'][x] == '4호선':
color.append('#C55CI2')
elif df_main_sub1['노선명'][x] == '5호선':
color.append('#8B50A4')
elif df_main_sub1['노선명'][x] == '6호선':
color.append('#C55C1D')
elif df_main_sub1['노선명'][x] == '7호선':
color.append('#5464DD')
elif df_main_sub1['노선명'][x] == '8호선':
color.append('#F51361')
elif df_main_sub1['노선명'][x] == '9호선':
color.append('#AA9872')
else :
color.append('#AA9872')
# 이렇게 하면 데이터프레임(df_main_sub1)에 컬럼(노선색)이 추가가 됨 ★★
df_main_sub1['노선색'] = color
# (컬럼삭제) -> df_main_sub1 = df_main_sub1.drop(['노란색'], axis=1)
# 확인
df_main_sub1.head()
# 구글맵스 api ("역명"을 사용해서 해당 "역명"의 GPS좌표를 가져옵니다!)
gmaps_key = "AIzaSy???????????????h9Dc14qz15YF0pPM69k"
gmaps = googlemaps.Client(key=gmaps_key)
# "역명" 뒤에 '역'을 붙입니다 (이유 - GPS의 위도,경도 알기위해서 붙임.)
sub_name = [] # 배열로 "역명" 받음
for name in df_main_sub1['역명']:
sub_name.append(name+'역')
sub_name
# 역명으로 좌표("위도,경도") 받는 반복문 하는 도중에, null값으로 인해서 못 찾는 부분이 생기면, 역명 뒤에 역을 제거하고 다시 재검색후, 역명의 좌표("위도","경도")를 가져옵니다.
# gmaps를 이용해서 좌표("위도","경도") 가져오기
sub_lat = [] # sub_lat : 역명의 "위도" 정보들
sub_lng = [] # sub_lng : 역명의 "경도" 정보들
for name in sub_name: # 역명
tmp = gmaps.geocode(name, language='ko') # 구글맵스 사용해서 찾는 부분
if not tmp: # null이면
tmp = gmaps.geocode(name[:-1], language='ko') # 맨뒷자리에 "역" 삭제하기 -> name[:-1] # 삭제 뒤, 구글맵스 사용해서 찾는 부분
tmp_loc = tmp[0].get("geometry") # 구글맵스에서 가져온 좌표 위치 가져오기(꼭 geometry 사용해줘야함)
sub_lat.append(tmp_loc['location']['lat']) # 구글맵스에서 가져온 좌표 위치 "위도" 저장(꼭 location,lat 사용해줘야함)
sub_lng.append(tmp_loc['location']['lng']) # 구글맵스에서 가져온 좌표 위치 "경도" 저장(꼭 location,lng 사용해줘야함)
# print(name) # 진행되는거 확인하는거
# 좌표의 "위도", "경도" 정보들을 데이터 프레임에 붙여 줍니다!!!!
# 참고- 사용하고 있는 중인 데이터프레임
# df_main ----- 메인
# df_main_sub1 ----- 사용하고 있는 중인 데이터프레임
# sub_name ----- 역명이름
# 이렇게 하면 데이터프레임(df_main_sub1)에 컬럼(위도),컬럼(경도)가 추가가 됨 ★★
df_main_sub1['위도'] = sub_lat
df_main_sub1['경도'] = sub_lng
# 확인
df_main_sub1.head()
# 지도를 그릴 정보들을 모두 추출 했습니다!! (위에 있는 "데이터프레임")
# 시각화 (동그라미)
map1 = folium.Map(location=[37.5502,126.982], zoom_start=11)
for n in df_main_sub1.index:
folium.CircleMarker([df_main_sub1['위도'][n], df_main_sub1['경도'][n]], # 위도좌표, 경도좌표
tooltip = df_main_sub1['역명'][n] + "역 (" + str(df_main_sub1['총유동인구수'][n]) +")", # 마우스 갖다대면 팝업
popup = df_main_sub1['역명'][n] + "역 (" + str(df_main_sub1['총유동인구수'][n]) +")", # 클릭시, 팝업
radius = df_main_sub1['총유동인구수'][n]/150000, # 반지름
color = df_main_sub1['노선색'][n], fill_color = df_main_sub1['노선색'][n]).add_to(map1) # 선색, 채우기색
map1
# 시각화 (동그라미 + 표시)
map1 = folium.Map(location=[37.5502,126.982], zoom_start=11)
for n in df_main_sub1.index:
folium.CircleMarker([df_main_sub1['위도'][n], df_main_sub1['경도'][n]], # 위도좌표, 경도좌표
tooltip = df_main_sub1['역명'][n] + "역 (" + str(df_main_sub1['총유동인구수'][n]) +")", # 마우스 갖다대면 팝업
popup = df_main_sub1['역명'][n] + "역 (" + str(df_main_sub1['총유동인구수'][n]) +")", # 클릭시, 팝업
radius = df_main_sub1['총유동인구수'][n]/150000, # 반지름
color = df_main_sub1['노선색'][n], fill_color = df_main_sub1['노선색'][n]).add_to(map1) # 선색, 채우기색
folium.Marker([df_main_sub1['위도'][n], df_main_sub1['경도'][n]]).add_to(map1) # 표시
map1
# 시각화 한것을 "파일화"하여서 확인 가능.
map1.save("map.html")
'■ Python > Study' 카테고리의 다른 글
[Python] 파이썬으로 데이터 주무르기 - 책 안의 내용 정리 잘 되어있는 곳 (0) | 2020.06.29 |
---|---|
[Python] Token authentication is enabled 해결 방법 (0) | 2020.06.16 |
[Python] ANACONDA 설치 방법 (0) | 2020.05.04 |
[Python] 깃허브 소스코드 참조 (0) | 2020.05.04 |
[Python] 아나콘다(ANACONDA) (0) | 2020.05.04 |