지도 표기

오상윤·2023년 2월 24일
0

EDA

목록 보기
15/16

지도 표기

  1. 지도 모양 -> 오버레이로 표시
  2. 실제 지도(모듈) -> 기능상 오버레이 표시

사전준비

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

# 싼곳 10
df.sort_values(['가격'])[:10]
# 비싼곳 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) # json 파일 불러오기
# 지도 (서울 중심의 위치)
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])
# gangnam_top5
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_low5
# color : #3186cc
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
top10 = df.sort_values('가격').head(10)
# low10
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])
# top10
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)
   
# low10
# color : #3186cc
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
profile
가보자가보자~

0개의 댓글