├── README.md ├── ch_01 ├── 101_python_package_data_collect.ipynb ├── 102_OPEN_API_이용해서_데이터_수집하기.ipynb ├── 103_urllib_crawling_fnguide.ipynb ├── 104_requests_module.py ├── 105_selenium_crawling.py ├── 106_sqlite_database.py ├── 107_mysql_db.py ├── 108_collect_stock_data.py └── a ├── ch_02 ├── 201_pandas_packages.ipynb ├── 202_seaborn_이용하기.ipynb ├── 203_plotly이용하기.zip ├── 204_dash_html.py ├── 205_dash_markdown.py ├── 206_dash_real_estate.py ├── 207_dash_real_estate_callback.py └── a ├── ch_03 ├── 301_인구통계_시각화.ipynb ├── 302_currency_stock_real.py ├── 303_base_interest_rates.py ├── 304_dashboard.py ├── 305_real_estate_lent_ratio.py ├── 306_gang_nam_time.py ├── 307_dividend.py ├── 307_stock_div_ana.ipynb └── a └── 소스코드.zip /README.md: -------------------------------------------------------------------------------- 1 | # 금융 데이터를 위한 파이썬 2 | 3 | - 부제: 부동산&주식 데이터 수집·분석·활용까지 4 | - 저자: 테리엇 5 | - 출간일: 2020년 6월 26일 6 | - 정가: 24,000원 7 | - 페이지: 288 8 | 9 | ## 구매 링크 10 | 11 | - [yes24](http://www.yes24.com/Product/Goods/90593157?scode=032&OzSrank=1) 12 | - [교보문고](http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791190014984&orderClick=LAG&Kc=) 13 | - [알라딘](https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=242925880) 14 | - [인터파크](http://book.interpark.com/product/BookDisplay.do?_method=detail&sc.shopNo=0000400000&sc.prdNo=333468455&sc.saNo=003002001&bid1=search&bid2=product&bid3=img&bid4=001) 15 | 16 | ![금융_표지입체](https://user-images.githubusercontent.com/21074282/84962614-39914100-b142-11ea-995c-301db3f95022.jpg) 17 | 18 | ## 책 소개 19 | 20 | 데이터 수집 · 분석 · 활용을 위한 최적의 도구, 21 | ‘파이썬’으로 정복하는 금융 데이터! 22 | 23 | 파이썬은 문법이 쉽고 이미 개발된 다양한 패키지가 있는, 가장 적은 노력으로 큰 효과를 볼 수 있는 프로그래밍 언어이다. 이 책은 파이썬으로 비전문가가 금융 데이터를 ‘쉽고’, ‘빠르게’ 수집 · 분석 · 활용할 수 있는 방법을 소개한다. 또한 부동산, 주식 투자, 재무제표 등 실생활에 적용 가능한 금융 관련 소재를 다뤄 누구나 쉽고 흥미롭게 접근 가능하다. 더 나아가 이 책에서 소개하는 방법을 통해 다른 영역의 데이터 역시 활용할 수 있도록 저자의 경험과 노하우를 제공한다. 24 | 25 | 데이터를 수집하고 분석하는 일은 더 이상 전문가의 영역이 아니다. 이미 많이 공개되어 있는 금융 데이터와 이 책을 활용하여 금융 데이터를 수집 · 분석 · 활용하는 것의 유용성을 깨닫고 투자까지 연결하는 등 데이터를 효율적으로 다룰 수 있게 되기를 바란다. 26 | 27 | ## 이 책의 특징 28 | 29 | - 파이썬을 이용하여 데이터를 수집하고 분석하는 방법을 이해할 수 있다. 30 | - 데이터 분석 및 프레젠테이션을 위한 시각화 기법을 다룬다. 31 | - 금융 데이터를 활용하는 노하우가 담겨 있다. 32 | 33 | ## 이 책이 필요한 독자 34 | 35 | - 실생활에 파이썬을 적용하는 것에 관심이 있는 분 36 | - 데이터를 수집하고 분석하고자 하는 학생과 직장인 37 | - 데이터를 효율적으로 활용하는 방법이 궁금한 분 38 | 39 | ## 목차 40 | 41 | Chapter1. 금융 데이터 수집하기 42 | 1.1 파이썬 패키지를 이용하여 데이터 수집하기 43 | 1.2 OPEN API를 이용하여 데이터 수집하기 44 | 1.3 웹 크롤링을 이용하여 데이터 수집하기 45 | 1.4 수집한 데이터 저장하기 46 | 1.5 실제 데이터를 수집해 보자 47 | 48 | Chapter2. 금융 데이터 분석하기 49 | 2.1 데이터 정리하기 50 | 2.2 데이터 시각화 및 분석하기 51 | 2.3 데이터 프레젠테이션하기 52 | 2.4 dash 웹 대시보드 만들기 53 | 54 | Chapter3. 금융 데이터 활용하기 55 | 3.1 인구 통계 시각화하기 56 | 3.2 유동성과 주가, 부동산 가격 비교하기 57 | 3.3 주요 각국의 기준금리 비교하기 58 | 3.4 금융 대시보드 만들기 59 | 3.5 매매가 대비 전세가 높은 아파트 찾아보기 60 | 3.6 강남역에서 가까운 아파트 찾아보기 61 | 62 | 63 | ## 출판사 리뷰 64 | 개개인이 금융 데이터를 수집하는 것이 어려웠던 과거와는 달리, 이제는 누구나 공개된 금융 데이터를 수집하고, 분석 및 활용할 수 있게 되었다. 이런 데이터를 수집・활용하는 방법은 여러 가지가 있지만 쉬운 문법과 다양한 패키지가 있는 파이썬을 이용하는 것이 가장 효율적이다. 65 | 66 | 본 도서는 비전문가가 파이썬으로 금융 관련 데이터를 수집하고 분석 및 자동화하는 방안에 대해 다룬다. 주식, 부동산, 금융 분야 등 재테크에 관심이 있는 독자뿐만 아니라, 데이터 분석에 관심이 있지만 어떻게 시작해야 할지 모르는 독자도 이 책을 통해 데이터를 수집, 분석 및 자동화하기까지의 전체 프로젝트를 경험할 수 있다. 그리고 금융 데이터를 분석하고 시각화함으로써 경제를 잘 이해할 수 있으며 투자에까지 연결할 수 있다. 책을 다 읽은 독자라면 금융 데이터 외에 자신이 관심 있는 분야의 데이터까지 직접 분석하고 활용할 수 있을 것이다. 67 | -------------------------------------------------------------------------------- /ch_01/102_OPEN_API_이용해서_데이터_수집하기.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 13, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "from urllib.request import urlopen\n", 10 | "\n", 11 | "API_KEY = \"부여받은 인증키를 입력합니다\"\n", 12 | "LAWD_CD = \"11110\"\n", 13 | "DEAL_YMD = \"201512\"\n", 14 | "\n", 15 | "url = \"http://openapi.molit.go.kr/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcNrgTrade?serviceKey={}&LAWD_CD={}&DEAL_YMD={}\".format(API_KEY,LAWD_CD,DEAL_YMD)\n", 16 | "result = urlopen(url)" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 14, 22 | "metadata": {}, 23 | "outputs": [ 24 | { 25 | "name": "stdout", 26 | "output_type": "stream", 27 | "text": [ 28 | "b'
00NORMAL SERVICE.
<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>120,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>395<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c2\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>2001<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81>160.64<\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xed\\x9a\\xa8\\xec\\x9e\\x90\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\xa0\\x9c2\\xec\\xa2\\x85\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\xa3\\xbc\\xea\\xb1\\xb0<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\x9d\\xbc\\xeb\\xb0\\x98<\\xec\\x9d\\xbc>31<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>483,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>937<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c2\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1990<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81>503.5<\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\xb2\\xb4\\xeb\\xb6\\x80\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\xa0\\x9c2\\xec\\xa2\\x85\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\xa3\\xbc\\xea\\xb1\\xb0<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\x9d\\xbc\\xeb\\xb0\\x98<\\xec\\x9d\\xbc>15<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>22,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>31<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xed\\x8c\\x90\\xeb\\xa7\\xa4<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>2007<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81> <\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\xa2\\x85\\xeb\\xa1\\x9c1\\xea\\xb0\\x80<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\xa7\\x91\\xed\\x95\\xa9<\\xec\\x9d\\xbc>10<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xec\\xb8\\xb5>-1<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>158,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>276<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\x88\\x99\\xeb\\xb0\\x95<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1959<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81>72.8<\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\x99\\x80\\xeb\\xa3\\xa1\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\x9d\\xbc\\xeb\\xb0\\x98<\\xec\\x9d\\xbc>8<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>158,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>276<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\x88\\x99\\xeb\\xb0\\x95<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1959<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81>72.8<\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\x99\\x80\\xeb\\xa3\\xa1\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\x9d\\xbc\\xeb\\xb0\\x98<\\xec\\x9d\\xbc>8<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>247,500<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>154<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c2\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1976<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81>105.8<\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\x82\\xbc\\xec\\xb2\\xad\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\xa0\\x9c1\\xec\\xa2\\x85\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\xa3\\xbc\\xea\\xb1\\xb0<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\x9d\\xbc\\xeb\\xb0\\x98<\\xec\\x9d\\xbc>21<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>160,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>79<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c1\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81>178.5<\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\x82\\xbc\\xec\\xb2\\xad\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\xa0\\x9c1\\xec\\xa2\\x85\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\xa3\\xbc\\xea\\xb1\\xb0<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\x9d\\xbc\\xeb\\xb0\\x98<\\xec\\x9d\\xbc>29<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>174,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>323<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c2\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1976<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81>191.7<\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xeb\\xb4\\x89\\xec\\x9d\\xb5\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\x9d\\xbc\\xeb\\xb0\\x98<\\xec\\x9d\\xbc>28<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>162,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>201<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c2\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1961<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81>112.5<\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\x9d\\xb8\\xec\\x9d\\x98\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\x9d\\xbc\\xeb\\xb0\\x98<\\xec\\x9d\\xbc>3<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>14,700<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>9<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c2\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81> <\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\x98\\x88\\xec\\xa7\\x80\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\xa7\\x91\\xed\\x95\\xa9<\\xec\\x9d\\xbc>18<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>420,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>1073<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c1\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1964<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81>81<\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\xa2\\x85\\xeb\\xa1\\x9c5\\xea\\xb0\\x80<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\x9d\\xbc\\xeb\\xb0\\x98<\\xec\\x9d\\xbc>23<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>63,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>10<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xed\\x8c\\x90\\xeb\\xa7\\xa4<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81> <\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\xa2\\x85\\xeb\\xa1\\x9c6\\xea\\xb0\\x80<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\xa7\\x91\\xed\\x95\\xa9<\\xec\\x9d\\xbc>1<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xec\\xb8\\xb5>31<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>80,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>10<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xed\\x8c\\x90\\xeb\\xa7\\xa4<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81> <\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\xa2\\x85\\xeb\\xa1\\x9c6\\xea\\xb0\\x80<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\xa7\\x91\\xed\\x95\\xa9<\\xec\\x9d\\xbc>7<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xec\\xb8\\xb5>30<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>75,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>12<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xed\\x8c\\x90\\xeb\\xa7\\xa4<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81> <\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\xa2\\x85\\xeb\\xa1\\x9c6\\xea\\xb0\\x80<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\xa7\\x91\\xed\\x95\\xa9<\\xec\\x9d\\xbc>16<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xec\\xb8\\xb5>31<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>138,700<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>270<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c1\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81>77.3<\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xeb\\xaa\\x85\\xeb\\xa5\\x9c2\\xea\\xb0\\x80<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\x9d\\xbc\\xeb\\xb0\\x98<\\xec\\x9d\\xbc>19<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>100,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>68<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c2\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81>73<\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xeb\\xaa\\x85\\xeb\\xa5\\x9c2\\xea\\xb0\\x80<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\xa0\\x9c2\\xec\\xa2\\x85\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\xa3\\xbc\\xea\\xb1\\xb0<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\x9d\\xbc\\xeb\\xb0\\x98<\\xec\\x9d\\xbc>21<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>79,500<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>41<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c2\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81>98.2<\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\xb0\\xbd\\xec\\x8b\\xa0\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\x9d\\xbc\\xeb\\xb0\\x98<\\xec\\x9d\\xbc>7<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>16,500<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>8<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xed\\x8c\\x90\\xeb\\xa7\\xa4<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1997<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81> <\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\xb0\\xbd\\xec\\x8b\\xa0\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\xa7\\x91\\xed\\x95\\xa9<\\xec\\x9d\\xbc>10<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xec\\xb8\\xb5>2<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>12,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>35<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c2\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1997<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81> <\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\xb0\\xbd\\xec\\x8b\\xa0\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\xa7\\x91\\xed\\x95\\xa9<\\xec\\x9d\\xbc>16<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>1,700<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>9<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xed\\x8c\\x90\\xeb\\xa7\\xa4<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1993<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81> <\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\xb0\\xbd\\xec\\x8b\\xa0\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\xa0\\x9c3\\xec\\xa2\\x85\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\xa3\\xbc\\xea\\xb1\\xb0<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\xa7\\x91\\xed\\x95\\xa9<\\xec\\x9d\\xbc>17<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>1,700<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>9<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xed\\x8c\\x90\\xeb\\xa7\\xa4<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1993<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81> <\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\xb0\\xbd\\xec\\x8b\\xa0\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\xa0\\x9c3\\xec\\xa2\\x85\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\xa3\\xbc\\xea\\xb1\\xb0<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\xa7\\x91\\xed\\x95\\xa9<\\xec\\x9d\\xbc>17<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>10,800<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>33<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xea\\xb5\\x90\\xec\\x9c\\xa1\\xec\\x97\\xb0\\xea\\xb5\\xac<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1997<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81> <\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\xb0\\xbd\\xec\\x8b\\xa0\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\xa7\\x91\\xed\\x95\\xa9<\\xec\\x9d\\xbc>21<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>9,180<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>29<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xea\\xb5\\x90\\xec\\x9c\\xa1\\xec\\x97\\xb0\\xea\\xb5\\xac<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1997<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81> <\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\xb0\\xbd\\xec\\x8b\\xa0\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\xa7\\x91\\xed\\x95\\xa9<\\xec\\x9d\\xbc>21<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xec\\xb8\\xb5>9<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>9,180<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>30<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\x97\\x85\\xeb\\xac\\xb4<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1997<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81> <\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\xb0\\xbd\\xec\\x8b\\xa0\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\xa7\\x91\\xed\\x95\\xa9<\\xec\\x9d\\xbc>21<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>10,800<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>35<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\x97\\x85\\xeb\\xac\\xb4<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1997<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81> <\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\xb0\\xbd\\xec\\x8b\\xa0\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\xa7\\x91\\xed\\x95\\xa9<\\xec\\x9d\\xbc>21<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xec\\xb8\\xb5>10<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>95,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>348<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c1\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1990<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81>166.3<\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\xb0\\xbd\\xec\\x8b\\xa0\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\xa0\\x9c3\\xec\\xa2\\x85\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\xa3\\xbc\\xea\\xb1\\xb0<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\x9d\\xbc\\xeb\\xb0\\x98<\\xec\\x9d\\xbc>23<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>15,500<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>56<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c2\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1996<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81> <\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\xb0\\xbd\\xec\\x8b\\xa0\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\xa0\\x9c2\\xec\\xa2\\x85\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\xa3\\xbc\\xea\\xb1\\xb0<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\xa7\\x91\\xed\\x95\\xa9<\\xec\\x9d\\xbc>30<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xec\\xb8\\xb5>-1<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>233,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>945<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\x88\\x99\\xeb\\xb0\\x95<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1975<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81>297.5<\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\x88\\xad\\xec\\x9d\\xb8\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\xa4\\x80\\xec\\xa3\\xbc\\xea\\xb1\\xb0<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\x9d\\xbc\\xeb\\xb0\\x98<\\xec\\x9d\\xbc>15<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>12,250<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>59<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c1\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>2015<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81> <\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\x88\\xad\\xec\\x9d\\xb8\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\xa0\\x9c2\\xec\\xa2\\x85\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\xa3\\xbc\\xea\\xb1\\xb0<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\xa7\\x91\\xed\\x95\\xa9<\\xec\\x9d\\xbc>18<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>30,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>25<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c2\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>2013<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81> <\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\x88\\xad\\xec\\x9d\\xb8\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\xa7\\x91\\xed\\x95\\xa9<\\xec\\x9d\\xbc>23<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>14,500<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>54<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c1\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>2015<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81> <\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xec\\x88\\xad\\xec\\x9d\\xb8\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\xa0\\x9c2\\xec\\xa2\\x85\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\xa3\\xbc\\xea\\xb1\\xb0<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\xa7\\x91\\xed\\x95\\xa9<\\xec\\x9d\\xbc>30<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>2,800,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>1878<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c2\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1953<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81>964<\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xed\\x8f\\x89\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\x9d\\xbc\\xeb\\xb0\\x98<\\xec\\x9d\\xbc>11<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>2,639,010<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>2346<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\x97\\x85\\xeb\\xac\\xb4<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1986<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81>872.4<\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xed\\x8f\\x89\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\x83\\x81\\xec\\x97\\x85<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\x9d\\xbc\\xeb\\xb0\\x98<\\xec\\x9d\\xbc>11<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>128,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>221<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c1\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1988<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81>239<\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xed\\x8f\\x89\\xec\\xb0\\xbd\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\xa0\\x9c1\\xec\\xa2\\x85\\xec\\xa0\\x84\\xec\\x9a\\xa9\\xec\\xa3\\xbc\\xea\\xb1\\xb0<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\x9d\\xbc\\xeb\\xb0\\x98<\\xec\\x9d\\xbc>14<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>11110<\\xea\\xb1\\xb0\\xeb\\x9e\\x98\\xea\\xb8\\x88\\xec\\x95\\xa1>192,000<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xeb\\xa9\\xb4\\xec\\xa0\\x81>587<\\xea\\xb1\\xb4\\xeb\\xac\\xbc\\xec\\xa3\\xbc\\xec\\x9a\\xa9\\xeb\\x8f\\x84>\\xec\\xa0\\x9c1\\xec\\xa2\\x85\\xea\\xb7\\xbc\\xeb\\xa6\\xb0\\xec\\x83\\x9d\\xed\\x99\\x9c<\\xea\\xb1\\xb4\\xec\\xb6\\x95\\xeb\\x85\\x84\\xeb\\x8f\\x84>1986<\\xeb\\x85\\x84>2015<\\xeb\\x8c\\x80\\xec\\xa7\\x80\\xeb\\xa9\\xb4\\xec\\xa0\\x81>438<\\xeb\\xb2\\x95\\xec\\xa0\\x95\\xeb\\x8f\\x99> \\xed\\x99\\x8d\\xec\\xa7\\x80\\xeb\\x8f\\x99<\\xec\\x8b\\x9c\\xea\\xb5\\xb0\\xea\\xb5\\xac>\\xec\\xa2\\x85\\xeb\\xa1\\x9c\\xea\\xb5\\xac<\\xec\\x9a\\xa9\\xeb\\x8f\\x84\\xec\\xa7\\x80\\xec\\x97\\xad>\\xec\\xa0\\x9c1\\xec\\xa2\\x85\\xec\\x9d\\xbc\\xeb\\xb0\\x98\\xec\\xa3\\xbc\\xea\\xb1\\xb0<\\xec\\x9b\\x94>12<\\xec\\x9c\\xa0\\xed\\x98\\x95>\\xec\\x9d\\xbc\\xeb\\xb0\\x98<\\xec\\x9d\\xbc>21<\\xec\\xa7\\x80\\xec\\x97\\xad\\xec\\xbd\\x94\\xeb\\x93\\x9c>1111010135
'\n" 29 | ] 30 | } 31 | ], 32 | "source": [ 33 | "xml = result.read()\n", 34 | "print(xml)" 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 17, 40 | "metadata": {}, 41 | "outputs": [ 42 | { 43 | "name": "stdout", 44 | "output_type": "stream", 45 | "text": [ 46 | "\n", 47 | "
00NORMAL SERVICE.
<거래금액>120,000<건물면적>395<건물주용도>제2종근린생활<건축년도>2001<년>2015<대지면적>160.64<법정동> 효자동<시군구>종로구<용도지역>제2종일반주거<월>12<유형>일반<일>31<지역코드>11110<거래금액>483,000<건물면적>937<건물주용도>제2종근린생활<건축년도>1990<년>2015<대지면적>503.5<법정동> 체부동<시군구>종로구<용도지역>제2종일반주거<월>12<유형>일반<일>15<지역코드>11110<거래금액>22,000<건물면적>31<건물주용도>판매<건축년도>2007<년>2015<대지면적> <법정동> 종로1가<시군구>종로구<용도지역>일반상업<월>12<유형>집합<일>10<지역코드>11110<층>-1<거래금액>158,000<건물면적>276<건물주용도>숙박<건축년도>1959<년>2015<대지면적>72.8<법정동> 와룡동<시군구>종로구<용도지역>일반상업<월>12<유형>일반<일>8<지역코드>11110<거래금액>158,000<건물면적>276<건물주용도>숙박<건축년도>1959<년>2015<대지면적>72.8<법정동> 와룡동<시군구>종로구<용도지역>일반상업<월>12<유형>일반<일>8<지역코드>11110<거래금액>247,500<건물면적>154<건물주용도>제2종근린생활<건축년도>1976<년>2015<대지면적>105.8<법정동> 삼청동<시군구>종로구<용도지역>제1종일반주거<월>12<유형>일반<일>21<지역코드>11110<거래금액>160,000<건물면적>79<건물주용도>제1종근린생활<년>2015<대지면적>178.5<법정동> 삼청동<시군구>종로구<용도지역>제1종일반주거<월>12<유형>일반<일>29<지역코드>11110<거래금액>174,000<건물면적>323<건물주용도>제2종근린생활<건축년도>1976<년>2015<대지면적>191.7<법정동> 봉익동<시군구>종로구<용도지역>일반상업<월>12<유형>일반<일>28<지역코드>11110<거래금액>162,000<건물면적>201<건물주용도>제2종근린생활<건축년도>1961<년>2015<대지면적>112.5<법정동> 인의동<시군구>종로구<용도지역>일반상업<월>12<유형>일반<일>3<지역코드>11110<거래금액>14,700<건물면적>9<건물주용도>제2종근린생활<년>2015<대지면적> <법정동> 예지동<시군구>종로구<용도지역>일반상업<월>12<유형>집합<일>18<지역코드>11110<거래금액>420,000<건물면적>1073<건물주용도>제1종근린생활<건축년도>1964<년>2015<대지면적>81<법정동> 종로5가<시군구>종로구<용도지역>일반상업<월>12<유형>일반<일>23<지역코드>11110<거래금액>63,000<건물면적>10<건물주용도>판매<년>2015<대지면적> <법정동> 종로6가<시군구>종로구<용도지역>일반상업<월>12<유형>집합<일>1<지역코드>11110<층>31<거래금액>80,000<건물면적>10<건물주용도>판매<년>2015<대지면적> <법정동> 종로6가<시군구>종로구<용도지역>일반상업<월>12<유형>집합<일>7<지역코드>11110<층>30<거래금액>75,000<건물면적>12<건물주용도>판매<년>2015<대지면적> <법정동> 종로6가<시군구>종로구<용도지역>일반상업<월>12<유형>집합<일>16<지역코드>11110<층>31<거래금액>138,700<건물면적>270<건물주용도>제1종근린생활<년>2015<대지면적>77.3<법정동> 명륜2가<시군구>종로구<용도지역>일반상업<월>12<유형>일반<일>19<지역코드>11110<거래금액>100,000<건물면적>68<건물주용도>제2종근린생활<년>2015<대지면적>73<법정동> 명륜2가<시군구>종로구<용도지역>제2종일반주거<월>12<유형>일반<일>21<지역코드>11110<거래금액>79,500<건물면적>41<건물주용도>제2종근린생활<년>2015<대지면적>98.2<법정동> 창신동<시군구>종로구<용도지역>일반상업<월>12<유형>일반<일>7<지역코드>11110<거래금액>16,500<건물면적>8<건물주용도>판매<건축년도>1997<년>2015<대지면적> <법정동> 창신동<시군구>종로구<용도지역>일반상업<월>12<유형>집합<일>10<지역코드>11110<층>2<거래금액>12,000<건물면적>35<건물주용도>제2종근린생활<건축년도>1997<년>2015<대지면적> <법정동> 창신동<시군구>종로구<용도지역>일반상업<월>12<유형>집합<일>16<지역코드>11110<거래금액>1,700<건물면적>9<건물주용도>판매<건축년도>1993<년>2015<대지면적> <법정동> 창신동<시군구>종로구<용도지역>제3종일반주거<월>12<유형>집합<일>17<지역코드>11110<거래금액>1,700<건물면적>9<건물주용도>판매<건축년도>1993<년>2015<대지면적> <법정동> 창신동<시군구>종로구<용도지역>제3종일반주거<월>12<유형>집합<일>17<지역코드>11110<거래금액>10,800<건물면적>33<건물주용도>교육연구<건축년도>1997<년>2015<대지면적> <법정동> 창신동<시군구>종로구<용도지역>일반상업<월>12<유형>집합<일>21<지역코드>11110<거래금액>9,180<건물면적>29<건물주용도>교육연구<건축년도>1997<년>2015<대지면적> <법정동> 창신동<시군구>종로구<용도지역>일반상업<월>12<유형>집합<일>21<지역코드>11110<층>9<거래금액>9,180<건물면적>30<건물주용도>업무<건축년도>1997<년>2015<대지면적> <법정동> 창신동<시군구>종로구<용도지역>일반상업<월>12<유형>집합<일>21<지역코드>11110<거래금액>10,800<건물면적>35<건물주용도>업무<건축년도>1997<년>2015<대지면적> <법정동> 창신동<시군구>종로구<용도지역>일반상업<월>12<유형>집합<일>21<지역코드>11110<층>10<거래금액>95,000<건물면적>348<건물주용도>제1종근린생활<건축년도>1990<년>2015<대지면적>166.3<법정동> 창신동<시군구>종로구<용도지역>제3종일반주거<월>12<유형>일반<일>23<지역코드>11110<거래금액>15,500<건물면적>56<건물주용도>제2종근린생활<건축년도>1996<년>2015<대지면적> <법정동> 창신동<시군구>종로구<용도지역>제2종일반주거<월>12<유형>집합<일>30<지역코드>11110<층>-1<거래금액>233,000<건물면적>945<건물주용도>숙박<건축년도>1975<년>2015<대지면적>297.5<법정동> 숭인동<시군구>종로구<용도지역>준주거<월>12<유형>일반<일>15<지역코드>11110<거래금액>12,250<건물면적>59<건물주용도>제1종근린생활<건축년도>2015<년>2015<대지면적> <법정동> 숭인동<시군구>종로구<용도지역>제2종일반주거<월>12<유형>집합<일>18<지역코드>11110<거래금액>30,000<건물면적>25<건물주용도>제2종근린생활<건축년도>2013<년>2015<대지면적> <법정동> 숭인동<시군구>종로구<용도지역>일반상업<월>12<유형>집합<일>23<지역코드>11110<거래금액>14,500<건물면적>54<건물주용도>제1종근린생활<건축년도>2015<년>2015<대지면적> <법정동> 숭인동<시군구>종로구<용도지역>제2종일반주거<월>12<유형>집합<일>30<지역코드>11110<거래금액>2,800,000<건물면적>1878<건물주용도>제2종근린생활<건축년도>1953<년>2015<대지면적>964<법정동> 평동<시군구>종로구<용도지역>일반상업<월>12<유형>일반<일>11<지역코드>11110<거래금액>2,639,010<건물면적>2346<건물주용도>업무<건축년도>1986<년>2015<대지면적>872.4<법정동> 평동<시군구>종로구<용도지역>일반상업<월>12<유형>일반<일>11<지역코드>11110<거래금액>128,000<건물면적>221<건물주용도>제1종근린생활<건축년도>1988<년>2015<대지면적>239<법정동> 평창동<시군구>종로구<용도지역>제1종전용주거<월>12<유형>일반<일>14<지역코드>11110<거래금액>192,000<건물면적>587<건물주용도>제1종근린생활<건축년도>1986<년>2015<대지면적>438<법정동> 홍지동<시군구>종로구<용도지역>제1종일반주거<월>12<유형>일반<일>21<지역코드>1111010135
\n" 48 | ] 49 | } 50 | ], 51 | "source": [ 52 | "from bs4 import BeautifulSoup\n", 53 | "\n", 54 | "xmlsoup = BeautifulSoup(xml, 'lxml-xml')\n", 55 | "print(xmlsoup)" 56 | ] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": 21, 61 | "metadata": {}, 62 | "outputs": [ 63 | { 64 | "data": { 65 | "text/plain": [ 66 | "35" 67 | ] 68 | }, 69 | "execution_count": 21, 70 | "metadata": {}, 71 | "output_type": "execute_result" 72 | } 73 | ], 74 | "source": [ 75 | "xml_item = xmlsoup.findAll(\"item\")\n", 76 | "len(xml_item)" 77 | ] 78 | }, 79 | { 80 | "cell_type": "code", 81 | "execution_count": 67, 82 | "metadata": {}, 83 | "outputs": [ 84 | { 85 | "name": "stderr", 86 | "output_type": "stream", 87 | "text": [ 88 | "100%|██████████| 35/35 [00:00<00:00, 1635.21it/s]\n" 89 | ] 90 | }, 91 | { 92 | "data": { 93 | "text/plain": [ 94 | "[['120,000', '395', '제2종근린생활', '2001', '2015', '12', '일반', '31', '11110'],\n", 95 | " ['483,000', '937', '제2종근린생활', '1990', '2015', '12', '일반', '15', '11110'],\n", 96 | " ['22,000', '31', '판매', '2007', '2015', '12', '집합', '10', '11110'],\n", 97 | " ['158,000', '276', '숙박', '1959', '2015', '12', '일반', '8', '11110'],\n", 98 | " ['158,000', '276', '숙박', '1959', '2015', '12', '일반', '8', '11110'],\n", 99 | " ['247,500', '154', '제2종근린생활', '1976', '2015', '12', '일반', '21', '11110'],\n", 100 | " ['160,000', '79', '제1종근린생활', '', '2015', '12', '일반', '29', '11110'],\n", 101 | " ['174,000', '323', '제2종근린생활', '1976', '2015', '12', '일반', '28', '11110'],\n", 102 | " ['162,000', '201', '제2종근린생활', '1961', '2015', '12', '일반', '3', '11110'],\n", 103 | " ['14,700', '9', '제2종근린생활', '', '2015', '12', '집합', '18', '11110'],\n", 104 | " ['420,000', '1073', '제1종근린생활', '1964', '2015', '12', '일반', '23', '11110'],\n", 105 | " ['63,000', '10', '판매', '', '2015', '12', '집합', '1', '11110'],\n", 106 | " ['80,000', '10', '판매', '', '2015', '12', '집합', '7', '11110'],\n", 107 | " ['75,000', '12', '판매', '', '2015', '12', '집합', '16', '11110'],\n", 108 | " ['138,700', '270', '제1종근린생활', '', '2015', '12', '일반', '19', '11110'],\n", 109 | " ['100,000', '68', '제2종근린생활', '', '2015', '12', '일반', '21', '11110'],\n", 110 | " ['79,500', '41', '제2종근린생활', '', '2015', '12', '일반', '7', '11110'],\n", 111 | " ['16,500', '8', '판매', '1997', '2015', '12', '집합', '10', '11110'],\n", 112 | " ['12,000', '35', '제2종근린생활', '1997', '2015', '12', '집합', '16', '11110'],\n", 113 | " ['1,700', '9', '판매', '1993', '2015', '12', '집합', '17', '11110'],\n", 114 | " ['1,700', '9', '판매', '1993', '2015', '12', '집합', '17', '11110'],\n", 115 | " ['10,800', '33', '교육연구', '1997', '2015', '12', '집합', '21', '11110'],\n", 116 | " ['9,180', '29', '교육연구', '1997', '2015', '12', '집합', '21', '11110'],\n", 117 | " ['9,180', '30', '업무', '1997', '2015', '12', '집합', '21', '11110'],\n", 118 | " ['10,800', '35', '업무', '1997', '2015', '12', '집합', '21', '11110'],\n", 119 | " ['95,000', '348', '제1종근린생활', '1990', '2015', '12', '일반', '23', '11110'],\n", 120 | " ['15,500', '56', '제2종근린생활', '1996', '2015', '12', '집합', '30', '11110'],\n", 121 | " ['233,000', '945', '숙박', '1975', '2015', '12', '일반', '15', '11110'],\n", 122 | " ['12,250', '59', '제1종근린생활', '2015', '2015', '12', '집합', '18', '11110'],\n", 123 | " ['30,000', '25', '제2종근린생활', '2013', '2015', '12', '집합', '23', '11110'],\n", 124 | " ['14,500', '54', '제1종근린생활', '2015', '2015', '12', '집합', '30', '11110'],\n", 125 | " ['2,800,000', '1878', '제2종근린생활', '1953', '2015', '12', '일반', '11', '11110'],\n", 126 | " ['2,639,010', '2346', '업무', '1986', '2015', '12', '일반', '11', '11110'],\n", 127 | " ['128,000', '221', '제1종근린생활', '1988', '2015', '12', '일반', '14', '11110'],\n", 128 | " ['192,000', '587', '제1종근린생활', '1986', '2015', '12', '일반', '21', '11110']]" 129 | ] 130 | }, 131 | "execution_count": 67, 132 | "metadata": {}, 133 | "output_type": "execute_result" 134 | } 135 | ], 136 | "source": [ 137 | "from tqdm import tqdm\n", 138 | "\n", 139 | "com_re = list()\n", 140 | "\n", 141 | "for t in tqdm(xml_item):\n", 142 | " price=t.find(\"거래금액\").text\n", 143 | " bd_size=t.find(\"건물면적\").text\n", 144 | " bd_use=t.find(\"건물주용도\").text\n", 145 | " try:\n", 146 | " built_ym=t.find(\"건축년도\").text\n", 147 | " except:\n", 148 | " built_ym=\"\"\n", 149 | " buiit_y=t.find(\"년\").text\n", 150 | " built_m=t.find(\"월\").text\n", 151 | " bd_type=t.find(\"유형\").text\n", 152 | " built_d=t.find(\"일\").text\n", 153 | " lawd_cd=t.find(\"지역코드\").text\n", 154 | "\n", 155 | " com_re.append([price, bd_size, bd_use, built_ym, buiit_y, built_m, bd_type, built_d, lawd_cd])\n", 156 | " \n", 157 | "com_re" 158 | ] 159 | } 160 | ], 161 | "metadata": { 162 | "kernelspec": { 163 | "display_name": "Python 3", 164 | "language": "python", 165 | "name": "python3" 166 | }, 167 | "language_info": { 168 | "codemirror_mode": { 169 | "name": "ipython", 170 | "version": 3 171 | }, 172 | "file_extension": ".py", 173 | "mimetype": "text/x-python", 174 | "name": "python", 175 | "nbconvert_exporter": "python", 176 | "pygments_lexer": "ipython3", 177 | "version": "3.7.3" 178 | }, 179 | "toc": { 180 | "base_numbering": 1, 181 | "nav_menu": {}, 182 | "number_sections": true, 183 | "sideBar": true, 184 | "skip_h1_title": false, 185 | "title_cell": "Table of Contents", 186 | "title_sidebar": "Contents", 187 | "toc_cell": false, 188 | "toc_position": {}, 189 | "toc_section_display": true, 190 | "toc_window_display": false 191 | } 192 | }, 193 | "nbformat": 4, 194 | "nbformat_minor": 2 195 | } 196 | -------------------------------------------------------------------------------- /ch_01/103_urllib_crawling_fnguide.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# urllib 패키지를 이용하여 웹크롤링하기" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "## 삼성전자 재무제표 데이터 수집" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 4, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "from urllib.request import urlopen\n", 24 | "\n", 25 | "URL = \"http://comp.fnguide.com/SVO2/ASP/SVD_Finance.asp?pGB=1&gicode=A005930\"\n", 26 | "\n", 27 | "req = urlopen(URL)\n", 28 | "html = req.read()" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 5, 34 | "metadata": {}, 35 | "outputs": [], 36 | "source": [ 37 | "from bs4 import BeautifulSoup\n", 38 | " \n", 39 | "soup = BeautifulSoup(html, 'html.parser')" 40 | ] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "execution_count": 6, 45 | "metadata": {}, 46 | "outputs": [ 47 | { 48 | "data": { 49 | "text/plain": [ 50 | "\n", 51 | "\n", 52 | "\n", 53 | "\n", 54 | "\n", 55 | "\n", 56 | "\n", 57 | "\n", 58 | "\n", 59 | "\n", 60 | "\n", 61 | "\n", 62 | "\n", 63 | "\n", 64 | "\n", 65 | "\n", 66 | "\n", 67 | "\n", 68 | "\n", 69 | "\n", 70 | "\n", 71 | "\n", 72 | "\n", 73 | "\n", 74 | "\n", 77 | "\n", 78 | "\n", 79 | "\n", 80 | "\n", 81 | "\n", 82 | "\n", 83 | "\n", 84 | "\n", 85 | "\n", 88 | "\n", 89 | "\n", 90 | "\n", 91 | "\n", 92 | "\n", 93 | "\n", 94 | "\n", 95 | "\n", 96 | "\n", 99 | "\n", 100 | "\n", 101 | "\n", 102 | "\n", 103 | "\n", 104 | "\n", 105 | "\n", 106 | "\n", 107 | "\n", 110 | "\n", 111 | "\n", 112 | "\n", 113 | "\n", 114 | "\n", 115 | "\n", 116 | "\n", 117 | "\n", 118 | "\n", 119 | "\n", 120 | "\n", 121 | "\n", 122 | "\n", 123 | "\n", 124 | "\n", 125 | "\n", 126 | "\n", 127 | "\n", 128 | "\n", 129 | "\n", 130 | "\n", 131 | "\n", 132 | "\n", 133 | "\n", 134 | "\n", 135 | "\n", 136 | "\n", 137 | "\n", 138 | "\n", 139 | "\n", 140 | "\n", 141 | "\n", 142 | "\n", 143 | "\n", 144 | "\n", 145 | "\n", 146 | "\n", 147 | "\n", 148 | "\n", 149 | "\n", 150 | "\n", 151 | "\n", 152 | "\n", 153 | "\n", 154 | "\n", 155 | "\n", 156 | "\n", 157 | "\n", 158 | "\n", 159 | "\n", 160 | "\n", 161 | "\n", 162 | "\n", 163 | "\n", 164 | "\n", 165 | "\n", 166 | "\n", 167 | "\n", 168 | "\n", 169 | "\n", 170 | "\n", 171 | "\n", 172 | "\n", 173 | "\n", 174 | "\n", 175 | "\n", 176 | "\n", 177 | "\n", 178 | "\n", 179 | "\n", 180 | "\n", 181 | "\n", 182 | "\n", 183 | "\n", 184 | "\n", 185 | "\n", 186 | "\n", 187 | "\n", 188 | "\n", 189 | "\n", 190 | "\n", 193 | "\n", 194 | "\n", 195 | "\n", 196 | "\n", 197 | "\n", 198 | "\n", 199 | "\n", 200 | "\n", 201 | "\n", 204 | "\n", 205 | "\n", 206 | "\n", 207 | "\n", 208 | "\n", 209 | "\n", 210 | "\n", 211 | "\n", 212 | "\n", 215 | "\n", 216 | "\n", 217 | "\n", 218 | "\n", 219 | "\n", 220 | "\n", 221 | "\n", 222 | "\n", 223 | "\n", 224 | "\n", 225 | "\n", 226 | "\n", 227 | "\n", 228 | "\n", 229 | "\n", 230 | "\n", 231 | "\n", 232 | "\n", 233 | "\n", 234 | "\n", 235 | "\n", 236 | "\n", 237 | "\n", 238 | "\n", 239 | "\n", 240 | "\n", 241 | "\n", 242 | "\n", 243 | "\n", 244 | "\n", 245 | "\n", 246 | "\n", 247 | "\n", 248 | "\n", 249 | "\n", 250 | "\n", 251 | "\n", 252 | "\n", 253 | "\n", 254 | "\n", 255 | "\n", 256 | "\n", 257 | "\n", 258 | "\n", 259 | "\n", 260 | "\n", 261 | "\n", 262 | "\n", 263 | "\n", 264 | "\n", 265 | "\n", 266 | "\n", 267 | "\n", 268 | "\n", 269 | "\n", 270 | "\n", 271 | "\n", 272 | "\n", 273 | "\n", 274 | "\n", 275 | "\n", 276 | "\n", 277 | "\n", 278 | "\n", 279 | "\n", 280 | "\n", 281 | "\n", 282 | "\n", 283 | "\n", 284 | "\n", 285 | "\n", 286 | "\n", 287 | "\n", 288 | "\n", 289 | "\n", 290 | "\n", 291 | "\n", 292 | "\n", 293 | "\n", 294 | "\n", 295 | "\n", 296 | "\n", 297 | "\n", 298 | "\n", 299 | "\n", 300 | "\n", 301 | "\n", 302 | "\n", 303 | "\n", 304 | "\n", 305 | "\n", 306 | "\n", 307 | "\n", 308 | "\n", 309 | "\n", 310 | "\n", 311 | "\n", 312 | "\n", 313 | "\n", 314 | "\n", 315 | "\n", 316 | "\n", 317 | "\n", 318 | "\n", 319 | "\n", 320 | "\n", 321 | "\n", 322 | "\n", 325 | "\n", 326 | "\n", 327 | "\n", 328 | "\n", 329 | "\n", 330 | "\n", 331 | "\n", 332 | "\n", 333 | "\n", 334 | "\n", 335 | "\n", 336 | "\n", 337 | "\n", 338 | "\n", 339 | "\n", 340 | "\n", 341 | "\n", 342 | "\n", 343 | "\n", 344 | "\n", 345 | "\n", 346 | "\n", 347 | "\n", 348 | "\n", 349 | "\n", 350 | "\n", 351 | "\n", 352 | "\n", 353 | "\n", 354 | "\n", 355 | "\n", 356 | "\n", 357 | "\n", 358 | "\n", 359 | "\n", 360 | "\n", 361 | "\n", 362 | "\n", 363 | "\n", 364 | "\n", 365 | "\n", 366 | "\n", 367 | "\n", 368 | "\n", 369 | "\n", 370 | "\n", 371 | "\n", 372 | "\n", 373 | "\n", 374 | "\n", 375 | "\n", 376 | "\n", 377 | "\n", 378 | "\n", 379 | "\n", 380 | "\n", 381 | "\n", 382 | "\n", 383 | "\n", 384 | "\n", 385 | "\n", 386 | "\n", 387 | "\n", 388 | "\n", 389 | "\n", 390 | "\n", 391 | "\n", 392 | "\n", 393 | "\n", 394 | "\n", 395 | "\n", 396 | "\n", 397 | "\n", 398 | "\n", 399 | "\n", 400 | "\n", 401 | "\n", 402 | "\n", 403 | "\n", 404 | "\n", 405 | "\n", 406 | "\n", 407 | "\n", 408 | "\n", 409 | "\n", 410 | "\n", 411 | "\n", 412 | "\n", 413 | "\n", 414 | "\n", 415 | "\n", 416 | "\n", 417 | "\n", 418 | "\n", 419 | "\n", 420 | "\n", 421 | "\n", 422 | "\n", 423 | "\n", 426 | "\n", 427 | "\n", 428 | "\n", 429 | "\n", 430 | "\n", 431 | "\n", 432 | "\n", 433 | "\n", 434 | "\n", 435 | "\n", 436 | "\n", 437 | "\n", 438 | "\n", 439 | "\n", 440 | "\n", 441 | "\n", 442 | "\n", 443 | "\n", 444 | "\n", 445 | "\n", 446 | "\n", 447 | "\n", 448 | "\n", 449 | "\n", 450 | "\n", 451 | "\n", 452 | "\n", 453 | "\n", 454 | "\n", 455 | "\n", 456 | "\n", 457 | "\n", 458 | "\n", 459 | "\n", 460 | "\n", 461 | "\n", 462 | "\n", 463 | "\n", 464 | "\n", 465 | "\n", 466 | "\n", 467 | "\n", 468 | "\n", 469 | "\n", 470 | "\n", 471 | "\n", 472 | "\n", 473 | "\n", 474 | "\n", 475 | "\n", 476 | "\n", 477 | "\n", 478 | "\n", 479 | "\n", 480 | "\n", 481 | "\n", 482 | "\n", 483 | "\n", 484 | "\n", 485 | "\n", 486 | "\n", 487 | "\n", 488 | "\n", 489 | "\n", 490 | "\n", 491 | "\n", 492 | "\n", 493 | "\n", 494 | "\n", 495 | "\n", 496 | "\n", 497 | "\n", 498 | "\n", 499 | "\n", 500 | "\n", 501 | "\n", 502 | "\n", 503 | "\n", 504 | "\n", 505 | "\n", 506 | "\n", 507 | "\n", 508 | "\n", 509 | "\n", 510 | "\n", 511 | "\n", 512 | "\n", 513 | "\n", 514 | "\n", 515 | "\n", 516 | "\n", 517 | "\n", 518 | "\n", 519 | "\n", 520 | "\n", 521 | "\n", 522 | "\n", 523 | "\n", 524 | "\n", 525 | "\n", 526 | "\n", 527 | "\n", 528 | "\n", 529 | "\n", 530 | "\n", 531 | "\n", 532 | "\n", 533 | "\n", 534 | "\n", 535 | "\n", 536 | "\n", 537 | "\n", 538 | "\n", 539 | "\n", 540 | "\n", 541 | "\n", 542 | "\n", 543 | "\n", 544 | "\n", 545 | "\n", 546 | "\n", 547 | "\n", 548 | "\n", 549 | "\n", 550 | "\n", 551 | "\n", 552 | "\n", 553 | "\n", 554 | "\n", 555 | "\n", 556 | "\n", 557 | "\n", 558 | "\n", 559 | "\n", 560 | "\n", 561 | "\n", 562 | "\n", 563 | "\n", 564 | "\n", 565 | "\n", 566 | "\n", 567 | "\n", 568 | "\n", 569 | "\n", 570 | "\n", 571 | "\n", 572 | "\n", 573 | "\n", 574 | "\n", 575 | "\n", 576 | "\n", 577 | "\n", 578 | "\n", 581 | "\n", 582 | "\n", 583 | "\n", 584 | "\n", 585 | "\n", 586 | "\n", 587 | "\n", 588 | "\n", 589 | "\n", 590 | "\n", 591 | "\n", 592 | "\n", 593 | "\n", 594 | "\n", 595 | "\n", 596 | "\n", 597 | "\n", 598 | "\n", 599 | "\n", 600 | "\n", 601 | "\n", 602 | "\n", 603 | "\n", 604 | "\n", 605 | "\n", 606 | "\n", 607 | "\n", 608 | "\n", 609 | "\n", 610 | "\n", 611 | "\n", 612 | "\n", 613 | "\n", 614 | "\n", 615 | "\n", 616 | "\n", 617 | "\n", 618 | "\n", 619 | "\n", 620 | "\n", 621 | "\n", 622 | "\n", 623 | "\n", 624 | "\n", 625 | "\n", 626 | "\n", 627 | "\n", 628 | "\n", 629 | "\n", 630 | "\n", 631 | "\n", 632 | "\n", 633 | "\n", 634 | "\n", 635 | "\n", 636 | "\n", 637 | "\n", 638 | "\n", 639 | "\n", 640 | "\n", 641 | "\n", 642 | "\n", 643 | "\n", 644 | "\n", 645 | "\n", 646 | "\n", 647 | "\n", 648 | "\n", 649 | "\n", 650 | "\n", 651 | "\n", 652 | "\n", 653 | "\n", 654 | "\n", 655 | "\n", 656 | "\n", 657 | "\n", 658 | "\n", 659 | "\n", 660 | "\n", 661 | "\n", 662 | "\n", 663 | "\n", 664 | "\n", 665 | "\n", 666 | "\n", 667 | "\n", 668 | "\n", 669 | "\n", 670 | "\n", 671 | "\n", 672 | "\n", 673 | "\n", 674 | "\n", 675 | "\n", 676 | "\n", 677 | "\n", 678 | "\n", 679 | "\n", 680 | "\n", 681 | "\n", 682 | "\n", 683 | "\n", 684 | "\n", 685 | "\n", 686 | "\n", 687 | "\n", 688 | "\n", 689 | "\n", 690 | "\n", 691 | "\n", 692 | "\n", 693 | "\n", 694 | "\n", 695 | "\n", 696 | "\n", 697 | "\n", 700 | "\n", 701 | "\n", 702 | "\n", 703 | "\n", 704 | "\n", 705 | "\n", 706 | "\n", 707 | "\n", 708 | "\n", 709 | "\n", 710 | "\n", 711 | "\n", 712 | "\n", 713 | "\n", 714 | "\n", 715 | "\n", 716 | "\n", 717 | "\n", 718 | "\n", 719 | "\n", 720 | "\n", 721 | "\n", 722 | "\n", 723 | "\n", 724 | "\n", 725 | "\n", 726 | "\n", 727 | "\n", 728 | "\n", 729 | "\n", 730 | "\n", 731 | "\n", 732 | "\n", 733 | "\n", 734 | "\n", 735 | "\n", 736 | "\n", 737 | "\n", 738 | "\n", 739 | "\n", 740 | "\n", 741 | "\n", 742 | "\n", 743 | "\n", 744 | "\n", 747 | "\n", 748 | "\n", 749 | "\n", 750 | "\n", 751 | "\n", 752 | "\n", 753 | "\n", 754 | "\n", 755 | "\n", 758 | "\n", 759 | "\n", 760 | "\n", 761 | "\n", 762 | "\n", 763 | "\n", 764 | "\n", 765 | "\n", 766 | "\n", 769 | "\n", 770 | "\n", 771 | "\n", 772 | "\n", 773 | "\n", 774 | "\n", 775 | "\n", 776 | "\n", 777 | "\n", 780 | "\n", 781 | "\n", 782 | "\n", 783 | "\n", 784 | "\n", 785 | "\n", 786 | "\n", 787 | "\n", 788 | "\n", 791 | "\n", 792 | "\n", 793 | "\n", 794 | "\n", 795 | "\n", 796 | "\n", 797 | "\n", 798 | "\n", 799 | "\n", 802 | "\n", 803 | "\n", 804 | "\n", 805 | "\n", 806 | "\n", 807 | "\n", 808 | "\n", 809 | "\n", 810 | "\n", 813 | "\n", 814 | "\n", 815 | "\n", 816 | "\n", 817 | "\n", 818 | "\n", 819 | "\n", 820 | "\n", 821 | "
포괄손익계산서
IFRS(연결)2016/122017/122018/122019/12전년동기전년동기(%)
\n", 75 | "
매출액
\n", 76 | "
2,018,6672,395,7542,437,7142,304,0092,437,714-5.5
\n", 86 | "
매출원가
\n", 87 | "
1,202,7771,292,9071,323,9441,472,3951,323,94411.2
\n", 97 | "
매출총이익
\n", 98 | "
815,8901,102,8471,113,770831,6131,113,770-25.3
\n", 108 | "\n", 109 | "523,484566,397524,903553,928524,9035.5
   인건비59,76367,97264,51464,22664,514-0.4
   유무형자산상각비10,01813,36614,47720,40814,47741.0
   연구개발비141,114163,556183,541199,072183,5418.5
   광고선전비44,32153,50839,98546,14539,98515.4
   판매비141,679139,165123,417117,222123,417-5.0
   관리비80,02577,03157,54855,13157,548-4.2
   기타원가성비용      
   기타46,56451,79941,42351,72441,42324.9
