지도 표기
- 지도 모양 -> 오버레이로 표시
- 실제 지도(모듈) -> 기능상 오버레이 표시
사전준비
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
df = pd.read_excel('q02_src_oil_data.xlsx', index_col = 0)
print(plt.rcParams['font.family'])
plt.rc('font', family='Malgun Gothic')
가격분포 알아보기
- 셀프 주유소의 가격분포
- 비셀프 주유소의 가격 분포
labels = []
price_data = []
for label, data in df.groupby(['셀프']):
labels.append(label)
price_data.append(data['가격'])
boxplot
fig = plt.figure(figsize=(12,6))
graph = fig.add_subplot(1,1,1)
graph.boxplot(price_data, labels=labels)
sns.boxplot(x='상표', y='가격', hue='셀프', data=df)
서울 전체에서 구별로 비싼 10, 싼곳 10
df.sort_values(['가격'])[:10]
df.sort_values(['가격'], ascending=False)[:-10]
구 데이터 뽑기
gu_data = pd.pivot_table(df, index=['구'], values=['가격'], aggfunc=np.mean)
구별로 가격대 지도에 표시
import folium
import json
from folium import Choropleth
geo_path = open('q02_src_korea_municipalities_geo_simple.json', encoding='utf-8')
geo_data = json.load(geo_path)
seoul_map = folium.Map(zoom_start=11, location=[37.5502, 126.982])
seoul_map.choropleth(data=gu_data, columns=[gu_data.index, '가격'],
geo_data=geo_data,
key_on="feature.id",
fill_color='PuRd'
)
Choropleth(data=gu_data, columns=[gu_data.index, '가격'],
geo_data=geo_data,
key_on="feature.id",
fill_color='PuRd').add_to(seoul_map)
seoul_map
api
import googlemaps
gmap_key = "개인정보"
gmaps = googlemaps.Client(key=gmap_key)
gmaps.geocode('서울 강동구 올림픽로 578')[0]['geometry']['location']
강남구에서 비싼 5곳, 싼 5곳 뽑기
gangnam = df[df['구']=='강남구']
gangnam_top5 = gangnam.sort_values('가격')[:5]
gangnam_low5 = gangnam.sort_values('가격',ascending=False)[:5]
lat = []
lng = []
for index in gangnam_top5.index:
try:
address = gangnam_top5['주소'][index].split('(')[0].strip()
geo = gmaps.geocode(address)[0]['geometry']['location']
lat.append(geo['lat'])
lng.append(geo['lng'])
except:
lat.append(np.nan)
lng.append(np.nan)
gangnam_top5['lat'] = lat
gangnam_top5['lng'] = lng
하위 5개 업체도 좌표 찾기
lat = []
lng = []
for index in gangnam_low5.index:
try:
address = gangnam_low5['주소'][index].split('(')[0].strip()
geo = gmaps.geocode(address)[0]['geometry']['location']
lat.append(geo['lat'])
lng.append(geo['lng'])
except:
lat.append(np.nan)
lng.append(np.nan)
gangnam_low5['lat'] = lat
gangnam_low5['lng'] = lng
for index in gangnam_top5.index:
lat = gangnam_top5.loc[index]['lat']
lng = gangnam_top5.loc[index]['lng']
if lat and lng:
folium.CircleMarker([lat,lng],radius=15, color='#CD3818',
fill_color='#CD3181', fill=True).add_to(gangnam_map)
지도 그리기
gangnam_map = folium.Map(zoom_start=11.5, location=[37.4941559,127.0395211])
for index in gangnam_top5.index:
lat = gangnam_top5.loc[index]['lat']
lng = gangnam_top5.loc[index]['lng']
if lat and lng:
folium.CircleMarker([lat,lng],radius=15, color='#CD3818',
fill_color='#CD3181', fill=True).add_to(gangnam_map)
for index in gangnam_low5.index:
lat = gangnam_low5.loc[index]['lat']
lng = gangnam_low5.loc[index]['lng']
if lat and lng:
folium.CircleMarker([lat,lng],radius=15, color='#3186cc',
fill_color='#3186cc', fill=True).add_to(gangnam_map)
gangnam_map
tqdm
!pip install tqdm
서울시 전체에서 상위 10, 하위 10개 뽑아서 지도에 표시
top10 = df.sort_values('가격').head(10)
low10 = df.sort_values(by='가격', ascending=False).iloc[:10]
from tqdm.notebook import tqdm
lat = []
lng = []
for index in tqdm(top10.index):
try:
address = top10['주소'][index].split('(')[0].strip()
geo = gmaps.geocode(address)[0]['geometry']['location']
lat.append(geo['lat'])
lng.append(geo['lng'])
except:
lat.append(np.nan)
lng.append(np.nan)
top10['lat'] = lat
top10['lng'] = lng
top10
lat = []
lng = []
for index in tqdm(low10.index):
try:
address = low10['주소'][index].split('(')[0].strip()
geo = gmaps.geocode(address)[0]['geometry']['location']
lat.append(geo['lat'])
lng.append(geo['lng'])
except:
lat.append(np.nan)
lng.append(np.nan)
low10['lat'] = lat
low10['lng'] = lng
low10
지도 그리기
seoul_map = folium.Map(zoom_start=11, location=[37.5502, 126.982])
for index in top10.index:
lat = top10.loc[index]['lat']
lng = top10.loc[index]['lng']
if lat and lng:
folium.CircleMarker([lat,lng],radius=15, color='#CD3818',
fill_color='#CD3181', fill=True).add_to(seoul_map)
for index in low10.index:
lat = low10.loc[index]['lat']
lng = low10.loc[index]['lng']
if lat and lng:
folium.CircleMarker([lat,lng],radius=15, color='#3186cc',
fill_color='#3186cc', fill=True).add_to(seoul_map)
seoul_map