(최종) 2022년 경기도 의왕시 아파트 실시간 매매 실거래가와 인동선(인덕원 ~ 동탄선) 표기하기
by 뱁새유니버스1. 개요
지금까지 경기도 의왕시를 기준으로 2022년 부동산 매매 실거래가와 인동선을 표기한 그림을 그려보았습니다.
결과는 아래와 같습니다.
https://tistory1.daumcdn.net/tistory/5147139/skin/images/propertiesMap1.html
순서대로 각 블로그 페이지마다 정리를 해두었으니 개발방법은 아래 내용을 확인하면서 하나씩 따라하시면 쉽게 구현이 가능합니다.
2. 내용
(1) 공공데이터포털에서 부동산 실거래가 데이터 가져오기
공공데이터포털(data.go.kr)에서 부동산 실거래가 데이터를 가져올 수 있습니다.
https://idealist.tistory.com/58
(2) 부동산 실거래가 지도에 마커로 표현하기
그리고 아파트 위경도를 일일이 표기해준다음 각 위경도별 실거래가를 확인하는 마커를 만들어줍니다.
https://idealist.tistory.com/66
(3) 지도에 인동선(인덕원역~동탄역) 선으로 표현하기
인동선 경로도 만들어줍니다.
https://idealist.tistory.com/61
부동산 실거래가를 마커로 만든 것과 인동선 경로를 만든 것을 서로 합쳐줍니다.
def plot을 만들고 plot(x)로 prop_df 데이터프레임 결과를 plot(prop_df)로 표기합니다.
그리고 나서 맵 m에 add_child(inDongLine)을 추가해주면 마커와 인동선이 지도에서 모두 보이게 됩니다.
전체소스는 아래와 같으니 똑같이 따라해보세요!
import folium
from folium.plugins import MarkerCluster
import pandas as pd
from folium import plugins
import requests
import xmltodict
import matplotlib.pyplot as plt
m = folium.Map(
location=[37.35776024945816, 126.96887448248484],
zoom_start=16
)
# 주소입력시 법정동코드를 갖고 오는 함수
def get_addrCheck_cd(address):
url = "http://apis.data.go.kr/1741000/StanReginCd/getStanReginCdList"
key = "공공데이터포털API Key값"
params = {"serviceKey": key, "pageNo": "1", "numOfRows": "3", "type": "json", "locatadd_nm": address}
r = requests.get(url, params=params)
_json = r.json()
results = _json.get("StanReginCd")
if len(results) > 0:
return results[1].get("row", [])[0].get("region_cd")[0:5]
return None
# 리스트 변수 listCheck에 YYYYMM형식으로 for문을 통해 저장한다.
listCheck = []
for i in range(12):
#for i in range(int(now.strftime('%m'))):
if len(str(i + 1)) == 1:
a = '0' + str(i + 1)
listCheck.append('2022' + a)
if len(str(i + 1)) == 2:
a = str(i + 1)
listCheck.append('2022' + a)
# df2라는 dataframe을 생성한다.
df2 = pd.DataFrame(
columns=['거래금액', '거래유형', '건축년도', '년', '법정동', '아파트', '월', '일', '전용면적', '중개사소재지', '지번', '지역코드', '층', '해제사유발생일',
'해제여부'])
# 202201~202212까지 df2에 부동산 실거래가를 호출한 df를 pd.concat을 통해 누적하여 저장한다.
for i in listCheck:
LAWD_CD = get_addrCheck_cd("경기도 의왕시")
DEAL_YMD = i
url = "http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade"
key = "공공데이터포털API Key값"
params = {"serviceKey": key, "LAWD_CD": LAWD_CD, "DEAL_YMD": DEAL_YMD}
req = requests.get(url, params=params)
result = xmltodict.parse(req.text)
items = result.get("response").get("body").get("items").get("item")
# jsonString = json.dumps(items) #list를 json방식으로 업데이트
df = pd.DataFrame(items)
df2 = pd.concat((df2, df), sort=False, ignore_index=True)
# df2 = df2.append(pd.DataFrame(df['아파트'],df['년'], columns=['아파트','년']), ignore_index=True)
# display(df2)
# df3에 74개 아파트 위경도 값을 저장한다.(미리 csv파일로 저장해두었다.)
df3 = pd.read_csv('C:/Users/bsuniverse/PycharmProjects/pythonProject1/apartmentLocation.csv', header=0, index_col=0)
#df4에 df2 아파트 실거래내역과 그에 매칭되는 위경도를 붙인다.
df4=pd.merge(df2, df3, on='아파트', how='inner')
#display.max_rows와 display.width를 None으로 설정해주면 최대로 보여준다.
pd.set_option('display.max_rows', None)
pd.set_option('display.width', None)
prop_cst = '<a href=https://docs.google.com/spreadsheets/d/1I2esnthzDarmSB7oURudFXJ9BXBB_XWqcnhUljU2xLs/edit?usp=sharing>매물확인하기</a>'
#Dataframe만들기
prop_df = pd.DataFrame({'거래금액': df4['거래금액'],'거래유형':df4['거래유형'],'건축년도': df4['건축년도'],'년':df4['년'],
'법정동': df4['법정동'],'아파트':df4['아파트'], '월': df4['월'],'일':df4['일'],
'전용면적': df4['전용면적'],'중개사소재지':df4['중개사소재지'], '지번': df4['지번'],'지역코드':df4['지역코드'],
'층': df4['층'],'해제사유발생일':df4['해제사유발생일'], '해제여부': df4['해제여부'],
'위도':df4['위도'],'경도':df4['경도'],'링크':prop_cst})
# dataframe의 plot을 지도위에 표기하는 함수를 만들고자 한다.
def plot(x):
# 리스트를 이용해 여러 행의 데이터를 위,경도로 묶음
locations = list(zip(x['위도'], x['경도']))
# 반복문을 이용해 locations로 정의한 변수에 해당하는 위치에 자동차 모양의 빨간색 아이콘을 지정했다.
icons = [folium.Icon(icon="home", prefix="fa", color="red") for _ in range(len(locations))]
# 역시 같은 원리로 아이콘을 클릭했을 때, 팝업이 생성되게 할 예정인데, 먼저 팝업 안에 들어갈 내용을 지정한다.
popup_content = []
# for information in df.itertuples():
# 팝업을 클릭했을 때, 시간이 나오게 하고 싶다.
# datetime 컬럼을 pd.to_datetime 기능을 활용하여 hh:mm 포맷으로 time이라는 컬럼을 사전에 미리 만들었다.
content = list(zip('거래금액 : ' + x['거래금액'], '거래유형 : ' + x['거래유형'], '건축년도 : ' + x['건축년도'], '년 : ' + x['년'],
'법정동 : ' + x['법정동'], '아파트 : ' + x['아파트'], '층 : ' + x['층'], '전용면적 : ' + x['전용면적'],
'월 : ' + x['월'], '일 : ' + x['일'], '중개사소재지 : ' + x['중개사소재지'], '지번 : ' + x['지번'],
'해제여부 : ' + x['해제여부'], '링크:'+ x['링크']
))
popup_content.append(content)
# 팝업을 생성한다.
popups = [folium.Popup(str(content[i]), min_width=200, max_width=200) for i in range(0, len(content))]
# 클러스터를 생성하여 앞에서 지정한 locations, icons, popups를 설정해준다.
cluster = MarkerCluster(locations=locations, icons=icons, popups=popups)
# 지도에 클러스터를 추가.
cluster.add_to(m)
plot(prop_df)
# 인동선에 위경도를 저장한다.(나무위키 참조 임의로 표기한 역과 위경도값이다. 정확하지 않다.)
인동선 = [
[37.40215101263583, 126.97666609855038], # 인덕원역
[37.382827621631, 126.97221200735103], # 안양농수산물도매시장
[37.37217090569604, 126.96438650108134], # 안양교도소
[37.37035773558198, 126.95796364848317], # 호계사거리
[37.364807700738105, 126.95877952687307], # 영풍아파트
[37.35872341280983, 126.96549905359555], # 오전역
[37.345083161032534, 126.9703807122619], # 의왕시청역
[37.31184734524443, 126.98978530987912], # 교육원삼거리
[37.30154858228313, 127.00931096274698], # 수원KT위즈파크
[37.28306245508989, 127.03833418964798], # 수원월드컵경기장
[37.27670130069141, 127.03775591472217], # 우만사거리
[37.27012294631796, 127.06114155731093], # 광교더샾아파트
[37.27622892757154, 127.06682929639051], # 원천호수
[37.275101926066, 127.082252814939], # 흥덕중학교
[37.26318135625586, 127.08195801296594], # 황골마을쌍용아파트
[37.25134869547495, 127.07105674255081], # 영통역
[37.2475974618221, 127.07571946834477], # 경희대학교
[37.22714624664718, 127.07165377273591], # 신동탄롯데캐슬아파트
[37.22927471573539, 127.05026835600584], # 반월지구
[37.21658943356313, 127.04665465235854], # 태안지구
[37.20627119001968, 127.06782646808733], # 동탄1신도시
[37.19954808618025, 127.095755128629] # 동탄역
]
# 맵 초기 화면 정의와 인동선을 그린다.
inDongLine = folium.PolyLine(locations=인동선, weight=5, color='red')
m.add_child(inDongLine)
# 지하철이미지
icon_image1 = 'C:/Users/bsuniverse/PycharmProjects/pythonProject1/train.png'
icon1 = folium.features.CustomIcon(icon_image1, icon_size=(40, 40))
icon2 = folium.features.CustomIcon(icon_image1, icon_size=(40, 40))
icon3 = folium.features.CustomIcon(icon_image1, icon_size=(40, 40))
icon4 = folium.features.CustomIcon(icon_image1, icon_size=(40, 40))
icon5 = folium.features.CustomIcon(icon_image1, icon_size=(40, 40))
icon6 = folium.features.CustomIcon(icon_image1, icon_size=(40, 40))
icon7 = folium.features.CustomIcon(icon_image1, icon_size=(40, 40))
icon_list = [icon1, icon2, icon3, icon4, icon5, icon6, icon7]
# 역이름 marker 표기
lat_list = [37.40220056990523, 37.358718910963795, 37.345083161032534, 37.28306245508989, 37.251339597017264,
37.22927471573539, 37.20011583911196]
lng_list = [126.97667173030796, 126.96551034338512, 126.9703807122619, 127.03833418964798, 127.07120326595674,
127.05026835600584, 127.09564320512395]
tooltip_list = ['인덕원역', '오전역', '의왕시청역', '수원월드컵경기장', '영통역', '반월지구역', '동탄역']
name = '<a href=https://namu.wiki/w/%EB%8F%99%ED%83%84%EC%9D%B8%EB%8D%95%EC%9B%90%EC%84%A0>인동선 나무위키 바로가기</a>'
for lat, lng, icon, tooltip in zip(lat_list, lng_list, icon_list, tooltip_list):
folium.Marker(location=[lat, lng], popup=folium.Popup(name, max_width=500), icon=icon, tooltip=tooltip).add_to(m)
plugins.Fullscreen(
position='topright',
title='Expand me',
title_cancel='Exit me',
force_separate_button=True
).add_to(m)
m.save('C:/Users/bsuniverse/Desktop/propertiesMap.html')
(4) batch 파일 만들기, 작업스케줄러 만들기
주기적으로 실행할 py파일을 만들었다면 batch파일과 작업스케줄러를 만들어줍니다.
그래야 매일 특정시간에 별도로 py파일을 실행하지 않더라도 자동으로 공공데이터포털(data.go.kr)로부터 데이터를 가져옵니다. 자세한 내용은 아래 링크와 같습니다.
https://idealist.tistory.com/73
3. 마치며
위 단계들을 모두 진행하면 매일 특정시간(ex. 매일 오전 10시)에 경기도 의왕시 실거래가를 받아오는 지도를 자동화하여 사용하실 수 있습니다. 자신의 동네에 맞게 부동산 실거래가를 불러올 수 있고, 특정 조건에 따라 매매가가 5억 미만일 때 알림을 띄워준다던지, 동네 아파트 최저가와 최고가를 비교한다던지 다양한 응용과 분석이 가능할 것으로 보입니다.
조금만 더 생각해보면 많은 곳에 응용도 가능하니 파이썬 공부하시는 분들에게 많은 도움이 됐으면 하는 바람입니다.
오늘도 의미있는 하루 되시길 바랍니다.
감사합니다.
'IT > 파이썬' 카테고리의 다른 글
파이썬 지도 시각화 경기도 의왕시 인덕원 부동산 아파트 실거래가 매일 실시간 불러오기 작업 스케줄러 배치 예제 (0) | 2022.12.18 |
---|---|
파이참(PyCharm)에서 pandas dataframe run 실행 결과 전체 보이게 하기 (0) | 2022.12.14 |
파이참(PyCharm) Jetbrains 아나콘다와 연동하기 파이썬 개발 도구 (0) | 2022.12.10 |
아나콘다 32bit 가상환경 구축하기 (0) | 2022.12.10 |
아나콘다(Anaconda) 다운로드 및 설치하기 파이썬 패키지 프로그램 (0) | 2022.12.10 |
블로그의 정보
가슴이 웅장해지는 모든것
뱁새유니버스