양지수

KNU for kospi

1 +# -*-coding:utf-8-*-
2 +import collections
3 +import json
4 +
5 +import warnings
6 +
7 +warnings.simplefilter(("ignore"))
8 +import openpyxl
9 +import pandas as pd
10 +import re
11 +from datetime import datetime
12 +
13 +########코스피 감성 판단
14 +class KnuSL():
15 +
16 + def data_list(wordname):
17 + with open('KnuSentiLex/data/SentiWord_info.json', encoding='utf-8-sig', mode='r') as f:
18 + data = json.load(f)
19 + result = [0, 0]
20 +
21 + for i in range(0, len(data)):
22 + if data[i]['word'] == wordname:
23 + result.pop()
24 + result.pop()
25 + result.append(data[i]['word_root'])
26 + result.append(int(data[i]['polarity']))
27 +
28 + r_word = result[0] # 어근
29 + s_word = result[1] # 극성
30 +
31 + return s_word
32 +
33 +
34 +if __name__ == "__main__":
35 + ksl = KnuSL
36 +
37 + print("\nKNU 한국어 감성사전입니다~ :)")
38 + print("사전에 단어가 없는 경우 결과가 None으로 나타납니다!!!")
39 + print("종료하시려면 #을 입력해주세요!!!")
40 + print("-2:매우 부정, -1:부정, 0:중립 or Unkwon, 1:긍정, 2:매우 긍정")
41 + print("\n")
42 +#########
43 +Newsfilefolder = input("종목폴더입력: ")
44 +Newsfilename = input("파일이름입력:")
45 +Newsfilepos = "C:/Users/yangj/PycharmProjects/pythonProject1/뉴스키워드/" + Newsfilefolder + "/" + Newsfilename + ".xlsx"
46 +Newsfile = openpyxl.load_workbook(Newsfilepos) # 파일이름입력
47 +ws = Newsfile.active
48 +data = []
49 +date = []
50 +i = 0
51 +for row in ws.rows:
52 + data.append([])
53 + date.append(row[1].value)
54 + for cell in row:
55 + if cell.value != None:
56 + data[i].append(cell.value)
57 + i += 1
58 +del data[0] # 첫번째 의미없는 열 삭제
59 +del date[0]
60 +for i in range(len(data)):
61 + del data[i][0] # 각 열의 첫번째 행 삭제
62 +for i in range(len(data)):
63 + del data[i][0] # 각 열의 날짜 행 삭제
64 +
65 +KNUdata = []
66 +Tdata = []
67 +
68 +for x in range(len(data)):
69 + KNUdata.append([])
70 + Tdata.append([])
71 + for y in range(len(data[x])):
72 + KNUdata[x].append(ksl.data_list(data[x][y]))
73 + Tdata[x].append([data[x][y], KNUdata[x][y]])
74 +
75 +result = {'날짜': date, '단어, 극성': Tdata}
76 +
77 +df = pd.DataFrame(result)
78 +
79 +list_df = df.values.tolist() # dataframe list로 변경
80 +new_date = [] # 날짜 중복 삭제
81 +for v in date:
82 + if v not in new_date:
83 + new_date.append(v)
84 +# print(new_date)
85 +
86 +Setlist = [] # 날짜별 키워드 넣기
87 +for v in range(len(new_date)):
88 + Setlist.append([])
89 + Setlist[v].append(new_date[v])
90 + for i in range(len(list_df)):
91 + for j in range(len(list_df[i][1])):
92 + if new_date[v] == list_df[i][0]:
93 + Setlist[v].append(list_df[i][1][j])
94 +
95 +Stockfilefolder = input("종목시세폴더입력: ")
96 +Stockfilename = input("시세파일이름입력:")
97 +fileStock = "C:/Users/yangj/PycharmProjects/pythonProject1/종목별시세/" + Stockfilefolder + "/" + Stockfilename + ".xlsx"
98 +Stockfile = openpyxl.load_workbook(fileStock) # 파일이름입력
99 +stock_ws = Stockfile.active
100 +Stock_data = [] # list 타입
101 +i = 0
102 +for row in stock_ws.rows:
103 + Stock_data.append([])
104 + for cell in row:
105 + if cell.value != None:
106 + Stock_data[i].append(cell.value)
107 + i += 1
108 +del Stock_data[0]
109 +for i in range(len(Stock_data)):
110 + del Stock_data[i][2] # 대비 삭제
111 +for i in range(len(Stock_data)):
112 + del Stock_data[i][7] # 거래대금 삭제
113 +for i in range(len(Stock_data)):
114 + del Stock_data[i][7] # 시가 총액 삭제
115 +
116 +
117 +i = 0
118 +for k in range(len(Setlist)):
119 + if (Stock_data[i][0].split('/') == Setlist[k][0].split('.')[:3]): # 날짜 비교 날짜가 같다면
120 + if Stock_data[i][2] > 0: # 코스피 등락이 양수
121 + for j in range(1, len(Setlist[k])):
122 + if Setlist[k][j][1] == 0:
123 + Setlist[k][j][1] = 1
124 + else:
125 + Setlist[k][j][1] += 1
126 + elif Stock_data[i][2] < 0:
127 + for j in range(1, len(Setlist[k])): # 음수면 어제 뉴스는 악재 취급
128 + if Setlist[k][j][1] == 0:
129 + Setlist[k][j][1] = -1
130 + else:
131 + Setlist[k][j][1] -= 1
132 + i += 1
133 + else:
134 + if Stock_data[i+1][2] > 0: # 다음날 주가 등락률이 양수면
135 + for j in range(1, len(Setlist[k])): # 어제뉴스는 호재 취급
136 + if Setlist[k][j][1] == 0:
137 + Setlist[k][j][1] = 1
138 + else:
139 + Setlist[k][j][1] += 1
140 + elif Stock_data[i+1][2] < 0:
141 + for j in range(1, len(Setlist[k])): # 음수면 어제 뉴스는 악재 취급
142 + if Setlist[k][j][1] == 0:
143 + Setlist[k][j][1] = -1
144 + else:
145 + Setlist[k][j][1] -= 1
146 +
147 +Setlist_w = []
148 +for i in range(len(Setlist)):
149 + Setlist_w.append([])
150 + for j in range(1, len(Setlist[i])):
151 + Setlist_w[i].append(Setlist[i][j][0]) # 극성 제외 단어만 추출
152 +
153 +counter = {}
154 +for i in range(len(Setlist_w)):
155 + counter[i] = collections.Counter(Setlist_w[i]) # 누적치
156 +
157 +for i in range(len(Setlist_w)):
158 + Setlist_w[i] = list(zip(counter[i].keys(), counter[i].values())) # 튜플 리스트화 [(값, 값)]
159 +
160 +Plist = []
161 +for i in range(len(Setlist_w)):
162 + Plist.append([])
163 + for j in range(len(Setlist_w[i])):
164 + Plist[i].append(list(Setlist_w[i][j])) # 튜플 -> 리스트화 [[값, 값]]
165 +
166 +for i in range(len(Plist)):
167 + for j in range(len(Plist[i])):
168 + Plist[i][j][1] = 0 # 극성 0으로 초기화
169 +
170 +for i in range(len(Setlist)):
171 + for j in range(1, len(Setlist[i])):
172 + for h in range(len(Plist[i])):
173 + if Setlist[i][j][0] == Plist[i][h][0]:
174 + Plist[i][h][1] += Setlist[i][j][1] # 누적치
175 +vert_p = [] # 수직 중복 삭제
176 +for i in range(len(Plist)):
177 + for j in range(len(Plist[i])):
178 + vert_p.append(Plist[i][j]) # 단어만 넣기
179 +# print(vert_p)
180 +vert_p.sort(key=lambda x: x[0]) # 단어 기준으로 정렬
181 +for i in range(len(vert_p) - 2): # 단어 비교해서 같으면 누적 다르면 값 바꾸기
182 + for j in range(i + 1, len(vert_p)):
183 + if vert_p[i][0] == vert_p[j][0]:
184 + vert_p[i][1] += vert_p[j][1]
185 + vert_p[j] = ['0', 0]
186 +
187 +vert_p = [i for i in vert_p if not '0' in i] # '0'들어간 열 제거
188 +df_ver = pd.DataFrame(vert_p)
189 +df_ver.to_excel(Stockfilename + ' KNU_New_vdic2.xlsx', sheet_name='sheet1')