뱁새유니버스

(최종) 2022년 경기도 의왕시 아파트 실시간 매매 실거래가와 인동선(인덕원 ~ 동탄선) 표기하기

by 뱁새유니버스

1. 개요

지금까지 경기도 의왕시를 기준으로 2022년 부동산 매매 실거래가와 인동선을 표기한 그림을 그려보았습니다.

결과는 아래와 같습니다. 

https://tistory1.daumcdn.net/tistory/5147139/skin/images/propertiesMap1.html

 

https://tistory1.daumcdn.net/tistory/5147139/skin/images/propertiesMap1.html

 

tistory1.daumcdn.net

순서대로 각 블로그 페이지마다 정리를 해두었으니 개발방법은 아래 내용을 확인하면서 하나씩 따라하시면 쉽게 구현이 가능합니다. 

 

2. 내용

(1) 공공데이터포털에서 부동산 실거래가 데이터 가져오기

공공데이터포털(data.go.kr)에서 부동산 실거래가 데이터를 가져올 수 있습니다.

https://idealist.tistory.com/58

 

국토교통부에서 부동산 실거래목록을 실시간으로 표시해보자! 파이썬 공공데이터포털 API 부동

1. 개요 파이썬으로 프로그램을 개발하는건 마치 레고 조립하는 것과 같습니다. 자동차를 만들고 싶으면 프레스 모듈, 차체BIW 모듈, 도장 모듈, 의장 모듈, 엔진 모듈 등을 import해서 개인용 자동

idealist.tistory.com

 

(2) 부동산 실거래가 지도에 마커로 표현하기 

그리고 아파트 위경도를 일일이 표기해준다음 각 위경도별 실거래가를 확인하는 마커를 만들어줍니다.

https://idealist.tistory.com/66

 

요즘 핫한 경기도 의왕시 아파트 부동산 실거래가 위도 경도 표기 맵핑 아파트 실거래가 보여주

1. 개요 지난 포스팅에 주소에 따라 위도와 경도를 불러오는 geopy 파이썬 모듈을 사용했습니다. 자동으로 불러와진다는 점에선 좋지만 아래 그림처럼 정확하지 않은 곳에 마커가 표기됐습니다.

idealist.tistory.com

 

(3) 지도에 인동선(인덕원역~동탄역) 선으로 표현하기 

인동선 경로도 만들어줍니다. 

https://idealist.tistory.com/61

 

파이썬 Python Folium으로 동탄인덕원선 인동선(인덕원~동탄선) 지도 시각화 그리기

1. 개요 파이썬을 통해 부동산 실거래가를 조회하다보니 folium으로 지하철 노선도 그릴 수 있지 않을까라는 생각이 들었습니다. 그래서 아래와 같이 그렸습니다. 나무위키를 보며 위경도를 찍어

idealist.tistory.com

부동산 실거래가를 마커로 만든 것과 인동선 경로를 만든 것을 서로 합쳐줍니다. 

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

 

파이썬 지도 시각화 경기도 의왕시 인덕원 부동산 아파트 실거래가 매일 실시간 불러오기 작업

1. 개요 지난 포스팅에서 아래와 같이 지도에서 위도경도를 정확히 한 경기도 의왕시 실거래가를 표현해봤습니다. 이번 시간엔 파이썬에서 만든 프로그램 파일명.py를 bat파일로 만들어 정해진

idealist.tistory.com

 

3. 마치며

위 단계들을 모두 진행하면 매일 특정시간(ex. 매일 오전 10시)에 경기도 의왕시 실거래가를 받아오는 지도를 자동화하여 사용하실 수 있습니다. 자신의 동네에 맞게 부동산 실거래가를 불러올 수 있고, 특정 조건에 따라 매매가가 5억 미만일 때 알림을 띄워준다던지, 동네 아파트 최저가와 최고가를 비교한다던지 다양한 응용과 분석이 가능할 것으로 보입니다. 

조금만 더 생각해보면 많은 곳에 응용도 가능하니 파이썬 공부하시는 분들에게 많은 도움이 됐으면 하는 바람입니다.

오늘도 의미있는 하루 되시길 바랍니다.

감사합니다.

반응형

블로그의 정보

가슴이 웅장해지는 모든것

뱁새유니버스

활동하기