공공데이터 포털 API의 아파트 실거래가 API를 이용해서 서울내의 각 구별 아파트 가격정보와
월별 트렌드를 확인해보겠습니다.
이용하는 API는 아래의 2가지가 되겠습니다.
행정안전부_행정표준코드_법정동코드
국토교통부_아파트매매 실거래자료
가입 및 API 사용에 대한 방법에 대해 필요하신분은 아래 참고 부탁드립니다.
1. 가입 및 API 사용법(Skip가능)
2. 행정안전부_행정표준코드_법정동코드 데이터 확인
3. 국토교통부_아파트매매 실거래자료 데이터 확인
4. 구별 아파트 가격정보와 월별 트렌드 확인
1. 가입 및 API 사용법(Skip가능)
2. 행정안전부_행정표준코드_법정동코드 데이터 확인
행정안전부 행정표준코드 법정동 코드에서 아파트 매매 실거래가API에서 사용할
지역코드리스트(LAWD_CD)를 만들고, 여기서 사용할 서울특별시 정보만 따로 저장하겠습니다.
코드는 아래와 같습니다.
import requests
import math
import pandas as pd
numofrows=1000
# while문을 전체 페이지수와 일치시 break하기 위해 사용
totalpageno=0
pageno=1
rows=[]
while True:
print(str(totalpageno),str(pageno))
url = 'http://apis.data.go.kr/1741000/StanReginCd/getStanReginCdList'
params ={'serviceKey' : apikey, 'pageNo' : pageno,
'numOfRows' : '1000', 'type' : 'json' }
response = requests.get(url, params=params)
region = response.json()['StanReginCd']
row = region[1]['row']
rows = rows + row #결과를 하나의 rows의 list로 합침
totalcount=region[0]['head'][0]['totalCount']
totalpageno=math.ceil(totalcount/numofrows)
if pageno==totalpageno:
break
pageno=pageno+1
#rows를 dataframe으로 변환
region_df=pd.DataFrame(rows)
region_df['locate_lv1']=region_df['locatadd_nm'].str.split(' ').str[0]
region_df['locate_lv2']=region_df['locatadd_nm'].str.split(' ').str[1]
region_df=region_df.loc[region_df['locate_lv1']=='서울특별시']
region_df['LAWD_CD']=region_df['region_cd'].str[:5] #아파트 매매 실거래가 API호출시 사용
#필요 column만 저장
region_df=region_df[['locate_lv1','locate_lv2','LAWD_CD','locatadd_nm','locallow_nm']]
전체 데이터(totalcount) 20550개가 검색이 되는데 한번에 호출할수 있는 최대치(numOfRows)가 1000개입니다.
1000개씩 21번의 loop를 돌기 위한 코드입니다.
# while문을 전체 페이지수와 일치시 break하기 위해 사용
totalpageno=0
pageno=1
rows=[]
while True:
...중략...
if pageno==totalpageno:
break
pageno=pageno+1
각 loop별 호출 결과를 row에 저장하고 전체 결과를 rows에 합칩니다.
response = requests.get(url, params=params)
region = response.json()['StanReginCd']
row = region[1]['row']
rows = rows + row #결과를 하나의 rows의 list로 합침
결과 rows를 dataframe으로 변환합니다.
#rows를 dataframe으로 변환
region_df=pd.DataFrame(rows)
서울특별시의 정보 column(locate_lv1)과 서울시내의 각 구의 정보(locate_lv2)를 생성합니다.
결과를 서울특별시만 따로 저장합니다.
LAWD_CD는 아파트매매 실거래가 API에서 요청인자로 사용될 데이터 입니다.
region_df['locate_lv1']=region_df['locatadd_nm'].str.split(' ').str[0]
region_df['locate_lv2']=region_df['locatadd_nm'].str.split(' ').str[1]
region_df=region_df.loc[region_df['locate_lv1']=='서울특별시']
region_df['LAWD_CD']=region_df['region_cd'].str[:5] #아파트 매매 실거래가 API호출시 사용
필요한 column만 다시 저장합니다.
#필요 column만 저장
region_df=region_df[['locate_lv1','locate_lv2','LAWD_CD','locatadd_nm','locallow_nm']]
DataFrame의 내용입니다.
3. 국토교통부_아파트매매 실거래자료 데이터 확인
2번에서 수집한 데이터(지역정보)를 가지고 아파트매매 실거래가 데이터를 만들어보겠습니다.
LAWD_CD 정보로 실거래가 API의 정보를 검색후 저장하는 순서입니다.
전체코드 남겨드립니다.
import xmltodict
LAWD_CD_list=region_df['LAWD_CD'].unique()
trade_list=[]
YMDs=list(range(202101,202113))
for LAWD_CD in LAWD_CD_list:
for YMD in YMDs:
DEAL_YMD=str(YMD)
url = 'http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade'
params ={'serviceKey' : apikey,
'LAWD_CD' : LAWD_CD, 'DEAL_YMD' : DEAL_YMD }
response = requests.get(url, params=params)
result = xmltodict.parse(response.content)
resultCode = result['response']['header']['resultCode']
if resultCode == '00':
if str(result['response']['body']['items'])=='None':
continue
else:
trade_list=trade_list + result['response']['body']['items']['item']
trade_df = pd.DataFrame(trade_list)
LAWD_CD_list에는 서울특별시의 각 구의 코드정보가 있고 실거래가에서 사용하기 위해 따로 저장합니다.
trade_list는 전체 결과가 저장될 list이고, YMDs는 202101~202112 월까지의 확인하기 위한 변수입니다.
LAWD_CD_list=region_df['LAWD_CD'].unique()
trade_list=[]
YMDs=list(range(202101,202113))
LAWD_CD_list(서울 각구별)로 for loop를 돌리고,
각 구별로 202101~202112의 데이터를 구하기 위해 또다른 for loop를 넣었습니다.
for LAWD_CD in LAWD_CD_list:
for YMD in YMDs:
DEAL_YMD=str(YMD)
결과를 받아서 xml -> json으로 변환후에 result['response']['body']['items']['item']가 정상적으로 있는 데이터만
trade_list에 저장했습니다.
response = requests.get(url, params=params)
result = xmltodict.parse(response.content)
resultCode = result['response']['header']['resultCode']
if resultCode == '00':
if str(result['response']['body']['items'])=='None':
continue
else:
trade_list=trade_list + result['response']['body']['items']['item']
list -> dataframe으로 변환했습니다.
trade_df = pd.DataFrame(trade_list)
4. 구별 아파트 가격정보와 월별 트렌드
두개의 data를 병합하고, 거래금액의 column type을 int64로 전용면적을 float64, 월을 int64로 변경합니다.
전용면적당 아파트 금액을 계산합니다.
df=pd.merge(left=trade_df, right=region_df, how='left', left_on=['지역코드','법정동'], right_on=['LAWD_CD','locallow_nm'])
df['거래금액']=df['거래금액'].str.replace(',','')
df=df.astype({'거래금액':'int64','전용면적':'float64','월':'int64'})
df['전용면적m2당금액']=(df['거래금액']/df['전용면적']).round(0)
2021년 구단위로 전용면적m2당 금액의 평균값을 저장합니다.
dfgu=df[['locate_lv2','전용면적m2당금액']].groupby(['locate_lv2']).mean().sort_values('전용면적m2당금액',ascending=False)
display(dfgu)
단위는 천만원 단위가 되겠습니다.
전용면적으로 계산해서 일반적인 계산법인 공급면적당 금액보다는 높게 나오는데
금액 비교 및 트렌드를 보기위한 데이터로 참고 부탁드립니다.
그래프로 확인하면
import matplotlib.pyplot as plt
plt.rc('font', family='NanumGothic')
plt.figure(figsize=(8,2))
plt.bar(dfgu.index,dfgu['전용면적m2당금액'])
plt.xticks(rotation=90)
plt.title('2021년 구단위 전용면적m2당 금액')
plt.show()
이런 순으로 나오는 것을 알수 있습니다.
월별 전용면적m2당 금액 평균 데이터를 확인하겠습니다.
dfmomth=df[['월','전용면적m2당금액']].groupby(['월']).mean()
dfmomth
그래프로 보겠습니다.
plt.figure(figsize=(8,2))
plt.bar(dfmomth.index,dfmomth['전용면적m2당금액'])
plt.xticks(rotation=90)
plt.title('2021년 서울시 월별 전용면적m2당 금액')
plt.show()
이상으로 서울내의 각 구별 아파트 정보와 월별 트렌드를 확인해봤습니다.
동별 데이터 및 2021년 이외의 데이터를 변형해서 확인해 보셔도 좋을것 같습니다.
'API' 카테고리의 다른 글
[전자공시 Dart API] 회사분할결정 공시후 주가 확인 (4) | 2022.11.02 |
---|---|
[전자공시 Dart API] 회사합병결정 공시후 주가 확인 (4) | 2022.10.31 |
[공공데이터포털 API] 데이터 가져오기 기초 (6) | 2022.10.26 |
[공공데이터포털 API] 가입하기 및 인증키(APPKey) 발급, 확인 (4) | 2022.10.25 |
[전자공시 Dart API] 자기주식취득 공시 회사의 취득주식수 및 주가확인 (4) | 2022.10.23 |