\n", 191 | "
영업이익
\n", 192 | "
292,407536,450588,867277,685588,867-52.8
\n", 202 | "
영업이익(발표기준)
\n", 203 | "
292,407536,450588,867277,685588,867-52.8
\n", 213 | "\n", 214 | "113,85697,37499,993101,61699,9931.6
   이자수익15,04316,14222,97126,60022,97115.8
   배당금수익      
   외환이익90,52572,78966,95767,69066,9571.1
   대손충당금환입액      
   매출채권처분이익      
   당기손익-공정가치측정 금융자산관련이익      
   금융자산처분이익      
   금융자산평가이익      
   금융자산손상차손환입      
   파생상품이익8,2888,44310,0657,32610,065-27.2
   기타금융수익      
\n", 323 | "\n", 324 | "107,06689,78986,08982,74986,089-3.9
   이자비용5,8786,5546,7466,8646,7461.7
   외환손실92,32272,69571,49868,52471,498-4.2
   대손상각비      
   당기손익-공정가치측정 금융자산관련손실      
   매출채권처분손실      
   금융자산처분손실      
   금융자산평가손실      
   금융자산손상차손      
   파생상품손실8,86510,5407,8447,3617,844-6.2
   기타금융원가      
\n", 424 | "\n", 425 | "32,38330,10714,85017,78714,85019.8
   이자수익      
   배당금수익2,3991,2891,3141,5471,31417.7
   외환이익      
   재고자산감모손실환입      
   재고자산폐기(처분)이익      
   당기손익-공정가치측정 금융자산평가이익      
   자산처분(폐기)이익22,4683,1434,2353,5244,235-16.8
   자산평가이익      
   자산손상차손환입      
   파생상품이익      
   임대료수익1,0771,4351,4091,5341,4098.9
   로열티수익      
   수수료수익      
   대손충당금환입      
   충당부채환입액      
   기타6,43924,2397,89311,1827,89341.7
