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