"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "price_per_dose = 50\n",
+ "\n",
+ "for doses in dose_array:\n",
+ " fraction = doses / num_students\n",
+ " spending = budget - doses * price_per_dose\n",
+ " \n",
+ " system = make_system(beta, gamma)\n",
+ " add_immunization(system, fraction)\n",
+ " add_hand_washing(system, spending)\n",
+ " \n",
+ " results, run_simulation(system, update_func)\n",
+ " print(doses, system.init.S, system.beta, calc_total_infected(results))\n",
+ " \n",
+ "infected_sweep = sweep_doses(dose_array)\n",
+ "\n",
+ "plot(infected_sweep)\n",
+ "\n",
+ "decorate(xlabel='Doses of vaccine',\n",
+ " ylabel='Total fraction infected',\n",
+ " title='Total infections vs. doses',\n",
+ " legend=False)\n",
+ "\n",
+ "savefig('figs/chap12-figEx02.pdf')\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "At $50/dose, the optimal strategy is to provide 6 doses and spend the rest ($900) on the campaign. Now there are 14 infected students rather than the 17 when doses are $100 ea. There is still no herd immunity effect. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Suppose we have the option to quarantine infected students. For example, a student who feels ill might be moved to an infirmary, or a private dorm room, until they are no longer infectious.\n",
+ "\n",
+ "How might you incorporate the effect of quarantine in the SIR model?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This would move individuals from I to R in less than 4 days, in other words gamma would increase. Some assumptions would have to be made as to how efficiently diagnosis could be done and whether there are facilities to quarantine all infected students. If one assumes a sick student is diagnosed and quarantined 1 day after becoming infectious on average, the the effective recovery time is 1 day and gamma is 1 day^-1."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 122,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.0 0.9888888888888889 0.26711285672828566 0.18921320781833872\n",
+ "1.0 0.9777777777777779 0.2678657473308061 0.18921320781833872\n",
+ "2.0 0.9666666666666667 0.26982839154517113 0.18921320781833872\n",
+ "3.0 0.9555555555555556 0.2746135281348078 0.18921320781833872\n",
+ "4.0 0.9444444444444445 0.28459609475799963 0.18921320781833872\n",
+ "5.0 0.9333333333333333 0.3 0.18921320781833872\n",
+ "6.0 0.9222222222222223 0.3154039052420003 0.18921320781833872\n",
+ "7.0 0.9111111111111112 0.32538647186519215 0.18921320781833872\n",
+ "8.0 0.9 0.33017160845482885 0.18921320781833872\n",
+ "9.0 0.888888888888889 0.3321342526691939 0.18921320781833872\n",
+ "10.0 0.8777777777777778 0.3328871432717143 0.18921320781833872\n",
+ "11.0 0.8666666666666667 0.33316849178955765 0.18921320781833872\n",
+ "12.0 0.8555555555555556 0.33327259658703995 0.18921320781833872\n",
+ "Saving figure to file figs/chap12-figEx03a.pdf\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "gamma = 0.50\n",
+ "price_per_dose = 100\n",
+ "\n",
+ "for doses in dose_array:\n",
+ " fraction = doses / num_students\n",
+ " spending = budget - doses * price_per_dose\n",
+ " \n",
+ " system = make_system(beta, gamma)\n",
+ " add_immunization(system, fraction)\n",
+ " add_hand_washing(system, spending)\n",
+ " \n",
+ " results, run_simulation(system, update_func)\n",
+ " print(doses, system.init.S, system.beta, calc_total_infected(results))\n",
+ " \n",
+ "infected_sweep = sweep_doses(dose_array)\n",
+ "\n",
+ "plot(infected_sweep)\n",
+ "\n",
+ "decorate(xlabel='Doses of vaccine',\n",
+ " ylabel='Total fraction infected',\n",
+ " title='Total infections vs. doses',\n",
+ " legend=False)\n",
+ "\n",
+ "savefig('figs/chap12-figEx03b.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "For quarantines within 1 day, the infection does not spread at all (assuming patient zero is quarantined). Strictly speaking the model breaks down here as total fraction infected is always well below 1. In this case there is no benefit to vaccination or campaign. A better model may be to assume the quarantine does not go into effect for a few days, so that gamma changes from 0.25 to on a certain day, maybe the day when I+R = 4.\n",
+ "\n",
+ "For quarntines within 2 days, gamma is 0.5. This data also suggests the infection does not spread beyond patient zero. \n",
+ "\n",
+ "This is all assuming the $1200 is spent anyway. The model should be run again with different gamma and no spending."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 123,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.333 1.0 0.005444246402198316\n"
+ ]
+ }
+ ],
+ "source": [
+ "beta = 0.333\n",
+ "gamma = 1.0\n",
+ "system = make_system(beta, gamma)\n",
+ "\n",
+ "results = run_simulation(system, update_func)\n",
+ "print(beta, gamma, calc_total_infected(results))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 124,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.333 0.5 0.02084488550513308\n"
+ ]
+ }
+ ],
+ "source": [
+ "beta = 0.333\n",
+ "gamma = 0.5\n",
+ "system = make_system(beta, gamma)\n",
+ "\n",
+ "results = run_simulation(system, update_func)\n",
+ "print(beta, gamma, calc_total_infected(results))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 127,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.333 0.33 0.13792154260074818\n"
+ ]
+ }
+ ],
+ "source": [
+ "beta = 0.333\n",
+ "gamma = 0.33\n",
+ "system = make_system(beta, gamma)\n",
+ "\n",
+ "results = run_simulation(system, update_func)\n",
+ "print(beta, gamma, calc_total_infected(results))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "1-d quarantine model suggests no additional infections. 2-d quarantine model suggest 1 additional infection. 3-d still quite effective, 12 additional infections as compared to 46 with no quarantine.\n",
+ "\n",
+ "So what about 3-d and spending? Figure Ex03c below shows the best use of the $1200 is 2 vaccinations and $1000 on hte hand wshing campaign. Now there are only 3 additional infectios."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 129,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.0 0.9888888888888889 0.2668457438715574 0.13792154260074818\n",
+ "1.0 0.9777777777777779 0.2675978815834753 0.13792154260074818\n",
+ "2.0 0.9666666666666667 0.269558563153626 0.13792154260074818\n",
+ "3.0 0.9555555555555556 0.27433891460667303 0.13792154260074818\n",
+ "4.0 0.9444444444444445 0.2843114986632417 0.13792154260074818\n",
+ "5.0 0.9333333333333333 0.2997 0.13792154260074818\n",
+ "6.0 0.9222222222222223 0.3150885013367583 0.13792154260074818\n",
+ "7.0 0.9111111111111112 0.325061085393327 0.13792154260074818\n",
+ "8.0 0.9 0.32984143684637407 0.13792154260074818\n",
+ "9.0 0.888888888888889 0.33180211841652474 0.13792154260074818\n",
+ "10.0 0.8777777777777778 0.33255425612844264 0.13792154260074818\n",
+ "11.0 0.8666666666666667 0.33283532329776816 0.13792154260074818\n",
+ "12.0 0.8555555555555556 0.33293932399045295 0.13792154260074818\n",
+ "Saving figure to file figs/chap12-figEx03c.pdf\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "gamma = 0.333\n",
+ "\n",
+ "\n",
+ "for doses in dose_array:\n",
+ " fraction = doses / num_students\n",
+ " spending = budget - doses * price_per_dose\n",
+ " \n",
+ " system = make_system(beta, gamma)\n",
+ " add_immunization(system, fraction)\n",
+ " add_hand_washing(system, spending)\n",
+ " \n",
+ " results, run_simulation(system, update_func)\n",
+ " print(doses, system.init.S, system.beta, calc_total_infected(results))\n",
+ " \n",
+ "infected_sweep = sweep_doses(dose_array)\n",
+ "\n",
+ "plot(infected_sweep)\n",
+ "\n",
+ "decorate(xlabel='Doses of vaccine',\n",
+ " ylabel='Total fraction infected',\n",
+ " title='Total infections vs. doses',\n",
+ " legend=False)\n",
+ "\n",
+ "savefig('figs/chap12-figEx03c.pdf')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.6.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/code/chap01mneal.ipynb b/code/chap01mneal.ipynb
new file mode 100644
index 00000000..ad79fb35
--- /dev/null
+++ b/code/chap01mneal.ipynb
@@ -0,0 +1,564 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Modeling and Simulation in Python\n",
+ "\n",
+ "Chapter 1\n",
+ "\n",
+ "Copyright 2017 Allen Downey\n",
+ "\n",
+ "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Jupyter\n",
+ "\n",
+ "Welcome to Modeling and Simulation, welcome to Python, and welcome to Jupyter.\n",
+ "\n",
+ "This is a Jupyter notebook, which is a development environment where you can write and run Python code. Each notebook is divided into cells. Each cell contains either text (like this cell) or Python code (like the cell below this one).\n",
+ "\n",
+ "### Selecting and running cells\n",
+ "\n",
+ "To select a cell, click in the left margin next to the cell. You should see a blue frame surrounding the selected cell.\n",
+ "\n",
+ "To edit a code cell, click inside the cell. You should see a green frame around the selected cell, and you should see a cursor inside the cell.\n",
+ "\n",
+ "To edit a text cell, triple-click inside the cell. Again, you should see a green frame around the selected cell, and you should see a cursor inside the cell.\n",
+ "\n",
+ "To run a cell, hold down SHIFT and press ENTER. \n",
+ "\n",
+ "* If you run a text cell, Jupyter typesets the text and displays the result.\n",
+ "\n",
+ "* If you run a code cell, it runs the Python code in the cell and displays the result, if any.\n",
+ "\n",
+ "To try it out, edit this cell, change some of the text, and then press SHIFT-ENTER to run it. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Adding and removing cells\n",
+ "\n",
+ "You can add and remove cells from a notebook using the buttons in the toolbar and the items in the menu, both of which you should see at the top of this notebook.\n",
+ "\n",
+ "Try the following exercises:\n",
+ "\n",
+ "1. From the Insert menu select \"Insert cell below\" to add a cell below this one. By default, you get a code cell, as you can see in the pulldown menu that says \"Code\".\n",
+ "\n",
+ "2. In the new cell, add a print statement like `print('Hello')`, and run it.\n",
+ "\n",
+ "3. Add another cell, select the new cell, and then click on the pulldown menu that says \"Code\" and select \"Markdown\". This makes the new cell a text cell.\n",
+ "\n",
+ "4. In the new cell, type some text, and then run it.\n",
+ "\n",
+ "5. Use the arrow buttons in the toolbar to move cells up and down.\n",
+ "\n",
+ "6. Use the cut, copy, and paste buttons to delete, add, and move cells.\n",
+ "\n",
+ "7. As you make changes, Jupyter saves your notebook automatically, but if you want to make sure, you can press the save button, which looks like a floppy disk from the 1990s.\n",
+ "\n",
+ "8. Finally, when you are done with a notebook, select \"Close and Halt\" from the File menu."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Hi there!\n"
+ ]
+ }
+ ],
+ "source": [
+ "print ('Hi there!')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "When code is written, code is run"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Using the notebooks\n",
+ "\n",
+ "The notebooks for each chapter contain the code from the chapter along with addition examples, explanatory text, and exercises. I recommend you \n",
+ "\n",
+ "1. Read the chapter first to understand the concepts and vocabulary, \n",
+ "2. Run the notebook to review what you learned and see it in action, and then\n",
+ "3. Attempt the exercises.\n",
+ "\n",
+ "If you try to work through the notebooks without reading the book, you're gonna have a bad time. The notebooks contain some explanatory text, but it is probably not enough to make sense if you have not read the book. If you are working through a notebook and you get stuck, you might want to re-read (or read!) the corresponding section of the book."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Importing modsim\n",
+ "\n",
+ "The following cell imports `modsim`, which is a collection of functions we will use throughout the book. Whenever you start the notebook, you will have to run the following cell. It does two things:\n",
+ "\n",
+ "1. It uses a Jupyter \"magic command\" to specify whether figures should appear in the notebook, or pop up in a new window.\n",
+ "\n",
+ "2. It imports everything defined in `modsim`.\n",
+ "\n",
+ "Select the following cell and press SHIFT-ENTER to run it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "If this cell runs successfully, it produces no output other than this message.\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Configure Jupyter so figures appear in the notebook\n",
+ "%matplotlib inline\n",
+ "\n",
+ "# Configure Jupyter to display the assigned value after an assignment\n",
+ "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n",
+ "\n",
+ "# import functions from the modsim library\n",
+ "from modsim import *\n",
+ "\n",
+ "print('If this cell runs successfully, it produces no output other than this message.')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The first time you run this on a new installation of Python, it might produce a warning message in pink. That's probably ok, but if you get a message that says `modsim.py depends on Python 3.6 features`, that means you have an older version of Python, and some features in `modsim.py` won't work correctly.\n",
+ "\n",
+ "If you need a newer version of Python, I recommend installing Anaconda. You'll find more information in the preface of the book."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## The penny myth\n",
+ "\n",
+ "The following cells contain code from the beginning of Chapter 1.\n",
+ "\n",
+ "`modsim` defines `UNITS`, which contains variables representing pretty much every unit you've ever heard of. It uses [Pint](https://pint.readthedocs.io/en/latest/), which is a Python library that provides tools for computing with units.\n",
+ "\n",
+ "The following lines create new variables named `meter` and `second`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "meter"
+ ],
+ "text/latex": [
+ "$meter$"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "meter = UNITS.meter"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "second"
+ ],
+ "text/latex": [
+ "$second$"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "second = UNITS.second"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "To find out what other units are defined, type `UNITS.` (including the period) in the next cell and then press TAB. You should see a pop-up menu with a list of units."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "SyntaxError",
+ "evalue": "invalid syntax (, line 1)",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m1\u001b[0m\n\u001b[1;33m UNITS.\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n"
+ ]
+ }
+ ],
+ "source": [
+ "UNITS."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Create a variable named `a` and give it the value of acceleration due to gravity."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "a = 9.8 * meter / second**2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "Create `t` and give it the value 4 seconds."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "t = 4 * second"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "Compute the distance a penny would fall after `t` seconds with constant acceleration `a`. Notice that the units of the result are correct."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "a * t**2 / 2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise**: Compute the velocity of the penny after `t` seconds. Check that the units of the result are correct."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "t * a"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise**: Why would it be nonsensical to add `a` and `t`? It's like adding apples and oranges. What happens if you try? You get orples and apanges."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "a + t"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The error messages you get from Python are big and scary, but if you read them carefully, they contain a lot of useful information.\n",
+ "\n",
+ "1. Start from the bottom and read up.\n",
+ "2. The last line usually tells you what type of error happened, and sometimes additional information.\n",
+ "3. The previous lines are a \"traceback\" of what was happening when the error occurred. The first section of the traceback shows the code you wrote. The following sections are often from Python libraries.\n",
+ "\n",
+ "In this example, you should get a `DimensionalityError`, which is defined by Pint to indicate that you have violated a rules of dimensional analysis: you cannot add quantities with different dimensions."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "## Falling pennies\n",
+ "\n",
+ "Now let's solve the falling penny problem.\n",
+ "\n",
+ "Set `h` to the height of the Empire State Building:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "h = 381 * meter"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Compute the time it would take a penny to fall, assuming constant acceleration.\n",
+ "\n",
+ "$ a t^2 / 2 = h $\n",
+ "\n",
+ "$ t = \\sqrt{2 h / a}$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "t = sqrt(2 * h / a)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "Given `t`, we can compute the velocity of the penny when it lands.\n",
+ "\n",
+ "$v = a t$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "v = a * t\n",
+ "v"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "We can convert from one set of units to another like this:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "mile = UNITS.mile\n",
+ "hour= UNITS.hour"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "v.to(mile/hour)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "foot = UNITS.foot\n",
+ "pole_height = 10 * foot"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Suppose you bring a 10 foot pole to the top of the Empire State Building and use it to drop the penny from `h` plus 10 feet.\n",
+ "\n",
+ "Define a variable named `foot` that contains the unit `foot` provided by `UNITS`. Define a variable named `pole_height` and give it the value 10 feet.\n",
+ "\n",
+ "What happens if you add `h`, which is in units of meters, to `pole_height`, which is in units of feet? What happens if you write the addition the other way around?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "pole_height + h"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** In reality, air resistance limits the velocity of the penny. At about 18 meters per second, the force of air resistance equals the force of gravity and the penny stops accelerating.\n",
+ "\n",
+ "As a simplification, let's assume that the acceleration of the penny is `a` until the penny reaches 18 meters per second, and then 0 afterwards. What is the total time for the penny to fall 381 meters?\n",
+ "\n",
+ "You can break this question into three parts:\n",
+ "\n",
+ "1. How long until the penny reaches 18 meters per second with constant acceleration `a`.\n",
+ "2. How far would the penny fall during that time?\n",
+ "3. How long to fall the remaining distance with constant velocity 18 m/s?\n",
+ "\n",
+ "Suggestion: Assign each intermediate result to a variable with a meaningful name. And assign units to all quantities!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "v_terminal = 18*meter/second"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "t_terminal = v_terminal / a"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "h_term = a * t_terminal**2 / 2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "t_rem = ( h - h_term ) / v_terminal"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "t_total = t_terminal + t_rem"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Restart and run all\n",
+ "\n",
+ "When you change the contents of a cell, you have to run it again for those changes to have an effect. If you forget to do that, the results can be confusing, because the code you are looking at is not the code you ran.\n",
+ "\n",
+ "If you ever lose track of which cells have run, and in what order, you should go to the Kernel menu and select \"Restart & Run All\". Restarting the kernel means that all of your variables get deleted, and running all the cells means all of your code will run again, in the right order.\n",
+ "\n",
+ "**Exercise:** Select \"Restart & Run All\" now and confirm that it does what you want."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.6.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/code/chap02mneal.ipynb b/code/chap02mneal.ipynb
new file mode 100644
index 00000000..968a7dbe
--- /dev/null
+++ b/code/chap02mneal.ipynb
@@ -0,0 +1,2790 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Modeling and Simulation in Python\n",
+ "\n",
+ "Chapter 2\n",
+ "\n",
+ "Copyright 2017 Allen Downey\n",
+ "\n",
+ "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Done\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Configure Jupyter so figures appear in the notebook\n",
+ "%matplotlib inline\n",
+ "\n",
+ "# Configure Jupyter to display the assigned value after an assignment\n",
+ "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n",
+ "\n",
+ "# import functions from the modsim library\n",
+ "from modsim import *\n",
+ "\n",
+ "# set the random number generator\n",
+ "np.random.seed(7)\n",
+ "print ('Done')\n",
+ "\n",
+ "# If this cell runs successfully, it prinds 'Done'."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Modeling a bikeshare system"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We'll start with a `State` object that represents the number of bikes at each station.\n",
+ "\n",
+ "When you display a `State` object, it lists the state variables and their values:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
values
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
olin
\n",
+ "
10
\n",
+ "
\n",
+ "
\n",
+ "
wellesley
\n",
+ "
2
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "olin 10\n",
+ "wellesley 2\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bikeshare = State(olin=10, wellesley=2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can access the state variables using dot notation."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "10"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bikeshare.olin"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "ename": "AttributeError",
+ "evalue": "'State' object has no attribute 'wellesly'",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
+ "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mbikeshare\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwellesly\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36m__getattr__\u001b[1;34m(self, name)\u001b[0m\n\u001b[0;32m 4370\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_info_axis\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_can_hold_identifiers_and_holds_name\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4371\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 4372\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mobject\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__getattribute__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4373\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4374\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__setattr__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
+ "\u001b[1;31mAttributeError\u001b[0m: 'State' object has no attribute 'wellesly'"
+ ]
+ }
+ ],
+ "source": [
+ "bikeshare.wellesly"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** What happens if you spell the name of a state variable wrong? Edit the previous cell, change the spelling of `wellesley`, and run the cell again.\n",
+ "\n",
+ "The error message uses the word \"attribute\", which is another name for what we are calling a state variable. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Add a third attribute called `babson` with initial value 0, and display the state of `bikeshare` again."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot(results, label='Olin')\n",
+ "\n",
+ "decorate(title='Olin-Wellesley Bikeshare',\n",
+ " xlabel='Time step (min)', \n",
+ " ylabel='Number of bikes')\n",
+ "\n",
+ "savefig('chap02-fig01.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "`decorate`, which is defined in the `modsim` library, adds a title and labels the axes."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 67,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Help on function decorate in module modsim:\n",
+ "\n",
+ "decorate(**options)\n",
+ " Decorate the current axes.\n",
+ " \n",
+ " Call decorate with keyword arguments like\n",
+ " \n",
+ " decorate(title='Title',\n",
+ " xlabel='x',\n",
+ " ylabel='y')\n",
+ " \n",
+ " The keyword arguments can be any of the axis properties\n",
+ " \n",
+ " https://matplotlib.org/api/axes_api.html\n",
+ " \n",
+ " In addition, you can use `legend=False` to suppress the legend.\n",
+ " \n",
+ " And you can use `loc` to indicate the location of the legend\n",
+ " (the default value is 'best')\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "help(decorate)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "`savefig()` saves a figure in a file."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 68,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Help on function savefig in module modsim:\n",
+ "\n",
+ "savefig(filename, **options)\n",
+ " Save the current figure.\n",
+ " \n",
+ " Keyword arguments are passed along to plt.savefig\n",
+ " \n",
+ " https://matplotlib.org/api/_as_gen/matplotlib.pyplot.savefig.html\n",
+ " \n",
+ " filename: string\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "help(savefig)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The suffix of the filename indicates the format you want. This example saves the current figure in a PDF file named `chap01-fig01.pdf`."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Wrap the code from this section in a function named `run_simulation` that takes three parameters, named `p1`, `p2`, and `num_steps`.\n",
+ "\n",
+ "It should:\n",
+ "\n",
+ "1. Create a `TimeSeries` object to hold the results.\n",
+ "2. Use a for loop to run `step` the number of times specified by `num_steps`, passing along the specified values of `p1` and `p2`.\n",
+ "3. After each step, it should save the number of bikes at Olin in the `TimeSeries`.\n",
+ "4. After the for loop, it should plot the results and\n",
+ "5. Decorate the axes.\n",
+ "\n",
+ "To test your function:\n",
+ "\n",
+ "1. Create a `State` object with the initial state of the system.\n",
+ "2. Call `run_simulation` with appropriate parameters.\n",
+ "3. Save the resulting figure."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 104,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "bikeshare=State(olin=10,wellesley=2)\n",
+ "run_simulation(0.4,0.3,60)\n",
+ "savefig('Chap01_Fig02.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Modify your solution to the previous exercise so it creates two `TimeSeries` objects, keeps track of the number of bikes at Wellesley and at Olin, and plots both series at the end."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 145,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def run_simulation(p1,p2,num_steps):\n",
+ " Oresults=TimeSeries()\n",
+ " Wresults=TimeSeries()\n",
+ " for i in range(num_steps):\n",
+ " step(p1,p2)\n",
+ " Oresults[i]=bikeshare.olin\n",
+ " Wresults[i]=bikeshare.wellesley\n",
+ " plot(Oresults,label='Olin')\n",
+ " plot(Wresults,label='Wellesley')\n",
+ " decorate(title='Olin-Wellesley Bikeshare',\n",
+ " xlabel='Time step (min)', \n",
+ " ylabel='Number of bikes')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 146,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file Chap01_Fig02a.pdf\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "bikeshare=State(olin=10,wellesley=2)\n",
+ "run_simulation(0.4,0.3,60)\n",
+ "savefig('Chap01_Fig02a.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Congratulations on completing the first notebook! When you did the exercises, you didn't have to write much new code; mostly, you just copied and modified the examples. If you didn't understand everything you did completely I encourage you to take a break for now and come back to this notebook one more time before you start Chapter 2. We are covering a lot of topics quickly; you might need to reread the book and review the code to solidify your knowledge. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Opening the hood\n",
+ "\n",
+ "The functions in `modsim.py` are built on top of several widely-used Python libraries, especially NumPy, SciPy, and Pandas. These libraries are powerful but can be hard to use. The intent of `modsim.py` is to give you the power of these libraries while making it easy to get started.\n",
+ "\n",
+ "In the future, you might want to use these libraries directly, rather than using `modsim.py`. So at the end of each chapter we will open the hood and let you see how `modsim.py` works.\n",
+ "\n",
+ "You don't need to know anything in these sections, so if you are already feeling overwhelmed, you might want to skip them. But if you are curious, read on."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Pandas\n",
+ "\n",
+ "This chapter introduced two objects, `State` and `TimeSeries`. Both are based on the `Series` object defined by Pandas, which is a library primarily used for data science.\n",
+ "\n",
+ "You can read the documentation of the `Series` object [here](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)\n",
+ "\n",
+ "The primary differences between `TimeSeries` and `Series` are:\n",
+ "\n",
+ "1. I made it easier to create a new, empty `Series` while avoiding a [confusing inconsistency](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html).\n",
+ "\n",
+ "2. I provide a function so the `Series` looks good when displayed in Jupyter.\n",
+ "\n",
+ "3. I provide a function called `set` that we'll use later.\n",
+ "\n",
+ "`State` has all of those capabilities; in addition, it provides an easier way to initialize state variables, and it provides functions called `T` and `dt`, which will help us avoid a confusing error later."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Pyplot\n",
+ "\n",
+ "The `plot` function in `modsim.py` is based on the `plot` function in Pyplot, which is part of Matplotlib. You can read the documentation of `plot` [here](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html).\n",
+ "\n",
+ "`decorate` provides a convenient way to call the `pyplot` functions `title`, `xlabel`, and `ylabel`, and `legend`. It also avoids an annoying warning message if you try to make a legend when you don't have any labelled lines."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "help(decorate)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### NumPy\n",
+ "\n",
+ "The `flip` function in `modsim.py` uses NumPy's `random` function to generate a random number between 0 and 1.\n",
+ "\n",
+ "You can get the source code for `flip` by running the following cell."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 147,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "def flip(p=0.5):\n",
+ " \"\"\"Flips a coin with the given probability.\n",
+ "\n",
+ " p: float 0-1\n",
+ "\n",
+ " returns: boolean (True or False)\n",
+ " \"\"\"\n",
+ " return np.random.random() < p\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "source_code(flip)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "You can also get the source code for `source_code`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "source_code(source_code)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.6.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/code/chap03mneal.ipynb b/code/chap03mneal.ipynb
new file mode 100644
index 00000000..47d2dcf2
--- /dev/null
+++ b/code/chap03mneal.ipynb
@@ -0,0 +1,1254 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Modeling and Simulation in Python\n",
+ "\n",
+ "Chapter 3\n",
+ "\n",
+ "Copyright 2017 Allen Downey\n",
+ "\n",
+ "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Configure Jupyter so figures appear in the notebook\n",
+ "%matplotlib inline\n",
+ "\n",
+ "# Configure Jupyter to display the assigned value after an assignment\n",
+ "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n",
+ "\n",
+ "# import functions from the modsim library\n",
+ "from modsim import *\n",
+ "\n",
+ "# set the random number generator\n",
+ "np.random.seed(7)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## More than one State object\n",
+ "\n",
+ "Here's the code from the previous chapter, with two changes:\n",
+ "\n",
+ "1. I've added DocStrings that explain what each function does, and what parameters it takes.\n",
+ "\n",
+ "2. I've added a parameter named `state` to the functions so they work with whatever `State` object we give them, instead of always using `bikeshare`. That makes it possible to work with more than one `State` object."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def step(state, p1, p2):\n",
+ " \"\"\"Simulate one minute of time.\n",
+ " \n",
+ " state: bikeshare State object\n",
+ " p1: probability of an Olin->Wellesley customer arrival\n",
+ " p2: probability of a Wellesley->Olin customer arrival\n",
+ " \"\"\"\n",
+ " if flip(p1):\n",
+ " bike_to_wellesley(state)\n",
+ " \n",
+ " if flip(p2):\n",
+ " bike_to_olin(state)\n",
+ " \n",
+ "def bike_to_wellesley(state):\n",
+ " \"\"\"Move one bike from Olin to Wellesley.\n",
+ " \n",
+ " state: bikeshare State object\n",
+ " \"\"\"\n",
+ " move_bike(state, 1)\n",
+ " \n",
+ "def bike_to_olin(state):\n",
+ " \"\"\"Move one bike from Wellesley to Olin.\n",
+ " \n",
+ " state: bikeshare State object\n",
+ " \"\"\"\n",
+ " move_bike(state, -1)\n",
+ " \n",
+ "def move_bike(state, n):\n",
+ " \"\"\"Move a bike.\n",
+ " \n",
+ " state: bikeshare State object\n",
+ " n: +1 to move from Olin to Wellesley or\n",
+ " -1 to move from Wellesley to Olin\n",
+ " \"\"\"\n",
+ " state.olin -= n\n",
+ " state.wellesley += n\n",
+ " \n",
+ "def decorate_bikeshare():\n",
+ " \"\"\"Add a title and label the axes.\"\"\"\n",
+ " decorate(title='Olin-Wellesley Bikeshare',\n",
+ " xlabel='Time step (min)', \n",
+ " ylabel='Number of bikes')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And here's `run_simulation`, which is a solution to the exercise at the end of the previous notebook."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def run_simulation(state, p1, p2, num_steps):\n",
+ " \"\"\"Simulate the given number of time steps.\n",
+ " \n",
+ " state: State object\n",
+ " p1: probability of an Olin->Wellesley customer arrival\n",
+ " p2: probability of a Wellesley->Olin customer arrival\n",
+ " num_steps: number of time steps\n",
+ " \"\"\"\n",
+ " results = TimeSeries() \n",
+ " for i in range(num_steps):\n",
+ " step(state, p1, p2)\n",
+ " results[i] = state.olin\n",
+ " \n",
+ " plot(results, label='Olin')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we can create more than one `State` object:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ "olin 1\n",
+ "wellesley 11\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bikeshare2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Negative bikes"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In the code we have so far, the number of bikes at one of the locations can go negative, and the number of bikes at the other location can exceed the actual number of bikes in the system.\n",
+ "\n",
+ "If you run this simulation a few times, it happens often."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "bikeshare = State(olin=10, wellesley=2)\n",
+ "run_simulation(bikeshare, 0.4, 0.2, 60)\n",
+ "decorate_bikeshare()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can fix this problem using the `return` statement to exit the function early if the update would cause negative bikes."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def move_bike(state, n):\n",
+ " \"\"\"Move a bike.\n",
+ " \n",
+ " state: bikeshare State object\n",
+ " n: +1 to move from Olin to Wellesley or\n",
+ " -1 to move from Wellesley to Olin\n",
+ " \"\"\"\n",
+ " # make sure the number of bikes won't go negative\n",
+ " olin_temp = state.olin - n\n",
+ " if olin_temp < 0:\n",
+ " return\n",
+ " \n",
+ " wellesley_temp = state.wellesley + n\n",
+ " if wellesley_temp < 0:\n",
+ " return\n",
+ " \n",
+ " # update the state\n",
+ " state.olin = olin_temp\n",
+ " state.wellesley = wellesley_temp"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now if you run the simulation again, it should behave."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ ":(\n",
+ ":(\n",
+ ":(\n",
+ ":(\n",
+ ":(\n",
+ ":(\n",
+ ":(\n",
+ ":(\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "bikeshare = State(olin=10, wellesley=2)\n",
+ "run_simulation(bikeshare, 0.4, 0.2, 60)\n",
+ "decorate_bikeshare()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The variables `olin` and `wellesley` are created inside `move_bike`, so they are local. When the function ends, they go away.\n",
+ "\n",
+ "If you try to access a local variable from outside its function, you get an error:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "NameError",
+ "evalue": "name 'olin' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
+ "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;31m# NameError: name 'olin' is not defined\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0molin\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[1;31mNameError\u001b[0m: name 'olin' is not defined"
+ ]
+ }
+ ],
+ "source": [
+ "# If you remove the # from the last line in this cell and run it, you'll get\n",
+ "# NameError: name 'olin' is not defined\n",
+ "\n",
+ "olin"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Add print statements in `move_bike` so it prints a message each time a customer arrives and doesn't find a bike. Run the simulation again to confirm that it works as you expect. Then remove the print statements before you go on."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Comparison operators"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The `if` statements in the previous section used the comparison operator `<`. The other comparison operators are listed in the book.\n",
+ "\n",
+ "It is easy to confuse the comparison operator `==` with the assignment operator `=`.\n",
+ "\n",
+ "Remember that `=` creates a variable or gives an existing variable a new value."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "5"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x = 5"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Whereas `==` compared two values and returns `True` if they are equal."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "True"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x == 5"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "You can use `==` in an `if` statement."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "yes, x is 5\n"
+ ]
+ }
+ ],
+ "source": [
+ "if x == 5:\n",
+ " print('yes, x is 5')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "But if you use `=` in an `if` statement, you get an error."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "SyntaxError",
+ "evalue": "invalid syntax (, line 4)",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m4\u001b[0m\n\u001b[1;33m if x = 5:\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n"
+ ]
+ }
+ ],
+ "source": [
+ "# If you remove the # from the if statement and run it, you'll get\n",
+ "# SyntaxError: invalid syntax\n",
+ "\n",
+ "if x = 5:\n",
+ " print('yes, x is 5')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Add an `else` clause to the `if` statement above, and print an appropriate message.\n",
+ "\n",
+ "Replace the `==` operator with one or two of the other comparison operators, and confirm they do what you expect."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "yes, x is 5\n"
+ ]
+ }
+ ],
+ "source": [
+ "if x == 5:\n",
+ " print('yes, x is 5')\n",
+ "else:\n",
+ " print('No, x is not 5')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "yes, x is 5\n"
+ ]
+ }
+ ],
+ "source": [
+ "if x != 5:\n",
+ " print('no, x is not 5')\n",
+ "else:\n",
+ " print('yes, x is 5')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Metrics"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now that we have a working simulation, we'll use it to evaluate alternative designs and see how good or bad they are. The metric we'll use is the number of customers who arrive and find no bikes available, which might indicate a design problem."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "First we'll make a new `State` object that creates and initializes additional state variables to keep track of the metrics."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "bikeshare = State(olin=10,wellesley=2,clock=0,olin_empty=0,wellesley_empty=0, t_first_empty=-1)\n",
+ "run_simulation(bikeshare, 0.4, 0.2, 60)\n",
+ "decorate_bikeshare()\n",
+ "print('clock is at ',bikeshare.clock, ' steps')\n",
+ "savefig('chap02-fig01a.pdf')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Solution goes here"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Continuing the previous exercise, let's record the time when the first customer arrives and doesn't find a bike.\n",
+ "\n",
+ "1. Create a new `State` object with an additional state variable, `t_first_empty`, initialized to -1 as a special value to indicate that it has not been set. \n",
+ "\n",
+ "2. Write a modified version of `step` that checks whether`olin_empty` and `wellesley_empty` are 0. If not, it should set `t_first_value` to `clock` (but only if `t_first_value` has not already been set).\n",
+ "\n",
+ "Test your code by running the simulation and printing the values of `olin_empty`, `wellesley_empty`, and `t_first_empty` at the end."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "bikeshare = State(olin=10,wellesley=2,clock=0,olin_empty=0,wellesley_empty=0,t_first_empty=-1)\n",
+ "run_simulation(bikeshare, 0.4, 0.2, 60)\n",
+ "decorate_bikeshare()\n",
+ "print(bikeshare.olin_empty,bikeshare.wellesley_empty,bikeshare.t_first_empty)\n",
+ "savefig('chap02-fig01b.pdf')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Solution goes here"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.6.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/code/chap04mneal.ipynb b/code/chap04mneal.ipynb
new file mode 100644
index 00000000..da4b7404
--- /dev/null
+++ b/code/chap04mneal.ipynb
@@ -0,0 +1,1147 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Modeling and Simulation in Python\n",
+ "\n",
+ "Chapter 4\n",
+ "\n",
+ "Copyright 2017 Allen Downey\n",
+ "\n",
+ "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Configure Jupyter so figures appear in the notebook\n",
+ "%matplotlib inline\n",
+ "\n",
+ "# Configure Jupyter to display the assigned value after an assignment\n",
+ "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n",
+ "\n",
+ "# import functions from the modsim library\n",
+ "from modsim import *"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Returning values"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's a simple function that returns a value:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def add_five(x):\n",
+ " return x + 5"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And here's how we call it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "8"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y = add_five(3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "If you run a function on the last line of a cell, Jupyter displays the result:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "10"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "add_five(5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "But that can be a bad habit, because usually if you call a function and don't assign the result in a variable, the result gets discarded.\n",
+ "\n",
+ "In the following example, Jupyter shows the second result, but the first result just disappears."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "10"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "add_five(3)\n",
+ "add_five(5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "When you call a function that returns a variable, it is generally a good idea to assign the result to a variable."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "8 10\n"
+ ]
+ }
+ ],
+ "source": [
+ "y1 = add_five(3)\n",
+ "y2 = add_five(5)\n",
+ "\n",
+ "print(y1, y2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Write a function called `make_state` that creates a `State` object with the state variables `olin=10` and `wellesley=2`, and then returns the new `State` object.\n",
+ "\n",
+ "Write a line of code that calls `make_state` and assigns the result to a variable named `init`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def make_state():\n",
+ " state=State(olin=10, wellesley=2)\n",
+ " return state"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "10 2\n"
+ ]
+ }
+ ],
+ "source": [
+ "init = make_state()\n",
+ "print(init.olin, init.wellesley)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Running simulations"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's the code from the previous notebook."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def step(state, p1, p2):\n",
+ " \"\"\"Simulate one minute of time.\n",
+ " \n",
+ " state: bikeshare State object\n",
+ " p1: probability of an Olin->Wellesley customer arrival\n",
+ " p2: probability of a Wellesley->Olin customer arrival\n",
+ " \"\"\"\n",
+ " if flip(p1):\n",
+ " bike_to_wellesley(state)\n",
+ " \n",
+ " if flip(p2):\n",
+ " bike_to_olin(state)\n",
+ " \n",
+ "def bike_to_wellesley(state):\n",
+ " \"\"\"Move one bike from Olin to Wellesley.\n",
+ " \n",
+ " state: bikeshare State object\n",
+ " \"\"\"\n",
+ " move_bike(state, 1)\n",
+ " \n",
+ "def bike_to_olin(state):\n",
+ " \"\"\"Move one bike from Wellesley to Olin.\n",
+ " \n",
+ " state: bikeshare State object\n",
+ " \"\"\"\n",
+ " move_bike(state, -1)\n",
+ " \n",
+ "def move_bike(state, n):\n",
+ " \"\"\"Move a bike.\n",
+ " \n",
+ " state: bikeshare State object\n",
+ " n: +1 to move from Olin to Wellesley or\n",
+ " -1 to move from Wellesley to Olin\n",
+ " \"\"\"\n",
+ " olin_temp = state.olin - n\n",
+ " if olin_temp < 0:\n",
+ " state.olin_empty += 1\n",
+ " return\n",
+ " \n",
+ " wellesley_temp = state.wellesley + n\n",
+ " if wellesley_temp < 0:\n",
+ " state.wellesley_empty += 1\n",
+ " return\n",
+ " \n",
+ " state.olin = olin_temp\n",
+ " state.wellesley = wellesley_temp\n",
+ " \n",
+ "def decorate_bikeshare():\n",
+ " \"\"\"Add a title and label the axes.\"\"\"\n",
+ " decorate(title='Olin-Wellesley Bikeshare',\n",
+ " xlabel='Time step (min)', \n",
+ " ylabel='Number of bikes')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's a modified version of `run_simulation` that creates a `State` object, runs the simulation, and returns the `State` object."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def run_simulation(p1, p2, num_steps):\n",
+ " \"\"\"Simulate the given number of time steps.\n",
+ " \n",
+ " p1: probability of an Olin->Wellesley customer arrival\n",
+ " p2: probability of a Wellesley->Olin customer arrival\n",
+ " num_steps: number of time steps\n",
+ " \"\"\"\n",
+ " state = State(olin=10, wellesley=2, \n",
+ " olin_empty=0, wellesley_empty=0)\n",
+ " \n",
+ " for i in range(num_steps):\n",
+ " step(state, p1, p2)\n",
+ " \n",
+ " return state"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now `run_simulation` doesn't plot anything:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 82,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
values
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
olin
\n",
+ "
1
\n",
+ "
\n",
+ "
\n",
+ "
wellesley
\n",
+ "
11
\n",
+ "
\n",
+ "
\n",
+ "
olin_empty
\n",
+ "
3
\n",
+ "
\n",
+ "
\n",
+ "
wellesley_empty
\n",
+ "
0
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "olin 1\n",
+ "wellesley 11\n",
+ "olin_empty 3\n",
+ "wellesley_empty 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 82,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "state = run_simulation(0.4, 0.2, 60)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "But after the simulation, we can read the metrics from the `State` object."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 83,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "3"
+ ]
+ },
+ "execution_count": 83,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "state.olin_empty"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we can run simulations with different values for the parameters. When `p1` is small, we probably don't run out of bikes at Olin."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 81,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 81,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "state = run_simulation(0.2, 0.2, 60)\n",
+ "state.olin_empty"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "When `p1` is large, we probably do."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 80,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "18"
+ ]
+ },
+ "execution_count": 80,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "state = run_simulation(0.6, 0.2, 60)\n",
+ "state.olin_empty"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## More for loops"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "`linspace` creates a NumPy array of equally spaced numbers."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0. , 0.25, 0.5 , 0.75, 1. ])"
+ ]
+ },
+ "execution_count": 31,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "p1_array = linspace(0, 1, 5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can use an array in a `for` loop, like this:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.0\n",
+ "0.25\n",
+ "0.5\n",
+ "0.75\n",
+ "1.0\n"
+ ]
+ }
+ ],
+ "source": [
+ "for p1 in p1_array:\n",
+ " print(p1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This will come in handy in the next section.\n",
+ "\n",
+ "`linspace` is defined in `modsim.py`. You can get the documentation using `help`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Help on function linspace in module modsim:\n",
+ "\n",
+ "linspace(start, stop, num=50, **options)\n",
+ " Returns an array of evenly-spaced values in the interval [start, stop].\n",
+ " \n",
+ " start: first value\n",
+ " stop: last value\n",
+ " num: number of values\n",
+ " \n",
+ " Also accepts the same keyword arguments as np.linspace. See\n",
+ " https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html\n",
+ " \n",
+ " returns: array or Quantity\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "help(linspace)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "`linspace` is based on a NumPy function with the same name. [Click here](https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html) to read more about how to use it."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** \n",
+ "Use `linspace` to make an array of 10 equally spaced numbers from 1 to 10 (including both)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])"
+ ]
+ },
+ "execution_count": 34,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mn_array=linspace(1,10,10)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** The `modsim` library provides a related function called `linrange`. You can view the documentation by running the following cell:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Help on function linrange in module modsim:\n",
+ "\n",
+ "linrange(start=0, stop=None, step=1, **options)\n",
+ " Returns an array of evenly-spaced values in the interval [start, stop].\n",
+ " \n",
+ " This function works best if the space between start and stop\n",
+ " is divisible by step; otherwise the results might be surprising.\n",
+ " \n",
+ " By default, the last value in the array is `stop` (at least approximately).\n",
+ " If you provide the keyword argument `endpoint=False`, the last value\n",
+ " in the array is `stop-step`.\n",
+ " \n",
+ " start: first value\n",
+ " stop: last value\n",
+ " step: space between values\n",
+ " \n",
+ " Also accepts the same keyword arguments as np.linspace. See\n",
+ " https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html\n",
+ " \n",
+ " returns: array or Quantity\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "help(linrange)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Use `linrange` to make an array of numbers from 1 to 11 with a step size of 2."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 1., 3., 5., 7., 9., 11.])"
+ ]
+ },
+ "execution_count": 36,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mn_array=linrange(1,11,2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Sweeping parameters"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "`p1_array` contains a range of values for `p1`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])"
+ ]
+ },
+ "execution_count": 37,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "p2 = 0.2\n",
+ "num_steps = 60\n",
+ "p1_array = linspace(0, 1, 11)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The following loop runs a simulation for each value of `p1` in `p1_array`; after each simulation, it prints the number of unhappy customers at the Olin station:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.0 0\n",
+ "0.1 0\n",
+ "0.2 0\n",
+ "0.30000000000000004 1\n",
+ "0.4 1\n",
+ "0.5 12\n",
+ "0.6000000000000001 17\n",
+ "0.7000000000000001 22\n",
+ "0.8 27\n",
+ "0.9 34\n",
+ "1.0 35\n"
+ ]
+ }
+ ],
+ "source": [
+ "for p1 in p1_array:\n",
+ " state = run_simulation(p1, p2, num_steps)\n",
+ " print(p1, state.olin_empty)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we can do the same thing, but storing the results in a `SweepSeries` instead of printing them.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "sweep = SweepSeries()\n",
+ "\n",
+ "for p1 in p1_array:\n",
+ " state = run_simulation(p1, p2, num_steps)\n",
+ " sweep[p1] = state.olin_empty"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And then we can plot the results."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file chap02-fig02.pdf\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot(sweep, label='Olin')\n",
+ "\n",
+ "decorate(title='Olin-Wellesley Bikeshare',\n",
+ " xlabel='Arrival rate at Olin (p1 in customers/min)', \n",
+ " ylabel='Number of unhappy customers')\n",
+ "\n",
+ "savefig('chap02-fig02.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Exercises\n",
+ "\n",
+ "**Exercise:** Wrap this code in a function named `sweep_p1` that takes an array called `p1_array` as a parameter. It should create a new `SweepSeries`, run a simulation for each value of `p1` in `p1_array`, store the results in the `SweepSeries`, and return the `SweepSeries`.\n",
+ "\n",
+ "Use your function to plot the number of unhappy customers at Olin as a function of `p1`. Label the axes."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def sweep_p1(p1_array,p2,num_steps):\n",
+ " sweep=SweepSeries()\n",
+ " for p1 in p1_array:\n",
+ " state=run_simulation(p1,p2,num_steps)\n",
+ " sweep[p1]=state.olin_empty\n",
+ " return sweep"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file chap04-fig_ex_1\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "p1_array=linrange(0,1,0.025)\n",
+ "sweep=sweep_p1(p1_array,0.2,600)\n",
+ "plot(sweep,label='Olin')\n",
+ "\n",
+ "decorate(title='Olin-Wellesley Bikeshare', xlabel='Customer arrival rate at Olin', ylabel='Customers who find no bikes available')\n",
+ "\n",
+ "savefig('chap04-fig_ex_1')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Write a function called `sweep_p2` that runs simulations with `p1=0.5` and a range of values for `p2`. It should store the results in a `SweepSeries` and return the `SweepSeries`.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def sweep_p2(p2_array,num_steps):\n",
+ " sweep=SweepSeries()\n",
+ " for p2 in p2_array:\n",
+ " state=run_simulation(0.5,p2,num_steps)\n",
+ " sweep[p2]=state.olin_empty\n",
+ " return sweep"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file chap04-fig_ex_2\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "p2_array=linrange(0,1,0.025)\n",
+ "sweep=sweep_p2(p2_array,600)\n",
+ "plot(sweep,label='Olin')\n",
+ "\n",
+ "decorate(title='Olin-Wellesley Bikeshare', xlabel='Customer arrival rate at Olin', ylabel='Customers who find no bikes available')\n",
+ "\n",
+ "savefig('chap04-fig_ex_2')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Optional exercises\n",
+ "\n",
+ "The following two exercises are a little more challenging. If you are comfortable with what you have learned so far, you should give them a try. If you feel like you have your hands full, you might want to skip them for now.\n",
+ "\n",
+ "**Exercise:** Because our simulations are random, the results vary from one run to another, and the results of a parameter sweep tend to be noisy. We can get a clearer picture of the relationship between a parameter and a metric by running multiple simulations with the same parameter and taking the average of the results.\n",
+ "\n",
+ "Write a function called `run_multiple_simulations` that takes as parameters `p1`, `p2`, `num_steps`, and `num_runs`.\n",
+ "\n",
+ "`num_runs` specifies how many times it should call `run_simulation`.\n",
+ "\n",
+ "After each run, it should store the total number of unhappy customers (at Olin or Wellesley) in a `TimeSeries`. At the end, it should return the `TimeSeries`.\n",
+ "\n",
+ "Test your function with parameters\n",
+ "\n",
+ "```\n",
+ "p1 = 0.3\n",
+ "p2 = 0.3\n",
+ "num_steps = 60\n",
+ "num_runs = 10\n",
+ "```\n",
+ "\n",
+ "Display the resulting `TimeSeries` and use the `mean` function provided by the `TimeSeries` object to compute the average number of unhappy customers."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 88,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def run_simulation(p1, p2, num_steps):\n",
+ " \"\"\"Simulate the given number of time steps.\n",
+ " \n",
+ " p1: probability of an Olin->Wellesley customer arrival\n",
+ " p2: probability of a Wellesley->Olin customer arrival\n",
+ " num_steps: number of time steps\n",
+ " \"\"\"\n",
+ " state = State(olin=10, wellesley=2, \n",
+ " olin_empty=0, wellesley_empty=0)\n",
+ " \n",
+ " for i in range(num_steps):\n",
+ " step(state, p1, p2)\n",
+ " \n",
+ " return state"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 106,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def run_multiple_functions(p1,p2,num_steps,num_runs):\n",
+ " series=TimeSeries()\n",
+ " for i in range(num_runs):\n",
+ " state=run_simulation(p1,p2,num_steps)\n",
+ " series[i]=state.olin_empty\n",
+ " return series "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 142,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Average value is 2.95\n",
+ "0 1\n",
+ "1 16\n",
+ "2 0\n",
+ "3 11\n",
+ "4 0\n",
+ "5 3\n",
+ "6 0\n",
+ "7 0\n",
+ "8 0\n",
+ "9 0\n",
+ "10 0\n",
+ "11 14\n",
+ "12 2\n",
+ "13 0\n",
+ "14 0\n",
+ "15 1\n",
+ "16 0\n",
+ "17 10\n",
+ "18 0\n",
+ "19 1\n",
+ "dtype: int64\n"
+ ]
+ }
+ ],
+ "source": [
+ "series=run_multiple_functions(0.3,0.3,300,20)\n",
+ "average=TimeSeries.mean(series)\n",
+ "print('Average value is ',average)\n",
+ "print(series)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Continuting the previous exercise, use `run_multiple_simulations` to run simulations with a range of values for `p1` and\n",
+ "\n",
+ "```\n",
+ "p2 = 0.3\n",
+ "num_steps = 60\n",
+ "num_runs = 20\n",
+ "```\n",
+ "\n",
+ "Store the results in a `SweepSeries`, then plot the average number of unhappy customers as a function of `p1`. Label the axes.\n",
+ "\n",
+ "What value of `p1` minimizes the average number of unhappy customers?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 184,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def run_multiple_functions(p1_array):\n",
+ " sweep=SweepSeries()\n",
+ " for p1 in p1_array:\n",
+ " series_t=TimeSeries()\n",
+ " for i in range(20):\n",
+ " state=run_simulation(p1,0.3,60)\n",
+ " series_t[i]=state.olin_empty\n",
+ " sweep[p1]=TimeSeries.mean(series_t)\n",
+ " #print(sweep)\n",
+ " return sweep"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 185,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.00 0.00\n",
+ "0.05 0.00\n",
+ "0.10 0.00\n",
+ "0.15 0.00\n",
+ "0.20 0.00\n",
+ "0.25 0.00\n",
+ "0.30 0.00\n",
+ "0.35 0.10\n",
+ "0.40 1.65\n",
+ "0.45 2.75\n",
+ "0.50 4.85\n",
+ "0.55 6.70\n",
+ "0.60 7.80\n",
+ "0.65 11.65\n",
+ "0.70 13.95\n",
+ "0.75 18.65\n",
+ "0.80 20.00\n",
+ "0.85 21.80\n",
+ "0.90 26.60\n",
+ "0.95 29.00\n",
+ "1.00 31.65\n",
+ "dtype: float64\n",
+ "Saving figure to file chap04-figEx4.pdf\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "p1_array=linrange(0,1,.05)\n",
+ "sweep=run_multiple_functions(p1_array)\n",
+ "print(sweep)\n",
+ "plot(sweep, label='Olin')\n",
+ "\n",
+ "decorate(title='Olin-Wellesley Bikeshare',\n",
+ " xlabel='Arrival rate at Olin (p1 in customers/min)', \n",
+ " ylabel='Average Number of unhappy customers')\n",
+ "\n",
+ "savefig('chap04-figEx4.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "What value of p1 minimizes the average number of unhappy customers? Just based on that set of 20 runs, if p1 is .30 or less there will be no unhappy customers ever. Based on another set of 200 runs (Fig Ex4a), you might expect one unhappy customer every 200 hrs at p1=0.25 (0.005 unhappy customers/hr). "
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.6.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/code/chap05mneal.ipynb b/code/chap05mneal.ipynb
new file mode 100644
index 00000000..e6d42094
--- /dev/null
+++ b/code/chap05mneal.ipynb
@@ -0,0 +1,1781 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Modeling and Simulation in Python\n",
+ "\n",
+ "Chapter 5\n",
+ "\n",
+ "Copyright 2017 Allen Downey\n",
+ "\n",
+ "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Configure Jupyter so figures appear in the notebook\n",
+ "%matplotlib inline\n",
+ "\n",
+ "# Configure Jupyter to display the assigned value after an assignment\n",
+ "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n",
+ "\n",
+ "# import functions from the modsim.py module\n",
+ "from modsim import *"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Reading data\n",
+ "\n",
+ "Pandas is a library that provides tools for reading and processing data. `read_html` reads a web page from a file or the Internet and creates one `DataFrame` for each table on the page."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from pandas import read_html"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The data directory contains a downloaded copy of https://en.wikipedia.org/wiki/World_population_estimates\n",
+ "\n",
+ "The arguments of `read_html` specify the file to read and how to interpret the tables in the file. The result, `tables`, is a sequence of `DataFrame` objects; `len(tables)` reports the length of the sequence."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "6"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "filename = 'data/World_population_estimates.html'\n",
+ "tables = read_html(filename, header=0, index_col=0, decimal='M')\n",
+ "len(tables)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can select the `DataFrame` we want using the bracket operator. The tables are numbered from 0, so `tables[2]` is actually the third table on the page.\n",
+ "\n",
+ "`head` selects the header and the first five rows."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
United States Census Bureau (2017)[28]
\n",
+ "
Population Reference Bureau (1973–2016)[15]
\n",
+ "
United Nations Department of Economic and Social Affairs (2015)[16]
\n",
+ "
Maddison (2008)[17]
\n",
+ "
HYDE (2007)[24]
\n",
+ "
Tanton (1994)[18]
\n",
+ "
Biraben (1980)[19]
\n",
+ "
McEvedy & Jones (1978)[20]
\n",
+ "
Thomlinson (1975)[21]
\n",
+ "
Durand (1974)[22]
\n",
+ "
Clark (1967)[23]
\n",
+ "
\n",
+ "
\n",
+ "
Year
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
1950
\n",
+ "
2557628654
\n",
+ "
2.516000e+09
\n",
+ "
2.525149e+09
\n",
+ "
2.544000e+09
\n",
+ "
2.527960e+09
\n",
+ "
2.400000e+09
\n",
+ "
2.527000e+09
\n",
+ "
2.500000e+09
\n",
+ "
2.400000e+09
\n",
+ "
NaN
\n",
+ "
2.486000e+09
\n",
+ "
\n",
+ "
\n",
+ "
1951
\n",
+ "
2594939877
\n",
+ "
NaN
\n",
+ "
2.572851e+09
\n",
+ "
2.571663e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1952
\n",
+ "
2636772306
\n",
+ "
NaN
\n",
+ "
2.619292e+09
\n",
+ "
2.617949e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1953
\n",
+ "
2682053389
\n",
+ "
NaN
\n",
+ "
2.665865e+09
\n",
+ "
2.665959e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1954
\n",
+ "
2730228104
\n",
+ "
NaN
\n",
+ "
2.713172e+09
\n",
+ "
2.716927e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " United States Census Bureau (2017)[28] \\\n",
+ "Year \n",
+ "1950 2557628654 \n",
+ "1951 2594939877 \n",
+ "1952 2636772306 \n",
+ "1953 2682053389 \n",
+ "1954 2730228104 \n",
+ "\n",
+ " Population Reference Bureau (1973–2016)[15] \\\n",
+ "Year \n",
+ "1950 2.516000e+09 \n",
+ "1951 NaN \n",
+ "1952 NaN \n",
+ "1953 NaN \n",
+ "1954 NaN \n",
+ "\n",
+ " United Nations Department of Economic and Social Affairs (2015)[16] \\\n",
+ "Year \n",
+ "1950 2.525149e+09 \n",
+ "1951 2.572851e+09 \n",
+ "1952 2.619292e+09 \n",
+ "1953 2.665865e+09 \n",
+ "1954 2.713172e+09 \n",
+ "\n",
+ " Maddison (2008)[17] HYDE (2007)[24] Tanton (1994)[18] \\\n",
+ "Year \n",
+ "1950 2.544000e+09 2.527960e+09 2.400000e+09 \n",
+ "1951 2.571663e+09 NaN NaN \n",
+ "1952 2.617949e+09 NaN NaN \n",
+ "1953 2.665959e+09 NaN NaN \n",
+ "1954 2.716927e+09 NaN NaN \n",
+ "\n",
+ " Biraben (1980)[19] McEvedy & Jones (1978)[20] Thomlinson (1975)[21] \\\n",
+ "Year \n",
+ "1950 2.527000e+09 2.500000e+09 2.400000e+09 \n",
+ "1951 NaN NaN NaN \n",
+ "1952 NaN NaN NaN \n",
+ "1953 NaN NaN NaN \n",
+ "1954 NaN NaN NaN \n",
+ "\n",
+ " Durand (1974)[22] Clark (1967)[23] \n",
+ "Year \n",
+ "1950 NaN 2.486000e+09 \n",
+ "1951 NaN NaN \n",
+ "1952 NaN NaN \n",
+ "1953 NaN NaN \n",
+ "1954 NaN NaN "
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "table2 = tables[2]\n",
+ "table2.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "`tail` selects the last five rows."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
United States Census Bureau (2017)[28]
\n",
+ "
Population Reference Bureau (1973–2016)[15]
\n",
+ "
United Nations Department of Economic and Social Affairs (2015)[16]
\n",
+ "
Maddison (2008)[17]
\n",
+ "
HYDE (2007)[24]
\n",
+ "
Tanton (1994)[18]
\n",
+ "
Biraben (1980)[19]
\n",
+ "
McEvedy & Jones (1978)[20]
\n",
+ "
Thomlinson (1975)[21]
\n",
+ "
Durand (1974)[22]
\n",
+ "
Clark (1967)[23]
\n",
+ "
\n",
+ "
\n",
+ "
Year
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
2012
\n",
+ "
7013871313
\n",
+ "
7.057075e+09
\n",
+ "
7.080072e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2013
\n",
+ "
7092128094
\n",
+ "
7.136796e+09
\n",
+ "
7.162119e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2014
\n",
+ "
7169968185
\n",
+ "
7.238184e+09
\n",
+ "
7.243784e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2015
\n",
+ "
7247892788
\n",
+ "
7.336435e+09
\n",
+ "
7.349472e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2016
\n",
+ "
7325996709
\n",
+ "
7.418152e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " United States Census Bureau (2017)[28] \\\n",
+ "Year \n",
+ "2012 7013871313 \n",
+ "2013 7092128094 \n",
+ "2014 7169968185 \n",
+ "2015 7247892788 \n",
+ "2016 7325996709 \n",
+ "\n",
+ " Population Reference Bureau (1973–2016)[15] \\\n",
+ "Year \n",
+ "2012 7.057075e+09 \n",
+ "2013 7.136796e+09 \n",
+ "2014 7.238184e+09 \n",
+ "2015 7.336435e+09 \n",
+ "2016 7.418152e+09 \n",
+ "\n",
+ " United Nations Department of Economic and Social Affairs (2015)[16] \\\n",
+ "Year \n",
+ "2012 7.080072e+09 \n",
+ "2013 7.162119e+09 \n",
+ "2014 7.243784e+09 \n",
+ "2015 7.349472e+09 \n",
+ "2016 NaN \n",
+ "\n",
+ " Maddison (2008)[17] HYDE (2007)[24] Tanton (1994)[18] \\\n",
+ "Year \n",
+ "2012 NaN NaN NaN \n",
+ "2013 NaN NaN NaN \n",
+ "2014 NaN NaN NaN \n",
+ "2015 NaN NaN NaN \n",
+ "2016 NaN NaN NaN \n",
+ "\n",
+ " Biraben (1980)[19] McEvedy & Jones (1978)[20] Thomlinson (1975)[21] \\\n",
+ "Year \n",
+ "2012 NaN NaN NaN \n",
+ "2013 NaN NaN NaN \n",
+ "2014 NaN NaN NaN \n",
+ "2015 NaN NaN NaN \n",
+ "2016 NaN NaN NaN \n",
+ "\n",
+ " Durand (1974)[22] Clark (1967)[23] \n",
+ "Year \n",
+ "2012 NaN NaN \n",
+ "2013 NaN NaN \n",
+ "2014 NaN NaN \n",
+ "2015 NaN NaN \n",
+ "2016 NaN NaN "
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "table2.tail()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Long column names are awkard to work with, but we can replace them with abbreviated names."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "table2.columns = ['census', 'prb', 'un', 'maddison', \n",
+ " 'hyde', 'tanton', 'biraben', 'mj', \n",
+ " 'thomlinson', 'durand', 'clark']"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's what the DataFrame looks like now. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
census
\n",
+ "
prb
\n",
+ "
un
\n",
+ "
maddison
\n",
+ "
hyde
\n",
+ "
tanton
\n",
+ "
biraben
\n",
+ "
mj
\n",
+ "
thomlinson
\n",
+ "
durand
\n",
+ "
clark
\n",
+ "
\n",
+ "
\n",
+ "
Year
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
1950
\n",
+ "
2557628654
\n",
+ "
2.516000e+09
\n",
+ "
2.525149e+09
\n",
+ "
2.544000e+09
\n",
+ "
2.527960e+09
\n",
+ "
2.400000e+09
\n",
+ "
2.527000e+09
\n",
+ "
2.500000e+09
\n",
+ "
2.400000e+09
\n",
+ "
NaN
\n",
+ "
2.486000e+09
\n",
+ "
\n",
+ "
\n",
+ "
1951
\n",
+ "
2594939877
\n",
+ "
NaN
\n",
+ "
2.572851e+09
\n",
+ "
2.571663e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1952
\n",
+ "
2636772306
\n",
+ "
NaN
\n",
+ "
2.619292e+09
\n",
+ "
2.617949e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1953
\n",
+ "
2682053389
\n",
+ "
NaN
\n",
+ "
2.665865e+09
\n",
+ "
2.665959e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1954
\n",
+ "
2730228104
\n",
+ "
NaN
\n",
+ "
2.713172e+09
\n",
+ "
2.716927e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " census prb un maddison hyde \\\n",
+ "Year \n",
+ "1950 2557628654 2.516000e+09 2.525149e+09 2.544000e+09 2.527960e+09 \n",
+ "1951 2594939877 NaN 2.572851e+09 2.571663e+09 NaN \n",
+ "1952 2636772306 NaN 2.619292e+09 2.617949e+09 NaN \n",
+ "1953 2682053389 NaN 2.665865e+09 2.665959e+09 NaN \n",
+ "1954 2730228104 NaN 2.713172e+09 2.716927e+09 NaN \n",
+ "\n",
+ " tanton biraben mj thomlinson durand \\\n",
+ "Year \n",
+ "1950 2.400000e+09 2.527000e+09 2.500000e+09 2.400000e+09 NaN \n",
+ "1951 NaN NaN NaN NaN NaN \n",
+ "1952 NaN NaN NaN NaN NaN \n",
+ "1953 NaN NaN NaN NaN NaN \n",
+ "1954 NaN NaN NaN NaN NaN \n",
+ "\n",
+ " clark \n",
+ "Year \n",
+ "1950 2.486000e+09 \n",
+ "1951 NaN \n",
+ "1952 NaN \n",
+ "1953 NaN \n",
+ "1954 NaN "
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "table2.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The first column, which is labeled `Year`, is special. It is the **index** for this `DataFrame`, which means it contains the labels for the rows.\n",
+ "\n",
+ "Some of the values use scientific notation; for example, `2.544000e+09` is shorthand for $2.544 \\cdot 10^9$ or 2.544 billion.\n",
+ "\n",
+ "`NaN` is a special value that indicates missing data."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Series\n",
+ "\n",
+ "We can use dot notation to select a column from a `DataFrame`. The result is a `Series`, which is like a `DataFrame` with a single column."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Year\n",
+ "1950 2557628654\n",
+ "1951 2594939877\n",
+ "1952 2636772306\n",
+ "1953 2682053389\n",
+ "1954 2730228104\n",
+ "Name: census, dtype: int64"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "census = table2.census\n",
+ "census.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Year\n",
+ "2012 7013871313\n",
+ "2013 7092128094\n",
+ "2014 7169968185\n",
+ "2015 7247892788\n",
+ "2016 7325996709\n",
+ "Name: census, dtype: int64"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "census.tail()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Like a `DataFrame`, a `Series` contains an index, which labels the rows.\n",
+ "\n",
+ "`1e9` is scientific notation for $1 \\cdot 10^9$ or 1 billion."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "From here on, we will work in units of billions."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Year\n",
+ "1950 2.525149\n",
+ "1951 2.572851\n",
+ "1952 2.619292\n",
+ "1953 2.665865\n",
+ "1954 2.713172\n",
+ "Name: un, dtype: float64"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "un = table2.un / 1e9\n",
+ "un.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Year\n",
+ "1950 2.557629\n",
+ "1951 2.594940\n",
+ "1952 2.636772\n",
+ "1953 2.682053\n",
+ "1954 2.730228\n",
+ "Name: census, dtype: float64"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "census = table2.census / 1e9\n",
+ "census.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's what these estimates look like."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file chap05-fig01.pdf\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xd8XNWZ+P/PFM2oF0uyuiy5HVfZxt24YIMx1QY2hDR2yRIIhPQCfJdssoEUsoFdWH44ZNkkNJMCoTjBITQbG/fefdwky+q9tyn398cdy5KxrZGt0Yyk5/166WXplpnnSJ555px77nMshmEghBBChBprsAMQQgghzkcSlBBCiJAkCUoIIURIkgQlhBAiJNmDHcC5lFJOYCZQCniCHI4QQojAsgFpwHatdXvXHSGXoDCT04ZgByGEEKJfLQA+6bohFBNUKcCqVatITU0NdixCCCECqKysjC9+8Yvge+/vKhQTlAcgNTWVzMzMYMcihBCif3zqko5MkhBCCBGSJEEJIYQISZKghBBChCRJUEIIIUKSJCghhBAhSRKUEEKIkCQJSgghxAUZhoHX8AbluSVBCSGEOC+v4WXDqW2sL9jKuWsHejyBT1qheKOuEEKIIHN5XHx4ciOFdcUARDkimZkxpXN/u8tDmGEQZrcFLAZJUH1IKcXmzZsZNmxY57Z3332XVatW8fLLLwPwxhtv8Morr+B2u/F4PEydOpWHH36YmJiY8z7mm2++yR//+Efa2tpwuVxMnz6dH/zgB8TGxvZLm4QQQ0+rq413j62jsrm6c1tjezOGYWCxWACIDA+jobkjoAlKhvj60b59+3j22Wf53e9+x+rVq1m9ejU2m43/+I//OO/xzz33HK+99hrPPvssb7/9Nm+//TZ2u5377ruvfwMXQgwpFc1VVLbUdP48MXk8UxKndSanM6LC7Xi8xrmn95kB34PadrCMbYfKAJg1IZVZE7sXmP1kbzF7jlYCcGVeOtPU8G771+48zcGT5qeExdOzmDgysdv+2sY2EmLC+yTWyspKDMOgra0NAJvNxre+9S2OHTv2qWNbWlr4zW9+w5tvvklSUhIAYWFhPPjgg7z//vt0dHTgcDj49a9/zXvvvYfX6yUjI4Mf//jHpKSkcOeddzJ16lR27dpFaWkpc+fO5bHHHsPr9fLYY4+xa9cuwsLCyMzM5Be/+AW1tbXcfPPN7N69G4CioqLOnysrK3nooYeora0FYNGiRXz729/uk9+JECL0jIjPZF7WdDad3snoqPEcO+Ag31bA565V2G1n+zU2W2D7OAM+QQ0kCxcuZM2aNSxZsgSlFNOmTWPhwoUsWrToU8eePHmS8PBwcnJyum2PiIhg+fLlALz11lscPXqU1157Dbvdzp/+9Cd++MMf8vzzzwNQWFjIyy+/TEtLC9dffz3btm3Dbrezbds21qxZg8Vi4Ve/+hVaa4YPH35uCJ3+/Oc/k5mZye9+9ztaWlp45JFHaGxsvOCwpBBiYOk6dHfGpBRFYngSf11bQofLBcDWg2VcmZfeb3FJgupD5/6BAbxeL1ar+SkjLCyMJ598kgcffJCtW7eyfft2HnroIebOnctTTz3V7Tyr1YrXe/FZMmvXrmX//v380z/9U+dztba2du5fvHgxVquV6OhoRowYQX19PXPnzsVms3H77bczf/58li1bRl5eHkVFRRd8ngULFnDvvfdSWlrKvHnz+N73vifJSYhBoqK5mk9ObWPJyCuJD+9+bTstLpEr88yRpginneEJEf0a24BPULMmfnpYr6v5UzKYPyXjgvsXT89i8fSsC+7vzfBeQkICdXV13SZJVFdXEx8fD8Drr79OQkICV199NcuXL2f58uXcf//9LFmyhJqamm7njR49GrfbTUFBQbdeVHt7O1//+tf56U9/itfr5Stf+Qpf+MIXAOjo6KC+vr7z2PDws7FbLBYMwyA2Npa3336bXbt2sWXLFr797W9z9913c9VVV3WbRuryfWICyMvL48MPP2Tz5s1s2bKF22+/neeff55Jkyb5/bsRQoQWr9fLrtID7C49gGEYrMvfzE1jr8Fu6z7pYULuMFrb3UwcmUiEs39ThkyS6EMLFy7k5Zdf7uz51NfX8+abb3YO4VmtVp544gnKyso6zzl27Bjp6enExcV1eyyHw8E999zDI488QlVVFWAmoJ///Oe0traSkpLC/Pnzef3112lqagLg6aef5sEHH7xojGvXruWuu+5i2rRpfOMb3+CWW27hwIEDxMbG4nK5OH78OADvvPNO5zlPPPEEK1eu5JprruGRRx5h9OjR571uJoQYGGpb63nryD/YVbIfwzAwgBMV5fz+HztpaXN1O9ZisTBjfEq/JycYBD2oUPLI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\n",
+ "text/plain": [
+ "
"
+ ],
+ "text/plain": [
+ "Series([], dtype: float64)"
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "results = TimeSeries()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Initially the `TimeSeries` is empty, but we can initialize it so the starting value, in 1950, is the 1950 population estimated by the US Census."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
values
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
1950
\n",
+ "
2.557629
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "1950 2.557629\n",
+ "dtype: float64"
+ ]
+ },
+ "execution_count": 28,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "results[t_0] = census[t_0]\n",
+ "results"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "After that, the population in the model grows by a constant amount each year."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for t in linrange(t_0, t_end-1):\n",
+ " results[t+1] = results[t] + annual_growth"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "`linrange` is defined in the `modsim` library. It is similar to `linspace`, but instead of taking parameters `start`, `stop`, and `num`, it takes `start`, `stop`, and `step`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "help(linrange)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's what the results looks like, compared to the actual data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file chap03-fig02.pdf\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot(census, ':', label='US Census', color='red')\n",
+ "plot(un, '--', label='UN DESA')\n",
+ "plot(results, color='gray', label='model')\n",
+ "\n",
+ "decorate(xlabel='Year', \n",
+ " ylabel='World population (billion)',\n",
+ " title='Constant growth')\n",
+ "savefig('chap03-fig02.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The model fits the data pretty well after 1990, but not so well before."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Exercises\n",
+ "\n",
+ "**Optional Exercise:** Try fitting the model using data from 1970 to the present, and see if that does a better job.\n",
+ "\n",
+ "Hint: \n",
+ "\n",
+ "1. Copy the code from above and make a few changes. Test your code after each small change.\n",
+ "\n",
+ "2. Make sure your `TimeSeries` starts in 1950, even though the estimated annual growth is based on later data.\n",
+ "\n",
+ "3. You might want to add a constant to the starting value to match the data better."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file chap05-figEx01.pdf\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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OHCArVu30t3dzUUXXcTu3bsJDAxk9+7dbNu2DZPJxM9+9jO01sTFxR2333/7299ITk7m97//Pd3d3dx99910dHQcd1hSCDH9NDU1kZ+fT1tbm8f2mTNnYrFYhn5RnkxSoHzIZDIdtc3pdA7dBgcFBfHwww9z++23s2vXLj788EPuuOMOVq5cyS9+8QuP88xmM06nc8T23nrrLfbt28fnP//5obZ6enqG9p999tmYzWYiIiJITU2lra2NlStXEhAQwBVXXMHq1au54IILWLhw4VFjzMOtWbOG66+/npqaGs4880xuvfVWKU5CnCS6urooKCigpsZztYuQkBDy8vJITk4+5s+2yTD9C9Sllx49rDfcFVcYH8dz1VXGx/GMYXgvJiaG1tZWj0kSTU1NREdHA/DMM88QExPDOeecw8aNG9m4cSPf+ta3WL9+Pc3NzR7nZWVlYbfbqaio8LiL6uvr49vf/jY/+clPcDqdXHvttXz5y18GoL+/3+O3nxkzZgx9bjKZcLlcREVF8eKLL/LJJ5/wwQcfcMstt/CNb3yDs846C5fr8PJcAwMDQ58vXLiQN954g507d/LBBx9wxRVX8NhjjzF//nyv/9sIIaaWgYEBiouLKS8v9/hlOCAggIyMDLKysggMPLElQiZJ+NDatWvZunXr0P/strY2nn/++aEhPLPZzEMPPURtbe3QOcXFxSQlJTFz5kyPawUHB3Pddddx991309horEzS39/Pf/3Xf9HT00N8fDyrV6/mmWeeGXqb+5FHHuH2228fsY9vvfUW11xzDaeddhrf+c532Lx5M/v37ycqKoqBgQFKSkoAePnll4fOeeihh9iyZQvnnnsud999N1lZWcd8biaEmPpcLhcVFRW8+eablJaWehSn5ORkzj77bHJzc094cYKT4Q5qCrn77rt54IEH2LBhAwEBAQBs2rSJz33ucwBcdtll9PT0cN1119Hf34/JZCItLY3f/e53Q8cPd8MNNxAaGso3vvENwLh7WrFiBVu2bAHgiiuuoK6uji984QuYTCYSExN54IEHRuzj2rVreffdd9mwYQNhYWHMnDmT++67j8jISG677Tauu+46Zs2axYUXXjh0zle/+lXuvPNONmzYQHBwMEopLrnkEp/8NxNCTJ76+npsNhsdHR0e22fNmoXVah0a7ZkqTMOHdaYCpVQaUP7GG2/IirpCCOEDHR0d2Gw26uvrPbaHhYWRl5dHYmLiCXvOVFVVxTnnnAOQrrWuGL5P7qCEEOIk1dfXh9aaAwcOeDxjDgwMJDs7m/T09GOO3kwVUqCEEOIk43Q6KS8vp6ioCLvdPrTdZDKRkpKCUoqQkJAT2EPvSIESQoiThMvlora2FpvN5hHoCjBnzhwsFsuYY9JcLhdOp4uAgMmfUycFSgghTgKtra3YbDaampo8tkdERGCxWIiLixvzc6b+AQdvfVyF0+XiwjNSD5/vckF1Ncyd66vuH5MUKCGEmMZ6e3spKCjweaBrU1sPr+ysoLWjD4C9JeEsyp5j7KypgQcegB//GIa9v+lrUqCEEGIastvtlJWVUVJSgsPhGNpuMplIT08nOzub4ODgcV27sLKZtz+uwu44/I5UW2ff4QOSkmDZMnjhBfj618f9PYxGCpQQQkwjLpeLQ4cOUVBQ4JdAV7vDyUe2uqHiFISTszKjUKcd8drPpk3w9tvGcJ+fpqhLgRJCiGmiqakJm8121Cq2UVFRWK1WnwS6BgaYuXBlGs+8UURUYw0XFL1DbGEYLL4bhg8VRkfD5s0Tbm8kEnXkQ0qpo1acfPXVV7n66qsBY7HChQsXUlRU5HHMN7/5TZ577rmjrvfcc8+xdOlSNm3axKZNm7j00ku54YYb2L9//9Axd955J2vWrBk6ZvDj8ccfB6Czs5Pvf//7XHrppWzcuJHNmzfz9NNPH9XWAw88wPz58z1imIQQU0N3dzcfffQRO3bs8ChOISEhLFq0iLVr1467ODW19eBwegY2zI4OZcPiOK7Yv43YzmaoqoKdOyf0PYyH3EFNMpfLxa233sozzzzj1XsIy5Yt49e//vXQ1zt27ODaa6/l2WefZa57Bs0111wzFId0pIcffpiwsDBeeuklTCYTdXV1XHnllSQmJrJ69WrAeJnvhRde4IILLuCJJ57gP/7jP3zwnQohJup4ga5ms5nMzMwJBbr29tn5IL+W/LImVi1MZHGO55I7yZmJcMH5xpp7s2bBJK4DNWjaF6jd+bXstnn3W781I5azl87z2PbWxwfJL2s6zhmwwpLACmvChPo43MqVKxkYGOCnP/0pP/zhD8d8/plnnsl5553HX/7yF68KSUNDA7GxsQwMDBAcHEx8fDy//OUvPTK3Xn75ZVJSUoYK3Y033khoaOiY+yaE8A2Xy0VlZSVaa/r7+z32zZ07l9zcXMLCwsZ1bafTha28iQ/219Lbb7zEu/vTA+QMNBNmzfU8+LzzYMYMWLcOgoLG1d5ETPsCNd2YTCZ++tOfsmnTJtasWcPZZ5895mvk5ubyzjvvDH39xz/+kZdeesnjmAcffBClFN/+9re5+eabOeOMMzjttNNYsmQJF198MfPmHS7Uf/7zn9m8eTMLFixgzpw5PP/880NLeAghJtfxAl1jYmKwWq3ExMSM+9o1jV28+2kVDa3udeOcTqg6RPzBQuwfNsNP7jEK0qCQEDj33HG3N1FSoHxotAULB8XFxXH//fdz1113HVVYvDV8raeRhvhyc3N59dVXyc/P58MPP2T79u08+uijPPLII6xfv578/HwKCwuH0sk3b97M448/zpe+9KUTFh4pxKnoeIGuoaGh5OXlkZSUNO5/k109A+zcV01hZYvH9qiwIFbXfUJ6TzUmgH/+05idN0VM+wK1wjqxIbizl847athvvEZbsHC49evXc+GFF3LHHXeMeQx5//795OTkjHqc3W7n3nvv5Xvf+x7z589n/vz5fO1rX2PLli089dRTrF+/nieffJLAwMChVXntdjv19fW8++67x1yKXgjhW/39/WitqaysPCrQNSsri4yMjHEHujocTvaUNPJRQR39A4fflQoMMLMkN44lKo7AOV3whz8Y7zZ58XNlMvm9QCml/g343rBNM4FkIFlrXefv9ifT4IKFP/jBDzCbzUMLFl51nBV777zzTj7/+c9TWVnpsf7SSN555x3efvttr+68AgMDKS8vZ8uWLdx2220EBQVht9spLS3FYrHQ3t7Otm3bePTRRznjjDOGzrv99tv505/+JAVKCD9yOp1UVFRQVFTksYK1yWRi3rx55ObmTjjQdX9pEzv2Vhtf9PZCRweZi7NYtWguUeHul3hPPx0CA2HJEs9p5FOA3wuU1vpx4HEApVQQ8C7wwMlWnGD0BQuPFBISwsMPP8wVIyxJ/9FHH7HJfcttMpmIi4vjd7/7HXPmzBk65ljPoBYtWsS9997LI488ws9+9jMuuOACQkNDcTqdnHfeedx44408+eSTZGZmehQngG9961tccsklFBUVeXWnJoTw3mCga0FBAV1dXR77Zs+ejdVqHXOg6/FYM2PZo+totxURc6icta565n1xKYQPS5gwmYxUiCloTAsW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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "sns.set_style('whitegrid')\n",
+ "\n",
+ "plot(pop_array, net_growth_array)\n",
+ "decorate(xlabel='Population (billions)',\n",
+ " ylabel='Net growth (billions)')\n",
+ "savefig('chap03-fig05.pdf')\n",
+ "\n",
+ "sns.set_style('white')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's what it looks like. Remember that the x axis is population now, not time."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "It looks like the growth rate passes through 0 when the population is a little less than 14 billion.\n",
+ "\n",
+ "In the book we found that the net growth is 0 when the population is $-\\alpha/\\beta$:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "-system.alpha / system.beta"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This is the equilibrium the population tends toward."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "`sns` is a library called Seaborn which provides functions that control the appearance of plots. In this case I want a grid to make it easier to estimate the population where the growth rate crosses through 0."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Disfunctions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "When people first learn about functions, there are a few things they often find confusing. In this section I present and explain some common problems with functions.\n",
+ "\n",
+ "As an example, suppose you want a function that takes a `System` object, with variables `alpha` and `beta`, as a parameter and computes the carrying capacity, `-alpha/beta`. Here's a good solution:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "13.88888888888889\n"
+ ]
+ }
+ ],
+ "source": [
+ "def carrying_capacity(system):\n",
+ " K = -system.alpha / system.beta\n",
+ " return K\n",
+ " \n",
+ "sys1 = System(alpha=0.025, beta=-0.0018)\n",
+ "pop = carrying_capacity(sys1)\n",
+ "print(pop)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now let's see all the ways that can go wrong.\n",
+ "\n",
+ "**Disfunction #1:** Not using parameters. In the following version, the function doesn't take any parameters; when `sys1` appears inside the function, it refers to the object we created outside the function.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "13.88888888888889\n"
+ ]
+ }
+ ],
+ "source": [
+ "def carrying_capacity():\n",
+ " K = -sys1.alpha / sys1.beta\n",
+ " return K\n",
+ " \n",
+ "sys1 = System(alpha=0.025, beta=-0.0018)\n",
+ "pop = carrying_capacity()\n",
+ "print(pop)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This version actually works, but it is not as versatile as it could be. If there are several `System` objects, this function can only work with one of them, and only if it is named `system`.\n",
+ "\n",
+ "**Disfunction #2:** Clobbering the parameters. When people first learn about parameters, they often write functions like this:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "13.88888888888889\n"
+ ]
+ }
+ ],
+ "source": [
+ "def carrying_capacity(system):\n",
+ " system = System(alpha=0.025, beta=-0.0018)\n",
+ " K = -system.alpha / system.beta\n",
+ " return K\n",
+ " \n",
+ "sys1 = System(alpha=0.025, beta=-0.0018)\n",
+ "pop = carrying_capacity(sys1)\n",
+ "print(pop)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this example, we have a `System` object named `sys1` that gets passed as an argument to `carrying_capacity`. But when the function runs, it ignores the argument and immediately replaces it with a new `System` object. As a result, this function always returns the same value, no matter what argument is passed.\n",
+ "\n",
+ "When you write a function, you generally don't know what the values of the parameters will be. Your job is to write a function that works for any valid values. If you assign your own values to the parameters, you defeat the whole purpose of functions.\n",
+ "\n",
+ "\n",
+ "**Disfunction #3:** No return value. Here's a version that computes the value of `K` but doesn't return it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "None\n"
+ ]
+ }
+ ],
+ "source": [
+ "def carrying_capacity(system):\n",
+ " K = -system.alpha / system.beta\n",
+ " \n",
+ "sys1 = System(alpha=0.025, beta=-0.0018)\n",
+ "pop = carrying_capacity(sys1)\n",
+ "print(pop)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "A function that doesn't have a return statement always returns a special value called `None`, so in this example the value of `pop` is `None`. If you are debugging a program and find that the value of a variable is `None` when it shouldn't be, a function without a return statement is a likely cause.\n",
+ "\n",
+ "**Disfunction #4:** Ignoring the return value. Finally, here's a version where the function is correct, but the way it's used is not."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "13.88888888888889"
+ ]
+ },
+ "execution_count": 42,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def carrying_capacity(system):\n",
+ " K = -system.alpha / system.beta\n",
+ " return K\n",
+ " \n",
+ "sys2 = System(alpha=0.025, beta=-0.0018)\n",
+ "carrying_capacity(sys2)\n",
+ "\n",
+ "# print(K) This line won't work because K only exists inside the function."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this example, `carrying_capacity` runs and returns `K`, but the return value is dropped.\n",
+ "\n",
+ "When you call a function that returns a value, you should do something with the result. Often you assign it to a variable, as in the previous examples, but you can also use it as part of an expression.\n",
+ "\n",
+ "For example, you could eliminate the temporary variable `pop` like this:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "13.88888888888889\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(carrying_capacity(sys1))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Or if you had more than one system, you could compute the total carrying capacity like this:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "27.77777777777778"
+ ]
+ },
+ "execution_count": 44,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "total = carrying_capacity(sys1) + carrying_capacity(sys2)\n",
+ "total"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Exercises\n",
+ "\n",
+ "**Exercise:** In the book, I present a different way to parameterize the quadratic model:\n",
+ "\n",
+ "$ \\Delta p = r p (1 - p / K) $\n",
+ "\n",
+ "where $r=\\alpha$ and $K=-\\alpha/\\beta$. Write a version of `update_func` that implements this version of the model. Test it by computing system variables `r` and `K` equivalent to `alpha` and `beta`, and confirm that you get the same results. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def update_func_quad2(pop, t, system):\n",
+ " \"\"\"Compute the population next year with a quadratic model.\n",
+ " \n",
+ " pop: current population\n",
+ " t: current year\n",
+ " system: system object containing parameters of the model\n",
+ " \n",
+ " returns: population next year\n",
+ " \"\"\"\n",
+ " net_growth = system.r * pop *(1-pop/system.K)\n",
+ " return pop + net_growth"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "results = run_simulation(system, update_func_quad)\n",
+ "\n",
+ "plot_results(census, un, results, 'World population projections')\n",
+ "plot_projections(table3)\n",
+ "savefig('chap04-fig02.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "People who know what they are doing expect the growth rate to decline more sharply than our model projects."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Exercises\n",
+ "\n",
+ "**Optional exercise:** The net growth rate of world population has been declining for several decades. That observation suggests one more way to generate projections, by extrapolating observed changes in growth rate.\n",
+ "\n",
+ "The `modsim` library provides a function, `compute_rel_diff`, that computes relative differences of the elements in a sequence. It is a wrapper for the NumPy function `ediff1d`:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "def compute_rel_diff(seq):\n",
+ " xs = np.asarray(seq)\n",
+ " diff = np.ediff1d(xs, np.nan)\n",
+ " return diff / seq\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "source_code(compute_rel_diff)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's how we can use it to compute the relative differences in the `census` and `un` estimates:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "alpha_census = compute_rel_diff(census)\n",
+ "plot(alpha_census)\n",
+ "\n",
+ "alpha_un = compute_rel_diff(un)\n",
+ "plot(alpha_un)\n",
+ "\n",
+ "decorate(xlabel='Year', label='Net growth rate')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Other than a bump around 1990, net growth rate has been declining roughly linearly since 1965. As an exercise, you can use this data to make a projection of world population until 2100.\n",
+ "\n",
+ "1. Define a function, `alpha_func`, that takes `t` as a parameter and returns an estimate of the net growth rate at time `t`, based on a linear function `alpha = intercept + slope * t`. Choose values of `slope` and `intercept` to fit the observed net growth rates since 1965.\n",
+ "\n",
+ "2. Call your function with a range of `ts` from 1960 to 2020 and plot the results.\n",
+ "\n",
+ "3. Create a `System` object that includes `alpha_func` as a system variable.\n",
+ "\n",
+ "4. Define an update function that uses `alpha_func` to compute the net growth rate at the given time `t`.\n",
+ "\n",
+ "5. Test your update function with `t_0 = 1960` and `p_0 = census[t_0]`.\n",
+ "\n",
+ "6. Run a simulation from 1960 to 2100 with your update function, and plot the results.\n",
+ "\n",
+ "7. Compare your projections with those from the US Census and UN."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1965 0.02053176728437212\n",
+ "1966 0.020911551029763803\n",
+ "1967 0.02109058925415572\n",
+ "1968 0.02101656992547482\n",
+ "1969 0.020758188486659338\n",
+ "1970 0.02047634637090081\n",
+ "1971 0.02020818429559682\n",
+ "1972 0.01985720289669974\n",
+ "1973 0.01942307949759347\n",
+ "1974 0.018951122249287078\n",
+ "1975 0.018451250053342288\n",
+ "1976 0.018012165954475304\n",
+ "1977 0.017733081691009327\n",
+ "1978 0.017660373676849746\n",
+ "1979 0.017733142573392077\n",
+ "1980 0.01779837434815221\n",
+ "1981 0.017827650403505917\n",
+ "1982 0.01792104480553395\n",
+ "1983 0.018082043263461734\n",
+ "1984 0.018258274003086366\n",
+ "1985 0.018458583147941614\n",
+ "1986 0.018560906303449712\n",
+ "1987 0.01841288422276466\n",
+ "1988 0.01786326916513628\n",
+ "1989 0.017364563479923413\n",
+ "1990 0.01655611582078212\n",
+ "1991 0.01589800279277194\n",
+ "1992 0.015280632144474183\n",
+ "1993 0.014737986202132534\n",
+ "1994 0.0142615853328304\n",
+ "1995 0.01379254395511941\n",
+ "1996 0.013343302439389169\n",
+ "1997 0.012988535013695223\n",
+ "1998 0.01274819781096187\n",
+ "1999 0.012595669665169867\n",
+ "2000 0.012475576914740197\n",
+ "2001 0.012363793230324945\n",
+ "2002 0.012281440429518646\n",
+ "2003 0.012223017749625578\n",
+ "2004 0.012180328767820279\n",
+ "2005 0.012148023140354647\n",
+ "2006 0.012115152134682531\n",
+ "2007 0.012069835509940846\n",
+ "2008 0.012004281280093811\n",
+ "2009 0.011918780280830502\n",
+ "2010 0.011829541279946\n",
+ "2011 0.01172816112359535\n",
+ "2012 0.011588443192049321\n",
+ "2013 0.011402290446640954\n",
+ "2014 0.014590164477571362\n"
+ ]
+ }
+ ],
+ "source": [
+ "# start by deducing reasonable values for slope and intercept\n",
+ "# I'll paste alpha_un data between 1965 and 2014 into Excel to get a linear fit\n",
+ "# I ignore 2014 data point because it is way off line. Y=-2.24e-4+4.61e-1X, R2=0.936\n",
+ "for i in range(50):\n",
+ " print (i+1965, alpha_un[i+1965])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 103,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Define a function, alpha_func, that takes t as a parameter and returns an estimate of the net growth rate at time t, \n",
+ "#based on a linear function alpha = intercept + slope * t. Choose values of slope and intercept to fit the observed \n",
+ "#net growth rates since 1965.\n",
+ "def alpha_func(t):\n",
+ " slope=-2.253e-4\n",
+ " intercept=0.464\n",
+ " alpha=intercept+slope*t\n",
+ " return alpha"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 98,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[]"
+ ]
+ },
+ "execution_count": 98,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Call your function with a range of ts from 1960 to 2020 and plot the results.\n",
+ "alpha=TimeSeries()\n",
+ "for t in linrange(system.t_0,system.t_end-1):\n",
+ " alpha[t]=alpha_func(t)\n",
+ "plot (alpha)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 99,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
values
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
t_0
\n",
+ "
1960
\n",
+ "
\n",
+ "
\n",
+ "
t_end
\n",
+ "
2100
\n",
+ "
\n",
+ "
\n",
+ "
p_0
\n",
+ "
3.043
\n",
+ "
\n",
+ "
\n",
+ "
beta
\n",
+ "
-0.0018
\n",
+ "
\n",
+ "
\n",
+ "
alpha_func
\n",
+ "
<function alpha_func at 0x000000000E659E18>
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "t_0 1960\n",
+ "t_end 2100\n",
+ "p_0 3.043\n",
+ "beta -0.0018\n",
+ "alpha_func \n",
+ "dtype: object"
+ ]
+ },
+ "execution_count": 99,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Create a System object that includes alpha_func as a system variable.\n",
+ "system = System(t_0=1960, \n",
+ " t_end=2100,\n",
+ " p_0=census[1960],\n",
+ " beta=-0.0018,\n",
+ " alpha_func=alpha_func)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 100,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Define an update function that uses alpha_func to compute the net growth rate at the given time t.\n",
+ "def update_func_alpha(t,pop,system):\n",
+ " \n",
+ " growth = pop*alpha_func(t)\n",
+ " return growth"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 101,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.2039020770727397 3.043001508 1960\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Test your update function with t_0 = 1960 and p_0 = census[t_0].\n",
+ "\n",
+ "system.t_0=1960\n",
+ "system.p_0=census[1960]\n",
+ "growth=system.p_0*update_func_alpha(system.t_0,system.p_0,system)\n",
+ "print(growth,system.p_0,system.t_0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 102,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def run_simulation_alpha(system, update_func_alpha):\n",
+ " \"\"\"Simulate the system using any update function.\n",
+ " \n",
+ " system: System object\n",
+ " update_func: function that computes the population next year\n",
+ " \n",
+ " returns: TimeSeries\n",
+ " \"\"\"\n",
+ " results = TimeSeries()\n",
+ " results[system.t_0] = system.p_0\n",
+ " \n",
+ " for t in linrange(system.t_0, system.t_end-1):\n",
+ " results[t+1] = results[t]+update_func_alpha(t,results[t],system)\n",
+ " \n",
+ " return results"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 104,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file chap08-figEx02.pdf\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
S 0.988889\n",
+ "I 0.011111\n",
+ "R 0.000000\n",
+ "dtyp...
\n",
+ "
\n",
+ "
\n",
+ "
t0
\n",
+ "
0
\n",
+ "
\n",
+ "
\n",
+ "
t_end
\n",
+ "
98
\n",
+ "
\n",
+ "
\n",
+ "
beta
\n",
+ "
0.333333
\n",
+ "
\n",
+ "
\n",
+ "
gamma
\n",
+ "
0.25
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "init S 0.988889\n",
+ "I 0.011111\n",
+ "R 0.000000\n",
+ "dtyp...\n",
+ "t0 0\n",
+ "t_end 98\n",
+ "beta 0.333333\n",
+ "gamma 0.25\n",
+ "dtype: object"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tc = 3 # time between contacts in days \n",
+ "tr = 4 # recovery time in days\n",
+ "\n",
+ "beta = 1 / tc # contact rate in per day\n",
+ "gamma = 1 / tr # recovery rate in per day\n",
+ "\n",
+ "system = make_system(beta, gamma)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The update function takes the state during the current time step and returns the state during the next time step."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def update_func(state, t, system):\n",
+ " \"\"\"Update the SIR model.\n",
+ " \n",
+ " state: State with variables S, I, R\n",
+ " t: time step\n",
+ " system: System with beta and gamma\n",
+ " \n",
+ " returns: State object\n",
+ " \"\"\"\n",
+ " s, i, r = state\n",
+ "\n",
+ " infected = system.beta * i * s \n",
+ " recovered = system.gamma * i\n",
+ " \n",
+ " s -= infected\n",
+ " i += infected - recovered\n",
+ " r += recovered\n",
+ " \n",
+ " return State(S=s, I=i, R=r)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "To run a single time step, we call it like this:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
values
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
S
\n",
+ "
0.985226
\n",
+ "
\n",
+ "
\n",
+ "
I
\n",
+ "
0.011996
\n",
+ "
\n",
+ "
\n",
+ "
R
\n",
+ "
0.002778
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "S 0.985226\n",
+ "I 0.011996\n",
+ "R 0.002778\n",
+ "dtype: float64"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "state = update_func(init, 0, system)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we can run a simulation by calling the update function for each time step."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def run_simulation(system, update_func):\n",
+ " \"\"\"Runs a simulation of the system.\n",
+ " \n",
+ " system: System object\n",
+ " update_func: function that updates state\n",
+ " \n",
+ " returns: State object for final state\n",
+ " \"\"\"\n",
+ " state = system.init\n",
+ " \n",
+ " for t in linrange(system.t0, system.t_end):\n",
+ " state = update_func(state, t, system)\n",
+ " \n",
+ " return state"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The result is the state of the system at `t_end`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
values
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
S
\n",
+ "
0.520568
\n",
+ "
\n",
+ "
\n",
+ "
I
\n",
+ "
0.000666
\n",
+ "
\n",
+ "
\n",
+ "
R
\n",
+ "
0.478766
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "S 0.520568\n",
+ "I 0.000666\n",
+ "R 0.478766\n",
+ "dtype: float64"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "run_simulation(system, update_func)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise** Suppose the time between contacts is 4 days and the recovery time is 5 days. After 14 weeks, how many students, total, have been infected?\n",
+ "\n",
+ "Hint: what is the change in `S` between the beginning and the end of the simulation?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
values
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
S
\n",
+ "
0.610171
\n",
+ "
\n",
+ "
\n",
+ "
I
\n",
+ "
0.004672
\n",
+ "
\n",
+ "
\n",
+ "
R
\n",
+ "
0.385157
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "S 0.610171\n",
+ "I 0.004672\n",
+ "R 0.385157\n",
+ "dtype: float64"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "tc = 4 # time between contacts in days \n",
+ "tr = 5 # recovery time in days\n",
+ "\n",
+ "beta = 1 / tc # contact rate in per day\n",
+ "gamma = 1 / tr # recovery rate in per day\n",
+ "\n",
+ "system = make_system(beta, gamma)\n",
+ "\n",
+ "run_simulation(system, update_func) #total students infected is (I + R)*N = (1-S)*N; 35 students"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Using TimeSeries objects"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "If we want to store the state of the system at each time step, we can use one `TimeSeries` object for each state variable."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def run_simulation(system, update_func):\n",
+ " \"\"\"Runs a simulation of the system.\n",
+ " \n",
+ " Add three Series objects to the System: S, I, R\n",
+ " \n",
+ " system: System object\n",
+ " update_func: function that updates state\n",
+ " \"\"\"\n",
+ " S = TimeSeries()\n",
+ " I = TimeSeries()\n",
+ " R = TimeSeries()\n",
+ "\n",
+ " state = system.init\n",
+ " t0 = system.t0\n",
+ " S[t0], I[t0], R[t0] = state\n",
+ " \n",
+ " for t in linrange(system.t0, system.t_end):\n",
+ " state = update_func(state, t, system)\n",
+ " S[t+1], I[t+1], R[t+1] = state\n",
+ " \n",
+ " return S, I, R"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's how we call it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "tc = 3 # time between contacts in days \n",
+ "tr = 4 # recovery time in days\n",
+ "\n",
+ "beta = 1 / tc # contact rate in per day\n",
+ "gamma = 1 / tr # recovery rate in per day\n",
+ "\n",
+ "system = make_system(beta, gamma)\n",
+ "S, I, R = run_simulation(system, update_func)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And then we can plot the results."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def plot_results(S, I, R):\n",
+ " \"\"\"Plot the results of a SIR model.\n",
+ " \n",
+ " S: TimeSeries\n",
+ " I: TimeSeries\n",
+ " R: TimeSeries\n",
+ " \"\"\"\n",
+ " plot(S, '--', color='fuchsia', label='Susceptible')\n",
+ " plot(I, '-', color='red', label='Infectious')\n",
+ " plot(R, ':', color='maroon', label='Recovered')\n",
+ " decorate(xlabel='Time (days)',\n",
+ " ylabel='Fraction of population')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's what they look like."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file figs/chap11-fig01.pdf\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_results(S, I, R)\n",
+ "savefig('figs/chap11-fig01.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Using a DataFrame"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Instead of making three `TimeSeries` objects, we can use one `DataFrame`.\n",
+ "\n",
+ "We have to use `row` to selects rows, rather than columns. But then Pandas does the right thing, matching up the state variables with the columns of the `DataFrame`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def run_simulation(system, update_func):\n",
+ " \"\"\"Runs a simulation of the system.\n",
+ " \n",
+ " system: System object\n",
+ " update_func: function that updates state\n",
+ " \n",
+ " returns: TimeFrame\n",
+ " \"\"\"\n",
+ " frame = TimeFrame(columns=system.init.index)\n",
+ " frame.row[system.t0] = system.init\n",
+ " \n",
+ " for t in linrange(system.t0, system.t_end):\n",
+ " frame.row[t+1] = update_func(frame.row[t], t, system)\n",
+ " \n",
+ " return frame"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's how we run it, and what the result looks like."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "