	{"id":62907,"date":"2021-09-10T12:02:04","date_gmt":"2021-09-10T11:02:04","guid":{"rendered":"https:\/\/www.artefact.com\/?post_type=news&#038;p=62907"},"modified":"2024-09-20T17:45:46","modified_gmt":"2024-09-20T16:45:46","slug":"the-path-to-developing-a-high-performance-demand-forecasting-model-part-3","status":"publish","type":"blog","link":"https:\/\/www.artefact.com\/zh\/blog\/the-path-to-developing-a-high-performance-demand-forecasting-model-part-3\/","title":{"rendered":"\u5f00\u53d1\u9ad8\u6027\u80fd\u9700\u6c42\u9884\u6d4b\u6a21\u578b\u4e4b\u8def--\u7b2c\u4e09\u90e8\u5206"},"content":{"rendered":"<p><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling article-author\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-background-color:#ffffff;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_2 1_2 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:50%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-1 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">Author<\/h2><\/div><img decoding=\"async\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27150%27%20height%3D%270%27%20viewBox%3D%270%200%20150%200%27%3E%3Crect%20width%3D%27150%27%20height%3D%270%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/09\/brian-lozach.jpeg\" alt=\"Image\" class=\"lazyload artefact-elegant-image align-left article-author-image\" style=\"width: 150px; border-radius: 54% 46% 77% 23% \/ 74% 40% 60% 26%; overflow: hidden;\" width=\"150\" height=\"auto\" \/><div class=\"fusion-title title fusion-title-2 fusion-sep-none fusion-title-text fusion-title-size-three article-author-name-title\" style=\"--awb-margin-bottom-small:8px;\"><h3 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:20;line-height:1.2;\">Brian Lozach<\/h3><\/div><div class=\"fusion-text fusion-text-1 article-author-description\"><p>Senior Data Scientist at Artefact<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-2 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-margin-top:40px;--awb-margin-bottom:40px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-center fusion-flex-justify-content-center fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-1 fusion_builder_column_1_1 1_1 fusion-flex-column fusion-flex-align-self-center fusion-column-inner-bg-wrapper\" style=\"--awb-padding-top:20px;--awb-padding-right:20px;--awb-padding-bottom:20px;--awb-padding-left:20px;--awb-overflow:hidden;--awb-inner-bg-size:cover;--awb-border-color:rgba(10,17,40,0.1);--awb-border-top:1px;--awb-border-right:1px;--awb-border-bottom:1px;--awb-border-left:1px;--awb-border-style:solid;--awb-border-radius:4px 4px 4px 4px;--awb-inner-bg-border-radius:4px 4px 4px 4px;--awb-inner-bg-overflow:hidden;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><span class=\"fusion-column-inner-bg hover-type-none\"><a class=\"fusion-column-anchor\" href=\"https:\/\/medium.com\/artefact-engineering-and-data-science\/the-path-to-developing-a-high-performance-demand-forecasting-model-part-3-fb1bd435c869\" rel=\"noopener noreferrer\" target=\"_blank\"><span class=\"fusion-column-inner-bg-image\"><\/span><\/a><\/span><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-center fusion-content-layout-row fusion-flex-align-items-center\"><div class=\"fusion-text fusion-text-2\"><p><u>Read our article on<\/u><\/p>\n<\/div><div class=\"fusion-image-element\" style=\"--awb-margin-right:20px;--awb-margin-left:20px;--awb-max-width:150px;--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-1 hover-type-none\"><a class=\"fusion-no-lightbox\" href=\"https:\/\/medium.com\/artefact-engineering-and-data-science\/the-path-to-developing-a-high-performance-demand-forecasting-model-part-3-fb1bd435c869\" target=\"_self\" aria-label=\"Medium Blog\" rel=\"noopener\"><img decoding=\"async\" width=\"4000\" height=\"992\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog.png\" alt class=\"lazyload img-responsive wp-image-60582\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%274000%27%20height%3D%27992%27%20viewBox%3D%270%200%204000%20992%27%3E%3Crect%20width%3D%274000%27%20height%3D%27992%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-200x50.png 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-400x99.png 400w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-600x149.png 600w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-800x198.png 800w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-1200x298.png 1200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog.png 4000w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 640px) 100vw, 4000px\" \/><\/a><\/span><\/div><div class=\"fusion-text fusion-text-3\"><p>.<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-3 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-2 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-4 description\"><p>How to choose the right visualizations and implement them in Streamlit to better debug your forecasting models<\/p>\n<\/div><\/div><\/div><\/div><\/div><article class=\"fusion-fullwidth fullwidth-box fusion-builder-row-4 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-justify-content-center fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-3 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-3 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">TL; DR<\/h2><\/div><div class=\"fusion-text fusion-text-5\"><p>When dealing with forecasts models, the best approach is often to iterate continuously, adding some data sources, improving feature engineering, tweeking model parameters\u2026 Most of the time Data Scientists tends to be fixed to only one KPI (<em class=\"iw\">i.e.<\/em> RMSE, Forecast Accuracy\u2026). There is often lot more information behind those KPIs that needs to be analyzed to improve prediction. Building an appropriate visualization tool is a great mean to deep-dive into the model behavior, spot quickly pain-points of your model, and thus gain in accuracy efficiently.<\/p>\n<\/div><div class=\"fusion-text fusion-text-6\"><p>This article will develop the key questions one should ask him\/herself when evaluating a forecasting model, then present must-have visualizations to answer these questions and finally propose a quick implementation under a unified tool to gather all these visualization using Streamlit.<\/p>\n<\/div><div class=\"fusion-title title fusion-title-4 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">Context<\/h2><\/div><div class=\"fusion-text fusion-text-7\"><p>This article sums up what we learned from building a unified visualization tool to help Data Scientists, Software Engineers, Product Owners &amp; Demand Planner (business experts) develop sell-in forecasting models for 10+ business units in a food &amp; beverage company. Our models made forecasts at a Daily x Warehouse x Product level, for the coming 14 weeks. These were developed using boosting methods, and take into account product characteristics, historical sales, events and promotional data.<\/p>\n<\/div><div class=\"fusion-title title fusion-title-5 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">Key questions to ask when evaluating a Forecasting model<\/h2><\/div><div class=\"fusion-text fusion-text-8\"><p><strong>1. Is the model good compared to the baseline?<\/strong><br \/>\nHaving access to current predictions (for instance demand planner forecasts) on the same scope is very helpful. It allows a good understanding of the business behaviour on a specific period, product or location. The more you interview the Business, the more you gain insights, and the more you can implement the right features.<\/p>\n<\/div><div class=\"fusion-text fusion-text-9\"><p><strong>2. Chasing over or under-predictions and drops in Forecast Accuracy<\/strong><br \/>\nMust have questions are: Do I catch the global trend? Does the model catch known recurrent events like holidays, warehouses closure, school holidays? Do I have some accuracy drops on particular periods?<br \/>\nWhy is it important?<\/p>\n<\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-1 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">If the model over-predicts, it induces stock increase and thus stock costs.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">If the model under-predicts, it induces out-of-stocks periods, thus missing sales opportunities and decreasing customer satisfaction.<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-10\"><p>Spotting such events is a great way to reach efficiently more accurate predictions. These are often well known by demand planners and quite simple to implement in your model when you have the information. For example, in many of our business units, some products were sold for school lunches. Introducing and preparing a feature representing school holidays led to a great increase in our accuracy on these particular periods.<\/p>\n<\/div><div class=\"fusion-text fusion-text-11\"><p><strong>3. Dealing with product specificities<\/strong><br \/>\nIs my performance homogeneous on my products brands \/ families? Are there any other distinction between my products (products sold only during promotions periods, best-sellers vs. low volumes products, products )?<br \/>\nWhy is it important ?<\/p>\n<\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-2 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">To validate the good behavior of the model on the whole scope<strong class=\"gl jo\">.\u00a0<\/strong>Depending on the business need, a minimal accuracy can be required on the whole scope.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p>To identify critical products, that can be analyzed more precisely, and thus gain in accuracy.<\/p>\n<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-12\"><p>These questions help you understand the business more precisely. For example, splitting models based on the importance of the products in terms of volume often lead to the increase of the performance. Indeed, the demand for regular products is very different from the demand for promotional products or less common ones, which can be highly correlated with promotion periods or have a very sparse sales profile. In most of our cases, we trained distinct models to address those different types of products.<\/p>\n<\/div><div class=\"fusion-text fusion-text-13\"><p><strong>4. Do the constitutive effects are correctly taken into account?<\/strong><br \/>\nIs the model correctly capturing promotions effects? Are there cannibalization effects? Does the model adapt well to exogenous phenomena (ex: strikes)?<br \/>\nWhy is it important?<\/p>\n<\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-3 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">In most of the cases, promotions are an important part to drive demand and can lead to great spikes in sales data.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">It can lead to big waste \/ out-of-stocks phenomena.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">A more realistic model taking into account sophisticated effects will more likely be adopted by your future users.<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-14\"><p>Please feel free to refer to the previous article of our Forecasting Series to tackle promotion data:\u00a0<a class=\"bv jx\" href=\"https:\/\/medium.com\/artefact-engineering-and-data-science\/the-path-to-developing-a-high-performance-demand-forecasting-model-part-2-8193e87fc9ac\" rel=\"noopener\" target=\"_blank\">5 tips to better take promotional data into account<\/a><\/p>\n<\/div><div class=\"fusion-title title fusion-title-6 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">How to analyze your forecasting model : from macro-KPIs to the evaluation on a specific scope<\/h2><\/div><div class=\"fusion-text fusion-text-15\"><p><strong>What are the must-have visualizations?<\/strong><br \/>\nTo build your evaluation tool, you must combine two elements :<\/p>\n<\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-4 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">A filter part to evaluate the performance on a specific scope<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">A set of visualizations to quickly spot improvement axes<\/div><\/li><\/ul><div class=\"fusion-image-element\" style=\"--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-2 hover-type-none\"><img decoding=\"async\" width=\"700\" height=\"329\" title=\"article-brian-blog\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/09\/article-brian-blog.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/09\/article-brian-blog.png\" alt class=\"lazyload img-responsive wp-image-62910\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27700%27%20height%3D%27329%27%20viewBox%3D%270%200%20700%20329%27%3E%3Crect%20width%3D%27700%27%20height%3D%27329%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/09\/article-brian-blog-200x94.png 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/09\/article-brian-blog-400x188.png 400w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/09\/article-brian-blog-600x282.png 600w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/09\/article-brian-blog.png 700w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 640px) 100vw, 700px\" \/><\/span><\/div><div class=\"fusion-text fusion-text-16\"><p>The filter part must allow to filter on several axes : period of analysis, locations (retailer, warehouse \u2026), products (a set of products), and finally product categories.<br \/>\nWe recommend at least the 4 following visualizations:<\/p>\n<\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-5 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p>First, the<strong>\u00a0evolution of predicted volume<\/strong>, with the information on the real sales. This is the most comprehensible one, and the first to look at. It helps you understand your model: is my model catching the global trend? Is it over or under-predicting? Do I catch the spikes and drops?<\/p>\n<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">Second, the\u00a0<strong>evolution of the Forecast Accuracy<\/strong>. Depending on the way the forecast accuracy is calculated, this figure may be necessary to complete the first one. This figure helps you spot quickly pain-point periods in your forecasts, and thus tells you on what period you should deep-dive.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">Third, some well represented KPIs to\u00a0<strong>compute your Forecast Accuracy on different scopes<\/strong>. We recommends splitting your accuracy on different levels : warehouses, product category levels, products, and even to mix those analysis axes (for instance to create a heatmap of the forecast accuracy on each warehouse x product categories). Again, it helps you find critical localisation or products.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">The last one, is the\u00a0<strong>contribution evaluation<\/strong>. To understand precisely how your model works, you need to evaluate most used features. Classical TS models (ARIMA &amp; Co., Prophet, \u2026) propose feature decomposition natively. For boosting methods (XGBoost, CatBoost, LightGBM\u2026) frameworks like\u00a0<a class=\"bv jx\" href=\"https:\/\/github.com\/slundberg\/shap\" rel=\"noopener ugc nofollow\" target=\"_blank\">SHAP<\/a>\u00a0are very useful to precisely model behavior across each feature. Representing those contribution on the periods helps you evaluate which phenomena is driving your forecast at what moment.<\/div><\/li><\/ul><div class=\"fusion-title title fusion-title-7 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">How to start building your forecasting studio dashboard using Streamlit?<\/h2><\/div><div class=\"fusion-text fusion-text-17\"><p>Streamlit is an open source python library to create shareable web apps in minutes and is still gaining popularity across Data Science community. In this article, we will not present the tool as many articles are already available on this topic, but we will focus on the easy implementation of one visualization.<br \/>\nThe choice of using Streamlit for this type of project was motivated by several pre-requisites :<\/p>\n<\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-6 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">Streamlit makes a MVP dashboard very easy to set-up.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">Fully integrable in a Data Science project. Since your Streamlit pages will be written in Python, you will be able to use your core project\u2019s functions. For example, if you have developed a lib to access your data-preparations, reference tables, and predictions, you will be able use them directly in your dashboard code.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p>Shareable to many users, by exposing your dashboard on a port of your remote machine or deploying it on solution like App Engine, Cloud Run \u2026<\/p>\n<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-18\"><p><strong>1. Global structure of your forecasting dashboard<\/strong><br \/>\nBefore diving into the implementation, the prerequisite in building a dashboard is to draw the parts of your application.<\/p>\n<p>To be clean in your implementation, you can divide your code into several parts:<\/p>\n<\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-7 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">The core dashboard that you can launch with\u00a0<code class=\"kf kl km kn ko b\">streamlit run forecasting_studio_app.py<\/code><\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">The distinct pages (simple EDA on your training dataset, forecast analysis, feature contribution,\u2026)<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p>Lib scripts to gather your data-preparation \/ figures for each page<\/p>\n<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-19\"><div class=\"code\">\n<table class=\"highlight tab-size js-file-line-container\" data-tab-size=\"8\" data-paste-markdown-skip=\"\">\n<tbody>\n<tr>\n<td id=\"file-tree-sh-LC1\" class=\"blob-code blob-code-inner js-file-line\">\u251c\u2500\u2500 config.py<\/td>\n<\/tr>\n<tr>\n<td id=\"file-tree-sh-L2\" class=\"blob-num js-line-number\" data-line-number=\"2\">\u251c\u2500\u2500 forecasting_studio<\/td>\n<td id=\"file-tree-sh-LC2\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-tree-sh-L3\" class=\"blob-num js-line-number\" data-line-number=\"3\">\u2502\u00a0\u00a0 \u251c\u2500\u2500 forecast_analysis<\/td>\n<td id=\"file-tree-sh-LC3\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-tree-sh-L4\" class=\"blob-num js-line-number\" data-line-number=\"4\">\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 fig_forecast_analysis.py<\/td>\n<td id=\"file-tree-sh-LC4\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-tree-sh-L5\" class=\"blob-num js-line-number\" data-line-number=\"5\">\u2502\u00a0\u00a0 \u2514\u2500\u2500 pages<\/td>\n<td id=\"file-tree-sh-LC5\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-tree-sh-L6\" class=\"blob-num js-line-number\" data-line-number=\"6\">\u2502\u00a0\u00a0 \u2514\u2500\u2500 forecast_analysis.py<\/td>\n<td id=\"file-tree-sh-LC6\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-tree-sh-L7\" class=\"blob-num js-line-number\" data-line-number=\"7\">\n<table class=\"highlight tab-size js-file-line-container\" data-tab-size=\"8\" data-paste-markdown-skip=\"\">\n<tbody>\n<tr>\n<td id=\"file-tree-sh-LC7\" class=\"blob-code blob-code-inner js-file-line\">\u2514\u2500\u2500 forecasting_studio_app.py<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/td>\n<td id=\"file-tree-sh-LC7\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div><div class=\"fusion-text fusion-text-20\"><p>The main page will set-up the global structure of your app, i.e. the global layout of your app : in our case, a wide layout, and a sidebar to display the name of your app and the available pages.<\/p>\n<\/div><div class=\"fusion-text fusion-text-21\"><div class=\"code\">\n<table class=\"highlight tab-size js-file-line-container\" data-tab-size=\"8\" data-paste-markdown-skip=\"\">\n<tbody>\n<tr>\n<td id=\"file-forecasting_studio_app-py-LC1\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-k\">import<\/span> <span class=\"pl-s1\">streamlit<\/span> <span class=\"pl-k\">as<\/span> <span class=\"pl-s1\">st<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecasting_studio_app-py-L2\" class=\"blob-num js-line-number\" data-line-number=\"2\"><span class=\"pl-k\">from<\/span> <span class=\"pl-s1\">forecasting_studio<\/span>.<span class=\"pl-s1\">pages<\/span> <span class=\"pl-k\">import<\/span> <span class=\"pl-s1\">forecast_analysis<\/span><\/td>\n<td id=\"file-forecasting_studio_app-py-LC2\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecasting_studio_app-py-L3\" class=\"blob-num js-line-number\" data-line-number=\"3\"><\/td>\n<td id=\"file-forecasting_studio_app-py-LC3\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecasting_studio_app-py-L4\" class=\"blob-num js-line-number\" data-line-number=\"4\"><span class=\"pl-v\">PAGES<\/span> <span class=\"pl-c1\">=<\/span> <\/td>\n<td id=\"file-forecasting_studio_app-py-LC4\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecasting_studio_app-py-L5\" class=\"blob-num js-line-number\" data-line-number=\"5\"><\/td>\n<td id=\"file-forecasting_studio_app-py-LC5\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecasting_studio_app-py-L6\" class=\"blob-num js-line-number\" data-line-number=\"6\"><\/td>\n<td id=\"file-forecasting_studio_app-py-LC6\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecasting_studio_app-py-L7\" class=\"blob-num js-line-number\" data-line-number=\"7\"><span class=\"pl-k\">def<\/span> <span class=\"pl-en\">write_page<\/span>(<span class=\"pl-s1\">page<\/span>):<\/td>\n<td id=\"file-forecasting_studio_app-py-LC7\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecasting_studio_app-py-L8\" class=\"blob-num js-line-number\" data-line-number=\"8\"><span class=\"pl-s1\">page<\/span>.<span class=\"pl-en\">write<\/span>()<\/td>\n<td id=\"file-forecasting_studio_app-py-LC8\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecasting_studio_app-py-L9\" class=\"blob-num js-line-number\" data-line-number=\"9\"><\/td>\n<td id=\"file-forecasting_studio_app-py-LC9\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecasting_studio_app-py-L10\" class=\"blob-num js-line-number\" data-line-number=\"10\"><\/td>\n<td id=\"file-forecasting_studio_app-py-LC10\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecasting_studio_app-py-L11\" class=\"blob-num js-line-number\" data-line-number=\"11\"><span class=\"pl-k\">def<\/span> <span class=\"pl-en\">main<\/span>():<\/td>\n<td id=\"file-forecasting_studio_app-py-LC11\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecasting_studio_app-py-L12\" class=\"blob-num js-line-number\" data-line-number=\"12\"><span class=\"pl-s1\">st<\/span>.<span class=\"pl-s1\">sidebar<\/span>.<span class=\"pl-en\">title<\/span>(<span class=\"pl-s\">\"Forecasting Studio\"<\/span>)<\/td>\n<td id=\"file-forecasting_studio_app-py-LC12\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecasting_studio_app-py-L13\" class=\"blob-num js-line-number\" data-line-number=\"13\"><span class=\"pl-s1\">selection<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">st<\/span>.<span class=\"pl-s1\">sidebar<\/span>.<span class=\"pl-en\">selectbox<\/span>(<span class=\"pl-s\">\"\"<\/span>, <span class=\"pl-en\">list<\/span>(<span class=\"pl-v\">PAGES<\/span>.<span class=\"pl-en\">keys<\/span>()))<\/td>\n<td id=\"file-forecasting_studio_app-py-LC13\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecasting_studio_app-py-L14\" class=\"blob-num js-line-number\" data-line-number=\"14\"><span class=\"pl-s1\">page<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">PAGES<\/span>[<span class=\"pl-s1\">selection<\/span>]<\/td>\n<td id=\"file-forecasting_studio_app-py-LC14\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecasting_studio_app-py-L15\" class=\"blob-num js-line-number\" data-line-number=\"15\"><span class=\"pl-en\">write_page<\/span>(<span class=\"pl-s1\">page<\/span>)<\/td>\n<td id=\"file-forecasting_studio_app-py-LC15\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecasting_studio_app-py-L16\" class=\"blob-num js-line-number\" data-line-number=\"16\"><\/td>\n<td id=\"file-forecasting_studio_app-py-LC16\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecasting_studio_app-py-L17\" class=\"blob-num js-line-number\" data-line-number=\"17\"><span class=\"pl-k\">if<\/span> <span class=\"pl-s1\">__name__<\/span> <span class=\"pl-c1\">==<\/span> <span class=\"pl-s\">\"__main__\"<\/span>:<\/td>\n<td id=\"file-forecasting_studio_app-py-LC17\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecasting_studio_app-py-L18\" class=\"blob-num js-line-number\" data-line-number=\"18\"><span class=\"pl-s1\">st<\/span>.<span class=\"pl-en\">set_page_config<\/span>(<span class=\"pl-s1\">layout<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">\"wide\"<\/span>)<\/td>\n<td id=\"file-forecasting_studio_app-py-LC18\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecasting_studio_app-py-L19\" class=\"blob-num js-line-number\" data-line-number=\"19\"><span class=\"pl-en\">main<\/span>()<\/td>\n<td id=\"file-forecasting_studio_app-py-LC19\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div><div class=\"fusion-text fusion-text-22\"><p>The configuration file, that we gather the colors and different configs for all your Plotly figures.<\/p>\n<\/div><div class=\"fusion-text fusion-text-23\"><div class=\"code\">\n<table class=\"highlight tab-size js-file-line-container\" data-tab-size=\"8\" data-paste-markdown-skip=\"\">\n<tbody>\n<tr>\n<td id=\"file-config-py-LC1\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-v\">X_AXIS_TEMPLATE<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">dict<\/span>(<span class=\"pl-s1\">showline<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-c1\">True<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-config-py-L2\" class=\"blob-num js-line-number\" data-line-number=\"2\"><\/td>\n<td id=\"file-config-py-LC2\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">showgrid<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-c1\">False<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-config-py-L3\" class=\"blob-num js-line-number\" data-line-number=\"3\"><\/td>\n<td id=\"file-config-py-LC3\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">showticklabels<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-c1\">True<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-config-py-L4\" class=\"blob-num js-line-number\" data-line-number=\"4\"><\/td>\n<td id=\"file-config-py-LC4\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">linecolor<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8220;grey&#8221;<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-config-py-L5\" class=\"blob-num js-line-number\" data-line-number=\"5\"><\/td>\n<td id=\"file-config-py-LC5\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">linewidth<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-c1\">2<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-config-py-L6\" class=\"blob-num js-line-number\" data-line-number=\"6\"><\/td>\n<td id=\"file-config-py-LC6\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">ticks<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8220;outside&#8221;<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-config-py-L7\" class=\"blob-num js-line-number\" data-line-number=\"7\"><\/td>\n<td id=\"file-config-py-LC7\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">tickfont<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-en\">dict<\/span>(<span class=\"pl-s1\">family<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8220;Arial&#8221;<\/span>, <span class=\"pl-s1\">size<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-c1\">12<\/span>, <span class=\"pl-s1\">color<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8220;rgb(82, 82, 82)&#8221;<\/span>))<\/td>\n<\/tr>\n<tr>\n<td id=\"file-config-py-L8\" class=\"blob-num js-line-number\" data-line-number=\"8\"><\/td>\n<td id=\"file-config-py-LC8\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-config-py-L9\" class=\"blob-num js-line-number\" data-line-number=\"9\"><\/td>\n<td id=\"file-config-py-LC9\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-v\">Y_AXIS_TEMPLATE<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">dict<\/span>(<span class=\"pl-s1\">showline<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-c1\">True<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-config-py-L10\" class=\"blob-num js-line-number\" data-line-number=\"10\"><\/td>\n<td id=\"file-config-py-LC10\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">showgrid<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-c1\">True<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-config-py-L11\" class=\"blob-num js-line-number\" data-line-number=\"11\"><\/td>\n<td id=\"file-config-py-LC11\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">linecolor<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8220;grey&#8221;<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-config-py-L12\" class=\"blob-num js-line-number\" data-line-number=\"12\"><\/td>\n<td id=\"file-config-py-LC12\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">gridcolor<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8220;lightgrey&#8221;<\/span>)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-config-py-L13\" class=\"blob-num js-line-number\" data-line-number=\"13\"><\/td>\n<td id=\"file-config-py-LC13\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-config-py-L14\" class=\"blob-num js-line-number\" data-line-number=\"14\"><\/td>\n<td id=\"file-config-py-LC14\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-v\">LEGEND<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">dict<\/span>(<span class=\"pl-s1\">orientation<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8220;h&#8221;<\/span>, <span class=\"pl-s1\">yanchor<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8220;bottom&#8221;<\/span>, <span class=\"pl-s1\">y<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-c1\">1.02<\/span>, <span class=\"pl-s1\">xanchor<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8220;right&#8221;<\/span>, <span class=\"pl-s1\">x<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-c1\">1<\/span>)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-config-py-L15\" class=\"blob-num js-line-number\" data-line-number=\"15\"><\/td>\n<td id=\"file-config-py-LC15\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-config-py-L16\" class=\"blob-num js-line-number\" data-line-number=\"16\"><\/td>\n<td id=\"file-config-py-LC16\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-v\">COLORDISCRETE<\/span> <span class=\"pl-c1\">=<\/span> [<span class=\"pl-s\">&#8220;#002244&#8221;<\/span>, <span class=\"pl-s\">&#8220;#ff0066&#8221;<\/span>, <span class=\"pl-s\">&#8220;#66cccc&#8221;<\/span>, <span class=\"pl-s\">&#8220;#ff9933&#8221;<\/span>, <span class=\"pl-s\">&#8220;#337788&#8221;<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-config-py-L17\" class=\"blob-num js-line-number\" data-line-number=\"17\"><\/td>\n<td id=\"file-config-py-LC17\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s\">&#8220;#429e79&#8221;<\/span>, <span class=\"pl-s\">&#8220;#474747&#8221;<\/span>, <span class=\"pl-s\">&#8220;#f7d126&#8221;<\/span>, <span class=\"pl-s\">&#8220;#ee5eab&#8221;<\/span>, <span class=\"pl-s\">&#8220;#b8b8b8&#8221;<\/span>]<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div><div class=\"fusion-text fusion-text-24\"><p>2.Building \u201cEvolution of Forecast Accuracy visualization\u201d<br \/>\nFirst we will gather our Plotly figures in one script:<\/p>\n<\/div><div class=\"fusion-text fusion-text-25\"><div class=\"code\">\n<table class=\"highlight tab-size js-file-line-container\" data-tab-size=\"8\" data-paste-markdown-skip=\"\">\n<tbody>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-LC1\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-k\">import<\/span> <span class=\"pl-s1\">pandas<\/span> <span class=\"pl-k\">as<\/span> <span class=\"pl-s1\">pd<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L2\" class=\"blob-num js-line-number\" data-line-number=\"2\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC2\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-k\">from<\/span> <span class=\"pl-s1\">typing<\/span> <span class=\"pl-k\">import<\/span> <span class=\"pl-v\">List<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L3\" class=\"blob-num js-line-number\" data-line-number=\"3\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC3\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-k\">import<\/span> <span class=\"pl-s1\">plotly<\/span>.<span class=\"pl-s1\">graph_objects<\/span> <span class=\"pl-k\">as<\/span> <span class=\"pl-s1\">go<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L4\" class=\"blob-num js-line-number\" data-line-number=\"4\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC4\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L5\" class=\"blob-num js-line-number\" data-line-number=\"5\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC5\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-k\">from<\/span> <span class=\"pl-s1\">config<\/span> <span class=\"pl-k\">import<\/span> <span class=\"pl-v\">COLORDISCRETE<\/span>, <span class=\"pl-v\">LEGEND<\/span>, <span class=\"pl-v\">X_AXIS_TEMPLATE<\/span>, <span class=\"pl-v\">Y_AXIS_TEMPLATE<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L6\" class=\"blob-num js-line-number\" data-line-number=\"6\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC6\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L7\" class=\"blob-num js-line-number\" data-line-number=\"7\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC7\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-k\">def<\/span> <span class=\"pl-en\">fig_evolution_of_fa<\/span>(<span class=\"pl-s1\">forecasts_per_target_date<\/span>: <span class=\"pl-s1\">pd<\/span>.<span class=\"pl-v\">DataFrame<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L8\" class=\"blob-num js-line-number\" data-line-number=\"8\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC8\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">events<\/span>: <span class=\"pl-v\">List<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">None<\/span>) <span class=\"pl-c1\">-&gt;<\/span> <span class=\"pl-s1\">go<\/span>.<span class=\"pl-v\">Figure<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L9\" class=\"blob-num js-line-number\" data-line-number=\"9\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC9\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s\">&#8220;&#8221;&#8221;Figure representing the evolution of the Forecast Accuracy<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L10\" class=\"blob-num js-line-number\" data-line-number=\"10\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC10\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s\"> on the backtest period<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L11\" class=\"blob-num js-line-number\" data-line-number=\"11\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC11\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L12\" class=\"blob-num js-line-number\" data-line-number=\"12\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC12\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s\"> Parameters<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L13\" class=\"blob-num js-line-number\" data-line-number=\"13\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC13\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s\"> &#8212;&#8212;&#8212;-<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L14\" class=\"blob-num js-line-number\" data-line-number=\"14\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC14\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s\"> forecasts_per_target_date : pd.DataFrame<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L15\" class=\"blob-num js-line-number\" data-line-number=\"15\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC15\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s\"> Forecast dataset containing at least 3 columns :<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L16\" class=\"blob-num js-line-number\" data-line-number=\"16\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC16\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s\"> &#8211; &#8216;target_date&#8217; : the date for which you forecast<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L17\" class=\"blob-num js-line-number\" data-line-number=\"17\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC17\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s\"> &#8211; &#8216;forecast_accuracy&#8217; : your accuracy KPI<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L18\" class=\"blob-num js-line-number\" data-line-number=\"18\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC18\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s\"> &#8211; &#8216;week_nb&#8217; : week ID (from 0 to 52)<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L19\" class=\"blob-num js-line-number\" data-line-number=\"19\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC19\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s\"> &#8211; (optional) &#8216;demand_planner_forecast_accuracy&#8217; : your baseline forecast<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L20\" class=\"blob-num js-line-number\" data-line-number=\"20\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC20\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s\"> Primary Key : &#8216;target_date&#8217;<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L21\" class=\"blob-num js-line-number\" data-line-number=\"21\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC21\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s\"> events : List, optional<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L22\" class=\"blob-num js-line-number\" data-line-number=\"22\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC22\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s\"> a list of couple of dates, representing periods, by default None<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L23\" class=\"blob-num js-line-number\" data-line-number=\"23\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC23\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s\"> &#8220;&#8221;&#8221;<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L24\" class=\"blob-num js-line-number\" data-line-number=\"24\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC24\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">fig_fa_score<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">go<\/span>.<span class=\"pl-v\">Figure<\/span>()<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L25\" class=\"blob-num js-line-number\" data-line-number=\"25\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC25\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">fig_fa_score<\/span>.<span class=\"pl-en\">add_trace<\/span>(<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L26\" class=\"blob-num js-line-number\" data-line-number=\"26\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC26\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">go<\/span>.<span class=\"pl-v\">Scatter<\/span>(<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L27\" class=\"blob-num js-line-number\" data-line-number=\"27\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC27\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">name<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8220;Model Forecast Accuracy&#8221;<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L28\" class=\"blob-num js-line-number\" data-line-number=\"28\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC28\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">x<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s1\">forecasts_per_target_date<\/span>[<span class=\"pl-s\">&#8216;target_date&#8217;<\/span>],<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L29\" class=\"blob-num js-line-number\" data-line-number=\"29\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC29\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">y<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s1\">forecasts_per_target_date<\/span>[<span class=\"pl-s\">&#8216;forecast_accuracy&#8217;<\/span>],<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L30\" class=\"blob-num js-line-number\" data-line-number=\"30\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC30\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">hovertext<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s1\">forecasts_per_target_date<\/span>[<span class=\"pl-s\">&#8216;week_nb&#8217;<\/span>],<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L31\" class=\"blob-num js-line-number\" data-line-number=\"31\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC31\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">marker_color<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-v\">COLORDISCRETE<\/span>[<span class=\"pl-c1\">0<\/span>]))<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L32\" class=\"blob-num js-line-number\" data-line-number=\"32\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC32\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L33\" class=\"blob-num js-line-number\" data-line-number=\"33\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC33\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-c\"># If you have a baseline, you can add an additional column to your<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L34\" class=\"blob-num js-line-number\" data-line-number=\"34\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC34\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-c\"># dataset to display it on a line plot<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L35\" class=\"blob-num js-line-number\" data-line-number=\"35\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC35\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-k\">if<\/span> <span class=\"pl-s\">&#8216;demand_planner_forecast_accuracy&#8217;<\/span> <span class=\"pl-c1\">in<\/span> <span class=\"pl-s1\">forecasts_per_target_date<\/span>.<span class=\"pl-s1\">columns<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L36\" class=\"blob-num js-line-number\" data-line-number=\"36\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC36\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">fig_fa_score<\/span>.<span class=\"pl-en\">add_trace<\/span>(<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L37\" class=\"blob-num js-line-number\" data-line-number=\"37\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC37\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">go<\/span>.<span class=\"pl-v\">Scatter<\/span>(<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L38\" class=\"blob-num js-line-number\" data-line-number=\"38\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC38\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">name<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8220;Demand Planners Forecast Accuracy&#8221;<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L39\" class=\"blob-num js-line-number\" data-line-number=\"39\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC39\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">x<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s1\">forecasts_per_target_date<\/span>[<span class=\"pl-s\">&#8216;target_date&#8217;<\/span>],<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L40\" class=\"blob-num js-line-number\" data-line-number=\"40\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC40\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">y<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s1\">forecasts_per_target_date<\/span>[<span class=\"pl-s\">&#8216;demand_planner_forecast_accuracy&#8217;<\/span>],<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L41\" class=\"blob-num js-line-number\" data-line-number=\"41\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC41\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">hovertext<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s1\">forecasts_per_target_date<\/span>[<span class=\"pl-s\">&#8216;week_nb&#8217;<\/span>],<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L42\" class=\"blob-num js-line-number\" data-line-number=\"42\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC42\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">marker_color<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-v\">COLORDISCRETE<\/span>[<span class=\"pl-c1\">2<\/span>]))<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L43\" class=\"blob-num js-line-number\" data-line-number=\"43\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC43\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L44\" class=\"blob-num js-line-number\" data-line-number=\"44\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC44\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">fig_fa_score<\/span>.<span class=\"pl-en\">update_xaxes<\/span>(<span class=\"pl-s1\">range<\/span><span class=\"pl-c1\">=<\/span>(<span class=\"pl-en\">min<\/span>(<span class=\"pl-s1\">forecasts_per_target_date<\/span>[<span class=\"pl-s\">&#8216;target_date&#8217;<\/span>]),<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L45\" class=\"blob-num js-line-number\" data-line-number=\"45\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC45\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-en\">max<\/span>(<span class=\"pl-s1\">forecasts_per_target_date<\/span>[<span class=\"pl-s\">&#8216;target_date&#8217;<\/span>])))<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L46\" class=\"blob-num js-line-number\" data-line-number=\"46\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC46\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">fig_fa_score<\/span>.<span class=\"pl-en\">update_traces<\/span>(<span class=\"pl-s1\">mode<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8216;lines+markers&#8217;<\/span>, <span class=\"pl-s1\">line_shape<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8216;spline&#8217;<\/span>)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L47\" class=\"blob-num js-line-number\" data-line-number=\"47\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC47\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">fig_fa_score<\/span>.<span class=\"pl-en\">update_layout<\/span>(<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L48\" class=\"blob-num js-line-number\" data-line-number=\"48\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC48\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">xaxis_title<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8220;Target Date&#8221;<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L49\" class=\"blob-num js-line-number\" data-line-number=\"49\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC49\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">yaxis_title<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8220;FA Score&#8221;<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L50\" class=\"blob-num js-line-number\" data-line-number=\"50\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC50\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">plot_bgcolor<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8216;white&#8217;<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L51\" class=\"blob-num js-line-number\" data-line-number=\"51\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC51\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">legend<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-v\">LEGEND<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L52\" class=\"blob-num js-line-number\" data-line-number=\"52\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC52\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">xaxis<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-v\">X_AXIS_TEMPLATE<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L53\" class=\"blob-num js-line-number\" data-line-number=\"53\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC53\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">yaxis<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-v\">Y_AXIS_TEMPLATE<\/span>)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L54\" class=\"blob-num js-line-number\" data-line-number=\"54\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC54\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L55\" class=\"blob-num js-line-number\" data-line-number=\"55\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC55\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-k\">if<\/span> <span class=\"pl-s1\">events<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L56\" class=\"blob-num js-line-number\" data-line-number=\"56\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC56\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">fig_fa_score<\/span>.<span class=\"pl-en\">update_layout<\/span>(<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L57\" class=\"blob-num js-line-number\" data-line-number=\"57\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC57\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">shapes<\/span><span class=\"pl-c1\">=<\/span>[<span class=\"pl-en\">get_vertical_filled_area<\/span>(<span class=\"pl-s1\">segment<\/span>[<span class=\"pl-c1\">0<\/span>], <span class=\"pl-s1\">segment<\/span>[<span class=\"pl-c1\">1<\/span>], <span class=\"pl-s\">&#8216;rgb(102, 204, 204)&#8217;<\/span>)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L58\" class=\"blob-num js-line-number\" data-line-number=\"58\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC58\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-k\">for<\/span> <span class=\"pl-s1\">segment<\/span> <span class=\"pl-c1\">in<\/span> <span class=\"pl-s1\">events<\/span>])<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L59\" class=\"blob-num js-line-number\" data-line-number=\"59\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC59\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L60\" class=\"blob-num js-line-number\" data-line-number=\"60\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC60\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">fig_fa_score<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L61\" class=\"blob-num js-line-number\" data-line-number=\"61\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC61\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L62\" class=\"blob-num js-line-number\" data-line-number=\"62\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC62\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L63\" class=\"blob-num js-line-number\" data-line-number=\"63\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC63\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-k\">def<\/span> <span class=\"pl-en\">get_vertical_filled_area<\/span>(<span class=\"pl-s1\">start<\/span>: <span class=\"pl-s1\">float<\/span>, <span class=\"pl-s1\">end<\/span>: <span class=\"pl-s1\">float<\/span>, <span class=\"pl-s1\">color<\/span>: <span class=\"pl-s1\">str<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">&#8220;blue&#8221;<\/span>) <span class=\"pl-c1\">-&gt;<\/span> <span class=\"pl-s1\">dict<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L64\" class=\"blob-num js-line-number\" data-line-number=\"64\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC64\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s\">&#8220;&#8221;&#8221;Return a plotly vertical shape dict, used to highlight events on figures&#8221;&#8221;&#8221;<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L65\" class=\"blob-num js-line-number\" data-line-number=\"65\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC65\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-k\">return<\/span> <span class=\"pl-en\">dict<\/span>(<span class=\"pl-s1\">type<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8220;rect&#8221;<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L66\" class=\"blob-num js-line-number\" data-line-number=\"66\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC66\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">xref<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8220;x&#8221;<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L67\" class=\"blob-num js-line-number\" data-line-number=\"67\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC67\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">yref<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8220;paper&#8221;<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L68\" class=\"blob-num js-line-number\" data-line-number=\"68\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC68\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">x0<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s1\">start<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L69\" class=\"blob-num js-line-number\" data-line-number=\"69\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC69\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">y0<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-c1\">0<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L70\" class=\"blob-num js-line-number\" data-line-number=\"70\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC70\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">x1<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s1\">end<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L71\" class=\"blob-num js-line-number\" data-line-number=\"71\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC71\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">y1<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-c1\">1<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L72\" class=\"blob-num js-line-number\" data-line-number=\"72\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC72\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">fillcolor<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s1\">color<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L73\" class=\"blob-num js-line-number\" data-line-number=\"73\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC73\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">layer<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">&#8220;below&#8221;<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L74\" class=\"blob-num js-line-number\" data-line-number=\"74\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC74\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">line_width<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-c1\">0<\/span>,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-fig_forecast_accuracy-py-L75\" class=\"blob-num js-line-number\" data-line-number=\"75\"><\/td>\n<td id=\"file-fig_forecast_accuracy-py-LC75\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">opacity<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-c1\">0.5<\/span>)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div><div class=\"fusion-text fusion-text-26\"><p>We will finally implement our forecast analysis page, that will loads our dataset, distributes our figures on different columns, \u2026<\/p>\n<\/div><div class=\"fusion-text fusion-text-27\"><div class=\"code\">\n<table class=\"highlight tab-size js-file-line-container\" data-tab-size=\"8\" data-paste-markdown-skip=\"\">\n<tbody>\n<tr>\n<td id=\"file-forecast_analysis-py-LC1\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-k\">import<\/span> <span class=\"pl-s1\">pandas<\/span> <span class=\"pl-k\">as<\/span> <span class=\"pl-s1\">pd<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L2\" class=\"blob-num js-line-number\" data-line-number=\"2\"><\/td>\n<td id=\"file-forecast_analysis-py-LC2\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-k\">import<\/span> <span class=\"pl-s1\">streamlit<\/span> <span class=\"pl-k\">as<\/span> <span class=\"pl-s1\">st<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L3\" class=\"blob-num js-line-number\" data-line-number=\"3\"><\/td>\n<td id=\"file-forecast_analysis-py-LC3\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-k\">from<\/span> <span class=\"pl-s1\">forecasting_studio<\/span>.<span class=\"pl-s1\">forecast_analysis<\/span>.<span class=\"pl-s1\">fig_forecast_analysis<\/span> <span class=\"pl-k\">import<\/span> <span class=\"pl-s1\">fig_evolution_of_fa<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L4\" class=\"blob-num js-line-number\" data-line-number=\"4\"><\/td>\n<td id=\"file-forecast_analysis-py-LC4\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L5\" class=\"blob-num js-line-number\" data-line-number=\"5\"><\/td>\n<td id=\"file-forecast_analysis-py-LC5\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-k\">def<\/span> <span class=\"pl-en\">write<\/span>() <span class=\"pl-c1\">-&gt;<\/span> <span class=\"pl-c1\">None<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L6\" class=\"blob-num js-line-number\" data-line-number=\"6\"><\/td>\n<td id=\"file-forecast_analysis-py-LC6\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">st<\/span>.<span class=\"pl-en\">title<\/span>(<span class=\"pl-s\">&#8216;Forecast Analysis&#8217;<\/span>)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L7\" class=\"blob-num js-line-number\" data-line-number=\"7\"><\/td>\n<td id=\"file-forecast_analysis-py-LC7\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L8\" class=\"blob-num js-line-number\" data-line-number=\"8\"><\/td>\n<td id=\"file-forecast_analysis-py-LC8\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">df<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">pd<\/span>.<span class=\"pl-en\">read_csv<\/span>(<span class=\"pl-s\">&#8216;your_dataset.csv&#8217;<\/span>)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L9\" class=\"blob-num js-line-number\" data-line-number=\"9\"><\/td>\n<td id=\"file-forecast_analysis-py-LC9\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L10\" class=\"blob-num js-line-number\" data-line-number=\"10\"><\/td>\n<td id=\"file-forecast_analysis-py-LC10\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-c\"># You can load here some custom events to display<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L11\" class=\"blob-num js-line-number\" data-line-number=\"11\"><\/td>\n<td id=\"file-forecast_analysis-py-LC11\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-c\"># ex : events = [(&#8216;2019-07-01&#8217;, &#8216;2019-09-01&#8217;), (&#8216;2020-07-01&#8217;, &#8216;2020-09-01&#8217;)]<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L12\" class=\"blob-num js-line-number\" data-line-number=\"12\"><\/td>\n<td id=\"file-forecast_analysis-py-LC12\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">events<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">None<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L13\" class=\"blob-num js-line-number\" data-line-number=\"13\"><\/td>\n<td id=\"file-forecast_analysis-py-LC13\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L14\" class=\"blob-num js-line-number\" data-line-number=\"14\"><\/td>\n<td id=\"file-forecast_analysis-py-LC14\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">evo_cont1<\/span>, <span class=\"pl-s1\">evo_cont2<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">st<\/span>.<span class=\"pl-en\">beta_columns<\/span>(<span class=\"pl-c1\">2<\/span>)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L15\" class=\"blob-num js-line-number\" data-line-number=\"15\"><\/td>\n<td id=\"file-forecast_analysis-py-LC15\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">evo_cont1<\/span>.<span class=\"pl-en\">subheader<\/span>(<span class=\"pl-s\">&#8216;Evolution of Forecast Accuracy&#8217;<\/span>)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L16\" class=\"blob-num js-line-number\" data-line-number=\"16\"><\/td>\n<td id=\"file-forecast_analysis-py-LC16\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L17\" class=\"blob-num js-line-number\" data-line-number=\"17\"><\/td>\n<td id=\"file-forecast_analysis-py-LC17\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">fig_evo_fa<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">fig_evolution_of_fa<\/span>(<span class=\"pl-s1\">df<\/span>, <span class=\"pl-s1\">events<\/span>)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L18\" class=\"blob-num js-line-number\" data-line-number=\"18\"><\/td>\n<td id=\"file-forecast_analysis-py-LC18\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-s1\">evo_cont1<\/span>.<span class=\"pl-en\">plolty_fig<\/span>(<span class=\"pl-s1\">fig_evo_fa<\/span>)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L19\" class=\"blob-num js-line-number\" data-line-number=\"19\"><\/td>\n<td id=\"file-forecast_analysis-py-LC19\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L20\" class=\"blob-num js-line-number\" data-line-number=\"20\"><\/td>\n<td id=\"file-forecast_analysis-py-LC20\" class=\"blob-code blob-code-inner js-file-line\"><\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L21\" class=\"blob-num js-line-number\" data-line-number=\"21\"><\/td>\n<td id=\"file-forecast_analysis-py-LC21\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-k\">if<\/span> <span class=\"pl-s1\">__name__<\/span> <span class=\"pl-c1\">==<\/span> <span class=\"pl-s\">&#8220;__main__&#8221;<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-forecast_analysis-py-L22\" class=\"blob-num js-line-number\" data-line-number=\"22\"><\/td>\n<td id=\"file-forecast_analysis-py-LC22\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-en\">write<\/span>()<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div><div class=\"fusion-text fusion-text-28\"><p>Tadam ! Here is our app :<\/p>\n<\/div><div class=\"fusion-image-element\" style=\"--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-3 hover-type-none\"><img decoding=\"async\" width=\"700\" height=\"348\" title=\"1_wbJjScXOzrhOpMO9ENc16w\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/09\/1_wbJjScXOzrhOpMO9ENc16w.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/09\/1_wbJjScXOzrhOpMO9ENc16w.png\" alt class=\"lazyload img-responsive wp-image-62934\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27700%27%20height%3D%27348%27%20viewBox%3D%270%200%20700%20348%27%3E%3Crect%20width%3D%27700%27%20height%3D%27348%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/09\/1_wbJjScXOzrhOpMO9ENc16w-200x99.png 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/09\/1_wbJjScXOzrhOpMO9ENc16w-400x199.png 400w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/09\/1_wbJjScXOzrhOpMO9ENc16w-600x298.png 600w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/09\/1_wbJjScXOzrhOpMO9ENc16w.png 700w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 640px) 100vw, 700px\" \/><\/span><\/div><div class=\"fusion-text fusion-text-29\"><p>Let\u2019s take a look at the presented figure. Regarding the previous points we discussed, here are the key points of our figure :<\/p>\n<\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-8 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">First, it allows us to spot quickly weeks for which our model is not accurate: December seems to be a complicated month to forecast. The end of our backtest period is also a problem for our model. We need to discuss with the business to understand which effects are ruling those weeks, and adapt the model consequently.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">The figure has also a parameter called \u201cevents\u201d, a list of pair of dates, representing global events, and allowing us to highlight events such as school holidays. We can quickly spot that our worst week is a holiday week. Perhaps some warehouses closed during this period, or customers ordered more than usual to prepare the beginning of the year&#8230; Again, business owners can surely add an external eye on those weeks.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">As you can see that two series are displayed. In our case, it represents the accuracy of our model and Demand Planners\u2019 one on the same period. Regarding the figure, we can see that the worst weeks are also complicated weeks for Demand Planners. The greatest drop in April has been well forecasted by our model. The end of the backtest period seems more complicated for our model, while demand planners\u2019 accuracy seems stable.<\/div><\/li><\/ul><div class=\"fusion-title title fusion-title-8 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">Conclusion:<\/h2><\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-9 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">EDA is key when evaluating your forecasting model<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">Group all your figures in a unique dashboard allows you to focus on iterations, and thus gain in efficiency<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">The dashboard allows you to focus on key scopes, spot axes of improvement quickly.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p>You have just implemented the core structure of your dashboard, go ahead and add new figures !<\/p>\n<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-30\"><p>Once you have build your visualization tool, it is time to deploy it. Here is a great ressource to share your app :\u00a0<a class=\"bv jx\" href=\"https:\/\/medium.com\/artefact-engineering-and-data-science\/how-to-deploy-and-secure-your-streamlit-app-on-gcp-4ab5fd873ed0\" rel=\"noopener\" target=\"_blank\">How to deploy and secure your Streamlit App in GCP?<\/a><\/p>\n<p>Thanks a lot for reading up to now, do not hesitate to reach out if you have any questions. You can find more about our projects by visiting our\u00a0<a class=\"bv jx\" href=\"https:\/\/medium.com\/artefact-engineering-and-data-science\" rel=\"noopener\" target=\"_blank\">blog<\/a>.<\/p>\n<\/div><\/div><\/div><\/div><\/article><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-5 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-margin-top:40px;--awb-margin-bottom:40px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-center fusion-flex-justify-content-center fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-4 fusion_builder_column_1_1 1_1 fusion-flex-column fusion-flex-align-self-center\" style=\"--awb-padding-top:40px;--awb-padding-right:40px;--awb-padding-bottom:40px;--awb-padding-left:40px;--awb-overflow:hidden;--awb-bg-position:left center;--awb-bg-size:cover;--awb-border-color:rgba(10,17,40,0.1);--awb-border-style:solid;--awb-border-radius:4px 4px 4px 4px;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper lazyload fusion-column-has-shadow fusion-flex-justify-content-center fusion-content-layout-column fusion-column-has-bg-image\" data-bg-url=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/03\/background.jpg\" data-bg=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/03\/background.jpg\"><div class=\"fusion-image-element\" style=\"text-align:center;--awb-margin-right:20px;--awb-margin-left:20px;--awb-max-width:150px;--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-4 hover-type-none\"><img decoding=\"async\" width=\"72\" height=\"41\" title=\"medium\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%2772%27%20height%3D%2741%27%20viewBox%3D%270%200%2072%2041%27%3E%3Crect%20width%3D%2772%27%20height%3D%2741%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/03\/medium.png\" alt class=\"lazyload img-responsive wp-image-60927\"\/><\/span><\/div><div class=\"fusion-title title fusion-title-9 fusion-sep-none fusion-title-center fusion-title-text fusion-title-size-three\" style=\"--awb-margin-top:20px;--awb-margin-bottom:0px;--awb-margin-bottom-small:8px;\"><h3 class=\"fusion-title-heading title-heading-center fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:20;line-height:1.2;\">Medium Blog by Artefact.<\/h3><\/div><div class=\"fusion-text fusion-text-31\" style=\"--awb-content-alignment:center;\"><p>This article was initially published on <strong>Medium.com<\/strong>.<br \/>\nFollow us on our Medium Blog !<\/p>\n<\/div><div style=\"text-align:center;\"><a class=\"fusion-button button-flat button-medium button-default fusion-button-default button-1 fusion-button-default-span fusion-button-default-type\" target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/medium.com\/artefact-engineering-and-data-science\/the-path-to-developing-a-high-performance-demand-forecasting-model-part-3-fb1bd435c869\"><span class=\"fusion-button-text awb-button__text awb-button__text--default\">Read Our Article<\/span><\/a><\/div><\/div><\/div><\/div><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>2021\u5e749\u670810\u65e5<br \/>\n\u5982\u4f55\u9009\u62e9\u6b63\u786e\u7684\u53ef\u89c6\u5316\u65b9\u6cd5\u5e76\u5728 Streamlit \u4e2d\u5b9e\u65bd\uff0c\u4ee5\u66f4\u597d\u5730\u8c03\u8bd5\u9884\u6d4b\u6a21\u578b<\/p>","protected":false},"featured_media":62909,"parent":0,"template":"","meta":{"_acf_changed":false,"ep_exclude_from_search":false},"blog-category":[22035],"blog-language":[2991],"class_list":["post-62907","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog-category-data-ai-consulting","blog-language-en"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.artefact.com\/zh\/wp-json\/wp\/v2\/blog\/62907","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.artefact.com\/zh\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.artefact.com\/zh\/wp-json\/wp\/v2\/types\/blog"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.artefact.com\/zh\/wp-json\/wp\/v2\/media\/62909"}],"wp:attachment":[{"href":"https:\/\/www.artefact.com\/zh\/wp-json\/wp\/v2\/media?parent=62907"}],"wp:term":[{"taxonomy":"blog-category","embeddable":true,"href":"https:\/\/www.artefact.com\/zh\/wp-json\/wp\/v2\/blog-category?post=62907"},{"taxonomy":"blog-language","embeddable":true,"href":"https:\/\/www.artefact.com\/zh\/wp-json\/wp\/v2\/blog-language?post=62907"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}