정구리의 우주정복
Python Project 02. 공적마스크 api 를 사용해서 내 주변에서 판매하는 곳과 재고를 지도로 시각화하기 (4) 제작완료 (소스코드 및 후기) 본문
Python Project 02. 공적마스크 api 를 사용해서 내 주변에서 판매하는 곳과 재고를 지도로 시각화하기 (4) 제작완료 (소스코드 및 후기)
Jungry_ 2020. 4. 23. 00:002020.4.20 - 2020.4.22 프로젝트02 공적마스크 api를 사용해서 내 주변에서 판매하는 곳과 제고를 지도로 시각화하기 완료
주제선정이유 : 공공데이터 탐방하다가 있길래 만들어봤다
기대효과 : Json 파일도 처음 다뤄본거고 pandas 나 foilum 등 다 처음해보는거기 때문에 경험 차원의 ?? (미리 pandas 에 대한 약간의 지식은 갖고있었음)
전체 소스는 3개의 함수와 지도를 만드는 부분으로 구성되어있다
def getMaskStore() : 마스크를 판매하는 판매처의 정보가 담긴 함수 (재고정보 x)
def getMaskStat() : 마스크의 재고 상황이 담긴 함수 (판매처정보 x)
def getCode(판매처정보 , 재고정보) : 판매처 정보와 재고정보를 code 값을 통해 하나로 합쳐주는 함수
전체 소스
import requests
import json
import pandas as pd
import folium
from folium.plugins import MarkerCluster
import numpy as np
#데이터들을 csv 형태로 만들어주기
def getMaskStore():
#모든 자료들을 저장해주기 위해
url = 'https://8oi9s0nnth.apigw.ntruss.com/corona19-masks/v1/stores/json?page=1'
req = requests.get(url)
total_page = req.json()['totalPages']
addr = []
code = []
latitude = []
longitude = []
name = []
types = []
for i in range(1,total_page+1): #totalpage 가 54이기 때문에 +1 을 해줘야한다
url = 'https://8oi9s0nnth.apigw.ntruss.com/corona19-masks/v1/stores/json?page='+str(i)#각 페이지들 불러오기
req = requests.get(url)
storeInfo = req.json()['storeInfos']
for j in storeInfo:
addr.append(j['addr'])
code.append(j['code'])
latitude.append(j['lat'])
longitude.append(j['lng'])
name.append(j['name'])
types.append(j['type'])
df_maskStoreInfo=pd.DataFrame({'addr':addr,
"code":code,'lat':latitude,'lng':longitude,
'name':name,'type':types})
return df_maskStoreInfo
mask_store_info = getMaskStore()
def getMaskStat():
url = 'https://8oi9s0nnth.apigw.ntruss.com/corona19-masks/v1/sales/json?page=1'
req = requests.get(url)
total_page = req.json()['totalPages']
stat={} #딕셔너리 생성
for i in range(1,total_page+1):
url = 'https://8oi9s0nnth.apigw.ntruss.com/corona19-masks/v1/sales/json?page='+str(i)
req = requests.get(url)
sales = req.json()['sales']
for j in sales:
try:
stock_at = j['stock_at']
except:
stock_at = 'none'
if stock_at != 'Invalid date':
code=j['code']
created_at=j['created_at']
try:
remain_stat=j['remain_stat']
except:
remain_stat='none'
stat[code] = {'created_at':created_at,
'remain_stat':remain_stat,
'stock_at': stock_at}
return stat
mask_stat_info = getMaskStat()
drop_mask_store_info = mask_store_info.dropna(axis=0)
def getCode(drop_mask_store_info,mask_stat_info):
#stat과 store 코드의 개수가 다른거 기억하기
code = drop_mask_store_info['code']
created_at = []
remain_stat = []
stock_at = []
for i in range(len(code)):
try: #코드가 있는 경우
created_at.append(mask_stat_info[code[i]]['created_at'])
remain_stat.append(mask_stat_info[code[i]]['remain_stat'])
stock_at.append(mask_stat_info[code[i]]['stock_at'])
except: #코드가 없는 경우
created_at.append('none')
remain_stat.append('none')
stock_at.append('none')
#이제 합쳐줘야함 (데이터[칼럼명]=들어갈거)
drop_mask_store_info['created_at']=created_at
drop_mask_store_info['remain_stat']=remain_stat
drop_mask_store_info['stock_at']=stock_at
return drop_mask_store_info
get_mask_info = getCode(drop_mask_store_info,mask_stat_info)
#get_mask_info.to_csv('mask_info.csv',index=False)
seoul = [37.541,126.986]
m=folium.Map(location=seoul,zoom_start=10)
#이름 , 위도, 경도를 가져와주기
get_store_info = get_mask_info.loc[:,['name','lat','lng',
'created_at','remain_stat','stock_at']]
#.loc[:,['','']] 이름으로 열 가져오기
name=list(get_store_info['name'])
lat =list(get_store_info['lat'])
lng =list(get_store_info['lng'])
remain_stat = list(get_store_info['remain_stat'])
stock_at = list(get_store_info['stock_at'])
colorList ={'plenty':'green',
'some':'orange',
'few':'red',
'empty':'gray',
'break':'black',
'none' : 'blue'
}
amount={'plenty':'100개이상',
'some':'30개이상 100개 미만',
'few':'2개이상 30개미만',
'empty':'다 팔려버렸다',
'break':'판매중지',
'none' : '정보없음'}
#지도에 표시해주기 위해 MarkerCluster 을 사용해준다
#location=[위도경도],popup=이름 , icon
marker_cluster = MarkerCluster().add_to(m)
for i in range(len(name)):
folium.Marker(
location = [lat[i],lng[i]],
popup= '약국이름 : '+name[i]+'\n입고시간 : '+stock_at[i]+'\n재고상태 : '+amount[remain_stat[i]],
icon=folium.Icon(color=colorList[remain_stat[i]],icon='ok')
).add_to(marker_cluster)
m.save('map.html')
결과물
html 형태로 결과물을 만들고 전국에 지정된 공적 마스크 판매처가 나오고 누르면 마스크의 재고에 대한 정보가 나오게 되어있다
후기 )
여러가지 라이브러리를 써본것도 좋았고 데이터를 내가 원하는 형태로 시각화를 할 수 있어서 좋았다.
그리고 딕셔너리나 리스트를 내가 원하는 곳에 사용을 할 수 있는 능력이 약간 상승한것같다
더 나은 방법을 찾기위해 많이 고민을 했고 내 머릿속에서 낼 수 있는 가장 괜찮은 방법들을 찾는 경험을 했다
실제 요즘 이슈가 되고있는 코로나와 관련된 프로젝트를 하고나니까 괜히 내가 뭐라도 된 기분이다
html 을 켜면 실시간으로 업데이트 되는 결과물을 만들고 싶었는데 ummmm 다음에 알아보도록 하ㅈ ㅏ ^__^
라이브러리 최고 ! 공공데이터 최고 ! 파이썬 최고 !
검색을 하는 기술을 좀 더 키워야겠다 , 영어공부도 좀 해야할듯 . .
뿌듯하다