-
전국 전기차 충전소 위치 분석 & 시각화 with Python, Mapbox, PlotlyData Analysis/Environment 2021. 3. 1. 21:55
Data Source:
공공데이터 한국환경공단_전기자동차 충전소 정보
data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15076352
활용 라이브러리 패키지:
Mapbox, Plotly
Mapbox 활용한 전국 전기차 충전수 위치 지도
전국 전기차 충전소 좌표(위도/경도), 장소명, 주소, 전화번호, 주차료유무 등 데이터 확인이 가능함.
Plotly 활용한 전국 전기차 충전소 현황 시각화Python Code:
import pandas as pd table=pd.read_html('https://inasie.github.io/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/5/',encoding='utf-8')[0] table['code']=table['법정동코드'].apply(lambda x:str(x)[:2] ) table2=table.drop_duplicates('code',keep='first') from urllib.request import urlopen from urllib.parse import urlencode, unquote, quote_plus import urllib import requests import pandas as pd import xmltodict import json from datetime import datetime as dt import requests key='~~~' final_data=[] for a, b,c in table2.itertuples(index=False): url=f'http://apis.data.go.kr/B552584/EvCharger/getChargerInfo?serviceKey={key}&' queryParams =urlencode({quote_plus('numOfRows') : '9999', quote_plus('pageNo') : '1',quote_plus('zcode') : c}) url2 = url + queryParams response = urlopen(url2) results = response.read().decode("utf-8") results_to_json = xmltodict.parse(results) data = json.loads(json.dumps(results_to_json)) final_data.extend(data['response']['body']['items']['item']) df=pd.DataFrame(final_data) df.rename(columns = {'statNm' : '장소명','addr':'주소','useTime':'이용시간','busiCall':'전화번호','parkingFree':'주차료비용'}, inplace = True) from mapboxgl.utils import df_to_geojson df['lat']=df['lat'].astype(float) df['lng']=df['lng'].astype(float) geo_data = df_to_geojson( df.fillna(''), properties=['장소명', '주소','powerType','주차료비용','전화번호'], lat='lat', lon='lng', precision=5, filename = "ev_charger.geojson" ) import json geo_data_2 = 'ev_charger.geojson' with open(geo_data_2) as f: data = json.loads(f.read()) from mapboxgl.viz import * token = '~~~~' center = [128.033400, 36.801156] viz = CircleViz( data, access_token=token, center=center, zoom=6.2) viz.show() viz.create_html('ev_chargers.html') df['시도']=df['주소'].apply(lambda x: x[:3]) df['시도']=df['시도'].str.replace('특','').replace('충청북','충북').replace('충청남','충남').replace('경상남','경남').replace('경상북','경북') df['시도']=df['시도'].str.replace('부산광','부산').replace('대구광','대구').replace('인천광','인천').replace('울산광','울산').replace('광주광','광주') df['시도']=df['시도'].str.replace('전라남','전남').replace('전라북','전북').replace('대전광','대전') ddf=pd.DataFrame(df.groupby(['시도']).count()['장소명']) ddf=ddf[ddf.index!='nul'] ddf=ddf.reset_index() ddf.rename(columns={'장소명':'충전소 수'}, inplace=True) ddf=ddf.sort_values(by='충전소 수',ascending=False) ddf=ddf.rename(columns={'시도':'sido','충전소 수':'number of chargers','충전소 비중':'Perc'}) eng_sido=['gyeongi','seoul','jeju', 'gyeongnam','gyeongbuk','chungnam','jeonnam', 'jeonbuk','daegu','gangwon', 'busan','gwangju','chungbuk', 'incheon','daejeon','ulsan','sejong'] ddf['eng_sido']=eng_sido import plotly.express as px fig = px.bar(ddf, x='eng_sido', y='number of chargers',title="number of electric car chargers per province") # fig.show() jj=fig.to_json() for x,y in zip(ddf['sido'], ddf['eng_sido']): jj = jj.replace(y, x) ddf['충전소 비중']=ddf['충전소 수'].apply(lambda x: x/ddf['충전소 수'].sum()) fig = px.pie(ddf, values='Perc', names='eng_sido', title='percentage') ff=fig.to_json() for x,y in zip(ddf['sido'], ddf['eng_sido']): ff = f.replace(y, x) ingu=pd.read_csv('인구수.csv',encoding='cp949',skiprows=1) sido=['서울','부산','대구','인천','광주','대전','울산','세종','경기도','강원도','충북','충남','전북','전남','경북','경남','제주'] ingu['sido']=sido merge=pd.merge(left=ddf,right=ingu,left_on=ddf['sido'],right_on=ingu['sido'],how='inner') merge['시도별 충전소 대비 인구 수']=merge['총인구수 (명)']/merge['number of chargers'] merge=merge.sort_values(by='시도별 충전소 대비 인구 수',ascending=False) merge['시도별 충전소 대비 인구 수']=merge['시도별 충전소 대비 인구 수'].apply(lambda x: int(x)) merge=merge.rename(columns={'총인구수 (명)':'Population','시도별 충전소 대비 인구 수':'Population/Chargers'}) fig = px.bar(merge, x='eng_sido', y='Population/Chargers', hover_data=['number of chargers', 'Population'], color='Population/Chargers', ) fj=fig.to_json() for x,y in zip(merge['sido_x'], merge['eng_sido']): fj = fj.replace(y, x)
'Data Analysis > Environment' 카테고리의 다른 글
지난 10년간 대한민국 시도별 온도/강수량 데이터 분석 & 시각화 With Python (0) 2021.03.09 강원도 춘천시 지형/토심/경사 Analysis 3d 웹맵 Qgis/Qgisthreejs.js (0) 2021.03.05 강원도 고성 지형/ASPECT Analysis 3d 웹맵 Qgis&Qgisthreejs.js (0) 2021.03.03 전국 시도별 총 가정생활 폐기물 데이터 분석 & 시각화 with Python, Mapbox, Plotly (0) 2021.03.02 강원도 강릉 지형/경사 3d 웹맵 Qgis&Qgisthreejs.js (0) 2021.03.02