This is an automated email from the ASF dual-hosted git repository.
xhsun 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 937ecb4 Add upper lower bounds (#4147)
937ecb4 is described below
commit 937ecb43b7fac4fda5fe104961085660aac1553c
Author: Xiaohui Sun <[email protected]>
AuthorDate: Fri Apr 19 14:34:36 2019 -0700
Add upper lower bounds (#4147)
* [TE] Add upper/lower bounds into TimeSeries
* [TE] Add test for upper/lower bounds
* [TE] Add current value into TimeSeries
---
.../thirdeye/dataframe/util/DataFrameUtils.java | 3 ++
.../thirdeye/detection/spi/model/TimeSeries.java | 48 +++++++++++++++++-----
.../wrapper/BaselineFillingMergeWrapperTest.java | 17 +++++++-
3 files changed, 56 insertions(+), 12 deletions(-)
diff --git
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dataframe/util/DataFrameUtils.java
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dataframe/util/DataFrameUtils.java
index a96730a..3a66a79 100644
---
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dataframe/util/DataFrameUtils.java
+++
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dataframe/util/DataFrameUtils.java
@@ -62,6 +62,9 @@ import org.joda.time.PeriodType;
public class DataFrameUtils {
public static final String COL_TIME = "timestamp";
public static final String COL_VALUE = "value";
+ public static final String COL_CURRENT = "current";
+ public static final String COL_UPPER_BOUND = "upper_bound";
+ public static final String COL_LOWER_BOUND = "lower_bound";
/**
* Returns a Thirdeye response parsed as a DataFrame. The method stores the
time values in
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 a32c693..755b880 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
@@ -37,33 +37,61 @@ public class TimeSeries {
this.df = new DataFrame();
}
- /**
- * Add the time stamps into the timeseries
- * @param timestamps
- */
- public void addTimeStamps(LongSeries timestamps) {
+ public TimeSeries(LongSeries timestamps, DoubleSeries baselineValues) {
this.df.addSeries(COL_TIME, timestamps).setIndex(COL_TIME);
+ this.df.addSeries(DataFrameUtils.COL_VALUE, baselineValues);
+ }
+
+ public TimeSeries(LongSeries timestamps, DoubleSeries baselineValues,
DoubleSeries currentValues,
+ DoubleSeries upperBoundValues, DoubleSeries lowerBoundValues) {
+ this(timestamps, baselineValues);
+ this.df.addSeries(DataFrameUtils.COL_CURRENT, currentValues);
+ this.df.addSeries(DataFrameUtils.COL_UPPER_BOUND, upperBoundValues);
+ this.df.addSeries(DataFrameUtils.COL_LOWER_BOUND, lowerBoundValues);
}
/**
- * Add the predicted baseline into the timeseries
- * @param baselineValues predicted baseline values
+ * Add the series into TimeSeries if it exists in the DataFrame.
+ * @param df The source DataFrame.
+ * @param name The series name.
*/
- public void addPredictedBaseline(DoubleSeries baselineValues) {
- this.df.addSeries(DataFrameUtils.COL_VALUE, baselineValues);
+ private static void addSeries(TimeSeries ts, DataFrame df, String name) {
+ if (df.contains(name)) {
+ ts.df.addSeries(name, df.get(name));
+ }
}
+ /**
+ * Add DataFrame into TimeSeries.
+ * @param df The source DataFrame.
+ * @return TimeSeries that contains the predicted values.
+ */
public static TimeSeries fromDataFrame(DataFrame df) {
TimeSeries ts = new TimeSeries();
ts.df.addSeries(COL_TIME, df.get(COL_TIME)).setIndex(COL_TIME);
- ts.df.addSeries(DataFrameUtils.COL_VALUE,
df.get(DataFrameUtils.COL_VALUE));
+ addSeries(ts, df, COL_VALUE);
+ addSeries(ts, df, COL_CURRENT);
+ addSeries(ts, df, COL_UPPER_BOUND);
+ addSeries(ts, df, COL_LOWER_BOUND);
return ts;
}
+ public DoubleSeries getCurrent() {
+ return this.df.getDoubles(DataFrameUtils.COL_CURRENT);
+ }
+
public DoubleSeries getPredictedBaseline() {
return this.df.getDoubles(DataFrameUtils.COL_VALUE);
}
+ public DoubleSeries getPredictedUpperBound() {
+ return this.df.getDoubles(DataFrameUtils.COL_UPPER_BOUND);
+ }
+
+ public DoubleSeries getPredictedLowerBound() {
+ return this.df.getDoubles(DataFrameUtils.COL_LOWER_BOUND);
+ }
+
public DataFrame getDataFrame() {
return df;
}
diff --git
a/thirdeye/thirdeye-pinot/src/test/java/org/apache/pinot/thirdeye/detection/wrapper/BaselineFillingMergeWrapperTest.java
b/thirdeye/thirdeye-pinot/src/test/java/org/apache/pinot/thirdeye/detection/wrapper/BaselineFillingMergeWrapperTest.java
index 0b4c0d8..05801cb 100644
---
a/thirdeye/thirdeye-pinot/src/test/java/org/apache/pinot/thirdeye/detection/wrapper/BaselineFillingMergeWrapperTest.java
+++
b/thirdeye/thirdeye-pinot/src/test/java/org/apache/pinot/thirdeye/detection/wrapper/BaselineFillingMergeWrapperTest.java
@@ -125,7 +125,8 @@ public class BaselineFillingMergeWrapperTest {
MockBaselineProviderSpec spec = new MockBaselineProviderSpec();
spec.setBaselineAggregates(ImmutableMap.of(MetricSlice.from(1, 3000,
3600), 100.0));
spec.setBaselineTimeseries(ImmutableMap.of(MetricSlice.from(1, 3000,
3600), TimeSeries.fromDataFrame(
- DataFrame.builder(COL_TIME + ":LONG", COL_VALUE +
":DOUBLE").append(3000, 100).build())));
+ DataFrame.builder(COL_TIME + ":LONG", COL_VALUE + ":DOUBLE" ,
COL_UPPER_BOUND + ":DOUBLE", COL_LOWER_BOUND + ":DOUBLE")
+ .append(3000, 100, 200, 50).build())));
InputDataFetcher dataFetcher = new DefaultInputDataFetcher(provider,
this.config.getId());
baselineProvider.init(spec, dataFetcher);
this.config.setComponents(ImmutableMap.of("baseline", baselineProvider));
@@ -138,9 +139,15 @@ public class BaselineFillingMergeWrapperTest {
Assert.assertEquals(anomalyResults.size(), 1);
Assert.assertTrue(anomalyResults.contains(anomaly));
Assert.assertEquals(anomalyResults.get(0).getAvgBaselineVal(), 100.0);
+ Assert.assertEquals(anomalyResults.get(0).getAvgBaselineVal(), 100.0);
Assert.assertEquals(anomalyResults.get(0).getAvgCurrentVal(), 100.0);
Assert.assertEquals(anomalyResults.get(0).getProperties().get("detectorComponentName"),
"testDetector");
Assert.assertEquals(anomalyResults.get(0).getProperties().get("baselineProviderComponentName"),
"baseline");
+
+ TimeSeries ts =
baselineProvider.computePredictedTimeSeries(MetricSlice.from(1, 3000, 3600));
+ Assert.assertEquals(ts.getPredictedBaseline().get(0), 100.0);
+ Assert.assertEquals(ts.getPredictedUpperBound().get(0), 200.0);
+ Assert.assertEquals(ts.getPredictedLowerBound().get(0), 50.0);
}
@Test
@@ -165,7 +172,8 @@ public class BaselineFillingMergeWrapperTest {
MockBaselineProviderSpec spec = new MockBaselineProviderSpec();
spec.setBaselineAggregates(ImmutableMap.of(MetricSlice.from(1, 3000,
3600), 100.0));
spec.setBaselineTimeseries(ImmutableMap.of(MetricSlice.from(1, 3000,
3600), TimeSeries.fromDataFrame(
- DataFrame.builder(COL_TIME + ":LONG", COL_VALUE +
":DOUBLE").append(3000, 100).build())));
+ DataFrame.builder(COL_TIME + ":LONG", COL_VALUE + ":DOUBLE",
COL_UPPER_BOUND + ":DOUBLE", COL_LOWER_BOUND + ":DOUBLE")
+ .append(3000, 100, 200, 50).build())));
InputDataFetcher dataFetcher = new DefaultInputDataFetcher(provider,
this.config.getId());
baselineProvider.init(spec, dataFetcher);
this.config.setComponents(ImmutableMap.of("baseline", baselineProvider));
@@ -179,5 +187,10 @@ public class BaselineFillingMergeWrapperTest {
Assert.assertEquals(anomalyResults.get(0).getAvgCurrentVal(), 999.0);
Assert.assertEquals(anomalyResults.get(0).getProperties().get("detectorComponentName"),
"testDetector");
Assert.assertEquals(anomalyResults.get(0).getProperties().get("baselineProviderComponentName"),
"someBaseline");
+
+ TimeSeries ts =
baselineProvider.computePredictedTimeSeries(MetricSlice.from(1, 3000, 3600));
+ Assert.assertEquals(ts.getPredictedBaseline().get(0), 100.0);
+ Assert.assertEquals(ts.getPredictedUpperBound().get(0), 200.0);
+ Assert.assertEquals(ts.getPredictedLowerBound().get(0), 50.0);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]