public static bool CurveHasSpikes(List <double> curveValues, CurveSpikeParameters spikeParams)
        {
            Boolean spike = false;

            if (curveValues.Count() > 0)
            {
                for (int i = 0; i < curveValues.Count(); i++)
                {
                    if (curveValues[i] != spikeParams.NullValue)
                    {
                        List <double> windowLogValues = GetWindowLogValues(curveValues, i, spikeParams);
                        if (windowLogValues.Count > 2)
                        {
                            spike = GetSpikes(curveValues[i], windowLogValues, spikeParams);
                            if (spike)
                            {
                                break;
                            }
                        }
                    }
                }
            }
            else
            {
                //Console.WriteLine("Error: no log values");
            }
            return(spike);
        }
示例#2
0
        public static string CurveSpikes(QcRuleSetup qcSetup, DataTable dt, List <DataAccessDef> accessDefs, IIndexDBAccess indexData)
        {
            string               returnStatus = "Passed";
            string               error        = "";
            RuleModel            rule         = JsonConvert.DeserializeObject <RuleModel>(qcSetup.RuleObject);
            JObject              dataObject   = JObject.Parse(qcSetup.DataObject);
            double               nullValue    = Common.GetLogNullValue(dataObject.ToString());
            CurveSpikeParameters spikeParams  = new CurveSpikeParameters()
            {
                WindowSize   = 5,
                SeveritySize = 4
            };

            if (!string.IsNullOrEmpty(rule.RuleParameters))
            {
                try
                {
                    spikeParams = JsonConvert.DeserializeObject <CurveSpikeParameters>(rule.RuleParameters);
                    if (spikeParams.WindowSize == 0)
                    {
                        spikeParams.WindowSize = 5;
                    }
                    if (spikeParams.SeveritySize == 0)
                    {
                        spikeParams.SeveritySize = 4;
                    }
                }
                catch (Exception ex)
                {
                    error = $"Bad Json, {ex}";
                }
            }
            spikeParams.NullValue = nullValue;
            List <double> measuredValues = new List <double>();

            try
            {
                JToken value    = dataObject.GetValue("MEASURED_VALUE");
                string strValue = value.ToString();
                if (!string.IsNullOrEmpty(strValue))
                {
                    measuredValues = strValue.Split(',').Select(double.Parse).ToList();
                }
            }
            catch (Exception ex)
            {
                error = $"Problems with the log arrays, {ex}";
            }

            bool spike = RuleMethodUtilities.CurveHasSpikes(measuredValues, spikeParams);

            if (spike)
            {
                returnStatus = "Failed";
            }

            return(returnStatus);
        }
        private static Boolean GetSpikes(double value, List <double> windowValues, CurveSpikeParameters spikeParams)
        {
            Boolean spike       = false;
            double  deviation   = Common.CalculateStdDev(windowValues);
            double  average     = windowValues.Average();
            double  spikeFactor = deviation * spikeParams.SeveritySize;

            if (value < average - spikeFactor)
            {
                spike = true;
            }
            if (value > average + spikeFactor)
            {
                spike = true;
            }
            return(spike);
        }
        private static List <double> GetWindowLogValues(List <double> value, int idx, CurveSpikeParameters spikeParams)
        {
            List <double> logValues = new List <double>();
            int           start     = idx - spikeParams.WindowSize;

            if (start < 0)
            {
                start = 0;
            }
            int end = idx + spikeParams.WindowSize + 1;

            if (end > value.Count())
            {
                end = value.Count();
            }
            for (int i = start; i < end; i++)
            {
                if (value[i] != spikeParams.NullValue)
                {
                    logValues.Add(value[i]);
                }
            }
            return(logValues);
        }