project_finance (1)
코스피, 코스닥에 상장된 기업들의 기업개황 테이블 만들기
OpenDartReader 라이브러리를 활용한 재무제표 분석
project_finance
전체코드 finstate.py/github
-
stock_infos: 코스피, 코스닥에 상장된 기업들의
기업개황 테이블columns = [stock_code, stock_name, corp_code]
(리스트의 각 원소 자료형: string)key = stock_code
code
import requests
import zipfile
import io
import os
import json
import pandas as pd
import xml.etree.ElementTree as ET
from datetime import datetime, timedelta
try:
from pandas import json_normalize
except ImportError:
from pandas.io.json import json_normalize
import OpenDartReader
api_key = "ef3149d745caee09f48df5004b905ec4ef3f5d7e"
dart = OpenDartReader(api_key)
def corp_codes(api_key):
url = 'https://opendart.fss.or.kr/api/corpCode.xml'
params = { 'crtfc_key': api_key, }
r = requests.get(url, params=params)
try:
tree = ET.XML(r.content)
status = tree.find('status').text
message = tree.find('message').text
if status != '000':
raise ValueError({'status': status, 'message': message})
except ET.ParseError as e:
pass
zf = zipfile.ZipFile(io.BytesIO(r.content))
xml_data = zf.read('CORPCODE.xml')
# XML to DataFrame
tree = ET.XML(xml_data)
all_records = []
element = tree.findall('list')
for i, child in enumerate(element):
record = {}
for i, subchild in enumerate(child):
record[subchild.tag] = subchild.text
all_records.append(record)
return pd.DataFrame(all_records)
corps = corp_codes(api_key)
# dart에서 제공하는 회사들의 기업개황 table
corps
corp_code | corp_name | stock_code | modify_date | |
---|---|---|---|---|
0 | 00434003 | 다코 | 20170630 | |
1 | 00434456 | 일산약품 | 20170630 | |
2 | 00430964 | 굿앤엘에스 | 20170630 | |
3 | 00432403 | 한라판지 | 20170630 | |
4 | 00388953 | 크레디피아제이십오차유동화전문회사 | 20170630 | |
... | ... | ... | ... | ... |
87912 | 01560457 | 삼원개발 | 20210506 | |
87913 | 01556533 | 에이더블유파트너스 | 20210506 | |
87914 | 01546299 | 동영와이케이 | 20210506 | |
87915 | 00694605 | 미디어윌 | 20210506 | |
87916 | 01368761 | 엔브이에이치원방테크 | 20210506 |
87917 rows × 4 columns
# corps에서 stock_code가 존재하는 회사만 stock_codes table에 할당
stock_codes = pd.DataFrame()
i = 0
for s in corps["stock_code"]:
if len(s) == 6:
stock_codes = stock_codes.append(corps.loc[i], ignore_index=True)
i += 1
# 종목코드가 존재하는 회사들의 기업개황 table
stock_codes
corp_code | corp_name | modify_date | stock_code | |
---|---|---|---|---|
0 | 00260985 | 한빛네트 | 20170630 | 036720 |
1 | 00264529 | 엔플렉스 | 20170630 | 040130 |
2 | 00358545 | 동서정보기술 | 20170630 | 055000 |
3 | 00231567 | 애드모바일 | 20170630 | 032600 |
4 | 00247939 | 씨모스 | 20170630 | 037600 |
... | ... | ... | ... | ... |
3349 | 00925295 | 에프엔씨엔터 | 20210901 | 173940 |
3350 | 00521390 | 뉴파워프라즈마 | 20210602 | 144960 |
3351 | 00838500 | 엘브이엠씨 | 20210611 | 900140 |
3352 | 00160232 | KSS해운 | 20210628 | 044450 |
3353 | 01412822 | 솔루스첨단소재 | 20210824 | 336370 |
3354 rows × 4 columns
# stock_codes에서 코스피, 코스닥 시장에 상장된 회사들만 stock_infos table에 할당
columns_infos = ["stock_code", "stock_name", "corp_code"]
stock_infos = pd.DataFrame(columns=columns_infos)
i = 0
for s in stock_codes["corp_name"]:
market = dart.company(s)["corp_cls"]
if market == "Y":
stock_code = stock_codes.loc[i, "stock_code"] + ".KS"
stock_name = stock_codes.loc[i, "corp_name"]
corp_code = stock_codes.loc[i, "corp_code"] + ".KS"
infos = pd.DataFrame([(stock_code, stock_name, corp_code)], columns=columns_infos)
stock_infos = stock_infos.append(infos, ignore_index=True)
elif market == "K":
stock_code = stock_codes.loc[i, "stock_code"] + ".KQ"
stock_name = stock_codes.loc[i, "corp_name"]
corp_code = stock_codes.loc[i, "corp_code"] + ".KQ"
infos = pd.DataFrame([(stock_code, stock_name, corp_code)], columns=columns_infos)
stock_infos = stock_infos.append(infos, ignore_index=True)
i += 1
# 코스피, 코스닥 시장에 상장된 회사들의 기업개황 table
stock_infos
stock_code | stock_name | corp_code | |
---|---|---|---|
0 | 950130.KQ | 엑세스바이오 | 00956028.KQ |
1 | 152550.KS | 한국ANKOR유전 | 00907013.KS |
2 | 900070.KQ | 글로벌에스엠 | 00783246.KQ |
3 | 900120.KQ | 씨케이에이치 | 00800084.KQ |
4 | 096300.KS | 베트남개발1 | 00626710.KS |
... | ... | ... | ... |
2015 | 173940.KQ | 에프엔씨엔터 | 00925295.KQ |
2016 | 144960.KQ | 뉴파워프라즈마 | 00521390.KQ |
2017 | 900140.KS | 엘브이엠씨 | 00838500.KS |
2018 | 044450.KS | KSS해운 | 00160232.KS |
2019 | 336370.KS | 솔루스첨단소재 | 01412822.KS |
2020 rows × 3 columns
stock_infos 테이블은 앞으로 많은 테이블의 부모 테이블이 될 예정이다.