google colab 사용하여 google drive에 공공데이터 수집하기

Mar 8, 2019


구글드라이브 마운트하기

아래코드 실행하여 url에 접속하여 인증코드 입력하면 구글드라이브가 마운트된다

from google.colab import drive
drive.mount('/content/gdrive')

마운트할때 지정한 경로아래 My Drive/Colab Notebooks 폴더가 생성된다

# 구글드라이브 마운트 확인
ll /content/gdrive/"My Drive"/"Colab Notebooks"
total 52668
-rw------- 1 root    19049 Mar  8 00:29 colab_public01.ipynb
-rw------- 1 root   737715 Feb 25 01:44 KIKcd_B.20180122.xlsx
-rw------- 1 root    98634 Mar  7 08:34 korean_font_on_matplotlib.ipynb
-rw------- 1 root  7811072 Feb 27 04:10 real_trade2.db
-rw------- 1 root 45264896 Mar  7 08:31 real_trade.db

matplotlib를 사용하기 위해서는 한글폰트를 설치해야함

한글폰트 버전확인

#matplotlib 한글폰트 설치
%matplotlib inline  

import matplotlib as mpl  # 기본 설정 만지는 용도
import matplotlib.pyplot as plt  # 그래프 그리는 용도
import matplotlib.font_manager as fm  # 폰트 관련 용도

#버전 확인
print(mpl.__version__)
print(mpl.__file__)
print(mpl.get_configdir())
print(mpl.get_cachedir())

시스템에 설치된 폰트 확인 및 설치

#시스템에 설치된 폰트 확인
sys_font=fm.findSystemFonts()
print(f"sys_font number: {len(sys_font)}")
print(sys_font)

nanum_font = [f for f in sys_font if 'Nanum' in f]
print(f"nanum_font number: {len(nanum_font)}")
#나눔고딕 설치
!apt-get update -qq
!apt-get install fonts-nanum* -qq
# 체크해보면 폰트 개수가 늘어났다
sys_font=fm.findSystemFonts()
print(f"sys_font number: {len(sys_font)}")

nanum_font = [f for f in sys_font if 'Nanum' in f]
print(f"nanum_font number: {len(nanum_font)}")
#폰트확인
nanum_font

설치한 한글폰트 설정

# 현재 설정되어 있는 폰트 사이즈와 글꼴을 알아보자
!python --version
def current_font():
  print(f"설정 폰트 글꼴: {plt.rcParams['font.family']}, 설정 폰트 사이즈: {plt.rcParams['font.size']}")  # 파이썬 3.6 이상 사용가능하다
        
current_font()
#폰트설정
path = '/usr/share/fonts/truetype/nanum/NanumGothicEco.ttf'  # 설치된 나눔글꼴중 원하는 녀석의 전체 경로를 가져오자
font_name = fm.FontProperties(fname=path, size=10).get_name()
print(font_name)
plt.rc('font', family=font_name)
# fm._rebuild() 를 해주고
fm._rebuild()
# 마이너스기호 깨짐현상 해결
mpl.rcParams['axes.unicode_minus'] = False

공공데이터 수집

구글드라이브에 sqlite db 파일로 저장

