공공데이터 포털 API의 아파트 실거래가 API를 이용해서 8월 -> 9월의 월간 가격상승을 많이 한 아파트와
거래량 및 거래량 상승비율이 높은 아파트들을 확인해보겠습니다.
이용하는 API는 아래의 2가지가 되겠습니다.
행정안전부_행정표준코드_법정동코드
국토교통부_아파트매매 실거래자료
가입 및 API 사용에 대한 방법에 대해 필요하신분은 아래 1번을 참고 부탁드립니다.
1. 가입 및 API 사용법(Skip가능)
2. 행정안전부_행정표준코드_법정동코드 데이터 확인
3. 국토교통부_아파트매매 실거래자료 데이터 확인
4. 월간 가격상승 아파트 및 거래량 상위 확인
1. 가입 및 API 사용법(Skip가능)
2. 행정안전부_행정표준코드_법정동코드 데이터 확인
행정안전부 행정표준코드 법정동 코드에서 아파트 매매 실거래가 API에서 사용할
지역코드리스트(LAWD_CD)를 가져오겠습니다.
apikey는 본인의 데이터 입력이 필요합니다.
import requests
import math
import pandas as pd
from IPython.display import display
import xmltodict
import matplotlib.pyplot as plt
import seaborn as sns
plt.rc('font', family='NanumGothic')
plt.rcParams['axes.unicode_minus']=False
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['locate'] = region_df['locate_lv1'] + ' ' + region_df['locate_lv2']
region_df['LAWD_CD']=region_df['region_cd'].str[:5] #아파트 매매 실거래가 API호출시 사용
#필요 column만 저장
region_df=region_df[['locate','locate_lv1','locate_lv2','LAWD_CD','locatadd_nm','locallow_nm']]
region_df
전체 데이터(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)
LAWD_CD는 아파트매매 실거래가 API에서 요청인자로 사용될 데이터 입니다.
필요한 column만 다시 저장합니다.
region_df['LAWD_CD']=region_df['region_cd'].str[:5] #아파트 매매 실거래가 API호출시 사용
#필요 column만 저장
region_df=region_df[['locate','locate_lv1','locate_lv2','LAWD_CD','locatadd_nm','locallow_nm']]
3. 국토교통부_아파트매매 실거래자료 데이터 확인
2번에서 수집한 데이터(지역정보)를 가지고 아파트매매 실거래가 데이터를 만들어보겠습니다.
LAWD_CD 정보로 실거래가 API의 정보를 검색후 저장하는 순서입니다.
전체코드 남겨드립니다.
LAWD_CD_list=region_df['LAWD_CD'].unique()
trade_list=[]
YMDs=list(range(202208,202210))
for i, LAWD_CD in enumerate(LAWD_CD_list):
print(str(i), LAWD_CD)
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:
if type(result['response']['body']['items']['item'])==dict:
trade_list=trade_list + [result['response']['body']['items']['item']]
else:
trade_list=trade_list + result['response']['body']['items']['item']
trade_df = pd.DataFrame(trade_list)
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)
df['거래년월']=df['년'].astype('string')+df['월'].astype('string').str.zfill(2)
전체 지역에 대한 LAWD_CD의 unique 값만을 LAWD_CD_list에 저장합니다.
LAWD_CD_list에 저장된 Code로 각 지역별 아파트 실거래 상세 자료를 가져오게 됩니다.
LAWD_CD_list=region_df['LAWD_CD'].unique()
trade_list=[]
YMDs=list(range(202208,202210))
전체 지역(LAWD_CD_list)에 대해 2022년 8월, 9월의 데이터를 한 번씩 실행하게 됩니다.
for i, LAWD_CD in enumerate(LAWD_CD_list):
print(str(i), LAWD_CD)
for YMD in YMDs:
DEAL_YMD=str(YMD)
실제 API를 호출하는 부분이고, 응답이 '00' 정상 응답의 경우만 trade_list에 저장했습니다.
apikey는 본인의 데이터가 필요합니다.
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:
if type(result['response']['body']['items']['item'])==dict:
trade_list=trade_list + [result['response']['body']['items']['item']]
else:
trade_list=trade_list + result['response']['body']['items']['item']
list인 trade_list의 결과를 DataFrame의 형태로 변환했습니다.
trade_df = pd.DataFrame(trade_list)
4. 월간 가격상승 아파트 및 거래량 상위 확인
법정동 코드의 DataFrame과 아파트 실거래 상세 DataFrame을 병합합니다.
이후 '전용면적m2당금액' 정보와 '거래년월' 정보를 추가합니다.
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)
df['거래년월']=df['년'].astype('string')+df['월'].astype('string').str.zfill(2)
동별 8월 -> 9월의 가격변동 데이터를 만들었습니다.
거래년월, locatadd_nm, 아파트, 전용면적m2당금액 정보를 가져와서 거래년월, locatadd_nm, 아파트 기준으로
group을 하고 전용면적m2당금액 의 평균값을 구했습니다.
여기서 locatadd_nm은 시군구 및 동이름의 정보가 있는 column입니다.
#동별
df_price=df[['거래년월','locatadd_nm','아파트','전용면적m2당금액']]. \
groupby(['locatadd_nm','아파트','거래년월']).mean().sort_values('거래년월')
df_price=df_price.reset_index()
df_price['동_아파트']=df_price['locatadd_nm'] + ' ' + df_price['아파트']
df_pricepv=df_price.pivot_table(index='동_아파트',columns='거래년월',values='전용면적m2당금액')
df_pricepv['가격변동비율']=df_pricepv['202209']/df_pricepv['202208']-1
df_pricepv=df_pricepv.sort_values('가격변동비율', ascending=False)
df_pricepv
아파트별 8월 -> 9월의 거래가격 변동비율이 높은순으로 표시가 됩니다.
8월 또는 9월의 거래 실적이 없는 경우는 NaN으로 나오게 됩니다.
다음으로는 거래량 및 거래량 변동비율을 확인해보도록 하겠습니다.
가격 확인에서는 groupby를 mean으로 했는데 거래량을 구하기 위해 count로 집계했습니다.
#동별 거래량 변동비율
df_count=df[['거래년월','locatadd_nm','아파트','전용면적m2당금액']]. \
groupby(['locatadd_nm','아파트','거래년월']).count().sort_values('거래년월')
df_count=df_count.rename(columns={'전용면적m2당금액':'거래량'})
df_count=df_count.reset_index()
df_count['동_아파트']=df_count['locatadd_nm'] + ' ' + df_count['아파트']
df_countpv=df_count.pivot_table(index='동_아파트',columns='거래년월',values='거래량')
df_countpv['거래량변동비율']=df_countpv['202209']/df_countpv['202208']-1
df_countpv=df_countpv.sort_values('거래량변동비율', ascending=False)
df_countpv
8월과 9월의 거래량 및 거래량 변동비율이 확인됩니다.
아파트 가격변동 비율 상위 30위를 그래프로 확인하겠습니다.
df_pricepv_top30 = df_pricepv.iloc[:30,].sort_values('가격변동비율')
plt.figure(figsize=(8,7))
plt.barh(df_pricepv_top30.index, df_pricepv_top30['가격변동비율'])
plt.title('전국 아파트 가격변동비율(9월) Top30')
다음으로는 거래량 상위 30위를 보겠습니다.
df_countpv_30 = df_countpv.sort_values('202209',ascending=False).iloc[:30,].sort_values('202209')
plt.figure(figsize=(8,7))
plt.barh(df_countpv_30.index, df_countpv_30['202209'])
plt.title('전국 아파트 거래량(9월) Top30')
마지막으로 거래량 변동비율 상위 Top30입니다.
df_countpv_top30 = df_countpv.iloc[:30,].sort_values('거래량변동비율')
plt.figure(figsize=(8,7))
plt.barh(df_countpv_top30.index, df_countpv_top30['거래량변동비율'])
plt.title('전국 아파트 거래량변동비율(9월) Top30')
이상으로 8월 -> 9월의 월간 가격 및 거래량 상승이 많은 아파트들을 알아봤습니다.
'API' 카테고리의 다른 글
[전자공시 Dart API] 유통주식 비율이 낮은 (자기주식 비율이 높은) 회사 리스트 (4) | 2022.11.06 |
---|---|
[네이버 API] 블로그 나만의 키워드 마스터 만들기 두번째(파이썬) (5) | 2022.11.04 |
[전자공시 Dart API] 회사분할결정 공시후 주가 확인 (4) | 2022.11.02 |
[전자공시 Dart API] 회사합병결정 공시후 주가 확인 (4) | 2022.10.31 |
[아파트 실거래가 API] 지역별 아파트 가격정보 비교 및 월별 트렌드 확인 (4) | 2022.10.26 |