seasonal method

List<TimeSeriesPoint> seasonal({
  1. required DateTime start,
  2. required DateTime end,
  3. required Duration interval,
  4. double baseValue = 100,
  5. double trend = 0,
  6. List<double>? dailyPattern,
  7. List<double>? weeklyPattern,
  8. List<double>? monthlyPattern,
  9. double noise = 0,
})

Generates data with seasonal patterns.

Implementation

List<TimeSeriesPoint> seasonal({
  required DateTime start,
  required DateTime end,
  required Duration interval,
  double baseValue = 100,
  double trend = 0,
  List<double>? dailyPattern,
  List<double>? weeklyPattern,
  List<double>? monthlyPattern,
  double noise = 0,
}) {
  final points = <TimeSeriesPoint>[];
  var current = start;
  int step = 0;

  // Default patterns
  final daily = dailyPattern ??
      [
        0.8,
        0.7,
        0.6,
        0.5,
        0.5,
        0.6,
        0.8,
        1.0,
        1.2,
        1.3,
        1.2,
        1.1,
        1.2,
        1.3,
        1.2,
        1.1,
        1.0,
        0.9,
        1.0,
        1.1,
        1.0,
        0.9,
        0.9,
        0.8
      ];

  final weekly = weeklyPattern ?? [1.0, 1.1, 1.1, 1.0, 0.9, 0.8, 0.7];

  final monthly = monthlyPattern ??
      [0.9, 0.85, 0.9, 0.95, 1.0, 1.1, 1.15, 1.1, 1.0, 0.95, 1.0, 1.1];

  while (!current.isAfter(end)) {
    final hourFactor = daily[current.hour % 24];
    final dayFactor = weekly[current.weekday - 1];
    final monthFactor = monthly[current.month - 1];

    final value =
        (baseValue + trend * step) * hourFactor * dayFactor * monthFactor +
            _random.normal(0, noise);

    points.add(TimeSeriesPoint(timestamp: current, value: value));
    current = current.add(interval);
    step++;
  }

  return points;
}