1 | ////////////////////////////////////////////////////////////////////////////// |
---|
2 | // FILE : pestimation.tol |
---|
3 | // PURPOSE : Estimation processes and functions |
---|
4 | ////////////////////////////////////////////////////////////////////////////// |
---|
5 | |
---|
6 | |
---|
7 | ////////////////////////////////////////////////////////////////////////////// |
---|
8 | // Inicio de la sesion de estimacion |
---|
9 | ////////////////////////////////////////////////////////////////////////////// |
---|
10 | WriteLn("SqlEstStart(EstSession, Output, Dating)..."); |
---|
11 | Set EstKey = SqlEstStart(EstSession, Output, Dating); |
---|
12 | Set InfoEstSes = SqlEstSesGet(EstSession); |
---|
13 | Text EstSessionIni = If(IsEmpty(InfoEstSes), "", InfoEstSes->SessionIni); |
---|
14 | |
---|
15 | Set InfoOutDat = SqlOutDatGet(Output, Dating); |
---|
16 | |
---|
17 | ////////////////////////////////////////////////////////////////////////////// |
---|
18 | // Estructura BoxCox |
---|
19 | ////////////////////////////////////////////////////////////////////////////// |
---|
20 | Real SqlEstUpdateState(EstKey, "Definicion de estructura BOX-COX"); |
---|
21 | Real SqlProConUpdateTrace(IdProcess, "Definicion de estructura BOX-COX"); |
---|
22 | |
---|
23 | Set InfoTransf = SqlTraGet(InfoOutDat->Transformation); |
---|
24 | Set BoxCox = BoxCoxStruct(InfoTransf->Power,InfoTransf->Translation); |
---|
25 | |
---|
26 | |
---|
27 | ////////////////////////////////////////////////////////////////////////////// |
---|
28 | // Estructura ARIMA |
---|
29 | ////////////////////////////////////////////////////////////////////////////// |
---|
30 | Real SqlEstUpdateState(EstKey, "Definicion del modelo ARIMA"); |
---|
31 | Real SqlProConUpdateTrace(IdProcess, "Definicion del modelo ARIMA"); |
---|
32 | |
---|
33 | //Set ARIMA = SqlEvalARIMA(InfoOutDat->Arima); |
---|
34 | Set ARIMA = GetArimaFromLabel(InfoOutDat->Arima); |
---|
35 | |
---|
36 | |
---|
37 | ////////////////////////////////////////////////////////////////////////////// |
---|
38 | // Conjunto Temporal de Omitidos |
---|
39 | ////////////////////////////////////////////////////////////////////////////// |
---|
40 | Real SqlEstUpdateState(EstKey, "Calculando el TimeSet de omitidos"); |
---|
41 | |
---|
42 | Real SqlProConUpdateTrace(IdProcess, "Calculando el TimeSet de omitidos"); |
---|
43 | |
---|
44 | Text TimeSetOmitDB = InfoOutDat->TimeSetOmit; |
---|
45 | |
---|
46 | TimeSet TimeSetOmit = If(TimeSetOmitDB == "", W, Eval(TimeSetOmitDB +";")); |
---|
47 | |
---|
48 | |
---|
49 | //////////////////////////////////////////////////////////////////////////// |
---|
50 | // Serie Output: Carga de datos |
---|
51 | //////////////////////////////////////////////////////////////////////////// |
---|
52 | |
---|
53 | Real SqlEstUpdateState(EstKey, "Construccion de la serie output"); |
---|
54 | Real SqlProConUpdateTrace(IdProcess, "Construccion de la serie output"); |
---|
55 | Text FunTra = InfoTransf->FunctionTra; |
---|
56 | Text FunTraInv = InfoTransf->FunctionTraInv; |
---|
57 | |
---|
58 | Code Transf = If(FunTra == "", TraIdentity, Eval(FunTra)); |
---|
59 | Code TransfInv = If(FunTraInv == "", TraIdentityInv, Eval(FunTraInv)); |
---|
60 | |
---|
61 | Set ParamOutDat = SqlOutDatGetParam(Output, Dating); |
---|
62 | |
---|
63 | //Serie OutputOrig = SqlOutGetData(Output); |
---|
64 | |
---|
65 | Set OutputSet = SqlNodInfGetOpe(ParamOutDat->Cabecera, |
---|
66 | ParamOutDat->Producto, |
---|
67 | ParamOutDat->Nodo, |
---|
68 | ParamOutDat->Inicio, |
---|
69 | UnknownDate); |
---|
70 | |
---|
71 | //Provisional hasta que funcione SqlOutDatGetParam modificar IniTmp |
---|
72 | /* |
---|
73 | Set OutputSet = SqlNodInfGetOpe("ELMUNDO", "DIARIO", "CAMCAP", y2000m01d02, |
---|
74 | UnknownDate); |
---|
75 | */ |
---|
76 | //SrFiltro.SubOut |
---|
77 | Serie OutputOrig = OutputSet -> Venta; |
---|
78 | PutDescription("Serie de datos original", OutputOrig); |
---|
79 | Serie Output = If(FunTra == "", OutputOrig, Transf(OuputOrig)); |
---|
80 | PutDescription("Serie a estimar. Serie de datos transformados por la funcion |
---|
81 | Transf", Output); |
---|
82 | |
---|
83 | Serie OutputBoxCox = BoxCoxTransf(Output, BoxCox); |
---|
84 | PutDescription("Serie Output con la transformacion BoxCox", Output); |
---|
85 | |
---|
86 | |
---|
87 | ////////////////////////////////////////////////////////////////////////////// |
---|
88 | // Fechas de estimacion |
---|
89 | ////////////////////////////////////////////////////////////////////////////// |
---|
90 | Real SqlEstUpdateState(EstKey, "Fechas de estimacion"); |
---|
91 | Real SqlProConUpdateTrace(IdProcess, "Fechas de estimacion"); |
---|
92 | |
---|
93 | Date IniOut = If(IsUnknownDate(InfoOutDat->IniEst), First(OutputOrig), |
---|
94 | InfoOutDat->IniEst); |
---|
95 | |
---|
96 | Date IniEstSes = If(IsUnknownDate(InfoEstSes->IniDate), First(OutputOrig), |
---|
97 | InfoEstSes->IniDate); |
---|
98 | Date EndEstSes = If(IsUnknownDate(InfoEstSes->EndDate), Last(OutputOrig), |
---|
99 | InfoEstSes->EndDate); |
---|
100 | |
---|
101 | |
---|
102 | //Date IniEstSes = If(IsEmpty(InfoEstSes), First(OutputOrig), UnknownDate); |
---|
103 | Date EndOut = If(IsUnknownDate(InfoOutDat->EndEst), Last(OutputOrig), |
---|
104 | InfoOutDat->EndEst); |
---|
105 | //Date EndEstSes = If(IsEmpty(InfoEstSes), Last(OutputOrig), UnknownDate); |
---|
106 | Date IniEstim = Max(IniOut, IniEstSes); |
---|
107 | Date EndEstim = Min(EndOut, EndEstSes); |
---|
108 | |
---|
109 | Real DegARIMA = |
---|
110 | { |
---|
111 | Polyn aR = BinGroup("*", Traspose(ARIMA)[2]); |
---|
112 | Polyn mA = BinGroup("*", Traspose(ARIMA)[3]); |
---|
113 | Polyn dif = BinGroup("*", Traspose(ARIMA)[4]); |
---|
114 | Degree(aR * mA * dif) |
---|
115 | }; |
---|
116 | Date IniInput = Succ(IniEstim, Eval(Dating +";"), -(DegARIMA+7)); |
---|
117 | |
---|
118 | Text WriteLn("IniOut: "<<IniOut); |
---|
119 | Text WriteLn("IniEstSes: "<<IniEstSes); |
---|
120 | Text WriteLn("EndOut: "<<EndOut); |
---|
121 | Text WriteLn("EndEstSes: "<<EndEstSes); |
---|
122 | Text WriteLn("IniEstim: "<<IniEstim); |
---|
123 | Text WriteLn("EndEstim: "<<EndEstim); |
---|
124 | Text WriteLn("IniInput: "<<IniInput); |
---|
125 | |
---|
126 | |
---|
127 | ////////////////////////////////////////////////////////////////////////////// |
---|
128 | // Session Inicial |
---|
129 | ////////////////////////////////////////////////////////////////////////////// |
---|
130 | Real Able2Agg = EstSessionIni != ""; |
---|
131 | PutDescription("Indica si en la estimacion en curso se puede agregar.", |
---|
132 | Able2Agg); |
---|
133 | |
---|
134 | Real EstSetInpEffIsSaved = If(Not(Able2Agg), Copy(FALSE), |
---|
135 | SqlEstSetInpEffIsSaved(EstSessionIni, Output, Dating)); |
---|
136 | Set SetInpEff.SesIni = If(Not(EstSetInpEffIsSaved), Empty, |
---|
137 | SqlEstSetInpEffGetSeries(EstSessionIni, Output, Dating, IniInput, EndEstim)); |
---|
138 | |
---|
139 | |
---|
140 | ////////////////////////////////////////////////////////////////////////////// |
---|
141 | // Efectos Verano de la sesion inicial |
---|
142 | ////////////////////////////////////////////////////////////////////////////// |
---|
143 | Set SEffVerSesIni = Select(SetInpEff.SesIni, Real(Serie sr) |
---|
144 | { Or(TextMatch(Name(sr), "*Verano*"), TextMatch(Name(sr), "*CicVer*")) }); |
---|
145 | Serie SrEffAgrVer = If(!Card(SEffVerSesIni), |
---|
146 | CalInd(W,Dating(OutputOrig)), SetSum(SEffVerSesIni)); |
---|
147 | Serie OutputFiltVer = IfSer(Not(OutputOrig), OutputOrig, |
---|
148 | OutputOrig << Exp(OutputBoxCox - SrEffAgrVer)); |
---|
149 | |
---|
150 | |
---|
151 | ////////////////////////////////////////////////////////////////////////////// |
---|
152 | // Carga de los conjuntos de inputs |
---|
153 | // * El conjunto CalcSetInput sustituye a las inclusiones que aparecen |
---|
154 | // arriba |
---|
155 | ////////////////////////////////////////////////////////////////////////////// |
---|
156 | Real SqlEstUpdateState(EstKey, "Construccion de inputs para el output"); |
---|
157 | Real SqlProConUpdateTrace(IdProcess, |
---|
158 | "Construccion de inputs para el output"); |
---|
159 | |
---|
160 | Set OutputSetInput = SqlOutSetInpGetSetInput(Output, Dating); |
---|
161 | |
---|
162 | |
---|
163 | Real SqlEstUpdateState(EstKey, "Guardando en EstimationSetInput"); |
---|
164 | Real EstSetInpSave = SqlEstSetInpSave(EstKey); |
---|
165 | |
---|
166 | |
---|
167 | |
---|
168 | Real SqlEstUpdateState(EstKey, "Calculando los inputs"); |
---|
169 | |
---|
170 | Set CalcSetInput = EvalSet(OutputSetInput, Text(Set s) |
---|
171 | { |
---|
172 | Text nameSet = s->SetInput; |
---|
173 | Text exprInp = SqlSetInpCalculation(nameSet); |
---|
174 | Text WriteLn("trace: "+ exprInp); |
---|
175 | //"WriteLn("+ Quotes + ToUpper(nameSet) +"..."+ Quotes +");\n"+ |
---|
176 | exprInp |
---|
177 | }); |
---|
178 | |
---|
179 | Real EmptyCalcSetInput = IsEmpty(CalcSetInput); |
---|
180 | //Text CreaInpTxt = BinGroup("+", CalcSetInput); |
---|
181 | |
---|
182 | Text CreaInpTxt = If(EmptyCalcSetInput, "", |
---|
183 | BinGroup("+", CalcSetInput)); |
---|
184 | |
---|
185 | //Set CreaInp = IncludeText(CreaInpTxt); |
---|
186 | |
---|
187 | Set CreaInp = If(EmptyCalcSetInput, Empty, |
---|
188 | IncludeText(CreaInpTxt)); |
---|
189 | |
---|
190 | |
---|
191 | Set InfoSetInput = EvalSet(OutputSetInput, Set(Set s) |
---|
192 | { |
---|
193 | Text nameSet = s->SetInput; |
---|
194 | Set sSetInpRecur = SqlSetInpGetSISonRecur(nameSet); |
---|
195 | Text agreg = s->AggregationType; |
---|
196 | Text agregEst = If(And(agreg != "NOT", Able2Agg), agreg, |
---|
197 | { |
---|
198 | If(Able2Agg, |
---|
199 | WriteLn("WARNING: No se puede agregar el conjunto "+ nameSet +". "+ |
---|
200 | "No hay sesion de estimacion inicial definida.")); |
---|
201 | "NOT" |
---|
202 | }); |
---|
203 | |
---|
204 | Set sInputDB = SqlInpGetInput(Traspose(sSetInpRecur)[1]); |
---|
205 | Set sInputDef = InputDB2InputDef(sInputDB, Dating); |
---|
206 | Set sInfo = SetOfAnything(nameSet, sInputDef, sInputDB, agregEst); |
---|
207 | Eval("Set sInfo"+ nameSet +" = sInfo;") |
---|
208 | }); |
---|
209 | |
---|
210 | |
---|
211 | //Set Input = If(IsEmpty(OutputSetInput), Empty, |
---|
212 | // BinGroup("<<", Traspose(InfoSetInput)[2])); |
---|
213 | |
---|
214 | Set InputDB = If(IsEmpty(OutputSetInput), Empty, |
---|
215 | { |
---|
216 | Set infoSetInput.T = Traspose(InfoSetInput); |
---|
217 | Set infoSetInput.WAgg = For(1, Card(infoSetInput.T[3]), Set(Real n) |
---|
218 | { |
---|
219 | EvalSet(infoSetInput.T[3][n], Set(Set sInp) |
---|
220 | { PutStructure("InputDBAggSt", SetOfText(infoSetInput.T[4][n])<<sInp) }) |
---|
221 | }); |
---|
222 | BinGroup("<<", infoSetInput.WAgg) |
---|
223 | })); |
---|
224 | |
---|
225 | // Conjunto de inputs a estimar (sin contar los agregados) |
---|
226 | Set SetInput.Est = Select(InfoSetInput, Real(Set s) { s[4] == "NOT" }); |
---|
227 | |
---|
228 | |
---|
229 | Set Input.NotAgg.PolDB = If(IsEmpty(SetInput.Est), Empty, |
---|
230 | BinGroup("<<", Traspose(SetInput.Est)[2])); |
---|
231 | Set Input.NotAgg = If(IsEmpty(Input.NotAgg.PolDB), Empty, |
---|
232 | If(Not(Able2Agg), Input.NotAgg.PolDB, |
---|
233 | EvalSet(Input.NotAgg.PolDB, Set(Set s) |
---|
234 | { |
---|
235 | Polyn polDB = s->Omega; |
---|
236 | Polyn polEst = SqlEstInpGetEstimatedPolyn(EstSessionIni, Output, |
---|
237 | Dating, Name(s->X)); |
---|
238 | Polyn polIni = If(IsUnknownPolyn(polEst), polDB, |
---|
239 | If(EQ(Degree(polDB), Degree(polEst)), polEst, |
---|
240 | { |
---|
241 | WriteLn("ERROR: \n"+ |
---|
242 | "Polinomio inicial en la BBDD con distinto grado del estimado!"+ |
---|
243 | "Cogiendo polinomio inicial de la tabla Input de la BBDD."); |
---|
244 | polDB |
---|
245 | })); |
---|
246 | InputDef(polIni, s->X) |
---|
247 | }))); |
---|
248 | |
---|
249 | // Conjunto de inputs a restar del output en la estimacion |
---|
250 | Set SetInput.Out = Select(InfoSetInput, Real(Set s) { s[4] == "OUT" }); |
---|
251 | Serie SrFiltro.SubOut = If(Or(Not(Able2Agg), IsEmpty(SetInput.Out)), |
---|
252 | CalInd(W, Eval(Dating+";")), |
---|
253 | SetSum(EvalSet(SetInput.Out, Serie(Set s) |
---|
254 | { |
---|
255 | Eval("Serie "+SqlEstSetInpEffNameSrAgg(EstSessionIni,Output,Dating,s[1])+";") |
---|
256 | //Eval("Serie "+ EstSessionIni +"."+ Output +"."+ Dating +"."+ s[1] +";") |
---|
257 | }))); |
---|
258 | |
---|
259 | // Conjunto de inputs a estimar como agregados |
---|
260 | Set SetInput.Set = Select(InfoSetInput, Real(Set s) { s[4] == "SET" }); |
---|
261 | Set Input.SetInp = If(Or(Not(Able2Agg), IsEmpty(SetInput.Set)), Empty, |
---|
262 | EvalSet(SetInput.Set, Set(Set s) |
---|
263 | { |
---|
264 | Eval("Serie "+ s[1] + |
---|
265 | " = "+ SqlEstSetInpEffNameSrAgg(EstSessionIni,Output,Dating,s[1]) +";"); |
---|
266 | Eval("InputDef(1, "+ s[1] +");") |
---|
267 | })); |
---|
268 | |
---|
269 | // Conjunto de inputs a estimar como agregados en una sola serie |
---|
270 | Set SetInput.Fil = Select(InfoSetInput, Real(Set s) { s[4] == "FIL" }); |
---|
271 | Serie SrFiltro.Input = If(Or(Not(Able2Agg), IsEmpty(SetInput.Fil)), |
---|
272 | CalInd(W, Eval(Dating+";")), |
---|
273 | SetSum(EvalSet(SetInput.Fil, Serie(Set s) |
---|
274 | { |
---|
275 | Eval("Serie "+SqlEstSetInpEffNameSrAgg(EstSessionIni,Output,Dating,s[1])+";") |
---|
276 | }))); |
---|
277 | Set Input.Fil = If(Or(Not(Able2Agg), IsEmpty(SetInput.Fil)), Empty, |
---|
278 | SetOfSet(InputDef(1, SrFiltro.Input))); |
---|
279 | |
---|
280 | Set Input = Input.NotAgg << Input.SetInp << Input.Fil; |
---|
281 | |
---|
282 | |
---|
283 | |
---|
284 | ////////////////////////////////////////////////////////////////////////////// |
---|
285 | // Estimacion del Modelo |
---|
286 | ////////////////////////////////////////////////////////////////////////////// |
---|
287 | Serie Output.Filt = Output - SrFiltro.SubOut; |
---|
288 | PutDescription("Serie Output menos posibles conjuntos de input agregados", |
---|
289 | Output); |
---|
290 | |
---|
291 | Set AprioriSet = Empty; |
---|
292 | |
---|
293 | Real SqlEstUpdateState(EstKey, "Estimando modelo ..."); |
---|
294 | Real SqlProConUpdateTrace(IdProcess, "Estimando modelo ..."); |
---|
295 | |
---|
296 | Set ModDefEst = EstimModel |
---|
297 | ( |
---|
298 | Output, |
---|
299 | TimeSetOmit, |
---|
300 | ARIMA, |
---|
301 | BoxCox, |
---|
302 | Input, |
---|
303 | SrFiltro.SubOut, |
---|
304 | IniEstim, |
---|
305 | EndEstim, |
---|
306 | AprioriSet |
---|
307 | ); |
---|
308 | |
---|
309 | Set ModDef = ModDefEst[1]; |
---|
310 | Set ModEst = ModDefEst[2]; |
---|
311 | Set StdRes = ModDefEst[3]; |
---|
312 | Set InputNull = ModDefEst[4]; |
---|
313 | Real SqlEstUpdateState(EstKey, "Finalizacion de la estimacion del modelo"); |
---|
314 | Real SqlProConUpdateTrace(IdProcess, |
---|
315 | "Finalizacion de la estimacion del modelo"); |
---|
316 | |
---|
317 | |
---|
318 | If(GT(Card(InputNull), 0), |
---|
319 | WriteLn("WARNING: "+ |
---|
320 | "Hay inputs que no han entrado en la estimacion!!!\n"<< InputNull)); |
---|
321 | |
---|
322 | ////////////////////////////////////////////////////////////////////////////// |
---|
323 | // Comprobacion de los resultados de la estimacion |
---|
324 | ////////////////////////////////////////////////////////////////////////////// |
---|
325 | Real DesTipEst = If(ObjectExist("Set", "ModEst"), |
---|
326 | If(IsEmpty(ModEst), ?, ModEst[1][8]), |
---|
327 | ?); |
---|
328 | Real EstOK = Not(IsUnknown(DesTipEst)); |
---|
329 | |
---|
330 | |
---|
331 | ////////////////////////////////////////////////////////////////////////////// |
---|
332 | // Grabacion de los resultados en la Base de Datos |
---|
333 | ////////////////////////////////////////////////////////////////////////////// |
---|
334 | Real SqlEstUpdateState(EstKey, "Volcado a la base de datos"); |
---|
335 | Real SqlProConUpdateTrace(IdProcess, "Volcado a la base de datos"); |
---|
336 | |
---|
337 | Real CtrSav = If(And(EstOK, SqlSavEst), |
---|
338 | SqlSaveEstimation(Output, ModEst, EstKey, InputDB), |
---|
339 | { |
---|
340 | Text txt = If(Not(EstOK), "Error en la estimacion", "Variable SqlSavEst"); |
---|
341 | WriteLn("WARNING: No se guardan los resultados en la BD. "+ txt +"."); |
---|
342 | FALSE |
---|
343 | }); |
---|
344 | |
---|
345 | WriteLn("WARNING: Guardando en estimation con CtrSav TRUE. "+ |
---|
346 | "Revisar la funcion SqlSaveEstimation"); |
---|
347 | //Set InfoEndEst = SqlEstBuildInfo(InfoOutDat, ModEst,OutputSetInput,CtrSav); |
---|
348 | Set InfoEndEst = SqlEstBuildInfo(InfoOutDat, ModEst, OutputSetInput, TRUE); |
---|
349 | Real CtrEnd = SqlEstEnd(EstKey, InfoEndEst); |
---|
350 | Real ActEnd = SqlProConUpdateTraActExe(IdProcess, "Output estimado", "Y"); |
---|
351 | Real Exit = SqlProConUpdateTraAct(IdProcess, "Proceso finalizado", "N"); |
---|
352 | |
---|