ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python 공공데이터 API 사용하기, 일별 코로나 검사 횟수, 일별 확진자수 알아내기
    카테고리 없음 2020. 12. 7. 10:51
    반응형

    1. 공공데이터 포탈에 접속.

    >>보건복지부_코로나19 감염_현황 api 활용신청을 통해 개인 api 키를 발급 받는다.

     

    www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15043376

     

     

    공공데이터 포털

    국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

    www.data.go.kr

    2. 전체 소스 코드

    from urllib.request import urlopen
    from urllib.parse import urlencode, unquote, quote_plus
    import urllib
    import requests
    import json
    import pandas as pd
    from datetime import datetime,timedelta
    import xmltodict # 결과가 xml 형식으로 반환된다. 이것을 dict 로 바꿔주는 라이브러리다
    
    # 어제 날짜와 오늘날짜를 구하기 위해서  datetime과 timedelta를 사용
    yester = datetime.today() - timedelta(1)
    yseter =  yester.strftime("%Y%m%d")
    now_today = datetime.today().strftime("%Y%m%d")
    
    my_api_key = '발급받은 개인 API키 입력!!!'
    
    # 서비스 url 주소
    url = 'http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19InfStateJson'
    
    # 서비스에 필요한 파라미터 모음
    queryParams = '?' + \
    'ServiceKey=' + '{}'.format(my_api_key) + \
    '&pageNo='+ '1' + \
    '&numOfRows='+ '999' + \
    '&startCreateDt={}&endCreateDt={}'.format(yseter,now_today)
    
    #서비스url에 필요한 파라미터들을 붙여서 응답결과를 얻음.
    result = requests.get(url + queryParams)
    
    # 응답결과 파싱하기. ( 사용자가 원하는 형태로 변경)
    # 응답 key 값이 영문화 되어 식별이 어려워 openAPI 문서를 참고하여
    # replayce 를 통해 결과를 한글화 했다.
    
    result = result.content 
    jsonString = json.dumps(xmltodict.parse(result), indent = 4)
    jsonString = jsonString.replace('resultCode', '결과코드').replace('resultMsg', '결과메세지').replace('numOfRows', '한 페이지 결과 수').replace('pageNo', '페이지 수').replace('totalCount', '전체 결과 수').replace('seq', '게시글번호(감염현황 고유값)').replace('stateDt', '기준일').replace('stateTime', '기준시간').replace('decideCnt', '확진자 수').replace('clearCnt', '격리해제 수').replace('examCnt', '검사진행 수').replace('deathCnt', '사망자 수').replace('careCnt', '치료중 환자 수').replace('resutlNegCnt', '결과 음성 수').replace('accExamCnt', '누적 검사 수').replace('accExamCompCnt', '누적 검사 완료 수').replace('accDefRate', '누적 환진률').replace('createDt', '등록일시분초').replace('updateDt', '수정일시분초')
    
    js = json.loads(jsonString)
    # 파싱한 전체 결과 보기.
    print(js)
    js_check_count = js["response"]['body']['items']['item'][0]['검사진행 수']
    js = js["response"]['body']['items']['item']
    pdata = pd.DataFrame(js)
    
    # 원하는 정보만 파싱한 결과
    # 누적 검사자 수와 누적 확진자수를 제공하기 때문에
    # 전일과의 차이로 일일 확진자, 검사자 수를 구했다.
    
    print('전일 검사 확진자수 : ',int(pdata.loc[0][7]) - int(pdata.loc[1][7]))
    print('전일 코로나 검사 수',int(pdata.loc[0][8]))
    

    3. 주의 사항.

    주의 !
    api가 불러오는 DB? 서버? 의 정보가 오전 10시경 업데이트 된다.

    보건복지부_코로나19 감염_현황 API 에서는 일별 확진자와 일별 검사수가 나오지 않고 누적인원수만 나와서
    하루 전 데이터와 비교해서 차이를 통해 검사 수 와 확진자 수 를 구했다.

    (다른 api에는 있을수도...?? 저는 못찾음....)

     

    4. 설치 및 수정.

     실행이 되지 않을경우.

    1. 라이브러리 설치 확인.

    pip install xmltodict

    pip install pandas

    의 설치를 확인한다.

     

    2. api key 확인.

    my_api_key = '발급받은 개인 API키 입력!!!'
    여기에 밑줄 내용을 제거하고 꼭 개인키를 입력해주자!!

     

    3. 중간 결과를 출력해서 확인해본다.

    result = requests.get(url + queryParams)

    print(result)
    출력하여 response 결과 코드를 확인한다.(정상 response 코드는 200)

     

    js = json.loads(jsonString)

    print(js)

    코드를 통해 결과코드, 결과 메세지, 데이터 형태, 데이터 값을 확인한다.

     

    <Response [200]>
    {'response':
    	{'header': {'결과코드': '00', '결과메세지': 'NORMAL SERVICE.'},
        'body': 
        	{'items':
            	{'item':
    				 [{'누적 환진률': '1.2147899990',
                     '누적 검사 수': '3209376',
                     '누적 검사 완료 수': '3141366',
                     '치료중 환자 수': '8311',
                     '격리해제 수': '29301',
                     '등록일시분초': '2020-12-07 09:30:10.758',
                     '사망자 수': '549',
                     '확진자 수': '38161',
                     '검사진행 수': '68010',
                     '결과 음성 수': '3103205',
                     '게시글번호(감염현황 고유값)': '345',
                     '기준일': '20201207',
                     '기준시간': '00:00',
                     '수정일시분초': 'null'}
                     
                     , {'누적 환진률': '1.2006455716',
                     '누적 검사 수': '3194867',
                     '누적 검사 완료 수': '3127151'
                     , '치료중 환자 수': '7873',
                     '격리해제 수': '29128',
                     '등록일시분초': '2020-12-06 09:48:54.801',
                     '사망자 수': '545',
                     '확진자 수': '37546',
                     '검사진행 수': '67716',
                     '결과 음성 수': '3089605',
                     '게시글번호(감염현황 고유값)': '344',
                     '기준일': '20201206',
                     '기준시간': '00:00',
                     '수정일시분초': 'null'}]},
                     '한 페이지 결과 수': '999', '페이지 수': '1', '전체 결과 수': '2'}}}

     

    코랩으로 실행하기 !

    bit.ly/3ovv3DC

     

     

    반응형

    댓글

Designed by Tistory.