구글드라이브 마운트하기
아래코드 실행하여 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()