정말 재밌는데, 어렵다..?!!
https://python-visualization.github.io/folium/latest/reference.html
!pip install folium
import folium
import pandas as pd
import json
#구글맵에서 경도/위도 확인 후 입력
#zoom_start : 0 ~ 18
m = folium.Map(location=[37.545473, 127.053151], zoom_start=14)
m
m.save('./folium.html')
m = folium.Map(
location=[37.545473, 127.053151],
zoom_start=14,
tiles = 'OpenStreetMap')
m
m = folium.Map(
location=[37.544564958079896, 127.05582307754338],
zoom_start=14,
tiles = 'OpenStreetMap')
### folium.Marker
# '뚝섬역' 마커를 생성(뚝섬역 위도, 경도).위에 있는 m에게 전달
folium.Marker((37.54712311308356, 127.04721916917774)).add_to(m)
### popup()
# '성수역' 클릭하면 팝업이 나오게 설정
folium.Marker(
location=[37.544564958079896, 127.05582307754338],
popup = '<b>Subway<b>').add_to(m)
### tooltip()
# '성수역' 가까이 마우스를 두면 설명이 뜸
folium.Marker(
location=[37.544564958079896, 127.05582307754338],
popup = '<b>Subway<b>',
tooltip='<i>성수역</i>').add_to(m)
### html URL 팝업
folium.Marker((37.54558642069953,127.05729705810472),
popup = "<a href='https://zero-base.co.kr/' target=_'blink'>데이터사이언스</a>",
tooltip = 'zerobase').add_to(m)
m
m = folium.Map(
location=[37.544564958079896, 127.05582307754338],
zoom_start=14,
tiles = 'OpenStreetMap')
### folium.Marker
### icon basic
# '뚝섬역' 마커를 생성(뚝섬역 위도, 경도).위에 있는 m에게 전달
folium.Marker(
(37.54712311308356, 127.04721916917774),
icon=folium.map.Icon(color='black', icon='info-sign')
).add_to(m)
### popup()
### icon icon_color
# '성수역' 클릭하면 팝업이 나오게 설정
folium.Marker(
location=[37.544564958079896, 127.05582307754338],
popup = '<b>Subway<b>',
icon=folium.map.Icon(
color='red',
icon_color='yellow',
icon='cloud')
).add_to(m)
# ### tooltip()
# # '성수역' 가까이 마우스를 두면 설명이 뜸
# folium.Marker(
# location=[37.544564958079896, 127.05582307754338],
# popup = '<b>Subway<b>',
# tooltip='<i>성수역</i>').add_to(m)
### tooltip()
### html URL 팝업
folium.Marker((37.54558642069953,127.05729705810472),
popup = "<a href='https://zero-base.co.kr/' target=_'blink'>데이터사이언스</a>",
tooltip = 'zerobase').add_to(m)
### icon custom
folium.Marker(
location = [37.54035903907497,127.06913328776446], # 건대입구
popup='건대입구역',
tooltip='Icon custom',
icon=folium.map.Icon(
color='purple',
icon_color='white',
icon='android', #icon='bookmark'
angle=50,
prefix='fa'
)
).add_to(m)
m
지도위에 마우스로 클릭했을 때 마커를 생성해준다
m = folium.Map(
location=[37.544564958079896, 127.05582307754338], #성수역
zoom_start=14,
tiles = 'OpenStreetMap'
)
m.add_child(folium.ClickForMarker(popup='ClickForMarker'))
# m.add_child(folium.ClickForMarker()) : 위도/경도가 보임....짱신기해...
지도를 마우스로 클릭했을 때 위도 경도 정보를 반환해줌
m = folium.Map(
location=[37.544564958079896, 127.05582307754338], #성수역
zoom_start=14,
tiles = 'OpenStreetMap'
)
m.add_child(folium.LatLngPopup())
지도에서 원형으로 표시해주는 기능
m = folium.Map(
location=[37.544564958079896, 127.05582307754338], #성수역
zoom_start=14,
tiles = 'OpenStreetMap'
)
#folium.Circle()
folium.Circle(
location=[37.555243442409406, 127.04370422643919], #한양대학교역
radius=100,
fill=True, #원형 안에 색상을 채울 것인지 여부 결정
color='red', # color picker 검색
fill_color='red',
popup='Circle popup',
tooltip='Circle'
).add_to(m) #m으로 반환해주는 코드
#folium.CircleMarker()
folium.CircleMarker(
location=[37.54347089498245, 127.04439204503049], #한양대학교역
radius=30,
fill=True, #원형 안에 색상을 채울 것인지 여부 결정
color='blue', # color picker 검색
fill_color='blue',
popup='Circle popup',
tooltip='Circle'
).add_to(m) #m으로 반환해주는 코드
m
import json
state_data = pd.read_csv('../data/02. US_Unemployment_Oct2012.csv')
state_data.tail(2)
m = folium.Map([43,-102], zoom_start=3)
folium.Choropleth(
geo_data='../data/02. us-states.json', # 경계선 좌표값이 담긴 데이터가 있음
data=state_data,
columns=['State', 'Unemployment'],
key_on = 'feature.id',
fill_color='BuPu',
fill_opacity=1, # 잘 보이기 위해 1, 실업률이 높으면 진하게.
line_opacity=1,
legend_name='Unemployment rate(%)'
).add_to(m)
m
import json
import folium
import pandas as pd
crime_anal_norm = pd.read_csv(
'../data/02. crime_in_Seoul_final_zb.csv', index_col=0, encoding='utf-8'
)
geo_path = '../data/02. skorea_municipalities_geo_simple.json'
geo_str = json.load(open(geo_path, encoding='utf-8'))
crime_anal_norm.tail(2)
서울시가 중앙에 위치하도록 시각화 하는 코드
my_map = folium.Map(
location=[37.5502, 126.982],
zoom_start=11,
tiles = 'cartodb positron'
)
#살인 발생 건수 시각화
folium.Choropleth(
geo_data= geo_str, #우리나라 경계선 좌표값이 담긴 데이터
data = crime_anal_norm['살인'],
columns=[crime_anal_norm.index, crime_anal_norm['살인']], # 2가지 컬럼 지정 (지역, 살인수)
key_on='feature.id',
fill_color='PuRd',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='정규화된 살인 발생 건수'
).add_to(my_map)
my_map
서울시가 중앙에 위치하도록 시각화 하는 코드
my_map = folium.Map(
location=[37.5502, 126.982],
zoom_start=11,
tiles = 'cartodb positron'
)
#발생 건수 시각화
folium.Choropleth(
geo_data= geo_str, #우리나라 경계선 좌표값이 담긴 데이터
data = crime_anal_norm['범죄'],
columns=[crime_anal_norm.index, crime_anal_norm['범죄']], # 2가지 컬럼 지정 (지역, 범죄수)
key_on='feature.id',
fill_color='PuRd',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='정규화된 살인 발생 건수'
).add_to(my_map)
my_map
인구 대비 범죄율
tmp_criminal = crime_anal_norm['범죄'] / crime_anal_norm['인구수']
# 서울시가 중앙에 위치하도록 시각화 하는 코드
my_map = folium.Map(
location=[37.5502, 126.982],
zoom_start=11,
tiles = 'cartodb positron'
)
#발생 건수 시각화
folium.Choropleth(
geo_data= geo_str, #우리나라 경계선 좌표값이 담긴 데이터
data = tmp_criminal,
columns=[crime_anal_norm.index, tmp_criminal],
key_on='feature.id',
fill_color='PuRd',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='인구대비 범죄 발생 건수'
).add_to(my_map)
my_map
crime_anal_station = pd.read_csv('../data/02. crime_in_Seoul_raw_zb.csv', encoding='utf-8')
crime_anal_station.tail(2)
col = ['강간검거','강간발생', '강도검거', '강도발생', '살인검거']
# 정규화
tmp = crime_anal_station[col] / crime_anal_station[col].max()
# numpy - axis=1 : 가로 / pandas - axis=1 : 세로
crime_anal_station['검거'] = np.mean(tmp, axis=1)
crime_anal_station.tail()
my_map = folium.Map(
location=[37.5502, 126.982],
zoom_start=11,
)
#iterrows() - 값 2개 반환(idx, rows)
for idx, rows in crime_anal_station.iterrows():
folium.Marker(
location=[rows.lat, rows.lng], # 위치값 지정
).add_to(my_map)
my_map
my_map = folium.Map(
location=[37.5502, 126.982],
zoom_start=11,
)
folium.Choropleth(
geo_data= geo_str, #우리나라 경계선 좌표값이 담긴 데이터
data = crime_anal_norm['범죄'],
columns=[crime_anal_norm.index, crime_anal_norm['범죄']],
key_on='feature.id',
fill_color='PuRd',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='인구대비 범죄 발생 건수'
).add_to(my_map)
for idx, rows in crime_anal_station.iterrows():
folium.CircleMarker(
location=[rows.lat, rows.lng],
radius=rows.검거 * 50, # 검거 컬럼에 50을 곱해줌.
popup = rows['구분'] + ':' + '%.2f' % rows['검거'], #각 구의 이름:검거 데이터값(소수점 2자리까지)
color = '#3186cc',
fill =True, # 원형 채우기
fill_color='#3186cc'
).add_to(my_map)
my_map
추가 검증
crime_loc_raw = pd.read_csv('../data/02. crime_in_Seoul_location.csv',thousands=',' , encoding='euc-kr')
crime_loc_raw.tail(2)
crime_loc_raw['장소'].unique()
crime_loc= crime_loc_raw.pivot_table(
values=crime_loc_raw, # pivot_table 기본요소 1. 데이터 넣기
index='장소', # pivot_table 기본요소 2. 인덱스
columns='범죄명', # pivot_table 기본요소 3. 컬럼
aggfunc=[np.sum] # pivot_table 기본요소 4. 2/3에 담기는 값들
)
crime_loc.head()
crime_loc.columns = crime_loc.columns.droplevel([0,1])
crime_loc.head()
crime_loc_norm = crime_loc / crime_loc.max()
crime_loc_norm.head()
crime_loc_norm['종합'] = np.mean(crime_loc_norm, axis=1)
crime_loc_norm.head()
crime_loc_norm_sort = crime_loc_norm.sort_values(by = '종합', ascending= False)
def drawGraph():
plt.figure(figsize=(10, 10))
sns.heatmap(
crime_loc_norm_sort, # 데이터
annot = True, # 숫자 표현 옵션
fmt = 'f', # 실수형
linewidth = 0.5,
cmap = 'RdPu' # 컬러
)
plt.title('범죄 발생 장소')
plt.show()
drawGraph()
crime_anal_norm.to_csv('../data/02. crime_in_Seoul_final.csv', sep=',', encoding='utf-8')