{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"\n",
"# Computational Physics - Week 1 ##\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"\n",
"## Table of contents week 1\n",
" \n",
"Computational Physics - Week 1: [>>](#Computational-Physics---Week-1) \n",
"-Table of contents week 1: [>>](#Table-of-contents-week-1) \n",
"-Introduction to week 1: [>>](#Introduction-to-week-1) \n",
"-Installing Python and Jupyter software: [>>](#Installing-Python-and-Jupyter-software) \n",
"-Jupyter Notebooks revisited - cells: [>>](#Jupyter-Notebooks-revisited---cells) \n",
"-Markdown cells: [>>](#Markdown-cells) \n",
"--Entering text and tables: [>>](#Entering-text-and-tables) \n",
"--Including links: [>>](#Including-links) \n",
"--Figures: [>>](#Figures) \n",
"--Entering formulae: [>>](#Entering-formulae) \n",
"-Pandas: [>>](#Pandas) \n",
"--Reading data into Pandas: [>>](#Reading-data-into-Pandas) \n",
"--Week 1 exercise 1: [>>](#Week-1-exercise-1) \n",
"-Data analysis: [>>](#Data-analysis) \n",
"--Plotting with matplotlib: [>>](#Plotting-with-matplotlib) \n",
"--Fitting with least_squares: [>>](#Fitting-with-least_squares) \n",
"--Week 1 exercise 2: [>>](#Week-1-exercise-2) \n",
"--Week 1 exercise 3: [>>](#Week-1-exercise-3) \n",
"--Week 1 exercise 4: [>>](#Week-1-exercise-4) "
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"\n",
"## Introduction to week 1\n",
"The Computational Physics module (Phys205) builds on the knowledge you acquired in the Introduction to Computational Physics module (Phys105) you took in your first year. The first few weeks follow a format similar to that used in Phys105: there will be a lecture that introduces an aspect of Python and then a computer lab in which you will work through a Jupyter Notebook that contains some exercises. Demonstrators will be available to help with any difficulties you have, and you should get one of them to mark your work when you have finished it.\n",
"\n",
"The second part of the course, which will start later this semester, consists of a set of short projects that you will tackle in groups of about three. Example projects could include determining Feigenbaum's constant by investigating the behaviour of the logistic map and writing a Monte Carlo to simulate the determination of $\\pi$ using raindrops. Again, demonstrators will be available to help you with any technical problems you have. The projects will be assessed through short individual reports, which should be written as Jupyter Notebooks. If you have any ideas for projects you would like to try, discuss them with me and we will decide if they are suitable!\n",
"\n",
"The final section of the course, which will run in semester 2, consists of longer projects. You will work on these in groups of six to eight. Possible topics include modelling traffic flow in the Birkenhead tunnel, and investigating the relationship between the availability of prey and the size and number of predators in a range of habitats. You will be asked to produce an initial project plan, describing how you plan to tackle the problem you have been given, and a group report at the end of the project. You will also give a presentation explaining your project to the other Phys205 groups. Again, if you have any ideas for topics you would like to tackle, please discuss them with me!\n",
"\n",
"Today, we will start with a reminder on how to install the tools we will be using in the course (the Python programming language and Jupyter Notebooks) and then look at how data can be imported into a Python program and analysed using the Pandas package. (We will look at Pandas in more detail next week.) We will finish by revisiting the problem of fitting data using the `least_squares` routine from the SciPy library, which you will be using extensively in Practical Physics II (Phys206). \n",
"\n",
"Today, and in all our Phys205 sessions, please read through the relevant sections of the Notebook before you try the problems. (Of course, you can miss out revision topics, like how to use Markdown, if you are familiar with them!). If you don't understand anything in the Notebook, or have difficulties with the problems, ask one of the demonstrators for help. You can also consult the recommended textbooks ([A student's guide to Python for physical modelling](https://press.princeton.edu/titles/11349.html), or [Learning scientific programming with Python](http://www.cambridge.org/gb/academic/subjects/physics/mathematical-methods/learning-scientific-programming-python?format=PB#07de1fdPT6eysmS0.97)), both of which are available in the libary. Alternatively, ask Google - there is lots of information on Python and Jupyter Notebooks out there! "
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"\n",
"## Installing Python and Jupyter software\n",
"\n",
"Python and Jupyter Notebooks are available on the CoCalc system will be using in the Phys205 computing sessions (https://cocalc.com).\n",
"\n",
"If you want to use Python and Jupyter Notebooks on your own computer, you can install the software required for Windows, Mac or Linux PCs as follows: \n",
"Go to the Anaconda web site https://www.anaconda.com/products/individual. Select Windows (64 or 32 bit), macOS or Linux, depending on the operating system running on your computer. Download the version of Anaconda labelled Python 3.8. Follow the installation instructions on the web site.\n",
"\n",
"Once Anaconda is installed, open it and launch Jupyter Notebook to get started: \n",
"\n",
"* On Windows, click the \"Anaconda3\" icon in the start menu and then \"Jupyter Notebook\". \n",
"* On Linux, open a terminal window , type in the command \"jupyter notebook &\" and presss *Enter*.\n",
"* On a Mac, click on \"Anaconda-Navigator\" in the LaunchPad and then \"Jupyter Notebook\" or open a terminal window, type in the command \"jupyter notebook &\" and press *Enter*.\n",
"\n",
"\n",
"## Jupyter Notebooks revisited - cells\n",
"\n",
"Jupyter Notebooks consist of cells in which nicely formatted documents can be written and cells which contain computer code. The language used to create the document cells is called Markdown, and we will use the Python in the code cells.\n",
"\n",
"When you start a new Notebook, its first cell will be a code cell and any new cell you create will be a code cell by default. You can create a new cell below the current cell by clicking the \"+\" symbol in the Notebook menu bar or by using the *Insert* menu. (Click on *Insert*, then on *Insert Cell Above*, or *Insert Cell Below*, as appropriate.) To change a cell's type to Markdown, select the cell (by clicking in it) and then click *Cell, Cell Type* and *Markdown*. Alternatively, select the cell, press *Esc*, then _m_ (for Markdown). You will have to click inside the cell (or press *Enter*) before it is selected and you are able to type in it!\n",
"\n",
"A Markdown cell can be changed to a code cell using the *Cell* menu, or by typing *Esc, y*.\n",
"\n",
"Cells can be deleted by selecting them and then using the *Edit* menu, or by pressing *Esc, d, d*. \n",
"\n",
"\n",
"## Markdown cells\n",
"[Markdown](https://guides.github.com/features/mastering-markdown/) is a way of writing nicely formatted text, allowing the inclusion of pictures, web links, videos and other features in your Notebooks.\n",
"\n",
"To see how this cell was written using Markdown, double click on it.\n",
"\n",
"To \"run\" or \"compile\" the cell, so the text is formatted nicely, select the cell (click in it) and press *Ctrl + Enter* (i.e. press the *Ctrl* and *Enter* keys at the same time, *Command + Enter* on a Mac). Alternatively, you can click on the *Run* button on the menu bar. If you press *Shift + Enter*, you will run the current cell and move to the next cell (or create a new cell below the current one if there isn't one already there). \n",
"\n",
"Flipping between looking at the Markdown (double click) and the compiled cell (*Ctrl + Enter*) will allow you to see how Markdown can be used.\n",
"\n",
"### Entering text and tables\n",
"If you want to write some normal text, just type it into the cell. If you want to emphasize the text, you can *write in italics* (using asterisks before and after the section that you want to be in italics), or **make it bold** (using double asterisks). (There are _alternative ways of getting italics_ and of __entering bold text__, using single and double underscores.) You can also ~~cross out text~~ (using two ~ symbols before and after the text to be deleted).\n",
"\n",
"If you want a new paragraph, press *Enter* twice, so you produce an empty line.\n",
"\n",
"If you want to start a new line without having a new paragraph, leave two spaces at the end of the line, like this: \n",
"This is a new line. \n",
"So is this. \n",
"\n",
"If you want a numbered list, do this:\n",
"1. This is the first entry.\n",
"2. This is the second.\n",
"3. And this the third.\n",
"\n",
"Bulleted lists are also easy to produce:\n",
"* This is the first bullet.\n",
"* And this the second.\n",
"\n",
"If you want to present information in a table, use the following syntax (double click to see the Markdown!):\n",
"\n",
"|Number | Angle (degrees)| Cosine of angle|\n",
"|-------|----------------|----------------|\n",
"|0 |0 |1 |\n",
"|1 |30 |0.866 |\n",
"|2 |45 |0.707 |\n",
"|3 |60 |0.5 |\n",
"|4 |90 |0.0 |\n",
"\n",
"**Table 1** *The value of the cosine of several angles.*\n",
"\n",
"(You don't have to line up the Markdown columns; when you run the cell that will be done automatically, but it does make reading and editing the Markdown easier!) Notice that you have to enter the caption \"by hand\" below the table; table and figure numbers are not entered automatically.\n",
"\n",
"If you want a title or heading, use the hash symbol. (One hash is a title, two a heading, three a subheading, etc.) For example, here is a subheading...\n",
"\n",
"### Including links\n",
"Links to pages and videos on the web can be included as is done above (and here) for the introduction to [Markdown](https://guides.github.com/features/mastering-markdown/).\n",
"Alternatively, the link can be direct, e.g. https://www.liverpool.ac.uk.\n",
"\n",
"Links can also be \"reference style\". This is where you can find the [UK google home page][1]. You can put the link at the end of the paragraph or cell. This makes the Markdown a little easier to read. There is no visible difference in the text that results when you run the cell.\n",
"\n",
"[1]: http://www.google.co.uk\n",
"\n",
"Links can be made to sections or figures in the Notebook. For example, back to the section [Entering text and tables](#Entering-text-and-tables). Double clicking this cell will allow you to see how the section is labelled (using a \"#\" followed by the section title with the spaces replaced by hyphens, and how a link to that label is created: the label is not allowed to contain any spaces!).\n",
"\n",
"### Figures\n",
"Images stored on your computer can be added using the syntax used below (double click the cell to see it!). The first example uses the path relative to the folder/directory in which the Notebook is saved:\n",
"\n",
"![](Cosine.png \"Plot of cosine\")\n",
"\n",
"**Figure 1** *Cosine as a function of angle*\n",
"\n",
"The text between the quotation marks (\"Plot of cosine\") is what is shown if you hover over the image. The absolute path can also be used in Markdown as is shown below...though you can't go back further than the Jupyter start folder/directory. These images are not automatically incorporated if you convert your markdown to pdf, so the following section is \"commented out\". (Anything between the \n",
"\"<\", \"!\" and \"--\" and the \"--\" and \">\" symbols is treated as a comment, i.e. an explanatory remark, and is not displayed when the Markdown is compiled.) \n",
"\n",
"\n",
"\n",
"Figures from the web can be added in the markdown using the syntax shown below.\n",
" \n",
"![GitHub logo](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png \"GitHib logo\")\n",
"\n",
"**Figure 1.1** *This figure shows the GitHub logo*\n",
"\n",
"(Again, this has been commented out, as there is no automatic location and conversion of web images to pdf, so the above lines would have spoiled the pdf version of this Notebook.) \n",
"\n",
"Note, if you want to create a pdf file of this Notebook including the above image, you will have to upload the image to CoCalc and use a local link!\n",
"\n",
"### Entering formulae\n",
"Mathematical formulae are entered using [LaTeX](http://mirrors.rit.edu/CTAN/info/lshort/english/lshort.pdf).\n",
"How this can be done is best illustrated with a few examples. A formula can be entered \"inline\" like this: $E = mc^2$. (Notice how the dollar signs \"bracket\" the mathematical formula.)\n",
"\n",
"Formulae can also be placed on their own line in the centre of the page using two dollar symbols:\n",
"\n",
"$$\n",
"\\sin^2 x + \\cos^2 x = 1.\n",
"$$\n",
"\n",
"Notice how functions like $\\sin$ and $\\cos$ (and $\\log$, $\\exp$ etc.) are entered, and how superscripts ($x^2$) and subscripts ($p_0$) can be obtained. If you need more than one character in a superscript (or subscript), enclose the relevant section in curly brackets, e.g. $x_{max}$.\n",
"\n",
"Note, it is important in Markdown to ensure there are no spaces between the \"$\" and the characters in inline formulae. Although spaces are allowed by the LaTeX standard, they can cause problems when you try and run LaTex on Notebooks, e.g. when using *File, Export Notebook as..., LaTeX*, or *File, Export Notebook as..., PDF*.\n",
"\n",
"Fractions are obtained like this $\\frac {1}{2}$, and a vast array of symbols is available, for example: $\\sqrt {2}$, $2 \\approx 2.5$, $\\int_0^1 x^2 dx$, $\\sum_{n = 0}^{15} x_n$. (See [here](LaTeX_symbols.pdf) for more.) Brackets which expand to the required height can be entered using\n",
"$\\left( \\right)$ or $\\left[ \\right]$. Greek letters are written $\\alpha$, $\\beta$ etc. An example combining some of these features is the formula for the Fermi function:\n",
"\n",
"$$\n",
"F(\\epsilon ) = \\frac{1}{\\exp \\left [ \\frac{\\epsilon - \\mu}{kT} \\right ] + 1}.\n",
"$$\n",
"\n",
"Finally, \"inline\" segments of computer code can be indicated using reverse quotes, for example: `print(\"This is a Python 3 print statement\")`. Three reverse quotes, with a tag indicating the relevant language, can be used to produce blocks of code. We shall be interested in Python, so we will be seeing things like:\n",
"\n",
"``` python\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"#\n",
"print(\"This illustrates how Markdown can be used to format a block of code\")\n",
"#\n",
"for n in range(0, nMax + 1):\n",
" print(\"n =\",n)\n",
"```\n",
"\n",
"And that's about all we need to know about Markdown!\n",
"\n",
"Of course, the power of Jupyter Notebooks is that they allow documents and figures in Markdown cells like this one to be combined with computer code. We will now exploit this by taking a first look at the Pandas package."
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"\n",
"## Pandas\n",
"\n",
"Pandas is a Python library that provides high-performance, easy-to-use data structures and data analysis tools. It can be thought of as a powerful version of Excel, with a lot more features! It is available in CoCalc (and should also be available on your computer as part of the Anaconda3 package if you have installed that), so in order to use it we just need to import it. We will also import `numpy` and `matplotlib.pyplot`, as we will need these, and use the `%matplotlib inline` \"magic\" command to ensure our plots appear in the Notebook:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
],
"source": [
"# \n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"\n",
"### Reading data into Pandas\n",
"\n",
"The most useful Pandas data structures are known as DataFrames. Data can be read into them from a wide range of formats including from comma-separated-variable (csv) files, Excel spreadsheets (xls or xlsx) and the web (html). Here, we will read an Excel (xlsx) file into a DataFrame called `df` in our Notebook."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Unnamed: 0
\n",
"
xData
\n",
"
xError
\n",
"
yData
\n",
"
yError
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
0
\n",
"
0.000000
\n",
"
0.048113
\n",
"
3.632305
\n",
"
1.905861
\n",
"
\n",
"
\n",
"
1
\n",
"
1
\n",
"
0.172414
\n",
"
0.048113
\n",
"
1.791350
\n",
"
1.338413
\n",
"
\n",
"
\n",
"
2
\n",
"
2
\n",
"
0.344828
\n",
"
0.048113
\n",
"
3.368522
\n",
"
1.835353
\n",
"
\n",
"
\n",
"
3
\n",
"
3
\n",
"
0.517241
\n",
"
0.048113
\n",
"
4.225319
\n",
"
2.055558
\n",
"
\n",
"
\n",
"
4
\n",
"
4
\n",
"
0.689655
\n",
"
0.048113
\n",
"
2.573355
\n",
"
1.604168
\n",
"
\n",
"
\n",
"
5
\n",
"
5
\n",
"
0.862069
\n",
"
0.048113
\n",
"
8.720353
\n",
"
2.953024
\n",
"
\n",
"
\n",
"
6
\n",
"
6
\n",
"
1.034483
\n",
"
0.048113
\n",
"
7.855142
\n",
"
2.802703
\n",
"
\n",
"
\n",
"
7
\n",
"
7
\n",
"
1.206897
\n",
"
0.048113
\n",
"
4.901981
\n",
"
2.214042
\n",
"
\n",
"
\n",
"
8
\n",
"
8
\n",
"
1.379310
\n",
"
0.048113
\n",
"
4.629510
\n",
"
2.151630
\n",
"
\n",
"
\n",
"
9
\n",
"
9
\n",
"
1.551724
\n",
"
0.048113
\n",
"
8.291520
\n",
"
2.879500
\n",
"
\n",
"
\n",
"
10
\n",
"
10
\n",
"
1.724138
\n",
"
0.048113
\n",
"
16.539529
\n",
"
4.066882
\n",
"
\n",
"
\n",
"
11
\n",
"
11
\n",
"
1.896552
\n",
"
0.048113
\n",
"
44.409078
\n",
"
6.664014
\n",
"
\n",
"
\n",
"
12
\n",
"
12
\n",
"
2.068966
\n",
"
0.048113
\n",
"
132.682155
\n",
"
11.518774
\n",
"
\n",
"
\n",
"
13
\n",
"
13
\n",
"
2.241379
\n",
"
0.048113
\n",
"
151.545870
\n",
"
12.310397
\n",
"
\n",
"
\n",
"
14
\n",
"
14
\n",
"
2.413793
\n",
"
0.048113
\n",
"
86.623757
\n",
"
9.307188
\n",
"
\n",
"
\n",
"
15
\n",
"
15
\n",
"
2.586207
\n",
"
0.048113
\n",
"
25.881347
\n",
"
5.087371
\n",
"
\n",
"
\n",
"
16
\n",
"
16
\n",
"
2.758621
\n",
"
0.048113
\n",
"
14.013225
\n",
"
3.743424
\n",
"
\n",
"
\n",
"
17
\n",
"
17
\n",
"
2.931034
\n",
"
0.048113
\n",
"
11.686240
\n",
"
3.418514
\n",
"
\n",
"
\n",
"
18
\n",
"
18
\n",
"
3.103448
\n",
"
0.048113
\n",
"
10.783761
\n",
"
3.283864
\n",
"
\n",
"
\n",
"
19
\n",
"
19
\n",
"
3.275862
\n",
"
0.048113
\n",
"
13.621517
\n",
"
3.690734
\n",
"
\n",
"
\n",
"
20
\n",
"
20
\n",
"
3.448276
\n",
"
0.048113
\n",
"
11.890779
\n",
"
3.448301
\n",
"
\n",
"
\n",
"
21
\n",
"
21
\n",
"
3.620690
\n",
"
0.048113
\n",
"
18.899116
\n",
"
4.347311
\n",
"
\n",
"
\n",
"
22
\n",
"
22
\n",
"
3.793103
\n",
"
0.048113
\n",
"
13.685586
\n",
"
3.699403
\n",
"
\n",
"
\n",
"
23
\n",
"
23
\n",
"
3.965517
\n",
"
0.048113
\n",
"
18.520957
\n",
"
4.303598
\n",
"
\n",
"
\n",
"
24
\n",
"
24
\n",
"
4.137931
\n",
"
0.048113
\n",
"
19.972319
\n",
"
4.469040
\n",
"
\n",
"
\n",
"
25
\n",
"
25
\n",
"
4.310345
\n",
"
0.048113
\n",
"
29.222153
\n",
"
5.405752
\n",
"
\n",
"
\n",
"
26
\n",
"
26
\n",
"
4.482759
\n",
"
0.048113
\n",
"
17.229880
\n",
"
4.150889
\n",
"
\n",
"
\n",
"
27
\n",
"
27
\n",
"
4.655172
\n",
"
0.048113
\n",
"
26.286534
\n",
"
5.127039
\n",
"
\n",
"
\n",
"
28
\n",
"
28
\n",
"
4.827586
\n",
"
0.048113
\n",
"
25.967242
\n",
"
5.095806
\n",
"
\n",
"
\n",
"
29
\n",
"
29
\n",
"
5.000000
\n",
"
0.048113
\n",
"
30.105888
\n",
"
5.486883
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Unnamed: 0 xData xError yData yError\n",
"0 0 0.000000 0.048113 3.632305 1.905861\n",
"1 1 0.172414 0.048113 1.791350 1.338413\n",
"2 2 0.344828 0.048113 3.368522 1.835353\n",
"3 3 0.517241 0.048113 4.225319 2.055558\n",
"4 4 0.689655 0.048113 2.573355 1.604168\n",
"5 5 0.862069 0.048113 8.720353 2.953024\n",
"6 6 1.034483 0.048113 7.855142 2.802703\n",
"7 7 1.206897 0.048113 4.901981 2.214042\n",
"8 8 1.379310 0.048113 4.629510 2.151630\n",
"9 9 1.551724 0.048113 8.291520 2.879500\n",
"10 10 1.724138 0.048113 16.539529 4.066882\n",
"11 11 1.896552 0.048113 44.409078 6.664014\n",
"12 12 2.068966 0.048113 132.682155 11.518774\n",
"13 13 2.241379 0.048113 151.545870 12.310397\n",
"14 14 2.413793 0.048113 86.623757 9.307188\n",
"15 15 2.586207 0.048113 25.881347 5.087371\n",
"16 16 2.758621 0.048113 14.013225 3.743424\n",
"17 17 2.931034 0.048113 11.686240 3.418514\n",
"18 18 3.103448 0.048113 10.783761 3.283864\n",
"19 19 3.275862 0.048113 13.621517 3.690734\n",
"20 20 3.448276 0.048113 11.890779 3.448301\n",
"21 21 3.620690 0.048113 18.899116 4.347311\n",
"22 22 3.793103 0.048113 13.685586 3.699403\n",
"23 23 3.965517 0.048113 18.520957 4.303598\n",
"24 24 4.137931 0.048113 19.972319 4.469040\n",
"25 25 4.310345 0.048113 29.222153 5.405752\n",
"26 26 4.482759 0.048113 17.229880 4.150889\n",
"27 27 4.655172 0.048113 26.286534 5.127039\n",
"28 28 4.827586 0.048113 25.967242 5.095806\n",
"29 29 5.000000 0.048113 30.105888 5.486883"
]
},
"execution_count": 16,
"metadata": {
},
"output_type": "execute_result"
}
],
"source": [
"#\n",
"df = pd.read_excel(\"Spectrum01.xlsx\")\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"\n",
"We have the data we want, but also an extra column full of row indices, and a column header **Unnamed:0** that we don't want. We will see next week how we can delete (and add) columns and rows in DataFrames. For now, we modify the way we read in the data so we don't get the unwanted material in the first place!"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
xData
\n",
"
xError
\n",
"
yData
\n",
"
yError
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
0.000000
\n",
"
0.048113
\n",
"
3.632305
\n",
"
1.905861
\n",
"
\n",
"
\n",
"
1
\n",
"
0.172414
\n",
"
0.048113
\n",
"
1.791350
\n",
"
1.338413
\n",
"
\n",
"
\n",
"
2
\n",
"
0.344828
\n",
"
0.048113
\n",
"
3.368522
\n",
"
1.835353
\n",
"
\n",
"
\n",
"
3
\n",
"
0.517241
\n",
"
0.048113
\n",
"
4.225319
\n",
"
2.055558
\n",
"
\n",
"
\n",
"
4
\n",
"
0.689655
\n",
"
0.048113
\n",
"
2.573355
\n",
"
1.604168
\n",
"
\n",
"
\n",
"
5
\n",
"
0.862069
\n",
"
0.048113
\n",
"
8.720353
\n",
"
2.953024
\n",
"
\n",
"
\n",
"
6
\n",
"
1.034483
\n",
"
0.048113
\n",
"
7.855142
\n",
"
2.802703
\n",
"
\n",
"
\n",
"
7
\n",
"
1.206897
\n",
"
0.048113
\n",
"
4.901981
\n",
"
2.214042
\n",
"
\n",
"
\n",
"
8
\n",
"
1.379310
\n",
"
0.048113
\n",
"
4.629510
\n",
"
2.151630
\n",
"
\n",
"
\n",
"
9
\n",
"
1.551724
\n",
"
0.048113
\n",
"
8.291520
\n",
"
2.879500
\n",
"
\n",
"
\n",
"
10
\n",
"
1.724138
\n",
"
0.048113
\n",
"
16.539529
\n",
"
4.066882
\n",
"
\n",
"
\n",
"
11
\n",
"
1.896552
\n",
"
0.048113
\n",
"
44.409078
\n",
"
6.664014
\n",
"
\n",
"
\n",
"
12
\n",
"
2.068966
\n",
"
0.048113
\n",
"
132.682155
\n",
"
11.518774
\n",
"
\n",
"
\n",
"
13
\n",
"
2.241379
\n",
"
0.048113
\n",
"
151.545870
\n",
"
12.310397
\n",
"
\n",
"
\n",
"
14
\n",
"
2.413793
\n",
"
0.048113
\n",
"
86.623757
\n",
"
9.307188
\n",
"
\n",
"
\n",
"
15
\n",
"
2.586207
\n",
"
0.048113
\n",
"
25.881347
\n",
"
5.087371
\n",
"
\n",
"
\n",
"
16
\n",
"
2.758621
\n",
"
0.048113
\n",
"
14.013225
\n",
"
3.743424
\n",
"
\n",
"
\n",
"
17
\n",
"
2.931034
\n",
"
0.048113
\n",
"
11.686240
\n",
"
3.418514
\n",
"
\n",
"
\n",
"
18
\n",
"
3.103448
\n",
"
0.048113
\n",
"
10.783761
\n",
"
3.283864
\n",
"
\n",
"
\n",
"
19
\n",
"
3.275862
\n",
"
0.048113
\n",
"
13.621517
\n",
"
3.690734
\n",
"
\n",
"
\n",
"
20
\n",
"
3.448276
\n",
"
0.048113
\n",
"
11.890779
\n",
"
3.448301
\n",
"
\n",
"
\n",
"
21
\n",
"
3.620690
\n",
"
0.048113
\n",
"
18.899116
\n",
"
4.347311
\n",
"
\n",
"
\n",
"
22
\n",
"
3.793103
\n",
"
0.048113
\n",
"
13.685586
\n",
"
3.699403
\n",
"
\n",
"
\n",
"
23
\n",
"
3.965517
\n",
"
0.048113
\n",
"
18.520957
\n",
"
4.303598
\n",
"
\n",
"
\n",
"
24
\n",
"
4.137931
\n",
"
0.048113
\n",
"
19.972319
\n",
"
4.469040
\n",
"
\n",
"
\n",
"
25
\n",
"
4.310345
\n",
"
0.048113
\n",
"
29.222153
\n",
"
5.405752
\n",
"
\n",
"
\n",
"
26
\n",
"
4.482759
\n",
"
0.048113
\n",
"
17.229880
\n",
"
4.150889
\n",
"
\n",
"
\n",
"
27
\n",
"
4.655172
\n",
"
0.048113
\n",
"
26.286534
\n",
"
5.127039
\n",
"
\n",
"
\n",
"
28
\n",
"
4.827586
\n",
"
0.048113
\n",
"
25.967242
\n",
"
5.095806
\n",
"
\n",
"
\n",
"
29
\n",
"
5.000000
\n",
"
0.048113
\n",
"
30.105888
\n",
"
5.486883
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" xData xError yData yError\n",
"0 0.000000 0.048113 3.632305 1.905861\n",
"1 0.172414 0.048113 1.791350 1.338413\n",
"2 0.344828 0.048113 3.368522 1.835353\n",
"3 0.517241 0.048113 4.225319 2.055558\n",
"4 0.689655 0.048113 2.573355 1.604168\n",
"5 0.862069 0.048113 8.720353 2.953024\n",
"6 1.034483 0.048113 7.855142 2.802703\n",
"7 1.206897 0.048113 4.901981 2.214042\n",
"8 1.379310 0.048113 4.629510 2.151630\n",
"9 1.551724 0.048113 8.291520 2.879500\n",
"10 1.724138 0.048113 16.539529 4.066882\n",
"11 1.896552 0.048113 44.409078 6.664014\n",
"12 2.068966 0.048113 132.682155 11.518774\n",
"13 2.241379 0.048113 151.545870 12.310397\n",
"14 2.413793 0.048113 86.623757 9.307188\n",
"15 2.586207 0.048113 25.881347 5.087371\n",
"16 2.758621 0.048113 14.013225 3.743424\n",
"17 2.931034 0.048113 11.686240 3.418514\n",
"18 3.103448 0.048113 10.783761 3.283864\n",
"19 3.275862 0.048113 13.621517 3.690734\n",
"20 3.448276 0.048113 11.890779 3.448301\n",
"21 3.620690 0.048113 18.899116 4.347311\n",
"22 3.793103 0.048113 13.685586 3.699403\n",
"23 3.965517 0.048113 18.520957 4.303598\n",
"24 4.137931 0.048113 19.972319 4.469040\n",
"25 4.310345 0.048113 29.222153 5.405752\n",
"26 4.482759 0.048113 17.229880 4.150889\n",
"27 4.655172 0.048113 26.286534 5.127039\n",
"28 4.827586 0.048113 25.967242 5.095806\n",
"29 5.000000 0.048113 30.105888 5.486883"
]
},
"execution_count": 17,
"metadata": {
},
"output_type": "execute_result"
}
],
"source": [
"#\n",
"df = pd.read_excel(\"Spectrum01.xlsx\", index_col = 0)\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"\n",
"That looks better!"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"\n",
"### Week 1 exercise 1\n",
"\n",
"Use Excel (on your own computer!) to create a spreadsheet called TimeTable.xlsx with columns labelled with the days of the week and two rows, one labelled \"morning\" and the other \"afternoon\". Enter a one in each of the cells in which you have a lecture, problems class or laboratory and a zero where you are free. Read the spreadsheet into a DataFrame called dfTimeTable in the cell below this one and then display it."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"dfTimeTable:\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Monday
\n",
"
Tuesday
\n",
"
Wednesday
\n",
"
Thursday
\n",
"
Friday
\n",
"
Saturday
\n",
"
Sunday
\n",
"
\n",
" \n",
" \n",
"
\n",
"
Morning
\n",
"
1
\n",
"
1
\n",
"
0
\n",
"
1
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
\n",
"
\n",
"
Afternoon
\n",
"
1
\n",
"
0
\n",
"
0
\n",
"
1
\n",
"
1
\n",
"
0
\n",
"
0
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Monday Tuesday Wednesday Thursday Friday Saturday Sunday\n",
"Morning 1 1 0 1 0 0 0\n",
"Afternoon 1 0 0 1 1 0 0"
]
},
"execution_count": 18,
"metadata": {
},
"output_type": "execute_result"
}
],
"source": [
"print(\"dfTimeTable:\")\n",
"dfTimeTable = pd.read_excel(\"TimeTable.xlsx\", index_col = 0)\n",
"dfTimeTable"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"\n",
"## Data analysis\n",
"\n",
"Last year, we used Python to visualise data in various types of plots using `matplotlib.pyplot` and to fit data using the `least_squares` routine from the SciPy library. We will be doing this again in the year two laboratories (Phys206), so we will do some quick revision on plotting and fitting here.\n",
"\n",
"### Plotting with matplotlib\n",
"Let's first plot the data from Spectrum01.xslx we have read into our DataFrame `df`. We will see next week how we can plot directly from Pandas. Here, we will extract the data from the DataFrame so we can use the plotting procedures we learnt about last year. Let's look at one of the columns from the DataFrame:"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0 0.000000\n",
"1 0.172414\n",
"2 0.344828\n",
"3 0.517241\n",
"4 0.689655\n",
"5 0.862069\n",
"6 1.034483\n",
"7 1.206897\n",
"8 1.379310\n",
"9 1.551724\n",
"10 1.724138\n",
"11 1.896552\n",
"12 2.068966\n",
"13 2.241379\n",
"14 2.413793\n",
"15 2.586207\n",
"16 2.758621\n",
"17 2.931034\n",
"18 3.103448\n",
"19 3.275862\n",
"20 3.448276\n",
"21 3.620690\n",
"22 3.793103\n",
"23 3.965517\n",
"24 4.137931\n",
"25 4.310345\n",
"26 4.482759\n",
"27 4.655172\n",
"28 4.827586\n",
"29 5.000000\n",
"Name: xData, dtype: float64"
]
},
"execution_count": 19,
"metadata": {
},
"output_type": "execute_result"
}
],
"source": [
"#\n",
"df.xData"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"\n",
"We see that we get the data we want, but also the indices which we don't. If we turn the column into a numpy array, we get the format we need for making a plot:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 3.63230537 1.79135007 3.36852232 4.22531884 2.57335463\n",
" 8.72035345 7.85514181 4.90198074 4.62951031 8.29152015\n",
" 16.53952863 44.4090777 132.68215463 151.54587047 86.62375697\n",
" 25.88134687 14.01322529 11.68624003 10.78376086 13.62151677\n",
" 11.8907788 18.89911571 13.68558625 18.52095703 19.97231885\n",
" 29.22215296 17.22987975 26.28653374 25.96724159 30.10588789]\n"
]
}
],
"source": [
"#\n",
"xData = np.array(df.xData)\n",
"xError = np.array(df.xError)\n",
"yData = np.array(df.yData)\n",
"yError = np.array(df.yError)\n",
"print(yData)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"\n",
"Now we can create a figure, define the axes we need and make a plot of the data."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"