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")