뱁새유니버스

python folium 경기도 의왕시 2022년 부동산 실거래가 조회 및 위경도 표기를 통한 아파트 마커 실시간 데이터 표기 파이썬 폴리엄

by 뱁새유니버스

1. 개요

경기도 의왕시 2022년 부동산 실거래가를 불러오고 folium을 통해 지도에 표현해보도록 하겠습니다. 

공공데이터포털에서 데이터를 가져오는 내용은 아래 페이지에서 자세히 확인하실 수 있습니다. 

https://idealist.tistory.com/58

 

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

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

idealist.tistory.com


2. 내용

2022년 12월 경기도 의왕시 실거래가 가져오기

 

아래 코드를 입력합니다. 공공데이터 포털에서 가져온 부동산실거래가를 데이터프레임 df에 넣는 코드입니다.

#거래연월을 합쳐 전체 부동산 실거래가를 dataframe으로 표현한다.
import requests
import xmltodict
import pandas as pd
import time

now=time

#get_addrCheck_cd : 지역을 입력하면 법정동코드를 반환해주는 함수다.
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


LAWD_CD = get_addrCheck_cd("경기도 의왕시")
DEAL_YMD = '202212'
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)

df​

그러면 df 변수에 아래와 같이 2022년 경기도 의왕시 실거래가 5건이 출력되는 것을 확인할 수 있습니다.

Geopy를 통해 위도 경도를 갖고 오고 데이터프레임에 넣어주자

 

geopy 라이브러리를 사용하기 위해선 <서울특별시 강동구 강일동 146> 이런 식으로 표기를 해야 합니다. 그래서 아래와 같이 변수 d에 경기도 의왕시 + 데이터프레임의 법정동 + 데이터프레임의 지번을 저장합니다. 

# 주소값을 변수d에 넣기
a = "경기도 의왕시"
b = df['법정동']
c = df['지번']


d = a+' '+b+' '+c
d

 

변수 d를 입력하면 아래와 같이 결과값이 출력됩니다.

그리고나서 변수 d를 갖고 geopy를 통해 위경도를 불러와 latitude와 longitude 리스트 변수에 차례대로 데이터를 넣었습니다. df 데이터프레임에 위도, 경도를 붙여 prop_df라는 신규 데이터프레임을 만들었습니다. 

###geopy를 사용해서 위도 경도 가져오기###
from geopy.geocoders import Nominatim
geo_local = Nominatim(user_agent='South Korea')

# 위도, 경도 반환하는 함수
def geocoding(c):
    try:
        geo = geo_local.geocode(c)
        x_y = [geo.latitude, geo.longitude]
        return x_y

    except:
        return [0,0]

#주소를 위,경도 값으로 변환하기
latitude = []
longitude =[]

for i in d:
    latitude.append(geocoding(i)[0])
    longitude.append(geocoding(i)[1])

#기존 Dataframe에 위도 경도를 추가한 신규 데이터프레임 만들기
prop_df = pd.DataFrame({'거래금액': df['거래금액'],'거래유형':df['거래유형'],'건축년도': df['건축년도'],'년':df['년'],
                        '법정동': df['법정동'],'아파트':df['아파트'], '월': df['월'],'일':df['일'],
                        '전용면적': df['전용면적'],'중개사소재지':df['중개사소재지'], '지번': df['지번'],'지역코드':df['지역코드'],
                        '층': df['층'],'해제사유발생일':df['해제사유발생일'], '해제여부': df['해제여부'],
                        '위도':latitude,'경도':longitude})

#prop_df 호출
prop_df
 

prop_df 데이터 프레임을 호출하면 결과값이 아래와 같습니다. 기존 데이터프레임에서 위도와 경도 컬럼이 추가된 것을 확인할 수 있습니다.

folium으로 부동산 실거래가 표기하기 

 
import folium
from folium.plugins import MarkerCluster

m = folium.Map(
  location=[37.396119,126.987702],
  zoom_start=16
)

#dataframe의 plot을 지도위에 표기하는 함수를 만들고자 한다.
def plot(df):
    # 리스트를 이용해 여러 행의 데이터를 위,경도로 묶음
    locations = list(zip(df['위도'], df['경도']))
    # 반복문을 이용해 locations로 정의한 변수에 해당하는 위치에 집(home) 모양의 빨간색 아이콘을 지정했다.
    icons = [folium.Icon(icon="home", prefix="fa", color="red") for _ in range(len(locations))]

    # 역시 같은 원리로 아이콘을 클릭했을 때, 팝업이 생성되게 할 예정인데, 먼저 팝업 안에 들어갈 내용을 지정한다.
    popup_content = []
   content = list(zip('거래금액 : '+df['거래금액'],'거래유형 : '+df['거래유형'],
                      '건축년도 : '+df['건축년도'],'년 : '+df['년'],
                      '법정동 : '+df['법정동'],'아파트 : '+df['아파트'],'층 : '+df['층'],
                      '전용면적 : '+df['전용면적'], '월 : '+df['월'],'일 : '+df['일'],
                      '중개사소재지 : '+df['중개사소재지'],'지번 : '+df['지번'], 
                      '지역코드 : '+df['지역코드'],'해제사유발생일 : '+df['해제사유발생일'],
                      '해제여부 : '+df['해제여부']                                            
                      )) 
   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 데이터프레임을 입력하여 맵에서 데이터가 나올 수 있도록 함수를 호출한다.
plot(prop_df)
# folium map인 m을 호출하면 된다.
m

folium을 통해 prop_df 데이터프레임을 plot하면 아래와 같은 결과값을 확인하실 수 있습니다.

 

지도에서 결과값을 확인하는 것은 아래 링크에서 확인해보시기 바랍니다~

https://tistory4.daumcdn.net/tistory/5147139/skin/images/properties_20221208.html

 

https://tistory4.daumcdn.net/tistory/5147139/skin/images/properties_20221208.html

 

tistory4.daumcdn.net


3. 마치며

이번 시간엔 경기도 의왕시 2022년 12월 아파트 실거래가를 불러와 위도 경도를 표기해주고 각 거래내역마다 folium map에 표기해주는 것까지해봤습니다. 근데 생각보다 위도경도 값이 주소와 정확하게 맵핑되지 않아 근처에 표기되는 현상이 있습니다. 다음 포스팅에는 정확한 위경도값으로 표기할 수 있는 방법이 있는지 찾아보고 포스팅해보도록하겠습니다.

 

감사합니다.

  

 

 

반응형

블로그의 정보

가슴이 웅장해지는 모든것

뱁새유니버스

활동하기