This is an automated email from the ASF dual-hosted git repository.
jihao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pinot.git
The following commit(s) were added to refs/heads/master by this push:
new d499ba1 [TE] pass predicted time series thought out the detection
pipeline (#4190)
d499ba1 is described below
commit d499ba12fcaeaefe0c56d57e7df7a86c18f0ca1c
Author: Jihao Zhang <[email protected]>
AuthorDate: Wed May 8 16:42:30 2019 -0700
[TE] pass predicted time series thought out the detection pipeline (#4190)
We've changed the detector interface to pass predicted time series from
detector to detection pipeline. This PR updates each stage of the detection
pipeline to pass the time series. This makes the time series available in
preview endpoints. Also, this makes the evaluation metrics calculation possible.
---
.../detection/DetectionPipelineResult.java | 34 ++++++-----
.../thirdeye/detection/DetectionResource.java | 2 +-
.../pinot/thirdeye/detection/PredictionResult.java | 65 ++++++++++++++++++++++
.../detection/algorithm/DimensionWrapper.java | 5 +-
.../thirdeye/detection/algorithm/MergeWrapper.java | 6 +-
.../thirdeye/detection/spi/model/TimeSeries.java | 9 ++-
.../detection/wrapper/AnomalyDetectorWrapper.java | 32 ++++++++++-
.../detection/wrapper/AnomalyFilterWrapper.java | 6 +-
.../wrapper/AnomalyDetectorWrapperTest.java | 34 +++++++++++
9 files changed, 170 insertions(+), 23 deletions(-)
diff --git
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/DetectionPipelineResult.java
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/DetectionPipelineResult.java
index 5997acc..7a5c934 100644
---
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/DetectionPipelineResult.java
+++
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/DetectionPipelineResult.java
@@ -19,6 +19,7 @@
package org.apache.pinot.thirdeye.detection;
+import java.util.Collections;
import org.apache.pinot.thirdeye.datalayer.dto.MergedAnomalyResultDTO;
import java.util.HashMap;
import java.util.List;
@@ -29,38 +30,45 @@ public class DetectionPipelineResult {
public static String DIAGNOSTICS_DATA = "data";
public static String DIAGNOSTICS_CHANGE_POINTS = "changepoints";
- Map<String, Object> diagnostics;
- List<MergedAnomalyResultDTO> anomalies;
- long lastTimestamp;
+ private Map<String, Object> diagnostics;
+ // detected anomalies
+ private final List<MergedAnomalyResultDTO> anomalies;
+ // last time stamp, all data point before this time stamp has been inspected
+ private final long lastTimestamp;
+ // predicted baselines result
+ private final List<PredictionResult> predictions;
public DetectionPipelineResult(List<MergedAnomalyResultDTO> anomalies) {
- this.anomalies = anomalies;
- this.lastTimestamp = getMaxTime(anomalies);
+ this(anomalies, getMaxTime(anomalies), Collections.emptyList());
this.diagnostics = new HashMap<>();
}
public DetectionPipelineResult(List<MergedAnomalyResultDTO> anomalies, long
lastTimestamp) {
+ this(anomalies, lastTimestamp, Collections.emptyList());
+ this.diagnostics = new HashMap<>();
+ }
+
+ public DetectionPipelineResult(List<MergedAnomalyResultDTO> anomalies, long
lastTimestamp,
+ List<PredictionResult> predictedTimeSeries) {
this.anomalies = anomalies;
this.lastTimestamp = lastTimestamp;
+ this.predictions = predictedTimeSeries;
+ this.diagnostics = new HashMap<>();
+ }
+
+ public List<PredictionResult> getPredictions() {
+ return predictions;
}
public List<MergedAnomalyResultDTO> getAnomalies() {
return anomalies;
}
- public DetectionPipelineResult setAnomalies(List<MergedAnomalyResultDTO>
anomalies) {
- this.anomalies = anomalies;
- return this;
- }
public long getLastTimestamp() {
return lastTimestamp;
}
- public DetectionPipelineResult setLastTimestamp(long lastTimestamp) {
- this.lastTimestamp = lastTimestamp;
- return this;
- }
public Map<String, Object> getDiagnostics() {
return diagnostics;
diff --git
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/DetectionResource.java
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/DetectionResource.java
index 38fad77..9558aad 100644
---
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/DetectionResource.java
+++
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/DetectionResource.java
@@ -459,7 +459,7 @@ public class DetectionResource {
return Response.serverError().entity(responseMessage).build();
}
- LOG.info("Replay detection pipeline {} generated {} anomalies.",
detectionId, result.anomalies.size());
+ LOG.info("Replay detection pipeline {} generated {} anomalies.",
detectionId, result.getAnomalies().size());
return Response.ok(result).build();
}
diff --git
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/PredictionResult.java
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/PredictionResult.java
new file mode 100644
index 0000000..01008a8
--- /dev/null
+++
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/PredictionResult.java
@@ -0,0 +1,65 @@
+/*
+ *
+ * * Licensed to the Apache Software Foundation (ASF) under one
+ * * or more contributor license agreements. See the NOTICE file
+ * * distributed with this work for additional information
+ * * regarding copyright ownership. The ASF licenses this file
+ * * to you under the Apache License, Version 2.0 (the
+ * * "License"); you may not use this file except in compliance
+ * * with the License. You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing,
+ * * software distributed under the License is distributed on an
+ * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * * KIND, either express or implied. See the License for the
+ * * specific language governing permissions and limitations
+ * * under the License.
+ *
+ *
+ */
+
+package org.apache.pinot.thirdeye.detection;
+
+import org.apache.pinot.thirdeye.dataframe.DataFrame;
+
+
+/**
+ * The time series prediction result
+ */
+public class PredictionResult {
+ private final String detectorName;
+ private final String metricUrn;
+ private final DataFrame predictedTimeSeries;
+
+ /**
+ * Construct a prediction result
+ * @param detectorName the name for the detector, for example
"detection_rule_1:PERCENTAGE_RULE"
+ * @param metricUrn the metric urn
+ * @param predictedTimeSeries the predicted time series
+ */
+ public PredictionResult(String detectorName, String metricUrn, DataFrame
predictedTimeSeries) {
+ this.detectorName = detectorName;
+ this.metricUrn = metricUrn;
+ this.predictedTimeSeries = predictedTimeSeries;
+ }
+
+ public String getDetectorName() {
+ return detectorName;
+ }
+
+ public String getMetricUrn() {
+ return metricUrn;
+ }
+
+ public DataFrame getPredictedTimeSeries() {
+ return predictedTimeSeries;
+ }
+
+ @Override
+ public String toString() {
+ return "PredictionResult{" + "detectorName='" + detectorName + '\'' + ",
metricUrn='" + metricUrn + '\''
+ + ", predictedTimeSeries=" + predictedTimeSeries + '}';
+ }
+}
diff --git
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/algorithm/DimensionWrapper.java
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/algorithm/DimensionWrapper.java
index fa31288..b5f929b 100644
---
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/algorithm/DimensionWrapper.java
+++
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/algorithm/DimensionWrapper.java
@@ -34,6 +34,7 @@ import
org.apache.pinot.thirdeye.detection.DetectionPipelineException;
import org.apache.pinot.thirdeye.detection.DetectionPipeline;
import org.apache.pinot.thirdeye.detection.DetectionPipelineResult;
import org.apache.pinot.thirdeye.detection.DetectionUtils;
+import org.apache.pinot.thirdeye.detection.PredictionResult;
import org.apache.pinot.thirdeye.rootcause.impl.MetricEntity;
import java.util.ArrayList;
import java.util.Collection;
@@ -222,6 +223,7 @@ public class DimensionWrapper extends DetectionPipeline {
}
List<MergedAnomalyResultDTO> anomalies = new ArrayList<>();
+ List<PredictionResult> predictionResults = new ArrayList<>();
Map<String, Object> diagnostics = new HashMap<>();
Set<Long> lastTimeStamps = new HashSet<>();
@@ -239,6 +241,7 @@ public class DimensionWrapper extends DetectionPipeline {
lastTimeStamps.add(intermediate.getLastTimestamp());
anomalies.addAll(intermediate.getAnomalies());
diagnostics.put(metric.getUrn(), intermediate.getDiagnostics());
+ predictionResults.addAll(intermediate.getPredictions());
}
successNestedMetrics++;
} catch (Exception e) {
@@ -249,7 +252,7 @@ public class DimensionWrapper extends DetectionPipeline {
}
checkNestedMetricsStatus(totalNestedMetrics, successNestedMetrics,
lastException);
- return new DetectionPipelineResult(anomalies,
DetectionUtils.consolidateNestedLastTimeStamps(lastTimeStamps))
+ return new DetectionPipelineResult(anomalies,
DetectionUtils.consolidateNestedLastTimeStamps(lastTimeStamps),
predictionResults)
.setDiagnostics(diagnostics);
}
diff --git
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/algorithm/MergeWrapper.java
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/algorithm/MergeWrapper.java
index 5acf958..8395587 100644
---
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/algorithm/MergeWrapper.java
+++
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/algorithm/MergeWrapper.java
@@ -40,6 +40,7 @@ import org.apache.pinot.thirdeye.detection.DataProvider;
import org.apache.pinot.thirdeye.detection.DetectionPipeline;
import org.apache.pinot.thirdeye.detection.DetectionPipelineResult;
import org.apache.pinot.thirdeye.detection.DetectionUtils;
+import org.apache.pinot.thirdeye.detection.PredictionResult;
import org.apache.pinot.thirdeye.detection.spi.model.AnomalySlice;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -106,7 +107,7 @@ public class MergeWrapper extends DetectionPipeline {
// generate anomalies
List<MergedAnomalyResultDTO> generated = new ArrayList<>();
-
+ List<PredictionResult> predictionResults = new ArrayList<>();
int i = 0;
Set<Long> lastTimeStamps = new HashSet<>();
for (Map<String, Object> properties : this.nestedProperties) {
@@ -125,6 +126,7 @@ public class MergeWrapper extends DetectionPipeline {
lastTimeStamps.add(intermediate.getLastTimestamp());
generated.addAll(intermediate.getAnomalies());
+ predictionResults.addAll(intermediate.getPredictions());
diagnostics.put(String.valueOf(i), intermediate.getDiagnostics());
i++;
@@ -135,7 +137,7 @@ public class MergeWrapper extends DetectionPipeline {
all.addAll(retrieveAnomaliesFromDatabase(generated));
all.addAll(generated);
- return new DetectionPipelineResult(this.merge(all),
DetectionUtils.consolidateNestedLastTimeStamps(lastTimeStamps)).setDiagnostics(diagnostics);
+ return new DetectionPipelineResult(this.merge(all),
DetectionUtils.consolidateNestedLastTimeStamps(lastTimeStamps),
predictionResults).setDiagnostics(diagnostics);
}
protected List<MergedAnomalyResultDTO>
retrieveAnomaliesFromDatabase(List<MergedAnomalyResultDTO> generated) {
diff --git
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/spi/model/TimeSeries.java
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/spi/model/TimeSeries.java
index 9cae39e..1051342 100644
---
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/spi/model/TimeSeries.java
+++
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/spi/model/TimeSeries.java
@@ -75,9 +75,14 @@ public class TimeSeries {
* return a empty time series
* @return a empty time series
*/
- public static TimeSeries empty(){
+ public static TimeSeries empty() {
TimeSeries ts = new TimeSeries();
- ts.df.addSeries(COL_TIME, LongSeries.empty()).addSeries(COL_VALUE,
DoubleSeries.empty()).setIndex(COL_TIME);
+ ts.df.addSeries(COL_TIME, LongSeries.empty())
+ .addSeries(COL_VALUE, DoubleSeries.empty())
+ .addSeries(COL_CURRENT, DoubleSeries.empty())
+ .addSeries(COL_UPPER_BOUND, DoubleSeries.empty())
+ .addSeries(COL_LOWER_BOUND, DoubleSeries.empty())
+ .setIndex(COL_TIME);
return ts;
}
diff --git
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/wrapper/AnomalyDetectorWrapper.java
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/wrapper/AnomalyDetectorWrapper.java
index bba9e4e..807a4eb 100644
---
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/wrapper/AnomalyDetectorWrapper.java
+++
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/wrapper/AnomalyDetectorWrapper.java
@@ -21,6 +21,7 @@ package org.apache.pinot.thirdeye.detection.wrapper;
import com.google.common.base.Preconditions;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -30,6 +31,7 @@ import org.apache.commons.collections.MapUtils;
import org.apache.pinot.thirdeye.anomaly.detection.DetectionJobSchedulerUtils;
import org.apache.pinot.thirdeye.common.time.TimeGranularity;
import org.apache.pinot.thirdeye.common.time.TimeSpec;
+import org.apache.pinot.thirdeye.dataframe.DataFrame;
import org.apache.pinot.thirdeye.dataframe.DoubleSeries;
import org.apache.pinot.thirdeye.dataframe.util.MetricSlice;
import org.apache.pinot.thirdeye.datalayer.dto.AnomalyFunctionDTO;
@@ -42,9 +44,11 @@ import org.apache.pinot.thirdeye.detection.DetectionPipeline;
import org.apache.pinot.thirdeye.detection.DetectionPipelineException;
import org.apache.pinot.thirdeye.detection.DetectionPipelineResult;
import org.apache.pinot.thirdeye.detection.DetectionUtils;
+import org.apache.pinot.thirdeye.detection.PredictionResult;
import org.apache.pinot.thirdeye.detection.spi.components.AnomalyDetector;
import
org.apache.pinot.thirdeye.detection.spi.exception.DetectorDataInsufficientException;
import org.apache.pinot.thirdeye.detection.spi.model.DetectionResult;
+import org.apache.pinot.thirdeye.detection.spi.model.TimeSeries;
import org.apache.pinot.thirdeye.rootcause.impl.MetricEntity;
import org.apache.pinot.thirdeye.util.ThirdEyeUtils;
import org.joda.time.DateTime;
@@ -84,7 +88,9 @@ public class AnomalyDetectorWrapper extends DetectionPipeline
{
private static final long CACHING_PERIOD_LOOKBACK_MINUTELY = -1;
// fail detection job if it failed successively for the first 5 windows
private static final long EARLY_TERMINATE_WINDOW = 5;
-
+ // expression to consolidate the time series
+ private static final String[] TIMESERIES_AGGREGATION_EXPRESSIONS =
+ {COL_VALUE + ":last", COL_CURRENT + ":last", COL_LOWER_BOUND + ":last",
COL_UPPER_BOUND + ":last"};
private static final Logger LOG =
LoggerFactory.getLogger(AnomalyDetectorWrapper.class);
private final String metricUrn;
@@ -159,6 +165,7 @@ public class AnomalyDetectorWrapper extends
DetectionPipeline {
List<Interval> monitoringWindows = this.getMonitoringWindows();
List<MergedAnomalyResultDTO> anomalies = new ArrayList<>();
+ TimeSeries predictedResult = TimeSeries.empty();
int totalWindows = monitoringWindows.size();
int successWindows = 0;
// The last exception of the detection windows. It will be thrown out to
upper level.
@@ -188,6 +195,7 @@ public class AnomalyDetectorWrapper extends
DetectionPipeline {
lastException = e;
}
anomalies.addAll(detectionResult.getAnomalies());
+ predictedResult = consolidateTimeSeries(predictedResult,
detectionResult.getTimeseries());
}
checkMovingWindowDetectionStatus(totalWindows, successWindows,
lastException);
@@ -201,8 +209,26 @@ public class AnomalyDetectorWrapper extends
DetectionPipeline {
anomaly.getProperties().put(PROP_DETECTOR_COMPONENT_NAME,
this.detectorName);
}
long lastTimeStamp = this.getLastTimeStamp();
- return new DetectionPipelineResult(anomalies.stream().filter(anomaly ->
anomaly.getEndTime() <= lastTimeStamp).collect(
- Collectors.toList()), lastTimeStamp);
+ List<MergedAnomalyResultDTO> anomalyResults =
anomalies.stream().filter(anomaly -> anomaly.getEndTime() <=
lastTimeStamp).collect(
+ Collectors.toList());
+ PredictionResult predictedTimeSeries = new
PredictionResult(this.detectorName, this.metricUrn,
predictedResult.getDataFrame());
+ return new DetectionPipelineResult(anomalyResults, lastTimeStamp,
Collections.singletonList(predictedTimeSeries));
+ }
+
+ /**
+ * Join two time series, including current, baseline, lower bound and upper
bound.
+ * If two time series have overlapped region, take the value in the right
time series
+ * @param leftTimeSeries timeseries 1
+ * @param rightTimeSeries timeseries 2
+ * @return the consolidated time series
+ */
+ static TimeSeries consolidateTimeSeries(TimeSeries leftTimeSeries,
TimeSeries rightTimeSeries) {
+ DataFrame df1 = leftTimeSeries.getDataFrame();
+ DataFrame df2 = rightTimeSeries.getDataFrame();
+ DataFrame consolidatedDf = df1.append(df2)
+ .groupByValue(COL_TIME)
+ .aggregate(TIMESERIES_AGGREGATION_EXPRESSIONS);
+ return TimeSeries.fromDataFrame(consolidatedDf);
}
private void checkEarlyStop(int totalWindows, int successWindows, int i,
Exception lastException) throws DetectionPipelineException {
diff --git
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/wrapper/AnomalyFilterWrapper.java
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/wrapper/AnomalyFilterWrapper.java
index 86c773c..c4d52fb 100644
---
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/wrapper/AnomalyFilterWrapper.java
+++
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/wrapper/AnomalyFilterWrapper.java
@@ -30,6 +30,7 @@ import org.apache.pinot.thirdeye.detection.DataProvider;
import org.apache.pinot.thirdeye.detection.DetectionPipeline;
import org.apache.pinot.thirdeye.detection.DetectionPipelineResult;
import org.apache.pinot.thirdeye.detection.DetectionUtils;
+import org.apache.pinot.thirdeye.detection.PredictionResult;
import org.apache.pinot.thirdeye.detection.spi.components.AnomalyFilter;
import java.util.ArrayList;
import java.util.Collection;
@@ -73,6 +74,8 @@ public class AnomalyFilterWrapper extends DetectionPipeline {
@Override
public final DetectionPipelineResult run() throws Exception {
List<MergedAnomalyResultDTO> candidates = new ArrayList<>();
+ List<PredictionResult> predictionResults = new ArrayList<>();
+
Set<Long> lastTimeStamps = new HashSet<>();
for (Map<String, Object> properties : this.nestedProperties) {
DetectionConfigDTO nestedConfig = new DetectionConfigDTO();
@@ -91,12 +94,13 @@ public class AnomalyFilterWrapper extends DetectionPipeline
{
DetectionPipelineResult intermediate = pipeline.run();
lastTimeStamps.add(intermediate.getLastTimestamp());
+ predictionResults.addAll(intermediate.getPredictions());
candidates.addAll(intermediate.getAnomalies());
}
Collection<MergedAnomalyResultDTO> anomalies =
Collections2.filter(candidates, mergedAnomaly -> mergedAnomaly != null
&& !mergedAnomaly.isChild() && anomalyFilter.isQualified(mergedAnomaly));
- return new DetectionPipelineResult(new ArrayList<>(anomalies),
DetectionUtils.consolidateNestedLastTimeStamps(lastTimeStamps));
+ return new DetectionPipelineResult(new ArrayList<>(anomalies),
DetectionUtils.consolidateNestedLastTimeStamps(lastTimeStamps),
predictionResults);
}
}
diff --git
a/thirdeye/thirdeye-pinot/src/test/java/org/apache/pinot/thirdeye/detection/wrapper/AnomalyDetectorWrapperTest.java
b/thirdeye/thirdeye-pinot/src/test/java/org/apache/pinot/thirdeye/detection/wrapper/AnomalyDetectorWrapperTest.java
index 8cbd5e1..1671224 100644
---
a/thirdeye/thirdeye-pinot/src/test/java/org/apache/pinot/thirdeye/detection/wrapper/AnomalyDetectorWrapperTest.java
+++
b/thirdeye/thirdeye-pinot/src/test/java/org/apache/pinot/thirdeye/detection/wrapper/AnomalyDetectorWrapperTest.java
@@ -19,9 +19,12 @@ package org.apache.pinot.thirdeye.detection.wrapper;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ListMultimap;
+import java.sql.Time;
import org.apache.pinot.thirdeye.common.time.TimeGranularity;
import org.apache.pinot.thirdeye.common.time.TimeSpec;
import org.apache.pinot.thirdeye.dataframe.DataFrame;
+import org.apache.pinot.thirdeye.dataframe.DoubleSeries;
+import org.apache.pinot.thirdeye.dataframe.LongSeries;
import org.apache.pinot.thirdeye.dataframe.util.MetricSlice;
import org.apache.pinot.thirdeye.datalayer.dto.DatasetConfigDTO;
import org.apache.pinot.thirdeye.datalayer.dto.DetectionConfigDTO;
@@ -34,6 +37,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
+import org.apache.pinot.thirdeye.detection.spi.model.TimeSeries;
import org.joda.time.DateTimeZone;
import org.joda.time.Interval;
import org.testng.Assert;
@@ -169,4 +173,34 @@ public class AnomalyDetectorWrapperTest {
new AnomalyDetectorWrapper(this.provider, this.config, 1546819200000L,
1546905600000L);
Assert.assertEquals(detectionPipeline.getLastTimeStamp(), -1);
}
+
+ @Test
+ public void testConsolidateTimeSeries() {
+ TimeSeries ts1 =
+ new TimeSeries(LongSeries.buildFrom(1L, 2L, 3L, 4L, 5L),
DoubleSeries.buildFrom(1.0, 20.0, 30.0, 40.0, 50.0),
+ DoubleSeries.buildFrom(1.0, 2.0, 3.0, 4.0, 5.0),
DoubleSeries.buildFrom(1.0, 2.0, 3.0, 4.0, 5.0),
+ DoubleSeries.buildFrom(1.0, 2.0, 3.0, 4.0, 5.0));
+ TimeSeries ts2 =
+ new TimeSeries(LongSeries.buildFrom(2L, 3L, 4L, 5L, 6L),
DoubleSeries.buildFrom(1.0, 2.0, 3.0, 4.0, 5.0),
+ DoubleSeries.buildFrom(2.0, 3.0, 4.0, 5.0, 6.0),
DoubleSeries.buildFrom(1.0, 2.0, 3.0, 4.0, 5.0),
+ DoubleSeries.buildFrom(1.0, 2.0, 3.0, 4.0, 5.0));
+ TimeSeries result = AnomalyDetectorWrapper.consolidateTimeSeries(ts1, ts2);
+ Assert.assertEquals(result.getTime(), LongSeries.buildFrom(1L, 2L, 3L, 4L,
5L, 6L));
+ Assert.assertEquals(result.getCurrent(), DoubleSeries.buildFrom(1.0, 2.0,
3.0, 4.0, 5.0, 6.0));
+ Assert.assertEquals(result.getPredictedBaseline(),
DoubleSeries.buildFrom(1.0, 1.0, 2.0, 3.0, 4.0, 5.0));
+ Assert.assertEquals(result.getPredictedUpperBound(),
DoubleSeries.buildFrom(1.0, 1.0, 2.0, 3.0, 4.0, 5.0));
+ Assert.assertEquals(result.getPredictedLowerBound(),
DoubleSeries.buildFrom(1.0, 1.0, 2.0, 3.0, 4.0, 5.0));
+ }
+
+ @Test
+ public void testConsolidateTimeSeriesWithNull() {
+ TimeSeries ts1 = TimeSeries.empty();
+ TimeSeries ts2 = new TimeSeries(LongSeries.buildFrom(1L, 2L, 3L, 4L, 5L),
DoubleSeries.buildFrom(1.0, 20.0, 30.0, 40.0, 50.0));
+ TimeSeries ts3 = new TimeSeries(LongSeries.buildFrom(2L, 3L, 4L, 5L, 6L),
DoubleSeries.buildFrom(2.0 ,3.0, 4.0, Double.NaN, 6.0));
+ TimeSeries result1 = AnomalyDetectorWrapper.consolidateTimeSeries(ts1,
ts2);
+ TimeSeries result = AnomalyDetectorWrapper.consolidateTimeSeries(result1,
ts3);
+ Assert.assertEquals(result.getTime(), LongSeries.buildFrom(1L, 2L, 3L, 4L,
5L, 6L));
+ Assert.assertEquals(result.getPredictedBaseline(),
DoubleSeries.buildFrom(1.0, 2.0, 3.0, 4.0, Double.NaN, 6.0));
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]