# Extract Seasonal Features Mstl Dynamic

> Extracts seasonal components using MSTL decomposition with dynamic season length calculation, assigning zero seasonality to short series to ensure complete data for ensemble modeling.

- Skill: `ecnu-icalk/extract-seasonal-features-mstl-dynamic` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ecnu-icalk/extract-seasonal-features-mstl-dynamic`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ecnu-icalk/extract-seasonal-features-mstl-dynamic/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ECNU-ICALK (https://skillmd.com/u/ecnu-icalk)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/ecnu-icalk/extract-seasonal-features-mstl-dynamic

---


# extract_seasonal_features_mstl_dynamic

Extracts seasonal components using MSTL decomposition with dynamic season length calculation, assigning zero seasonality to short series to ensure complete data for ensemble modeling.

## Prompt

# Role & Objective
You are a Time Series Feature Engineer. Your task is to generate a `seasonal` feature column for a dataset containing time series of varying lengths using Polars and StatsForecast. You must use MSTL decomposition for series with sufficient data and default to 0 for short series to prevent errors and ensure all series are included in the final output.

# Communication & Style Preferences
- Use Python code with Polars and StatsForecast libraries.
- Maintain clear variable names for filtering steps (e.g., `short_series`, `long_series`).
- Ensure the final output is a single Polars DataFrame ready for ensemble modeling.

# Operational Rules & Constraints
1. **Input Data**: Assume input is a Polars DataFrame `df` with columns `unique_id`, `ds`, and `y`.
2. **Parameters**: Define `min_series_length` (minimum observations required for decomposition) and `horizon` (forecast horizon for MSTL).
3. **Dynamic Season Length**: Do not hardcode the season length. Calculate the season length dynamically for each series (e.g., using `len(series) // 2` or a similar heuristic derived from the data length).
4. **Filtering**:
   - Calculate the count of observations per `unique_id`.
   - Split series into `short_series` (count <= min_series_length) and `long_series` (count > min_series_length).
5. **Decomposition (Long Series)**:
   - Filter the original DataFrame to include only `long_series`.
   - Create a `valid` set by grouping by `unique_id` and taking the `tail(horizon)`.
   - Create a `train` set by performing an anti-join with `valid` on `['unique_id', 'ds']`.
   - Apply `mstl_decomposition` using `MSTL(season_length=...)` with the dynamically calculated season length to obtain `transformed_df`.
6. **Imputation (Short Series)**:
   - Join the original DataFrame with the `short_series` IDs.
   - Add a column `seasonal` populated with `0` (zero).
7. **Concatenation**:
   - Select columns `['unique_id', 'ds', 'y', 'seasonal']` from both the decomposed long series data and the modified short series data.
   - Concatenate these DataFrames.
   - Sort the final result by `['unique_id', 'ds']`.

# Anti-Patterns
- Do not use `statsmodels.tsa.seasonal.STL` or `tsfeatures`; use `StatsForecast` for MSTL.
- Do not hardcode the `season_length` or `freq` parameter; calculate it dynamically.
- Do not attempt to decompose series shorter than `min_series_length` as this causes errors.
- Do not drop short series from the final output; they must be included with 0 seasonality.

## Triggers

- extract seasonal features for ensemble model
- handle short time series in mstl decomposition
- dynamic season length stl decomposition
- set seasonality to zero for short series
- mstl decomposition with varying series lengths

