{"id":145,"date":"2020-08-30T11:19:10","date_gmt":"2020-08-30T11:19:10","guid":{"rendered":"https:\/\/machine-learning.webcloning.com\/2020\/08\/30\/time-series-forecasting-with-prophet-in-python\/"},"modified":"2020-08-30T11:19:10","modified_gmt":"2020-08-30T11:19:10","slug":"time-series-forecasting-with-prophet-in-python","status":"publish","type":"post","link":"https:\/\/salarydistribution.com\/machine-learning\/2020\/08\/30\/time-series-forecasting-with-prophet-in-python\/","title":{"rendered":"Time Series Forecasting With Prophet in Python"},"content":{"rendered":"<div id=\"\">\n<p>Time series forecasting can be challenging as there are many different methods you could use and many different hyperparameters for each method.<\/p>\n<p>The Prophet library is an open-source library designed for making forecasts for univariate time series datasets. It is easy to use and designed to automatically find a good set of hyperparameters for the model in an effort to make skillful forecasts for data with trends and seasonal structure by default.<\/p>\n<p>In this tutorial, you will discover how to use the Facebook Prophet library for time series forecasting.<\/p>\n<p>After completing this tutorial, you will know:<\/p>\n<ul>\n<li>Prophet is an open-source library developed by Facebook and designed for automatic forecasting of univariate time series data.<\/li>\n<li>How to fit Prophet models and use them to make in-sample and out-of-sample forecasts.<\/li>\n<li>How to evaluate a Prophet model on a hold-out dataset.<\/li>\n<\/ul>\n<p>Let\u2019s get started.<\/p>\n<div id=\"attachment_10429\" class=\"wp-caption aligncenter\">\n<img decoding=\"async\" aria-describedby=\"caption-attachment-10429\" loading=\"lazy\" class=\"size-full wp-image-10429\" src=\"https:\/\/3qeqpr26caki16dnhd19sv6by6v-wpengine.netdna-ssl.com\/wp-content\/uploads\/2020\/06\/Time-Series-Forecasting-With-Prophet-in-Python.jpg\" alt=\"Time Series Forecasting With Prophet in Python\" width=\"800\" height=\"531\"><\/p>\n<p id=\"caption-attachment-10429\" class=\"wp-caption-text\">Time Series Forecasting With Prophet in Python<br \/>Photo by <a href=\"https:\/\/flickr.com\/photos\/wurglitsch\/9466317145\/\">Rinaldo Wurglitsch<\/a>, some rights reserved.<\/p>\n<\/div>\n<h2>Tutorial Overview<\/h2>\n<p>This tutorial is divided into three parts; they are:<\/p>\n<ol>\n<li>Prophet Forecasting Library<\/li>\n<li>Car Sales Dataset\n<ol>\n<li>Load and Summarize Dataset<\/li>\n<li>Load and Plot Dataset<\/li>\n<\/ol>\n<\/li>\n<li>Forecast Car Sales With Prophet\n<ol>\n<li>Fit Prophet Model<\/li>\n<li>Make an In-Sample Forecast<\/li>\n<li>Make an Out-of-Sample Forecast<\/li>\n<li>Manually Evaluate Forecast Model<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<h2>Prophet Forecasting Library<\/h2>\n<p><a href=\"https:\/\/github.com\/facebook\/prophet\">Prophet<\/a>, or \u201c<em>Facebook Prophet<\/em>,\u201d is an open-source library for univariate (one variable) time series forecasting developed by Facebook.<\/p>\n<p>Prophet implements what they refer to as an <a href=\"https:\/\/en.wikipedia.org\/wiki\/Additive_model\">additive time series forecasting model<\/a>, and the implementation supports trends, seasonality, and holidays.<\/p>\n<blockquote>\n<p>Implements a procedure for forecasting time series data based on an additive model where non-linear trends are fit with yearly, weekly, and daily seasonality, plus holiday effects<\/p>\n<\/blockquote>\n<p>\u2014 <a href=\"https:\/\/cran.r-project.org\/web\/packages\/prophet\/prophet.pdf\">Package \u2018prophet\u2019<\/a>, 2019.<\/p>\n<p>It is designed to be easy and completely automatic, e.g. point it at a time series and get a forecast. As such, it is intended for internal company use, such as forecasting sales, capacity, etc.<\/p>\n<p>For a great overview of Prophet and its capabilities, see the post:<\/p>\n<p>The library provides two interfaces, including R and Python. We will focus on the Python interface in this tutorial.<\/p>\n<p>The first step is to install the Prophet library using Pip, as follows:<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a6435328287896176\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\nsudo pip install fbprophet<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p>sudo pip install fbprophet<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0001 seconds] --><\/p>\n<p>Next, we can confirm that the library was installed correctly.<\/p>\n<p>To do this, we can import the library and print the version number in Python. The complete example is listed below.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a643532c491282137\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n# check prophet version<br \/>\nimport fbprophet<br \/>\n# print version number<br \/>\nprint(&#8216;Prophet %s&#8217; % fbprophet.__version__)<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-p\"># check prophet version<\/span><\/p>\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-i\">fbprophet<\/span><\/p>\n<p><span class=\"crayon-p\"># print version number<\/span><\/p>\n<p><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8216;Prophet %s&#8217;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">%<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">fbprophet<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">__version__<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0001 seconds] --><\/p>\n<p>Running the example prints the installed version of Prophet.<\/p>\n<p>You should have the same version or higher.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<p><!-- [Format Time: 0.0000 seconds] --><\/p>\n<p>Now that we have Prophet installed, let\u2019s select a dataset we can use to explore using the library.<\/p>\n<h2>Car Sales Dataset<\/h2>\n<p>We will use the monthly car sales dataset.<\/p>\n<p>It is a standard univariate time series dataset that contains both a trend and seasonality. The dataset has 108 months of data and a naive persistence forecast can achieve a mean absolute error of about 3,235 sales, providing a lower error limit.<\/p>\n<p>No need to download the dataset as we will download it automatically as part of each example.<\/p>\n<h3>Load and Summarize Dataset<\/h3>\n<p>First, let\u2019s load and summarize the dataset.<\/p>\n<p>Prophet requires data to be in Pandas DataFrames. Therefore, we will load and summarize the data using Pandas.<\/p>\n<p>We can load the data directly from the URL by calling the <a href=\"https:\/\/pandas.pydata.org\/pandas-docs\/stable\/reference\/api\/pandas.read_csv.html\">read_csv() Pandas function<\/a>, then summarize the shape (number of rows and columns) of the data and view the first few rows of data.<\/p>\n<p>The complete example is listed below.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a643532e056822550\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n# load the car sales dataset<br \/>\nfrom pandas import read_csv<br \/>\n# load data<br \/>\npath = &#8216;https:\/\/raw.githubusercontent.com\/jbrownlee\/Datasets\/master\/monthly-car-sales.csv&#8217;<br \/>\ndf = read_csv(path, header=0)<br \/>\n# summarize shape<br \/>\nprint(df.shape)<br \/>\n# show first few rows<br \/>\nprint(df.head())<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-p\"># load the car sales dataset<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">pandas <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-v\">read<\/span><span class=\"crayon-sy\">_<\/span>csv<\/p>\n<p><span class=\"crayon-p\"># load data<\/span><\/p>\n<p><span class=\"crayon-v\">path<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;https:\/\/raw.githubusercontent.com\/jbrownlee\/Datasets\/master\/monthly-car-sales.csv&#8217;<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">read_csv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">path<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">header<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># summarize shape<\/span><\/p>\n<p><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">shape<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># show first few rows<\/span><\/p>\n<p><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">head<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0002 seconds] --><\/p>\n<p>Running the example first reports the number of rows and columns, then lists the first five rows of data.<\/p>\n<p>We can see that as we expected, there are 108 months worth of data and two columns. The first column is the date and the second is the number of sales.<\/p>\n<p>Note that the first column in the output is a row index and is not a part of the dataset, just a helpful tool that Pandas uses to order rows.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a643532f425534475\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n(108, 2)<br \/>\n     Month  Sales<br \/>\n0  1960-01   6550<br \/>\n1  1960-02   8728<br \/>\n2  1960-03  12026<br \/>\n3  1960-04  14395<br \/>\n4  1960-05  14587<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p>(108, 2)<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 Month\u00a0\u00a0Sales<\/p>\n<p>0\u00a0\u00a01960-01\u00a0\u00a0 6550<\/p>\n<p>1\u00a0\u00a01960-02\u00a0\u00a0 8728<\/p>\n<p>2\u00a0\u00a01960-03\u00a0\u00a012026<\/p>\n<p>3\u00a0\u00a01960-04\u00a0\u00a014395<\/p>\n<p>4\u00a0\u00a01960-05\u00a0\u00a014587<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0000 seconds] --><\/p>\n<h3>Load and Plot Dataset<\/h3>\n<p>A time-series dataset does not make sense to us until we plot it.<\/p>\n<p>Plotting a time series helps us actually see if there is a trend, a seasonal cycle, outliers, and more. It gives us a feel for the data.<\/p>\n<p>We can plot the data easily in Pandas by calling the <em>plot()<\/em> function on the DataFrame.<\/p>\n<p>The complete example is listed below.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a6435330302563645\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n# load and plot the car sales dataset<br \/>\nfrom pandas import read_csv<br \/>\nfrom matplotlib import pyplot<br \/>\n# load data<br \/>\npath = &#8216;https:\/\/raw.githubusercontent.com\/jbrownlee\/Datasets\/master\/monthly-car-sales.csv&#8217;<br \/>\ndf = read_csv(path, header=0)<br \/>\n# plot the time series<br \/>\ndf.plot()<br \/>\npyplot.show()<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-p\"># load and plot the car sales dataset<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">pandas <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">read_csv<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">matplotlib <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-i\">pyplot<\/span><\/p>\n<p><span class=\"crayon-p\"># load data<\/span><\/p>\n<p><span class=\"crayon-v\">path<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;https:\/\/raw.githubusercontent.com\/jbrownlee\/Datasets\/master\/monthly-car-sales.csv&#8217;<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">read_csv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">path<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">header<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># plot the time series<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">plot<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">pyplot<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">show<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0002 seconds] --><\/p>\n<p>Running the example creates a plot of the time series.<\/p>\n<p>We can clearly see the trend in sales over time and a monthly seasonal pattern to the sales. These are patterns we expect the forecast model to take into account.<\/p>\n<div id=\"attachment_10425\" class=\"wp-caption aligncenter\">\n<img decoding=\"async\" aria-describedby=\"caption-attachment-10425\" loading=\"lazy\" class=\"size-full wp-image-10425\" src=\"https:\/\/3qeqpr26caki16dnhd19sv6by6v-wpengine.netdna-ssl.com\/wp-content\/uploads\/2020\/02\/Line-Plot-of-Car-Sales-Dataset.png\" alt=\"Line Plot of Car Sales Dataset\" width=\"1280\" height=\"960\"><\/p>\n<p id=\"caption-attachment-10425\" class=\"wp-caption-text\">Line Plot of Car Sales Dataset<\/p>\n<\/div>\n<p>Now that we are familiar with the dataset, let\u2019s explore how we can use the Prophet library to make forecasts.<\/p>\n<h2>Forecast Car Sales With Prophet<\/h2>\n<p>In this section, we will explore using the Prophet to forecast the car sales dataset.<\/p>\n<p>Let\u2019s start by fitting a model on the dataset<\/p>\n<h3>Fit Prophet Model<\/h3>\n<p>To use Prophet for forecasting, first, a <em>Prophet()<\/em> object is defined and configured, then it is fit on the dataset by calling the <em>fit()<\/em> function and passing the data.<\/p>\n<p>The <em>Prophet()<\/em> object takes arguments to configure the type of model you want, such as the type of growth, the type of seasonality, and more. By default, the model will work hard to figure out almost everything automatically.<\/p>\n<p>The <em>fit()<\/em> function takes a <em>DataFrame<\/em> of time series data. The <em>DataFrame<\/em> must have a specific format. The first column must have the name \u2018<em>ds<\/em>\u2018 and contain the date-times. The second column must have the name \u2018<em>y<\/em>\u2018 and contain the observations.<\/p>\n<p>This means we change the column names in the dataset. It also requires that the first column be converted to date-time objects, if they are not already (e.g. this can be down as part of loading the dataset with the right arguments to <em>read_csv<\/em>).<\/p>\n<p>For example, we can modify our loaded car sales dataset to have this expected structure, as follows:<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a6435333489011588\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n&#8230;<br \/>\n# prepare expected column names<br \/>\ndf.columns = [&#8216;ds&#8217;, &#8216;y&#8217;]<br \/>\ndf[&#8216;ds&#8217;]= to_datetime(df[&#8216;ds&#8217;])<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><\/p>\n<p><span class=\"crayon-p\"># prepare expected column names<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">columns<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;y&#8217;<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">to_datetime<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0001 seconds] --><\/p>\n<p>The complete example of fitting a Prophet model on the car sales dataset is listed below.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a6435334007971777\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n# fit prophet model on the car sales dataset<br \/>\nfrom pandas import read_csv<br \/>\nfrom pandas import to_datetime<br \/>\nfrom fbprophet import Prophet<br \/>\n# load data<br \/>\npath = &#8216;https:\/\/raw.githubusercontent.com\/jbrownlee\/Datasets\/master\/monthly-car-sales.csv&#8217;<br \/>\ndf = read_csv(path, header=0)<br \/>\n# prepare expected column names<br \/>\ndf.columns = [&#8216;ds&#8217;, &#8216;y&#8217;]<br \/>\ndf[&#8216;ds&#8217;]= to_datetime(df[&#8216;ds&#8217;])<br \/>\n# define the model<br \/>\nmodel = Prophet()<br \/>\n# fit the model<br \/>\nmodel.fit(df)<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"urvanov-syntax-highlighter-nums-content\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<\/div>\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-p\"># fit prophet model on the car sales dataset<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">pandas <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">read_csv<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">pandas <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">to_datetime<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">fbprophet <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-i\">Prophet<\/span><\/p>\n<p><span class=\"crayon-p\"># load data<\/span><\/p>\n<p><span class=\"crayon-v\">path<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;https:\/\/raw.githubusercontent.com\/jbrownlee\/Datasets\/master\/monthly-car-sales.csv&#8217;<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">read_csv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">path<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">header<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># prepare expected column names<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">columns<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;y&#8217;<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">to_datetime<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># define the model<\/span><\/p>\n<p><span class=\"crayon-v\">model<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Prophet<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># fit the model<\/span><\/p>\n<p><span class=\"crayon-v\">model<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">fit<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0003 seconds] --><\/p>\n<p>Running the example loads the dataset, prepares the DataFrame in the expected format, and fits a Prophet model.<\/p>\n<p>By default, the library provides a lot of verbose output during the fit process. I think it\u2019s a bad idea in general as it trains developers to ignore output.<\/p>\n<p>Nevertheless, the output summarizes what happened during the model fitting process, specifically the optimization processes that ran.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a6435335201872346\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\nINFO:fbprophet:Disabling weekly seasonality. Run prophet with weekly_seasonality=True to override this.<br \/>\nINFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.<br \/>\nInitial log joint probability = -4.39613<br \/>\n    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes<br \/>\n      99       270.121    0.00413718       75.7289           1           1      120<br \/>\n    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes<br \/>\n     179       270.265    0.00019681       84.1622   2.169e-06       0.001      273  LS failed, Hessian reset<br \/>\n     199       270.283   1.38947e-05       87.8642      0.3402           1      299<br \/>\n    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes<br \/>\n     240       270.296    1.6343e-05       89.9117   1.953e-07       0.001      381  LS failed, Hessian reset<br \/>\n     299         270.3   4.73573e-08       74.9719      0.3914           1      455<br \/>\n    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes<br \/>\n     300         270.3   8.25604e-09       74.4478      0.3522      0.3522      456<br \/>\nOptimization terminated normally:<br \/>\n  Convergence detected: absolute parameter change was below tolerance<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"urvanov-syntax-highlighter-nums-content\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<\/div>\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p>INFO:fbprophet:Disabling weekly seasonality. Run prophet with weekly_seasonality=True to override this.<\/p>\n<p>INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.<\/p>\n<p>Initial log joint probability = -4.39613<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0Iter\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0log prob\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0||dx||\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0||grad||\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 alpha\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0alpha0\u00a0\u00a0# evals\u00a0\u00a0Notes<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a099\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 270.121\u00a0\u00a0\u00a0\u00a00.00413718\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 75.7289\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0120<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0Iter\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0log prob\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0||dx||\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0||grad||\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 alpha\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0alpha0\u00a0\u00a0# evals\u00a0\u00a0Notes<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 179\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 270.265\u00a0\u00a0\u00a0\u00a00.00019681\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 84.1622\u00a0\u00a0 2.169e-06\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0.001\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0273\u00a0\u00a0LS failed, Hessian reset<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 199\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 270.283\u00a0\u00a0 1.38947e-05\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 87.8642\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00.3402\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0299<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0Iter\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0log prob\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0||dx||\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0||grad||\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 alpha\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0alpha0\u00a0\u00a0# evals\u00a0\u00a0Notes<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 240\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 270.296\u00a0\u00a0\u00a0\u00a01.6343e-05\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 89.9117\u00a0\u00a0 1.953e-07\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0.001\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0381\u00a0\u00a0LS failed, Hessian reset<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 299\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 270.3\u00a0\u00a0 4.73573e-08\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 74.9719\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00.3914\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0455<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0Iter\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0log prob\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0||dx||\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0||grad||\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 alpha\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0alpha0\u00a0\u00a0# evals\u00a0\u00a0Notes<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 300\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 270.3\u00a0\u00a0 8.25604e-09\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 74.4478\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00.3522\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00.3522\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0456<\/p>\n<p>Optimization terminated normally:<\/p>\n<p>\u00a0\u00a0Convergence detected: absolute parameter change was below tolerance<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0001 seconds] --><\/p>\n<p>I will not reproduce this output in subsequent sections when we fit the model.<\/p>\n<p>Next, let\u2019s make a forecast.<\/p>\n<h3>Make an In-Sample Forecast<\/h3>\n<p>It can be useful to make a forecast on historical data.<\/p>\n<p>That is, we can make a forecast on data used as input to train the model. Ideally, the model has seen the data before and would make a perfect prediction.<\/p>\n<p>Nevertheless, this is not the case as the model tries to generalize across all cases in the data.<\/p>\n<p>This is called making an in-sample (in training set sample) forecast and reviewing the results can give insight into how good the model is. That is, how well it learned the training data.<\/p>\n<p>A forecast is made by calling the <em>predict()<\/em> function and passing a <em>DataFrame<\/em> that contains one column named \u2018<em>ds<\/em>\u2018 and rows with date-times for all the intervals to be predicted.<\/p>\n<p>There are many ways to create this \u201c<em>forecast<\/em>\u201d <em>DataFrame<\/em>. In this case, we will loop over one year of dates, e.g. the last 12 months in the dataset, and create a string for each month. We will then convert the list of dates into a <em>DataFrame<\/em> and convert the string values into date-time objects.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a6435336695590146\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n&#8230;<br \/>\n# define the period for which we want a prediction<br \/>\nfuture = list()<br \/>\nfor i in range(1, 13):<br \/>\n\tdate = &#8216;1968-%02d&#8217; % i<br \/>\n\tfuture.append([date])<br \/>\nfuture = DataFrame(future)<br \/>\nfuture.columns = [&#8216;ds&#8217;]<br \/>\nfuture[&#8216;ds&#8217;]= to_datetime(future[&#8216;ds&#8217;])<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><\/p>\n<p><span class=\"crayon-p\"># define the period for which we want a prediction<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">list<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">i<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">range<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">13<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\t<\/span><span class=\"crayon-v\">date<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;1968-%02d&#8217;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">%<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">i<\/span><\/p>\n<p><span class=\"crayon-h\">\t<\/span><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">append<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">date<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">DataFrame<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">columns<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">to_datetime<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0003 seconds] --><\/p>\n<p>This <em>DataFrame<\/em> can then be provided to the <em>predict()<\/em> function to calculate a forecast.<\/p>\n<p>The result of the predict() function is a <em>DataFrame<\/em> that contains many columns. Perhaps the most important columns are the forecast date time (\u2018<em>ds<\/em>\u2018), the forecasted value (\u2018<em>yhat<\/em>\u2018), and the lower and upper bounds on the predicted value (\u2018<em>yhat_lower<\/em>\u2018 and \u2018<em>yhat_upper<\/em>\u2018) that provide uncertainty of the forecast.<\/p>\n<p>For example, we can print the first few predictions as follows:<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a6435337045165122\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n&#8230;<br \/>\n# summarize the forecast<br \/>\nprint(forecast[[&#8216;ds&#8217;, &#8216;yhat&#8217;, &#8216;yhat_lower&#8217;, &#8216;yhat_upper&#8217;]].head())<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><\/p>\n<p><span class=\"crayon-p\"># summarize the forecast<\/span><\/p>\n<p><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">forecast<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;yhat&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;yhat_lower&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;yhat_upper&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">head<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0001 seconds] --><\/p>\n<p>Prophet also provides a built-in tool for visualizing the prediction in the context of the training dataset.<\/p>\n<p>This can be achieved by calling the <em>plot()<\/em> function on the model and passing it a result DataFrame. It will create a plot of the training dataset and overlay the prediction with the upper and lower bounds for the forecast dates.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a6435338829493352\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n&#8230;<br \/>\nprint(forecast[[&#8216;ds&#8217;, &#8216;yhat&#8217;, &#8216;yhat_lower&#8217;, &#8216;yhat_upper&#8217;]].head())<br \/>\n# plot forecast<br \/>\nmodel.plot(forecast)<br \/>\npyplot.show()<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><\/p>\n<p><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">forecast<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;yhat&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;yhat_lower&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;yhat_upper&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">head<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># plot forecast<\/span><\/p>\n<p><span class=\"crayon-v\">model<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">plot<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">forecast<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">pyplot<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">show<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0002 seconds] --><\/p>\n<p>Tying this all together, a complete example of making an in-sample forecast is listed below.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a6435339436564818\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n# make an in-sample forecast<br \/>\nfrom pandas import read_csv<br \/>\nfrom pandas import to_datetime<br \/>\nfrom pandas import DataFrame<br \/>\nfrom fbprophet import Prophet<br \/>\nfrom matplotlib import pyplot<br \/>\n# load data<br \/>\npath = &#8216;https:\/\/raw.githubusercontent.com\/jbrownlee\/Datasets\/master\/monthly-car-sales.csv&#8217;<br \/>\ndf = read_csv(path, header=0)<br \/>\n# prepare expected column names<br \/>\ndf.columns = [&#8216;ds&#8217;, &#8216;y&#8217;]<br \/>\ndf[&#8216;ds&#8217;]= to_datetime(df[&#8216;ds&#8217;])<br \/>\n# define the model<br \/>\nmodel = Prophet()<br \/>\n# fit the model<br \/>\nmodel.fit(df)<br \/>\n# define the period for which we want a prediction<br \/>\nfuture = list()<br \/>\nfor i in range(1, 13):<br \/>\n\tdate = &#8216;1968-%02d&#8217; % i<br \/>\n\tfuture.append([date])<br \/>\nfuture = DataFrame(future)<br \/>\nfuture.columns = [&#8216;ds&#8217;]<br \/>\nfuture[&#8216;ds&#8217;]= to_datetime(future[&#8216;ds&#8217;])<br \/>\n# use the model to make a forecast<br \/>\nforecast = model.predict(future)<br \/>\n# summarize the forecast<br \/>\nprint(forecast[[&#8216;ds&#8217;, &#8216;yhat&#8217;, &#8216;yhat_lower&#8217;, &#8216;yhat_upper&#8217;]].head())<br \/>\n# plot forecast<br \/>\nmodel.plot(forecast)<br \/>\npyplot.show()<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"urvanov-syntax-highlighter-nums-content\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<\/div>\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-p\"># make an in-sample forecast<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">pandas <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">read_csv<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">pandas <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">to_datetime<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">pandas <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">DataFrame<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">fbprophet <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">Prophet<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">matplotlib <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-i\">pyplot<\/span><\/p>\n<p><span class=\"crayon-p\"># load data<\/span><\/p>\n<p><span class=\"crayon-v\">path<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;https:\/\/raw.githubusercontent.com\/jbrownlee\/Datasets\/master\/monthly-car-sales.csv&#8217;<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">read_csv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">path<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">header<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># prepare expected column names<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">columns<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;y&#8217;<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">to_datetime<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># define the model<\/span><\/p>\n<p><span class=\"crayon-v\">model<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Prophet<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># fit the model<\/span><\/p>\n<p><span class=\"crayon-v\">model<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">fit<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># define the period for which we want a prediction<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">list<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">i<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">range<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">13<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\t<\/span><span class=\"crayon-v\">date<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;1968-%02d&#8217;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">%<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">i<\/span><\/p>\n<p><span class=\"crayon-h\">\t<\/span><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">append<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">date<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">DataFrame<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">columns<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">to_datetime<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># use the model to make a forecast<\/span><\/p>\n<p><span class=\"crayon-v\">forecast<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">model<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">predict<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># summarize the forecast<\/span><\/p>\n<p><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">forecast<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;yhat&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;yhat_lower&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;yhat_upper&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">head<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># plot forecast<\/span><\/p>\n<p><span class=\"crayon-v\">model<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">plot<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">forecast<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">pyplot<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">show<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0009 seconds] --><\/p>\n<p>Running the example forecasts the last 12 months of the dataset.<\/p>\n<p>The first five months of the prediction are reported and we can see that values are not too different from the actual sales values in the dataset.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a643533a127427056\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n          ds          yhat    yhat_lower    yhat_upper<br \/>\n0 1968-01-01  14364.866157  12816.266184  15956.555409<br \/>\n1 1968-02-01  14940.687225  13299.473640  16463.811658<br \/>\n2 1968-03-01  20858.282598  19439.403787  22345.747821<br \/>\n3 1968-04-01  22893.610396  21417.399440  24454.642588<br \/>\n4 1968-05-01  24212.079727  22667.146433  25816.191457<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ds\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0yhat\u00a0\u00a0\u00a0\u00a0yhat_lower\u00a0\u00a0\u00a0\u00a0yhat_upper<\/p>\n<p>0 1968-01-01\u00a0\u00a014364.866157\u00a0\u00a012816.266184\u00a0\u00a015956.555409<\/p>\n<p>1 1968-02-01\u00a0\u00a014940.687225\u00a0\u00a013299.473640\u00a0\u00a016463.811658<\/p>\n<p>2 1968-03-01\u00a0\u00a020858.282598\u00a0\u00a019439.403787\u00a0\u00a022345.747821<\/p>\n<p>3 1968-04-01\u00a0\u00a022893.610396\u00a0\u00a021417.399440\u00a0\u00a024454.642588<\/p>\n<p>4 1968-05-01\u00a0\u00a024212.079727\u00a0\u00a022667.146433\u00a0\u00a025816.191457<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0000 seconds] --><\/p>\n<p>Next, a plot is created. We can see the training data are represented as black dots and the forecast is a blue line with upper and lower bounds in a blue shaded area.<\/p>\n<p>We can see that the forecasted 12 months is a good match for the real observations, especially when the bounds are taken into account.<\/p>\n<div id=\"attachment_10426\" class=\"wp-caption aligncenter\">\n<img decoding=\"async\" aria-describedby=\"caption-attachment-10426\" loading=\"lazy\" class=\"size-full wp-image-10426\" src=\"https:\/\/3qeqpr26caki16dnhd19sv6by6v-wpengine.netdna-ssl.com\/wp-content\/uploads\/2020\/02\/Plot-of-Time-Series-and-In-Sample-Forecast-With-Prophet.png\" alt=\"Plot of Time Series and In-Sample Forecast With Prophet\" width=\"2000\" height=\"1200\"><\/p>\n<p id=\"caption-attachment-10426\" class=\"wp-caption-text\">Plot of Time Series and In-Sample Forecast With Prophet<\/p>\n<\/div>\n<h3>Make an Out-of-Sample Forecast<\/h3>\n<p>In practice, we really want a forecast model to make a prediction beyond the training data.<\/p>\n<p>This is called an out-of-sample forecast.<\/p>\n<p>We can achieve this in the same way as an in-sample forecast and simply specify a different forecast period.<\/p>\n<p>In this case, a period beyond the end of the training dataset, starting 1969-01.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a643533b711257935\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n&#8230;<br \/>\n# define the period for which we want a prediction<br \/>\nfuture = list()<br \/>\nfor i in range(1, 13):<br \/>\n\tdate = &#8216;1969-%02d&#8217; % i<br \/>\n\tfuture.append([date])<br \/>\nfuture = DataFrame(future)<br \/>\nfuture.columns = [&#8216;ds&#8217;]<br \/>\nfuture[&#8216;ds&#8217;]= to_datetime(future[&#8216;ds&#8217;])<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><\/p>\n<p><span class=\"crayon-p\"># define the period for which we want a prediction<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">list<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">i<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">range<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">13<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\t<\/span><span class=\"crayon-v\">date<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;1969-%02d&#8217;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">%<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">i<\/span><\/p>\n<p><span class=\"crayon-h\">\t<\/span><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">append<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">date<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">DataFrame<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">columns<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">to_datetime<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0003 seconds] --><\/p>\n<p>Tying this together, the complete example is listed below.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a643533c530518464\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n# make an out-of-sample forecast<br \/>\nfrom pandas import read_csv<br \/>\nfrom pandas import to_datetime<br \/>\nfrom pandas import DataFrame<br \/>\nfrom fbprophet import Prophet<br \/>\nfrom matplotlib import pyplot<br \/>\n# load data<br \/>\npath = &#8216;https:\/\/raw.githubusercontent.com\/jbrownlee\/Datasets\/master\/monthly-car-sales.csv&#8217;<br \/>\ndf = read_csv(path, header=0)<br \/>\n# prepare expected column names<br \/>\ndf.columns = [&#8216;ds&#8217;, &#8216;y&#8217;]<br \/>\ndf[&#8216;ds&#8217;]= to_datetime(df[&#8216;ds&#8217;])<br \/>\n# define the model<br \/>\nmodel = Prophet()<br \/>\n# fit the model<br \/>\nmodel.fit(df)<br \/>\n# define the period for which we want a prediction<br \/>\nfuture = list()<br \/>\nfor i in range(1, 13):<br \/>\n\tdate = &#8216;1969-%02d&#8217; % i<br \/>\n\tfuture.append([date])<br \/>\nfuture = DataFrame(future)<br \/>\nfuture.columns = [&#8216;ds&#8217;]<br \/>\nfuture[&#8216;ds&#8217;]= to_datetime(future[&#8216;ds&#8217;])<br \/>\n# use the model to make a forecast<br \/>\nforecast = model.predict(future)<br \/>\n# summarize the forecast<br \/>\nprint(forecast[[&#8216;ds&#8217;, &#8216;yhat&#8217;, &#8216;yhat_lower&#8217;, &#8216;yhat_upper&#8217;]].head())<br \/>\n# plot forecast<br \/>\nmodel.plot(forecast)<br \/>\npyplot.show()<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"urvanov-syntax-highlighter-nums-content\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<\/div>\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-p\"># make an out-of-sample forecast<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">pandas <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">read_csv<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">pandas <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">to_datetime<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">pandas <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">DataFrame<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">fbprophet <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">Prophet<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">matplotlib <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-i\">pyplot<\/span><\/p>\n<p><span class=\"crayon-p\"># load data<\/span><\/p>\n<p><span class=\"crayon-v\">path<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;https:\/\/raw.githubusercontent.com\/jbrownlee\/Datasets\/master\/monthly-car-sales.csv&#8217;<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">read_csv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">path<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">header<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># prepare expected column names<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">columns<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;y&#8217;<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">to_datetime<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># define the model<\/span><\/p>\n<p><span class=\"crayon-v\">model<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Prophet<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># fit the model<\/span><\/p>\n<p><span class=\"crayon-v\">model<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">fit<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># define the period for which we want a prediction<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">list<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">i<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">range<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">13<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\t<\/span><span class=\"crayon-v\">date<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;1969-%02d&#8217;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">%<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">i<\/span><\/p>\n<p><span class=\"crayon-h\">\t<\/span><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">append<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">date<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">DataFrame<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">columns<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">to_datetime<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># use the model to make a forecast<\/span><\/p>\n<p><span class=\"crayon-v\">forecast<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">model<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">predict<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># summarize the forecast<\/span><\/p>\n<p><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">forecast<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;yhat&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;yhat_lower&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;yhat_upper&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">head<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># plot forecast<\/span><\/p>\n<p><span class=\"crayon-v\">model<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">plot<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">forecast<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">pyplot<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">show<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0007 seconds] --><\/p>\n<p>Running the example makes an out-of-sample forecast for the car sales data.<\/p>\n<p>The first five rows of the forecast are printed, although it is hard to get an idea of whether they are sensible or not.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a643533d935352141\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n          ds          yhat    yhat_lower    yhat_upper<br \/>\n0 1969-01-01  15406.401318  13751.534121  16789.969780<br \/>\n1 1969-02-01  16165.737458  14486.887740  17634.953132<br \/>\n2 1969-03-01  21384.120631  19738.950363  22926.857539<br \/>\n3 1969-04-01  23512.464086  21939.204670  25105.341478<br \/>\n4 1969-05-01  25026.039276  23544.081762  26718.820580<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ds\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0yhat\u00a0\u00a0\u00a0\u00a0yhat_lower\u00a0\u00a0\u00a0\u00a0yhat_upper<\/p>\n<p>0 1969-01-01\u00a0\u00a015406.401318\u00a0\u00a013751.534121\u00a0\u00a016789.969780<\/p>\n<p>1 1969-02-01\u00a0\u00a016165.737458\u00a0\u00a014486.887740\u00a0\u00a017634.953132<\/p>\n<p>2 1969-03-01\u00a0\u00a021384.120631\u00a0\u00a019738.950363\u00a0\u00a022926.857539<\/p>\n<p>3 1969-04-01\u00a0\u00a023512.464086\u00a0\u00a021939.204670\u00a0\u00a025105.341478<\/p>\n<p>4 1969-05-01\u00a0\u00a025026.039276\u00a0\u00a023544.081762\u00a0\u00a026718.820580<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0000 seconds] --><\/p>\n<p>A plot is created to help us evaluate the prediction in the context of the training data.<\/p>\n<p>The new one-year forecast does look sensible, at least by eye.<\/p>\n<div id=\"attachment_10427\" class=\"wp-caption aligncenter\">\n<img decoding=\"async\" aria-describedby=\"caption-attachment-10427\" loading=\"lazy\" class=\"size-full wp-image-10427\" src=\"https:\/\/3qeqpr26caki16dnhd19sv6by6v-wpengine.netdna-ssl.com\/wp-content\/uploads\/2020\/02\/Plot-of-Time-Series-and-Out-Of-Sample-Forecast-With-Prophet.png\" alt=\"Plot of Time Series and Out-of-Sample Forecast With Prophet\" width=\"2000\" height=\"1200\"><\/p>\n<p id=\"caption-attachment-10427\" class=\"wp-caption-text\">Plot of Time Series and Out-of-Sample Forecast With Prophet<\/p>\n<\/div>\n<h3>Manually Evaluate Forecast Model<\/h3>\n<p>It is critical to develop an objective estimate of a forecast model\u2019s performance.<\/p>\n<p>This can be achieved by holding some data back from the model, such as the last 12 months. Then, fitting the model on the first portion of the data, using it to make predictions on the held-pack portion, and calculating an error measure, such as the mean absolute error across the forecasts. E.g. a simulated out-of-sample forecast.<\/p>\n<p>The score gives an estimate of how well we might expect the model to perform on average when making an out-of-sample forecast.<\/p>\n<p>We can do this with the samples data by creating a new <em>DataFrame<\/em> for training with the last 12 months removed.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a643533e275407877\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n&#8230;<br \/>\n# create test dataset, remove last 12 months<br \/>\ntrain = df.drop(df.index[-12:])<br \/>\nprint(train.tail())<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><\/p>\n<p><span class=\"crayon-p\"># create test dataset, remove last 12 months<\/span><\/p>\n<p><span class=\"crayon-v\">train<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">drop<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">index<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-cn\">12<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">train<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">tail<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0002 seconds] --><\/p>\n<p>A forecast can then be made on the last 12 months of date-times.<\/p>\n<p>We can then retrieve the forecast values and the expected values from the original dataset and calculate a mean absolute error metric using the scikit-learn library.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a6435340849099809\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n&#8230;<br \/>\n# calculate MAE between expected and predicted values for december<br \/>\ny_true = df[&#8216;y&#8217;][-12:].values<br \/>\ny_pred = forecast[&#8216;yhat&#8217;].values<br \/>\nmae = mean_absolute_error(y_true, y_pred)<br \/>\nprint(&#8216;MAE: %.3f&#8217; % mae)<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><\/p>\n<p><span class=\"crayon-p\"># calculate MAE between expected and predicted values for december<\/span><\/p>\n<p><span class=\"crayon-v\">y_true<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;y&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-cn\">12<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">values<\/span><\/p>\n<p><span class=\"crayon-v\">y_pred<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">forecast<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;yhat&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">values<\/span><\/p>\n<p><span class=\"crayon-v\">mae<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">mean_absolute_error<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">y_true<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">y_pred<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8216;MAE: %.3f&#8217;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">%<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">mae<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0002 seconds] --><\/p>\n<p>It can also be helpful to plot the expected vs. predicted values to see how well the out-of-sample prediction matches the known values.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a6435341874464637\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n&#8230;<br \/>\n# plot expected vs actual<br \/>\npyplot.plot(y_true, label=&#8217;Actual&#8217;)<br \/>\npyplot.plot(y_pred, label=&#8217;Predicted&#8217;)<br \/>\npyplot.legend()<br \/>\npyplot.show()<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><\/p>\n<p><span class=\"crayon-p\"># plot expected vs actual<\/span><\/p>\n<p><span class=\"crayon-v\">pyplot<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">plot<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">y_true<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">label<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8216;Actual&#8217;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">pyplot<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">plot<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">y_pred<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">label<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8216;Predicted&#8217;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">pyplot<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">legend<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">pyplot<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">show<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0002 seconds] --><\/p>\n<p>Tying this together, the example below demonstrates how to evaluate a Prophet model on a hold-out dataset.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a6435342990113324\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n# evaluate prophet time series forecasting model on hold out dataset<br \/>\nfrom pandas import read_csv<br \/>\nfrom pandas import to_datetime<br \/>\nfrom pandas import DataFrame<br \/>\nfrom fbprophet import Prophet<br \/>\nfrom sklearn.metrics import mean_absolute_error<br \/>\nfrom matplotlib import pyplot<br \/>\n# load data<br \/>\npath = &#8216;https:\/\/raw.githubusercontent.com\/jbrownlee\/Datasets\/master\/monthly-car-sales.csv&#8217;<br \/>\ndf = read_csv(path, header=0)<br \/>\n# prepare expected column names<br \/>\ndf.columns = [&#8216;ds&#8217;, &#8216;y&#8217;]<br \/>\ndf[&#8216;ds&#8217;]= to_datetime(df[&#8216;ds&#8217;])<br \/>\n# create test dataset, remove last 12 months<br \/>\ntrain = df.drop(df.index[-12:])<br \/>\nprint(train.tail())<br \/>\n# define the model<br \/>\nmodel = Prophet()<br \/>\n# fit the model<br \/>\nmodel.fit(train)<br \/>\n# define the period for which we want a prediction<br \/>\nfuture = list()<br \/>\nfor i in range(1, 13):<br \/>\n\tdate = &#8216;1968-%02d&#8217; % i<br \/>\n\tfuture.append([date])<br \/>\nfuture = DataFrame(future)<br \/>\nfuture.columns = [&#8216;ds&#8217;]<br \/>\nfuture[&#8216;ds&#8217;] = to_datetime(future[&#8216;ds&#8217;])<br \/>\n# use the model to make a forecast<br \/>\nforecast = model.predict(future)<br \/>\n# calculate MAE between expected and predicted values for december<br \/>\ny_true = df[&#8216;y&#8217;][-12:].values<br \/>\ny_pred = forecast[&#8216;yhat&#8217;].values<br \/>\nmae = mean_absolute_error(y_true, y_pred)<br \/>\nprint(&#8216;MAE: %.3f&#8217; % mae)<br \/>\n# plot expected vs actual<br \/>\npyplot.plot(y_true, label=&#8217;Actual&#8217;)<br \/>\npyplot.plot(y_pred, label=&#8217;Predicted&#8217;)<br \/>\npyplot.legend()<br \/>\npyplot.show()<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"urvanov-syntax-highlighter-nums-content\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<p>39<\/p>\n<p>40<\/p>\n<\/div>\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p><span class=\"crayon-p\"># evaluate prophet time series forecasting model on hold out dataset<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">pandas <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">read_csv<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">pandas <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">to_datetime<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">pandas <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">DataFrame<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">fbprophet <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">Prophet<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">sklearn<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">metrics <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">mean_absolute_error<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">matplotlib <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-i\">pyplot<\/span><\/p>\n<p><span class=\"crayon-p\"># load data<\/span><\/p>\n<p><span class=\"crayon-v\">path<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;https:\/\/raw.githubusercontent.com\/jbrownlee\/Datasets\/master\/monthly-car-sales.csv&#8217;<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">read_csv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">path<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">header<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># prepare expected column names<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">columns<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;y&#8217;<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">to_datetime<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># create test dataset, remove last 12 months<\/span><\/p>\n<p><span class=\"crayon-v\">train<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">drop<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">index<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-cn\">12<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">train<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">tail<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># define the model<\/span><\/p>\n<p><span class=\"crayon-v\">model<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Prophet<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># fit the model<\/span><\/p>\n<p><span class=\"crayon-v\">model<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">fit<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">train<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># define the period for which we want a prediction<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">list<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">i<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">range<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">13<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\t<\/span><span class=\"crayon-v\">date<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;1968-%02d&#8217;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">%<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">i<\/span><\/p>\n<p><span class=\"crayon-h\">\t<\/span><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">append<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">date<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">DataFrame<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">columns<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">to_datetime<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;ds&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># use the model to make a forecast<\/span><\/p>\n<p><span class=\"crayon-v\">forecast<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">model<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">predict<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">future<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># calculate MAE between expected and predicted values for december<\/span><\/p>\n<p><span class=\"crayon-v\">y_true<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;y&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-cn\">12<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">values<\/span><\/p>\n<p><span class=\"crayon-v\">y_pred<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">forecast<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;yhat&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">values<\/span><\/p>\n<p><span class=\"crayon-v\">mae<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">mean_absolute_error<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">y_true<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">y_pred<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8216;MAE: %.3f&#8217;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">%<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">mae<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-p\"># plot expected vs actual<\/span><\/p>\n<p><span class=\"crayon-v\">pyplot<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">plot<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">y_true<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">label<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8216;Actual&#8217;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">pyplot<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">plot<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">y_pred<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">label<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8216;Predicted&#8217;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">pyplot<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">legend<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">pyplot<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">show<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0017 seconds] --><\/p>\n<p>Running the example first reports the last few rows of the training dataset.<\/p>\n<p>It confirms the training ends in the last month of 1967 and 1968 will be used as the hold-out dataset.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<div id=\"urvanov-syntax-highlighter-5f4b8a6435343544913709\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<p><textarea class=\"urvanov-syntax-highlighter-plain print-no\" data-settings=\"dblclick\" readonly><br \/>\n           ds      y<br \/>\n91 1967-08-01  13434<br \/>\n92 1967-09-01  13598<br \/>\n93 1967-10-01  17187<br \/>\n94 1967-11-01  16119<br \/>\n95 1967-12-01  13713<\/textarea><\/p>\n<div class=\"urvanov-syntax-highlighter-main\">\n<table class=\"crayon-table\">\n<tr class=\"urvanov-syntax-highlighter-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<\/td>\n<td class=\"urvanov-syntax-highlighter-code\">\n<div class=\"crayon-pre\">\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ds\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0y<\/p>\n<p>91 1967-08-01\u00a0\u00a013434<\/p>\n<p>92 1967-09-01\u00a0\u00a013598<\/p>\n<p>93 1967-10-01\u00a0\u00a017187<\/p>\n<p>94 1967-11-01\u00a0\u00a016119<\/p>\n<p>95 1967-12-01\u00a0\u00a013713<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<p><!-- [Format Time: 0.0000 seconds] --><\/p>\n<p>Next, a mean absolute error is calculated for the forecast period.<\/p>\n<p>In this case we can see that the error is approximately 1,336 sales, which is much lower (better) than a naive persistence model that achieves an error of 3,235 sales over the same period.<\/p>\n<p><!-- Urvanov Syntax Highlighter v2.8.13 --><\/p>\n<p><!-- [Format Time: 0.0000 seconds] --><\/p>\n<p>Finally, a plot is created comparing the actual vs. predicted values. In this case, we can see that the forecast is a good fit. The model has skill and forecast that looks sensible.<\/p>\n<div id=\"attachment_10428\" class=\"wp-caption aligncenter\">\n<img decoding=\"async\" aria-describedby=\"caption-attachment-10428\" loading=\"lazy\" class=\"size-full wp-image-10428\" src=\"https:\/\/3qeqpr26caki16dnhd19sv6by6v-wpengine.netdna-ssl.com\/wp-content\/uploads\/2020\/02\/Plot-of-Actual-vs.-Predicted-Values-for-Last-12-Months-of-Car-Sales.png\" alt=\"Plot of Actual vs. Predicted Values for Last 12 Months of Car Sales\" width=\"1280\" height=\"960\"><\/p>\n<p id=\"caption-attachment-10428\" class=\"wp-caption-text\">Plot of Actual vs. Predicted Values for Last 12 Months of Car Sales<\/p>\n<\/div>\n<p>The Prophet library also provides tools to automatically evaluate models and plot results, although those tools don\u2019t appear to work well with data above one day in resolution.<\/p>\n<h2>Further Reading<\/h2>\n<p>This section provides more resources on the topic if you are looking to go deeper.<\/p>\n<h2>Summary<\/h2>\n<p>In this tutorial, you discovered how to use the Facebook Prophet library for time series forecasting.<\/p>\n<p>Specifically, you learned:<\/p>\n<ul>\n<li>Prophet is an open-source library developed by Facebook and designed for automatic forecasting of univariate time series data.<\/li>\n<li>How to fit Prophet models and use them to make in-sample and out-of-sample forecasts.<\/li>\n<li>How to evaluate a Prophet model on a hold-out dataset.<\/li>\n<\/ul>\n<p><strong>Do you have any questions?<\/strong><br \/>Ask your questions in the comments below and I will do my best to answer.<\/p>\n<div class=\"widget_text awac-wrapper\" id=\"custom_html-64\">\n<div class=\"widget_text awac widget custom_html-64\">\n<div class=\"textwidget custom-html-widget\">\n<div>\n<h2>Want to Develop Time Series Forecasts with Python?<\/h2>\n<p><a href=\"\/introduction-to-time-series-forecasting-with-python\/\" rel=\"nofollow\"><img decoding=\"async\" src=\"https:\/\/3qeqpr26caki16dnhd19sv6by6v-wpengine.netdna-ssl.com\/wp-content\/uploads\/2017\/02\/Introduction-to-Time-Series-Forecasting-With-Python-220.png\" alt=\"Introduction to Time Series Forecasting With Python\" align=\"left\"><\/a><\/p>\n<h4>Develop Your Own Forecasts in Minutes<\/h4>\n<p>&#8230;with just a few lines of python code<\/p>\n<p>Discover how in my new Ebook:<br \/><a href=\"\/introduction-to-time-series-forecasting-with-python\/\" rel=\"nofollow\">Introduction to Time Series Forecasting With Python<\/a><\/p>\n<p>It covers <strong>self-study tutorials<\/strong> and <strong>end-to-end projects<\/strong> on topics like:<br \/>\n\t<em>Loading data, visualization, modeling, algorithm tuning,<\/em> and much more&#8230;<\/p>\n<h4>Finally Bring Time Series Forecasting to<br \/>Your Own Projects<\/h4>\n<p>Skip the Academics. Just Results.<\/p>\n<p><a href=\"\/introduction-to-time-series-forecasting-with-python\/\" class=\"woo-sc-button  red\"><span class=\"woo-\">See What&#8217;s Inside<\/span><\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>https:\/\/machinelearningmastery.com\/time-series-forecasting-with-prophet-in-python\/<\/p>\n","protected":false},"author":0,"featured_media":146,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/posts\/145"}],"collection":[{"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/comments?post=145"}],"version-history":[{"count":0,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/posts\/145\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/media\/146"}],"wp:attachment":[{"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/media?parent=145"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/categories?post=145"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/tags?post=145"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}