본문 바로가기
python

파이썬 3주차 - 1)Open API 키 받고 Dart fss 활용

by 치킨먹는예티 2023. 7. 5.
!pip install dart-fss

다트도 라이브러리가 있다니 ㄷㄷㄷ 파이썬 용도 어디까지인것

https://dart-fss.readthedocs.io/en/latest/

 

DART-FSS — dart-fss documentation v0.4.3 documentation

© Copyright 2023, Sungwoo Jo Revision 086846b1.

dart-fss.readthedocs.io

여기서 기능 확인 가능!

 

 

all = dart_fss.api.filings.get_corp_code()
all[0]

 

위는 전체 종목을 보는 코드

 

df = pd.DataFrame(all)

df

DataFrame 라이브러리를 써서 데이터 형식으로 만들수도 있다.

 

df_listed = df[df['stock_code'].notnull()]
df_non_listed = df[df['stock_code'].isnull()]

데이터로 뽑았을 때 'stock_code'가 있는 기업이 상장, 아닌 기업이 비상장이므로

위처럼 상장, 비상장 df를 만들어놓을 수 있다.

df_listed.to_excel('비상장사.xlsx')

df_non_listed.to_excel('상장사.xlsx')

판다스로 이렇게 쓰면 엑셀로 뽑힌다.

corp_code = df_listed[df_listed['corp_name'] == '삼성전자'].iloc[0,0]

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')
pd.DataFrame(data['list'])

카카오의 김범수씨는 주식을 얼마나 갖고 있을까?

corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
data = dart_fss.api.shareholder.elestock(corp_code)

df_temp = pd.DataFrame(data['list'])
df_temp[df_temp['repror'] == '김범수']

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')
  
  df_temp = pd.DataFrame(data['list'])
  df_temp = df_temp[['corp_name','nm','ofcps','mendng_totamt']]  // 칼럼을 지정하고
  df_temp.columns = ['기업명','이름','역할','보수']  // 이름을 바꿀 수 있다.
  df_temp['보수'] = pd.to_numeric(df_temp['보수'].str.replace(',',''))  // 이걸 안 하면 금액에 ,이 있어서 sort가 안됨
  df_temp = df_temp.sort_values(by='보수',ascending=False)
  
  return df_temp

get_salary_top('기업명') 쓰면 제일 돈 많이 받는 사람들이 나온다.

names = ['삼성전자','LG에너지솔루션','SK하이닉스','NAVER','삼성바이오로직스','삼성전자우','카카오','삼성SDI','현대차','LG화학','기아','POSCO홀딩스','KB금융','카카오뱅크','셀트리온','신한지주','삼성물산','현대모비스','SK이노베이션','LG전자','카카오페이','SK','한국전력','크래프톤','하나금융지주','LG생활건강','HMM','삼성생명','하이브','두산중공업','SK텔레콤','삼성전기','SK바이오사이언스','LG','S-Oil','고려아연','KT&G','우리금융지주','대한항공','삼성에스디에스','현대중공업','엔씨소프트','삼성화재','아모레퍼시픽','KT','포스코케미칼','넷마블','SK아이이테크놀로지','LG이노텍','기업은행']

dfs = []

for name in names:
  try:  // try, except:를 안 쓰면, 포함 안 되는 기업이 하나라도 있을 때 에러가 떠버림
    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)

너무 많이 뽑기에는 dart fss 라이브러리 횟수제한에 걸릴 수 있으므로 .head()를 쓰자

 

 

아래처럼 조건을 여러 개 추가해서 보고싶은 대로 볼 수 있다.

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)

성별별로 급여 차이 가장 안 나는 회사 정렬하기도 가능

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)