파이썬 공부를 위한 아나콘다 설치

Language/파이썬|2021. 7. 27. 21:02

아나콘다(Anaconda)를 사용하는 이유

파이썬은 인기가 많은 언어입니다. 저와는 인연이 없어서 사용할 일이 없었는데 요즘 인공지능에 대한 관심이 많아지고 회사에서도 파이썬을 이용하는 개발자분들이 증가하고 있어 저도 준비를 해야겠다는 생각에 파이썬 개발환경을 구축해 보고자 합니다. 인터넷 시용이 제한 되는 환경이라면 파이썬 패키지를 다운로드 받거나 업데이트는 진행할수 있습니다. 이때 사용할수 있는 방법이 인터넷이 되는 환경에서 아나콘다 의 conda 시스템을 통해서 패키지를 업데이트한후 전체를 압축한후 사용하면 인터넷 사용 제한에 따른 문제를 해결할수 있습니다. 이에 저는 아나콘다를 사용합니다.

아나콘다 설치

https://www.anaconda.com/products/individual#windows 에서 다운로드 버튼을 클릭하여 다운로드를 실행합니다.

 

다운로드 받은 파일을 실행하여 Next > Next 하여 설치를 진행합니다.

 

설치 완료후 Anaconda Navigator 아이콘을 클릭하여 아나콘다를 실행합니다.

 

실행화면에서 쥬피터 노트북을 선택합니다.

New 콤보박스를 선택하여 Python3을 실행합니다.

1+1 을 실행하여 결과를 확인합니다. 여기까지 하시면 아나콘다 설치 및 쥬피터 노트북 테스트가 완료되었습니다.

댓글()

파이썬(python) + 오픈 API(open api) 를 이용한 아파트 매매 실거래 가격 가져오기

Language/파이썬|2021. 7. 27. 20:12

파이썬(python) + 오픈 API(open api) 를 이용한 아파트 매매 실거래 가격 가져오기

공공데이터 open api 이용하기

공공데이터 포털 https://www.data.go.kr/ 라는 곳이 있습니다. 공공기관이 생성 또는 취득하여 관리하고 있는 공공데이터를 한 곳에서 제공하는 통합 창구 이며 국민이 쉽고편리하게 공공데이터를 이용할 수 있도록 파일데이터, 오픈API, 시각화 등 다양한 방식으로 제공하고 있으며, 누구라도 쉽고 편리한 검색을통해 원하는 공공데이터를 빠르고 정확하게 찾을 수 있는 곳입니다.

제가 오늘 이용하고자 하는 부동산 실거래 가격도 이곳에 등록되어 있습니다.

  • 공공데이터를 제공해주는 https://www.data.go.kr/ 접속합니다.
  • 회원 가입을 진행합니다.
  • 데이터 찾기에서 “아파트매매 실거래자료” 라고 입력하고 검색 아이콘을 클릭합니다.

  • 검색 결과에서 아래 내용을 선택합니다.

  • 해당 자료를 클릭하면 아래와 같은 정보를 확인할수 있습니다. 활용사례 탭을 클릭해보니 호갱노노 에서도 사용하고 있습니다. 제가 원하는 부동산 실거래 가격 이 맞네요 [활용신청] 버튼을 클릭하여 Api 신청을 진행합니다.

Api 신청이 완료되면 아래와 같이 마이페이지에에서 api 승인결과를 알수 있습니다

  • 아파트 매매 신고정보 조회 기술문서.hwp 파일을 열어서 api 사용하는 방법에 대해서 확인해 보겠습니다.

  • 상세기능 설명부분을 보시면 행정 표준코드 관리시스템 의 법정동 5자리와 계약년월 정보를 넘겨 데이터를 받는 구조입니다.

아래는 요청 메시지 명세서 입니다

  • 아래는 응답 메시지 명세서 입니다.

 

실제 데이터 가져오는 코드 작성

실제로 데이터를 가져오는 코드를 작성해보겠습니다.

import webbrowser

def getRTMSDataSvcAptTrade(LAWD_CD,DEAL_YMD,serviceKey): 
    url="http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade" 
    url=url+"?&LAWD_CD="+LAWD_CD
    url=url+"&DEAL_YMD="+DEAL_YMD
    url=url+"&serviceKey="+serviceKey
    webbrowser.open(url)
    return
    
getRTMSDataSvcAptTrade('11110','202001','일반 인증키를 입력해주세요')

