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,
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_R.csv')\n",
"import numpy as np\n",
"df['y'] = np.log(df['y'])"
]
},
{
"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",
"df <- read.csv('../examples/example_wp_R.csv')\n",
"df$y <- log(df$y)"
]
},
{
"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": [
2017-09-02 20:07:49 +00:00
"<fbprophet.forecaster.Prophet at 0x7f8e1d7fa510>"
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": {
2017-09-02 20:07:49 +00:00
"image/png": "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\n//3rHXK7yj+G+osDwPL
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": {
2017-09-02 20:07:49 +00:00
"image/png": "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\nTArZDCRNBt3sOr2ZFJj
2017-09-02 18:05:51 +00:00
"text/plain": [
2017-09-02 20:07:49 +00:00
"<matplotlib.figure.Figure at 0x7f8e58b54410>"
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": {
2017-09-02 20:07:49 +00:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAtAAAAGwCAIAAAAPKcUMAAAACXBIWXMAAAsSAAALEgHS3X78AAAg\nAElEQVR4nOzdd1hT1xsH8O9NwggbFBAFFSeKirgnoOJeuHDWrVWrbd2j1p9aZ1tnndW6R9W69wTc\nG1HcgiIqe++R5PfHDZdLCGGGEd7P06fPueeec3MSI7yeychkMhBCCCGEqJOgpBtACCGEEM1HAQch\nhBBC1I4CDkIIIYSoHQUchBBCCFE7UUk3AAASEhIUcoRCoUQiKZHGaDaRSCSVSqVSaUk3RNMwDMMw\nDH2wRY5hGJFIlJaWVtIN0UD0Y1ZNhEIhAI3/bPX19fNbpVQEHElJSQo5+vr62TNJ4RkbG6empqak\npJR0QzSNSCQSCoX0wRY5oVCoq6sbGxtb0g3RQPRjVk309fVlMpnGf7YFCDhoSIUQQgghakcBByGE\nEELUjgIOQgghhKgdBRyEEEIIUTsKOAghhBCidhRwEEIIIUTtKOAghBBCiNpRwEEIIYQQtaOAgxBC\nCCFqRwEHIYQQQtSOAg5CCCGEqB0FHIQQQghROwo4CCGEEKJ2xXRarFQq3bFjR1hYmJGR0bRp0xiG\nKZ7XJYQQQkhpUEw9HI8fP9bX11+4cKGjo2NwcHDxvCghhBBCSoli6uF49eoVwzAbN26sW7dupUqV\nAEgkkoSEBAA6OjrZOzwYhil8L0hycnJycjKbFolEBgYG3K3o6Ggura+vr6WlxaZTUlKSkpLYtFAo\nNDQ05IrFxsZKpVI2raenp62tzaZTU1MTExPZtEAgMDIy4qrExcVJJJLsVdLS0tj3zr5TY2Njrkp8\nfHx6ejqb1tXV1dXVZdPp6enx8fFcMWNjY+7zSUhISEtLY9M6OjpisZhNSySSuLg4roqRkZFAII8v\nk5KSUlNT2bS2traenh6blslkMTExXBVDQ0OhUJj9w9TS0tLX11f6YRoYGIhEouwfpsLnHxMTI5PJ\n8vVh5uXzV/gw+Z+/WCzW0dFR+mGamJhwaf6Hyf/8FT5M/uefmJiYmpoqEonYz4r7/KVSaWxsrNIP\nMykpKSUlJfuHqfD58z/McvtlZm9JpVIVX2buw6Qvc76+zOnp6QkJCdm/zGya/8OkxL/M/E+meL7M\nCh9mvr7MDMPIZLLExMQC/GQu2i+zwreo5MmKxV9//bVq1aqQkJAlS5Y8efJEJpP5+Pg0bdq0adOm\nW7ZsUdOLLly4kHubzs7O/Fvc9xjA+fPnufw1a9Zw+Q0bNuRXYeMk1v79+7n8PXv2cPlVqlThV6lf\nvz53a8OGDVz+mTNnuHxdXV1+lXbt2nG3/ve//3H5t2/f5v+pJSQkcLf69u3L5U+bNo3Lf/36Nb9K\nYGAgd2vMmDFc/vDhw7n8kJAQfpVnz55xt2bOnMnld+vWjcvn/kaxbty4wd1avnw5l9+iRQv+2+T/\nHfjvv/+4/K1bt3L5NWvW5FextbXlbm3fvp3LP3LkCJdvamrKr9K0aVPu1sqVK7n8a9eu8dsslUq5\nW126dOHy58yZw+U/ffqUXyUsLIy7NWTIEC5/3LhxXP6nT5/4Vd6+fcvdmjJlCpffr18/Lp//YwjA\nvXv3uFu//vorl6/wZeZ+XAI4d+4cl7927Vouv0GDBvwq/C/zvn37uHz+l7ly5cr8Kvb29tyt9evX\nc/lnz57l8hW+zO3bt+duLVq0iMu/c+cO/23Gx8dzt/hf5qlTp3L5b9684Vf5/Pkzd2vs2LFc/rBh\nw7j80NBQfhX+l3nWrFlcfteuXbl87jcK6/r169wt/pe5efPm/LfJ/7V07NgxLn/btm1cvsKXuUaN\nGtwt/pf56NGjXL6JiQm/SrNmzbhbK1as4PIVvswSiYS71bVrVy5/9uzZXL63tze/Cv/LPHToUC5/\n7NixXH5AQAC/yps3b7hbP/zwA5fv5ubG5St8me/evcvdWrRoEZfv5OTEf5tcIIWsX+Z169Zx+fb2\n9vwqVlZW3K29e/dy+Xv37uXyrays+FX4X+Z169Zx+efOnePydXR0+FWcnJy4W/wv8927d/lvMy4u\njrvl5ubG5f/www9cvsKXOSAggLs1btw4Ln/o0KFcflhYGL+Kt7c3d2v27NlcPv/LzEZUFSpUkKkH\n/5uWd4wsIzZXq927dzs4ODRp0sTT0zMsLGzQoEH8u+Hh4Qrl9fX1+ZEmKSrGxsbJyclcEE2KCtvD\nQR9skRMKhcbGxpGRkSXdEA1EP2bVRF9fXyaTcf0rmqpixYr5rVJMczhq1ar1/v17AP7+/paWlsXz\nooQQQggpJYop4GjVqtWnT5/mz58fHh7etm3b4nlRQlRLSUnx8PDw8fEp6YYQQojmK6ZJo1paWnPn\nzi2e1yIkL2JjY0ePHn3r1i0AEyZMWLFiRUm3iBBCNBlt/EXKqQsXLrDRBoAdO3bwJ4ETQggpchRw\nkHKKW4rG4paZEUIIUQcKOEg51atXrw4dOrDp6dOn8zcDIIQQUuSKaQ4HIaWNnp7eoUOHnj17Zmpq\nWrNmzZJuDiGEaDgKOEj5JRKJ+PspEUIIUR8aUiGEEEKI2lHAQQghhBC1o4CDEEIIIWpHAQchhBBC\n1I4CDkIIIYSoHQUchBBCCFE7CjgIIYQQonYUcBBCCCFE7SjgIIQQQojaUcBBCCGEELWjgIMQQggh\nakcBByGEEELUjgIOQgghhKgdBRyEEEIIUTsKOAghhBCidhRwEEIIIUTtKOAghBBCiNpRwEEIIYQQ\ntaOAgxBCCCFqRwEHIYQQQtSOAg5CCCGEqB0FHIQQQghROwo4CCGEEKJ2FHAQQgghRO1EJd0AUjbI\nZLKLFy++e/fOxcWlcePGJd0cQgghZQz1cJA8WbVq1ahRo5YvX965c2dPT8+Sbg4hhJAyhgIOkidr\n167l0idOnCjBlhBCCCmLKOAgedK5c2cubWFhUYItIYQQUhZRwEHyZObMmWzC1dV1ypQpJdsYQggh\nZQ5NGiV50rRp07CwsPj4eAMDg5JuCyGEkLKHejhIPlC0QQghpGAo4CCEEEKI2lHAQQghhBC1o4CD\nEEIIIWpHAQchhBBC1I4CDkIIIYSoHQUchBBCCFE7CjgIIYQQonYUcBBCCCFE7SjgIIQQQojaUcBB\nCCGEELWjgIMQQgghakcBByGEEELUjgIOQgghhKgdBRyEEEIIUTtRSTdALdLT0/fu3evt7d28efMR\nI0YIhcKSbhEhhBBSrmlmwLF+/frVq1cDOHLkSFxc3NSpU0u6RYQQQki5pplDKk+ePOHSd+/eLcGW\nEEIIIQSaGnBYWlpyaRsbmxJsCSGEEEKgqQHHwoUL3dzcAAwYMGDu3Lkl3RxCCCGkvGNkMllJtwHh\n4eEKOfr6+gkJCSXSGM1mbGycnJyckpJS0g3RNCKRSCgU0gdb5IRCobGxcWRkZEk3RAPRj1k10dfX\nl8lkiYmJJd0Q9apYsWJ+q2jmpNEiFBgYePz4cVNTU3d3d7FYXNLNIYQQQsokCjhU+fbtW5MmTdj0\nlStXDh48WLLtIYQQQsoozZzDUVQ8PDy49JUrV4KDg1UUlkgkly5d+u+//2JjY9XfNEIIIaQsoR4O\nVczNzfmXJiYmKgp///33p0+fZtPv379XXbgsevDgQVBQkJOTk5mZWUm3hRBCSBlDPRyqdO7cedSo\nUWx606ZNurq6OZUMCgriog0A165dU3vjiteSJUt69eo1YcKEunXrBgYGlnRzCCGElDEUcKjCMMyf\nf/755cuX4ODgwYMH51Ts69evCxYs4OcYGBiov3XFRyKRbNq0ibs8fvx4CTaGEEJIWUQBRxYhISEn\nT5708fHhZ+ro6Kg+jWXhwoXnzp3jLt3c3FxdXdXVxJIgEGT5ntBqHUIIIflFAUem169fN2jQYOLE\nia6urvx/0OeKH2306dNnx44dIpFGTY5hGGbdunVsukOHDkOHDi3Z9hBCCClzKODIdOjQIS69ZMmS\nvFesXbs2l27RokVRtqn
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+/AAAIABJREFUeJzs3Xl8FfW9//HXnC0gmyCg4lrrCigJJIQA1lisaFsXRFyq\n0nrdWm/rVuvVtvbauuD1toraW1tal+JeRdyqYhubqhBCIAlL3HchIlsSQpYz58x87x9zMuecLBDI\nink/fw8l58yc70yGXn/vfPP5fr6WMcYgIiIiIiIABHr6BkREREREehMFZBERERGRFArIIiIiIiIp\nFJBFRERERFIoIIuIiIiIpFBAFhERERFJoYAsIiIiIpJCAVlEREREJIUCsoiIiIhIilBP30Cq4cOH\nc/DBB/f0bexWYrEY4XC4p2+jT9Ez73565j1Dz7376Zn3DD337tdTz/yTTz5h06ZNOzyvVwXkgw8+\nmOXLl/f0bexWKisrGTVqVE/fRp+iZ9799Mx7hp5799Mz7xl67t2vp555dnZ2u85TiYWIiIiISAoF\nZBERERGRFArIIiIiIiIpFJBFRERERFIoIIuIiIiIpFBAFhERERFJoYAsIiIiIpJCAVlEREREJIUC\nsoiIiIhICgVkEREREZEUCsgiIiIiIikUkEVEREREUnRpQK6urubMM8/kyCOP5KijjqKoqKgrLyci\nIiIi0mGhrhz8yiuv5KSTTuLpp5/Gtm3q6+u78nIiIiIiIh3WZQF569atvP766zz00EMARCIRIpFI\nV11ul1VXV3PKKae0eH/27Nlccsklvf54TU0NZ599dq+9v6/icdu2ufjii3vt/X0Vj9u2nfbfj952\nf1/V4/rvi/770leOp/43pjfe31fxeG/XZQH5o48+YsSIEVx44YWsXLmSCRMmcPfddzNgwIC08+bN\nm8e8efMAWL9+PZWVlV11S62qqanBGNPi/draWiorK3v98U2bNvXq+9NxHe+s46nn9cb7+yoe139f\ndLwvHW/6urfe31ft+MaNG1sc600s09rdd4Lly5czadIkFi9eTG5uLldeeSWDBw/m5ptvbvMz2dnZ\nLF++vCtu5yursrKSUaNG9fRt9Cl65t1Pz7xn6Ll3Pz3znqHn3v166pm3N2t22SK9/fffn/3335/c\n3FwAzjzzTEpLS7vqciIiIiIinaLLAvI+++zDAQccwLvvvgtAQUEBo0eP7qrLich2FBUVMWfOHHWS\n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\n8vL4yU9+AsZgXJd5997
"text/plain": [
"<matplotlib.figure.Figure at 0x7f8e0b1cff50>"
]
},
"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",
"version": "2.7.13"
}
},
"nbformat": 4,
"nbformat_minor": 1
}