728x90
숫자형 변수를 범주형 변수로 변환하는 것을 구간화(Binning)라고 한다. 쉽게 설명하면 히스토그램을 생각하면 된다. 특정부분에서의 결측치가 많거나 의미있는 정보가 아닌 경우, 그리고 Raw Data로는 정보를 추출하기 힘든 경우 사용하면 된다. 그렇다고 모든 연속형 변수를 Binning시키면 중요한 정보가 사라질 수 있다. 모든 데이터 분석이 그렇듯이 분석자의 역량과 판단이 중요하다.
from bs4 import BeautifulSoup
import pandas as pd
import requests
from io import BytesIO
from zipfile import ZipFile
import json
def get_company_code(api_key):
url = 'https://opendart.fss.or.kr/api/corpCode.xml?crtfc_key=%s' % api_key
response = requests.get(url)
zip_file = ZipFile(BytesIO(response.content))
files = zip_file.namelist()
soup = ''
with zip_file.open(files[0]) as csvfile:
soup = BeautifulSoup(csvfile.read(), 'lxml')
soup = soup.findAll('list')
data = []
for company in soup:
data.append({
'corp_code': company.corp_code.text,
'corp_name': company.corp_name.text,
'stock_code': company.stock_code.text,
'modify_date': company.modify_date.text
})
return pd.DataFrame(data)
def get_multi_account(api_key, code, year, report_code):
fullUrl = 'https://opendart.fss.or.kr/api/fnlttMultiAcnt.json?crtfc_key=%s&corp_code=%s&' \
'bsns_year=%s&reprt_code=%s' % (api_key, code, year, report_code)
response = requests.get(fullUrl, headers={'User-Agent': 'Mozilla/5.0'})
result = response.text
result = json.loads(result)
if result['status'] == '000':
data = pd.DataFrame(result['list'])
return data
if __name__ == '__main__':
api_key = '*'
company_code = get_company_code(api_key)
code = ','.join(company_code[company_code['stock_code'].isin(['005930', '005380', '000660','035720', '035420', '093050', '051910', '207940', '051900'])]['corp_code'].tolist())
year = '2020'
report_code = '11011'
multi_account = get_multi_account(api_key, code, year, report_code)
multi_account = multi_account[['stock_code', 'fs_nm', 'account_nm', 'thstrm_amount']]
multi_account = multi_account[(multi_account['fs_nm']=='연결재무제표') & (multi_account['account_nm']=='당기순이익')]
multi_account['thstrm_amount'] = multi_account['thstrm_amount'].str.replace(',', '').astype(float) / 100000000
# bins = (미포함, 포함]
bins = [0, 500, 1000, 1500, 2000, 3000, 5000, 10000, 20000, 50000, 100000, 300000]
multi_account['bins'] = pd.cut(multi_account['thstrm_amount'], bins=bins)
multi_account = multi_account.merge(company_code[['stock_code', 'corp_name']], how='left', on='stock_code')
print(multi_account)
결과 값
stock_code fs_nm account_nm thstrm_amount bins corp_name
0 005930 연결재무제표 당기순이익 264078.320000 (100000, 300000] 삼성전자
1 000660 연결재무제표 당기순이익 47589.140000 (20000, 50000] SK하이닉스
2 035720 연결재무제표 당기순이익 1733.596719 (1500, 2000] 카카오
3 035420 연결재무제표 당기순이익 8449.969771 (5000, 10000] NAVER
4 051910 연결재무제표 당기순이익 6824.080000 (5000, 10000] LG화학
5 051900 연결재무제표 당기순이익 8131.011400 (5000, 10000] LG생활건강
6 093050 연결재무제표 당기순이익 285.960299 (0, 500] LF
7 207940 연결재무제표 당기순이익 2409.748000 (2000, 3000] 삼성바이오로직스
728x90
'Data Science > Data Preprocessing' 카테고리의 다른 글
[03. Feature Engineering] 005. Dummy (0) | 2021.07.06 |
---|---|
[03. Feature Engineering] 004. Transform (0) | 2021.06.29 |
[03. Feature Engineering] 002. Scaling (0) | 2021.06.24 |
[03. Feature Engineering] 001. Aggregation (0) | 2021.06.24 |
[02. Data Quality Assessment] 003. Duplicate values (0) | 2020.12.18 |