#공공데이터 가져와서 구글드라이브에 저장
from urllib.request import urlopen
import pandas as pd
from bs4 import BeautifulSoup
import sqlite3
# from html_table_parser import parser_functions as parser
 
 
def collect_land(ym,lawd_cd):
 
    API_KEY = "<API키입력>"
    url="http://openapi.molit.go.kr/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTradeDev"
 
    url=url+"?LAWD_CD="+lawd_cd+"&DEAL_YMD="+ym+"&numOfRows=1000000"+"&serviceKey="+API_KEY
        
    resultXML = urlopen(url)
    result = resultXML.read()
    xmlsoup = BeautifulSoup(result, 'lxml-xml')
 
    te=xmlsoup.findAll("item")
    sil=pd.DataFrame()
    
    print(url)
    
    for t in te:
        try:        
          거래금액 = t.find("거래금액").text
          건축년도 = t.find("건축년도").text
           = t.find("년").text
          도로명 = t.find("도로명").text
          도로명건물본번호코드 = t.find("도로명건물본번호코드").text
          도로명건물부번호코드 = t.find("도로명건물부번호코드").text
          도로명시군구코드 = t.find("도로명시군구코드").text
          도로명코드 = t.find("도로명코드").text
          법정동 = t.find("법정동").text
          법정동본번코드 = t.find("법정동본번코드").text
          법정동부번코드 = t.find("법정동부번코드").text
          법정동시군구코드 = t.find("법정동시군구코드").text
          법정동읍면동코드 = t.find("법정동읍면동코드").text
          법정동지번코드 = t.find("법정동지번코드").text
          아파트 = t.find("아파트").text
           = t.find("월").text
           = t.find("일").text
          전용면적 = t.find("전용면적").text
          지역코드 = t.find("지역코드").text
           = t.find("층").text        
          지번 = t.find("지번").text
                
          temp = pd.DataFrame(([[
              거래금액
              ,건축년도
              ,
              ,도로명
              ,도로명건물본번호코드
              ,도로명건물부번호코드
              ,도로명시군구코드
              ,도로명코드
              ,법정동
              ,법정동본번코드 
              ,법정동부번코드 
              ,법정동시군구코드
              ,법정동읍면동코드
              ,법정동지번코드 
              ,아파트
              ,
              ,
              ,전용면적
              ,지번
              ,지역코드
              ,
          ]]),
                              columns=[
                                  "거래금액"
                                  ,"건축년도"
                                  ,"년"
                                  ,"도로명"
                                  ,"도로명건물본번호코드"
                                  ,"도로명건물부번호코드"
                                  ,"도로명시군구코드"
                                  ,"도로명코드"
                                  ,"법정동"
                                  ,"법정동본번코드"
                                  ,"법정동부번코드"
                                  ,"법정동시군구코드"
                                  ,"법정동읍면동코드"
                                  ,"법정동지번코드"
                                  ,"아파트"
                                  ,"월"
                                  ,"일"
                                  ,"전용면적"
                                  ,"지번"
                                  ,"지역코드"
                                  ,"층"
                              ])
          sil=pd.concat([sil,temp])

        except:
          pass
     
    sil=sil.reset_index(drop=True)
    
    return sil


def sqlite_append(sil_trade):
  con = sqlite3.connect("/content/gdrive/My Drive/Colab Notebooks/real_trade.db")

  sil_trade.to_sql('lent', con, if_exists='append', index=False)

  con.close()
  
  
if __name__=="__main__":
 

    # 지역코드 가져오기(아래주소에서 다운로드하여 구글드라이브에 저장)
    # https://www.mois.go.kr/frt/bbs/type001/commonSelectBoardArticle.do?bbsId=BBSMSTR_000000000052&nttId=61552


    code=pd.read_excel("/content/gdrive/My Drive/Colab Notebooks/KIKcd_B.20180122.xlsx")



    code_seo=code[(code["시도명"]=="경기도")] #| (code["시도명"]=="서울특별시")]

    code_seo = code_seo[code_seo["시군구명"].isnull() == False]

    code_seo = code_seo[code_seo["읍면동명"].isnull() == True]
    
    #code_seo = code_seo[code_seo["법정동코드"].astype(str).str[0:5] < "11140"]

    code_seo["ji_code"] = code_seo["법정동코드"].astype(str).str[0:5]



    


ym=list(["201801","201802","201803","201804","201805","201806","201807","201808","201809","201810","201811","201812","201901"])
# ym=list(["201812"])

for m in ym:
  
  for co in code_seo["ji_code"]:
    
    temp=collect_land(m,co)
    
    sil_trade=pd.DataFrame()    
    sil_trade=pd.concat([sil_trade,temp])
    sqlite_append(sil_trade)
    
    print(co+", "+str(len(temp))+" is compleded")
    
  print("*"+str(m)+" is completed")



