public List <Models.MediaMovil> CalcularMediaMovil(List <Models.Correccion> seriecorregida3) { //PROCESO PARA OBTENER LA MEDIA MOVIL DE LA SERIE List <Models.MediaMovil> seriemediamovil = new List <Models.MediaMovil>(); for (int i = 3; i < ((seriecorregida3.Count) - 3); i++) { Models.MediaMovil mediamovil = new Models.MediaMovil(); Models.Correccion mm0 = seriecorregida3[i]; Models.Correccion mm_1 = seriecorregida3[i - 1]; Models.Correccion mm_2 = seriecorregida3[i - 2]; Models.Correccion mm_3 = seriecorregida3[i - 3]; Models.Correccion mm1 = seriecorregida3[i + 1]; Models.Correccion mm2 = seriecorregida3[i + 2]; Models.Correccion mm3 = seriecorregida3[i + 3]; double mm = ((mm0.datocorregido + mm_1.datocorregido + mm_2.datocorregido + mm_3.datocorregido + mm1.datocorregido + mm2.datocorregido + mm3.datocorregido) / 7); mediamovil.mediamovil = mm; mediamovil.fecha = mm0.fecha; seriemediamovil.Add(mediamovil); } return(seriemediamovil); }
public List <Models.Correccion> CalcularAlgoritmo(List <Models.DataSerie> resultado) { //PROCESO UNO OBTENER LOGARITMO DE LA SERIE List <Models.Logaritmo> serielog = new List <Models.Logaritmo>(); for (int i = 0; i < resultado.Count; i++) { Models.Logaritmo logaritmo = new Models.Logaritmo(); var actual = resultado[i]; double log = Math.Log(Convert.ToDouble(actual.Data)); logaritmo.datoLog = log; logaritmo.data = Convert.ToDouble(actual.Data); logaritmo.fecha = Convert.ToDateTime(actual.Date); serielog.Add(logaritmo); } //PROCESO DOS PRIMERAS DIFERENCIAS List <Models.Diferencias> seriedif = new List <Models.Diferencias>(); bool primerElemento = true; for (int i = 0; i < serielog.Count; i++) { Models.Diferencias diferencias = new Models.Diferencias(); //IDENTIFICAR EL PRIMER ELEMENTO if (primerElemento == true) { primerElemento = false; Models.Logaritmo lactual = serielog[i]; diferencias.dif = 0; diferencias.datoLog = lactual.datoLog; diferencias.data = Convert.ToDouble(lactual.data); diferencias.fecha = Convert.ToDateTime(lactual.fecha); seriedif.Add(diferencias); } else { Models.Logaritmo lactual = serielog[i]; Models.Logaritmo lanterior = serielog[i - 1]; double odif = lactual.datoLog - lanterior.datoLog; diferencias.dif = odif; diferencias.datoLog = lactual.datoLog; diferencias.data = Convert.ToDouble(lactual.data); diferencias.fecha = Convert.ToDateTime(lactual.fecha); seriedif.Add(diferencias); } } //PROCESO TRES OBTENER DESVIACIÓN ESTÁNDAR Y MULTIPLICARLA POR 3 //VARIANZA Y DESVIACION TOTAL double Mt = 0.0; double St = 0.0; int kt = 1; seriedif.ForEach(n => { double tmpM = Mt; Mt += (Convert.ToDouble(n.dif) - tmpM) / kt; St += (Convert.ToDouble(n.dif) - tmpM) * (Convert.ToDouble(n.dif) - Mt); kt++; }); double varianzat = St / (kt - 2); double desviaciont = Math.Sqrt(St / (kt - 2)); desviaciontGlobal = desviaciont; double factordesvest = desviaciont * 3; //PROCESO CUATRO VALOR DE LA SERIE EN DIFERENCIAS DIVIDIDO POR EL FACTOR "factordesvest" List <Models.Factorizado> seriefactorizada = new List <Models.Factorizado>(); for (int i = 0; i < seriedif.Count; i++) { Models.Factorizado factorizado = new Models.Factorizado(); Models.Diferencias factual = seriedif[i]; double ofact = seriedif[i].dif / factordesvest; factorizado.datofactorizado = ofact; factorizado.dif = factual.dif; factorizado.datoLog = factual.datoLog; factorizado.data = Convert.ToDouble(factual.data); factorizado.fecha = Convert.ToDateTime(factual.fecha); seriefactorizada.Add(factorizado); } //PROCESO CINCO IDENTIFICAR DATOS ATIPICOS "n < -1 | n > 1" List <Models.DatoAtipico> serieconatipico = new List <Models.DatoAtipico>(); int m; for (int i = 0; i < seriefactorizada.Count; i++) { Models.DatoAtipico ident = new Models.DatoAtipico(); Models.Factorizado iactual = seriefactorizada[i]; //IDENTIFICAR EL PRIMER ELEMENTO if (iactual.datofactorizado < -1 || iactual.datofactorizado > 1) { m = 1; ident.identificador = m; ident.datofactorizado = iactual.datofactorizado; ident.dif = iactual.dif; ident.datoLog = iactual.datoLog; ident.data = Convert.ToDouble(iactual.data); ident.fecha = Convert.ToDateTime(iactual.fecha); serieconatipico.Add(ident); } else { m = 0; ident.identificador = m; ident.datofactorizado = iactual.datofactorizado; ident.dif = iactual.dif; ident.datoLog = iactual.datoLog; ident.data = Convert.ToDouble(iactual.data); ident.fecha = Convert.ToDateTime(iactual.fecha); serieconatipico.Add(ident); } } //PROCESO SEIS CORRECIÓN CON INTERPOLACIÓN INMEDIATA (anterior y consecuente) List <Models.Correccion> seriecorregida = new List <Models.Correccion>(); double c = 0.0; for (int i = 0; i < serieconatipico.Count; i++) { Models.Correccion corr = new Models.Correccion(); Models.DatoAtipico corractual = serieconatipico[i]; //IDENTIFICAR EL PRIMER ELEMENTO if (corractual.identificador == 1 && i != serieconatipico.Count - 1) { Models.DatoAtipico datot1 = serieconatipico[i + 1]; Models.DatoAtipico datot2 = serieconatipico[i - 1]; c = (datot1.data + datot2.data) / 2; corr.datocorregido = c; corr.datoLog = corractual.datoLog; corr.dif = corractual.dif; corr.datofactorizado = corractual.datofactorizado; corr.identificador = corractual.identificador; corr.data = corractual.data; corr.fecha = corractual.fecha; seriecorregida.Add(corr); } else { corr.datocorregido = corractual.data; corr.datoLog = corractual.datoLog; corr.dif = corractual.dif; corr.datofactorizado = corractual.datofactorizado; corr.identificador = corractual.identificador; corr.data = corractual.data; corr.fecha = corractual.fecha; seriecorregida.Add(corr); } } return(seriecorregida); }