위에 코드를 실행하면 아래와 같이 xml 데이터를 받을수 있습니다.

 

데이터 가공하기

가져온 데이터를 데이터 베이스화 하기 위해 BeautifulSoup,Pandas란 라이브러리를 사용하겠습니다. BeautifulSoup 은 HTML 및 XML 파일에서 원하는 데이터를 손쉽게 Parsing 할 수 있는 Python 라이브러리 이며 Pandas는 파이썬에서 사용하는 데이터분석 라이브러리로, 행과 열로 이루어진 데이터 객체를 만들어 다룰 수 있게 되며 보다 안정적으로 대용량의 데이터들을 처리하는데 매우 편리한 도구 입니다.

2개의 Python를 이용하여 xml을 파싱하고 데이터를 분석해보겠습니다.

아래 코드를 작성해 주세요.. 인증코드 부분은 자신이 받은 인증키를 넣어주세요.

 

from bs4 import BeautifulSoup
import pandas as pd
import urllib.request

req = urllib.request

def getRTMSDataSvcAptTrade(LAWD_CD,DEAL_YMD,serviceKey): 
    url="http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade" 
    url=url+"?&LAWD_CD="+LAWD_CD
    url=url+"&DEAL_YMD="+DEAL_YMD
    url=url+"&serviceKey="+serviceKey
    
    xml = req.urlopen(url)
    result = xml.read()
    soup = BeautifulSoup(result, 'lxml-xml')    
    
    items = soup.findAll("item")
    aptTrade = pd.DataFrame()
    
    for item in items:
        dealAmount          = item.find("거래금액").text
        buildYear           = item.find("건축년도").text
        dealYear            = item.find("년").text
        dong                = item.find("법정동").text
        apartmentName       = item.find("아파트").text
        dealMonth           = item.find("월").text
        dealDay             = item.find("일").text
        areaForExclusiveUse = item.find("전용면적").text
        jibun               = item.find("지번").text
        regionalCode        = item.find("지역코드").text
        floor               = item.find("층").text
        buildYear           = item.find("건축년도").text
        
        temp = pd.DataFrame(([[dealAmount,buildYear,dealYear,dong,apartmentName,dealMonth,dealDay,areaForExclusiveUse,jibun,regionalCode,floor,buildYear]]), columns=["dealAmount","buildYear","dealYear","dong","apartmentName","dealMonth","dealDay","areaForExclusiveUse","jibun","regionalCode","floor","buildYear"]) 
        aptTrade=pd.concat([aptTrade,temp])
    
    aptTrade=aptTrade.reset_index(drop=True)
    return aptTrade

getRTMSDataSvcAptTrade('11140','202006','인증코드')

실행결과는 아래와 같습니다. 원하는 데이터를 잘 가져왔습니다.

법정동 코드 데이터베이스화 하기

api에서 인자로 넘겨줘야 될 법정코드(LAWD_CD)이 값을 알아야 되는데요.. 이값은 api설명문서에 있는 http://code.go.kr 을 통해서 데이터를 확보하겠습니다. 해당 사이트에 접속한후 자주 이용하는 코드 부분의 2번항목 법정동 메뉴를 클릭합니다.

법정동코드 전체 다운로드 버튼을 클릭하세요

다운로드 파일을 열어보면 아래와 같은 문자열로 구성되어 있습니다.

법정동코드	법정동명	폐지여부
1100000000	서울특별시	존재
1111000000	서울특별시 종로구	존재
1111010100	서울특별시 종로구 청운동	존재
...

1~3 번째 row까지 지우고 아래와 같은 형태로 변경합니다. 이렇게 변경하는 이유는 텍스트파일을 읽어서 Pandas dataframe형태로 변경한후 sqllite에 손쉽게 데이터를 넣기 위함입니다.

dong_cd	do	si	my	ri	exyn
1111010100	서울특별시 종로구 청운동	존재
1111010200	서울특별시 종로구 신교동	존재
1111010300	서울특별시 종로구 궁정동	존재
1111010400	서울특별시 종로구 효자동	존재
1111010500	서울특별시 종로구 창성동	존재
1111010600	서울특별시 종로구 통의동	존재
1111010700	서울특별시 종로구 적선동	존재
1111010800	서울특별시 종로구 통인동	존재

파일명을 cd.txt로 바꾸고 쥬피터 노트북에서 python코드 작성중인 곳에 적당한 폴더에 위치합니다.

