seasonal method
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;
}