[플레이데이터 빅데이터 부트캠프]Python Open API 만들기(1)

Open API는 데이터를 공유하기 위한 목적으로 제공되는 서비스이다.

대부분 API 사용 신청을 해야되고, 키값을 받아와서 요청할 때 키값을 설정해야 사용 가능하다.

회사마다 다르기 때문에 API 사용 설명서를 참조하여서 Open API에 접속할 수 있다.

공공데이터

코로나 시/도 발생현황

import requests

url = 'http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19SidoInfStateJson'
params ={'serviceKey' : 'rnF4yyGFp4RmLHiQ/PXaEmoqBuiQ0mv72GW7vb0hxrgRZqSk/zHAJN0QO5hP79QMhoXZTOwY8fh2cl7BSynbxg==', 
         'pageNo' : '1', 
         'numOfRows' : '10', 
         'startCreateDt' : '20200410', 
         'endCreateDt' : '20220725' }

response = requests.get(url, params=params)
print(response.content)

신청 Open API 키를 Python3 샘플 코드에 입력한다.

보통 API에서 나오는 정보들은 XML 코드로 이루어져 있다.

데이터 파싱(Data Parsing)

데이터 파싱이란? 데이터를 조립해 원하는 데이터를 빼내는 프르그램을 하는 것을 말합니다.

데이터 분석을 위해서, XML 코드를 딕셔너리 형태로 우선 만듭니다.

xmltodict.parse(response.text)
result = xmltodict.parse(response.text)
result.keys()
result['response'].keys()
result['response']['body']['items']['item'][-1]

for row in result['response']['body']['items']['item']:
    print('날짜: ', row['createDt'])
    print('지역: ', row['gubun'])
    print('사망자수: ', row['deathCnt'])
    print('확진자수: ', row['defCnt'])

파싱한 데이터들을 데이터프레임으로 만들어 볼 수 있다.

import requests
import xmltodict
import pandas as pd
# 2020년 4월 10일부터 어제 날짜까지 데이터를 모두 가져와주세요 
url = 'http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19SidoInfStateJson'
params ={'serviceKey' : 'rnF4yyGFp4RmLHiQ/PXaEmoqBuiQ0mv72GW7vb0hxrgRZqSk/zHAJN0QO5hP79QMhoXZTOwY8fh2cl7BSynbxg==', 
         'pageNo' : '1', 
         'numOfRows' : '10', 
         'startCreateDt' : '20200410', 
         'endCreateDt' : '20220725' }

response = requests.get(url, params=params)
# print(response.text)
cov = xmltodict.parse(response.text)
cov_df = pd.DataFrame(cov['response']['body']['items']['item'])
covid = cov_df[['createDt', 'defCnt', 'deathCnt', 'gubun']]
covid.columns=['날짜', '확진자수', '사망자수', '지역']
covid

데이터를 불러온는 데도, Boolean index를 적용 할 수 있다.

covid1=covid1[covid1.지역!='검역']

이렇게 하면 지역에 '검역'이라고 떠 있지 않은 지역만 데이터로 불러올 수 있다.

데이터 저장

피클 타입 저장

바이너리 타입으로 저장하면 용량을 줄여준다.

import pickle

with open('covid.pk', 'wb') as f:
    pickle.dump(covid1, f)
with open('covid.pk', 'rb') as f:
    covid_pk = pickle.load(f)

아주 큰 파일을 효율적으로 다룰 때 좋다. 그대로 파일을 쓸 수 있다.

바이너리 타입으로 읽고 쓸 때, 'wb', 'rb' 형태로 쓴다.

제이슨 파일 저장

import json
covid_dict = covid1.to_dict() #문자열 형태로 변환해준다.

with open('covid.json', 'w', encoding='utf-8') as f:
    json.dump(covid_dict, f)
    
with open('covid.json', 'r', encoding='utf-8') as f:
    covid_json = json.load(f)
    
covid_json.keys()