%23%20%2F%2F%2F%20script%0A%23%20requires-python%20%3D%20%22%3E%3D3.11%22%0A%23%20dependencies%20%3D%20%5B%0A%23%20%20%20%20%20%22scikit-learn%22%2C%0A%23%20%20%20%20%20%22yohou%5Bplotting%5D%22%2C%0A%23%20%5D%0A%23%20%2F%2F%2F%0A%0Aimport%20marimo%0A%0A__generated_with%20%3D%20%220.23.8%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20LocalPanelForecaster%0A%0A%20%20%20%20%5B%60LocalPanelForecaster%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.compose.local_panel_forecaster.LocalPanelForecaster%2F)%20wraps%20any%20forecaster%20and%20fits%20**completely%0A%20%20%20%20independent%20clones**%20per%20panel%20group%20via%20%60sklearn.base.clone()%60.%0A%20%20%20%20Each%20clone%20sees%20standard%20(non-panel)%20data%20with%20group%20prefixes%20stripped%2C%0A%20%20%20%20and%20predictions%20are%20reassembled%20back%20into%20prefixed-column%20format.%0A%0A%20%20%20%20%23%23%201.%20Prepare%20Panel%20Data%0A%0A%20%20%20%20Australian%20Tourism%3A%20quarterly%20trips%20for%208%20series.%20%20Each%20series%20is%20a%0A%20%20%20%20panel%20group%20with%20the%20%60__%60%20separator%20(e.g.%20%60T3__tourists%60).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20from%20copy%20import%20deepcopy%0A%0A%20%20%20%20from%20sklearn.linear_model%20import%20Ridge%0A%0A%20%20%20%20from%20yohou.compose%20import%20LocalPanelForecaster%0A%20%20%20%20from%20yohou.datasets%20import%20fetch_tourism_quarterly%0A%20%20%20%20from%20yohou.metrics%20import%20MeanAbsoluteError%0A%20%20%20%20from%20yohou.model_selection%20import%20train_test_split%0A%20%20%20%20from%20yohou.plotting%20import%20(%0A%20%20%20%20%20%20%20%20plot_forecast%2C%0A%20%20%20%20%20%20%20%20plot_score_per_vintage%2C%0A%20%20%20%20%20%20%20%20plot_score_time_series%2C%0A%20%20%20%20%20%20%20%20plot_time_series%2C%0A%20%20%20%20)%0A%20%20%20%20from%20yohou.point%20import%20PointReductionForecaster%2C%20SeasonalNaive%0A%20%20%20%20from%20yohou.preprocessing%20import%20LagTransformer%0A%20%20%20%20from%20yohou.utils.panel%20import%20inspect_panel%0A%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20LagTransformer%2C%0A%20%20%20%20%20%20%20%20LocalPanelForecaster%2C%0A%20%20%20%20%20%20%20%20MeanAbsoluteError%2C%0A%20%20%20%20%20%20%20%20PointReductionForecaster%2C%0A%20%20%20%20%20%20%20%20Ridge%2C%0A%20%20%20%20%20%20%20%20SeasonalNaive%2C%0A%20%20%20%20%20%20%20%20deepcopy%2C%0A%20%20%20%20%20%20%20%20fetch_tourism_quarterly%2C%0A%20%20%20%20%20%20%20%20inspect_panel%2C%0A%20%20%20%20%20%20%20%20plot_forecast%2C%0A%20%20%20%20%20%20%20%20plot_score_per_vintage%2C%0A%20%20%20%20%20%20%20%20plot_score_time_series%2C%0A%20%20%20%20%20%20%20%20plot_time_series%2C%0A%20%20%20%20%20%20%20%20train_test_split%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(fetch_tourism_quarterly%2C%20inspect_panel%2C%20mo%2C%20train_test_split)%3A%0A%20%20%20%20_tourism_full%20%3D%20fetch_tourism_quarterly().frame%0A%20%20%20%20%23%20Select%20T3-T10%20(same%20length%2C%2088%20rows%20after%20drop_nulls)%0A%20%20%20%20_tourist_cols%20%3D%20%5Bf%22T%7Bi%7D__tourists%22%20for%20i%20in%20range(3%2C%2011)%5D%0A%20%20%20%20tourism%20%3D%20_tourism_full.select(%22time%22%2C%20*_tourist_cols).drop_nulls()%0A%20%20%20%20_globals%2C%20groups%20%3D%20inspect_panel(tourism)%0A%20%20%20%20y%20%3D%20tourism.select(%22time%22%2C%20*%5Bc%20for%20c%20in%20tourism.columns%20if%20c.endswith(%22__tourists%22)%5D)%0A%0A%20%20%20%20y_train%2C%20y_test%20%3D%20train_test_split(y%2C%20test_size%3D0.2)%0A%20%20%20%20horizon%20%3D%20len(y_test)%0A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22**Panel%20groups**%3A%20%7Bsorted(groups.keys())%7D%5Cn%5Cn%22%0A%20%20%20%20%20%20%20%20f%22**Train**%3A%20%7Blen(y_train)%7D%20quarters%20%7C%20**Test**%3A%20%7Blen(y_test)%7D%20quarters%20%7C%20%22%0A%20%20%20%20%20%20%20%20f%22**Horizon**%3A%20%7Bhorizon%7D%22%0A%20%20%20%20)%0A%20%20%20%20return%20horizon%2C%20y%2C%20y_test%2C%20y_train%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%5B%60plot_time_series%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.plotting.exploration.plot_time_series%2F)%20shows%20all%208%20quarterly%20tourism%20series%0A%20%20%20%20before%20splitting%20into%20training%20and%20test%20sets.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(plot_time_series%2C%20y)%3A%0A%20%20%20%20plot_time_series(y%2C%20title%3D%22Tourism%20Quarterly%3A%20Quarterly%20Tourists%20by%20Series%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%202.%20Basic%20Usage%0A%0A%20%20%20%20Wrap%20a%20forecaster%20in%20%5B%60LocalPanelForecaster%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.compose.local_panel_forecaster.LocalPanelForecaster%2F).%20%20Each%20panel%20group%20gets%20a%0A%20%20%20%20fresh%20%60clone()%60%20that%20is%20fitted%20independently%20on%20that%20group's%20data.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20LagTransformer%2C%0A%20%20%20%20LocalPanelForecaster%2C%0A%20%20%20%20PointReductionForecaster%2C%0A%20%20%20%20Ridge%2C%0A%20%20%20%20horizon%2C%0A%20%20%20%20y_train%2C%0A)%3A%0A%20%20%20%20fc_local%20%3D%20LocalPanelForecaster(%0A%20%20%20%20%20%20%20%20forecaster%3DPointReductionForecaster(%0A%20%20%20%20%20%20%20%20%20%20%20%20estimator%3DRidge(alpha%3D1.0)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20feature_transformer%3DLagTransformer(lag%3D%5B1%2C%202%2C%204%5D)%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20)%0A%20%20%20%20fc_local.fit(y_train%2C%20forecasting_horizon%3Dhorizon)%0A%20%20%20%20y_pred_local%20%3D%20fc_local.predict(forecasting_horizon%3Dhorizon)%0A%20%20%20%20return%20fc_local%2C%20y_pred_local%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%5B%60plot_forecast%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.plotting.forecasting.plot_forecast%2F)%20displays%20the%20per-group%20forecasts%20produced%20by%20the%0A%20%20%20%20%5B%60LocalPanelForecaster%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.compose.local_panel_forecaster.LocalPanelForecaster%2F).%20Each%20group%20has%20its%20own%20independently%20fitted%20model.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(plot_forecast%2C%20y_pred_local%2C%20y_test%2C%20y_train)%3A%0A%20%20%20%20plot_forecast(%0A%20%20%20%20%20%20%20%20y_test%2C%0A%20%20%20%20%20%20%20%20y_pred_local%2C%0A%20%20%20%20%20%20%20%20y_train%3Dy_train%2C%0A%20%20%20%20%20%20%20%20n_history%3D12%2C%0A%20%20%20%20%20%20%20%20groups%3D%5B%22T3%22%2C%20%22T4%22%2C%20%22T5%22%5D%2C%0A%20%20%20%20%20%20%20%20title%3D%22LocalPanelForecaster%3A%20Top%203%20Series%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%203.%20Accessing%20Per-Group%20Clones%0A%0A%20%20%20%20After%20fitting%2C%20%60forecasters_%60%20holds%20a%20dict%20mapping%20group%20names%20to%0A%20%20%20%20their%20fitted%20clones.%20%20You%20can%20inspect%20individual%20models.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(fc_local%2C%20mo)%3A%0A%20%20%20%20_rows%20%3D%20%5B%5D%0A%20%20%20%20for%20_name%2C%20_fc%20in%20sorted(fc_local.forecasters_.items())%3A%0A%20%20%20%20%20%20%20%20_coefs%20%3D%20_fc.estimator_.coef_%0A%20%20%20%20%20%20%20%20_rows.append(f%22-%20**%7B_name%7D**%3A%20%7Blen(_coefs)%7D%20coefficients%22)%0A%0A%20%20%20%20mo.md(f%22**Fitted%20clones**%20(%7Blen(fc_local.forecasters_)%7D)%3A%5Cn%5Cn%22%20%2B%20%22%5Cn%22.join(_rows))%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%204.%20Selective%20Group%20Operations%0A%0A%20%20%20%20Use%20%60groups%60%20to%20predict%2C%20observe%2C%20or%20rewind%20only%20a%20subset%0A%20%20%20%20of%20groups.%20%20This%20is%20useful%20when%20new%20data%20arrives%20for%20specific%20groups%0A%20%20%20%20or%20you%20want%20group-specific%20analysis.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(fc_local%2C%20horizon%2C%20mo)%3A%0A%20%20%20%20y_pred_top3%20%3D%20fc_local.predict(%0A%20%20%20%20%20%20%20%20forecasting_horizon%3Dhorizon%2C%0A%20%20%20%20%20%20%20%20groups%3D%5B%22T3%22%2C%20%22T4%22%2C%20%22T5%22%5D%2C%0A%20%20%20%20)%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22**Selective%20prediction%20columns**%3A%20%7Bsorted(y_pred_top3.columns)%7D%5Cn%5Cn%22%0A%20%20%20%20%20%20%20%20%22Only%20the%20requested%20groups%20are%20predicted%3B%20others%20are%20omitted.%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%205.%20Observe-Predict%20Workflow%0A%0A%20%20%20%20%5B%60LocalPanelForecaster%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.compose.local_panel_forecaster.LocalPanelForecaster%2F)%20supports%20the%20observe-predict%20cycle%20for%0A%20%20%20%20rolling%20evaluation.%20%20New%20observations%20update%20only%20the%20specified%0A%20%20%20%20groups'%20clones.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(fc_local%2C%20mo%2C%20y_test)%3A%0A%20%20%20%20_half%20%3D%20len(y_test)%20%2F%2F%202%0A%20%20%20%20_y_first_half%20%3D%20y_test.head(_half)%0A%20%20%20%20_y_second_half%20%3D%20y_test.tail(len(y_test)%20-%20_half)%0A%0A%20%20%20%20fc_local.observe(_y_first_half)%0A%20%20%20%20y_pred_updated%20%3D%20fc_local.predict(forecasting_horizon%3Dlen(_y_second_half))%0A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22Observed%20%7B_half%7D%20new%20rows%20%E2%86%92%20predicted%20next%20%7Blen(_y_second_half)%7D%20steps.%5Cn%5Cn%22%0A%20%20%20%20%20%20%20%20f%22**Updated%20prediction%20columns**%3A%20%7Bsorted(c%20for%20c%20in%20y_pred_updated.columns%20if%20c%20!%3D%20'time')%7D%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%206.%20Comparison%3A%20Local%20vs%20Global%0A%0A%20%20%20%20Compare%20%5B%60LocalPanelForecaster%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.compose.local_panel_forecaster.LocalPanelForecaster%2F)%20(independent%20clones)%20against%20the%0A%20%20%20%20default%20%60panel_strategy%3D%22global%22%60%20(shared%20hyperparameters%2C%20per-group%0A%20%20%20%20transformers)%20visually%20and%20with%20per-timestep%20scoring.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20LagTransformer%2C%0A%20%20%20%20PointReductionForecaster%2C%0A%20%20%20%20Ridge%2C%0A%20%20%20%20fetch_tourism_quarterly%2C%0A%20%20%20%20horizon%2C%0A%20%20%20%20train_test_split%2C%0A)%3A%0A%20%20%20%20_tourism%20%3D%20fetch_tourism_quarterly().frame%0A%20%20%20%20_tourist_cols%20%3D%20%5Bf%22T%7Bi%7D__tourists%22%20for%20i%20in%20range(3%2C%2011)%5D%0A%20%20%20%20_y2%20%3D%20_tourism.select(%22time%22%2C%20*_tourist_cols).drop_nulls()%0A%20%20%20%20y_train2%2C%20y_test2%20%3D%20train_test_split(_y2%2C%20test_size%3D0.2)%0A%0A%20%20%20%20fc_global%20%3D%20PointReductionForecaster(%0A%20%20%20%20%20%20%20%20estimator%3DRidge(alpha%3D1.0)%2C%0A%20%20%20%20%20%20%20%20feature_transformer%3DLagTransformer(lag%3D%5B1%2C%202%2C%204%5D)%2C%0A%20%20%20%20%20%20%20%20panel_strategy%3D%22global%22%2C%0A%20%20%20%20)%0A%20%20%20%20fc_global.fit(y_train2%2C%20forecasting_horizon%3Dhorizon)%0A%20%20%20%20y_pred_global%20%3D%20fc_global.predict(forecasting_horizon%3Dhorizon)%0A%20%20%20%20return%20fc_global%2C%20y_pred_global%2C%20y_test2%2C%20y_train2%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20LagTransformer%2C%0A%20%20%20%20LocalPanelForecaster%2C%0A%20%20%20%20PointReductionForecaster%2C%0A%20%20%20%20Ridge%2C%0A%20%20%20%20horizon%2C%0A%20%20%20%20y_train2%2C%0A)%3A%0A%20%20%20%20fc_local2%20%3D%20LocalPanelForecaster(%0A%20%20%20%20%20%20%20%20forecaster%3DPointReductionForecaster(%0A%20%20%20%20%20%20%20%20%20%20%20%20estimator%3DRidge(alpha%3D1.0)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20feature_transformer%3DLagTransformer(lag%3D%5B1%2C%202%2C%204%5D)%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20)%0A%20%20%20%20fc_local2.fit(y_train2%2C%20forecasting_horizon%3Dhorizon)%0A%20%20%20%20y_pred_local2%20%3D%20fc_local2.predict(forecasting_horizon%3Dhorizon)%0A%20%20%20%20return%20(y_pred_local2%2C)%0A%0A%0A%40app.cell%0Adef%20_(plot_forecast%2C%20y_pred_global%2C%20y_pred_local2%2C%20y_test2%2C%20y_train2)%3A%0A%20%20%20%20plot_forecast(%0A%20%20%20%20%20%20%20%20y_test2%2C%0A%20%20%20%20%20%20%20%20%7B%22Global%22%3A%20y_pred_global%2C%20%22Local%22%3A%20y_pred_local2%7D%2C%0A%20%20%20%20%20%20%20%20y_train%3Dy_train2%2C%0A%20%20%20%20%20%20%20%20n_history%3D12%2C%0A%20%20%20%20%20%20%20%20groups%3D%5B%22T3%22%2C%20%22T4%22%2C%20%22T5%22%5D%2C%0A%20%20%20%20%20%20%20%20title%3D%22Local%20vs%20Global%3A%20Forecast%20Comparison%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20MeanAbsoluteError%2C%0A%20%20%20%20plot_score_time_series%2C%0A%20%20%20%20y_pred_global%2C%0A%20%20%20%20y_pred_local2%2C%0A%20%20%20%20y_test2%2C%0A%20%20%20%20y_train2%2C%0A)%3A%0A%20%20%20%20_scorer%20%3D%20MeanAbsoluteError()%0A%20%20%20%20_scorer.fit(y_train2)%0A%20%20%20%20plot_score_time_series(%0A%20%20%20%20%20%20%20%20_scorer%2C%0A%20%20%20%20%20%20%20%20y_test2%2C%0A%20%20%20%20%20%20%20%20%7B%22Global%22%3A%20y_pred_global%2C%20%22Local%22%3A%20y_pred_local2%7D%2C%0A%20%20%20%20%20%20%20%20groups%3D%5B%22T3%22%2C%20%22T4%22%2C%20%22T5%22%5D%2C%0A%20%20%20%20%20%20%20%20title%3D%22Local%20vs%20Global%3A%20MAE%20Over%20Time%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%207.%20Wrapping%20Different%20Forecaster%20Types%0A%0A%20%20%20%20%5B%60LocalPanelForecaster%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.compose.local_panel_forecaster.LocalPanelForecaster%2F)%20works%20with%20any%20forecaster%2C%20including%0A%20%20%20%20simple%20baselines%20like%20%5B%60SeasonalNaive%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.point.naive.SeasonalNaive%2F).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20LocalPanelForecaster%2C%0A%20%20%20%20MeanAbsoluteError%2C%0A%20%20%20%20SeasonalNaive%2C%0A%20%20%20%20horizon%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20y_test2%2C%0A%20%20%20%20y_train2%2C%0A)%3A%0A%20%20%20%20fc_naive_local%20%3D%20LocalPanelForecaster(%0A%20%20%20%20%20%20%20%20forecaster%3DSeasonalNaive(seasonality%3D4)%2C%0A%20%20%20%20)%0A%20%20%20%20fc_naive_local.fit(y_train2%2C%20forecasting_horizon%3Dhorizon)%0A%20%20%20%20_y_pred_naive%20%3D%20fc_naive_local.predict(forecasting_horizon%3Dhorizon)%0A%0A%20%20%20%20_scorer%20%3D%20MeanAbsoluteError()%0A%20%20%20%20_scorer.fit(y_train2)%0A%20%20%20%20_naive_mae%20%3D%20round(float(_scorer.score(y_test2%2C%20_y_pred_naive))%2C%201)%0A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22**SeasonalNaive%20(local)**%20overall%20MAE%3A%20%7B_naive_mae%7D%5Cn%5Cn%22%0A%20%20%20%20%20%20%20%20%22Each%20state%20gets%20its%20own%20%60SeasonalNaive%60%20clone%20with%20%60seasonality%3D4%60%20%22%0A%20%20%20%20%20%20%20%20%22(quarterly%20pattern).%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Multi-vintage%20Scoring%0A%0A%20%20%20%20The%20%60observe_predict%60%20method%20with%20%60stride%3D1%60%20produces%20one%20forecast%20per%0A%20%20%20%20observation%20point%2C%20creating%20multiple%20*vintages*.%20Each%20vintage%20represents%0A%20%20%20%20a%20different%20forecast%20origin%2C%20so%20you%20can%20analyse%20how%20accuracy%20evolves%20as%0A%20%20%20%20the%20model%20absorbs%20more%20data.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(deepcopy%2C%20fc_global%2C%20horizon%2C%20y_test2)%3A%0A%20%20%20%20_vintage_model%20%3D%20deepcopy(fc_global)%0A%20%20%20%20y_pred_vintages%20%3D%20_vintage_model.observe_predict(%0A%20%20%20%20%20%20%20%20y%3Dy_test2%2C%0A%20%20%20%20%20%20%20%20stride%3D1%2C%0A%20%20%20%20%20%20%20%20forecasting_horizon%3Dhorizon%2C%0A%20%20%20%20)%0A%20%20%20%20print(f%22Vintages%3A%20%7By_pred_vintages%5B'vintage_time'%5D.n_unique()%7D%22)%0A%20%20%20%20y_pred_vintages.head(10)%0A%20%20%20%20return%20(y_pred_vintages%2C)%0A%0A%0A%40app.cell%0Adef%20_(MeanAbsoluteError%2C%20y_train2)%3A%0A%20%20%20%20vintage_scorer%20%3D%20MeanAbsoluteError()%0A%20%20%20%20vintage_scorer.fit(y_train2)%0A%20%20%20%20return%20(vintage_scorer%2C)%0A%0A%0A%40app.cell%0Adef%20_(plot_score_per_vintage%2C%20vintage_scorer%2C%20y_pred_vintages%2C%20y_test2)%3A%0A%20%20%20%20plot_score_per_vintage(%0A%20%20%20%20%20%20%20%20vintage_scorer%2C%0A%20%20%20%20%20%20%20%20y_test2%2C%0A%20%20%20%20%20%20%20%20y_pred_vintages%2C%0A%20%20%20%20%20%20%20%20title%3D%22MAE%20per%20Forecast%20Vintage%22%2C%0A%20%20%20%20%20%20%20%20y_label%3D%22MAE%22%2C%0A%20%20%20%20%20%20%20%20height%3D380%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Next%20Steps%0A%0A%20%20%20%20-%20**Panel%20strategy%20overview**%3A%20See%20%60examples%2Fpanel_reduction.py%60%0A%20%20%20%20-%20**Per-group%20specialisation**%3A%20See%20%5B%60examples%2Fpoint%2Fpanel_forecasting.py%60%5D(%2Fexamples%2Fpanel-data%2Fpanel_forecasting%2F)%20for%20%5B%60ColumnForecaster%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.compose.column_forecaster.ColumnForecaster%2F)%0A%20%20%20%20-%20**Composition%20patterns**%3A%20See%20%5B%60examples%2Fcompose%2Fpanel_pipelines.py%60%5D(%2Fexamples%2Fpanel-data%2Fpanel_pipelines%2F)%0A%20%20%20%20-%20**Panel%20intervals**%3A%20See%20%5B%60examples%2Finterval%2Fpanel_intervals.py%60%5D(%2Fexamples%2Fpanel-data%2Fpanel_intervals%2F)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
f6cd8efb838415486f44ef3eebfa810d