%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%20Distance-Based%20Similarity%20Weighting%0A%0A%20%20%20%20Standard%20conformal%20prediction%20gives%20every%20calibration%20residual%20equal%20weight.%0A%20%20%20%20%5B%60DistanceSimilarity%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.interval.similarity.DistanceSimilarity%2F)%20instead%20up-weights%20residuals%20from%20calibration%20points%0A%20%20%20%20**similar**%20to%20the%20current%20test%20point%2C%20yielding%20**adaptive**%20prediction%0A%20%20%20%20intervals%20that%20narrow%20where%20the%20model%20is%20confident%20and%20widen%20where%20it%0A%20%20%20%20is%20uncertain.%0A%0A%20%20%20%20**Prerequisites%3A**%20Familiarity%20with%20%5B%60SplitConformalForecaster%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.interval.split_conformal.SplitConformalForecaster%2F)%20and%20basic%20conformal%20prediction.%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.datasets%20import%20fetch_tourism_monthly%0A%20%20%20%20from%20yohou.interval%20import%20DistanceSimilarity%2C%20SplitConformalForecaster%0A%20%20%20%20from%20yohou.metrics%20import%20(%0A%20%20%20%20%20%20%20%20AbsoluteResidual%2C%0A%20%20%20%20%20%20%20%20IntervalScore%2C%0A%20%20%20%20%20%20%20%20MeanIntervalWidth%2C%0A%20%20%20%20)%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_calibration%2C%0A%20%20%20%20%20%20%20%20plot_forecast%2C%0A%20%20%20%20%20%20%20%20plot_score_heatmap%2C%0A%20%20%20%20%20%20%20%20plot_score_per_step%2C%0A%20%20%20%20%20%20%20%20plot_score_per_vintage%2C%0A%20%20%20%20)%0A%20%20%20%20from%20yohou.point%20import%20PointReductionForecaster%0A%20%20%20%20from%20yohou.preprocessing%20import%20LagTransformer%0A%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20AbsoluteResidual%2C%0A%20%20%20%20%20%20%20%20DistanceSimilarity%2C%0A%20%20%20%20%20%20%20%20IntervalScore%2C%0A%20%20%20%20%20%20%20%20LagTransformer%2C%0A%20%20%20%20%20%20%20%20MeanIntervalWidth%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%20SplitConformalForecaster%2C%0A%20%20%20%20%20%20%20%20deepcopy%2C%0A%20%20%20%20%20%20%20%20fetch_tourism_monthly%2C%0A%20%20%20%20%20%20%20%20plot_calibration%2C%0A%20%20%20%20%20%20%20%20plot_forecast%2C%0A%20%20%20%20%20%20%20%20plot_score_heatmap%2C%0A%20%20%20%20%20%20%20%20plot_score_per_step%2C%0A%20%20%20%20%20%20%20%20plot_score_per_vintage%2C%0A%20%20%20%20%20%20%20%20train_test_split%2C%0A%20%20%20%20)%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%201.%20Prepare%20Data%0A%0A%20%20%20%20We%20use%20Monthly%20Tourism%2C%20its%20clear%20trend%20and%20seasonality%20make%0A%20%20%20%20similarity%20effects%20visible%20because%20the%20error%20structure%20changes%20over%20time.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(fetch_tourism_monthly%2C%20train_test_split)%3A%0A%20%20%20%20y%20%3D%20fetch_tourism_monthly().frame.select(%22time%22%2C%20%22T1__tourists%22).drop_nulls().rename(%7B%22T1__tourists%22%3A%20%22tourists%22%7D)%0A%0A%20%20%20%20y_train%2C%20y_test%20%3D%20train_test_split(y%2C%20test_size%3D24)%0A%20%20%20%20forecasting_horizon%20%3D%20len(y_test)%0A%20%20%20%20return%20forecasting_horizon%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%23%23%202.%20Baseline%3A%20Standard%20Conformal%20(No%20Similarity)%0A%0A%20%20%20%20First%20we%20build%20a%20standard%20%5B%60SplitConformalForecaster%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.interval.split_conformal.SplitConformalForecaster%2F)%20**without**%20similarity%0A%20%20%20%20weighting.%20All%20calibration%20residuals%20get%20equal%20weight.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20AbsoluteResidual%2C%0A%20%20%20%20LagTransformer%2C%0A%20%20%20%20PointReductionForecaster%2C%0A%20%20%20%20Ridge%2C%0A%20%20%20%20SplitConformalForecaster%2C%0A%20%20%20%20forecasting_horizon%2C%0A%20%20%20%20y_train%2C%0A)%3A%0A%20%20%20%20coverage%20%3D%20%5B0.05%2C%200.1%2C%200.2%2C%200.3%2C%200.4%2C%200.5%2C%200.6%2C%200.7%2C%200.8%2C%200.9%2C%200.95%5D%0A%0A%20%20%20%20base_forecaster%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%203%2C%2012%5D)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20conformal_standard%20%3D%20SplitConformalForecaster(%0A%20%20%20%20%20%20%20%20point_forecaster%3Dbase_forecaster%2C%0A%20%20%20%20%20%20%20%20conformity_scorer%3DAbsoluteResidual()%2C%0A%20%20%20%20%20%20%20%20calibration_size%3D30%2C%0A%20%20%20%20%20%20%20%20similarity%3DNone%2C%0A%20%20%20%20)%0A%20%20%20%20conformal_standard.fit(%0A%20%20%20%20%20%20%20%20y_train%2C%0A%20%20%20%20%20%20%20%20forecasting_horizon%3Dforecasting_horizon%2C%0A%20%20%20%20%20%20%20%20coverage_rates%3Dcoverage%2C%0A%20%20%20%20)%0A%0A%20%20%20%20y_pred_standard%20%3D%20conformal_standard.predict_interval(%0A%20%20%20%20%20%20%20%20forecasting_horizon%3Dforecasting_horizon%2C%0A%20%20%20%20%20%20%20%20coverage_rates%3Dcoverage%2C%0A%20%20%20%20)%0A%20%20%20%20_y_point%20%3D%20conformal_standard.predict(forecasting_horizon%3Dforecasting_horizon)%0A%20%20%20%20y_pred_standard%20%3D%20y_pred_standard.hstack(_y_point.drop(%22time%22%2C%20%22vintage_time%22))%0A%20%20%20%20return%20conformal_standard%2C%20coverage%2C%20y_pred_standard%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%20standard%20conformal%20intervals%20with%20uniform%0A%20%20%20%20weighting%20across%20all%20calibration%20residuals.%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_standard%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_standard%2C%0A%20%20%20%20%20%20%20%20y_train%3Dy_train%2C%0A%20%20%20%20%20%20%20%20coverage_rates%3D%5B0.90%5D%2C%0A%20%20%20%20%20%20%20%20n_history%3D36%2C%0A%20%20%20%20%20%20%20%20title%3D%22Standard%20Conformal%20(Uniform%20Weights)%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.%20Euclidean%20Similarity%0A%0A%20%20%20%20Now%20we%20add%20%60DistanceSimilarity(metric%3D%22euclidean%22)%60.%20Calibration%20points%0A%20%20%20%20whose%20lag%20features%20are%20close%20to%20the%20test%20point%20get%20higher%20weight%2C%20producing%0A%20%20%20%20intervals%20that%20adapt%20to%20local%20error%20structure.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20AbsoluteResidual%2C%0A%20%20%20%20DistanceSimilarity%2C%0A%20%20%20%20LagTransformer%2C%0A%20%20%20%20PointReductionForecaster%2C%0A%20%20%20%20Ridge%2C%0A%20%20%20%20SplitConformalForecaster%2C%0A%20%20%20%20coverage%2C%0A%20%20%20%20forecasting_horizon%2C%0A%20%20%20%20y_train%2C%0A)%3A%0A%20%20%20%20conformal_euclidean%20%3D%20SplitConformalForecaster(%0A%20%20%20%20%20%20%20%20point_forecaster%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%203%2C%2012%5D)%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20conformity_scorer%3DAbsoluteResidual()%2C%0A%20%20%20%20%20%20%20%20calibration_size%3D30%2C%0A%20%20%20%20%20%20%20%20similarity%3DDistanceSimilarity(metric%3D%22euclidean%22)%2C%0A%20%20%20%20)%0A%20%20%20%20conformal_euclidean.fit(%0A%20%20%20%20%20%20%20%20y_train%2C%0A%20%20%20%20%20%20%20%20forecasting_horizon%3Dforecasting_horizon%2C%0A%20%20%20%20%20%20%20%20coverage_rates%3Dcoverage%2C%0A%20%20%20%20)%0A%0A%20%20%20%20y_pred_euclidean%20%3D%20conformal_euclidean.predict_interval(%0A%20%20%20%20%20%20%20%20forecasting_horizon%3Dforecasting_horizon%2C%0A%20%20%20%20%20%20%20%20coverage_rates%3Dcoverage%2C%0A%20%20%20%20)%0A%20%20%20%20_y_point%20%3D%20conformal_euclidean.predict(forecasting_horizon%3Dforecasting_horizon)%0A%20%20%20%20y_pred_euclidean%20%3D%20y_pred_euclidean.hstack(_y_point.drop(%22time%22%2C%20%22vintage_time%22))%0A%20%20%20%20return%20(y_pred_euclidean%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%5B%60plot_forecast%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.plotting.forecasting.plot_forecast%2F)%20shows%20how%20Euclidean%20similarity%20weighting%20narrows%20or%0A%20%20%20%20widens%20intervals%20depending%20on%20the%20local%20calibration%20residuals.%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_euclidean%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_euclidean%2C%0A%20%20%20%20%20%20%20%20y_train%3Dy_train%2C%0A%20%20%20%20%20%20%20%20coverage_rates%3D%5B0.90%5D%2C%0A%20%20%20%20%20%20%20%20n_history%3D36%2C%0A%20%20%20%20%20%20%20%20title%3D%22Euclidean%20Similarity%20Weighting%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%204.%20Comparing%20Distance%20Metrics%0A%0A%20%20%20%20%5B%60DistanceSimilarity%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.interval.similarity.DistanceSimilarity%2F)%20accepts%20any%20metric%20from%20%60scipy.spatial.distance.cdist%60.%0A%20%20%20%20Let%20us%20compare%20**euclidean**%2C%20**cosine**%2C%20and%20**cityblock**%20(Manhattan%20distance)%0A%20%20%20%20side%20by%20side.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20AbsoluteResidual%2C%0A%20%20%20%20DistanceSimilarity%2C%0A%20%20%20%20LagTransformer%2C%0A%20%20%20%20PointReductionForecaster%2C%0A%20%20%20%20Ridge%2C%0A%20%20%20%20SplitConformalForecaster%2C%0A%20%20%20%20coverage%2C%0A%20%20%20%20forecasting_horizon%2C%0A%20%20%20%20y_train%2C%0A)%3A%0A%20%20%20%20_metrics_to_compare%20%3D%20%5B%22cosine%22%2C%20%22cityblock%22%5D%0A%20%20%20%20similarity_predictions%20%3D%20%7B%7D%0A%0A%20%20%20%20for%20_metric%20in%20_metrics_to_compare%3A%0A%20%20%20%20%20%20%20%20_forecaster%20%3D%20SplitConformalForecaster(%0A%20%20%20%20%20%20%20%20%20%20%20%20point_forecaster%3DPointReductionForecaster(%0A%20%20%20%20%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%20%20%20%20%20feature_transformer%3DLagTransformer(lag%3D%5B1%2C%202%2C%203%2C%2012%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20conformity_scorer%3DAbsoluteResidual()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20calibration_size%3D30%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20similarity%3DDistanceSimilarity(metric%3D_metric)%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20_forecaster.fit(%0A%20%20%20%20%20%20%20%20%20%20%20%20y_train%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20forecasting_horizon%3Dforecasting_horizon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20coverage_rates%3Dcoverage%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20similarity_predictions%5B_metric%5D%20%3D%20_forecaster.predict_interval(%0A%20%20%20%20%20%20%20%20%20%20%20%20forecasting_horizon%3Dforecasting_horizon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20coverage_rates%3Dcoverage%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20return%20(similarity_predictions%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20MeanIntervalWidth%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20similarity_predictions%2C%0A%20%20%20%20y_pred_euclidean%2C%0A%20%20%20%20y_pred_standard%2C%0A%20%20%20%20y_test%2C%0A%20%20%20%20y_train%2C%0A)%3A%0A%20%20%20%20_width_scorer%20%3D%20MeanIntervalWidth(coverage_rates%3D%5B0.90%5D)%0A%20%20%20%20_width_scorer.fit(y_train)%0A%20%20%20%20_all_preds%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22standard%22%3A%20y_pred_standard%2C%0A%20%20%20%20%20%20%20%20%22euclidean%22%3A%20y_pred_euclidean%2C%0A%20%20%20%20%20%20%20%20**similarity_predictions%2C%0A%20%20%20%20%7D%0A%20%20%20%20_rows%20%3D%20%5B%5D%0A%20%20%20%20for%20_name%2C%20_pred%20in%20_all_preds.items()%3A%0A%20%20%20%20%20%20%20%20_width%20%3D%20float(_width_scorer.score(y_test%2C%20_pred))%0A%20%20%20%20%20%20%20%20_rows.append(f%22%7C%20%7B_name%7D%20%7C%20%7B_width%3A.2f%7D%20%7C%22)%0A%0A%20%20%20%20mo.md(%22%23%23%23%20Mean%20Interval%20Width%20(90%25%20coverage)%5Cn%5Cn%7C%20Method%20%7C%20Width%20%7C%5Cn%7C--------%7C-------%7C%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%205.%20Calibration%20Assessment%0A%0A%20%20%20%20Good%20intervals%20should%20achieve%20empirical%20coverage%20close%20to%20the%20nominal%20rate.%0A%20%20%20%20%5B%60plot_calibration%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.plotting.evaluation.plot_calibration%2F)%20shows%20whether%20each%20method%20is%20over-%20or%20under-covering.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(coverage%2C%20plot_calibration%2C%20y_pred_standard%2C%20y_test)%3A%0A%20%20%20%20plot_calibration(%0A%20%20%20%20%20%20%20%20y_pred_standard%2C%0A%20%20%20%20%20%20%20%20y_test%2C%0A%20%20%20%20%20%20%20%20coverage_rates%3Dcoverage%2C%0A%20%20%20%20%20%20%20%20title%3D%22Calibration%3A%20Standard%20Conformal%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%5B%60plot_calibration%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.plotting.evaluation.plot_calibration%2F)%20for%20the%20Euclidean%20similarity%20approach%20shows%20whether%0A%20%20%20%20the%20locally-weighted%20intervals%20achieve%20their%20nominal%20coverage.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(coverage%2C%20plot_calibration%2C%20y_pred_euclidean%2C%20y_test)%3A%0A%20%20%20%20plot_calibration(%0A%20%20%20%20%20%20%20%20y_pred_euclidean%2C%0A%20%20%20%20%20%20%20%20y_test%2C%0A%20%20%20%20%20%20%20%20coverage_rates%3Dcoverage%2C%0A%20%20%20%20%20%20%20%20title%3D%22Calibration%3A%20Euclidean%20Similarity%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%206.%20Horizon%20Degradation%0A%0A%20%20%20%20Prediction%20intervals%20typically%20widen%20at%20longer%20horizons.%20%5B%60plot_score_per_step%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.plotting.evaluation.plot_score_per_step%2F)%0A%20%20%20%20shows%20how%20interval%20scores%20change%20across%20forecast%20steps.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20IntervalScore%2C%0A%20%20%20%20plot_score_per_step%2C%0A%20%20%20%20y_pred_euclidean%2C%0A%20%20%20%20y_pred_standard%2C%0A%20%20%20%20y_test%2C%0A)%3A%0A%20%20%20%20plot_score_per_step(%0A%20%20%20%20%20%20%20%20IntervalScore(coverage_rates%3D%5B0.90%5D)%2C%0A%20%20%20%20%20%20%20%20y_test%2C%0A%20%20%20%20%20%20%20%20%7B%22standard%22%3A%20y_pred_standard%2C%20%22euclidean%22%3A%20y_pred_euclidean%7D%2C%0A%20%20%20%20%20%20%20%20kind%3D%22line%22%2C%0A%20%20%20%20%20%20%20%20title%3D%22Interval%20Score%20per%20Horizon%20Step%20(90%25%20Coverage)%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.%20Custom%20metric_params%0A%0A%20%20%20%20For%20metrics%20like%20Minkowski%2C%20pass%20%60metric_params%60%20to%20control%20the%20distance%3A%0A%20%20%20%20%60metric_params%3D%7B%22p%22%3A%201.5%7D%60%20gives%20a%20p-norm%20between%20Manhattan%20(p%3D1)%20and%0A%20%20%20%20Euclidean%20(p%3D2).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20AbsoluteResidual%2C%0A%20%20%20%20DistanceSimilarity%2C%0A%20%20%20%20LagTransformer%2C%0A%20%20%20%20PointReductionForecaster%2C%0A%20%20%20%20Ridge%2C%0A%20%20%20%20SplitConformalForecaster%2C%0A%20%20%20%20coverage%2C%0A%20%20%20%20forecasting_horizon%2C%0A%20%20%20%20y_train%2C%0A)%3A%0A%20%20%20%20conformal_minkowski%20%3D%20SplitConformalForecaster(%0A%20%20%20%20%20%20%20%20point_forecaster%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%203%2C%2012%5D)%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20conformity_scorer%3DAbsoluteResidual()%2C%0A%20%20%20%20%20%20%20%20calibration_size%3D36%2C%0A%20%20%20%20%20%20%20%20similarity%3DDistanceSimilarity(metric%3D%22minkowski%22%2C%20metric_params%3D%7B%22p%22%3A%202.5%7D)%2C%0A%20%20%20%20)%0A%20%20%20%20conformal_minkowski.fit(%0A%20%20%20%20%20%20%20%20y_train%2C%0A%20%20%20%20%20%20%20%20forecasting_horizon%3Dforecasting_horizon%2C%0A%20%20%20%20%20%20%20%20coverage_rates%3Dcoverage%2C%0A%20%20%20%20)%0A%0A%20%20%20%20y_pred_minkowski%20%3D%20conformal_minkowski.predict_interval(%0A%20%20%20%20%20%20%20%20forecasting_horizon%3Dforecasting_horizon%2C%0A%20%20%20%20%20%20%20%20coverage_rates%3Dcoverage%2C%0A%20%20%20%20)%0A%20%20%20%20_y_point%20%3D%20conformal_minkowski.predict(forecasting_horizon%3Dforecasting_horizon)%0A%20%20%20%20y_pred_minkowski%20%3D%20y_pred_minkowski.hstack(_y_point.drop(%22time%22%2C%20%22vintage_time%22))%0A%20%20%20%20return%20(y_pred_minkowski%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%5B%60plot_forecast%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.plotting.forecasting.plot_forecast%2F)%20shows%20how%20the%20Minkowski%20distance%20(p%3D1.5)%20affects%0A%20%20%20%20the%20resulting%20interval%20shape.%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_minkowski%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_minkowski%2C%0A%20%20%20%20%20%20%20%20y_train%3Dy_train%2C%0A%20%20%20%20%20%20%20%20coverage_rates%3D%5B0.90%5D%2C%0A%20%20%20%20%20%20%20%20n_history%3D36%2C%0A%20%20%20%20%20%20%20%20title%3D%22Minkowski%20(p%3D1.5)%20Similarity%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%20Multi-vintage%20Scoring%0A%0A%20%20%20%20The%20%60observe_predict_interval%60%20method%20with%20%60stride%3D1%60%20produces%20one%0A%20%20%20%20interval%20forecast%20per%20observation%20point%2C%20creating%20multiple%20*vintages*.%0A%20%20%20%20Each%20vintage%20represents%20a%20different%20forecast%20origin%2C%20so%20you%20can%20analyse%0A%20%20%20%20how%20interval%20quality%20evolves%20as%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_(conformal_standard%2C%20coverage%2C%20deepcopy%2C%20forecasting_horizon%2C%20y_test)%3A%0A%20%20%20%20_vintage_model%20%3D%20deepcopy(conformal_standard)%0A%20%20%20%20y_pred_vintages%20%3D%20_vintage_model.observe_predict_interval(%0A%20%20%20%20%20%20%20%20y%3Dy_test%2C%0A%20%20%20%20%20%20%20%20stride%3D1%2C%0A%20%20%20%20%20%20%20%20forecasting_horizon%3Dforecasting_horizon%2C%0A%20%20%20%20%20%20%20%20coverage_rates%3Dcoverage%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_(IntervalScore%2C%20y_train)%3A%0A%20%20%20%20vintage_scorer%20%3D%20IntervalScore()%0A%20%20%20%20vintage_scorer.fit(y_train)%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_test)%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_test%2C%0A%20%20%20%20%20%20%20%20y_pred_vintages%2C%0A%20%20%20%20%20%20%20%20title%3D%22Interval%20Score%20per%20Vintage%22%2C%0A%20%20%20%20%20%20%20%20y_label%3D%22Interval%20Score%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%0Adef%20_(plot_score_heatmap%2C%20vintage_scorer%2C%20y_pred_vintages%2C%20y_test)%3A%0A%20%20%20%20plot_score_heatmap(%0A%20%20%20%20%20%20%20%20vintage_scorer%2C%0A%20%20%20%20%20%20%20%20y_test%2C%0A%20%20%20%20%20%20%20%20y_pred_vintages%2C%0A%20%20%20%20%20%20%20%20title%3D%22Score%20Heatmap%20(Step%20x%20Vintage)%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%20Next%20Steps%0A%0A%20%20%20%20-%20**Conformity%20scorers**%3A%20See%20%5B%60conformity_scorers.py%60%5D(%2Fexamples%2Fevaluation-search%2Fconformity_scorers%2F)%20for%20comparing%20Residual%2C%20GammaResidual%2C%20etc.%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)%20for%20prediction%20intervals%20on%20panel%20data%0A%20%20%20%20-%20**Interval%20metrics**%3A%20See%20%5B%60examples%2Fmetrics%2Finterval_metrics.py%60%5D(%2Fexamples%2Fevaluation-search%2Finterval_metrics%2F)%20for%20EmpiricalCoverage%2C%20IntervalScore%2C%20and%20more%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
f13bcc92b067b2379f1bbeb731cefbdd