오늘은 공공데이터를 활용하여 Python에 나타나도록 적용시키는 실습을 해보겠습니다 :)
공공데이터 포털은 공공기관이 생성 또는 취득하여 관리하고 있는 공공데이터를 한 곳에서 제공하는 통합 창구입니다.
공공데이터 포털
국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase
www.data.go.kr
공공데이터 포털을 활용하여 온습도 센서 없이 날씨를 확인할 수 있는 방법에 대해서 알아보도록 하겠습니다.
이를 위해서 아래의 4가지 단계가 필요합니다
- 공공데이터 포털에 회원가입을 해야한다.(Internet Explorer 11버전에서만 정상적으로 작동)
- 사용할 공공데이터를 신청하고 승인을 받습니다. 내가 사용할 공공데이터를 신청하면 승인까지는 하루가 걸릴 수도 있고 승인 없이 바로 사용할 수 있는 데이터도 있습니다.
- JSON 데이터 타입에 대한 이해가 필요합니다. JSON은 Int, String, Object, Array 4가지 데이터 타입으로 이루어져있습니다.
- python을 이용하여 어떻게 JSON 데이터를 공공데이터로부터 받아올 수 있을지에 대한 코드 이해가 필요합니다. 공공데이터 포털에서 샘플 코드를 제공해주기 때문에 바로 사용하면 되지만 python2.7에 맞게 코드가 제공되기 때문에 우리가 사용하는 python3버전에는 맞지 않을 수 있습니다.
<공공데이터 신청하기>
- 인터넷 익스플로워 11을 이용하여 공공데이터 포털에 접속한 후 회원가입
- 공공데이터 신청 및 승인
- 검색창에 '동네예보정보조회서비스'를 입력하고 검색
오픈 API - 동네예보정보조회서비스 - 활용신청
다음과 같은 화면이 나옵니다. 밑으로 스크롤을 내려주세요. 심의여부에 '자동승인'이라는 문구를 확인할 수 있습니다.
시스템 유형은 '일반'을 선택합니다.
활용목적은 참고자료 또는 연구를 선택합니다.
상세기능 정보를 모두 선택해주세요
상세기능정보는 내가 어떤 데이터를 사용할지를 선택하는 부분입니다. 아래 4가지 데이터 중 필요한 데이터는 '초단기실황조회' 이지만 4가지를 다 선택하겠습니다. 저작표시도 동의한 후 활용신청을 눌러주세요.
[승인]된 서비스를 클릭해주세요
일반 인증키를 복사해주세요
'초단기실황조회'에서 확인 - 미리보기를 눌러주세요
요청변수에서 'dataType'을 XML, JSON 중 원하는 타입으로 입력하시면 됩니다.
미리보기를 클릭하면 다음과 같은 XML 데이터를 볼 수 있습니다.
참고문헌에서 링크를 클릭한 뒤 가이드를 다운로드 할 수 있습니다.
<공공데이터 분석하기>
아래의 데이터는 초단기실황조회 XML데이터 입니다.
<item>
<baseDate>20200729</baseDate>
<baseTime>0600</baseTime>
<category>T1H</category>
<nx>18</nx>
<ny>1</ny>
<obsrValue>-998.9</obsrValue>
</item>
baseDate는 발표일자, baseTime은 발표시간, category는 자료구분코드, nx는 x좌표, ny는 y좌표이며 위경도가 아닌 기상청 격자정보입니다. obsrValue는 실황 값입니다.
category는 자료구분코드입니다.
nx와 ny는 위도 경도가 아니라 기상청 격자정보입니다. 아래의 주소로 이동하여 엑셀파일을 다운 받고 서울에 마포구 연남동을 검색합니다.
https://data.kma.go.kr/community/board/detailBoard.do?bbrdTypeNo=4&pgmNo=59&bbrdNo=7525
기상자료개방포털[소통과참여:자유게시판]
자유게시판은 사용자 여러분께서 서로 다양한 의견을 공유할 수 있는 공간입니다. 만약 기상자료개방포털 이용에 대한 문의 사항이 있으시면, Q&A 게시판에 글을 남겨주시기 바랍니다. 자료값 �
data.kma.go.kr
검색창에 연남동을 검색하여 격자x 59, 격자y 127을 입력하시면됩니다.
obsrValue는 실황 값입니다.
해당 값은 자료구분코드에 따라서 값의 형태가 조금씩 달라집니다. 저는 지금 T1H를 사용하고 있기 때문에 T1H에 대한 obsrValue 값의 종류가 무엇이 있는지 알아야합니다. obstValue는 기온의 실황 값을 나타내며 위 표에서 알 수 있듯이 단위가 ℃ 입니다. 따라서 22.6는 현재 온도가 22.6도라는 것을 나타냅니다.
<item>
<baseDate>20200729</baseDate>
<baseTime>0600</baseTime>
<category>T1H</category>
<nx>59</nx>
<ny>127</ny>
<obsrValue>22.6</obsrValue>
</item>
2020년 07월 29일 오전 06시경 격자x 59, 격자y 127의 위치인 서울특별시 종로구의 온도는 22.6도라는 것을 알 수 있습니다.
서울특별시 연남동의 날씨를 확인해보겠습니다. 아래와 같이 입력한 뒤 미리보기를 클릭합니다. 이때 base_date는 각자 실습해보는 날짜를 넣어보시면 됩니다.
미리보기 결과 값은 아래와 같습니다.
<item>
<baseDate>20200729</baseDate>
<baseTime>1500</baseTime>
<category>T1H</category>
<nx>59</nx>
<ny>127</ny>
<obsrValue>24.2</obsrValue>
</item>
이번엔 _type부분을 json으로 변경하고 다시 한 번 미리보기를 클릭해보겠습니다.
열기 또는 저장을 해주세요. 저는 Visual Studio로 넘어가졌습니다.
아래의 데이터는 xml타입의 데이터가 아닌 json 타입의 데이터입니다. xml 타입의 데이터가 눈에 보기 훨씬 편하지만 데이터의 양이 확연히 줄어든 것을 확인할 수 있습니다. json 타입은 xml 처럼 모든 정보를 의미 있게 표현할 수 있으면서 데이터가 가벼워서 좋습니다.
json 데이터를 깔끔하게 정리하여 보기 위해 jsonparseronline 사이트로 이동하여 json 데이터를 좌측 input 창에 붙여 넣습니다.
Json Parser Online - Best tool to Beautify JSON online
JSON PARSER ONLINE lets you parse JSON string into a pretty and colorful JSON tree view. It parse JSON String and converts it into a human readable format string.
jsonparseronline.com
아래의 그림을 보면 글자 수가 json타입이 확연히 작다는 것을 확인할 수 있습니다. xml 데이터는 item이라는 태그(<>)로 묶여 있고 그 안에 모든 값을이 태그로 감싸져 있습니다. 하지만 json 데이터는 ' { ' 로 시작여 ' } ' 로 끝나는 형태를 취합니다. 구분은 콤마(,)로 합니다.
파이썬을 활용하여 온습도 확인하기
공공데이터 포털에서 제공해주는 샘플코드를 이용해보겠습니다.
공공데이터 포털 사이트에서 마이페이지로 이동하여 [동네예보정보조회서비스] - [상세설명]을 눌러주세요
조회를 누른후 스크롤을 밑으로 내려줍니다.
샘플코드중 Python을 클릭한 후 코드를 복사해주세요
위 샘플코드에서 데이터를 요청하기 위해 사용 중인 모듈을 urllib2입니다. 하지만 urllib2는 최근에 잘 사용되지 않습니다. 그 이유는 requests라는 강력한 모듈이 있기 때문입니다.
VNC를 이용하여 라즈베리 파이로 돌아간후 폴더를 하나 생성해주세요
from urllib.parse import urlencode, unquote
import requests
import json
url = 'http://apis.data.go.kr/1360000/VilageFcstInfoService/getUltraSrtNcst'
queryParams = '?' + urlencode(
{
"ServiceKey" : unquote("자신의 서비스 키를 넣으세요"),
"base_date" : "20200729",
"base_time" : "0100",
"nx" : 100,
"ny" : 90,
"numOfRows" : "10",
"pageNo" : "1",
"dataType" : "JSON"
}
)
queryURL = url + queryParams
response = requests.get(queryURL)
print("=== response json data start ===")
print(response.text)
print("=== response json data end ===")
print()
r_dict = json.loads(response.text)
r_response = r_dict.get("response")
r_body = r_response.get("body")
r_items = r_body.get("items")
r_item = r_items.get("item")
result = {}
result2 ={}
for item in r_item:
if(item.get("category") == "T1H"):
result = item
break
for item in r_item:
if(item.get("category") == "RN1"):
result2 = item
break
print("=== response dictionary(python object) data start ===")
print(result.get("baseTime")[:-2] +" temp : " + result.get("obsrValue") + "C")
print(result2.get("baseTime")[:-2] +" rain : " + result2.get("obsrValue") + "mm")
print("=== response dictionary(python object) data end ===")
print()
제가 원한 정보만 출력할 수 있습니다.(강수량과 온도)
이상 공공데이터를 활용하는 방법 포스팅을 마치겠습니다 감사합니다 :)
Hasta Luego~!
'Python' 카테고리의 다른 글
Python #7 (IP, Port, Process) (0) | 2020.07.29 |
---|---|
Python #6 (웹 페이지) (0) | 2020.07.28 |
Python #5 (Flask 세팅 & 웹 서버 구축) (0) | 2020.07.27 |
Python #4 (GPIO 제어 및 테스트) (0) | 2020.07.24 |
Python #3 (기본 문법 - 제어문) (0) | 2020.07.24 |