정구리의 우주정복

Python Project 02. 공적마스크 api 를 사용해서 내 주변에서 판매하는 곳과 재고를 지도로 시각화하기 (4) 제작완료 (소스코드 및 후기) 본문

PYTHON/PROJECT

Python Project 02. 공적마스크 api 를 사용해서 내 주변에서 판매하는 곳과 재고를 지도로 시각화하기 (4) 제작완료 (소스코드 및 후기)

Jungry_ 2020. 4. 23. 00:00
반응형

2020.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 다음에 알아보도록 하ㅈ ㅏ ^__^

라이브러리 최고 ! 공공데이터 최고 ! 파이썬 최고 !

검색을 하는 기술을 좀 더 키워야겠다 , 영어공부도 좀 해야할듯 . . 

뿌듯하다 

 

반응형
Comments