Showing
1 changed file
with
189 additions
and
0 deletions
knu/KnuSentiLex/kospiCompare.py
0 → 100644
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') |
-
Please register or login to post a comment