본문 바로가기
Analysis Tips

[API] 주택 구입 부담 지수 API 연결

by dovah. 2021. 8. 28.
반응형

최근 자산 배분에 관한 관심이 높아졌다.

그래서 이런저런 자료를 찾다보니, 주택 구입 부담 지수라는 걸 알게 되었고,

해당 데이터 대해 주택 금융통계 시스템에 API를 제공하는 것을 알게되었다.

https://www.hf.go.kr/research/portal/main/indexPage.do

 

주택금융통계시스템 HOUSTAT (HOUSING FINANCE STATISTICS SYSTEM)

 

www.hf.go.kr

 

* 주택 구입부담지수는

중위소득 가구가 표준대출을 받아 중간가격의 주택을 구입하는 경우의 상환 부담을 나타내는 지수이다.

그렇기때문에 지수가 낮을 수록 주택 구입부담의 완화를 의미하며 높은 경우에는 가중되는 것을 의미한다.

 

 

아파트 호재 분석의 경우 단순히 거래량이 중요한게 아니라, 사회 전반적인 경제 지표를 보고 호재분석을 진행했어야했는데, 너무 무턱대고 했다...

 

해당 데이터를 API로 호출 받는 과정을 진행했다.

우선 특정 기간의 데이터만 불러와서 데이터프레임으로 저장하는 과정을 진행했다.

 

 

1. 개발 가이드

https://www.hf.go.kr/research/portal/openapi/openApiDevPage.do

 

개발 가이드 | 주택금융통계시스템 HOUSTAT (HOUSING FINANCE STATISTICS SYSTEM)

개발 가이드 Open API 사용방법 1. 사용 할 Open API 정하기 Open API 목록 메뉴의 서비스 항목을 확인합니다. 2. 명세서를 다운로드 받습니다. 명세서에는 Open API를 사용하기 위한 설명이 포함되어 있습

www.hf.go.kr

 

전체적인 가이드는 위에 페이지에서 확인할 수 있다.

 

2. python code

1) 데이터 호출

import pandas as pd
import requests
import json

temp_url = 'https://www.hf.go.kr/research/openapi/SttsApiTblData.do?'
service_key = '******'
stat = '&STATBL_ID=T186503126543136'
data_cycle = '&DTACYCLE_CD=QY'
date = '&WRTTIME_IDTFR_ID=201001'
type = '&Type=json'
pindex= '&pindex=1'
size = '&size=100'

url = temp_url+service_key+data_cycle+date+size+type+stat
res = requests.get(url)

 

API url 구성에 맞춰 진행했다.

각 항목별로 변수화해서 url을 구성하는 방식으로 진행했는데, 개인적으로 이렇게 관리하는게 수월해서이다.

 

중요한 것은 type인데, 별도의 설정을 하지않으면 xml 형태로 반환된다.

요새 json 형식을 많이 다루는데, 아직도 어색해서 좀더 다뤄보면 낫지 않을까 해서 json 형태로 진행했다.

 

*참고로 콘솔창에 url 변수를 실행시켜서 해당 url의 정상 작동 여부를 확인하면서 진행했다.

**pindex의 경우 설정만하고 실제로 사용하지 않았는데, 특정 분기의 데이터를 대상으로 하다보니 size가 17개로 한 페이지에 다 노출되어 사용할 필요가 없었다.

 

 

2) 데이터 처리

 

json_data = json.loads(res.text)

json_array = json_data.get('SttsApiTblData')[1].get('row')
temp_data = pd.DataFrame(columns = ['Region', 'YearMonth', 'Value'])
for i,j in enumerate(json_array):
    temp_data.loc[i] = [j.get('ITM_NM'), j.get('WRTTIME_IDTFR_ID'), j.get('DTA_VAL')]

 

호출값 그대로 json.loads(res)로 해봤으나, 해당 함수의 입력값은 str이어야만 하기 때문에...

