-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdataquery.py
180 lines (162 loc) · 6.46 KB
/
dataquery.py
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import json
#from icecream import ic
# 入力用のsomething
# [{"id":,"text":,"kakusu":},]
class InputData:
def __init__(self,filename):
print('initialize InputData')
self._data:list = self.get_json(filename) # 入力json
self._length:int = 0 # 一応長さ いらない
@property
def data(self) -> list:
return self._data
#@data.setter
#def data(self,data:list):
#self._data = data
@property
def length(self) -> int:
return self._length
@length.setter
def length(self,length:int):
self._length = length
# 入力用のjsonデータを返す
def get_json(self,filename:str) -> list:
try:
with open(filename,encoding="utf-8") as f:
data = json.load(f)
self.length = len(data)
except FileNotFoundError:
print(filename+' is not found.')
self.length = len(list())
return list()
return data
# n番目の要素を取得
def get_property(self,num:int,key:str):
print('index:'+str(num)+',search key:'+key)
try:
print('the data:'+str(self.data[num][key]))
return self.data[num][key]
except KeyError:
print('key:',key,' is not found.')
return dict()
except IndexError:
print('index:'+str(num)+' is out of range in this data.')
def get_all_keydata(self,key:str) -> list:
if key not in self.data[0]:
print(key+" is not found")
return list()
tmp = list()
for i in self.data:
tmp.append(i[key])
return tmp
# データベースとして使いたい予定
# "i":{"id":,"yomi":,"kakusu":,"len":,"datanum":,"data":}
class Database:
def __init__(self):
self._data = dict() # データ フォーマット変えたいかもしれない
self._file:str = "data/output/output.json" # データベースファイル名
@property
def data(self) -> dict:
return self._data
@data.setter
def data(self,data:dict):
self._data = data
@property
def file(self) -> str:
return self._file
@file.setter
def file(self,filename:str):
self._file = filename
# 存在しないyomiのデータを作成する
def create(self,yomi:str,kakusu:int,length:int):
if yomi not in self.data:
self.data[yomi] = {'id':len(self.data)+1,'yomi':yomi,'kakusu':kakusu,'len':length,'datanum':0,'data':list()}
# データを加える
def addData(self,key:str,x:list,y:list) -> bool:
if key not in self.data:
if len(x) != len(y):
print("長さが違う")
return False
self.create(key,len(x),5)
#return False
if self.data[key]['kakusu'] != len(x) or self.data[key]['kakusu'] != len(y):
print("画数が…")
return False
#self.data[key]['data'].append({'x':x,'y':y,'min_x'})
#self.data[key]['data'].append({"data": {"x": x, "y": y, "min_x":self.minlist(x),"min_y":self.minlist(y), "max_x":self.maxlist(x), "max_y":self.maxlist(y)}})
#self.data[key]['data'].append({"x": x, "y": y, "min_x":self.minlist(x),"min_y":self.minlist(y), "max_x":self.maxlist(x), "max_y":self.maxlist(y)})
self.data[key]['data'].append({"x": x, "y": y, "min_x":self.minlist(x,600),"min_y":self.minlist(y,600), "max_x":self.maxlist(x,600), "max_y":self.maxlist(y,600)})
self.data[key]['datanum'] = self.data[key]['datanum'] + 1
return True
# keyを全消し 要素消しにしたい
def delete(self,key:str):
try:
self.data.pop(key)
except KeyError:
print("削除失敗")
# 正規化したい
def normalize(self,key:str):
tmp = self.data[key]['data'] #
tmp2 = dict() # 保存するデータ
tmp2['normdata'] = list()
for i in range(len(tmp)):
tmp2['normdata'].append({'x':list(),'y':list()})
for j in range(self.data[key]['kakusu']):
tmp2['normdata'][i]['x'].append(list())
tmp2['normdata'][i]['y'].append(list())
maxx = max(tmp[i]['x'][j])
maxy = max(tmp[i]['y'][j])
minx = min(tmp[i]['x'][j])
miny = min(tmp[i]['y'][j])
# 完全にx軸ory軸に平行な直線の場合,0割発生の可能性がある
# 0割例外のときはすべて1になる
for k in tmp[i]['x'][j]:
try:
tmp2['normdata'][i]['x'][j].append((k-minx)/(maxx-minx))
except ZeroDivisionError:
tmp2['normdata'][i]['x'][j].append(1)
for k in tmp[i]['y'][j]:
try:
tmp2['normdata'][i]['y'][j].append((k-miny)/(maxy-miny))
except ZeroDivisionError:
tmp2['normdata'][i]['y'][j].append(1)
self.data[key]['normdata'] = tmp2['normdata']
print(self.data)
# json取得 self.dataに格納される
def get_json(self,filename:str) -> dict:
self.file = filename
try:
with open(filename,encoding="utf-8") as f:
self._data = json.load(f)
except FileNotFoundError:
print(filename+' is not found.')
return dict()
except json.decoder.JSONDecodeError:
print("json is gomi")
return dict()
return self.data
# listの中の最小値 正規化したデータを戻すときに使うかもしれない
def minlist(self,x:list,pixel:int) -> list:
ans = list()
for i in x:
ans.append(min(i)/pixel)
return ans
# listの中の最大値 正規化したデータを戻すときに使うかもしれない
def maxlist(self,x:list,pixel:int) -> list:
ans = list()
for i in x:
ans.append(max(i)/pixel)
return ans
# 現在のself.dataをjsonとしてself.fileに保存
def save_to_json(self):
if self.file == "":
print("filename was not setting")
return False
with open(self.file, 'w',encoding="utf-8") as f:
# with open('test.json', 'w') as f:
json.dump(self.data, f,indent=2, ensure_ascii=False)
# データの検証 だめな場合は排除?
def validation(self):
return True
# t軸0~2piに正規化
# x,y軸0 ~ 1に正規化