sqlite에 적재된 데이터 확인하기

import sqlite3

# SQLite DB 연결
conn = sqlite3.connect("/content/gdrive/My Drive/Colab Notebooks/real_trade.db")
 
# Connection 으로부터 Cursor 생성
cur = conn.cursor()
 
data = cur.execute("select * from lent where 년='2018' and 월='1' and 지역코드 = '41111'")
     
names = list(map(lambda x: x[0], cur.description))
print(names)

# 데이타 Fetch
rows = cur.fetchall()
for row in rows:
    print(row)


# Connection 닫기
conn.close()


공공데이터 처리

sqlite 테이블 생성, 삭제 / 데이터 입력 삭제 조회

import sqlite3
import pandas as pd

# SQLite DB 연결
conn = sqlite3.connect("/content/gdrive/My Drive/Colab Notebooks/real_trade.db")
 
# Connection 으로부터 Cursor 생성
cur = conn.cursor()

#cur.execute("drop table new_lent;")
#cur.execute("create table new_lent as select distinct * from lent where 년='2018' and 월='1' and 지역코드 in ('41111','41113','41115');")

#cur.execute("delete from lent where 년='2018' and 월='1' and 지역코드 in ('41111','41113','41115');")
#cur.execute("insert into lent select * from new_lent where 년='2018' and 월='1' and 지역코드 in ('41111','41113','41115');")
 
# SQL 쿼리 실행
data = pd.read_sql("select * from lent where 년='2018' and 월='1' and 지역코드 in ('41111','41113','41115') order by 1", conn, index_col=None)  

print(data.shape[0])

#conn.rollback()
#conn.commit()

conn.close()
734

sqlite 파일 두개를 하나로 합치기

#sqlite 파일 두개를 하나로 합치기
import sqlite3
import pandas as pd

# SQLite DB 연결
conn = sqlite3.connect("/content/gdrive/My Drive/Colab Notebooks/real_trade.db")
conn2 = sqlite3.connect("/content/gdrive/My Drive/Colab Notebooks/real_trade2.db")
 
# Connection 으로부터 Cursor 생성
cur = conn.cursor()
cur2 = conn2.cursor()
 
# SQL 쿼리 실행
df = pd.read_sql("select * from lent", conn2, index_col=None)

df.to_sql('lent', conn, if_exists='append', index=False)

conn.close()
conn2.close()

Dataframe에서 조인하기

import sqlite3
import pandas as pd

# SQLite DB 연결
conn = sqlite3.connect("/content/gdrive/My Drive/Colab Notebooks/real_trade.db")
 
# Connection 으로부터 Cursor 생성
cur = conn.cursor()
 
# SQL 쿼리 실행
data = pd.read_sql("select * from lent", conn, index_col=None)   

code=pd.read_excel("/content/gdrive/My Drive/Colab Notebooks/KIKcd_B.20180122.xlsx")
#code=code.set_index('법정동코드')

#df = pd.merge(data, code, how='inner', on='법정동코드')
data.loc[:, '법정동코드'] = (data.loc[:,'법정동시군구코드']+data.loc[:,'법정동읍면동코드']).astype(int)

df = pd.merge(data, code, how='left', on='법정동코드')

#print(code.loc[1111010900])

#print(data)
#print(code)

#names = list(map(lambda x: x[0], cur.description))
#print(names)

# 데이타 Fetch
#rows = cur.fetchall()
#for row in rows:
#    print(row)



# Connection 닫기
conn.close()

공공데이터 분석

matplotlib를 사용하여 데이터 시각화

import matplotlib as mpl
import matplotlib.pylab as plt


x = pd.DataFrame(df.groupby('시군구명')['거래금액'].count())

#print(x)

x.plot()
plt.title("거래건수")
plt.xlabel('시군구명')
plt.subplots_adjust(0,0,10,3,1,1)
plt.show()