\n", 579 | "\n", 580 | "24,63814,19611,42014,14711,42023.9
   이자비용      
   외환손실      
   재고자산감모손실      
   재고자산폐기(처분)손실      
   당기손익-공정가치측정 금융자산평가손실      
   자산처분(폐기)손실1,2651,2259071,44590759.3
   자산평가손실      
   자산손상차손8,1531,434    
   파생상품손실      
   기타대손상각비      
   충당부채전입액      
   기타15,22011,53710,51312,70210,51320.8
\n", 698 | "
종속기업,공동지배기업및관계기업관련손익계산에 참여한 계정 펼치기
\n", 699 | "
1952,0145,3984,1305,398-23.5
   지분법손익1952,0145,3984,1305,398-23.5
   종속기업,공동지배기업및관계기업투자주식처분손익      
   종속기업,공동지배기업및관계기업투자주식손상관련손익      
   기타      
\n", 745 | "
세전계속사업이익
\n", 746 | "
307,137561,960611,600304,322611,600-50.2
\n", 756 | "
법인세비용
\n", 757 | "
79,876140,092168,15186,933168,151-48.3
\n", 767 | "
계속영업이익
\n", 768 | "
227,261421,867443,449217,389443,449-51.0
\n", 778 | "
중단영업이익
\n", 779 | "
      
