ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 월별 일별 코로나 확진자 및 검사수 공공데이터 코로나 api, csv 제공
    카테고리 없음 2020. 12. 14. 16:14
    반응형

     

    공공데이터 API 를 이용하기.

    1. 공공데이터 API 를 사용하여 데이터를 받는다

    2. 사용자가 원하는 형태로 가공한다.

    3. csv 저장한다.

    4. 분석한다.

    공공데이터 포털에서 API Key 발급 및 api 사용방법은 아래의 포스팅을 참조해주세요!!

    https://blog.naver.com/szwlemona/222165722421

     

    Python 공공데이터 API 사용하기, 일별 코로나 검사 횟수, 일별 확진자수 알아내기

    1. 공공데이터 포탈에 접속.>>보건복지부_코로나19 감염_현황 api 활용신청을 통해 개인 api 키를 발...

    blog.naver.com

     

    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
    
    ## api에 데이터가 3/2일 정도부터 정상? 이여서 3/2일부터
    ## 조회 당일까지 데이터 받기
    yester = "20200302"
    #오늘 날짜
    now_today = datetime.today() - timedelta(0)
    now_today = now_today.strftime("%Y%m%d") 
    print("오늘과 어제 날짜 확인")
    print(yseter)
    print(now_today)
    my_api_key = '__사용자 api key 입력 '
    
    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)
    
    


    받은 데이터 파싱하기.

    api 문서를 참조하여 영문명의 데이터를

    replace() 함수를 사용하여 한글명으로 바꿨다.

    import xmltodict
    
    result = requests.get(url + queryParams)
    print(result)
    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)
    
    
    


    #날짜가 간혹 뒤바뀐게 있어서 정렬하고
    #인덱스를 새로 생성했다.
    pdata.sort_values(by = '기준일', inplace=True, ascending = False)
    pdata = pdata.reset_index(drop = True)
    
    # 일일 확진자 수와, 검사자 수의 데이터가 누적 값만 있어서
    # 전일과의 차로 값을 일일 값을 구했다.
    
    for row in range(0,289):
        pdata['치료중 환자 수'][row] = int(pdata.loc[row][7]) - int(pdata.loc[row+1][7])
        pdata['격리해제 수'][row] = int(pdata.loc[row][1]) - int(pdata.loc[row+1][1])
    
    # 여러 컬럼중 내가 원하는 컬럼만 선택해서 출력, 저장한다.
    # 사용하지 않을 컬럼인 치료중과 격리해제 컬럼에 저장하고 컬럼명을 바꾸겠다.( 새로운 컬럼을 추가하는 방법도 있음..)
    pdata = pdata[['기준일','격리해제 수','치료중 환자 수','누적 확진률','누적 검사 수','사망자 수']]
    pdata = pdata.rename(columns = {'치료중 환자 수' : '일일 확진자 수','격리해제 수':'일일 검사 수'})
    pdata.to_csv('total_corona_count.csv')
    pdata
    

    일일 확진자 수가 많은 순서대로 정렬하여 출력해봤다.(20개)

    pdata['일일 확진자 수'] = pd.to_numeric(pdata['일일 확진자 수'])
    sortdata = pdata.sort_values(by = '일일 확진자 수', inplace=False, ascending = False)
    
    sortdata[:20]
    


    출력 결과는 아래와 같다.

    ???????

    상위 2개의 데이터는 값이 이상하다............(제외하고 보도록하자... 원본 api에서 가저온 데이터가 이상한것 같다....)

    순서가 뒤바뀌기도 하고 100%신뢰하긴 어려울것 같다.. (이리저리 체크 필요...)

    다시 일자로 출력하면 아래와 같다.(20개만 출력)

    11/30일에는 데이터 수정이 있어

    0이 표시된다.(데이터 중복제거를 통해 지울 수 있다.)

    저장한 데이터는 이와같다.

    ( 원본데이터에 문제도 있고 가공하면서 잘못된 부분이 있으니

    소스코드를 참고하여 가공하여 사용하세요 !!!!!!!)

    첨부파일

    코로나 확진자.csv

    파일 다운로드

    12/14 월요일인 오늘 확진자 수 는 718 명으로

    감소한듯 보이지만 일일 검사 인원과 함께 봐야한다.

    주말(토,일) 은 일일 검사 수 가 평일에 비해 30% 전후 감소하여

    월요일은 상대적으로 확진자 수가 적게 나타난다.

    시각화

    import matplotlib.pyplot as plt
    import numpy as np
    plt.style.use('seaborn-whitegrid')
    plt.figure(figsize=(29,9))
    
    pdata['일일 확진자 수'] = pd.to_numeric(pdata['일일 확진자 수'])
    pdata['일일 검사 수'] = pd.to_numeric(pdata['일일 검사 수'])
    pdata['사망자 수'] = pd.to_numeric(pdata['사망자 수'])
    pdata['기준일'] = pd.to_datetime(pdata['기준일'])
    
    #이상데이터 제거..
    pdata = pdata[pdata['일일 확진자 수']>0]
    pdata = pdata[pdata['일일 확진자 수']<2000]
    # plt.plot(pdata['기준일'],pdata['일일 확진자 수'])
    plt.plot(pdata['기준일'],pdata['일일 검사 수'])
    
    


    일일 검사자 수 를 시각화 한 그래프.

    우상향적 추세를 보인다..

    일일 확진자에 대한 그래프다.

    질문이나 다른 알고싶으신 정보 있으면

    댓글로 남겨주세요 !!

    코로나 물럿거라 !!!

    반응형

    댓글

Designed by Tistory.