prophet/notebooks/saturating_forecasts.ipynb

315 lines
348 KiB
Text
Raw Normal View History

2017-09-02 18:05:51 +00:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
2017-09-02 20:07:49 +00:00
"block_hidden": true,
"collapsed": true
2017-09-02 18:05:51 +00:00
},
"outputs": [],
"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": {
2017-09-02 20:07:49 +00:00
"block_hidden": true,
"collapsed": true
2017-09-02 18:05:51 +00:00
},
"outputs": [],
"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": "iVBORw0KGgoAAAANSUhEUgAAAsgAAAGoCAYAAABbtxOxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzsnXdgHNW59p/ZJveGMWB6NTbNuGAE\ncVAwoaRBaCYJLZBw7yW5SUihhJAbAomBL6EECGBCNwEbbEoAG4xANK9tyZZsy71bvWt3tW1mzjnf\nH2fOlN2VLNuSpYX3d6+xdmd25szsxHrmnec8ryaEECAIgiAIgiAIAgDg6+sBEARBEARBEER/ggQy\nQRAEQRAEQbgggUwQBEEQBEEQLkggEwRBEARBEIQLEsgEQRAEQRAE4YIEMkEQBEEQBEG4IIFMEARB\nEARBEC5IIBMEQRAEQRCECxLIBEEQBEEQBOEi0NcDcDN69GgcddRRfT2MvMIwDASDwb4exlcKOuf7\nHzrnfQOd9/0PnfO+gc77/qevzvmOHTvQ3Ny82/X6lUA+6qijUFZW1tfDyCtqa2sxduzYvh7GVwo6\n5/sfOud9A533/Q+d876Bzvv+p6/O+ZQpU7q1HlksCIIgCIIgCMIFCWSCIAiCIAiCcEECmSAIgiAI\ngiBckEAmCIIgCIIgCBckkAmCIAiCIAjCBQlkgiAIgiAIgnBBApkgCIIgCIIgXJBAJgiCIAiCIAgX\nJJAJgiAIgiAIwgUJZIIgCIIgCIJwQQKZIAiCIAiCIFyQQCYIgiAIgiAIFySQCYIgCIIgCMIFCWSC\nIAiiRwmHw5g1axbC4XBfD4UgCGKvCPT1AAiCIIgvD+FwGDNmzICu6wiFQiguLkZhYWFfD4sgCGKP\noAoyQRAE0WOUlJRA13UwxqDrOkpKSvp6SARBEHtMrwrkRx55BCeffDJOOukkPPzww725K4IgCKIf\nUFRUhFAoBL/fj1AohKKior4eEkEQxB7TaxaLyspKPP3001i+fDlCoRAuvPBCfOc738Fxxx3XW7sk\nCIIg+pjCwkIUFxejpKQERUVFZK8gCCIv6TWBvH79ekybNg2DBg0CAJxzzjlYsGABbr311t7aJUEQ\nBNEPKCwsJGFMEERe02sC+eSTT8add96JlpYWDBw4EO+99x6mTJmStd7s2bMxe/ZsAEB9fT1qa2t7\na0hfSpqamvp6CF856Jzvf+ic9w103vc/dM77Bjrv+5/+fs57TSCPHz8et912G84//3wMHjwYEydO\nhN/vz1rvpptuwk033QQAmDJlCsaOHdtbQ/rSQuds/0PnfP9D57xvoPO+/6Fz3jfQed//9Odz3quT\n9G688UasWLECn376KUaOHIkTTjihN3dHEARBEARBEPtMr+YgNzY2YsyYMdi1axcWLFiApUuX9ubu\nCIIgiL0kHA7TxDqCIAiLXhXIl112GVpaWhAMBvH4449jxIgRvbk7giAIYi+g5h4EQRBeelUgf/bZ\nZ725eYIgCKIHyNXcgwQyQRBfZaiTHkEQxFccau5BEPmPEKKvh/ClolcryARBEET/h5p7EER+o5sc\nq+simHL4yL4eypcGEsgEQRAENfcgiDzG5ByM9/UovlyQxYIgCIIgCCKPEUKKZINUco9BApkgCIIg\nCCKP4QIwucCq2khfD+VLAwlkgiAIgiAIAGaeVmAFBDgXZLPoQUggEwRBEARBACiviaCpI93Xw9hj\nuAA4pM2C6BlIIBMEQRAEQQDQGUdcZ309jD1ma3McnAMG80a9xdMmxb/tJSSQCYIgCIIgIOPS8tFm\nYXIBLgQY94rhyvoYWhNGH40qvyGBTBAEQRBEj5KPaQo7WxPgeVhsFULY59s9/NW1URiMw+wnB1XV\nlsyrmw8SyARBEARB9BiRpIGKmvxLU4ilTZhcoC1p5JWQM7mAyQWEkHFvaVNaRNqThvV+7wvktMl2\nu5+6WAqxtNnrY+kpSCATBEEQBNFj6IxDZ/2jarknGEzaFFImR1vSsSUowdlfUdYK+X9ARU0UgEy2\nyLRc9Bara6O7tXKYTMCnaftlPD0BCWSCIAiCIHqU/SXMehKDcQjIqDc1/IRu2oKzvyKEY60QQsDk\nHHXRFIQA9sd9SnV7EjoT2N4aR8rIfTORMhiYEMgjfUwCmSAIgiCInoXnYXICE8LqSOe8x0X/91ML\nyHEKqI56ArvapGgVQmBXexK6mX0MO1sTiKX2zfKQNBhqIikwLmCwzivWa+qi4Nb5zRdIIBMEQRAE\n0SNwLrC9NQEmBFriel8PZ48Q1n+VyONcYENjDIwLtCZ6/1j21isshLD+ANxqGJIyGLiVbKGb3hbU\nQghsbIyhLppGwz5mPq+ujSJlMpi868mAOuPgXCCP9DEJZIIgCIIgegZmJSpwDmxriff1cPYIt8iM\npAykGUfS4GBCYFNj7x5LNGVgRXX7bscXS5noyJjo5tbVQggwIb8HJgS4gOVPlsRSJlZWR9CWMJE2\nGdqTes7qcncxuYDJnP10NgnPsNbJp0xmEsgEQRAE0c/gXGBna2KfxEtfwGzBJPpNvFh3EbZNQSCS\nNNCa0MG4FHZJo3MrAu+B42yJG0ibAm0JHW2dVKubOnSsa4hhTZ3XE62sFeoYuPVHVZaZkJVwAGhJ\n6DCY9CnrTCChczTF966K3GE1IWGWOOZCYGdbMksEN3Wk5URCATTn0VMFEsh5TllZGWbNmoVwONzX\nQyEIgiB6iLUNMdREUp40hXyAW4JM/awwGe/3E/eU0BRCVjxrIilZibVEci7SJsPKmq4rv7sjaTA0\nx9MwOcfGxjg2N+euVpvKOpGjCitrxPK/nAu7amz7khmwpTmOmkgKBufS8iCEZX3Yu3Gvb4jJiY3C\niZjTc+Qub2tJ2II9n67nQF8PgNh7wuEwZs6cCcMwEAqFUFxcjMLCwr4eFkEQBLGPxNNMWhXy6JE0\n4AhMdwW5qi2J2mgKfh9w6iHDEQr0z9qcrCALcKHZnemUeBQAdrUlcMTIQZ7PGExANwUSuolBob2T\nVNyVY5w2WZfnxxQCPuGNgvCmWEiLiCacqjK3hGtjLA3diqwzmDUhkQk0dqRx8LACBP3d/17qoymk\nTA6Tw3VDpNk3QkG/a8zWDQa37Dcm4wjswb76iv4/QqJTSkpKYBgGGGPQdR0lJSV9PSSCIAiiB1AC\nM8/0sfSiWoJNWQ9qoyl06CYY7/1EiHX1MSQ7iRpTGNaEsUyEPU1PwLAmnXFXdbQumkY8bSJlMJRV\ntSGSNLCxsQMmF1hbH9vrMa9vjMkECCFgdFKt1k0Z3cY4cl4TQmTbLNSxKGFqWPF1JneENIdMn9jd\nOXNjMo6aSApJg7vOj1W9dq3XatlFlNWDCyBtyup1PkAV5DymqKgIwWAQABAKhVBUVNS3AyIIgiB6\nBIH88/ACctzOZDenDTLjgMl5p1aFniKWNrG6NopTDhnaaUV3ZXUEfh8wcezw7EqmAKABjAPwWZVR\nCPigwWAca+pi0DTpuV3f0GFNhNv778qJR+OW+BX2ZLyhA5zxp0xmryeQO0zYMVmo15bgtwSzafmA\npZhVN1/SZrEn9pemuI6ElZKhjByO51nD2voYxo0Zgm3NCXuiILerzLkFfn+EBHIeU1hYiLlz52Lt\n2rUoKioiewVBEMSXBCUq6mMpHDKsAJrVYaG/P552VzIhpE9VAGCcw2AaNjd3YNJhI3pl33GrVbTJ\nOYwuOmTojMPHNRhcIODPsYJL7KkKKeeywsssi4KmabL+mmEn2VNsgSzkOQJklXV7axynjh1ur6dB\ns24wZHk+ZTAMcPkYtjbHMTDox5ihIe9NiHAEPrcEOBeqSi2PzejGjQvnAjtaE+jQGdImk95l6/Nu\n0av826qinja5Jeqd/eWJPiaLRT4TDocRDodJHBMEQXRC2mTY1Zbo62HsMUp4MC6QtpIs2pMGVlRH\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."
]
2017-09-02 18:05:51 +00:00
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.14+"
2017-09-02 18:05:51 +00:00
}
},
"nbformat": 4,
"nbformat_minor": 1
}