{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 1.0 Introduction to Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Estimated time for this notebook: 10 minutes*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.0.1 Why write programs for research?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Programs are a rigorous way of describing data analysis for other researchers, as well as for computers.\n", "\n", "- Not just labour saving\n", "- Scripted research can be tested and reproduced\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sensible Input - Reasonable Output" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Computational research suffers from people assuming each other's data manipulation is correct.\n", "By sharing code, which is much more easy for a non-author to understand than a spreadsheet, we can avoid the \"SIRO\" problem.\n", "The old saw \"Garbage in Garbage out\" is not the real problem for science:\n", "\n", "- Sensible input\n", "- Reasonable output\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Why write software to manage your data and plots? " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use programs for our entire research pipeline.\n", "Not just big scientific simulation codes, but also the small scripts which we use to tidy up data and produce plots.\n", "This should be code, so that the whole research pipeline is recorded for reproducibility.\n", "Data manipulation in spreadsheets is much harder to share or check.\n", "There are many data analysis examples out there, like the on the [software carpentry site](https://swcarpentry.github.io/python-novice-inflammation/01-intro/index.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.0.2 Why Python?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Why teach Python?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "* In this first session, we will introduce [Python](http://www.python.org).\n", "* This course is about programming for data analysis and visualisation in research.\n", "* It's not mainly about Python.\n", "* But we have to use some language.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Why Python?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "- Python is quick to program in\n", "- Python is popular in research, and has lots of libraries for science\n", "- Python interfaces well with faster languages\n", "- Python is free, so you'll never have a problem getting hold of it, wherever you go.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.0.3 Many kinds of Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The Jupyter Notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The easiest way to get started using Python, and one that is commonly used for exploratory research, is the Jupyter Notebook." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the notebook, you can easily mix code with discussion and commentary.\n", "You can also mix code with the results of that code, such as graphs and other data visualisations." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Make plot\n", "%matplotlib inline\n", "import math\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "theta = np.arange(0, 4 * math.pi, 0.1)\n", "eight = plt.figure()\n", "axes = eight.add_axes([0, 0, 1, 1])\n", "axes.plot(0.5 * np.sin(theta), np.cos(theta / 2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We're going to be mainly working in the Jupyter notebook in this course. To get hold of a copy of the notebook, follow the [setup instructions shown on the course website](https://alan-turing-institute.github.io/rse-course/html/course_prerequisites/index.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Jupyter notebooks consist of discussion cells, referred to as \"markdown cells\", and \"code cells\", which contain Python. This document has been created using Jupyter notebook, and this very cell is a **Markdown Cell**. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "This cell is a code cell\n" ] } ], "source": [ "print(\"This cell is a code cell\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Code cell inputs are numbered, and show the output below." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Markdown cells contain text which uses a simple format to achive pretty layout, \n", "for example, to obtain:\n", "\n", "**bold**, *italic*\n", "\n", "* Bullet\n", "\n", "> Quote\n", "\n", "We write:\n", "\n", " **bold**, *italic*\n", "\n", " * Bullet\n", "\n", " > Quote\n", "\n", "See the Markdown documentation at [This Hyperlink](http://daringfireball.net/projects/markdown/)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Typing code in the notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When working with the notebook, you can either be in a cell, typing its contents, or outside cells, moving around the notebook.\n", "\n", "* When in a cell, press escape to leave it. When moving around outside cells, press return to enter.\n", "* Outside a cell:\n", " * Use arrow keys to move around.\n", " * Press `b` to add a new cell below the cursor.\n", " * Press `m` to turn a cell from code mode to markdown mode.\n", " * Press `shift`+`enter` to calculate the code in the block.\n", " * Press `h` to see a list of useful keys in the notebook.\n", "* Inside a cell:\n", " * Press `tab` to suggest completions of variables. (Try it!)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Supplementary material*: Learn more about [Jupyter notebooks](https://jupyter.org/)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Python at the command line" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "More experience Python users tend to prefer working in a \"command line environment\".\n", "You can find out more about this by attending a [\"Software Carpentry\"](https://software-carpentry.org/) or similar workshop, which introduce the skills needed for computationally based research." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "8\n" ] } ], "source": [ "%%bash\n", "# Above line tells Python to execute this cell as *shell code*\n", "# not Python, as if we were in a command line\n", "# This is called a 'cell magic'\n", "\n", "python -c \"print(2 * 4)\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Python scripts" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When your code gets more complicated, you'll want to be able to write your own full programs in Python, which can be run just like any other program on your computer.\n", "Here are some examples:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "8\n" ] } ], "source": [ "%%bash\n", "echo \"print(2 * 4)\" > eight.py\n", "python eight.py" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can make the script directly executable (on Linux or Mac) by inserting a [shebang](https://en.wikipedia.org/wiki/Shebang_%28Unix%29) and [setting the permissions](http://v4.software-carpentry.org/shell/perm.html) to execute." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting fourteen.py\n" ] } ], "source": [ "%%writefile fourteen.py\n", "#! /usr/bin/env python\n", "print(2 * 7)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "14\n" ] } ], "source": [ "%%bash\n", "chmod u+x fourteen.py\n", "./fourteen.py" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Python Libraries" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can write our own python libraries, called modules which we can import into the notebook and invoke:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting draw_eight.py\n" ] } ], "source": [ "%%writefile draw_eight.py\n", "# Above line tells the notebook to treat the rest of this\n", "# cell as content for a file on disk.\n", "import math\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "\n", "def make_figure():\n", " theta = np.arange(0, 4 * math.pi, 0.1)\n", " eight = plt.figure()\n", " axes = eight.add_axes([0, 0, 1, 1])\n", " axes.plot(0.5 * np.sin(theta), np.cos(theta / 2))\n", " return eight" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In a real example, we could edit the file on disk using a program such as [Atom](https://atom.io) or [VS code](https://code.visualstudio.com/)." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "import draw_eight # Load the library file we just wrote to disk" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "image = draw_eight.make_figure()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is a huge variety of available packages to do pretty much anything. For instance, try `import antigravity`.\n", "\n", "The `%%` at the beginning of a cell is called *magics*. There's a [large list of them available](https://ipython.readthedocs.io/en/stable/interactive/magics.html) and you can [create your own](http://ipython.readthedocs.io/en/stable/config/custommagics.html).\n" ] } ], "metadata": { "jekyll": { "display_name": "Many kinds of Python" }, "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.8.8" } }, "nbformat": 4, "nbformat_minor": 1 }