@Override public void sort() { timeSeries.sort(); }
/** * Sets the start and end end based on the */ private void setStartAndEnd() { //When the time stamps are empty we do not set the start and end //An aggregation or analysis response does not have a data field per default. if (!timestamps.isEmpty()) { sort(); start = timestamps.get(0); end = timestamps.get(size() - 1); } }
/** * Gets the first value in the time series. * It first orders the time series. * * @param timeSeriesList list with time series * @return the average or 0 if the list is empty */ @Override public void execute(List<ChronixTimeSeries<MetricTimeSeries>> timeSeriesList, FunctionCtx functionCtx) { for (ChronixTimeSeries<MetricTimeSeries> chronixTimeSeries : timeSeriesList) { MetricTimeSeries timeSeries = chronixTimeSeries.getRawTimeSeries(); //If it is empty, we return NaN if (timeSeries.isEmpty()) { functionCtx.add(this, Double.NaN, chronixTimeSeries.getJoinKey()); continue; } //we need to sort the time series timeSeries.sort(); functionCtx.add(this, timeSeries.getValue(0), chronixTimeSeries.getJoinKey()); } }
/** * Calculate the difference between the first and the last value of a given time series * * @param timeSeriesList list with time series * @return the average or 0 if the list is empty */ @Override public void execute(List<ChronixTimeSeries<MetricTimeSeries>> timeSeriesList, FunctionCtx functionCtx) { for (ChronixTimeSeries<MetricTimeSeries> chronixTimeSeries : timeSeriesList) { MetricTimeSeries timeSeries = chronixTimeSeries.getRawTimeSeries(); //If it is empty, we return NaN if (timeSeries.size() <= 0) { functionCtx.add(this, Double.NaN, chronixTimeSeries.getJoinKey()); continue; } //we need to sort the time series timeSeries.sort(); //get the first and the last value double firstValue = timeSeries.getValue(0); double lastValue = timeSeries.getValue(timeSeries.size() - 1); functionCtx.add(this, Math.abs(firstValue - lastValue), chronixTimeSeries.getJoinKey()); } }
/** * Detects trends in time series using a linear regression. * * @param functionCtx * @return 1 if there is a positive trend, otherwise -1 */ @Override public void execute(List<ChronixTimeSeries<MetricTimeSeries>> timeSeriesList, FunctionCtx functionCtx) { for (ChronixTimeSeries<MetricTimeSeries> chronixTimeSeries : timeSeriesList) { MetricTimeSeries timeSeries = chronixTimeSeries.getRawTimeSeries(); //We need to sort the time series for this analysis timeSeries.sort(); //Calculate the linear regression LinearRegression linearRegression = new LinearRegression(timeSeries.getTimestamps(), timeSeries.getValues()); double slope = linearRegression.slope(); //If we have a positive slope, we return 1 otherwise -1 functionCtx.add(this, slope > 0, chronixTimeSeries.getJoinKey()); } }
timeSeries.sort();
timeSeries.sort();
/** * Gets the last value in the time series. * It first orders the time series. * * @param timeSeriesList list with time series * @return the average or 0 if the list is empty */ @Override public void execute(List<ChronixTimeSeries<MetricTimeSeries>> timeSeriesList, FunctionCtx functionCtx) { for (ChronixTimeSeries<MetricTimeSeries> chronixTimeSeries : timeSeriesList) { MetricTimeSeries timeSeries = chronixTimeSeries.getRawTimeSeries(); //If it is empty, we return NaN if (timeSeries.size() <= 0) { functionCtx.add(this, Double.NaN, chronixTimeSeries.getJoinKey()); continue; } //We need to sort the time series timeSeries.sort(); functionCtx.add(this, timeSeries.getValue(timeSeries.size() - 1), chronixTimeSeries.getJoinKey()); } }
/** * Calculates the derivative of the time series * * @param timeSeries the time series that is transformed */ @Override public void execute(List<ChronixTimeSeries<MetricTimeSeries>> timeSeriesList, FunctionCtx functionCtx) { for (ChronixTimeSeries<MetricTimeSeries> chronixTimeSeries : timeSeriesList) { MetricTimeSeries timeSeries = chronixTimeSeries.getRawTimeSeries(); //we need a sorted time series timeSeries.sort(); long[] times = timeSeries.getTimestampsAsArray(); double[] values = timeSeries.getValuesAsArray(); //Clear the time series timeSeries.clear(); for (int i = 1; i < values.length - 1; i++) { long yT1 = times[i + 1]; long yT0 = times[i - 1]; double xT1 = values[i + 1]; double xT0 = values[i - 1]; double derivativeValue = DerivativeUtil.derivative(xT1, xT0, yT1, yT0); if (derivativeValue >= 0) { //We use the average time of long derivativeTime = yT1 + (yT1 - yT0) / 2; timeSeries.add(derivativeTime, derivativeValue); } } functionCtx.add(this, chronixTimeSeries.getJoinKey()); } }
/** * Calculates the derivative of the values per second. * Returns a time series holding that values. * * @param timeSeries the time series that is transformed */ @Override public void execute(List<ChronixTimeSeries<MetricTimeSeries>> timeSeriesList, FunctionCtx functionCtx) { for (ChronixTimeSeries<MetricTimeSeries> chronixTimeSeries : timeSeriesList) { MetricTimeSeries timeSeries = chronixTimeSeries.getRawTimeSeries(); //we need a sorted time series timeSeries.sort(); long[] times = timeSeries.getTimestampsAsArray(); double[] values = timeSeries.getValuesAsArray(); //Clear the time series timeSeries.clear(); for (int i = 1; i < values.length - 1; i++) { long yT1 = times[i + 1]; long yT0 = times[i - 1]; double xT1 = values[i + 1]; double xT0 = values[i - 1]; double derivativeValue = DerivativeUtil.derivative(xT1, xT0, yT1, yT0); //We use the average time of long derivativeTime = yT1 + (yT1 - yT0) / 2; timeSeries.add(derivativeTime, derivativeValue); } functionCtx.add(this, chronixTimeSeries.getJoinKey()); } }
timeSeries.sort();
timeSeries.sort();
timeSeries.sort();
timeSeries.sort();