📘 기초 지식
파이썬 코딩 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
소중한 공감 감사합니다