새소식

📘 기초 지식

파이썬 코딩 3주차 기록일지

  • -

1. Dart OpenAPI 활용하기

 

    - dart-fss 라이브러리 설치, 키 구동

 

     !pip install dart-fss

     import dart_fss as dart_fss
     import pandas as pd

     api_key = ' a581c040247a426828cd9589f6cb6787dfdcf0fa'
     dart_fss.set_api_key(api_key=api_key)

2.  종목 정리하기

 

     - 전체 종목 불러오기

     all = dart_fss.api.filings.get_corp_code()

 

     - 상장, 비상장 종목 정리하고 엑셀 저장하기

     df = pd.DataFrame(all)

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

     df_listed.to_excel('상장종목.xlsx')
     df_non_listed.to_excel('비상장종목.xlsx')
 
 
3. 원하는 정보 불러오기
      -  open dart api 사이트에서 원하는 정보 코드를 가져와서 사용
 
      - 시총 Top 50 社 - 연봉왕 뽑아보기
      
def get_salary(name):                                                                                                      
  corp_code = df_listed[df_listed['corp_name'] == name].iloc[0,0]             (iloc 쓰는 이유는 0.0에  corp code가 있기 때문)            
  data = dart_fss.api.info.indvdl_by_pay(corp_code, '2021''11011')

  df = pd.DataFrame(data['list'])


  df = df[['corp_name''nm''ofcps''mendng_totamt']]

  df.columns = ['기업명''이름''역할''보수']

  df['보수'] = pd.to_numeric(df['보수'].str.replace(',',''))           (pd.to_numeric은 문자를 숫자로 바꿔 주는것)

  return df
names = ['삼성전자','LG에너지솔루션','SK하이닉스','NAVER','삼성바이오로직스','삼성전자우','카카오']

dfs = []
for name in names:
  try:
    df = get_salary(name)
    dfs.append(df)
  except:
    print(f'error - {name}')

df_result = pd.concat(dfs)

df_result.sort_values(by = '보수', ascending = False).head(30)

    - 최대 주주의 주식변동 알아보기

corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
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)

      - 변형 -> 함수를 만들어서 코드만 있어도 되게 만들기

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('00258801')

- 그런데 데이터는 10000개 밖에 불러오지 못하는데 전부 할 수 없으니 샘플 가져와서 기말지분율에서 기초지분율을 뺀 증감 순서에 맞게 분류하기

corp_codes = 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)

- 돈을 많이 번 회사 찾기

def get_profit(name):
  corp_code = df_listed[df_listed['corp_name'] == name].iloc[0,0]
  data = dart_fss.api.finance.fnltt_singl_acnt(corp_code, '2021''11011')
  df = pd.DataFrame(data['list'])

  cond = (df['fs_div'] == 'CFS') & (df['account_nm'] == '이익잉여금')
  df = df[cond]

  df['name'] = name

  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
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.sort_values(by = '증감율', ascending = False)
 
- 비상장 종목 알아보기
 
def get_earning(name):
  corp_code = df_non_listed[df_non_listed['corp_name'] == name].iloc[0,0]
  data = dart_fss.api.info.alot_matter(corp_code, '2021''11011')
  df = pd.DataFrame(data['list'])

  df = df[df['se'] == '(연결)당기순이익(백만원)']
  df = df[['corp_name''thstrm''frmtrm''lwfr']]

  df.columns = ['기업명''2021''2020''2019']

  df['2021'] = pd.to_numeric(df['2021'].str.replace(','''))
  df['2020'] = pd.to_numeric(df['2020'].str.replace(','''))
  df['2019'] = pd.to_numeric(df['2019'].str.replace(','''))

  return df

 

4. 숙제하기 (남녀 연봉차이가 가장 안나는 회사 찾기)

 

def get_salary(name):
  corp_code = df_listed[df_listed['corp_name'] == name].iloc[0,0]
  data = dart_fss.api.info.emp_sttus(corp_code, '2021''11011')

  df = pd.DataFrame(data['list'])
  df = df[['corp_name''sexdstn''jan_salary_am']]                  (컬럼은 기존 대괄호를 갖고 있기때문에 대괄호 2개를 써줌)

  df_result = pd.DataFrame()
  doc = {
      '기업명' : name,
      '연봉(남)' : df[df['sexdstn'] == '남'].iloc[-1,-1],
      '연봉(여)' : df[df['sexdstn'] == '여'].iloc[-1,-1]
  }
  df_result = df_result.append(doc, ignore_index = True)         (append는 추가, ignore_index = True는 기존 인덱스를 무시)

  df_result['연봉(남)'] = pd.to_numeric(df_result['연봉(남)'].str.replace(','''))
  df_result['연봉(여)'] = pd.to_numeric(df_result['연봉(여)'].str.replace(','''))

  df_result['차이(남-여)'] =  df_result['연봉(남)'] - df_result['연봉(여)']
  df_result['평균'] = (df_result['연봉(남)'] + df_result['연봉(여)']) / 2

  return df_result
 
names = list(df_listed.sample(10)['corp_name'])

dfs = []
for name in names:
  try:
    df = get_salary(name)
    dfs.append(df)
  except:
    print(f'error - {name}')

df_result = pd.concat(dfs)                                                            (concat은 결합)
df_result.sort_values(by = '차이(남-여)', ascending= True)

'📘 기초 지식' 카테고리의 다른 글

파이썬 코딩 개발일지 4주차  (0) 2022.09.13
SQL 개발일지 3주차  (0) 2022.09.07
SQL 개발일지 2주차  (0) 2022.09.02
파이썬 코딩 2주차 기록일지  (0) 2022.09.02
파이썬 코딩 1주차 기록일지  (0) 2022.08.30
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.