Skip to content

How to Handle Short Series

This guide shows you how to handle series that are too short to estimate seasonal patterns, run temporal cross-validation, or calibrate conformal intervals.

Prerequisites

Try it interactively

How to Handle Short Series

Use Fourier seasonality, simple train/test splits, and panel pooling when individual series are too short for standard approaches.

ViewOpen in marimo

Choose a Fallback

Limitation Recommended fallback
Fewer than 2-3 seasonal cycles Fourier terms instead of pattern decomposition
Too few observations for multi-split CV Minimal two-split evaluation
Individual series short, many series available Global panel pooling
Training period shorter than one cycle Scale-independent metrics (MAPE, sMAPE)

When is a series 'short'?

Shortness is relative to the task: seasonal estimation needs 2-3 complete cycles, temporal CV needs roughly 5x the forecast horizon, and scaled metrics (MASE, RMSSE) need at least one full seasonal cycle for the baseline denominator.

Use Fourier Terms for Seasonality

When you have fewer than 2-3 complete seasonal cycles, FourierSeasonalityForecaster is more reliable than pattern-based decomposition. Fourier terms fit smooth harmonic functions that need less data to converge than estimating a full seasonal shape:

from yohou.stationarity.seasonality import FourierSeasonalityForecaster

forecaster = FourierSeasonalityForecaster(seasonality=7, harmonics=[1, 2])

Start with a low harmonics order (1 or 2) to avoid overfitting on limited data.

Reduce Cross-Validation Splits

When the series is too short for multi-split CV, use the minimum split count. ExpandingWindowSplitter requires at least two splits. This gives up the variance estimate that more splits provide but avoids creating splits where the training set is too small:

from yohou.model_selection import ExpandingWindowSplitter

splitter = ExpandingWindowSplitter(n_splits=2, test_size=6)

If even two splits exhaust the training data, reduce test_size or evaluate on the final holdout only by slicing the data manually.

Pool Short Series with panel_strategy="global"

In panel data scenarios where individual series are short but the aggregate dataset is large, pooling information across groups can compensate. The global panel strategy trains a single regressor on all series simultaneously:

from yohou.point import PointReductionForecaster
from sklearn.ensemble import GradientBoostingRegressor

forecaster = PointReductionForecaster(
    estimator=GradientBoostingRegressor(),
    panel_strategy="global",
)

The global strategy is appropriate when series share a common underlying pattern. If series are structurally different, the shared regressor may perform worse than individual models. See Work with Panel Data for the other panel strategies.

Switch to Scale-Independent Metrics

MASE and RMSSE scale errors by the in-sample naive forecast error. If the training period is shorter than one seasonal cycle, the denominator cannot be computed. Use MeanAbsolutePercentageError (when zero values are not present) or SymmetricMeanAbsolutePercentageError as alternatives:

from yohou.metrics import MeanAbsolutePercentageError

scorer = MeanAbsolutePercentageError()

See Also

  • Handle Long Series for the opposite problem: when history is so large that computation or stale data becomes an issue.
  • Model Selection for the theory of temporal cross-validation and why standard k-fold is invalid for time series.
  • Handle Complex Seasonality for multi-period seasonal patterns.