{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction to Python and Jupyter 1: Lists, Plotting, and Fitting" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For many things Python behaves much like the calculators that you are accustomed to using. The first thing you need to know is how to tell it to run a calculation. Below I have put the input 1+1. To get Python to compute the answer, click in the box where it is written and hit the shift and enter keys together. Just hitting enter (also known as return) will only move you to the next line of input, like a carriage return on a typewriter, and so it is essential to also hold the shift key. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "1+1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Try a few calculations of your own using subtraction, multiplication and division operations. You will notice that if you divide whole numbers in Python that it will return the decimal form of the ratio. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "35-4" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "3*4" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "4/5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Lists" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A useful construct that we will use often is a list (also known as an array). A list is any collection of numbers (or other things like text) lined up in a row. We'll make a list in a moment.\n", "\n", "If you've never done any programming, a tricky piece in any computer coding is using the right 'syntax'. That is, the correct symbols to tell the computer instructions. In order for a computer to know what you want it to do, you have to tell it precise instructions with precise symbols. If you use different symbols than it expects, even if those symbols usually mean the same thing in ordinary everyday usage, it won't work. I mention this here, because lists are an example of this. To enter a list in Python you have to use the square brace [ to open the list, commas to separate its elements, and a square brace to end the list ]. If you use parenthesis it won't work. Here's a list that I've given the name data:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "data = [1,2,3,4,5]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Run this list as a command (by clicking in the cell above and using shift+enter or using the Run command in the tool bar). Now, go to the Insert menu at the top of this page and select \"Insert Cell Below\". Click in the grey area of your new cell, type data, and run it as a command and see what happens." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another way to accomplish the same thing is to use the print command:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also access the individual elements of a list as follows:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data[2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that this accesses the third element of the list. This is because the indexing that keeps track of the elements of the list starts at 0. Here are a few more examples:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(data[0],data[1],data[4])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also use this indexing to change individual elements of the list:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data[2]=6\n", "print(data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, it is very useful to be able to do operations on all the elements of a list. One way to do this is using a 'for loop', e.g.:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data2 = [2*x for x in data]\n", "data2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you may have guessed, x acts as a variable that takes on each value in the list data. The first part of the command computes 2*x for each x and assigns the resulting value to the same location in data2 that x was drawn from in data." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Interlude" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The most important tool you have to learn Python is the huge body of documentation online. Feel free to search for any particular command or technique that you would like to try. To make these searches a little less overwhelming we recommend: the (free!) book by Allen B. Downey *Think Python* (https://greenteapress.com/wp/think-python-2e/); the Python documentation https://docs.python.org/3/tutorial/. The documentation pages will explain the syntax (exact symbols you need to enter) and give you examples for a huge number of commands; the w3schools site can be useful for a quick look up https://www.w3schools.com/python/; and the books *Python Programming*, 3rd ed. by John Zelle and *Introduction to Computation and Programming Using Python: With Application to Understanding Data*, 2nd ed. by John V. Guttag both come recommended by our computer science colleagues. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plotting" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next we will cover plotting simple data and finding linear fits to these data. \n", "\n", "Many commands are specialized and will not be loaded every time you run Python. Instead, they are contained in specialized packages that you load whenever you want that set of commands. An example of this is the set of plotting commands we will use here. These commands are contained in the matplotlib.pyplot package. We can load them by running the following command:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The 'as' portion of this command allows you to give a shorthand name to the package that you are loading. This can make your code easier to read and type. Here matplotlib.pyplot is imported with the shorthand plt. For example, we can access the plot command from this package as follows:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are several things to notice about this plot. By default the package has used the elements of the list data as the y-values in the plot. The x-values are just the index position of the elements of the list (notice that the plot starts at zero because of this). Also by default the individual data points are connected by straight line segments and the axes are not labeled. These are defaults we will want to change. \n", "\n", "To specify both the x-values and the y-values we simply need two lists, say:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "xvals=[1,2,3,4,5]\n", "yvals=[1,4,9,16,25]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then we call plot with its first two arguments the x-values and the y-values:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plt.plot(xvals,yvals,\"ro\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The third argument \"ro\" tells plot to color the points red and to draw them as circles instead of connected lines. We can add label axes using the ylabel and xlabel commands:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plt.plot(xvals,yvals,\"ro\")\n", "plt.ylabel('outputs (out units)')\n", "plt.xlabel('inputs (in units)')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For much more on plotting you can check out the matplotlib tutorial on using pyplot: https://matplotlib.org/users/pyplot_tutorial.html." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Linear Fitting" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's turn to fitting a set of data with a best fit line. To make things simple we'll choose data that really do lie on a line. Of course, even when experimental data are expected to lie along a line, they will typically have some scatter around the best fit. For doing fits we will import the numerical Python package numpy:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Suppose the data that we want to fit is as follows:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "xvals = [1,2,3,4,5]\n", "yvals = [3,5,7,9,11]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before you proceed, predict the slope, m, and the y-intercept, b, of the best fit line. Type your predictions here:\n", "\n", "m will be ________ and b will be ________ . \n", "\n", "We can get Python to calculate the best fit line from the data using the numpy command polyfit. In general this command fits a polynomial to the data, but by calling it with the firs two arguments the xvals and yvals and the third argument 1, we are asking it to find the best fit polynomial of degree one (also known as best fit line) to the data. The command polyfit returns the slope and y-intercept of the best fit in that order and so we can store them in variables with the names m and b as follows:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "m,b = np.polyfit(xvals,yvals,1)\n", "print(m,b) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Do these values agree with your predictions? \n", "\n", "Next we can build the y-values for a line with slope m and y-intercept b:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "line = [m*x+b for x in xvals]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we can plot the data we started with and the best fit line together to see how they compare:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plt.plot(xvals,yvals, 'ro', xvals, line, '-k')\n", "plt.ylabel('outputs (out units)')\n", "plt.xlabel('inputs (in units)')\n", "plt.title('Fit to Measured Values')\n", "plt.xlim(0, 6)\n", "plt.ylim(0, 12)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The data we chose above sat perfectly on a line. Let's redo this with a set of data that do not. Also, notice that you can put all of these commands together into a single evaluation:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "xvals = [1,2,3,4,5]\n", "yvals = [2.73,4.4,7.23,8.9,10.55]\n", "\n", "m,b = np.polyfit(xvals,yvals,1)\n", "print(m,b)\n", "\n", "line = [m*x+b for x in xvals]\n", "\n", "plt.plot(xvals,yvals, 'ro', xvals, line, '-k')\n", "plt.ylabel('outputs (out units)')\n", "plt.xlabel('inputs (in units)')\n", "plt.title('Fit to Measured Values')\n", "plt.xlim(0, 6)\n", "plt.ylim(0, 12)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is useful to retain the print(m,b) command here as well so that you can read off the slope and y-intercept of your best fit line. " ] } ], "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 }