com.yahoo.egads.models.adm.SimpleThresholdModel.java Source code

Java tutorial

Introduction

Here is the source code for com.yahoo.egads.models.adm.SimpleThresholdModel.java

Source

/*
 * Copyright 2015, Yahoo Inc.
 * Copyrights licensed under the GPL License.
 * See the accompanying LICENSE file for terms.
 */

// A simple thresholding model that returns an anomaly if it is above/below a certain threashold.

package com.yahoo.egads.models.adm;

import java.util.Properties;

import com.yahoo.egads.data.Anomaly.IntervalSequence;
import com.yahoo.egads.data.Anomaly.Interval;
import com.yahoo.egads.data.TimeSeries;
import com.yahoo.egads.data.TimeSeries.DataSequence;
import com.yahoo.egads.utilities.AutoSensitivity;
import java.util.Map;
import java.util.HashMap;

import org.json.JSONObject;
import org.json.JSONStringer;

public class SimpleThresholdModel extends AnomalyDetectionAbstractModel {

    // The constructor takes a set of properties
    // needed for the simple model. This includes the sensitivity.
    private Map<String, Float> threshold;
    private int maxHrsAgo;

    // Model name.
    private String modelName = "SimpleThresholdModel";
    private String simpleThrType = "AdaptiveKSigmaSensitivity";

    public SimpleThresholdModel(Properties config) {
        super(config);

        this.threshold = parseMap(config.getProperty("THRESHOLD"));
        this.maxHrsAgo = new Integer(config.getProperty("MAX_ANOMALY_TIME_AGO"));
        if (config.getProperty("THRESHOLD") != null && this.threshold.isEmpty() == true) {
            throw new IllegalArgumentException("THRESHOLD PARSE ERROR");
        }
        if (config.getProperty("SIMPLE_THRESHOLD_TYPE") != null) {
            simpleThrType = config.getProperty("SIMPLE_THRESHOLD_TYPE");
        }
    }

    public void toJson(JSONStringer json_out) {

    }

    public void fromJson(JSONObject json_obj) {

    }

    @Override
    public String getType() {
        return "point_outlier";
    }

    public String getModelName() {
        return modelName;
    }

    @Override
    public void reset() {
    }

    @Override
    public void tune(DataSequence observedSeries, DataSequence expectedSeries, IntervalSequence anomalySequence)
            throws Exception {
        Float thr[] = null;
        if (simpleThrType.equals("AdaptiveKSigmaSensitivity")) {
            thr = AutoSensitivity.getAdaptiveKSigmaSensitivity(observedSeries.getValues(), amntAutoSensitivity);
        } else {
            thr = AutoSensitivity.getAdaptiveMaxMinSigmaSensitivity(observedSeries.getValues(), amntAutoSensitivity,
                    sDAutoSensitivity);
        }
        if (!threshold.containsKey("max")) {
            threshold.put("max", thr[0]);
        }
        if (!threshold.containsKey("min")) {
            threshold.put("min", thr[1]);
        }
    }

    @Override
    public IntervalSequence detect(DataSequence observedSeries, DataSequence expectedSeries) throws Exception {
        IntervalSequence output = new IntervalSequence();
        Float[] thr = new Float[] { threshold.get("max"), threshold.get("min") };
        long unixTime = System.currentTimeMillis() / 1000L;
        int n = observedSeries.size();
        for (int i = 0; i < n; i++) {
            TimeSeries.Entry entry = observedSeries.get(i);

            if (((thr[0] != null && entry.value >= thr[0]) || (thr[1] != null && entry.value <= thr[1]))
                    && ((((unixTime - entry.time) / 3600) < maxHrsAgo) || (maxHrsAgo == 0 && i == (n - 1)))) {
                if (thr[0] != null && entry.value >= thr[0]) {
                    output.add(new Interval(entry.time, i, null, thr, entry.value, thr[0]));
                } else {
                    output.add(new Interval(entry.time, i, null, thr, entry.value, thr[1]));
                }
            }
        }

        return output;
    }
}