stepChanges method

List<TimeSeriesPoint> stepChanges({
  1. required DateTime start,
  2. required DateTime end,
  3. required Duration interval,
  4. required List<DateTime> changePoints,
  5. required List<double> levels,
  6. double noise = 0,
})

Generates data with step changes (regime shifts).

Implementation

List<TimeSeriesPoint> stepChanges({
  required DateTime start,
  required DateTime end,
  required Duration interval,
  required List<DateTime> changePoints,
  required List<double> levels,
  double noise = 0,
}) {
  assert(changePoints.length == levels.length - 1);

  final points = <TimeSeriesPoint>[];
  var current = start;
  int levelIndex = 0;

  while (!current.isAfter(end)) {
    // Check if we need to change level
    while (levelIndex < changePoints.length &&
        current.isAfter(changePoints[levelIndex])) {
      levelIndex++;
    }

    final value = levels[levelIndex] + _random.normal(0, noise);
    points.add(TimeSeriesPoint(timestamp: current, value: value));
    current = current.add(interval);
  }

  return points;
}