#!/users/dsc/bin/Python3 #-*-coding: UTF-8 -*- from typing_extensions import Self from ml_model import models from Serialization import Serialization,Deserialization import ihyper_db import numpy as np import datetime import copy def train(ruleid,model_type,x_train,y_train): """_train_训练模型 Args: ruleid (_str_): _保存模型的文件名称_ model_type (_str_): _模型类型_: 1.MLP-多层感知机;2.LR-逻辑斯蒂回归;3.RFC-随机森林;4.DTC-决策树 x_data (__): _特征数据_ y_data (__): _目标数据_ return: 训练的准确率 """ now_model=models.model(model_type) now_model.fit(x_train, y_train) key=ruleid+"_"+model_type Serialization(key,now_model) return now_model.score(x_train, y_train) def predict_score(ruleid,model_type,x_test,y_test): """_predict_score_运用模型 Args: ruleid (_str_): _保存模型的文件名称_ model_type (_str_): _模型类型_: 1.MLP-多层感知机;2.LR-逻辑斯蒂回归;3.RFC-随机森林;4.DTC-决策树 x_test (__): _特征数据_ y_test (__): _目标数据_ return 测试数据的准确率 """ key=ruleid+"_"+model_type now_model=Deserialization(key) if(now_model): return now_model.score(x_test, y_test) else: return train(ruleid,model_type,x_test,y_test) def read_mode(ruleid,model_type): key=ruleid+"_"+model_type now_model=Deserialization(key) return now_model class ihyperDB(object): """_ihyperDB_ 查询ihd数据 """ def __init__(self): self.flag_=False self.value_=[] self.flags_=[] self.values_=[] def select_raw_data(self,tag_name,stime,etime,interval=50): """_select_raw_data_ 查询原始记录 Args: tag_name (_type_): _items_ stime (_type_): _开始时间_ etime (_type_): _结束时间_ interval (int, optional): _数据时间间隔_. Defaults to 50ms. Returns: _type_: _查询结果_ [是否正确查询,数据结果] """ time_points,data_nums=time_delta_split(stime,etime,interval=50) self.flags_=[] self.values_=[] for t,n in zip(time_points,data_nums): print("t:{},n:{}".format(t,n)) self.__select_raw_data(tag_name,t,n) if(self.flag_): (self.value_).reverse() # print(self.value_) # self.values_.append(copy.deepcopy(self.value_)) for k in self.value_: self.values_.append(k) self.flags_.append(self.flag_) # print(self.values_) return self.flags_,self.values_ def __select_raw_data(self,tag_name,etime,data_num,interval=50): """_select_raw_data_ 查询原始记录 最多65535条记录,从etime往前查 Args: tag_name (_type_): _items__ etime (_type_): _结束时间_ data_num (_type_): _查询数据量_最大为65535 interval (int, optional): _数据时间间隔_. Defaults to 50ms. Returns: _type_: _查询结果_ [是否正确查询,数据结果] """ if(isinstance(etime,int)): if(data_num>65535): data_num=65535 timepoint=datetime.datetime.fromtimestamp(etime/1000) elif(isinstance(etime,datetime.datetime)): if(data_num>65535): data_num=65535 timepoint=etime [flag,value]=ihyper_db.get_tag_small_time_data(tag_name,timepoint,int(data_num)) if(flag==0): self.flag_=True self.value_=value else: self.flag_=False return self.flag_,self.value_ def time_delta_split(stime,etime,interval=50,start_mode=False): timepoints=[] data_nums=[] if(isinstance(stime,int) and isinstance(etime,int)): data_num=(etime-stime)/interval nmax=int(data_num/65535) nmin=int(data_num%65535) if(nmax>0): for k in range(nmax+1): # print(k) eetime=int((etime-(nmax-k)*interval*65535)/1000) # sstime=int((stime+(nmax-k)*interval*65535)/1000) # print("nmax:{},k:{},sstime:{}:".format(nmax,k,sstime)) timepoints.append(datetime.datetime.fromtimestamp(eetime)) data_nums.append(65530 if k>0 else nmin) elif(isinstance(stime,datetime.datetime) and isinstance(etime,datetime.datetime)): data_num=(etime-stime).total_seconds()*1000/interval nmax=int(data_num/65535) nmin=int(data_num%65535) if(nmax>0): for k in range(nmax+1): timepoints.append(etime-datetime.timedelta(seconds=(nmax-k)*interval*65535)/1000) data_nums.append(65530 if k>0 else nmin) return timepoints,data_nums