(사실 몰랐다. 뭐 모를 수도 있지. 잘 안썼으니까...)

 

문제는 이 다음이었다.

해당 데이터의 뎁스가 꽤나 깊은 편이었다.

<SttsApiTblData>
<head>
<list_total_count>17</list_total_count>
<RESULT>
<CODE>INFO-000</CODE>
<MESSAGE>정상 처리되었습니다.</MESSAGE>
</RESULT>
</head>
<row>
<STATBL_ID>T186503126543136</STATBL_ID>
<DTACYCLE_CD>QY</DTACYCLE_CD>
<WRTTIME_IDTFR_ID>201001</WRTTIME_IDTFR_ID>
<ITM_DATANO>10001</ITM_DATANO>
<ITM_NM>전국</ITM_NM>
<CLS_DATANO/>
<CLS_NM/>
<UI_NM/>
<DTA_VAL>66.1</DTA_VAL>
</row>

우선  'SttsApiTblData' 항목 안에 'head', 'row'로 구성된 리스트있었고, 우리가 원하는 항목은 해당 리스트의 2번째(python index 1)에 들어가 있었다.

 

json_array = json_data.get('SttsApiTblData')[1].get('row')

따라서 'SttsApiTblData' 키값을 토대로 리스트를 받고, 해당 리스트 내에 2번째 데이터 값 내에서 'row'에 해당하는 값들을 받았다.

 

temp_data = pd.DataFrame(columns = ['Region', 'YearMonth', 'Value'])

이후에 우리가 원하는 데이터를 담을 데이터프레임을 생성했다.

해당 API에서 제공하는 값은, 항목의 종류(STABLE_ID), 지역(ITM_NM),  날짜(WRTTIME_IDTFR_ID), 지수(DTA_VAL)등이 있는데 우리가 실제로 필요한 것은 지역과 날짜, 그리고 지수이기 때문에 컬럼을 3개로 했다.

 

for i,j in enumerate(json_array):
    temp_data.loc[i] = [j.get('ITM_NM'), j.get('WRTTIME_IDTFR_ID'), j.get('DTA_VAL')]

이후에 각 'row'별로 우리가 원하는 값들을 호출해서 데이터프레임에 차곡 차곡 쌓았다.

 

enumerate의 경우 해당 데이터의 인덱스와 값을 동시에 주기때문에 이럴때 사용하면 편하다.

그리고 빈 리스트를 생성해서 값들을 append하고 해당 리스트를 데이터 프레임에 담기보단  값들을 바로 하나의 리스트로 생성 후 데이터프레임에 담는 방식으로 진행했다.

 

왜냐하면 개인적으로 이게 편해서....

 

 

3. 기간 데이터 통합

사실 이건 돌려본 것은 아니다. 그냥 이렇게 짜면 여러 기간에 대해 수집할 수 있지 않을까 싶다.

 

data_list = []
for date in date_list:
    url = temp_url+service_key+data_cycle+date+size+type+stat
    res = requests.get(url)
    json_data = json.loads(res.text)
    
    json_array = json_data.get('SttsApiTblData')[1].get('row')
    temp_data = pd.DataFrame(columns = ['Region', 'YearMonth', 'Value'])
    for i,j in enumerate(json_array):
        temp_data.loc[i] = [j.get('ITM_NM'), j.get('WRTTIME_IDTFR_ID'), j.get('DTA_VAL')]
    
    data_list.append(temp_data)

data = pd.concat(data_list).reset_index(drop=True)

 

날짜 리스트를 만들고 해당 리스트를 for 문에 적용시켜 돌리면 되지 않을까 싶다.

 

 

 

 

생각보다 별거 없는데, 가이드 문서나 다른 사람들의 자료가 많이 없는거 같았다.

부동산 공부를 하면 할수록 볼게 많은데, 아마 이 이후에는 전세가율 데이터와 주택구입물량지수 수집을 진행하지 않을 까 싶다.

 

 

반응형

댓글