daily_buy_list.py
5.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
from sqlalchemy import *
from pandas import DataFrame
import datetime
from library.daily_crawler import *
from library.cf import *
# -* daily_buy_list *-
# 일자별로 주식종목에 대한 데이터를 저장하는 데이터베이스
class daily_buy_list():
def __init__(self):
self.cf=library.cf
self.variable_setting()
# 변수 설정
def variable_setting(self):
self.today = datetime.datetime.today().strftime("%Y%m%d")
self.today_detail = datetime.datetime.today().strftime("%Y%m%d%H%M")
self.start_date = self.cf.start_daily_buy_list
self.engine_daily_craw = create_engine(
"mysql+pymysql://" + self.cf.db_id + ":" + self.cf.db_pw + "@" + self.cf.db_ip + ":" + self.cf.db_port + "/daily_craw",
encoding='utf-8')
self.engine_daily_buy_list = create_engine(
"mysql+pymysql://" + self.cf.db_id + ":" + self.cf.db_pw + "@" + self.cf.db_ip + ":" + self.cf.db_port + "/daily_buy_list",
encoding='utf-8')
# 설정한 날짜부터 현재까지 날짜 리스트를 저장하는 함수
def date_rows_setting(self):
query = "select date from 대한항공 where date >= '%s' group by date"
self.date_rows = self.engine_daily_craw.execute(query % self.start_date).fetchall()
# daily_buy_list 데이터베이스에 특정 이름(date)을 가진 테이블이 존재하는지 확인하는 함수
def is_table_exist_daily_buy_list(self, date):
query = "select 1 from information_schema.tables where table_schema ='daily_buy_list' and table_name = '%s'"
rows = self.engine_daily_buy_list.execute(query % (date)).fetchall()
if len(rows) == 1:
return True
elif len(rows) == 0:
return False
# daily_buy_list 데이터베이스 안에 테이블을 생성하는 함수
def daily_buy_list(self):
self.date_rows_setting()
self.get_stock_item_all()
for k in range(len(self.date_rows)):
print(str(k) + " 번째 : " + datetime.datetime.today().strftime(" ******* %H : %M : %S *******"))
# 특정 날짜의 이름을 가진 테이블 존재하는지 확인
# 테이블이 존재하면 다음 날짜를 확인
if self.is_table_exist_daily_buy_list(self.date_rows[k][0]):
continue
# 테이블이 존재하지 않으면 생성
else:
multi_list = list()
for i in range(len(self.stock_item_all)):
code = self.stock_item_all[i][1] # 종목코드
code_name = self.stock_item_all[i][0] # 종목명
# daily_craw 데이터베이스에 종목명을 가진 테이블이 존재하지 않는 경우 다음 데이터 처리
# daily_craw에 저장한 종목에 대해서만 daily_buy_list에 날짜별 데이터를 저장한다
if not self.is_table_exist_daily_craw(code, code_name):
continue
query = f"select * from {self.stock_item_all[i][0]} where date = '{self.date_rows[k][0]}' " \
f"group by date"
rows = self.engine_daily_craw.execute(query).fetchall()
multi_list += rows
if len(multi_list) != 0:
df_temp = DataFrame(multi_list,
columns=['index', 'date', 'check_item', 'code', 'code_name',
'd1_diff','d1_diff_rate',
'close', 'open', 'high', 'low','volume',
'clo5', 'clo10', 'clo20', 'clo60', 'clo120',
"clo5_diff_rate", "clo10_diff_rate","clo20_diff_rate",
"clo60_diff_rate", "clo120_diff_rate",
'yes_clo5', 'yes_clo10', 'yes_clo20', 'yes_clo60', 'yes_clo120',
'vol5', 'vol10', 'vol20', 'vol60', 'vol120'
])
df_temp.to_sql(name=self.date_rows[k][0], con=self.engine_daily_buy_list, if_exists='replace')
# stock_item_all(거래할 종목 리스트)에서 모든 항목을 가져오는 함수
def get_stock_item_all(self):
print("get_stock_item_all!!!!!!")
sql = "select code_name,code from stock_item_all"
self.stock_item_all = self.engine_daily_buy_list.execute(sql).fetchall()
# daily_craw 데이터베이스에 특정 이름(code_name)을 가진 테이블이 존재하는지 확인하는 함수
def is_table_exist_daily_craw(self, code, code_name):
sql = "select 1 from information_schema.tables where table_schema ='daily_craw' and table_name = '%s'"
rows = self.engine_daily_craw.execute(sql % (code_name)).fetchall()
if len(rows) == 1:
return True
elif len(rows) == 0:
return False
if __name__ == "__main__":
daily_buy_list = daily_buy_list()
daily_buy_list.date_rows_setting()