다트 API를 통한 공시내역 가져오기

이현지·2024년 7월 19일
0

데이터 분석

목록 보기
7/13

다트를 통한 데이터 분석

  1. 설치 및 임포트
!pip install dart_fss
import dart_fss
## 테스트 해보기 / 안될경우 kernal 탭에서 restart 누르기 

import pandas as pd

api_key = '~'  ## api키 입력위치

dart_fss.set_api_key(api_key=api_key)

corp_list = dart_fss.get_corp_list() ## 회사들의 리스트를 뽑아 출력한다는 의미

corp_list.corps[:10]
                                   
[[00434003]다코,
 [00430964]굿앤엘에스,
 [00388953]크레디피아제이십오차유동화전문회사,
 [00179984]연방건설산업,
 [00420143]브룩스피알아이오토메이션잉크,
 [00401111]매경아이비아이,
 [00435534]캐드뱅크,
 [00430186]엠와이오피삼차유동화전문유한회사,
 [00430201]엠와이오피이차유동화전문유한회사,
 [00430210]엠와이오피일차유동화전문유한회사]
 
  1. 코드 얻기
dart_fss.api.filings.get_corp_code()
                           
[{'corp_code': '00434003',
  'corp_name': '다코',
  'stock_code': None,
  'modify_date': '20170630'},
 {'corp_code': '00430964',
  'corp_name': '굿앤엘에스',
  1. 이것을 데이터프레임으로 만들기
df1  = dart_fss.api.filings.get_corp_code()
df2 = pd.DataFrame(df1)
df2

변수 저장 없이 감싸는 코딩으로 데이터프레임으로 만들 수 있다.
다만, 모든 데이터를 조회한 후에 헤드를 추출하기 떄문에 오래 걸린다.

pd.DataFrame(dart_fss.api.filings.get_corp_code()).head()

추출한 내용을 df에 담는다.

df = pd.DataFrame(dart_fss.api.filings.get_corp_code())

4.결측값을 제거하기

df['stock_code'].notnull()
0         False
1         False
2         False
3         False
4         False
          ...  
107248    False
107249    False
107250    False
107251    False
107252    False
Name: stock_code, Length: 107253, dtype: bool
  1. 결측값이 없는 데이터프레임만 확인
df[df['stock_code'].notnull()]

  1. 특정부서 데이터만 추출하기

부서['소속팀']=='인사팀' (인사팀에 해당하는 부서들의 정보만 추출)

부서[부서['소속팀']=='인사팀']

df_list = df[df['stock_code'].notnull()]
df_not_listed = df[df['stock_code'].isnull()]

스탁코드나오는 데이터 프레임 확인
(상장주식)

df_list

스탁코드가 없는 데이터 프레임 확인
(비상장주식)

df_not_listed

  1. 카운트해서 비교해보기
df_list.count()
corp_code      3748
corp_name      3748
stock_code     3748
modify_date    3748
dtype: int64
df_not_listed.count()
corp_code      103505
corp_name      103505
stock_code          0
modify_date    103505
dtype: int64
  1. 상장종목과 비상장종목을 엑셀로 만들기
df_list.to_excel('상장종목.xlsx')
df_not_listed.to_excel('비상장종목.xlsx')

저장 위치 확인 -> 변수지정
예) C:/Users/폴더1/바탕 화면/폴더2/
역슬러시를 모두 슬러시로 변경해야 함
메모장(notepad)를 통해서 모두바꾸기 기능을 활용하기도 한다.

(방법1 슬러시 1개)

df_list.to_excel('C:/Users/폴더1/바탕 화면/폴더2.xlsx')

(방법2 역슬러시 2개)

df_list.to_excel('C:\\Users\\폴더1\\바탕 화면\\폴더2\\상장종목1.xlsx')
  1. ODR 임포트
import OpenDartReader as odr
my_api = '~'  ## api키 입력위치
dart = odr(my_api)
  1. 삼성전자의 특정 기간에 대한 데이터 받아오기

공시내역을 가져올 수 있다.

# 삼성전자의 특정 기간에 대한 데이터 받아오기 (공시내역 확인 가능)
result = dart.list("삼성전자", start = "2020-01-01", end = "2024-07-11")
display(result.head()) # 위 5개 행 출력
display(result.shape) # 데이터프레임 구조 출력

  1. 헤드 보기
result.head()

  1. 문서의 일부 미리보기
doc = dart.document("20240705800411")
print(doc[:500]

주어진 파이썬 코드 스니펫은 dart_fss 라이브러리를 사용하여 특정 문서를 가져와서 그 내용을 출력하는 예제입니다. 코드를 하나씩 해석해보겠습니다.

doc = dart.document("20240705800411")
print(doc[:500])

해석

  1. doc = dart.document("20240705800411"):

    • 기능: dart.document 함수는 주어진 문서 번호 "20240705800411"에 해당하는 문서를 DART 시스템에서 가져온다.
  2. print(doc[:500]):

    • 기능: doc 변수에 저장된 문서 내용 중 처음 500자를 출력한다.
<html>
 <head> 
  <meta content="gdi" http-equiv="X-UA-TextLayoutMetrics"> 
  <meta content="text/html; charset=euc-kr" http-equiv="Content-Type"> 
  <STYLE>
.xforms * { font-family: 돋움체;}
.xforms_title * { font-size: 13pt; padding : 0 0 10 0;}

.xforms table {
    font-size: 10px;
    padding:0px;
    border-collapse:collapse;
    color: #3D3D3D;
}
.xforms td {
    padding-left:0px;
    padding-top:0px;
    border-collapse:collapse;
    line-height:22px;
    color: #3D3D3D;
  1. 전체 문서 보기
doc

보기 불편하게 나오는 것을 확인할 수 있다.

![](https://velog.velcdn.com/images/darinlee/post/22fcee66-31d9-4433-b004-6164048f5db9/image.png

  1. 디스플레이를 사용해서 배당 정보를 확인하기
# 삼성전자의 배당 정보 확인
display(dart.report("삼성전자", "배당", 2024, "11013"))

  1. 재무제표에 대한 특정 정보를 확인하기

삼성전자 연결제무제표에 있는 특정 정보를 추출한다.

result = dart.finstate("삼성전자", 2024, "11013") 
result = result.loc[result["fs_nm"] == "연결재무제표"] 
result = result.loc[result["account_nm"].isin(["당기순이익", "영업이익", "매출액"])] 
result = result.loc[:, ["account_nm", "fs_nm", "sj_nm", "thstrm_dt", "thstrm_amount"]]
display(result)

result = dart.finstate("삼성전자", 2024, "11013") 

result = result.loc[result["fs_nm"] == "연결재무제표"]
result

  1. LOC을 활용해서 정보 추출하기
result = result.loc[result["account_nm"].isin(["당기순이익", "영업이익", "매출액"])] 
result

result = result.loc[:, ["account_nm", "fs_nm", "sj_nm", "thstrm_dt", "thstrm_amount"]]
result

display(result)

  1. 데이터 타입 확인

thstrm_amount에 콤마(,)가 포함되어 있어서 문자로 인식됨

print(result["thstrm_amount"].dtype) 

object

  1. 특정 문자열 교체, 플로트 타입으로 변경하기
#str의 특정 문자열을 교체하기 + float 타입으로 변경하기 (찾기~바꾸기)

result["thstrm_amount"].str.replace(",", "").astype(float)
9     7.191560e+13
10    6.606009e+12
12    6.754708e+12
Name: thstrm_amount, dtype: float64
  1. 결과 추출
result

19-1. 다른 방법 (def 활용)

def remove_comma(value):
    return float(value.replace(",", ""))

display(result["thstrm_amount"].apply(remove_comma))
9     7.191560e+13
10    6.606009e+12
12    6.754708e+12
Name: thstrm_amount, dtype: float64
profile
관심분야: 추천시스템, 자연어처리, 머신러닝, 딥러닝

0개의 댓글