diff --git a/example/10-stock-data.py b/example/10-stock-data.py index 0798cf1..4acc0cf 100644 --- a/example/10-stock-data.py +++ b/example/10-stock-data.py @@ -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)