feat: 10장 조회한 데이터 DB 저장

This commit is contained in:
ayuriel 2025-01-30 22:45:04 +09:00
parent 18016bfdec
commit 083153a367

View File

@ -1,4 +1,5 @@
import logging
import os
import re
from io import BytesIO
@ -6,6 +7,10 @@ import numpy as np
import pandas as pd
import requests as rq
from bs4 import BeautifulSoup
import pymysql
from dotenv import load_dotenv
load_dotenv()
GEN_OTP_URL = 'http://data.krx.co.kr/comm/fileDn/GenerateOTP/generate.cmd'
DOWN_URL = 'http://data.krx.co.kr/comm/fileDn/download_csv/download.cmd'
@ -95,25 +100,49 @@ def get_total_stock_data(biz_day):
# 데이터 정리
# 종목, 개별 중 한군데만 있는 데이터 삭제(선박펀드, 광물펀드, 해외종목 등)
diff = list(set(krx_sector['종목명']).symmetric_difference(set(krx_ind['종목명'])))
kor_ticket = pd.merge(krx_sector, krx_ind, on=krx_sector.columns.intersection(krx_ind.columns).tolist(), how='outer')
kor_ticker = pd.merge(krx_sector, krx_ind, on=krx_sector.columns.intersection(krx_ind.columns).tolist(), how='outer')
# 일반적인 종목과 SPAC, 우선주, 리츠, 기타 주식을 구분
kor_ticket['종목구분'] = np.where(kor_ticket['종목명'].str.contains('스팩|제[0-9]+호'), '스팩',
np.where(kor_ticket['종목코드'].str[-1:] != '0', '우선주',
np.where(kor_ticket['종목명'].str.endswith('리츠'), '리츠',
np.where(kor_ticket['종목명'].isin(diff), '기타',
kor_ticker['종목구분'] = np.where(kor_ticker['종목명'].str.contains('스팩|제[0-9]+호'), '스팩',
np.where(kor_ticker['종목코드'].str[-1:] != '0', '우선주',
np.where(kor_ticker['종목명'].str.endswith('리츠'), '리츠',
np.where(kor_ticker['종목명'].isin(diff), '기타',
'보통주'
))))
kor_ticket = kor_ticket.reset_index(drop=True)
kor_ticket.columns = kor_ticket.columns.str.replace(' ', '')
kor_ticket = kor_ticket[['종목코드', '종목명', '시장구분', '종가',
kor_ticker = kor_ticker.reset_index(drop=True)
kor_ticker.columns = kor_ticker.columns.str.replace(' ', '')
kor_ticker = kor_ticker[['종목코드', '종목명', '시장구분', '종가',
'시가총액', '기준일', 'EPS', '선행EPS', 'BPS', '주당배당금', '종목구분']]
kor_ticket = kor_ticket.replace({np.nan: None})
kor_ticket['기준일'] = pd.to_datetime(kor_ticket['기준일'])
return kor_ticket
kor_ticker = kor_ticker.replace({np.nan: None})
kor_ticker['기준일'] = pd.to_datetime(kor_ticker['기준일'])
return kor_ticker
def save_db(ticker):
con = pymysql.connect(user=os.getenv('DB_USER'),
passwd=os.getenv('DB_PW'),
host=os.getenv('DB_HOST'),
port=int(os.getenv('DB_PORT')),
db=os.getenv('DB_DB'),
charset='utf8')
mycursor = con.cursor()
query = f"""
insert into kor_ticker (종목코드,종목명,시장구분,종가,시가총액,기준일,EPS,선행EPS,BPS,주당배당금,종목구분)
values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) as new
on duplicate key update
종목명=new.종목명,시장구분=new.시장구분,종가=new.종가,시가총액=new.시가총액,EPS=new.EPS,선행EPS=new.선행EPS,
BPS=new.BPS,주당배당금=new.주당배당금,종목구분 = new.종목구분;
"""
args = ticker.values.tolist()
mycursor.executemany(query, args)
con.commit()
con.close()
if __name__ == '__main__':
latest_biz_day = get_latest_biz_day()
data = get_total_stock_data(latest_biz_day)
print(data)
save_db(data)