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); }
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); }