prophet/notebooks/saturating_forecasts.ipynb

356 lines
349 KiB
Text
Raw Normal View History

2017-09-02 18:05:51 +00:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"block_hidden": true
2017-09-02 18:05:51 +00:00
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
2020-05-15 04:45:03 +00:00
"/usr/local/lib/python3.7/site-packages/fbprophet-0.6.1.dev0-py3.7.egg/fbprophet/diagnostics.py:10: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n",
" from tqdm.autonotebook import tqdm\n"
]
}
],
2017-09-02 18:05:51 +00:00
"source": [
"%load_ext rpy2.ipython\n",
"%matplotlib inline\n",
"from fbprophet import Prophet\n",
"import pandas as pd\n",
"import logging\n",
"logging.getLogger('fbprophet').setLevel(logging.ERROR)\n",
"import warnings\n",
"warnings.filterwarnings(\"ignore\")"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
2020-05-15 04:45:03 +00:00
"block_hidden": true
2017-09-02 18:05:51 +00:00
},
2020-05-15 04:45:03 +00:00
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"R[write to console]: Loading required package: Rcpp\n",
"\n",
"R[write to console]: Loading required package: rlang\n",
"\n"
]
}
],
2017-09-02 18:05:51 +00:00
"source": [
"%%R\n",
"library(prophet)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Forecasting Growth\n",
"\n",
"By default, Prophet uses a linear model for its forecast. When forecasting growth, there is usually some maximum achievable point: total market size, total population size, etc. This is called the carrying capacity, and the forecast should saturate at this point.\n",
"\n",
"Prophet allows you to make forecasts using a [logistic growth](https://en.wikipedia.org/wiki/Logistic_function) trend model, with a specified carrying capacity. We illustrate this with the log number of page visits to the [R (programming language)](https://en.wikipedia.org/wiki/R_%28programming_language%29) page on Wikipedia:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
2017-09-02 18:05:51 +00:00
"outputs": [],
"source": [
"%%R\n",
"df <- read.csv('../examples/example_wp_log_R.csv')"
2017-09-02 18:05:51 +00:00
]
},
{
"cell_type": "code",
"execution_count": 4,
2017-09-02 20:07:49 +00:00
"metadata": {
"collapsed": true
},
2017-09-02 18:05:51 +00:00
"outputs": [],
"source": [
"df = pd.read_csv('../examples/example_wp_log_R.csv')"
2017-09-02 18:05:51 +00:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We must specify the carrying capacity in a column `cap`. Here we will assume a particular value, but this would usually be set using data or expertise about the market size."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%%R\n",
"df$cap <- 8.5"
2017-09-02 18:05:51 +00:00
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"df['cap'] = 8.5"
2017-09-02 18:05:51 +00:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The important things to note are that `cap` must be specified for every row in the dataframe, and that it does not have to be constant. If the market size is growing, then `cap` can be an increasing sequence.\n",
"\n",
"We then fit the model as before, except pass in an additional argument to specify logistic growth:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"output_hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"Initial log joint probability = -19.9808\n",
"Optimization terminated normally: \n",
" Convergence detected: relative gradient magnitude is below tolerance\n"
2017-09-02 18:05:51 +00:00
]
},
"metadata": {},
"output_type": "display_data"
2017-09-02 18:05:51 +00:00
}
],
"source": [
"%%R\n",
"m <- prophet(df, growth = 'logistic')"
2017-09-02 18:05:51 +00:00
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"output_hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"<fbprophet.forecaster.Prophet at 0x7f52e797fb90>"
2017-09-02 18:05:51 +00:00
]
},
"execution_count": 8,
2017-09-02 18:05:51 +00:00
"metadata": {},
"output_type": "execute_result"
2017-09-02 18:05:51 +00:00
}
],
"source": [
"m = Prophet(growth='logistic')\n",
"m.fit(df)"
2017-09-02 18:05:51 +00:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2020-02-03 21:12:54 +00:00
"We make a dataframe for future predictions as before, except we must also specify the capacity in the future. Here we keep capacity constant at the same value as in the history, and forecast 5 years into the future:"
2017-09-02 18:05:51 +00:00
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"output_hidden": true
},
"outputs": [
{
"data": {
"image/png": "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\n3/+/j6jtKv8Y+i8OAMu
2017-09-02 18:05:51 +00:00
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%R -w 10 -h 6 -u in\n",
"future <- make_future_dataframe(m, periods = 1826)\n",
"future$cap <- 8.5\n",
"fcst <- predict(m, future)\n",
"plot(m, fcst)"
2017-09-02 18:05:51 +00:00
]
},
{
"cell_type": "code",
2017-09-02 20:07:49 +00:00
"execution_count": 10,
2017-09-02 18:05:51 +00:00
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nen3fuskR7ySua3c4VUw
2017-09-02 18:05:51 +00:00
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
2017-09-02 18:05:51 +00:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
2017-09-02 20:07:49 +00:00
"future = m.make_future_dataframe(periods=1826)\n",
"future['cap'] = 8.5\n",
2017-09-02 18:05:51 +00:00
"fcst = m.predict(future)\n",
"fig = m.plot(fcst)"
2017-09-02 18:05:51 +00:00
]
},
{
2017-09-02 20:07:49 +00:00
"cell_type": "markdown",
2017-09-02 18:05:51 +00:00
"metadata": {},
2017-09-02 20:07:49 +00:00
"source": [
"The logistic function has an implicit minimum of 0, and will saturate at 0 the same way that it saturates at the capacity. It is possible to also specify a different saturating minimum.\n",
"\n",
2017-09-02 20:07:49 +00:00
"### Saturating Minimum\n",
"\n",
"The logistic growth model can also handle a saturating minimum, which is specified with a column `floor` in the same way as the `cap` column specifies the maximum:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"output_hidden": true
},
2017-09-02 18:05:51 +00:00
"outputs": [
{
"data": {
"text/plain": [
"Initial log joint probability = -109.241\n",
2017-09-02 18:05:51 +00:00
"Optimization terminated normally: \n",
" Convergence detected: relative gradient magnitude is below tolerance\n"
2017-09-02 18:05:51 +00:00
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAtAAAAGwCAIAAAAPKcUMAAAACXBIWXMAAAsSAAALEgHS3X78AAAg\nAElEQVR4nOzdd1xTVxsH8N9NwggbZIiKiHuiLLeCuDcu1NqqdWu1rbu11leto8NdZ7Xu0br3HiCK\ndSLuBYoIyJS9k7x/3HC5BAgJEEZ8vp/3j3PPPefmJM1LHs9kZDIZCCGEEEI0SVDeDSCEEEKI9qOA\ngxBCCCEaRwEHIYQQQjSOAg5CCCGEaJyovBsAACkpKQo5QqFQIpGUS2O0m0gkkkqlUqm0vBuibRiG\nYRiGPthSxzCMSCTKysoq74ZoIfozqyFCoRCA1n+2hoaG6lapEAFHWlqaQo6hoWH+TFJypqammZmZ\nGRkZ5d0QbSMSiYRCIX2wpU4oFOrr6ycmJpZ3Q7QQ/ZnVEENDQ5lMpvWfbTECDhpSIYQQQojGUcBB\nCCGEEI2jgIMQQgghGkcBByGEEEI0jgIOQgghhGgcBRyEEEII0TgKOAghhBCicRRwEEIIIUTjKOAg\nhBBCiMZRwEEIIYQQjaOAgxBCCCEaRwEHIYQQQjSOAg5CCCGEaFwZnRYrk8m2bt0aFRVlYmIybdo0\nhmHK5nUJIYQQUhGUUQ/HvXv3DA0N58+f7+TkFBkZWTYvSgghhJAKoox6OJ49e8YwzLp16xo2bFi1\nalUAEokkJSUFgJ6eXv4OD4ZhSt4Lkp6enp6ezqZFIpGRkRF3Kz4+nksbGhrq6Oiw6YyMjLS0NDYt\nFAqNjY25YomJiVKplE0bGBjo6uqy6czMzNTUVDYtEAhMTEy4KklJSRKJJH+VrKws9r2z79TU1JSr\nkpycnJ2dzab19fX19fXZdHZ2dnJyMlfM1NSU+3xSUlKysrLYtJ6enlgsZtMSiSQpKYmrYmJiIhDI\n48u0tLTMzEw2raura2BgwKZlMllCQgJXxdjYWCgU5v8wdXR0DA0NC/wwjYyMRCJR/g9T4fNPSEiQ\nyWRqfZiqfP4KHyb/8xeLxXp6egV+mGZmZlya/2HyP3+FD5P/+aempmZmZopEIvaz4j5/qVSamJhY\n4IeZlpaWkZGR/8NU+Pz5H+Zn+2Vmb0mlUiVfZu7DpC+zWl/m7OzslJSU/F9mNs3/Y1LuX2b+J1M2\nX2aFD1OtLzPDMDKZLDU1tRh/mUv3y6zwLSp/sjKxfv363377LTIycvHixQ8ePJDJZIGBgS4uLi4u\nLhs3btTQi86fP597m+7u7vxb3PcYwJkzZ7j8lStXcvnNmjXjV2HjJNaePXu4/J07d3L51atX51dp\n3Lgxd2vt2rVc/smTJ7l8fX19fpX27dtzt/73v/9x+Tdu3OD/V0tJSeFu9e/fn8ufNm0al//8+XN+\nldDQUO7W119/zeWPGDGCy1fofHr48CF3a+bMmVx+jx49uHzu/1Gsq1evcreWLl3K5bds2ZL/Nvn/\nHzh8+DCXv2nTJi6/Tp06/CoODg7crS1btnD5//77L5dvbm7Or+Li4sLdWr58OZd/+fJlfpulUil3\nq1u3blz+nDlzuPwHDx7wq0RHR3O3hg0bxuWPHTuWy3/37h2/ysuXL7lbU6ZM4fIHDBjA5fP/DAG4\ndesWd+vnn3/m8hW+zNyfSwCnT5/m8letWsXlN23alF+F/2XevXs3l8//MlerVo1fpUmTJtytNWvW\ncPmnTp3i8hW+zB06dOBuLViwgMu/efMm/20mJydzt/hf5qlTp3L5L1684Fd5//49d2vMmDFc/hdf\nfMHlR0VF8avwv8yzZs3i8rt3787lc78orCtXrnC3+F9mNzc3/tvk/ywdOnSIy9+8eTOXr/Blrl27\nNneL/2U+ePAgl29mZsav4urqyt1atmwZl6/wZZZIJNyt7t27c/mzZ8/m8gMCAvhV+F/m4cOHc/lj\nxozh8kNCQvhVXrx4wd365ptvuHwvLy8uX+HL7O/vz91asGABl9+xY0f+2+QCKeT9Mq9evZrLb9Kk\nCb+Kra0td2vXrl1c/q5du7h8W1tbfhX+l3n16tVc/unTp7l8PT09fpWOHTtyt/hfZn9/f/7bTEpK\n4m55eXlx+d988w2Xr/BlDgkJ4W6NHTuWyx8+fDiXHx0dza8SEBDA3Zo9ezaXz/8ysxFVlSpVZJrB\n/6apjpHlxOYatXPnTkdHR2dnZx8fn5iYmMGDB/PvxsTEKJQ3NDTkR5qktJiamqanp3NBNCktbA8H\nfbClTigUmpqaxsXFlXdDtBD9mdUQQ0NDmUzG9a9oK0tLS3WrlNEcjrp167558wbA27dvbWxsyuZF\nCSGEEFJBlFHA0bp167dv386bNy8mJqZt27Zl86KEKJeRkXHt2rXAwMDybgghhGi/Mpo0KhKJ5s6d\nWzavRYgqEhMTR48e7efnB2D8+PHLli0r7xYRQog2o42/yGfq7NmzbLQBYOvWrfxJ4IQQQkodBRzk\nM8UtRWNxy8wIIYRoAgUc5DPVp0+fTp06senp06fzNwMghBBS6spoDgchFY2BgcH+/fsfPnxobm5e\np06d8m4OIYRoOQo4yOdLJBLx91MihBCiOTSkQgghhBCNo4CDEEIIIRpHAQchhBBCNI4CDkIIIYRo\nHAUchBBCCNE4CjgIIYQQonEUcBBCCCFE4yjgIIQQQojGUcBBCCGEEI2jgIMQQgghGkcBByGEEEI0\njgIOQgghhGgcBRyEEEII0TgKOAghhBCicRRwEEIIIUTjKOAghBBCiMZRwEEIIYQQjaOAgxBCCCEa\nRwEHIYQQQjSOAg5CCCGEaBwFHIQQQgjROAo4CCGEEKJxFHAQQgghROMo4CCEEEKIxonKuwGkcpDJ\nZOfOnXv16pWHh0eLFi3KuzmEEEIqGerhICr59ddfR40atXTp0q5du/r4+JR3cwghhFQyFHAQlaxa\ntYpLHz16tBxbQgghpDKigIOopGvXrlza2tq6HFtCCCGkMqKAg6hk5syZbKJLly5Tpkwp38YQQgip\ndGjSKFGJi4tLdHR0cnKykZFRebeFEEJI5UM9HEQNFG0QQggpHgo4CCGEEKJxFHAQQgghROMo4CCE\nEEKIxlHAQQghhBCNo4CDEEIIIRpHAQchhBBCNI4CDkIIIYRoHAUchBBCCNE4CjgIIYQQonEUcBBC\nCCFE4yjgIIQQQojGUcBBCCGEEI2jgIMQQgghGkcBByGEEEI0TlTeDdCI7OzsXbt2BQQEuLm5ffnl\nl0KhsLxbRAghhHzWtDPgWLNmzW+//Qbg33//TUpKmjp1anm3iBBCCPmsaeeQyv3797m0v79/ObaE\nEEIIIdDWgMPGxoZL29nZlWNLCCGEEAJtDTjmz5/v5eUFYNCgQXPnzi3v5hBCCCGfO0Ymk5V3GxAT\nE6OQY2homJKSUi6N0W6mpqbp6ekZGRnl3RBtIxKJhEIhfbClTigUmpqaxsXFlXdDtBD9mdUQQ0ND\nmUyWmppa3g3RLEtLS3WraOek0VIUGhp65MgRc3Nzb29vsVhc3s0hhBBCKiUKOJQJDw93dnZm0xcv\nXty3b1/5tocQQgippLRzDkdpuXbtGpe+ePHix48flRSWSCTnz58/fPhwYmKi5ptGCCGEVCbUw6GM\nlZUV/9LMzExJ4YkTJ544cYJNv379Wnnhyuj27dsREREdO3a0sLAo77YQQgipZKiHQ5muXbuOGjWK\nTa9fv15fX7+wkhEREVy0AeDy5csab1zZWrRoUZ8+fcaPH9+gQYPQ0NDybg4hhJBKhgIOZRiGWbFi\nxYcPHz5+/Dh06NDCioWFhc2bN4+fY2RkpPnWlR2JRLJ+/Xru8siRI+XYGEIIIZURBRx5REZGHjt2\nLDAwkJ+pp6en/DSW+fPnnz59mrv08vLq0qWLpppYHgSCPN8TWq1DCCFEXRRw5Hr+/HnTpk0nTJjQ\npUsX/j/oi8SPNvr167d161aRSKsmxzAMs3r1ajbdqVOn4cOHl297CCGEVDoUcOTav38/l160aJHq\nFevVq8elW7ZsWZptqjC
2017-09-02 18:05:51 +00:00
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%R -w 10 -h 6 -u in\n",
"df$y <- 10 - df$y\n",
"df$cap <- 6\n",
"df$floor <- 1.5\n",
"future$cap <- 6\n",
"future$floor <- 1.5\n",
"m <- prophet(df, growth = 'logistic')\n",
"fcst <- predict(m, future)\n",
"plot(m, fcst)"
]
2017-09-02 20:07:49 +00:00
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAsgAAAGoCAYAAABbtxOxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3Xl8VOW9x/HPmQ1QAVHcwK1arewE\nEmAANYp1q3pFXCvQeq1Ya+vSWlu1em3VYr1VQXurxbW4r1Rb1xpN1TCEQAibivsCYYckhCSznPPc\nP84sZ5KwJpME832/Xr2ZmXPmOWcO095vnvzO77GMMQYREREREQHA194nICIiIiLSkSggi4iIiIh4\nKCCLiIiIiHgoIIuIiIiIeCggi4iIiIh4KCCLiIiIiHgoIIuIiIiIeCggi4iIiIh4KCCLiIiIiHgE\n2vsEvHr37s2hhx7a3qexS4nH4wSDwfY+jU5F17zt6Zq3D133tqdr3j503dtee13zL7/8knXr1m1z\nvw4VkA899FDmzZvX3qexS6msrKRPnz7tfRqdiq5529M1bx+67m1P17x96Lq3vfa65vn5+du1n0os\nREREREQ8FJBFRERERDwUkEVEREREPBSQRUREREQ8FJBFRERERDwUkEVEREREPBSQRUREREQ8FJBF\nRERERDwUkEVEREREPBSQRUREREQ8FJBFRERERDwUkEVEREREPHIakKuqqjj77LM56qij6NevH5FI\nJJeHExERERFpsUAuB7/yyis5+eSTef7554nFYtTV1eXycCIiIiIiLZazgFxdXc27777Lo48+CkAo\nFCIUCuXqcDutqqqK008/vcnrl156KRMnTqSyspLzzjuvyfarr76as846i08//ZSLLrqoyfYbbriB\nk08+mUWLFnH55Zc32X7bbbdxzDHHUFpayjXXXNNk+913301+fj7vvPMON910U5Pt999/PwMGDOCt\nt97igQceaLJ95syZfOc73+G5557jnnvuabL9+eefZ7/99uPvf/87Dz74YJPtr776Kt27d+f+++/n\niSeeaLL9nXfeIRAIcNdddzFr1qysbaFQiKKiIgBuvfVW3njjjaztPXv25F//+hcA119/Pe+9917W\n9gMOOIBnn30WgKuuuor58+dnbT/88MPT36tLL72UDz74IGv7oEGD+Otf/wrApEmT+PLLL7O2jxgx\ngjvvvBOACRMmsGbNmqzthYWF3HLLLQCccsop1NbWZm0fO3YsU6dOTe9r23bW9rPPPpsrr7ySaDTK\nCSecQGOTJ0/mkksu2eW/e6+88gq33357k+25+O7FYrH0/3505u/eqaeeynXXXZfeN9ffPe91h875\n3fPSd6/tvnuN5fq7d/3119OnTx9999rouzdkyBCuv/76Jp+zI8lZQP7iiy/YZ599uOiii1i4cCHD\nhw9n+vTp7L777ln7zZgxgxkzZgCwatUqKisrc3VKzaqursYY0+T1mpoaKisrWbVqVbPbq6urqays\nZM2aNc1u37hxI5WVlaxdu7bZ7Rs2bKCyspJ169Y1u33dunVUVlayYcOGZrevXbuWyspKNm3a1Oz2\nNWvW0KVLly1+vlWrVmHbNjU1Nc1uX7lyJZs2bdri+CtXrsTv91NbW9tku+M46X/Hurq6rW6vr69v\nst227fT2aDTaZHs8Hk9vj8ViTbbHYrH09ng83mR7NBpNb7dtu8n2+vr69HbHcZpsb2ho2Or22tpa\nKisrmz03gE2bNlFZWbnLf/c2btzYpt+91OPO/N2rq6tr8++ed7/O+t3zbs/1d2/t2rX67rXD/+5V\nVVV1+u8etN3/7jU0NLB27domn7MjsUxz/xKtYN68eYwaNYqSkhJGjhzJlVdeSY8ePdK/oTYnPz+f\nefPm5eJ0vrUqKyvp06dPe59Gp6Jr3vZ0zduHrnvb0zVvH7ruba+9rvn2Zs2c3aR34IEHcuCBBzJy\n5EjA/fNLeXl5rg4nIiIiItIqchaQ999/fw466CCWLVsGQFFREf3798/V4URkKyKRCFOnTlUnGRER\nke2Q0y4W9957LxdeeCGxWIzDDjuMRx55JJeHE5FmRCIRxo0bl77hqqioiHA43N6nJSIi0mHlNCAP\nHTpUNcUi7ay4uJhYLIZt28RiMYqLixWQRUREtkIr6Yl8yxUWFhIKhfD7/YRCIQoLC9v7lERERDq0\nnM4gi0j7C4fDFBUVUVxcTGFhoWaPRUREtkEBWaQTCIfDCsYiIiLbSSUWIiIiIiIeCsgiIiIiIh4K\nyCIiIiIiHgrIIiIiIiIeCsgiIiIiIh4KyCIiIiIiHgrIIiIiIiIeCsgiIiIiIh4KyCIiIiIiHgrI\nIiIiIiIeCsgiIiIiIh4KyCIiIiIiHgrIIiIiIiIeCsgiIiIiIh4KyCIiIiIiHgrIIiIiIiIeCsgi\nIiIiIh4KyCIiIiIiHgrIIiIiIiIeCsgiIiIiIh4KyCIiIiIiHgrIIiIiIiIeCsgiIiIiIh4KyCIi\nIiIiHgrI8q0QiUSYOnUqkUikvU9FREREdnGB9j4BkZaKRCKMGzeOWCxGKBSiqKiIcDjc3qclIiIi\nuyjNIMsur7i4mFgshm3bxGIxiouL2/uUREREZBemgCy7vMLCQkKhEH6/n1AoRGFhYXufkoiIiOzC\nVGIhu7xwOExRURHFxcUUFhaqvEJERERaRAFZvhXC4bCCsYiIiLQKlViIiIiIiHgoIIuIiIiIeCgg\ni4iIiIh4KCCLiIiIiHgoIIuIiIiIeCggi4iIiIh4KCCLiIiIiHgoIIuIiIiIeCggi4iIiIh4KCCL\niIiIiHgoIIuIiIiIeCggi4iIiIh4KCCLiIiIiHh0+oAciUSYOnUqkUikvU9FRERERDqAQHufQHuK\nRCKMGzeOWCxGKBSiqKiIcDjc3qclIiIiIu2oU88gFxcXE4vFsG2bWCxGcXFxe5+SiIiIiLSzTh2Q\nCwsLCYVC+P1+QqEQhYWF7X1KIiIiItLOOnWJRTgcpqioiOLiYgoLC1VeISIiIiKdOyCDG5IVjEVE\nREQkpVOXWLQVdcoQERER2XV0+hnkXFOnDBEREZFdi2aQc6wlnTI08ywiIiLS9jSDnGOpThmpGeTt\n7ZShmecdE4lEdLOliIiItAoF5Bzb2U4Zzc08K/g1T79MiIiISGtSQG4DO9opIxKJ8PXXXxMIuP88\n6tG8dfplQkRERFpTTgPyoYceSvfu3fH7/QQCAebNm5fLw7Wr1voTv3c21O/3c8kllzB58mQFvq3Y\n2TIWERERkebkfAb5nXfeoXfv3rk+TLtqzT/xFxcXE41GcRwHYwwHH3ywwvE2aMEXERERaU3qYtEK\nWtKporG9994bx3EAcByHvffeu5XOUkRERES2R05nkC3L4sQTT8SyLC699FKmTJmSy8O1m8LCQgKB\nAI7jEAgEWvQn/gULFqQfW5aV9Vyap5v0REREpDXlNCC///779O3blzVr1vD973+fo446imOOOSZr\nnxkzZjBjxgwAVq1aRWVlZS5PKSfWrl2LMQYAYwxr167dqc8xb948Hn744fRzYwwPP/wwp5xyCvn5\n+Vs8dmf38ssvZ83gv/zyyxxyyCE5O56uedvTNW8fuu5tT9e8fei6t72Ofs1zGpD79u0LwL777sv4\n8eOZO3duk4A8ZcqU9Mxyfn4+ffr0yeUp5cTSpUuxbRtjDLZts3TpUs4444ydHscrHo/z2muvbXW8\nXfGataYzzjiD6dOnp2eQzzjjjJxfk85+zduDrnn70HVve7rm7UPXve115GuesxrkzZs3s2nTpvTj\nN998k4EDB+bqcO0q1UXB7/fj9/v5+uuvd2r1u9Q4Pl/mn8UYwyOPPKLV9LYidZPeLbfcovIKERER\nabGcBeTVq1czduxYhgwZwogRI/jBD37AySefnKvDtatUQLvkkkuwLIsHHniAcePG7XCoTY1z6623\ncuaZZ2JZFgCJRKJFN/5
2017-09-02 20:07:49 +00:00
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
2017-09-02 20:07:49 +00:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df['y'] = 10 - df['y']\n",
"df['cap'] = 6\n",
"df['floor'] = 1.5\n",
"future['cap'] = 6\n",
"future['floor'] = 1.5\n",
"m = Prophet(growth='logistic')\n",
"m.fit(df)\n",
"fcst = m.predict(future)\n",
"fig = m.plot(fcst)"
2017-09-02 20:07:49 +00:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To use a logistic growth trend with a saturating minimum, a maximum capacity must also be specified."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Constant Trend"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For some datasets which exhibit strong seasonality patterns rather than trend changes, it may be useful to force the growth rate to be flat. This can be achieved simply by passing `growth=flat` before fitting the model. However, if used on a dataset with obvious non linear trend, most of the change in the trend would be fit with variance (high noise term) and hence we would observe a high predictive uncertainty."
]
},
{
"cell_type": "code",
2020-05-15 04:45:03 +00:00
"execution_count": 3,
"metadata": {},
2020-05-15 04:45:03 +00:00
"outputs": [],
"source": [
2020-05-15 04:45:03 +00:00
"m = Prophet(growth='flat')"
]
2017-09-02 18:05:51 +00:00
}
],
"metadata": {
"kernelspec": {
2020-05-15 04:45:03 +00:00
"display_name": "Python 3",
2017-09-02 18:05:51 +00:00
"language": "python",
2020-05-15 04:45:03 +00:00
"name": "python3"
2017-09-02 18:05:51 +00:00
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
2017-09-02 18:05:51 +00:00
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
2020-05-15 04:45:03 +00:00
"version": "3.7.7"
2017-09-02 18:05:51 +00:00
}
},
"nbformat": 4,
"nbformat_minor": 1
}