\n", 789 | "
당기순이익
\n", 790 | "
227,261421,867443,449217,389443,449-51.0
\n", 800 | "
   지배주주순이익
\n", 801 | "
224,157413,446438,909215,051438,909-51.0
\n", 811 | "
   비지배주주순이익
\n", 812 | "
3,1048,4224,5402,3384,540-48.5
" 822 | ] 823 | }, 824 | "execution_count": 6, 825 | "metadata": {}, 826 | "output_type": "execute_result" 827 | } 828 | ], 829 | "source": [ 830 | "soup.find(\"table\")" 831 | ] 832 | }, 833 | { 834 | "cell_type": "code", 835 | "execution_count": 7, 836 | "metadata": {}, 837 | "outputs": [], 838 | "source": [ 839 | "soup_table_all = soup.find_all(\"table\")" 840 | ] 841 | }, 842 | { 843 | "cell_type": "code", 844 | "execution_count": 8, 845 | "metadata": {}, 846 | "outputs": [ 847 | { 848 | "data": { 849 | "text/plain": [ 850 | "6" 851 | ] 852 | }, 853 | "execution_count": 8, 854 | "metadata": {}, 855 | "output_type": "execute_result" 856 | } 857 | ], 858 | "source": [ 859 | "len(soup_table_all)" 860 | ] 861 | }, 862 | { 863 | "cell_type": "code", 864 | "execution_count": 9, 865 | "metadata": {}, 866 | "outputs": [ 867 | { 868 | "data": { 869 | "text/plain": [ 870 | "\n", 871 | "\n", 872 | "\n", 873 | "\n", 874 | "\n", 875 | "\n", 876 | "\n", 877 | "\n", 878 | "\n", 879 | "\n", 880 | "\n", 881 | "\n", 882 | "\n", 883 | "\n", 884 | "\n", 885 | "\n", 886 | "\n", 887 | "\n", 888 | "\n", 889 | "\n", 890 | "\n", 891 | "\n", 892 | "\n", 893 | "\n", 894 | "\n", 897 | "\n", 898 | "\n", 899 | "\n", 900 | "\n", 901 | "\n", 902 | "\n", 903 | "\n", 904 | "\n", 905 | "\n", 908 | "\n", 909 | "\n", 910 | "\n", 911 | "\n", 912 | "\n", 913 | "\n", 914 | "\n", 915 | "\n", 916 | "\n", 919 | "\n", 920 | "\n", 921 | "\n", 922 | "\n", 923 | "\n", 924 | "\n", 925 | "\n", 926 | "\n", 927 | "\n", 930 | "\n", 931 | "\n", 932 | "\n", 933 | "\n", 934 | "\n", 935 | "\n", 936 | "\n", 937 | "\n", 938 | "\n", 939 | "\n", 940 | "\n", 941 | "\n", 942 | "\n", 943 | "\n", 944 | "\n", 945 | "\n", 946 | "\n", 947 | "\n", 948 | "\n", 949 | "\n", 950 | "\n", 951 | "\n", 952 | "\n", 953 | "\n", 954 | "\n", 955 | "\n", 956 | "\n", 957 | "\n", 958 | "\n", 959 | "\n", 960 | "\n", 961 | "\n", 962 | "\n", 963 | "\n", 964 | "\n", 965 | "\n", 966 | "\n", 967 | "\n", 968 | "\n", 969 | "\n", 970 | "\n", 971 | "\n", 972 | "\n", 973 | "\n", 974 | "\n", 975 | "\n", 976 | "\n", 977 | "\n", 978 | "\n", 979 | "\n", 980 | "\n", 981 | "\n", 982 | "\n", 983 | "\n", 984 | "\n", 985 | "\n", 986 | "\n", 987 | "\n", 988 | "\n", 989 | "\n", 990 | "\n", 991 | "\n", 992 | "\n", 993 | "\n", 994 | "\n", 995 | "\n", 996 | "\n", 997 | "\n", 998 | "\n", 999 | "\n", 1000 | "\n", 1001 | "\n", 1002 | "\n", 1003 | "\n", 1004 | "\n", 1005 | "\n", 1006 | "\n", 1007 | "\n", 1008 | "\n", 1009 | "\n", 1010 | "\n", 1013 | "\n", 1014 | "\n", 1015 | "\n", 1016 | "\n", 1017 | "\n", 1018 | "\n", 1019 | "\n", 1020 | "\n", 1021 | "\n", 1024 | "\n", 1025 | "\n", 1026 | "\n", 1027 | "\n", 1028 | "\n", 1029 | "\n", 1030 | "\n", 1031 | "\n", 1032 | "\n", 1035 | "\n", 1036 | "\n", 1037 | "\n", 1038 | "\n", 1039 | "\n", 1040 | "\n", 1041 | "\n", 1042 | "\n", 1043 | "\n", 1044 | "\n", 1045 | "\n", 1046 | "\n", 1047 | "\n", 1048 | "\n", 1049 | "\n", 1050 | "\n", 1051 | "\n", 1052 | "\n", 1053 | "\n", 1054 | "\n", 1055 | "\n", 1056 | "\n", 1057 | "\n", 1058 | "\n", 1059 | "\n", 1060 | "\n", 1061 | "\n", 1062 | "\n", 1063 | "\n", 1064 | "\n", 1065 | "\n", 1066 | "\n", 1067 | "\n", 1068 | "\n", 1069 | "\n", 1070 | "\n", 1071 | "\n", 1072 | "\n", 1073 | "\n", 1074 | "\n", 1075 | "\n", 1076 | "\n", 1077 | "\n", 1078 | "\n", 1079 | "\n", 1080 | "\n", 1081 | "\n", 1082 | "\n", 1083 | "\n", 1084 | "\n", 1085 | "\n", 1086 | "\n", 1087 | "\n", 1088 | "\n", 1089 | "\n", 1090 | "\n", 1091 | "\n", 1092 | "\n", 1093 | "\n", 1094 | "\n", 1095 | "\n", 1096 | "\n", 1097 | "\n", 1098 | "\n", 1099 | "\n", 1100 | "\n", 1101 | "\n", 1102 | "\n", 1103 | "\n", 1104 | "\n", 1105 | "\n", 1106 | "\n", 1107 | "\n", 1108 | "\n", 1109 | "\n", 1110 | "\n", 1111 | "\n", 1112 | "\n", 1113 | "\n", 1114 | "\n", 1115 | "\n", 1116 | "\n", 1117 | "\n", 1118 | "\n", 1119 | "\n", 1120 | "\n", 1121 | "\n", 1122 | "\n", 1123 | "\n", 1124 | "\n", 1125 | "\n", 1126 | "\n", 1127 | "\n", 1128 | "\n", 1129 | "\n", 1130 | "\n", 1131 | "\n", 1132 | "\n", 1133 | "\n", 1134 | "\n", 1135 | "\n", 1136 | "\n", 1137 | "\n", 1138 | "\n", 1139 | "\n", 1140 | "\n", 1141 | "\n", 1142 | "\n", 1145 | "\n", 1146 | "\n", 1147 | "\n", 1148 | "\n", 1149 | "\n", 1150 | "\n", 1151 | "\n", 1152 | "\n", 1153 | "\n", 1154 | "\n", 1155 | "\n", 1156 | "\n", 1157 | "\n", 1158 | "\n", 1159 | "\n", 1160 | "\n", 1161 | "\n", 1162 | "\n", 1163 | "\n", 1164 | "\n", 1165 | "\n", 1166 | "\n", 1167 | "\n", 1168 | "\n", 1169 | "\n", 1170 | "\n", 1171 | "\n", 1172 | "\n", 1173 | "\n", 1174 | "\n", 1175 | "\n", 1176 | "\n", 1177 | "\n", 1178 | "\n", 1179 | "\n", 1180 | "\n", 1181 | "\n", 1182 | "\n", 1183 | "\n", 1184 | "\n", 1185 | "\n", 1186 | "\n", 1187 | "\n", 1188 | "\n", 1189 | "\n", 1190 | "\n", 1191 | "\n", 1192 | "\n", 1193 | "\n", 1194 | "\n", 1195 | "\n", 1196 | "\n", 1197 | "\n", 1198 | "\n", 1199 | "\n", 1200 | "\n", 1201 | "\n", 1202 | "\n", 1203 | "\n", 1204 | "\n", 1205 | "\n", 1206 | "\n", 1207 | "\n", 1208 | "\n", 1209 | "\n", 1210 | "\n", 1211 | "\n", 1212 | "\n", 1213 | "\n", 1214 | "\n", 1215 | "\n", 1216 | "\n", 1217 | "\n", 1218 | "\n", 1219 | "\n", 1220 | "\n", 1221 | "\n", 1222 | "\n", 1223 | "\n", 1224 | "\n", 1225 | "\n", 1226 | "\n", 1227 | "\n", 1228 | "\n", 1229 | "\n", 1230 | "\n", 1231 | "\n", 1232 | "\n", 1233 | "\n", 1234 | "\n", 1235 | "\n", 1236 | "\n", 1237 | "\n", 1238 | "\n", 1239 | "\n", 1240 | "\n", 1241 | "\n", 1242 | "\n", 1243 | "\n", 1246 | "\n", 1247 | "\n", 1248 | "\n", 1249 | "\n", 1250 | "\n", 1251 | "\n", 1252 | "\n", 1253 | "\n", 1254 | "\n", 1255 | "\n", 1256 | "\n", 1257 | "\n", 1258 | "\n", 1259 | "\n", 1260 | "\n", 1261 | "\n", 1262 | "\n", 1263 | "\n", 1264 | "\n", 1265 | "\n", 1266 | "\n", 1267 | "\n", 1268 | "\n", 1269 | "\n", 1270 | "\n", 1271 | "\n", 1272 | "\n", 1273 | "\n", 1274 | "\n", 1275 | "\n", 1276 | "\n", 1277 | "\n", 1278 | "\n", 1279 | "\n", 1280 | "\n", 1281 | "\n", 1282 | "\n", 1283 | "\n", 1284 | "\n", 1285 | "\n", 1286 | "\n", 1287 | "\n", 1288 | "\n", 1289 | "\n", 1290 | "\n", 1291 | "\n", 1292 | "\n", 1293 | "\n", 1294 | "\n", 1295 | "\n", 1296 | "\n", 1297 | "\n", 1298 | "\n", 1299 | "\n", 1300 | "\n", 1301 | "\n", 1302 | "\n", 1303 | "\n", 1304 | "\n", 1305 | "\n", 1306 | "\n", 1307 | "\n", 1308 | "\n", 1309 | "\n", 1310 | "\n", 1311 | "\n", 1312 | "\n", 1313 | "\n", 1314 | "\n", 1315 | "\n", 1316 | "\n", 1317 | "\n", 1318 | "\n", 1319 | "\n", 1320 | "\n", 1321 | "\n", 1322 | "\n", 1323 | "\n", 1324 | "\n", 1325 | "\n", 1326 | "\n", 1327 | "\n", 1328 | "\n", 1329 | "\n", 1330 | "\n", 1331 | "\n", 1332 | "\n", 1333 | "\n", 1334 | "\n", 1335 | "\n", 1336 | "\n", 1337 | "\n", 1338 | "\n", 1339 | "\n", 1340 | "\n", 1341 | "\n", 1342 | "\n", 1343 | "\n", 1344 | "\n", 1345 | "\n", 1346 | "\n", 1347 | "\n", 1348 | "\n", 1349 | "\n", 1350 | "\n", 1351 | "\n", 1352 | "\n", 1353 | "\n", 1354 | "\n", 1355 | "\n", 1356 | "\n", 1357 | "\n", 1358 | "\n", 1359 | "\n", 1360 | "\n", 1361 | "\n", 1362 | "\n", 1363 | "\n", 1364 | "\n", 1365 | "\n", 1366 | "\n", 1367 | "\n", 1368 | "\n", 1369 | "\n", 1370 | "\n", 1371 | "\n", 1372 | "\n", 1373 | "\n", 1374 | "\n", 1375 | "\n", 1376 | "\n", 1377 | "\n", 1378 | "\n", 1379 | "\n", 1380 | "\n", 1381 | "\n", 1382 | "\n", 1383 | "\n", 1384 | "\n", 1385 | "\n", 1386 | "\n", 1387 | "\n", 1388 | "\n", 1389 | "\n", 1390 | "\n", 1391 | "\n", 1392 | "\n", 1393 | "\n", 1394 | "\n", 1395 | "\n", 1396 | "\n", 1397 | "\n", 1398 | "\n", 1401 | "\n", 1402 | "\n", 1403 | "\n", 1404 | "\n", 1405 | "\n", 1406 | "\n", 1407 | "\n", 1408 | "\n", 1409 | "\n", 1410 | "\n", 1411 | "\n", 1412 | "\n", 1413 | "\n", 1414 | "\n", 1415 | "\n", 1416 | "\n", 1417 | "\n", 1418 | "\n", 1419 | "\n", 1420 | "\n", 1421 | "\n", 1422 | "\n", 1423 | "\n", 1424 | "\n", 1425 | "\n", 1426 | "\n", 1427 | "\n", 1428 | "\n", 1429 | "\n", 1430 | "\n", 1431 | "\n", 1432 | "\n", 1433 | "\n", 1434 | "\n", 1435 | "\n", 1436 | "\n", 1437 | "\n", 1438 | "\n", 1439 | "\n", 1440 | "\n", 1441 | "\n", 1442 | "\n", 1443 | "\n", 1444 | "\n", 1445 | "\n", 1446 | "\n", 1447 | "\n", 1448 | "\n", 1449 | "\n", 1450 | "\n", 1451 | "\n", 1452 | "\n", 1453 | "\n", 1454 | "\n", 1455 | "\n", 1456 | "\n", 1457 | "\n", 1458 | "\n", 1459 | "\n", 1460 | "\n", 1461 | "\n", 1462 | "\n", 1463 | "\n", 1464 | "\n", 1465 | "\n", 1466 | "\n", 1467 | "\n", 1468 | "\n", 1469 | "\n", 1470 | "\n", 1471 | "\n", 1472 | "\n", 1473 | "\n", 1474 | "\n", 1475 | "\n", 1476 | "\n", 1477 | "\n", 1478 | "\n", 1479 | "\n", 1480 | "\n", 1481 | "\n", 1482 | "\n", 1483 | "\n", 1484 | "\n", 1485 | "\n", 1486 | "\n", 1487 | "\n", 1488 | "\n", 1489 | "\n", 1490 | "\n", 1491 | "\n", 1492 | "\n", 1493 | "\n", 1494 | "\n", 1495 | "\n", 1496 | "\n", 1497 | "\n", 1498 | "\n", 1499 | "\n", 1500 | "\n", 1501 | "\n", 1502 | "\n", 1503 | "\n", 1504 | "\n", 1505 | "\n", 1506 | "\n", 1507 | "\n", 1508 | "\n", 1509 | "\n", 1510 | "\n", 1511 | "\n", 1512 | "\n", 1513 | "\n", 1514 | "\n", 1515 | "\n", 1516 | "\n", 1517 | "\n", 1520 | "\n", 1521 | "\n", 1522 | "\n", 1523 | "\n", 1524 | "\n", 1525 | "\n", 1526 | "\n", 1527 | "\n", 1528 | "\n", 1529 | "\n", 1530 | "\n", 1531 | "\n", 1532 | "\n", 1533 | "\n", 1534 | "\n", 1535 | "\n", 1536 | "\n", 1537 | "\n", 1538 | "\n", 1539 | "\n", 1540 | "\n", 1541 | "\n", 1542 | "\n", 1543 | "\n", 1544 | "\n", 1545 | "\n", 1546 | "\n", 1547 | "\n", 1548 | "\n", 1549 | "\n", 1550 | "\n", 1551 | "\n", 1552 | "\n", 1553 | "\n", 1554 | "\n", 1555 | "\n", 1556 | "\n", 1557 | "\n", 1558 | "\n", 1559 | "\n", 1560 | "\n", 1561 | "\n", 1562 | "\n", 1563 | "\n", 1564 | "\n", 1567 | "\n", 1568 | "\n", 1569 | "\n", 1570 | "\n", 1571 | "\n", 1572 | "\n", 1573 | "\n", 1574 | "\n", 1575 | "\n", 1578 | "\n", 1579 | "\n", 1580 | "\n", 1581 | "\n", 1582 | "\n", 1583 | "\n", 1584 | "\n", 1585 | "\n", 1586 | "\n", 1589 | "\n", 1590 | "\n", 1591 | "\n", 1592 | "\n", 1593 | "\n", 1594 | "\n", 1595 | "\n", 1596 | "\n", 1597 | "\n", 1600 | "\n", 1601 | "\n", 1602 | "\n", 1603 | "\n", 1604 | "\n", 1605 | "\n", 1606 | "\n", 1607 | "\n", 1608 | "\n", 1611 | "\n", 1612 | "\n", 1613 | "\n", 1614 | "\n", 1615 | "\n", 1616 | "\n", 1617 | "\n", 1618 | "\n", 1619 | "\n", 1622 | "\n", 1623 | "\n", 1624 | "\n", 1625 | "\n", 1626 | "\n", 1627 | "\n", 1628 | "\n", 1629 | "\n", 1630 | "\n", 1633 | "\n", 1634 | "\n", 1635 | "\n", 1636 | "\n", 1637 | "\n", 1638 | "\n", 1639 | "\n", 1640 | "\n", 1641 | "
포괄손익계산서
IFRS(연결)2016/122017/122018/122019/12전년동기전년동기(%)
\n", 895 | "
매출액
\n", 896 | "
2,018,6672,395,7542,437,7142,304,0092,437,714-5.5
\n", 906 | "
매출원가
\n", 907 | "
1,202,7771,292,9071,323,9441,472,3951,323,94411.2
\n", 917 | "
매출총이익
\n", 918 | "
815,8901,102,8471,113,770831,6131,113,770-25.3
\n", 928 | "\n", 929 | "523,484566,397524,903553,928524,9035.5
   인건비59,76367,97264,51464,22664,514-0.4
   유무형자산상각비10,01813,36614,47720,40814,47741.0
   연구개발비141,114163,556183,541199,072183,5418.5
   광고선전비44,32153,50839,98546,14539,98515.4
   판매비141,679139,165123,417117,222123,417-5.0
   관리비80,02577,03157,54855,13157,548-4.2
   기타원가성비용      
   기타46,56451,79941,42351,72441,42324.9
\n", 1011 | "
영업이익
\n", 1012 | "
292,407536,450588,867277,685588,867-52.8
\n", 1022 | "
영업이익(발표기준)
\n", 1023 | "
292,407536,450588,867277,685588,867-52.8
\n", 1033 | "\n", 1034 | "113,85697,37499,993101,61699,9931.6
   이자수익15,04316,14222,97126,60022,97115.8
   배당금수익      
   외환이익90,52572,78966,95767,69066,9571.1
   대손충당금환입액      
   매출채권처분이익      
   당기손익-공정가치측정 금융자산관련이익      
   금융자산처분이익      
   금융자산평가이익      
   금융자산손상차손환입      
   파생상품이익8,2888,44310,0657,32610,065-27.2
   기타금융수익      
\n", 1143 | "\n", 1144 | "107,06689,78986,08982,74986,089-3.9
   이자비용5,8786,5546,7466,8646,7461.7
   외환손실92,32272,69571,49868,52471,498-4.2
   대손상각비      
   당기손익-공정가치측정 금융자산관련손실      
   매출채권처분손실      
   금융자산처분손실      
   금융자산평가손실      
   금융자산손상차손      
   파생상품손실8,86510,5407,8447,3617,844-6.2
   기타금융원가      
\n", 1244 | "\n", 1245 | "32,38330,10714,85017,78714,85019.8
   이자수익      
   배당금수익2,3991,2891,3141,5471,31417.7
   외환이익      
   재고자산감모손실환입      
   재고자산폐기(처분)이익      
   당기손익-공정가치측정 금융자산평가이익      
   자산처분(폐기)이익22,4683,1434,2353,5244,235-16.8
   자산평가이익      
   자산손상차손환입      
   파생상품이익      
   임대료수익1,0771,4351,4091,5341,4098.9
   로열티수익      
   수수료수익      
   대손충당금환입      
   충당부채환입액      
   기타6,43924,2397,89311,1827,89341.7
\n", 1399 | "\n", 1400 | "24,63814,19611,42014,14711,42023.9
   이자비용      
   외환손실      
   재고자산감모손실      
   재고자산폐기(처분)손실      
   당기손익-공정가치측정 금융자산평가손실      
   자산처분(폐기)손실1,2651,2259071,44590759.3
   자산평가손실      
   자산손상차손8,1531,434    
   파생상품손실      
   기타대손상각비      
   충당부채전입액      
   기타15,22011,53710,51312,70210,51320.8
\n", 1518 | "
종속기업,공동지배기업및관계기업관련손익계산에 참여한 계정 펼치기
\n", 1519 | "
1952,0145,3984,1305,398-23.5
   지분법손익1952,0145,3984,1305,398-23.5
   종속기업,공동지배기업및관계기업투자주식처분손익      
   종속기업,공동지배기업및관계기업투자주식손상관련손익      
   기타      
\n", 1565 | "
세전계속사업이익
\n", 1566 | "
307,137561,960611,600304,322611,600-50.2
\n", 1576 | "
법인세비용
\n", 1577 | "
79,876140,092168,15186,933168,151-48.3
\n", 1587 | "
계속영업이익
\n", 1588 | "
227,261421,867443,449217,389443,449-51.0
\n", 1598 | "
중단영업이익
\n", 1599 | "
      
\n", 1609 | "
당기순이익
\n", 1610 | "
227,261421,867443,449217,389443,449-51.0
\n", 1620 | "
   지배주주순이익
\n", 1621 | "
224,157413,446438,909215,051438,909-51.0
\n", 1631 | "
   비지배주주순이익
\n", 1632 | "
3,1048,4224,5402,3384,540-48.5
" 1642 | ] 1643 | }, 1644 | "execution_count": 9, 1645 | "metadata": {}, 1646 | "output_type": "execute_result" 1647 | } 1648 | ], 1649 | "source": [ 1650 | "soup_table_all[0]" 1651 | ] 1652 | }, 1653 | { 1654 | "cell_type": "code", 1655 | "execution_count": 10, 1656 | "metadata": {}, 1657 | "outputs": [], 1658 | "source": [ 1659 | "soup.find(attrs={\"class\":\"us_table_ty1 h_fix zigbg_no\"})\n", 1660 | "soup_table = soup.find(\"table\", attrs={\"class\":\"us_table_ty1 h_fix zigbg_no\"})" 1661 | ] 1662 | }, 1663 | { 1664 | "cell_type": "code", 1665 | "execution_count": 11, 1666 | "metadata": {}, 1667 | "outputs": [ 1668 | { 1669 | "data": { 1670 | "text/html": [ 1671 | "
\n", 1672 | "\n", 1685 | "\n", 1686 | " \n", 1687 | " \n", 1688 | " \n", 1689 | " \n", 1690 | " \n", 1691 | " \n", 1692 | " \n", 1693 | " \n", 1694 | " \n", 1695 | " \n", 1696 | " \n", 1697 | " \n", 1698 | " \n", 1699 | " \n", 1700 | " \n", 1701 | " \n", 1702 | " \n", 1703 | " \n", 1704 | " \n", 1705 | " \n", 1706 | " \n", 1707 | " \n", 1708 | " \n", 1709 | " \n", 1710 | " \n", 1711 | " \n", 1712 | " \n", 1713 | " \n", 1714 | " \n", 1715 | " \n", 1716 | " \n", 1717 | " \n", 1718 | " \n", 1719 | " \n", 1720 | " \n", 1721 | " \n", 1722 | " \n", 1723 | " \n", 1724 | " \n", 1725 | " \n", 1726 | " \n", 1727 | " \n", 1728 | " \n", 1729 | " \n", 1730 | " \n", 1731 | " \n", 1732 | " \n", 1733 | " \n", 1734 | " \n", 1735 | " \n", 1736 | " \n", 1737 | " \n", 1738 | " \n", 1739 | " \n", 1740 | " \n", 1741 | " \n", 1742 | " \n", 1743 | " \n", 1744 | " \n", 1745 | " \n", 1746 | " \n", 1747 | " \n", 1748 | " \n", 1749 | " \n", 1750 | "
IFRS(연결)2016/122017/122018/122019/12전년동기전년동기(%)
0매출액2,018,6672,395,7542,437,7142,304,0092,437,714-5.5
1매출원가1,202,7771,292,9071,323,9441,472,3951,323,94411.2
2매출총이익815,8901,102,8471,113,770831,6131,113,770-25.3
3판매비와관리비계산에 참여한 계정 펼치기523,484566,397524,903553,928524,9035.5
4인건비59,76367,97264,51464,22664,514-0.4
\n", 1751 | "
" 1752 | ], 1753 | "text/plain": [ 1754 | " IFRS(연결) 2016/12 2017/12 2018/12 2019/12 \\\n", 1755 | "0 매출액 2,018,667 2,395,754 2,437,714 2,304,009 \n", 1756 | "1 매출원가 1,202,777 1,292,907 1,323,944 1,472,395 \n", 1757 | "2 매출총이익 815,890 1,102,847 1,113,770 831,613 \n", 1758 | "3 판매비와관리비계산에 참여한 계정 펼치기 523,484 566,397 524,903 553,928 \n", 1759 | "4 인건비 59,763 67,972 64,514 64,226 \n", 1760 | "\n", 1761 | " 전년동기 전년동기(%) \n", 1762 | "0 2,437,714 -5.5 \n", 1763 | "1 1,323,944 11.2 \n", 1764 | "2 1,113,770 -25.3 \n", 1765 | "3 524,903 5.5 \n", 1766 | "4 64,514 -0.4 " 1767 | ] 1768 | }, 1769 | "execution_count": 11, 1770 | "metadata": {}, 1771 | "output_type": "execute_result" 1772 | } 1773 | ], 1774 | "source": [ 1775 | "from html_table_parser import parser_functions as parser\n", 1776 | "import pandas as pd\n", 1777 | "\n", 1778 | "table = parser.make2d(soup_table)\n", 1779 | "df = pd.DataFrame(table[1:], columns=table[0])\n", 1780 | "df.head()" 1781 | ] 1782 | }, 1783 | { 1784 | "cell_type": "markdown", 1785 | "metadata": {}, 1786 | "source": [ 1787 | "## 함수로 만들고, 시도건수 추가" 1788 | ] 1789 | }, 1790 | { 1791 | "cell_type": "code", 1792 | "execution_count": 12, 1793 | "metadata": {}, 1794 | "outputs": [], 1795 | "source": [ 1796 | "from urllib.error import HTTPError\n", 1797 | "import logging\n", 1798 | "import time\n", 1799 | "\n", 1800 | "def collect_sheet(code, try_cnt):\n", 1801 | " try:\n", 1802 | " URL = \"http://comp.fnguide.com/SVO2/ASP/SVD_Finance.asp?pGB=1&gicode={}\".format(code)\n", 1803 | " \n", 1804 | " req = urlopen(URL)\n", 1805 | " html = req.read()\n", 1806 | " soup = BeautifulSoup(html, 'html.parser')\n", 1807 | " soup_table_all = soup.find_all(\"table\")\n", 1808 | " soup.find(attrs={\"class\":\"us_table_ty1 h_fix zigbg_no\"})\n", 1809 | " soup_table = soup.find(\"table\", attrs={\"class\":\"us_table_ty1 h_fix zigbg_no\"})\n", 1810 | " table = parser.make2d(soup_table)\n", 1811 | " df = pd.DataFrame(table[1:], columns=table[0])\n", 1812 | " \n", 1813 | " return df\n", 1814 | " \n", 1815 | " except HTTPError as e:\n", 1816 | " if try_cnt>=3:\n", 1817 | " logging.warning(e)\n", 1818 | " return None\n", 1819 | " else:\n", 1820 | " time.sleep(3)\n", 1821 | " collect_div(corp_code,try_cnt=+1) " 1822 | ] 1823 | }, 1824 | { 1825 | "cell_type": "code", 1826 | "execution_count": 13, 1827 | "metadata": {}, 1828 | "outputs": [], 1829 | "source": [ 1830 | "df=collect_sheet(\"A005930\",1)" 1831 | ] 1832 | }, 1833 | { 1834 | "cell_type": "code", 1835 | "execution_count": 14, 1836 | "metadata": {}, 1837 | "outputs": [ 1838 | { 1839 | "data": { 1840 | "text/html": [ 1841 | "
\n", 1842 | "\n", 1855 | "\n", 1856 | " \n", 1857 | " \n", 1858 | " \n", 1859 | " \n", 1860 | " \n", 1861 | " \n", 1862 | " \n", 1863 | " \n", 1864 | " \n", 1865 | " \n", 1866 | " \n", 1867 | " \n", 1868 | " \n", 1869 | " \n", 1870 | " \n", 1871 | " \n", 1872 | " \n", 1873 | " \n", 1874 | " \n", 1875 | " \n", 1876 | " \n", 1877 | " \n", 1878 | " \n", 1879 | " \n", 1880 | " \n", 1881 | " \n", 1882 | " \n", 1883 | " \n", 1884 | " \n", 1885 | " \n", 1886 | " \n", 1887 | " \n", 1888 | " \n", 1889 | " \n", 1890 | " \n", 1891 | " \n", 1892 | " \n", 1893 | " \n", 1894 | " \n", 1895 | " \n", 1896 | " \n", 1897 | " \n", 1898 | " \n", 1899 | " \n", 1900 | " \n", 1901 | " \n", 1902 | " \n", 1903 | " \n", 1904 | " \n", 1905 | " \n", 1906 | " \n", 1907 | " \n", 1908 | " \n", 1909 | " \n", 1910 | " \n", 1911 | " \n", 1912 | " \n", 1913 | " \n", 1914 | " \n", 1915 | " \n", 1916 | " \n", 1917 | " \n", 1918 | " \n", 1919 | " \n", 1920 | "
IFRS(연결)2016/122017/122018/122019/12전년동기전년동기(%)
0매출액2,018,6672,395,7542,437,7142,304,0092,437,714-5.5
1매출원가1,202,7771,292,9071,323,9441,472,3951,323,94411.2
2매출총이익815,8901,102,8471,113,770831,6131,113,770-25.3
3판매비와관리비계산에 참여한 계정 펼치기523,484566,397524,903553,928524,9035.5
4인건비59,76367,97264,51464,22664,514-0.4
\n", 1921 | "
" 1922 | ], 1923 | "text/plain": [ 1924 | " IFRS(연결) 2016/12 2017/12 2018/12 2019/12 \\\n", 1925 | "0 매출액 2,018,667 2,395,754 2,437,714 2,304,009 \n", 1926 | "1 매출원가 1,202,777 1,292,907 1,323,944 1,472,395 \n", 1927 | "2 매출총이익 815,890 1,102,847 1,113,770 831,613 \n", 1928 | "3 판매비와관리비계산에 참여한 계정 펼치기 523,484 566,397 524,903 553,928 \n", 1929 | "4 인건비 59,763 67,972 64,514 64,226 \n", 1930 | "\n", 1931 | " 전년동기 전년동기(%) \n", 1932 | "0 2,437,714 -5.5 \n", 1933 | "1 1,323,944 11.2 \n", 1934 | "2 1,113,770 -25.3 \n", 1935 | "3 524,903 5.5 \n", 1936 | "4 64,514 -0.4 " 1937 | ] 1938 | }, 1939 | "execution_count": 14, 1940 | "metadata": {}, 1941 | "output_type": "execute_result" 1942 | } 1943 | ], 1944 | "source": [ 1945 | "df.head()" 1946 | ] 1947 | } 1948 | ], 1949 | "metadata": { 1950 | "kernelspec": { 1951 | "display_name": "Python 3", 1952 | "language": "python", 1953 | "name": "python3" 1954 | }, 1955 | "language_info": { 1956 | "codemirror_mode": { 1957 | "name": "ipython", 1958 | "version": 3 1959 | }, 1960 | "file_extension": ".py", 1961 | "mimetype": "text/x-python", 1962 | "name": "python", 1963 | "nbconvert_exporter": "python", 1964 | "pygments_lexer": "ipython3", 1965 | "version": "3.7.3" 1966 | }, 1967 | "toc": { 1968 | "base_numbering": 1, 1969 | "nav_menu": {}, 1970 | "number_sections": true, 1971 | "sideBar": true, 1972 | "skip_h1_title": false, 1973 | "title_cell": "Table of Contents", 1974 | "title_sidebar": "Contents", 1975 | "toc_cell": false, 1976 | "toc_position": {}, 1977 | "toc_section_display": true, 1978 | "toc_window_display": false 1979 | } 1980 | }, 1981 | "nbformat": 4, 1982 | "nbformat_minor": 2 1983 | } 1984 | -------------------------------------------------------------------------------- /ch_01/104_requests_module.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | input_data = {"pGB":1, "gicode":"A005930"} 4 | result = requests.get("http://comp.fnguide.com/SVO2/ASP/SVD_Finance.asp", data=input_data) 5 | print(result.text) 6 | 7 | # beautifulsoupdㅡ로 파싱 8 | from bs4 import BeautifulSoup 9 | soup = BeautifulSoup(result.text, 'html.parser') 10 | soup_table = soup.find("table", attrs={"class":"us_table_ty1 h_fix zigbg_no"}) 11 | 12 | # 판다스 데이터프레임으로 변환 13 | from html_table_parser import parser_functions as parser 14 | import pandas as pd 15 | 16 | table = parser.make2d(soup_table) 17 | df = pd.DataFrame(table[1:], columns=table[0]) 18 | df.head() -------------------------------------------------------------------------------- /ch_01/105_selenium_crawling.py: -------------------------------------------------------------------------------- 1 | # coding = utf-8 2 | 3 | from selenium import webdriver 4 | 5 | browser = webdriver.Chrome('/Applications/chromedriver') 6 | 7 | browser.get("http://www.seibro.or.kr/websquare/control.jsp?w2xPath=/IPORTAL/user/company/BIP_CNTS01042V.xml&menuNo=286#") 8 | 9 | search_btn = browser.find_element_by_id("image1") 10 | search_btn.click() 11 | 12 | # html소스를 가져와서, 원하는 위치를 찾습니다. 13 | html = browser.page_source 14 | 15 | from bs4 import BeautifulSoup 16 | from html_table_parser import parser_functions as parser 17 | import pandas as pd 18 | 19 | soup = BeautifulSoup(html, "html.parser") 20 | table = soup.find("table", attrs={"id":"grid1_body_table"}) 21 | p = parser.make2d(table) 22 | df = pd.DataFrame(p[2:],columns=p[1]) 23 | df.head() 24 | 25 | import time 26 | import random 27 | from tqdm import tqdm 28 | 29 | prev_no = 0 30 | prev_table = None 31 | 32 | for i in tqdm(range(0,200)): 33 | 34 | try: 35 | next_btn = browser.find_element_by_id("cntsPaging01_next_btn") 36 | next_btn.click() 37 | except: 38 | time.sleep(2) 39 | try: 40 | next_btn = browser.find_element_by_id("cntsPaging01_next_btn") 41 | next_btn.click() 42 | except: 43 | time.sleep(2) 44 | next_btn = browser.find_element_by_id("cntsPaging01_next_btn") 45 | next_btn.click() 46 | 47 | def get_html(browser, cnt): 48 | 49 | if cnt>=4: 50 | return -1, -1 51 | 52 | html = browser.page_source 53 | soup = BeautifulSoup(html, 'html.parser') 54 | 55 | cur_no = soup.find("a", attrs={"class":"w2pageList_control_label w2pageList_label_selected"}) 56 | cur_no = cur_no.text 57 | 58 | table = soup.find("table", attrs={"id": "grid1_body_table"}) 59 | 60 | if cur_no!=prev_no and prev_table!=table: 61 | return cur_no, table 62 | else: 63 | time.sleep(1) 64 | get_html(browser, cnt+1) 65 | 66 | cur_no, table = get_html(browser, 1) 67 | 68 | if cur_no== -1: 69 | print("\n종료. 테이블 정보가 바뀌지 않았습니다.") 70 | break 71 | 72 | p=parser.make2d(table) 73 | temp=pd.DataFrame(p[2:],columns=p[1]) 74 | df = pd.concat([df, temp],0) 75 | prev_no = cur_no 76 | prev_table = html 77 | 78 | if cur_no=="95": 79 | print("\n최종 페이지 도달") 80 | break 81 | 82 | time.sleep(random.randrange(3,5)) 83 | 84 | df.to_excel("stock_div.xlsx") 85 | -------------------------------------------------------------------------------- /ch_01/106_sqlite_database.py: -------------------------------------------------------------------------------- 1 | # 1) DB 연결하고, SQL실행하기 2 | import sqlite3 3 | conn = sqlite3.connect("test.db") 4 | 5 | c = conn.cursor() 6 | c.execute('''CREATE TABLE stocks 7 | (date text, trans text, symbol text, qty real, price real)''') 8 | 9 | conn.commit() 10 | conn.close() 11 | 12 | 13 | # 2) 판다스 데이터 프레임 만들고 DB에 테이블로 저장하기 14 | import sqlite3 15 | con = sqlite3.connect("test.db") 16 | 17 | 18 | import pandas as pd 19 | 20 | df = pd.DataFrame({"a":[1,2,3], 21 | "b":[4,5,6], 22 | "id":["a", "b","c"]}) 23 | 24 | df.to_sql("df", con) 25 | 26 | 27 | # 3) UNIQUE 인덱스 생성하기 28 | con = sqlite3.connect("test.db") 29 | df = pd.DataFrame({"a":[1,2,3], 30 | "b":[4,5,6], 31 | "id":["a", "b","c"]}) 32 | 33 | df.to_sql("df", con, index=False, if_exists="replace") 34 | c = con.cursor() 35 | c.execute("CREATE UNIQUE INDEX id ON df (id)") 36 | con.commit() 37 | con.close() 38 | 39 | 40 | # 4) 인덱스 확인하기 41 | con = sqlite3.connect("test.db") 42 | c = con.cursor() 43 | c.execute("PRAGMA index_list(df)").fetchall() 44 | c.execute("PRAGMA index_info('id')").fetchall() 45 | con.close() 46 | 47 | # 5) 추가 데이터 저장하기 -> 에러가 발생합니다. 48 | df_2 = pd.DataFrame({"a":[4], "b":[4], "id":["c"]}) 49 | 50 | df_2 = df_2.set_index("id") 51 | con = sqlite3.connect("test.db") 52 | df_2.to_sql("df", con, if_exists="append") 53 | 54 | 55 | # 6) REPLACE INTO로 넣기 56 | con = sqlite3.connect("test.db") 57 | c =con.cursor() 58 | c.execute("REPLACE INTO df (a, b, id) VALUES (?, ?, ?)", (4, 4, "c")) 59 | con.commit() 60 | con.close() 61 | 62 | # 7) read_sql함수 이용하기 63 | con = sqlite3.connect("test.db") 64 | temp = pd.read_sql("SELECT * FROM df", con) 65 | print(temp) 66 | con.close() 67 | -------------------------------------------------------------------------------- /ch_01/107_mysql_db.py: -------------------------------------------------------------------------------- 1 | import pymysql 2 | 3 | db_conf = { 4 | "host": "127.0.0.1", 5 | "user": "test", 6 | "password": "test11", 7 | "database": "temp", 8 | } 9 | 10 | con = pymysql.connect(**db_conf) 11 | 12 | # 테이블 생성 13 | cur = con.cursor() 14 | cur.execute("DROP TABLE IF EXISTS stocks") 15 | cur.execute( 16 | """ 17 | CREATE TABLE stocks ( 18 | date VARCHAR(10), 19 | trans VARCHAR(20), 20 | symbol VARCHAR(10), 21 | qty INT, 22 | price INT, 23 | primary key (date) ) 24 | """ 25 | ) 26 | con.commit() 27 | con.close() 28 | 29 | # insert table 30 | con = pymysql.connect(**db_conf) 31 | cur = con.cursor() 32 | cur.execute( 33 | """ 34 | INSERT INTO stocks (date, trans, symbol, qty, price) 35 | VALUES (%s, %s, %s ,%s, %s) 36 | """, ("2019-10-12", "sell", "K029093", 6 ,10000) 37 | ) 38 | con.commit() 39 | con.close() 40 | 41 | # SELECT 42 | con = pymysql.connect(**db_conf) 43 | cur = con.cursor() 44 | cur.execute("SELECT * FROM stocks") 45 | df = cur.fetchall() 46 | con.commit() 47 | con.close() 48 | 49 | print(df) 50 | 51 | 52 | # 2) pandas_mysql 53 | import pandas as pd 54 | import pymysql 55 | from sqlalchemy import create_engine 56 | 57 | pymysql.install_as_MySQLdb() 58 | engine = create_engine("mysql://test:test11@localhost/temp") 59 | con = engine.connect() 60 | test1 = pd.DataFrame({"a":[1,2,3,4]}) 61 | test1.to_sql('test1', con, if_exists="append", index=False) 62 | con.close() 63 | 64 | 65 | -------------------------------------------------------------------------------- /ch_01/108_collect_stock_data.py: -------------------------------------------------------------------------------- 1 | import FinanceDataReader as fdr 2 | import pymysql 3 | from tqdm import tqdm 4 | from datetime import datetime 5 | 6 | db_conf = { 7 | "host": "127.0.0.1", 8 | "user": "test", 9 | "password": "test11", 10 | "database": "finance", 11 | } 12 | 13 | def create_table(db_conf): 14 | 15 | con = pymysql.connect(**db_conf) 16 | cur = con.cursor() 17 | 18 | cur.execute( 19 | """ 20 | CREATE TABLE IF NOT EXISTS STOCK_CODE ( 21 | symbol VARCHAR(6), 22 | name VARCHAR(30), 23 | sector VARCHAR(40), 24 | industry VARCHAR(200), 25 | collected_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 26 | primary key (symbol)) 27 | """) 28 | 29 | cur.execute( 30 | """ 31 | CREATE TABLE IF NOT EXISTS STOCK_DATA ( 32 | date VARCHAR(10), 33 | open int, 34 | high int, 35 | low int, 36 | close int, 37 | volume int, 38 | change_rate float, 39 | symbol VARCHAR(6), 40 | collected_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 41 | primary key (date, symbol)) 42 | """ 43 | ) 44 | 45 | con.commit() 46 | con.close() 47 | 48 | return 0 49 | 50 | def insert_code(df): 51 | 52 | con = pymysql.connect(**db_conf) 53 | cur = con.cursor() 54 | 55 | for symbol, name, sector, industry in zip(df["Symbol"], df["Name"], df["Sector"], df["Industry"]): 56 | cur.execute( 57 | """ 58 | REPLACE INTO STOCK_CODE (symbol, name, sector, industry) VALUES (%s, %s, %s, %s) 59 | """, (symbol, name, sector, industry)) 60 | 61 | con.commit() 62 | con.close() 63 | 64 | return 0 65 | 66 | def insert_stock_data(db_conf, symbol, df): 67 | 68 | df = df.reset_index(drop=False) 69 | df["Date"] = df["Date"].astype(str) 70 | df["Change"] = df["Change"].fillna(0) 71 | 72 | con = pymysql.connect(**db_conf) 73 | cur = con.cursor() 74 | 75 | for date, open, high, low, close, volume, change in zip(df["Date"], df["Open"], df["High"], df["Low"], df["Close"], df["Volume"], df["Change"]): 76 | cur.execute( 77 | """ 78 | REPLACE INTO STOCK_DATA (date, open, high, low, close, volume, change_rate, symbol) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) 79 | """, (date, open, high, low, close, volume, change, symbol)) 80 | 81 | con.commit() 82 | con.close() 83 | 84 | return 0 85 | 86 | def stock_data_collect(year): 87 | create_table(db_conf) 88 | df_krx = fdr.StockListing('KRX') 89 | df_krx = df_krx.fillna("") 90 | insert_code(df_krx) 91 | 92 | # 주가 데이터 93 | # symbol='005930' 94 | # year="2017" 95 | 96 | symbol_list = df_krx["Symbol"] 97 | 98 | for symbol in tqdm(symbol_list): 99 | try: 100 | df_sto = fdr.DataReader(symbol, year) 101 | insert_stock_data(db_conf, symbol, df_sto) 102 | except Exception as e: 103 | print(symbol, end=",") 104 | print(e) 105 | 106 | return 0 107 | 108 | 109 | if __name__ == '__main__': 110 | 111 | year = str(datetime.now().year) 112 | stock_data_collect(year) 113 | -------------------------------------------------------------------------------- /ch_01/a: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ch_02/203_plotly이용하기.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjpublic/python-for-finance-data/418d9a234e7389d19225769c710ae04b1dfdac3f/ch_02/203_plotly이용하기.zip -------------------------------------------------------------------------------- /ch_02/204_dash_html.py: -------------------------------------------------------------------------------- 1 | # coding = utf-8 2 | import dash 3 | import dash_html_components as html 4 | 5 | app = dash.Dash(__name__) 6 | 7 | app.layout = html.Div(children=[ 8 | html.H1(children='안녕하세요.'), 9 | html.H3('반갑습니다.'), 10 | html.Div('또 만났네요.', style={'color':'blue', 'fontSize':16}), 11 | html.P('안녕히 가세요.', className='class1', id='p1'), 12 | ]) 13 | 14 | if __name__ == '__main__': 15 | app.run_server(debug=True) 16 | -------------------------------------------------------------------------------- /ch_02/205_dash_markdown.py: -------------------------------------------------------------------------------- 1 | # coding = utf-8 2 | import dash 3 | import dash_core_components as dcc 4 | 5 | app = dash.Dash(__name__) 6 | 7 | app.layout = dcc.Markdown( 8 | """ 9 | ### 안녕하세요. 10 | ** 반갑습니다. ** 11 | - 오늘도 또 만났네요 12 | """ 13 | ) 14 | 15 | if __name__ == '__main__': 16 | app.run_server(debug=True, port=9999) 17 | -------------------------------------------------------------------------------- /ch_02/206_dash_real_estate.py: -------------------------------------------------------------------------------- 1 | # coding = utf-8 2 | import dash 3 | import dash_core_components as dcc 4 | import dash_html_components as html 5 | 6 | import plotly.express as px 7 | 8 | import pymysql 9 | import pandas as pd 10 | 11 | def apt_deal_cnt(): 12 | db_conf = { 13 | "host": "127.0.0.1", 14 | "user": "test", 15 | "password": "test11", 16 | "database": "finance", 17 | } 18 | 19 | con = pymysql.connect(**db_conf) 20 | apt_sale = pd.read_sql("SELECT * FROM APT_SALE WHERE YM>=201911 AND YM<=201912", con) 21 | con.close() 22 | 23 | apt_sale.columns = ["매매가격", "건축년도", "년", "월", "일", "동", "아파트명", "크기", "지번", "코드", "층", "년월", "id", "시간"] 24 | 25 | ji_code = pd.read_excel("./data/KIKcd_B.20181210.xlsx") 26 | ji_code["코드"] = ji_code["법정동코드"].astype(str).str[0:5] 27 | ji_code_nodup = ji_code[["코드", "시도명"]].drop_duplicates() 28 | apt_sale = pd.merge(apt_sale, ji_code_nodup, on="코드", how="left") 29 | 30 | g =px.histogram(apt_sale, x="시도명", y="시도명").update_xaxes(categoryorder="total descending") 31 | 32 | return g 33 | 34 | 35 | app = dash.Dash(__name__) 36 | 37 | app.layout = html.Div(children=[ 38 | html.H1(children='아파트 매매거래 건수'), 39 | html.Br(), 40 | dcc.Graph(figure=apt_deal_cnt()) 41 | ]) 42 | 43 | if __name__ == '__main__': 44 | app.run_server(debug=True, port=9971) 45 | -------------------------------------------------------------------------------- /ch_02/207_dash_real_estate_callback.py: -------------------------------------------------------------------------------- 1 | # coding = utf-8 2 | import dash 3 | import dash_core_components as dcc 4 | import dash_html_components as html 5 | from dash.dependencies import Input, Output 6 | 7 | import plotly.express as px 8 | 9 | import pymysql 10 | import pandas as pd 11 | 12 | db_conf = { 13 | "host": "127.0.0.1", 14 | "user": "test", 15 | "password": "test11", 16 | "database": "finance", 17 | } 18 | 19 | con = pymysql.connect(**db_conf) 20 | apt_sale = pd.read_sql("SELECT * FROM APT_SALE WHERE YM>=201901 AND YM<=201912", con) 21 | con.close() 22 | 23 | apt_sale.columns = ["매매가격", "건축년도", "년", "월", "일", "동", "아파트명", "크기", "지번", "코드", "층", "년월", "id", "시간"] 24 | 25 | ji_code = pd.read_excel("./data/KIKcd_B.20181210.xlsx") 26 | ji_code["코드"] = ji_code["법정동코드"].astype(str).str[0:5] 27 | ji_code_nodup = ji_code[["코드", "시도명"]].drop_duplicates() 28 | apt_sale = pd.merge(apt_sale, ji_code_nodup, on="코드", how="left") 29 | 30 | def apt_deal_cnt(ym=201912, apt_sale=apt_sale): 31 | 32 | apt_sale = apt_sale[apt_sale["년월"]==ym] 33 | g =px.histogram(apt_sale, x="시도명", y="시도명").update_xaxes(categoryorder="total descending") 34 | 35 | return g 36 | 37 | 38 | app = dash.Dash(__name__) 39 | 40 | app.layout = html.Div(children=[ 41 | html.H1(children='아파트 매매거래 건수'), 42 | html.Br(), 43 | dcc.Slider(id="ym", min=201901, max=201912, marks={r:str(r) for r in range(201901,202001)}, value=201912), 44 | dcc.Graph(id="graph", figure=apt_deal_cnt()) 45 | ]) 46 | 47 | @app.callback( 48 | Output("graph", "figure"), 49 | [Input('ym', 'value')] 50 | ) 51 | def update_graph(input_value): 52 | return apt_deal_cnt(input_value) 53 | 54 | 55 | if __name__ == '__main__': 56 | app.run_server(debug=True, port=9972) 57 | -------------------------------------------------------------------------------- /ch_02/a: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ch_03/302_currency_stock_real.py: -------------------------------------------------------------------------------- 1 | import pymysql 2 | import pandas as pd 3 | import seaborn as sns 4 | 5 | # 통화량 데이터 가져오기 6 | db_conf = { 7 | "host": "127.0.0.1", 8 | "user": "test", 9 | "password": "test11", 10 | "database": "finance", 11 | } 12 | 13 | con = pymysql.connect(**db_conf) 14 | df = pd.read_sql("SELECT * FROM kor_bank WHERE stat_code='001Y453'", con) 15 | con.close() 16 | 17 | # 데이터 타입 변경 18 | df["data_value"]=df["data_value"].astype(float) 19 | 20 | df["time"]=df["time"]+"01" 21 | df["time"]=df["time"].astype('datetime64') 22 | df["time"] = df["time"] + pd.offsets.MonthEnd() 23 | 24 | sns.lineplot(data=df, x="time", y="data_value", hue="item_code1") 25 | 26 | df["change_ratio"]=df.groupby("item_code1")["data_value"].pct_change(12)*100 27 | # a=df[["change_ratio","data_value","item_code1","time"]].head(100) 28 | sns.lineplot(data=df, x="time", y="change_ratio", hue="item_code1", 29 | style="item_code1") 30 | 31 | # 주가지수 수집하기 32 | import FinanceDataReader as fdr 33 | 34 | # KOSPI지수 수집하기 35 | df_kospi = fdr.DataReader('KS11', '2015') 36 | df_kospi.head() 37 | 38 | kospi_mean=df_kospi.resample('M', how="mean") 39 | kospi_mean["change_ratio"]=kospi_mean["Close"].pct_change(12)*100 40 | kospi_mean["item_code1"]="kospi" 41 | kospi_mean=kospi_mean.reset_index(drop=False) 42 | kospi_mean=kospi_mean.rename(columns={"Date":"time","Close":"data_value"}) 43 | 44 | df=pd.concat([df[["time","item_code1","data_value","change_ratio"]], 45 | kospi_mean[["time","item_code1","data_value","change_ratio"]]],0) 46 | 47 | df_graph=df[df["item_code1"].isin(["BBHA00","kospi"])] 48 | sns.lineplot(data=df_graph, x="time", y="change_ratio", hue="item_code1", 49 | style="item_code1",alpha=0.8) 50 | 51 | # 아파트 매매 데이터 불러오기 52 | con = pymysql.connect(**db_conf) 53 | df_apt = pd.read_sql("SELECT ym,avg(price) FROM apt_sale WHERE ym>='201501' and ym<='201912' GROUP BY ym", con) 54 | con.close() 55 | 56 | # 전년동월대비 증감율 구하기 57 | df_apt["change_ratio"]=df_apt["avg(price)"].pct_change()*100 58 | 59 | # 시간과 매매가격 데이터 타입 맞추 60 | df_apt.columns=["time","data_value","change_ratio"] 61 | df_apt["time"]=df_apt["time"]*100+1 62 | df_apt["time"]=df_apt["time"].astype(str).astype('datetime64') 63 | df_apt["time"] = df_apt["time"] + pd.offsets.MonthEnd() 64 | df_apt["item_code1"]="APT" 65 | 66 | # 그래프 그리기 67 | df_graph=pd.concat([df_graph,df_apt],0) 68 | df_graph.index=df_graph["time"] 69 | df_graph=df_graph["2016":] 70 | sns.set_style("whitegrid") 71 | sns.lineplot(data=df_graph, x="time", y="change_ratio", hue="item_code1", 72 | style="item_code1", markers=True, alpha=0.8) 73 | 74 | # df_graph1["time"]=df_graph1["time"].astype(int) 75 | # sns.lmplot(data=df_graph1, x="time", y="change_ratio", hue="item_code1", order=3) 76 | 77 | from sklearn.preprocessing import MinMaxScaler 78 | import numpy as np 79 | 80 | #최소-최대 정규화 81 | scaler=MinMaxScaler() 82 | df_graph1=pd.DataFrame() 83 | for d in df_graph.groupby("item_code1"): 84 | d[1]["cr_minmax"]=scaler.fit_transform(d[1][["change_ratio"]]) 85 | df_graph1=pd.concat([df_graph1,d[1]],0) 86 | 87 | sns.lineplot(data=df_graph1, x="time", y="cr_minmax", hue="item_code1", 88 | style="item_code1", markers=True, alpha=0.8) 89 | 90 | df_graph_gr=df_graph1.groupby("item_code1")["cr_minmax"].rolling(6).mean() 91 | df_graph_gr=df_graph_gr.reset_index(drop=False) 92 | sns.lineplot(data=df_graph_gr, x="time", y="cr_minmax", hue="item_code1", 93 | style="item_code1") -------------------------------------------------------------------------------- /ch_03/303_base_interest_rates.py: -------------------------------------------------------------------------------- 1 | from urllib.request import urlopen 2 | from bs4 import BeautifulSoup 3 | from html_table_parser import parser_functions as parser 4 | import pymysql 5 | import pandas as pd 6 | import time 7 | 8 | 9 | # 외국금리 10 | # https://www.global-rates.com/interest-rates/central-banks/central-bank-japan/boj-interest-rate.aspx 11 | 12 | def get_for_rate(nation,to="2019-12-31"): 13 | 14 | nation_list={"KOR":"/central-bank-south-korea/bank-of-korea-interest-rate.aspx", 15 | "JPN":"/central-bank-japan/boj-interest-rate.aspx", 16 | "USA":"/central-bank-america/fed-interest-rate.aspx", 17 | "CHI":"/central-bank-china/pbc-interest-rate.aspx", 18 | "EUR":"/european-central-bank/ecb-interest-rate.aspx" 19 | } 20 | 21 | url=nation_list.get(nation, "-1") 22 | 23 | if url=="-1": 24 | print("국가명을 확인해주세요.") 25 | return -1 26 | 27 | url="https://www.global-rates.com/interest-rates/central-banks{}".format(url) 28 | result=urlopen(url).read() 29 | soup=BeautifulSoup(result,"html.parser") 30 | table_tags=soup.find_all("table") 31 | 32 | # for idx,t in enumerate(table_tags): 33 | # try: 34 | # print("{}: ".format(idx),end="") 35 | # print(t.find_all("h3")[0].text) 36 | # except: 37 | # pass 38 | 39 | table = parser.make2d(table_tags[18]) 40 | df = pd.DataFrame(table[2:], columns=table[1]) 41 | df.head() 42 | 43 | df["dt"]=df["change date"].astype("datetime64") 44 | df_range=pd.DataFrame({"dt":pd.date_range(df["dt"].min(),to)}) 45 | 46 | df_1=pd.merge(df_range,df,how="left") 47 | df_1["percentage"]=df_1["percentage"].fillna(method="ffill") 48 | df_1["percentage"]=df_1["percentage"].str.replace("\xa0%","").astype(float) 49 | 50 | df_1["nation"]=nation 51 | df_1=df_1.drop("change date",1) 52 | df_1=df_1.rename(columns={"percentage":"base_rate"}) 53 | 54 | time.sleep(3) 55 | 56 | return df_1 57 | 58 | 59 | # 국가별 기준 금리 정보를 수집합니다. 60 | df_kor=get_for_rate("KOR") 61 | df_jpn=get_for_rate("JPN") 62 | df_usa=get_for_rate("USA") 63 | df_chi=get_for_rate("CHI") 64 | df_eur=get_for_rate("EUR") 65 | df=pd.concat([df_kor,df_jpn,df_usa,df_chi,df_eur],0) 66 | 67 | # 모든 국가에 포함된 시작일자를 구합니다. 68 | df_min_dt=df.groupby('nation')["dt"].min() 69 | df_min_dt=max(df_min_dt) 70 | df_graph=df.loc[df["dt"]>=df_min_dt] 71 | 72 | import seaborn as sns 73 | sns.lineplot(data=df_graph,x="dt",y="base_rate",hue="nation", alpha=0.7) 74 | 75 | 76 | # 금리 관련 뉴스 정보를 수집합니다. 77 | API_KEY="96f5b5ce63766554fbcb884684641572" 78 | word="금리" 79 | 80 | from urllib.parse import quote 81 | 82 | url="https://gnews.io/api/v3/search?q={}&lang=ko&token={}".format(quote(word),API_KEY) 83 | result=urlopen(url) 84 | html=result.read() 85 | 86 | 87 | import urllib.request 88 | import json 89 | 90 | client_id = "발급받은 Client ID를 넣습니다." 91 | client_secret = "발급받은 Client Secret을 넣습니다." 92 | encText = urllib.parse.quote("금리") 93 | url = "https://openapi.naver.com/v1/search/news.json?query=" + encText # json 결과 94 | 95 | request = urllib.request.Request(url) 96 | request.add_header("X-Naver-Client-Id",client_id) 97 | request.add_header("X-Naver-Client-Secret",client_secret) 98 | response = urllib.request.urlopen(request) 99 | 100 | res=response.read() 101 | result=json.loads(res) 102 | -------------------------------------------------------------------------------- /ch_03/304_dashboard.py: -------------------------------------------------------------------------------- 1 | # coding = utf-8 2 | import dash 3 | import dash_core_components as dcc 4 | import dash_html_components as html 5 | import collect_base_interest_rates as gbr 6 | import pandas as pd 7 | import plotly.express as px 8 | 9 | app=dash.Dash(__name__) 10 | 11 | def get_interests_graph(): 12 | df=pd.read_pickle("df_graph.pkl") 13 | fig=px.line(df, x="dt", y="base_rate", color="nation") 14 | 15 | return fig 16 | 17 | def get_news(): 18 | """ 19 | :return: 네이버뉴스 검색 리스트 20 | """ 21 | result=gbr.get_naver_news() 22 | 23 | items=result["items"] 24 | link_list=[] 25 | 26 | from datetime import datetime, timezone, timedelta 27 | now=datetime.now(timezone.utc) + timedelta(hours=9) 28 | now=datetime.strftime(now,"%Y-%m-%d %H:%M:%S") 29 | link_list.append(html.Div(children="뉴스 검색시간:{}".format(now),style={"text-align":"right"})) 30 | 31 | for i in items: 32 | exc_word=[""","",""] 33 | title=i["title"] 34 | description=i["description"] 35 | 36 | for e in exc_word: 37 | title=title.replace(e,"") 38 | description=description.replace(e, "") 39 | 40 | #제목 링크 넣기 41 | link=html.A(title,href=i["originallink"],style={"font-size":"14pt"}) 42 | link=html.Li(link) 43 | link_list.append(link) 44 | 45 | # 설명 추가 46 | description=html.Article(description) 47 | link_list.append(description) 48 | 49 | # 공백추가 50 | link_list.append(html.Br()) 51 | 52 | return link_list 53 | 54 | def serve_layout(): 55 | 56 | return html.Div(children=[ 57 | html.H3("주요각국 기준 금리 현황", style={'text-align': 'center'}), 58 | dcc.Graph(id="graph1", figure=get_interests_graph()), 59 | html.Br(), 60 | html.H3("금리 관련 주요 뉴스", style={'text-align': 'center'}), 61 | html.Div(children=get_news()), 62 | ]) 63 | 64 | 65 | app.layout=serve_layout 66 | 67 | if __name__ == '__main__': 68 | app.run_server() 69 | -------------------------------------------------------------------------------- /ch_03/305_real_estate_lent_ratio.py: -------------------------------------------------------------------------------- 1 | # coding = utf-8 2 | 3 | import pymysql 4 | import pandas as pd 5 | import numpy as np 6 | import seaborn as sns 7 | 8 | db_conf = { 9 | "host": "127.0.0.1", 10 | "user": "test", 11 | "password": "test11", 12 | "database": "finance", 13 | } 14 | 15 | con = pymysql.connect(**db_conf) 16 | apt_sale = pd.read_sql("SELECT * FROM APT_SALE WHERE YM>=201911 AND YM<=202001", con) 17 | apt_lent = pd.read_sql("SELECT * FROM APT_LENT WHERE YM>=201911 AND YM<=202001", con) 18 | con.close() 19 | 20 | apt_sale.columns = ["매매가격", "건축년도", "년", "월", "일", "동", "아파트명", "크기", "지번", "코드", "층", "년월", "id", "시간"] 21 | apt_lent.columns=["건축년도","년","동","보증금가격","아파트명","월","월세","거래일","크기","지번","코드","층","년월","id","시간"] 22 | 23 | # 시도명을 붙입니다. 24 | ji_code = pd.read_excel("./data/KIKcd_B.20181210.xlsx") 25 | ji_code["코드"] = ji_code["법정동코드"].astype(str).str[0:5] 26 | ji_code_nodup = ji_code[["코드", "시도명", "시군구명"]].drop_duplicates() 27 | 28 | apt_sale = pd.merge(apt_sale, ji_code_nodup, on="코드", how="left") 29 | apt_lent = pd.merge(apt_lent, ji_code_nodup, on="코드", how="left") 30 | 31 | # 아파트 평수를 나눕니다. 32 | label = ["10평미만", "10평대","20평대", "30평대", "40평대", "50평대", "60평대", "60평대 이상"] 33 | apt_sale["평수"] = apt_sale["크기"]/3.3 34 | apt_sale["평수구분"] = pd.cut(apt_sale["평수"], [0,10, 20, 30,40,50, 60,70,np.Inf], labels=label) 35 | 36 | apt_lent["평수"] = apt_lent["크기"]/3.3 37 | apt_lent["평수구분"] = pd.cut(apt_lent["평수"], [0,10, 20, 30,40,50, 60,70,np.Inf], labels=label) 38 | 39 | # 전세 데이터만 추출합니다. 40 | apt_lent_j = apt_lent.loc[apt_lent["월세"]==0] 41 | 42 | # 평균거래가격을 계사합니다. 43 | apt_sale_gr = apt_sale.groupby(["시도명", "시군구명", "동", "지번" ,"아파트명", "평수구분"]).agg({"매매가격":"mean","아파트명":"size"}) 44 | apt_sale_gr.columns = ["매매가_평균", "매매거래건수"] 45 | 46 | apt_lent_j_gr = apt_lent_j.groupby(["시도명", "시군구명", "동","지번" ,"아파트명", "평수구분"]).agg({"보증금가격":"mean","아파트명":"size"}) 47 | apt_lent_j_gr.columns = ["전세가_평균", "전세거래건수"] 48 | 49 | # 거래건수 비중 50 | sns.countplot(apt_sale_gr["매매거래건수"], label="small") 51 | sns.countplot(apt_lent_j_gr["전세거래건수"], label="small") 52 | 53 | # 매매, 전세 데이터 결합 54 | apt_tot = pd.merge(apt_lent_j_gr, apt_sale_gr, how="inner", left_index=True, right_index=True) 55 | 56 | apt_tot["전세가_비율"]=apt_tot["전세가_평균"]/apt_tot["매매가_평균"] 57 | pd.set_option('display.max_columns', 100) 58 | apt_tot.sort_values("전세가_비율", ascending=False) 59 | apt_tot.head() 60 | 61 | # 전세가비율 그래프 그리기 62 | import numpy as np 63 | g = sns.distplot(apt_tot["전세가_비율"]) 64 | g.set_xticks(np.arange(0,2.5,0.1)) 65 | apt_tot.to_pickle("apt_tot.pkl") 66 | -------------------------------------------------------------------------------- /ch_03/306_gang_nam_time.py: -------------------------------------------------------------------------------- 1 | # coding = utf-8 2 | 3 | import pymysql 4 | import pandas as pd 5 | import numpy as np 6 | import seaborn as sns 7 | 8 | 9 | # 강남역에서 출퇴근 하기 좋은 아파트 확인하기 10 | apt_tot=pd.read_pickle("apt_tot.pkl") 11 | 12 | # 경기도 시도명 확인 13 | apt_tot=apt_tot.reset_index(drop=False) 14 | temp=apt_tot.loc[apt_tot["시도명"].isin(["경기도"])] 15 | temp["시군구명"].value_counts() 16 | 17 | # 구리시, 하남시, 성남시 18 | apt_tot=apt_tot.reset_index(drop=False) 19 | apt_kkd=apt_tot.loc[apt_tot["시군구명"].str[0:3].isin(["구리시","하남시","성남시"])] 20 | apt_kkd["시도명"].value_counts() 21 | 22 | import tat 23 | tat.distplot(data=apt_kkd, x="전세가_비율", hue="시군구명") 24 | 25 | # 70%이상 추출하기 26 | apt_kkd_70 = apt_kkd[apt_kkd["전세가_비율"]>0.7] 27 | len(apt_kkd_70) 28 | 29 | apt_kkd_70["주소"]=apt_kkd_70["시도명"]+" "+apt_kkd_70["시군구명"] + " " + apt_kkd_70["동"] +" "+ apt_kkd_70["지번"] +" "+ apt_kkd_70["아파트명"] 30 | apt_kkd_70=apt_kkd_70.reset_index(drop=True) 31 | juso=apt_kkd_70["주소"][0] 32 | 33 | from urllib.request import urlopen 34 | from urllib.parse import quote 35 | import time 36 | import json 37 | import random 38 | 39 | # https://developers.google.com/maps/documentation/directions/intro#TravelModes 40 | 41 | api_key="발급받은 API키를 입력합니다." 42 | apt_kkd_70["시간"]="" 43 | 44 | for idx, juso in enumerate(apt_kkd_70["주소"]): 45 | try: 46 | url="https://maps.googleapis.com/maps/api/directions/json?origin="+quote(juso)+"&destination="+quote("강남역")+"&mode=transit&key="+api_key 47 | result=urlopen(url).read() 48 | json_result = json.loads(result) 49 | dur_time = json_result["routes"][-1]["legs"][-1]["duration"]["text"] 50 | apt_kkd_70.loc[apt_kkd_70["주소"]==juso,"시간"] = dur_time 51 | print("{}: {}, {}".format(idx,juso,dur_time)) 52 | except Exception as e: 53 | print(e) 54 | 55 | time.sleep(random.randint(1,3)) 56 | 57 | apt_kkd_70.head() 58 | 59 | def change_to_m(x): 60 | if x=="": 61 | return None 62 | 63 | if x.find("hours")>-1: 64 | h=x.split(" hours")[0] 65 | h=int(h)*60 66 | x=x.split(" hours")[1] 67 | elif x.find("hour")>-1: 68 | h=x.split(" hour")[0] 69 | h=int(h)*60 70 | x=x.split(" hour")[1] 71 | else: 72 | h=0 73 | 74 | m=x.split(" min")[0] 75 | m=int(m) 76 | 77 | return h+m 78 | 79 | apt_kkd_70["대중"]=apt_kkd_70["시간"].apply(change_to_m) 80 | len(apt_kkd_70) 81 | 82 | apt_kkd_70_1 = apt_kkd_70[apt_kkd_70["대중"].isnull()==False] 83 | len(apt_kkd_70_1) 84 | 85 | tat.distplot(data=apt_kkd_70_1, x="대중", hue="시군구명") 86 | 87 | sns.scatterplot(data=apt_kkd_70_1, x="전세가_비율", y="대중", hue="평수구분") 88 | 89 | temp = apt_kkd_70_1[(apt_kkd_70_1["대중"]<50) & (apt_kkd_70_1["전세가_비율"]>0.85)] 90 | print(temp) -------------------------------------------------------------------------------- /ch_03/307_dividend.py: -------------------------------------------------------------------------------- 1 | # coding = utf-8 2 | from selenium import webdriver 3 | import time 4 | 5 | # 보통중 데이터 수집 6 | def get_div_data(browser,last_num,file_nm): 7 | search_btn = browser.find_element_by_id("image1") 8 | search_btn.click() 9 | 10 | # html소스를 가져와서, 원하는 위치를 찾습니다. 11 | html = browser.page_source 12 | 13 | from bs4 import BeautifulSoup 14 | from html_table_parser import parser_functions as parser 15 | import pandas as pd 16 | 17 | soup = BeautifulSoup(html, "html.parser") 18 | table = soup.find("table", attrs={"id":"grid1_body_table"}) 19 | p = parser.make2d(table) 20 | df = pd.DataFrame(p[2:],columns=p[1]) 21 | df.head() 22 | 23 | import time 24 | import random 25 | from tqdm import tqdm 26 | 27 | prev_no = 0 28 | prev_table = None 29 | 30 | for i in tqdm(range(0,200)): 31 | 32 | try: 33 | next_btn = browser.find_element_by_id("cntsPaging01_next_btn") 34 | next_btn.click() 35 | except: 36 | time.sleep(2) 37 | try: 38 | next_btn = browser.find_element_by_id("cntsPaging01_next_btn") 39 | next_btn.click() 40 | except: 41 | time.sleep(2) 42 | next_btn = browser.find_element_by_id("cntsPaging01_next_btn") 43 | next_btn.click() 44 | 45 | def get_html(browser, cnt): 46 | 47 | if cnt>=4: 48 | return -1, -1 49 | 50 | html = browser.page_source 51 | soup = BeautifulSoup(html, 'html.parser') 52 | 53 | cur_no = soup.find("a", attrs={"class":"w2pageList_control_label w2pageList_label_selected"}) 54 | cur_no = cur_no.text 55 | 56 | table = soup.find("table", attrs={"id": "grid1_body_table"}) 57 | 58 | if cur_no!=prev_no and prev_table!=table: 59 | return cur_no, table 60 | else: 61 | time.sleep(1) 62 | get_html(browser, cnt+1) 63 | 64 | cur_no, table = get_html(browser, 1) 65 | 66 | if cur_no== -1: 67 | print("\n종료. 테이블 정보가 바뀌지 않았습니다.") 68 | break 69 | 70 | p=parser.make2d(table) 71 | temp=pd.DataFrame(p[2:],columns=p[1]) 72 | df = pd.concat([df, temp],0) 73 | prev_no = cur_no 74 | prev_table = html 75 | 76 | if cur_no==str(last_num): 77 | print("\n최종 페이지 도달") 78 | break 79 | time.sleep(random.randrange(3,5)) 80 | df.to_pickle(file_nm) 81 | 82 | 83 | # 전체 데이터 수집하기 84 | browser = webdriver.Chrome('/Applications/chromedriver') 85 | browser.get("http://www.seibro.or.kr/websquare/control.jsp?w2xPath=/IPORTAL/user/company/BIP_CNTS01042V.xml&menuNo=286#") 86 | time.sleep(5) 87 | # 배당주 메뉴의 마지막 페이지번호, 저장할 파일명을 넣습니다. 88 | get_div_data(browser,"96","stock_div.pkl") 89 | -------------------------------------------------------------------------------- /ch_03/a: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /소스코드.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjpublic/python-for-finance-data/418d9a234e7389d19225769c710ae04b1dfdac3f/소스코드.zip --------------------------------------------------------------------------------