오늘은 공공데이터포털에서 API 활용신청을 했던 데이터셋을 파이썬에서 불러와서 데이터 프레임을 만들어 보는 작업까지 진행한 내용에 대해 정리해보려고 한다. 정리하면서 느낀건 API를 처음 사용해보는 나 같은 사람이 이용할 때 어떻게 해야하는지 자세한 가이드가 없어 구글링을 해가면서 알아야 한다는 점이 불편하다는 것이다. 사용법이 잘 정리돼 있었으면 좋겠다.
순서
1. 공공데이터포털 - 마이페이지에서 API 호출 준비하기
2. 파이썬에서 API를 호출하여 데이터를 불러오기
1. 공공데이터포털 - 마이페이지에서 API 호출 준비하기

공공데이터포털에서 API 활용신청을 하고 난 뒤 마이페이지에서 Open API를 들어가면 내가 신청한 데이터 목록을 확인할 수 있다. 이 중 보건복지부_전국 지역보건의료기관 현황을 불러와서 내용을 확인해보려고 한다.

데이터 목록 중 내가 사용하고자 하는 데이터 항목을 누르면 개발계정 상세보기 페이지가 뜬다. 여기서 중요한 부분은 빨간 박스로 표시된 일반 인증키 부분인데, Encoding, Decoding 으로 나누어져 있는 것을 볼 수 있다. 이는 페이지에도 나와있듯이 API 환경 또는 호출 조건에 따라 적용되는 방식이 다를 수 있어 두 인증키를 뒤에 API를 호출할 때 사용해보면서 구동되는 것을 쓰면 된다. 인증키는 자신을 제외한 누군가에게 노출할 경우 보안 위험이 있어 노출하면 안된다.

그 다음 페이지를 밑으로 조금 내리면 활용신청 상세기능정보가 있는데, 여기에 파이썬에서 API를 호출하기 위한 URL 정보를 확인할 수 있다. 먼저 맨 위 빨간 상자 안에 Base URL 이 있는데 이것이 기본적인 URL의 시작을 나타내고 그 밑에 Schemes는 프로토콜을 HTTPS 또는 HTTP 둘 중 어떤 것으로 할지 선택하는 것인데, 직접 URL을 작성할 줄 알면 선택하지 않아도 된다. 그 다음 API 목록 밑에 빨간 상자 부분을 누르면 아래와 같은 화면이 나온다.

맨 위에 GET에 적혀있는 부분은 내가 신청한 데이터에 접근할 수 있는 URL의 일부분이라고 보면 된다.
그 다음 Parameters는 API를 사용해서 URL에 데이터를 요청할 때 사용할 수 있는 파라미터 항목들을 보여준다. 아마 데이터셋마다 API 파라미터가 다르기도 한 것 같고 박스 오른쪽에 OpenAPI 실행 준비를 눌러 값을 설정하고 그 다음 전환되는 화면에서 OpenAPI 호출을 누르면 Reponses 쪽에 Curl 명렁어와 Request URL이 나온다. 나는 Curl 명령어를 사용할 환경이 없기 때문에 Request URL을 사용하는데, 이것을 잘 보면 위에서 설명한 Base URL과, GET에 있는 URL의 일부분, 뒤에 page, perPage와 같은 Parameter 조합으로 이루어진 것을 볼 수 있다.
2. 파이썬에서 API를 호출하여 데이터를 불러오기
import requests
import pandas as pd
먼저 URL 에 요청을 보내는 모듈인 requests와 데이터를 다루는데 사용하는 모듈인 pandas를 불러온다.
api_key='~~' # Encoding 인증 키
api_key='~~' # Decoding 인증 키
page='1'
perPage='5000'
url='https://api.odcloud.kr/api/3072692/v1/uddi:9d420e87-8e70-4fb0-a54a-be1244249b2e_201909271427?page='+page+'&perPage='+perPage+'&serviceKey='+api_key
그 다음은 API 인증키와 그 외 URL 요소들을 조합해서 요청하고자 하는 URL을 만들면 된다. 이번엔 인증키가 둘 다 잘 됐기 때문에 아무거나 하나 선택해서 사용했다. page랑 perPage는 API 호출 시 설정했던 파라미터를 의미하는데, 여기서 값을 바꿔서 URL을 만들면 그대로 적용된다. page는 데이터가 인터넷 게시판에 있는 글들이라고 가정할 때 몇 페이지에서 가져올지를 의미하고, perPage는 해당 페이지에서 몇 개의 글을 가져올 것인지를 의미한다.
page=1, perPage=5000 이라는 것은 게시판 1페이지에서 5000개 글을 가져온다는 뜻이다. page가 몇 페이지까지 있는지, 한 페이지에 몇 개의 데이터가 있는지는 설정을 다르게 해서 데이터를 불러오면서 확인해보면 되는데, 이것도 번거로운 것 같다. 일단 이 데이터셋의 경우 포털 데이터 상세설명에 약 3500여개 행으로 이루어져 있다고 나와있다.
response=requests.get(url)
response

그 다음은 requests 모듈의 get 메서드를 사용해서 url 에 요청을 보내 데이터를 응답을 받는 것이다. response에는 응답 내용이 들어있고 제대로 호출이 되면 Response 200 이 뜨면서 안에 데이터가 담기게 된다. 200이 아닌 다른 에러가 발생하는 경우 포털 API 호출 페이지로 다시 들어가면 각 에러가 어떤 상황에서 발생하는지 설명이 나와있다.
data=response.json()
data

response.json()을 하면 response 변수에 담겨있는 것들을 json format으로 바꿔서 반환한다. 이를 data 변수에 할당하고 안을 확인해보면 currentCount, data, matchCount, page, perPage, totalCount 등 여러가지 항목이 있는 것을 볼 수 있다.
df=pd.DataFrame(data)
df

json 포맷의 data를 pandas를 사용해서 데이터프레임으로 바꾼 뒤 호출하면 위와 같이 3564개의 행과 6개의 열로 이루어진 데이터 프레임을 확인할 수 있다. 여기서 내가 필요한 것은 두번째 열인 data에 해당하는 부분들이다. 이를 다시 추출해서 다른 데이터 프레임으로 만들어야 한다.
res=pd.DataFrame()
for ix, dict in enumerate(df.data):
df_tmp=pd.DataFrame.from_dict(dict,orient="index").T
res=pd.concat([res, df_tmp])
res

먼저 res라는 빈 데이터 프레임을 만들고 for문을 이용해서 df 데이터 프레임의 data 열 정보들을 하나씩 처리한다.
pandas 데이터프레임 메서드 중 from_dict를 이용하면 dict 형식인 df.data 항목들을 데이터 프레임으로 변환할 수 있다. orient는 dict에 들어있는 Key를 index(행)로 사용한다는 뜻이고 뒤에 .T를 붙여 행열전치를 시켰기 때문에 Key가 index가 아닌 Column으로 바뀌게 된다. 그 다음 pd.concat() 를 이용해 만들어둔 빈 데이터 프레임에 행 방향으로 이어붙여 하나의 데이터 프레임을 만든다. 이제 이 데이터 프레임을 분석에 사용하면 된다.
'Analysis > 공공데이터포털' 카테고리의 다른 글
| [공공데이터포털] 지역 별 보건의료기관 현황 알아보기 (2) | 2023.08.07 |
|---|---|
| [공공데이터포털] API를 사용해서 공공데이터 불러오기 1 (2) | 2023.08.02 |