-
Dart Open API를 활용하면 공시 정보를 ‘데이터 분석’에 활용기술(Tech) 2023. 1. 6. 10:56반응형
Dart Open API를 활용하면 공시 정보를 ‘데이터 분석’에 활용
!pip install dart-fss
Dart OpenAPI 키 발급
https://opendart.fss.or.kr/uat/uia/egovLoginUsr.do:
DART FSS 공식문서 이용하기
https://dart-fss.readthedocs.io/en/latest/dart_api.html
API 키 입력하기
import dart_fss as dart_fss import pandas as pd api_key = '8ab1ea24fe1576a0c7eab24998794f49b06c7aa9' dart_fss.set_api_key(api_key=api_key) corp_list = dart_fss.get_corp_list() # DART 공시된 회사 리스트 반환 corp_list.corps
DART에 등록되어있는 공시대상회사의 고유번호,회사명,대표자명,종목코드, 최근변경일자 다운로드"""
all = dart_fss.api.filings.get_corp_code() all[0] df = pd.DataFrame(all) # 받아온값을 데이터프레임으로 만들어 놓고 사용한다. df_listed = df[df['stock_code'].notnull()] # stock_code가 있는것 = 상장종목 df_non_listed = df[df['stock_code'].isnull()] # stock_code 없는것 = 비상장종목 # df_listed.to_excel('상장종목.xlsx') #파일생성후 저장 # df_non_listed.to_excel('비상장종목.xlsx') df_non_listed.head()
한 개 종목을 정해서 코드를 찾기"""
df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
기업정보 가져오기"""
corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0] dart_fss.api.filings.get_corp_info(corp_code)
미등기임원 보수 총액"""
corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0] data = dart_fss.api.info.unrst_exctv_mendng_sttus(corp_code, '2021', '11011') data['list'] # 리스트로 받아온데이터를 데이터프레임으로 만들어 넣는다 pd.DataFrame(data['list'])
증자(감사) 현황"""
data = dart_fss.api.info.irds_sttus(corp_code, '2021', '11011') pd.DataFrame(data['list'])
배당 현황"""
data = dart_fss.api.info.alot_matter(corp_code, '2021', '11011') pd.DataFrame(data['list'])
최대주주 현황"""
data = dart_fss.api.info.hyslr_sttus(corp_code, '2021', '11011') pd.DataFrame(data['list'])
원하는 모양으로 만들어봅니다!"""
data = dart_fss.api.info.hyslr_sttus(corp_code, '2021', '11011') df = pd.DataFrame(data['list']) df = df[['corp_name','nm','relate','bsis_posesn_stock_qota_rt','trmend_posesn_stock_qota_rt','rm']] df.columns = ['회사명','이름','관계','기초지분율','기말지분율','비고'] df = df[df['관계'].notnull()] df['기초지분율'] = pd.to_numeric(df['기초지분율']) df['기말지분율'] = pd.to_numeric(df['기말지분율']) df.sort_values(by='기초지분율',ascending=False).head(3)
임원사항"""
data = dart_fss.api.info.exctv_sttus(corp_code, '2021', '11011') pd.DataFrame(data['list'])
직원현황"""
data = dart_fss.api.info.emp_sttus(corp_code, '2021', '11011') pd.DataFrame(data['list'])
이사보수"""
data = dart_fss.api.info.hmv_audit_indvdl_by_sttus(corp_code, '2021', '11011') pd.DataFrame(data['list'])
연봉 top5 """
data = dart_fss.api.info.indvdl_by_pay(corp_code, '2021', '11011') pd.DataFrame(data['list'])
타법인 출자 현황"""
data = dart_fss.api.info.otr_cpr_invstmnt_sttus(corp_code, '2021', '11011') pd.DataFrame(data['list'])
재무제표의 3년 치 주요 정보"""
corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0] # 3년치 주요 정보 # data = dart_fss.api.finance.fnltt_singl_acnt(corp_code, '2021', '11011') # 모든 항목의 정보 data = dart_fss.api.finance.fnltt_singl_acnt_all(corp_code, '2021', '11011','CFS') pd.DataFrame(data['list'])
임원, 주요 주주 소유 보고"""
corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0] data = dart_fss.api.shareholder.elestock(corp_code) pd.DataFrame(data['list'])
결과 항목의 특정 사람만 검색 할때
df_temp = pd.DataFrame(data['list']) df_temp[df_temp['repror'] == '김범수']
특정기업 top5 연봉 (함수로 구현)"""
def get_salary_top(name): corp_code = df_listed[df_listed['corp_name'] == name].iloc[0,0] data = dart_fss.api.info.indvdl_by_pay(corp_code, '2021', '11011') # dart 의 연봉 제공 정보를 이용 data에 담고 df_temp = pd.DataFrame(data['list']) # 데이터프레임을 temp 로 만들어서 가공 df_temp = df_temp[['corp_name','nm','ofcps','mendng_totamt']] # 필요한 정보만 보기 df_temp.columns = ['기업명','이름','역할','보수'] # 컬럼명을 한글로 바꾸기 df_temp['보수'] = pd.to_numeric(df_temp['보수'].str.replace(',','')) # 금액을 숫자로 변환 df_temp = df_temp.sort_values(by='보수',ascending=False) # 숫자는 정렬이 가능 return df_temp
get_salary_top('LG에너지솔루션') # 함수를 실행해 보자
names = ['삼성전자','LG에너지솔루션','SK하이닉스','NAVER','삼성바이오로직스','삼성전자우','카카오','삼성SDI','현대차','LG화학','기아','POSCO홀딩스','KB금융','카카오뱅크','셀트리온','신한지주','삼성물산','현대모비스','SK이노베이션','LG전자','카카오페이','SK','한국전력','크래프톤','하나금융지주','LG생활건강','HMM','삼성생명','하이브','두산중공업','SK텔레콤','삼성전기','SK바이오사이언스','LG','S-Oil','고려아연','KT&G','우리금융지주','대한항공','삼성에스디에스','현대중공업','엔씨소프트','삼성화재','아모레퍼시픽','KT','포스코케미칼','넷마블','SK아이이테크놀로지','LG이노텍','기업은행'] # name 변수에 대상 기업명을 나열해 보자 dfs = [] # 리스트 변수를 하나 만들고 for name in names: # 루프를 돌면서 함수에 대입 try: df = get_salary_top(name) dfs.append(df) # 함수에 하나씩 붙이기 except: print(f'없음 - {name}') # 정보가 없는 기업은 에러만 표기 df_result = pd.concat(dfs) df_result.sort_values(by='보수',ascending=False) df_result.sort_values(by='보수',ascending=False).head(30) # 상위30개만 보기
최대주주 주식 변동 모아보기"""
corp_code = df_listed[df_listed['corp_name'] == '하이브'].iloc[0,0] # 기업명을 작성하여 리스트에서 코드만 추출 corp_code
주요주주 지분률"""
data = dart_fss.api.info.hyslr_sttus('01204056', '2021', '11011') # dart 에서 주요주주 기분율 보기 이용 df = pd.DataFrame(data['list']) # 데이터프레임에 담고 df 에 저장 df
# 원하는 컬럼만 추출 df = df[['corp_name','nm','relate','bsis_posesn_stock_qota_rt','trmend_posesn_stock_qota_rt','rm']] # 컬럼을 한글명으로 바꾸고 df.columns = ['회사명','이름','관계','기초지분율','기말지분율','비고'] # 특정조건이 예) 관계가 notnull 인것만 추출 df = df[df['관계'].notnull()] # 숫자로 변환 df['기초지분율'] = pd.to_numeric(df['기초지분율']) df['기말지분율'] = pd.to_numeric(df['기말지분율']) df.sort_values(by='기초지분율',ascending=False).head(3) # 정렬 및 상위 3개만 보기
위 조건을 함수로 """
def get_shareholders(corp_code): data = dart_fss.api.info.hyslr_sttus(corp_code, '2021', '11011') df = pd.DataFrame(data['list']) df = df[['corp_name','nm','relate','bsis_posesn_stock_qota_rt','trmend_posesn_stock_qota_rt','rm']] df.columns = ['회사명','이름','관계','기초지분율','기말지분율','비고'] df = df[df['관계'].notnull()] df['기초지분율'] = pd.to_numeric(df['기초지분율']) df['기말지분율'] = pd.to_numeric(df['기말지분율']) return df.sort_values(by='기초지분율',ascending=False).head(3)
get_shareholders('01204056') # 함수 실행해 보기
상장종목 10 만 랜덤하게 보기"""
df_listed.sample(10) #
# 10개 종목의 코드를 출력해 보자 corp_codes = list(df_listed.sample(10)['corp_code']) for corp_code in corp_codes: print(corp_code)
# 10개 기업을 붙여서 보자 corp_codes = list(df_listed.sample(10)['corp_code']) dfs = [] for corp_code in corp_codes: try: df = get_shareholders(corp_code) # 지분률 보기 함수를 사용하여 dfs.append(df) except: print(f'error - {corp_code}') df_result = pd.concat(dfs) df_result
# 증감이 큰 순서대로 정렬하기 corp_codes = list(df_listed.sample(10)['corp_code']) dfs = [] for corp_code in corp_codes: try: df = get_shareholders(corp_code) dfs.append(df) except: print(f'error - {corp_code}') df_result = pd.concat(dfs) df_result['증감'] = df_result['기말지분율'] - df_result['기초지분율'] df_result.sort_values(by='증감',ascending=False)
1#### 비상장 종목은 ‘사업보고서 주요정보’만 분석할 수 있어요
⇒ ‘배당’ 항목을 통해 당기순이익을 확인해볼게요!
# ⇒ 배당 정보 가져오기 corp_code = df_non_listed[df_non_listed['corp_name'] == '야놀자'].iloc[0,0] data = dart_fss.api.info.alot_matter(corp_code, '2021', '11011') df = pd.DataFrame(data['list']) df
# ⇒ 배당 정보 다듬기 df = df[df['se'] == '(연결)당기순이익(백만원)'][['corp_name','thstrm','frmtrm','lwfr']] df.columns = ['기업명','2021','2020','2019'] df
# ⇒ 함수로 만들기 def get_earning(name): corp_code = df_non_listed[df_non_listed['corp_name'] == '야놀자'].iloc[0,0] data = dart_fss.api.info.alot_matter(corp_code, '2021', '11011') df = pd.DataFrame(data['list']) df = df[df['se'] == '(연결)당기순이익(백만원)'][['corp_name','thstrm','frmtrm','lwfr']] df.columns = ['기업명','2021','2020','2019'] return df
상장회사 배당정보 보기"""
반응형# ⇒ 배당 정보 가져오기 corp_code = df_listed[df_listed['corp_name'] == '삼성전자'].iloc[0,0] data = dart_fss.api.finance.fnltt_singl_acnt(corp_code, '2021', '11011') pd.DataFrame(data['list'])
# ⇒ 배당 정보 다듬기 df = pd.DataFrame(data['list']) df = df[df['fs_div'] == 'CFS'] df['name'] = '삼성전자' cond = df['account_nm'] == '이익잉여금' df = df[cond] df = df[['name','thstrm_amount','frmtrm_amount']] df.columns = ['이름','당기','전기'] df['당기'] = pd.to_numeric(df['당기'].str.replace(',','')) df['전기'] = pd.to_numeric(df['전기'].str.replace(',','')) df['증감'] = df['당기'] - df['전기'] df['증감율'] = abs(df['증감'])/abs(df['전기']) df
# ⇒ 함수로 만들기 def get_profit(corp_name): corp_code = df_listed[df_listed['corp_name'] == corp_name].iloc[0,0] data = dart_fss.api.finance.fnltt_singl_acnt(corp_code, '2021', '11011') df = pd.DataFrame(data['list']) df = df[df['fs_div'] == 'CFS'] df['name'] = corp_name cond = df['account_nm'] == '이익잉여금' df = df[cond] df = df[['name','thstrm_amount','frmtrm_amount']] df.columns = ['이름','당기','전기'] df['당기'] = pd.to_numeric(df['당기'].str.replace(',','')) df['전기'] = pd.to_numeric(df['전기'].str.replace(',','')) df['증감'] = df['당기'] - df['전기'] df['증감율'] = abs(df['증감'])/abs(df['전기']) return df
get_profit('현대자동차') # 함수 실행해 보기
# 여러 종목 해보기 names = list(df_listed.sample(10)['corp_name']) dfs = [] for name in names: try: df = get_profit(name) dfs.append(df) except: print(f'error - {name}') df_result = pd.concat(dfs) df_result
# 더많이 정렬해서 보기 names = list(df_listed.sample(100)['corp_name']) dfs = [] for name in names: try: df = get_profit(name) dfs.append(df) except: print(f'error - {name}') df_result = pd.concat(dfs) df_result.sort_values(by='증감율',ascending=False)
남녀 평균 급여 차이가 가장 ‘안’ 나는 회사를 찾아보기"""
# 카카오로 해보자 corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0] data = dart_fss.api.info.emp_sttus(corp_code, '2021', '11011') pd.DataFrame(data['list'])
# 함수로 def get_salary(corp_code): data = dart_fss.api.info.emp_sttus(corp_code, '2021', '11011') # dart 직원정보 보기 활용 df = pd.DataFrame(data['list']) # 데이터프레임에 담고 df = df[['corp_name','sexdstn','jan_salary_am']] # 필요한 컬럼만 정의 df_result = pd.DataFrame() # 빈 프레임을 하나 만들고 doc = { '기업명':df.iloc[0,0], '연봉(남)':df[df['sexdstn'] == '남'].iloc[0,2], '연봉(여)':df[df['sexdstn'] == '여'].iloc[0,2] } # 도큐먼트로 추가할 컬럼을 만들고 df_result = df_result.append(doc, ignore_index=True) # 임시변수에 추가 # 숫자로 변환 df_result['연봉(남)'] = pd.to_numeric(df_result['연봉(남)'].str.replace(',','')) df_result['연봉(여)'] = pd.to_numeric(df_result['연봉(여)'].str.replace(',','')) return df_result
get_salary('00258801') # 남여 평균 연봉 함수
# 여러 회사 해보기 corp_codes = list(df_listed.sample(10)['corp_code']) dfs = [] for corp_code in corp_codes: try: df = get_salary(corp_code) dfs.append(df) except: print(f'error - {corp_code}') df_result = pd.concat(dfs) df_result
# 차이가 많은 순서대로 정렬 하여 보기 corp_codes = list(df_listed.sample(10)['corp_code']) dfs = [] for corp_code in corp_codes: try: df = get_salary(corp_code) dfs.append(df) except: print(f'error - {corp_code}') df_result = pd.concat(dfs) df_result['차이(남-여)'] = df_result['연봉(남)'] - df_result['연봉(여)'] df_result['평균'] = (df_result['연봉(남)']+df_result['연봉(여)'])/2 df_result.sort_values(by="차이(남-여)",ascending=True)
반응형'기술(Tech)' 카테고리의 다른 글
개발의 시초 C언어의 기본 (0) 2023.03.26 협업을 위한 협업 도구 Git 공부 GitHub (0) 2023.03.23 [완강후기] 스파르타 코딩클럽 엑셀보다 쉬운 SQL (0) 2023.02.05 [완강 후기] 스파르타코딩클럽 주식 데이터를 활용한 파이썬 데이터분석 (0) 2023.02.05 실무에 필요했던 ? SQL (0) 2022.12.27