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,
2018-05-30 22:34:41 +00:00
"metadata": {},
2017-09-02 18:05:51 +00:00
"outputs": [],
"source": [
2018-05-30 22:34:41 +00:00
"df = pd.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": [
"%%R\n",
2018-05-30 22:34:41 +00:00
"df <- 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": [
"df['cap'] = 8.5"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%%R\n",
"df$cap <- 8.5"
]
},
{
"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": [
2018-05-30 22:34:41 +00:00
"<fbprophet.forecaster.Prophet at 0x7f306412f190>"
2017-09-02 18:05:51 +00:00
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = Prophet(growth='logistic')\n",
"m.fit(df)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"output_hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"Initial log joint probability = -67.9808\n",
"Optimization terminated normally: \n",
" Convergence detected: relative gradient magnitude is below tolerance\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%R\n",
"m <- prophet(df, growth = 'logistic')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"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 3 years into the future:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"output_hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"\r",
"|======================================================|100% ~0 s remaining "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2018-05-30 22:34:41 +00:00
"image/png": "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\ny8vJ9rtzp06dOvVyeQu
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);"
]
},
{
"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": {
2018-05-30 22:34:41 +00:00
"image/png": "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\nnA9sa09P4gLQL4lbdZ1
2017-09-02 18:05:51 +00:00
"text/plain": [
2018-05-30 22:34:41 +00:00
"<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",
"m.plot(fcst);"
]
},
{
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": [
2017-09-17 04:52:17 +00:00
"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 = -157.241\n",
"Optimization terminated normally: \n",
" Convergence detected: relative gradient magnitude is below tolerance\n",
"\r",
"|======================================================|100% ~0 s remaining "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2018-05-30 22:34:41 +00:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAtAAAAGwCAIAAAAPKcUMAAAACXBIWXMAAAsSAAALEgHS3X78AAAg\nAElEQVR4nOzdd1gU1xoH4N/sLr0jVcUuFmyIvYGKvWHDGjW2RGOKNcYYrzHWxB5rNPbee1dAFGNB\nxIoFEBGQ3vuW+8csw7AsnaUs3/vc5z5nzpwze3bduJ+nMjKZDIQQQgghqiQo7wYQQgghRP1RwEEI\nIYQQlaOAgxBCCCEqRwEHIYQQQlROVN4NAIDk5GSFHKFQKJFIyqUx6k0kEkmlUqlUWt4NUTcMwzAM\nQx9sqWMYRiQSZWZmlndD1BD9NasiQqEQgNp/tnp6ekWtUiECjtTUVIUcPT293Jmk5IyMjDIyMtLT\n08u7IepGJBIJhUL6YEudUCjU1tZOSEgo74aoIfprVkX09PRkMpnaf7bFCDhoSIUQQgghKkcBByGE\nEEJUjgIOQgghhKgcBRyEEEIIUTkKOAghhBCichRwEEIIIUTlKOAghBBCiMpRwEEIIYQQlaOAgxBC\nCCEqRwEHIYQQQlSOAg5CCCGEqBwFHIQQQghROQo4CCGEEKJyZXRarEwm27VrV0REhKGh4ffff88w\nTNm8LiGEEEIqgjLq4Xjy5Iment7ixYvt7e3Dw8PL5kUJIYQQUkGUUQ/H69evGYbZvHlz48aNrays\nAEgkkuTkZABaWlq5OzwYhil5L0haWlpaWhqbFolE+vr63K24uDguraenp6GhwabT09NTU1PZtFAo\nNDAw4IolJCRIpVI2raurq6mpyaYzMjJSUlLYtEAgMDQ05KokJiZKJJLcVTIzM9n3zr5TIyMjrkpS\nUpJYLGbT2tra2trabFosFiclJXHFjIyMuM8nOTk5MzOTTWtpaeno6LBpiUSSmJjIVTE0NBQI5PFl\nampqRkYGm9bU1NTV1WXTMpksPj6eq2JgYCAUCnN/mBoaGnp6eko/TH19fZFIlPvDVPj84+PjZTJZ\nkT7Mwnz+Ch8m//PX0dHR0tJS+mEaGxtzaf6Hyf/8FT5M/uefkpKSkZEhEonYz4r7/KVSaUJCgtIP\nMzU1NT09PfeHqfD58z/MKvtlZm9JpdJ8vszch0lf5iJ9mcVicXJycu4vM5vm/2VS7l9m/idTNl9m\nhQ+zSF9mhmFkMllKSkox/mYu3S+zwreo/MnKxJYtW9asWRMeHr5s2bKnT5/KZDJfX18HBwcHB4dt\n27ap6EUXL17MvU1HR0f+Le57DODy5ctc/rp167j85s2b86uwcRLr4MGDXP6+ffu4/Bo1avCrNG3a\nlLu1adMmLv/ChQtcvra2Nr9Kly5duFv/+9//uPx79+7x/9SSk5O5W0OGDOHyv//+ey7/zZs3/CrB\nwcHcra+//prLHzduHJev0Pn07Nkz7tbcuXO5/L59+3L53H9RrDt37nC3VqxYweW3a9eO/zb5/w2c\nOnWKy9++fTuXX79+fX6VunXrcrd27tzJ5R8/fpzLNzEx4VdxcHDgbq1atYrLv3XrFr/NUqmUu9W7\nd28uf8GCBVz+06dP+VUiIyO5W6NHj+byp0yZwuV//PiRX+Xt27fcrZkzZ3L5Q4cO5fL5fw0BePDg\nAXfrt99+4/IVvszcX5cALl26xOWvX7+ey2/WrBm/Cv/LfODAAS6f/2WuXr06v4qdnR13a+PGjVz+\nxYsXuXyFL3PXrl25W0uWLOHy79+/z3+bSUlJ3C3+l3nWrFlcvp+fH7/Kp0+fuFuTJ0/m8seOHcvl\nR0RE8Kvwv8zz5s3j8vv06cPlc78orNu3b3O3+F/mtm3b8t8m/2fp5MmTXP6OHTu4fIUvc7169bhb\n/C/ziRMnuHxjY2N+lTZt2nC3Vq5cyeUrfJklEgl3q0+fPlz+/PnzuXwfHx9+Ff6XecyYMVz+5MmT\nufygoCB+FT8/P+7Wd999x+W7uLhw+QpfZi8vL+7WkiVLuPxu3brx3yYXSCHnl3nDhg1cvp2dHb+K\ntbU1d2v//v1c/v79+7l8a2trfhX+l3nDhg1c/qVLl7h8LS0tfpVu3bpxt/hfZi8vL/7bTExM5G65\nuLhw+d999x2Xr/BlDgoK4m5NmTKFyx8zZgyXHxkZya/i4+PD3Zo/fz6Xz/8ysxFVtWrVZKrB/6YV\nHiPLis1Vat++fS1atGjdurW7u3tUVNSIESP4d6OiohTK6+np8SNNUlqMjIzS0tK4IJqUFraHgz7Y\nUicUCo2MjGJiYsq7IWqI/ppVET09PZlMxvWvqCszM7OiVimjORwNGjT48OEDgMDAQEtLy7J5UUII\nIYRUEGUUcHTo0CEwMHDRokVRUVGdOnUqmxclJH/p6elubm6+vr7l3RBCCFF/ZTRpVCQS/fzzz2Xz\nWoQURkJCwqRJkzw9PQFMmzZt5cqV5d0iQghRZ7TxF6mirly5wkYbAHbt2sWfBE4IIaTUUcBBqihu\nKRqLW2ZGCCFEFSjgIFXUwIEDu3fvzqZnz57N3wyAEEJIqSujORyEVDS6urpHjhx59uyZiYlJ/fr1\ny7s5hBCi5ijgIFWXSCTi76dECCFEdWhIhRBCCCEqRwEHIYQQQlSOAg5CCCGEqBwFHIQQQghROQo4\nCCGEEKJyFHAQQgghROUo4CCEEEKIylHAQQghhBCVo4CDEEIIISpHAQchhBBCVI4CDkIIIYSoHAUc\nhBBCCFE5CjgIIYQQonIUcBBCCCFE5SjgIIQQQojKUcBBCCGEEJWjgIMQQgghKkcBByGEEEJUjgIO\nQgghhKgcBRyEEEIIUTkKOAghhBCichRwEEIIIUTlKOAghBBCiMpRwEEIIYQQlROVdwNI5SCTya5e\nvfru3TsnJ6dWrVqVd3MIIYRUMtTDQQpl9erVEydOXLFiRa9evdzd3cu7OYQQQioZCjhIoaxfv55L\nnzlzphxbQgghpDKigIMUSq9evbi0hYVFObaEEEJIZUQBBymUuXPnsglnZ+eZM2eWb2MIIYRUOjRp\nlBSKg4NDZGRkUlKSvr5+ebeFEEJI5UM9HKQIKNoghBBSPBRwEEIIIUTlKOAghBBCiMpRwEEIIYQQ\nlaOAgxBCCCEqRwEHIYQQQlSOAg5CCCGEqBwFHIQQQghROQo4CCGEEKJyFHAQQgghROUo4CCEEEKI\nylHAQQghhBCVo4CDEEIIISpHAQchhBBCVI4CDkIIIYSonKi8G6ASYrF4//79Pj4+bdu2HT9+vFAo\nLO8WEUIIIVWaegYcGzduXLNmDYDjx48nJibOmjWrvFtECCGEVGnqOaTi7e3Npb28vMqxJYQQQgiB\nugYclpaWXNrGxqYcW0IIIYQQqGvAsXjxYhcXFwDDhw//+eefy7s5hBBCSFXHyGSy8m4DoqKiFHL0\n9PSSk5PLpTHqzcjIKC0tLT09vbwbom5EIpFQKKQPttQJhUIjI6OYmJjybogaor9mVURPT08mk6Wk\npJR3Q1TLzMysqFXUc9JoKQoODj59+rSJiYmrq6uOjk55N4cQQgiplCjgyE9oaGjr1q3Z9I0bNw4f\nPly+7SGEEEIqKfWcw1Fa3NzcuPSNGze+fPmST2GJRHLt2rVTp04lJCSovmmEEEJIZUI9HPkxNzfn\nXxobG+dT+Jtvvjl//jybfv/+ff6FK6OHDx+GhYV169bN1NS0vNtCCCGkkqEejvz06tVr4sSJbHrL\nli3a2tp5lQwLC+OiDQC3bt1SeePK1u+//z5w4MBp06Y1atQoODi4vJtDCCGkkqGAIz8Mw6xdu/bz\n589fvnwZNWpUXsVCQkIWLVrEz9HX11d968qORCLZsmULd3n69OlybAwhhJDKiAKOHMLDw8+ePevr\n68vP1NLSyv80lsWLF1+6dIm7dHFxcXZ2VlUTy4NAkON7Qqt1CCGEFBUFHNnevHnTrFmz6dOnOzs7\n8/9BXyB+tDF48OBdu3aJRGo1OYZhmA0bNrDp7t27jxkzpnzbQwghpNKhgCPbkSNHuPTvv/9e+IoN\nGzbk0u3atSvNNlUY48e
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": {
2018-05-30 22:34:41 +00:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAsgAAAGoCAYAAABbtxOxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3Xl8VNX9//HXnS0gq4qoSNFqrUJA\nCCTACGoqVsWvWnG3Aq0/q9Zaq/arbdXWblqs36pQW7VYl+KGC1J3sUajApMQCLtK3RXDDgkJWebO\nvef3x501CWsySTDv5+NhZu4y5565mdJPznzO51jGGIOIiIiIiADga+8OiIiIiIh0JAqQRURERETS\nKEAWEREREUmjAFlEREREJI0CZBERERGRNAqQRURERETSKEAWEREREUmjAFlEREREJI0CZBERERGR\nNIH27kC6Pn36cNhhh7V3N/Yqtm0TDAbbuxudiu5529M9bx+6721P97x96L63vfa655999hkbN27c\n6XkdKkA+7LDDWLhwYXt3Y69SUVFBv3792rsbnYruedvTPW8fuu9tT/e8fei+t732uuf5+fm7dJ5S\nLERERERE0ihAFhERERFJowBZRERERCSNAmQRERERkTQKkEVERERE0ihAFhERERFJowBZRERERCSN\nAmQRERERkTQKkEVERERE0ihAFhERERFJowBZRERERCSNAmQRERERkTRZDZArKys599xzOfrooxk4\ncCCRSCSblxMRERERabFANhu/5pprOPXUU3n22WeJRqPU1tZm83IiIiIiIi2WtQC5qqqKd955h0ce\neQSAUChEKBTK1uX2WGVlJWeccUaT/VdccQUTJ06koqKCCy64oMnx6667jrPPPpuPPvqISy65pMnx\nm2++mVNPPZVly5Zx1VVXNTl+2223cfzxx1NaWsr111/f5Pjdd99Nfn4+b731FrfcckuT4/fffz+5\nubm88cYbPPDAA02Oz5gxg29+85s888wz/PWvf21y/Nlnn+XAAw/kX//6F//85z+bHH/llVfo0aMH\n999/P48//niT42+99RaBQIC77rqL2bNnZxwLhUIUFRUBcOuttzJnzpyM47169eKll14C4KabbuLd\nd9/NOH7wwQfz9NNPA3DttdeyaNGijONHHHFE8nN1xRVX8N5772UcHzJkCPfeey8AkyZN4rPPPss4\nPnLkSO68804AzjnnHNavX59xvLCwkD/+8Y8AjB8/npqamozjY8eOZcqUKclzHcfJOH7uuedyzTXX\n0NDQwEknnURjkydP5rLLLtvrP3svv/wyt99+e5Pj2fjsRaPR5L8fnfmzd9ppp3HjjTcmz832Zy/9\nvkPn/Oyl02ev7T57jWX7s3fTTTfRr18/ffba6LM3dOhQbrrppibvsyPJWoD86aefcsABB3DJJZew\ndOlSRowYwbRp0+jWrVvGedOnT2f69OkArF27loqKimx1qVlVVVUYY5rs37p1KxUVFaxdu7bZ41VV\nVVRUVLB+/fpmj2/ZsoWKigo2bNjQ7PHNmzdTUVHBxo0bmz2+ceNGKioq2Lx5c7PHN2zYQEVFBdXV\n1c0eX79+PTk5Odt9f2vXrsVxHLZu3drs8TVr1lBdXb3d9tesWYPf76empqbJcdd1k7/H2traHR6v\nq6trctxxnOTxhoaGJsdt204ej0ajTY5Ho9Hkcdu2mxxvaGhIHnccp8nxurq65HHXdZscr6+v3+Hx\nmpoaKioqmu0bQHV1NRUVFXv9Z2/Lli1t+tlLPO/Mn73a2to2/+yln9dZP3vpx7P92duwYYM+e+3w\n715lZWWn/+xB2/27V19fz4YNG5q8z47EMs39JlrBwoULGT16NPPmzWPUqFFcc8019OzZM/kXanPy\n8/NZuHBhNrrztVVRUUG/fv3auxudiu5529M9bx+6721P97x96L63vfa657saa2Ztkl7//v3p378/\no0aNAryvX8rLy7N1ORERERGRVpG1APmggw7iG9/4BqtWrQKgqKiIQYMGZetyIrIDkUiEKVOmqJKM\niIjILshqFYt77rmHiy++mGg0yuGHH87DDz+czcuJSDMikQjjxo1LTrgqKioiHA63d7dEREQ6rKwG\nyMOGDVNOsUg7Ky4uJhqN4jgO0WiU4uJiBcgiIiI7oJX0RL7mCgsLCYVC+P1+QqEQhYWF7d0lERGR\nDi2rI8gi0v7C4TBFRUUUFxdTWFio0WMREZGdUIAs0gmEw2EFxiIiIrtIKRYiIiIiImkUIIuIiIiI\npFGALCIiIiKSRgGyiIiIiEgaBcgiIiIiImkUIIuIiIiIpFGALCIiIiKSRgGyiIiIiEgaBcgiIiIi\nImkUIIuIiIiIpFGALCIiIiKSRgGyiIiIiEgaBcgiIiIiImkUIIuIiIiIpFGALCIiIiKSRgGyiIiI\niEgaBcgiIiIiImkUIIuIiIiIpFGALCIiIiKSRgGyiIiIiEgaBcgiIiIiImkUIIuIiIiIpFGALCIi\nIiKSRgGyiIiIiEgaBcjytRCJRJgyZQqRSKS9uyIiIiJ7uUB7d0CkpSKRCOPGjSMajRIKhSgqKiIc\nDrd3t0RERGQvpRFk2esVFxcTjUZxHIdoNEpxcXF7d0lERET2YgqQZa9XWFhIKBTC7/cTCoUoLCxs\n7y6JiIjIXkwpFrLXC4fDFBUVUVxcTGFhodIrREREpEUUIMvXQjgcVmAsIiIirUIpFiIiIiIiaRQg\ni4iIiIikUYAsIiIiIpJGAbKIiIiISBoFyCIiIiIiaRQgi4iIiIikUYAsIiIiIpJGAbKIiIiISBoF\nyCIiIiIiaRQgi4iIiIikUYAsIiIiIpJGAbKIiIiISBoFyCIiIiIiaTp9gByJRJgyZQqRSKS9uyIi\nIiIiHUCgvTvQniKRCOPGjSMajRIKhSgqKiIcDrd3t0RERESkHXXqEeTi4mKi0SiO4xCNRikuLm7v\nLomIiIhIO+vUAXJhYSGhUAi/308oFKKwsLC9uyQiIiIi7axTp1iEw2GKioooLi6msLBQ6RUiIiIi\n0rkDZPCCZAXGIiIiIpLQqVMs2ooqZYiIiIjsPTr9CHK2qVKGiIiIyN5FI8hZ1pJKGRp5FhEREWl7\nGkHOskSljMQI8q5WytDI8+6JRCKabCkiIiKtQgFylu1ppYzmRp4V+DVPf0yIiIhIa1KA3AZ2t1JG\nJBLhiy++IBDwfj2q0bxj+mNCREREWlNWA+TDDjuMHj164Pf7CQQCLFy4MJuXa1et9RV/+mio3+/n\nsssuY/LkyQr4dmBP01hEREREmpP1EeS33nqLPn36ZPsy7ao1v+IvLi6moaEB13UxxjBgwAAFxzuh\nBV9ERESkNamKRStoSaWKxvbff39c1wXAdV3233//VuqliIiIiOyKrI4gW5bFySefjGVZXHHFFVx+\n+eXZvFy7KSwsJBAI4LougUCgRV/xL168OPncsqyMbWmeJumJiIhIa8pqgDx37lwOOeQQ1q9fz3e/\n+12OPvpojj/++Ixzpk+fzvTp0wFYu3YtFRUV2exSVmzYsAFjDADGGDZs2LBH72PhwoU89NBDyW1j\nDA899BDjx48nPz9/u9fu7F544YWMEfwXXniBQw89NGvX0z1ve7rn7UP3ve3pnrcP3fe219HveVYD\n5EMOOQSAvn37MmHCBBYsWNAkQL788suTI8v5+fn069cvm13KipUrV+I4DsYYHMdh5cqVnHnmmXvc\nTjrbtnn11Vd32N7eeM9a05lnnsm0adOSI8hnnnlm1u9JZ7/n7UH3vH3ovrc93fP2ofve9jryPc9a\nDvK2bduorq5OPn/99dcZPHhwti7XrhJVFPx+P36/ny+++GKPVr9LtOPzpX4txhgefvhhraa3A4lJ\nen/84x+VXiEiIiItlrUAed26dYwdO5ahQ4cycuRI/ud//odTTz01W5drV4kA7bLLLsOyLB544AHG\njRu320Ftop1bb72Vs84
2017-09-02 20:07:49 +00:00
"text/plain": [
2018-05-30 22:34:41 +00:00
"<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",
"m.plot(fcst);"
]
2017-09-17 04:52:17 +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",
2018-05-30 22:34:41 +00:00
"version": "2.7.14+"
2017-09-02 18:05:51 +00:00
}
},
"nbformat": 4,
"nbformat_minor": 1
}