' In questo esempio viene effettuata la stima di due valori di livello idrometrico utilizzando la primitiva QWml.Prediction e partendo da due differenti modelli di Machine Learning, ' aventi codice "0002" e "0003". ' La stima viene memorizzata nella tabella IOTLOG, e i valori delle variabili indipendenti vengono acquisiti sempre dalla tabella IOTLOG, e corrispondono alle ultime letture disponibili ' dei livelli in due punti a monte rispetto al punto per il quale si vuole calcolare la stima. Quest'ultima sarà riferita riferita a 4 ore avanti rispetto all'orario dell'ultima lettura ' nel punto più a valle prima di quello per il quale si calcola la stima, supponendo che questo sia il periodo che l'acqua impiega a percorrere la distanza fra i due punti. Dim Q as new QWTable Q.Database=DB Q.sql="select * from IOTLOG" Q.allowallrecords=false Q.active=true Dim Q1 as new QWTable Q1.Database=DB Q1.sql="select " Q1.sql+="i.DATA," Q1.sql+="convert(real,(select VALUE from IOTLOG i1 where i1.DATA=Dateadd(minute,-1*60,i.DATA) and i1.DEVICENAME='RENO' and i1.SENSORNAME = 'SASSO MARCONI')) as 'SASSO_MARCONI', " Q1.sql+="convert(real,(select VALUE from IOTLOG i1 where i1.DATA=i.DATA and i1.DEVICENAME='RENO' and i1.SENSORNAME = 'CHIUSA CASALECCHIO')) as 'CHIUSA_CASALECCHIO' " Q1.sql+="from IOTLOG i where DEVICENAME='RENO' and SENSORNAME='BONCONVENTO' and DATA>=dateadd(day,-2,getdate()) group by DATA order by DATA " Q1.allowallrecords=false Q1.active=true while not q1.rowset.endofset ' Stima l'altezza dim errmsg as string dim score as double dim values as new assocarray values("SASSO_MARCONI")=q1.rowset.fields("SASSO_MARCONI").value values("CHIUSA_CASALECCHIO")=q1.rowset.fields("CHIUSA_CASALECCHIO").value if not empty(q1.rowset.fields("SASSO_MARCONI").value) and not empty(q1.rowset.fields("CHIUSA_CASALECCHIO").value) score=QWml.Prediction(DB.QWSession, "0002", Values, errmsg) ' Previsione if empty(errmsg) dim Data as datetime=dateadd(Dateinterval.minute,4*60,q1.rowset.fields("DATA").value) ' La data cui si riferisce la stima è 4 ore avanti quella della lettura a Casalecchio, che è approssimativamente il tempo impiegato dal flusso a percorrere il tragitto if not q.rowset.findkey(Data,"RENO","BONCONVENTO_P4H_0002") q.beginappend() q.replace("DATA",data) q.replace("DEVICENAME","RENO") q.replace("SENSORNAME","BONCONVENTO_P4H_0002") q.replace("VALUE",score) q.saverecord() End If else throw new exception("Errore durante la stima 0002: "+errmsg) End If score=QWml.Prediction(DB.QWSession, "0003", Values, errmsg) ' Previsione if empty(errmsg) dim Data as datetime=dateadd(Dateinterval.minute,4*60,q1.rowset.fields("DATA").value) ' La data cui si riferisce la stima è 4 ore avanti quella della lettura a Casalecchio, che è approssimativamente il tempo impiegato dal flusso a percorrere il tragitto if not q.rowset.findkey(Data,"RENO","BONCONVENTO_P4H_0003") q.beginappend() q.replace("DATA",data) q.replace("DEVICENAME","RENO") q.replace("SENSORNAME","BONCONVENTO_P4H_0003") q.replace("VALUE",score) q.saverecord() End If else throw new exception("Errore durante la stima: "+errmsg) End If End If Q1.rowset.next() End While Q.active=false Q1.active=false