ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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)
     

     

    반응형

    댓글

Designed by Tistory.