import%20marimo%0A%0A__generated_with%20%3D%20%220.25.0%22%0Aapp%20%3D%20marimo.App()%0A%0A%0A%40app.cell%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%20METADATA%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22id%22%3A%20%22probabilistic_forecasting%22%2C%0A%20%20%20%20%20%20%20%20%22name%22%3A%20%22Probabilistic%20Forecasting%22%2C%0A%20%20%20%20%20%20%20%20%22kind%22%3A%20%22concept%22%2C%0A%20%20%20%20%20%20%20%20%22difficulty%22%3A%20%22intermediate%22%2C%0A%20%20%20%20%20%20%20%20%22status%22%3A%20%22complete%22%2C%0A%20%20%20%20%20%20%20%20%22topics%22%3A%20%5B%22forecasting%22%2C%20%22uncertainty%22%2C%20%22probability%22%2C%20%22evaluation%22%5D%2C%0A%20%20%20%20%20%20%20%20%22related_models%22%3A%20%5B%22chronos%22%5D%2C%0A%20%20%20%20%20%20%20%20%22prerequisites%22%3A%20%5B%22metrics%22%2C%20%22rolling_origin_backtesting%22%5D%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20mo.md(f%22%23%20%7BMETADATA%5B'name'%5D%7D%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%20In%20one%20sentence%0A%0A%20%20%20%20Probabilistic%20forecasting%20describes%20a%20distribution%20of%20plausible%20future%20values%20instead%20of%20pretending%20that%20one%20path%20is%20certain.%0A%0A%20%20%20%20%23%23%20From%20a%20line%20to%20a%20decision%20range%0A%0A%20%20%20%20A%20point%20forecast%20answers%20%E2%80%9Cwhat%20is%20one%20central%20estimate%3F%E2%80%9D%20A%20probabilistic%20forecast%20can%20answer%20%E2%80%9Chow%20likely%20are%20different%20outcomes%3F%E2%80%9D%20This%20matters%20when%20underestimating%20demand%2C%20energy%20load%2C%20or%20inventory%20has%20a%20different%20cost%20from%20overestimating%20it.%0A%0A%20%20%20%20Common%20outputs%20are%20sampled%20trajectories%2C%20prediction%20intervals%2C%20or%20quantiles%20such%20as%20the%2010th%2C%2050th%2C%20and%2090th%20percentiles.%0A%20%20%20%20%22%22%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%20Quantiles%20and%20pinball%20loss%0A%0A%20%20%20%20The%20%24q%24%20quantile%20forecast%20%24%5Chat%20y_q%24%20is%20evaluated%20with%20pinball%20loss%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20L_q(y%2C%5Chat%20y_q)%3D%0A%20%20%20%20%5Cbegin%7Bcases%7D%0A%20%20%20%20q(y-%5Chat%20y_q)%2C%20%26%20y%5Cge%20%5Chat%20y_q%2C%5C%5C%0A%20%20%20%20(1-q)(%5Chat%20y_q-y)%2C%20%26%20y%3C%5Chat%20y_q.%0A%20%20%20%20%5Cend%7Bcases%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20Errors%20on%20opposite%20sides%20receive%20different%20weights.%20Minimizing%20this%20loss%20targets%20the%20requested%20quantile%20rather%20than%20the%20mean.%0A%0A%20%20%20%20An%2080%25%20prediction%20interval%20should%20contain%20roughly%2080%25%20of%20future%20observations%20over%20repeated%20forecasts.%20Coverage%20alone%20is%20not%20enough%3A%20an%20infinitely%20wide%20interval%20covers%20everything%20but%20is%20useless%2C%20so%20report%20interval%20width%20too.%0A%20%20%20%20%22%22%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---%0A%0A%20%20%20%20%23%23%20Notebook%20%E2%80%94%20sharpness%20versus%20calibration%0A%0A%20%20%20%20We%20compare%20two%20interval%20forecasts%3A%20one%20is%20too%20narrow%3B%20the%20other%20is%20wider%20and%20closer%20to%20its%20intended%2080%25%20coverage.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%0A%20%20%20%20rng%20%3D%20np.random.default_rng(11)%0A%20%20%20%20n%20%3D%20220%0A%20%20%20%20time%20%3D%20np.arange(n)%0A%20%20%20%20center%20%3D%20np.sin(2%20*%20np.pi%20*%20time%20%2F%2030)%0A%20%20%20%20scale%20%3D%200.18%20%2B%200.002%20*%20time%0A%20%20%20%20observed%20%3D%20center%20%2B%20rng.normal(0%2C%20scale)%0A%20%20%20%20return%20center%2C%20np%2C%20observed%2C%20plt%2C%20scale%2C%20time%0A%0A%0A%40app.cell%0Adef%20_(center%2C%20np%2C%20observed%2C%20plt%2C%20scale%2C%20time)%3A%0A%20%20%20%20intervals%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22too%20narrow%22%3A%20(center%20-%200.55%20*%20scale%2C%20center%20%2B%200.55%20*%20scale)%2C%0A%20%20%20%20%20%20%20%20%22better%20calibrated%22%3A%20(center%20-%201.28%20*%20scale%2C%20center%20%2B%201.28%20*%20scale)%2C%0A%20%20%20%20%7D%0A%20%20%20%20diagnostics%20%3D%20%7B%7D%0A%20%20%20%20fig_intervals%2C%20axes%20%3D%20plt.subplots(2%2C%201%2C%20figsize%3D(11%2C%207)%2C%20sharex%3DTrue)%0A%20%20%20%20for%20interval_axis%2C%20(name%2C%20(lower%2C%20upper))%20in%20zip(axes%2C%20intervals.items())%3A%0A%20%20%20%20%20%20%20%20coverage%20%3D%20np.mean((observed%20%3E%3D%20lower)%20%26%20(observed%20%3C%3D%20upper))%0A%20%20%20%20%20%20%20%20width%20%3D%20np.mean(upper%20-%20lower)%0A%20%20%20%20%20%20%20%20diagnostics%5Bname%5D%20%3D%20%7B%22coverage%22%3A%20coverage%2C%20%22mean_width%22%3A%20width%7D%0A%20%20%20%20%20%20%20%20interval_axis.plot(time%2C%20observed%2C%20color%3D%22%2366706a%22%2C%20linewidth%3D1%2C%20label%3D%22observed%22)%0A%20%20%20%20%20%20%20%20interval_axis.plot(time%2C%20center%2C%20color%3D%22%237f62b3%22%2C%20label%3D%22median%22)%0A%20%20%20%20%20%20%20%20interval_axis.fill_between(time%2C%20lower%2C%20upper%2C%20color%3D%22%23b9a7d6%22%2C%20alpha%3D0.45)%0A%20%20%20%20%20%20%20%20interval_axis.set_title(f%22%7Bname%7D%3A%20coverage%3D%7Bcoverage%3A.1%25%7D%2C%20mean%20width%3D%7Bwidth%3A.2f%7D%22)%0A%20%20%20%20%20%20%20%20interval_axis.set_ylabel(%22value%22)%0A%20%20%20%20axes%5B-1%5D.set_xlabel(%22forecast%20case%22)%0A%20%20%20%20axes%5B0%5D.legend(frameon%3DFalse%2C%20ncol%3D2)%0A%20%20%20%20fig_intervals.tight_layout()%0A%20%20%20%20return%20(diagnostics%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(diagnostics%2C%20mo)%3A%0A%20%20%20%20narrow%20%3D%20diagnostics%5B%22too%20narrow%22%5D%0A%20%20%20%20calibrated%20%3D%20diagnostics%5B%22better%20calibrated%22%5D%0A%20%20%20%20mo.md(f%22%22%22%0A%20%20%20%20%23%23%20Reading%20the%20result%0A%0A%20%20%20%20The%20narrow%20interval%20covers%20**%7Bnarrow%5B'coverage'%5D%3A.1%25%7D**%20of%20observations.%20The%20wider%20interval%20covers%20**%7Bcalibrated%5B'coverage'%5D%3A.1%25%7D**.%20Calibration%20improves%2C%20but%20the%20average%20width%20also%20grows%20from%20**%7Bnarrow%5B'mean_width'%5D%3A.2f%7D**%20to%20**%7Bcalibrated%5B'mean_width'%5D%3A.2f%7D**.%0A%0A%20%20%20%20Evaluate%20this%20tradeoff%20at%20every%20forecast%20horizon%20and%20across%20rolling%20origins.%20Intervals%20often%20become%20wider%20farther%20into%20the%20future.%0A%0A%20%20%20%20%23%23%20Practical%20takeaway%0A%0A%20%20%20%20Report%20quantile%20loss%2C%20empirical%20coverage%2C%20and%20interval%20width%20together.%20A%20probabilistic%20model%20such%20as%20Chronos%20is%20useful%20only%20when%20its%20uncertainty%20is%20calibrated%20enough%20to%20support%20the%20downstream%20decision.%0A%0A%20%20%20%20%23%23%20Related%20model%0A%0A%20%20%20%20%5BExplore%20Chronos%20Forecasting%5D(%2Fmodels%2Fchronos).%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
b2245a29a6f3ee9d46f84b8a9594c0cc