Beispiel #1
0
        //Método que valida si los mínimos y máximos detectados son puntos de quiebre
        //bajo tres criterios y calcular estadísticos
        public List <Models.Salida> ValidadordeSalidaTrimestral(List <Models.Detector> serieorgininalquiebres, List <Models.Detector> seriecorregidaquiebres, List <Models.DataSerie> resultado)
        {
            //CRITERIO 1
            foreach (Models.Detector det in serieorgininalquiebres.Where(n => n.detectormax == 1))
            {
                int indice = det.indice;

                if (indice >= 6)
                {
                    int total = serieorgininalquiebres.Where(n => n.indice >= (indice - 5) && n.indice <= (indice + 5)).Sum(m => m.detectormax);

                    if (total == 1)
                    {
                        det.criterioMax1 = 1;
                        det.fase         = "Pico";
                    }
                    else
                    {
                        det.criterioMax1 = 2;
                        det.fase         = "Pico";
                    }
                }
            }

            foreach (Models.Detector det in serieorgininalquiebres.Where(n => n.detectormin == -1))
            {
                int indice = det.indice;

                if (indice >= 6)
                {
                    int total = serieorgininalquiebres.Where(n => n.indice >= (indice - 5) && n.indice <= (indice + 5)).Sum(m => m.detectormin);

                    if (total == -1)
                    {
                        det.criterioMin1 = 1;
                        det.fase         = "Valle";
                    }
                    else
                    {
                        det.criterioMin1 = 2;
                        det.fase         = "Valle";
                    }
                }
            }

            //CRITERIO 2
            //foreach (Models.Detector d in seriecorregidaquiebres)
            //{
            //    d.indice = d.indice + 3;
            //}

            //for (int w = 0; w < 6; w++)
            //{
            //    Models.Detector detectorIni = new Models.Detector();
            //    detectorIni.mediamovil = null;
            //    detectorIni.indice = w;
            //    detectorIni.detectormax = 0;
            //    detectorIni.detectormin = 0;
            //    seriecorregidaquiebres.Insert(w, detectorIni);
            //}

            foreach (Models.Detector det in serieorgininalquiebres.Where(n => n.detectormax == 1 && n.criterioMax1 >= 1))
            {
                int indice = det.indice;

                if (indice >= 3)
                {
                    var criterio2 = seriecorregidaquiebres.Where(n => (n.indice >= (indice - 2) && n.indice <= (indice + 2)) && n.detectormax == 1).ToList();

                    if (criterio2.Count > 0)
                    {
                        det.criterio2 = 1;
                    }
                    else
                    {
                        det.criterio2 = 0;
                    }
                }
            }

            foreach (Models.Detector det in serieorgininalquiebres.Where(n => n.detectormin == -1 && n.criterioMin1 >= 1))
            {
                int indice = det.indice;

                if (indice >= 3)
                {
                    var criterio2 = seriecorregidaquiebres.Where(n => (n.indice >= (indice - 2) && n.indice <= (indice + 2)) && n.detectormin == -1).ToList();

                    if (criterio2.Count > 0)
                    {
                        det.criterio2 = 1;
                    }
                    else
                    {
                        det.criterio2 = 0;
                    }
                }
            }


            //CRITERIO 3
            var  listaCriterio3 = serieorgininalquiebres.Where(n => (n.detectormax == 1 && n.criterioMax1 >= 1 && n.criterio2 == 1) || (n.detectormin == -1 && n.criterioMin1 >= 1 && n.criterio2 == 1)).ToList();
            bool primerElemento = true;

            Models.Detector tipoAnt = new Models.Detector();
            Models.Detector tipo    = new Models.Detector();

            List <Models.Salida> salida = new List <Models.Salida>();

            foreach (Models.Detector det3 in listaCriterio3)
            {
                Models.Salida osalida = new Models.Salida();

                double?resCriterio3 = 0;
                double?crecMensual  = 0;

                tipo = det3;
                if (primerElemento)
                {
                    tipoAnt        = det3;
                    primerElemento = false;

                    resCriterio3 = (tipo.mediamovil / serieorgininalquiebres[0].mediamovil) - 1;
                    crecMensual  = (((tipo.mediamovil / serieorgininalquiebres[0].mediamovil) - 1) / (tipo.indice - serieorgininalquiebres[0].indice)) * 100;


                    if (resCriterio3 > (Algoritmo.desviaciontGlobal))
                    {
                        det3.criterio3 = 1;
                    }
                    else
                    {
                        det3.criterio3 = 0;
                    }


                    osalida.cambioTotal   = resCriterio3 * 100;
                    osalida.cambioMensual = crecMensual;
                    osalida.indice        = det3.indice;
                    osalida.fecha         = det3.fecha;
                    osalida.fase          = det3.fase;
                    salida.Add(osalida);
                }
                else
                {
                    if (det3.detectormax == 1)
                    {
                        tipo = det3;
                        if (tipoAnt.detectormin == -1)
                        {
                            resCriterio3 = (tipo.mediamovil / tipoAnt.mediamovil) - 1;
                            crecMensual  = (((tipo.mediamovil / tipoAnt.mediamovil) - 1) / (tipo.indice - tipoAnt.indice)) * 100;

                            if (resCriterio3 > (Algoritmo.desviaciontGlobal))
                            {
                                det3.criterio3 = 1;
                            }
                            else
                            {
                                det3.criterio3 = 0;
                            }
                        }
                        osalida.cambioTotal   = resCriterio3 * 100;
                        osalida.cambioMensual = crecMensual;
                        osalida.indice        = det3.indice;
                        osalida.fecha         = det3.fecha;
                        osalida.fase          = det3.fase;
                        salida.Add(osalida);
                        tipoAnt = det3;
                    }
                    else if (det3.detectormin == -1)
                    {
                        tipo = det3;
                        if (tipoAnt.detectormax == 1)
                        {
                            resCriterio3 = (tipo.mediamovil / tipoAnt.mediamovil) - 1;
                            crecMensual  = (((tipo.mediamovil / tipoAnt.mediamovil) - 1) / (tipo.indice - tipoAnt.indice)) * 100;

                            if (resCriterio3 < (Algoritmo.desviaciontGlobal * -1))
                            {
                                det3.criterio3 = 2;
                            }
                            else
                            {
                                det3.criterio3 = 0;
                            }
                        }

                        osalida.cambioTotal   = resCriterio3;
                        osalida.cambioMensual = crecMensual;
                        osalida.indice        = det3.indice;
                        osalida.fecha         = det3.fecha;
                        osalida.fase          = det3.fase;
                        salida.Add(osalida);
                        tipoAnt = det3;
                    }
                }
            }

            //CALCULAMOS LAS ESTADÍSTICAS PATRA IMPRIMIR EN LA TABLA

            //CALCULAMOS LA VARIANZA Y DURACIÓN DE LA FASE

            List <Models.Salida> salidavar = new List <Models.Salida>();

            for (int k = 0; k < listaCriterio3.Count; k++)
            {
                if (k == 0)
                {
                    Models.Detector finalv  = listaCriterio3[k];
                    Models.Detector actualv = new Models.Detector();
                    actualv.indice = 0;
                    Models.Salida var = new Models.Salida();

                    double?sumavar       = 0;
                    int    observaciones = 0;
                    double?media         = 0;
                    double?varianza      = 0;
                    double?ovarianza     = 0;

                    for (int l = actualv.indice; l < finalv.indice; l++)
                    {
                        sumavar      += Convert.ToDouble(resultado[l].Data);
                        observaciones = (finalv.indice - actualv.indice);
                        media         = sumavar / observaciones;
                    }

                    for (int l = actualv.indice; l < finalv.indice; l++)
                    {
                        ovarianza += (Convert.ToDouble(resultado[l].Data) - media) * (Convert.ToDouble(resultado[l].Data) - media);
                        varianza   = ovarianza / (observaciones - 1);
                    }

                    var.varianza = varianza;
                    var.duracion = observaciones;
                    var.fecha    = listaCriterio3[k].fecha;

                    salidavar.Add(var);
                }
                else
                {
                    Models.Detector finalv  = listaCriterio3[k];
                    Models.Detector actualv = listaCriterio3[k - 1];
                    Models.Salida   var     = new Models.Salida();

                    double?sumavar       = 0;
                    int    observaciones = 0;
                    double?media         = 0;
                    double?varianza      = 0;
                    double?ovarianza     = 0;

                    for (int l = actualv.indice; l < finalv.indice; l++)
                    {
                        sumavar      += Convert.ToDouble(resultado[l].Data);
                        observaciones = (finalv.indice - actualv.indice);
                        media         = sumavar / observaciones;
                    }

                    for (int l = actualv.indice; l < finalv.indice; l++)
                    {
                        ovarianza += (Convert.ToDouble(resultado[l].Data) - media) * (Convert.ToDouble(resultado[l].Data) - media);
                        varianza   = ovarianza / (observaciones - 1);
                    }

                    var.varianza = varianza;
                    var.duracion = observaciones;
                    var.fecha    = listaCriterio3[k].fecha;

                    salidavar.Add(var);
                }
            }


            List <Models.Salida> resumen = new List <Models.Salida>();

            for (int i = 0; i < salidavar.Count; i++)
            {
                Models.Salida r = new Models.Salida();

                r.cambioMensual = salida[i].cambioMensual;
                r.cambioTotal   = salida[i].cambioTotal;
                r.duracion      = salidavar[i].duracion;
                r.fecha         = salida[i].fecha;
                r.varianza      = salidavar[i].varianza;
                r.fase          = salida[i].fase;
                r.indice        = salida[i].indice;

                resumen.Add(r);
            }
            return(resumen);
        }
        //Método que valida si los mínimos y máximos detectados son puntos de quiebre
        //bajo tres criterios y calcular estadísticos
        public List <Models.Salida> ValidadordeSalida(List <Models.Detector> serieorgininalquiebres, List <Models.Detector> seriecorregidaquiebres, List <Models.DataSerie> resultado)
        {
            //CRITERIO 1 - AMPLITUD DEL CICLO DEBE SER MAYOR QUE MAS MENOS 15 PERIODOS
            // SUMA LOS VALORES DEL DETECTOR DE PUNTOS MÁXIMOS SU LA SUMA ES "1"/"-1" ENTONCES SE MARCA 1 (PICO/VALLE)
            // SI LA SUMA ES CUALQUIER NUMERO DIFERENTE DE "1"/"-1" ENTONCES MARCA 2
            foreach (Models.Detector det in serieorgininalquiebres.Where(n => n.detectormax == 1))
            {
                int indice = det.indice;

                if (indice >= 16)
                {
                    int total = serieorgininalquiebres.Where(n => n.indice >= (indice - 15) && n.indice <= (indice + 15)).Sum(m => m.detectormax);

                    if (total == 1)
                    {
                        det.criterioMax1 = 1;
                        det.fase         = "Pico";
                    }
                    else
                    {
                        det.criterioMax1 = 2;
                        det.fase         = "Pico";
                    }
                }
            }

            foreach (Models.Detector det in serieorgininalquiebres.Where(n => n.detectormin == -1))
            {
                int indice = det.indice;

                if (indice >= 16)
                {
                    int total = serieorgininalquiebres.Where(n => n.indice >= (indice - 15) && n.indice <= (indice + 15)).Sum(m => m.detectormin);

                    if (total == -1)
                    {
                        det.criterioMin1 = 1;
                        det.fase         = "Valle";
                    }
                    else
                    {
                        det.criterioMin1 = 2;
                        det.fase         = "Valle";
                    }
                }
            }



            //foreach (Models.Detector d in seriecorregidaquiebres)
            //{
            //    d.indice = d.indice + 3;
            //}

            //for (int w = 0; w < 16; w++)
            //{
            //    Models.Detector detectorIni = new Models.Detector();
            //    detectorIni.mediamovil = null;
            //    detectorIni.indice = w;
            //    detectorIni.detectormax = 0;
            //    detectorIni.detectormin = 0;
            //    seriecorregidaquiebres.Insert(w, detectorIni);
            //}
            //CRITERIO 2
            // SIMILITUD ENTRE LA CORREGIDA Y LA ORIGINAL
            // SE COMPARAN LOS QUIEBRES DE LA SERIE ORIGINAL CON LA SERIE CORREGIDA, SI SE ENCUENTRA UN QUIEBRE EN LA
            // CORREGIDA EN MENOS DE 5 PERIODOS DE LA ORIGINAL ENTONCES MARCA EL CRITERIO COMO 1 SI NO COMO 2
            foreach (Models.Detector det in serieorgininalquiebres.Where(n => n.detectormax == 1 && n.criterioMax1 >= 1))
            {
                int indice = det.indice;

                if (indice >= 6)
                {
                    var criterio2 = seriecorregidaquiebres.Where(n => (n.indice >= (indice - 5) && n.indice <= (indice + 5)) && n.detectormax == 1).ToList();

                    if (criterio2.Count > 0)
                    {
                        det.criterio2 = 1;
                    }
                    else
                    {
                        det.criterio2 = 0;
                    }
                }
            }

            foreach (Models.Detector det in serieorgininalquiebres.Where(n => n.detectormin == -1 && n.criterioMin1 >= 1))
            {
                int indice = det.indice;

                if (indice >= 6)
                {
                    var criterio2 = seriecorregidaquiebres.Where(n => (n.indice >= (indice - 5) && n.indice <= (indice + 5)) && n.detectormin == -1).ToList();

                    if (criterio2.Count > 0)
                    {
                        det.criterio2 = 1;
                    }
                    else
                    {
                        det.criterio2 = 0;
                    }
                }
            }


            //CRITERIO 3

            var  listaCriterio3 = serieorgininalquiebres.Where(n => (n.detectormax == 1 && n.criterioMax1 >= 1 && n.criterio2 == 1) || (n.detectormin == -1 && n.criterioMin1 >= 1 && n.criterio2 == 1)).ToList();
            bool primerElemento = true;

            Models.Detector tipoAnt = new Models.Detector();
            Models.Detector tipo    = new Models.Detector();

            List <Models.Salida> salida = new List <Models.Salida>();

            foreach (Models.Detector det3 in listaCriterio3)
            {
                Models.Salida osalida = new Models.Salida();

                double?resCriterio3 = 0;
                double?crecMensual  = 0;

                tipo = det3;
                if (primerElemento)
                {
                    tipoAnt        = det3;
                    primerElemento = false;

                    resCriterio3 = (tipo.mediamovil / serieorgininalquiebres[0].mediamovil) - 1;
                    crecMensual  = (((tipo.mediamovil / serieorgininalquiebres[0].mediamovil) - 1) / (tipo.indice - serieorgininalquiebres[0].indice)) * 100;


                    if (resCriterio3 > (Algoritmo.desviaciontGlobal))
                    {
                        det3.criterio3 = 1;
                    }
                    else
                    {
                        det3.criterio3 = 0;
                    }


                    osalida.cambioTotal   = resCriterio3 * 100;
                    osalida.cambioMensual = crecMensual;
                    osalida.indice        = det3.indice;
                    osalida.fecha         = det3.fecha;
                    osalida.fase          = det3.fase;
                    salida.Add(osalida);
                }
                else
                {
                    if (det3.detectormax == 1)
                    {
                        tipo = det3;
                        if (tipoAnt.detectormin == -1)
                        {
                            resCriterio3 = (tipo.mediamovil / tipoAnt.mediamovil) - 1;
                            crecMensual  = (((tipo.mediamovil / tipoAnt.mediamovil) - 1) / (tipo.indice - tipoAnt.indice)) * 100;

                            if (resCriterio3 > (Algoritmo.desviaciontGlobal))
                            {
                                det3.criterio3 = 1;
                            }
                            else
                            {
                                det3.criterio3 = 0;
                            }
                        }
                        osalida.cambioTotal   = resCriterio3 * 100;
                        osalida.cambioMensual = crecMensual;
                        osalida.indice        = det3.indice;
                        osalida.fecha         = det3.fecha;
                        osalida.fase          = det3.fase;
                        salida.Add(osalida);
                        tipoAnt = det3;
                    }
                    else if (det3.detectormin == -1)
                    {
                        tipo = det3;
                        if (tipoAnt.detectormax == 1)
                        {
                            resCriterio3 = (tipo.mediamovil / tipoAnt.mediamovil) - 1;
                            crecMensual  = (((tipo.mediamovil / tipoAnt.mediamovil) - 1) / (tipo.indice - tipoAnt.indice)) * 100;

                            if (resCriterio3 < (Algoritmo.desviaciontGlobal * -1))
                            {
                                det3.criterio3 = 2;
                            }
                            else
                            {
                                det3.criterio3 = 0;
                            }
                        }

                        osalida.cambioTotal   = resCriterio3;
                        osalida.cambioMensual = crecMensual;
                        osalida.indice        = det3.indice;
                        osalida.fecha         = det3.fecha;
                        osalida.fase          = det3.fase;
                        salida.Add(osalida);
                        tipoAnt = det3;
                    }
                }
            }

            //CALCULAMOS LAS ESTADÍSTICAS PATRA IMPRIMIR EN LA TABLA

            //CALCULAMOS LA VARIANZA Y DURACIÓN DE LA FASE

            List <Models.Salida> salidavar = new List <Models.Salida>();

            for (int k = 0; k < listaCriterio3.Count; k++)
            {
                if (k == 0)
                {
                    Models.Detector finalv  = listaCriterio3[k];
                    Models.Detector actualv = new Models.Detector();
                    actualv.indice = 0;
                    Models.Salida var = new Models.Salida();

                    double?sumavar       = 0;
                    int    observaciones = 0;
                    double?media         = 0;
                    double?varianza      = 0;
                    double?ovarianza     = 0;

                    for (int l = actualv.indice; l < finalv.indice; l++)
                    {
                        sumavar      += Convert.ToDouble(resultado[l].Data);
                        observaciones = (finalv.indice - actualv.indice);
                        media         = sumavar / observaciones;
                    }

                    for (int l = actualv.indice; l < finalv.indice; l++)
                    {
                        ovarianza += (Convert.ToDouble(resultado[l].Data) - media) * (Convert.ToDouble(resultado[l].Data) - media);
                        varianza   = ovarianza / (observaciones - 1);
                    }

                    var.varianza = varianza;
                    var.duracion = observaciones;
                    var.fecha    = listaCriterio3[k].fecha;

                    salidavar.Add(var);
                }
                else
                {
                    Models.Detector finalv  = listaCriterio3[k];
                    Models.Detector actualv = listaCriterio3[k - 1];
                    Models.Salida   var     = new Models.Salida();

                    double?sumavar       = 0;
                    int    observaciones = 0;
                    double?media         = 0;
                    double?varianza      = 0;
                    double?ovarianza     = 0;

                    for (int l = actualv.indice; l < finalv.indice; l++)
                    {
                        sumavar      += Convert.ToDouble(resultado[l].Data);
                        observaciones = (finalv.indice - actualv.indice);
                        media         = sumavar / observaciones;
                    }

                    for (int l = actualv.indice; l < finalv.indice; l++)
                    {
                        ovarianza += (Convert.ToDouble(resultado[l].Data) - media) * (Convert.ToDouble(resultado[l].Data) - media);
                        varianza   = ovarianza / (observaciones - 1);
                    }

                    var.varianza = varianza;
                    var.duracion = observaciones;
                    var.fecha    = listaCriterio3[k].fecha;

                    salidavar.Add(var);
                }
            }


            List <Models.Salida> resumen = new List <Models.Salida>();

            for (int i = 0; i < salidavar.Count; i++)
            {
                Models.Salida r = new Models.Salida();

                r.cambioMensual = salida[i].cambioMensual;
                r.cambioTotal   = salida[i].cambioTotal;
                r.duracion      = salidavar[i].duracion;
                r.fecha         = salida[i].fecha;
                r.varianza      = salidavar[i].varianza;
                r.fase          = salida[i].fase;
                r.indice        = salida[i].indice;

                resumen.Add(r);
            }
            return(resumen);
        }