아래 파이썬 코드를 실행하면 conn.db에 dong이란 테이블이 만들어 집니다.

import pandas as pd
import sqlite3

con  = sqlite3.connect("files/conn.db")
df = pd.read_csv('files/cd.txt', sep = "\t", engine='python', encoding = "cp949")
df.to_sql('dong',con,schema=None,if_exists='replace',index=None,index_label=None, chunksize=None, dtype=None)
con.close()

sqlite db viewer로 테이블이 구조와 데이터를 확인합니다.

부동산 실거래 db 구축하기

아래와 같은 순서대로 코딩하겠습니다. 부동산 실거래 데이터가 언제부터 존재하는지 확인한 결과 2006년1월부터 데이터가 존재 했습니다. for문 사용해서 2006년 01월부터 2020년 07월 현재까지 모든 데이터를 가져오고 싶었지만 데이터량이 너무 많아서 데이터 베이스 구축할때 타임아웃이 발생하여 1년씩 데이터 베이스를 생성하겠습니다. 1년생성하고 또 1년생성하고 총 15번 정도 아래 코드를 실행하겠습니다. 아래 코드중 아래 4가지 변수값을 수정해서 데이터를 생성하시기 바랍니다.

sYear  = 2011
eYear  = 2011
sMonth = 1
eMonth = 12

코드 간단설명

  1. 법정동 정보 5자리를 distinct 해서 가져옵니다.
  2. 가져오고자 하는 년도를 입력합니다.
  3. 1~12월까지 데이터를 가져오도록 코드를 작성합니다.
import sqlite3
from bs4 import BeautifulSoup
import pandas as pd
import urllib.request

req = urllib.request

def getRTMSDataSvcAptTrade(LAWD_CD,DEAL_YMD,serviceKey): 
    url="http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade" 
    url=url+"?&LAWD_CD="+LAWD_CD
    url=url+"&DEAL_YMD="+DEAL_YMD
    url=url+"&serviceKey="+serviceKey
    
    xml = req.urlopen(url)
    result = xml.read()
    soup = BeautifulSoup(result, 'lxml-xml')    
    
    items = soup.findAll("item")
    aptTrade = pd.DataFrame()
    
    for item in items:
        dealAmount          = item.find("거래금액").text        
        dealYear            = item.find("년").text
        dong                = item.find("법정동").text
        apartmentName       = item.find("아파트").text
        dealMonth           = item.find("월").text
        dealDay             = item.find("일").text
        areaForExclusiveUse = item.find("전용면적").text
        regionalCode        = item.find("지역코드").text
        floor               = item.find("층").text
        
        try:
            jibun = item.find("지번").text
        except:
            jibun = ""
        
        try:
            buildYear = item.find("건축년도").text
        except:
            buildYear = ""
        
        temp = pd.DataFrame(([[dealAmount,buildYear,dealYear,dong,apartmentName,dealMonth,dealDay,areaForExclusiveUse,jibun,regionalCode,floor]]), columns=["dealAmount","buildYear","dealYear","dong","apartmentName","dealMonth","dealDay","areaForExclusiveUse","jibun","regionalCode","floor"]) 
            
        
        aptTrade=pd.concat([aptTrade,temp])
    
    aptTrade=aptTrade.reset_index(drop=True)
    return aptTrade


con  = sqlite3.connect("files/conn.db")
cursor = con.cursor()

sYear  = 2011
eYear  = 2011
sMonth = 1
eMonth = 12

rows = cursor.execute('''select distinct substr(dong_cd,0,6) from dong ''')
silTrade = pd.DataFrame()

for row in rows:    
    if row[0][2:3] != '0':
        for i in range(sYear, eYear+1, 1):
            for j in range(sMonth, eMonth+1, 1):
                yy = str(i)
                mm = str(j)
                if(j < 10): mm = '0' + str(j);

                temp = getRTMSDataSvcAptTrade(row[0],yy+mm,'인증키')
                silTrade = pd.concat([silTrade,temp])
silTrade.to_sql('sil_trade',con,if_exists='append',index=False)
    
con.close()

아래 sql을 실행하여 데이터 갯수를 확인합니다.

select count(*) from sil_trade where 1=1

'Language > 파이썬' 카테고리의 다른 글

파이썬 공부를 위한 아나콘다 설치  (0) 2021.07.27

댓글()