뱁새유니버스

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

by 뱁새유니버스

1. 개요

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

그래서 이번 포스팅에선 위도와 경도를 정확하게 표기하여 지도에 마커를 표기하려고 합니다.

이번 포스팅에선....

아파트마다 위경도가 정확하게 보이죠? 만족스럽습니다. ㅎㅎㅎ


2. 내용

경기도 의왕시 2022년 부동산 실거래 아파트 위도 경도 찾기

 

경기도 의왕시를 기준으로 2022년 부동산 실거래가를 공공데이터포털로부터 가져오니 306개의 데이터가 불러와졌습니다. 스프레드 시트에서 UNIQUE함수를 써서 고유값만 걸러내니 총 74건이 추출이 됐습니다. 74개의 아파트에 대한 위도와 경도를 직접 입력했습니다. 

 

위도 경도 찾는 사이트

http://map.esran.com/

 

위도경도 찾기

위도경도 찾기, 미국기준 미세먼지 측정지도, IP 주소확인, 일출일몰 시간, 방문자 위치 분석, 설치 안내

map.esran.com

 

위도경도찾는 사이트에서 총 74개의 아파트에 위도 경도를 수작업으로 확인했습니다.(혹시 주소값을 갖고 위도, 경도를 정확하게 찍을 수 있는 방법이 있다면 알려주십시오 ㅠㅠ)

 

 

2022년 경기도 의왕시 실거래가를 dataframe에 저장하자

 

지난 포스팅과 같이 실거래가를 불러오고 다른 점이라면 202201~202212까지 12번 누적해서 df2에 저장합니다.

###2022년 1월부터 12월까지 경기도 의왕시 부동산 실거래가를 dataframe으로 표현한다.###
import requests
import xmltodict
import pandas as pd
import time

now=time

#주소입력시 법정동코드를 갖고 오는 함수
def get_addrCheck_cd(address):
    key = "공공데이터포탈API키값"
    url = "http://apis.data.go.kr/1741000/StanReginCd/getStanReginCdList"
    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(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
    key = "공공데이터포탈API키값"
    url = "http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade"
    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

df2의 결과값은 2022년 전체 의왕시 부동산 실거래가입니다.

 

그리고 나서 df3에 74개 아파트 위경도값을 저장합니다.

#df3에 74개 아파트 위경도 값을 저장한다.(미리 csv파일로 저장해두었다.)
df3 = pd.read_csv('apartmentLocation.csv', header=0, index_col=0) 
df3

 

생각보다 오래걸렸습니다. 아파트별 위경도값에 결과가 아래와 같이 나옵니다.

df4에 df2 아파트 실거래내역과 그에 매칭되는 df3 위경도 값을 merge 합니다.

inner join방식으로 아파트 이름이 같으면  맵핑하여 df2와 df3의 값이 연결됩니다.

#df4에 df2 아파트 실거래내역과 그에 매칭되는 위경도를 붙인다.
df4=pd.merge(df2, df3, on='아파트', how='inner')

#Dataframe만들기
prop_df = pd.DataFrame({'거래금액': df4['거래금액'],'거래유형':df4['거래유형'],'건축년도': df4['건축년도'],'년':df4['년'],
                        '법정동': df4['법정동'],'아파트':df4['아파트'], '월': df4['월'],'일':df4['일'],
                        '전용면적': df4['전용면적'],'중개사소재지':df4['중개사소재지'], '지번': df4['지번'],'지역코드':df4['지역코드'],
                        '층': df4['층'],'해제사유발생일':df4['해제사유발생일'], '해제여부': df4['해제여부'],
                        '위도':df4['위도'],'경도':df4['경도']})

display(prop_df)

 

결과를 보시면 이해가 쉬우실 겁니다.

2022년 의왕시 부동산 실거래 내역을 지도에 표기하기

 

지난 포스팅에 folium을 통해 map을 그려주는 건 동일합니다.

import folium
from folium.plugins import MarkerCluster

m = folium.Map(
  location=[37.38619010082862,126.98052156518638],
  zoom_start=16
)

#dataframe의 plot을 지도위에 표기하는 함수를 만들고자 한다.
def plot(df):
    # 리스트를 이용해 여러 행의 데이터를 위,경도로 묶음
    locations = list(zip(df3['위도'], df3['경도']))
    # 반복문을 이용해 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('거래금액 : '+df4['거래금액'],'거래유형 : '+df4['거래유형'],'건축년도 : '+df4['건축년도'],'년 : '+df4['년'],
                       '법정동 : '+df4['법정동'],'아파트 : '+df4['아파트'],'층 : '+df4['층'],'전용면적 : '+df4['전용면적'],
                       '월 : '+df4['월'],'일 : '+df4['일'],'중개사소재지 : '+df4['중개사소재지'],'지번 : '+df4['지번'],
                       '지역코드 : '+df4['지역코드'],'해제사유발생일 : '+df4['해제사유발생일'],'해제여부 : '+df4['해제여부']                                            
                      ))  
    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)

그러면 이렇게 정확하고 아름다운 부동산 실거래가를 확인하실 수 있습니다.

결과는 아래 링크에서 확인하실 수 있습니다.

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

 

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

 

tistory1.daumcdn.net

 


3. 마치며

위와 같이 부동산 실거래가를 불러와 지도상에 정확하게 표기할 수 있습니다.

 

생각보다 간단하네요. 

 

1. 우리동네 부동산 실거래가 공공데이터포털(data.go.kr)에서 받아오기

2. 정확한 위도 경도와 부동산 실거래데이터 연결하기

3. 하나로 만든 dataframe을 folium을 통해 지도에 마커로 표기하기

 

이외에도 html을 별도로 생성하지 않고 윈도우 작업 스케줄러(배치)를 만들어서 주기적으로 공공데이터포털로부터 데이터를 받아올 수 있습니다. folium에 bar chart, line graph 표기를 통해 아파트별 거래금액도 그래프로 보여줄 수 있구요!

 

하다보니까 정말 다양한 아이디어가 떠오릅니다. 요즘 같은 시대에 다양한 API들을 호출해서 자신에게 맞는 프로그램을 만드는 건 큰 경쟁력 중 하나인 것 같습니다. 

 

감사합니다. 이 글을 보는 모든 분들 오늘 하루도 의미있는 하루가 되길 바랍니다.

반응형

블로그의 정보

가슴이 웅장해지는 모든것

뱁새유니버스

활동하기