공공데이터를 분석하다보면 csv형식으로 제공되지 않는 데이터가 많다.
API로 제공되는 데이터는 따로 파싱해주어야 하는데 매번 쓰면서도 정리를 안 해둬서 이번 기회에 정리하기로 했다.
한번 배워두면 다른 곳에도 응용이 가능해서 유용하다
목표는 파이썬을 활용해서 공공데이터 포털의 Open API를 신청하고 데이터를 가져오는 실습을 진행하고
불러온 데이터는 pandas를 이용해서 데이터프레임으로 바꿔서 CSV파일로 만들기!
실습 데이터
https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15056633
사용할 데이터는 환경과학원의 물사용량 정보제공 데이터이다.
우선 링크에 들어가서 활용신청 클릭 후, 신청하라는 대로 데이터 활용신청 하기
이후 공공데이터포털 https://www.data.go.kr/index.do 의 마이페이지에 들어가보면 신청된 API의 여부가 뜬다.
이미 API를 신청하고 key를 발급 받은 상태라 신청은 0건이 뜨고 활용은 5건이 뜨는 것을 확인할 수 있다.
중요! 활용으로 넘어가야 API를 사용하는게 가능해진다. 간혹 자동승인이 아닌 경우도 있기 때문. 자동승인인 경우에도 안되면 시간을 두고 기다려 보는 것을 추천한다. (30분에서 2시간 사이)
활용신청 된 API를 클릭하면 이런 페이지가 뜨는데, 여기서 가장 중요한 건 인증키!
인증키를 활용하여 url에 인증키와 변수를 넣어주는 식으로 서버에서 데이터를 받아올 수 있다.
아래로 내려보면 미리보기가 있는데 미리보기 확인을 누르면 원하는 변수를 넣어서 미리 조회해볼 수 있다.
어떤 변수가 있는지 모르겠다면 API설명 상세페이지 들어가서 doc파일이나 hwp파일을 보고 사용법 참조하면 더 도움이 되니까 꼭 살펴볼것!(API 사용설명서라고 보면 된다)
불러오기
1. XML로 불러오기
http://apis.data.go.kr/1480523/LvlhPpnWatUsageService/getLvlhPpnWatUsageInfo?serviceKey=개인키가들어가는부분&pageNo=1&numOfRows=100&type=xml |
2. JSON으로 불러오기
http://apis.data.go.kr/1480523/LvlhPpnWatUsageService/getLvlhPpnWatUsageInfo?serviceKey=개인키가들어가는부분&pageNo=1&numOfRows=100&type=json |
http://apis.data.go.kr/1480523/LvlhPpnWatUsageService/getLvlhPpnWatUsageInfo
URL 부분은 사용하고자 하는 API마다 다르다.
- serviceKey: 개인이 발급받은 키가 들어가는 부분(encoding/decoding)
- pageNo: 페이지 넘버
- numOfRows몇번째 행까지 표시할 건지
- type: 데이터 타입(XML/JSON)
쿼리스트링 방식으로 서버에 요청하는데 엔드포인트 주소 뒤에 ? 시작으로 쿼리스트링이 시작함을 알리고, 파라미터가 여러개일 경우 &를 통해 여러개의 파라미터 값을 넘긴다.
참고) https://hianna.tistory.com/465
라이브러리
import requests
import pprint
import json
import pandas as pd
from pandas.io.json import json_normalize
api로 받아오기
# Python3 샘플 코드 #
decoding = '발급받은개인키'
encoding ='발급받은개인키'
# api parameter call 하는 부분
# params 에 원하는 값 넣어주면 된다
# fstring방식도 사용 가능함
url = 'http://apis.data.go.kr/1480523/LvlhPpnWatUsageService/getLvlhPpnWatUsageInfo'
params ={'serviceKey' : decoding, 'numOfRows' : '1000',
'pageNo' : '1', 'resultType' : 'json',
'startYear' : '2012', 'endYear' : '2022',
'adivi_cd' : '3014011600',
'city_nm' : '대전광역시', 'citicoungu_nm' : '',
'adivi_doung_nm' : '', 'adivi_ni_nm' : '' }
response = requests.get(url, params=params) # json파일 접근
contents = response.text
# 정리
pp = pprint.PrettyPrinter(indent=4)
print(pp.pprint(contents))
문자열 JSON으로 변환
json_txt = json.loads(contents)
print(type(json_txt))
딕셔너리 형태인 것을 확인 가능하다.
원하는 값만 가져오기
body = json_txt['getLvlhPpnWatUsageInfo']['item']
print(body)
중요! 출력된 값을 보면 getLvlhPpnWatUsageInfo -> header -> item순으로 되어있다.
JSON마다 이름이 달라지므로 JSON을 보고 맞게 바꿔줘야 한다.
여기서는 getLvlhPpnWatUsageInfo 안에 있는 item 속에 원하는 정보가 포함 된 것을 확인할 수 있다.
가져와지는것을 확인할 수 있다.
추출된 값을 DataFrame으로 만들기
1. json_normalize() 사용
df = json_normalize(body)
df.head()
2. from_dict() 사용
df2 = pd.DataFrame.from_dict(body, orient='columns')
df2.head()
둘 중 어느것을 사용해도 결과는 같다.
csv로 저장
df.to_csv('water_daejeon.csv',index=False)
전체 코드
import requests
import pprint
import json
import pandas as pd
from pandas.io.json import json_normalize
# Python3 샘플 코드 #
decoding = '발급받은키'
encoding = '발급받은키'
# api parameter call 하는 부분
# params 에 원하는 값 넣어주면 된다
# fstring방식도 사용 가능함
url = 'http://apis.data.go.kr/1480523/LvlhPpnWatUsageService/getLvlhPpnWatUsageInfo'
params ={'serviceKey' : decoding, 'numOfRows' : '1000',
'pageNo' : '1', 'resultType' : 'json',
'startYear' : '2012', 'endYear' : '2022',
'adivi_cd' : '3014011600',
'city_nm' : '대전광역시', 'citicoungu_nm' : '',
'adivi_doung_nm' : '', 'adivi_ni_nm' : '' }
response = requests.get(url, params=params) # json파일 접근
contents = response.text
# 정리
pp = pprint.PrettyPrinter(indent=4)
print(pp.pprint(contents))
# 문자열 JSON 변환
json_txt = json.loads(contents)
print(type(json_txt))
# JSON 값 가져오기
body = json_txt['getLvlhPpnWatUsageInfo']['item']
print(body)
#추출한 값을 df로
# 1. json_normalize() 사용
df = json_normalize(body)
df.head()
# 2. from_dict() 사용
df2 = pd.DataFrame.from_dict(body, orient='columns')
df2.head()
## csv로 저장
df.to_csv('water_daejeon.csv',index=False)
'Python' 카테고리의 다른 글
[Seaborn] legend 위치 옮기기 (1) | 2023.01.06 |
---|---|
OSMnx 설치하기 (0) | 2022.12.15 |
[Geopandas] 기초 시각화, geojson 사용하기 (0) | 2022.12.15 |
[Python] tqdm (0) | 2022.11.28 |
[Python] Groupby로 묶은 df 다시 되돌리기 (0) | 2022.11.22 |