{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# E2. Exercises" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook contains answers and notes for the following exercises:\n", "\n", "- [Exercise 2.1](#Exercise_2.1)\n", " - [Answer 2.1](#Answer-2.1)\n", "- [Exercise 2.2](#Exercise_2.2)\n", " - [Answer 2.2](#Answer-2.2)\n", "- [Exercise 2.3](#Exercise_2.3)\n", " - [Answer 2.3](#Answer-2.3)\n", "- [Exercise 2.4](#Exercise_2.4)\n", " - [Answer 2.4](#Answer-2.4)\n", "- [Exercise 2.5](#Exercise_2.5)\n", " - [Answer 2.5](#Answer-2.5)\n", "- [Exercise 2.6](#Exercise_2.6)\n", " - [Answer 2.6](#Answer-2.6)\n", "- [Exercise 2.7](#Exercise_2.7)\n", " - [Answer 2.7](#Answer-2.7)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise 2.1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You were given some code:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tired and hungry? False\n", "Just tired? False\n", "Just hungry? True\n" ] } ], "source": [ "#!/usr/bin/env python\n", "\n", "\n", "\n", "# hunger threshold in hours\n", "hungerThreshold = 3.0\n", "# sleep threshold in hours\n", "sleepThreshold = 8.0\n", "\n", "# time since fed, in hours\n", "timeSinceFed = 4.0\n", "# time since sleep, in hours\n", "timeSinceSleep = 3.0\n", "\n", "# Note use of \\ as line continuation here\n", "# It is poor style to have code lines > 79 characters\n", "#\n", "# see http://www.python.org/dev/peps/pep-0008/#maximum-line-length\n", "#\n", "print \"Tired and hungry?\",(timeSinceSleep >= sleepThreshold) and \\\n", " (timeSinceFed >= hungerThreshold)\n", "print \"Just tired?\",(timeSinceSleep >= sleepThreshold) and \\\n", " (not (timeSinceFed >= hungerThreshold))\n", "print \"Just hungry?\",(not (timeSinceSleep >= sleepThreshold)) and \\\n", " (timeSinceFed >= hungerThreshold)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The code above works fine, but the large blocks of logical tests are not very clear or readable, and contain repeated items.\n", "\n", "Modify this block of code to be clearer by assigning the individual logical tests to variables, \n", "\n", "e.g.\n", "\n", "`tired = timeSinceSleep >= sleepThreshold`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Answer 2.1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is quite easily made clearer, and is also improved by making sure you comment what you are doing.\n", "\n", "It is normally a good idea to put some information on what the purpose of the code is etc.\n", "\n", "It is also a good idea if you get into the practice of describing what changes you have made\n", "to the code from the original version that this is based on, to give full attribution.\n", "We will see that this is important with regard to plagiarism in coursework submission.\n", "\n", "Hasve a look at the [Python styleguide](http://www.python.org/dev/peps/pep-0008/#code-lay-out) for ideas on what makes good clear code.\n", "\n", "You wouldn't have been expected to do *all* of these things (the code below is mainly to give you some ideas for what to do next time!), but hopefully you will have at least set the variables:\n", "\n", "`tired = (timeSinceSleep >= sleepThreshold)` \n", "`hungry = (timeSinceFed >= hungerThreshold)`\n", "\n", "and used them in the code for greater clarity." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tired and hungry?\tFalse\n", "Tired or hungry?\t\tTrue\n", "Just tired?\t\tFalse\n", "Just hungry?\t\tTrue\n" ] } ], "source": [ "\"\"\" Exercise 2.1 Scientific Computing\n", " \n", " Thu 3 Oct 2013 10:46:58 BST\n", " \n", " P. Lewis : p.lewis@ucl.ac.uk\n", " \n", " This code prints information on whether\n", " I am tired and/or hungry.\n", " \n", " It is controlled by the variables:\n", " timeSinceFed\n", " timeSinceSleep\n", " \n", " which are checked against hunger and\n", " sleep thresholds:\n", " hungerThreshold\n", " sleepThreshold\n", " \n", " All times given as float, in hours\n", " \n", " \n", " It is a modification of the code in Exercise 2.1\n", " of Scientific Computing (https://github.com/profLewis/geogg122)\n", " \n", " Edits made from original:\n", " - added detailed comment strings\n", " - neatened up the comments\n", " - made code easier to read by setting variables\n", " tired and hungry.\n", " - added a new result for 'tired or hungry'\n", " - added tabs (\\t) to the print statements to get\n", " neater output formatting.\n", " \n", "\"\"\"\n", "\n", "# Thresholds\n", "hungerThreshold = 3.0 # hunger threshold in hours\n", "sleepThreshold = 8.0 # sleep threshold in hours\n", "\n", "# Control variables\n", "timeSinceFed = 4.0 # time since fed, in hour\n", "timeSinceSleep = 3.0 # time since sleep, in hours\n", "\n", "# logical tests for tired and hungry\n", "tired = (timeSinceSleep >= sleepThreshold)\n", "hungry = (timeSinceFed >= hungerThreshold)\n", "\n", "# print results\n", "print \"Tired and hungry?\\t\", tired and hungry \n", "print \"Tired or hungry?\\t\\t\", tired or hungry \n", "print \"Just tired?\\t\\t\", tired and not hungry\n", "print \"Just hungry?\\t\\t\", hungry and not tired" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise 2.2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### A." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A small piece of Python code that will set the variable `today` to be a string with the day of the week today is:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "today is Tuesday\n" ] } ], "source": [ "# This imports a module that we can use to access dates\n", "from datetime import datetime\n", "\n", "# set up a list of days of the week, starting Monday\n", "# Note the line continuation here with \\\n", "week = ['Monday','Tuesday','Wednesday','Thursday',\\\n", " 'Friday','Saturday','Sunday']\n", "\n", "# This part gives the day of the week\n", "# as an integer, 0 -> Monday, 1 -> Tuesday etc.\n", "day_number = datetime.now().weekday()\n", "\n", "# print item day_number in the list week\n", "print \"today is\",week[day_number]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Based on the example below, **set up a diary for youself for the week to print out what you should be doing today, using the conditional structure `if .. elif ... else`.**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Answer 2.2" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Today is Tuesday\n", "Spend the day learning Python\n" ] } ], "source": [ "'''\n", " Exercise 2.2A Scientific Computing\n", " \n", " Mon 7 Oct 2013 10:43:38 BST\n", " \n", " P. Lewis : p.lewis@ucl.ac.uk\n", " \n", " This code prints a diary for today.\n", " \n", "'''\n", "\n", "'''The following code block is taken verbatim from \n", " The Scientific Computing notes\n", "'''\n", "# This imports a module that we can use to access dates\n", "from datetime import datetime\n", "\n", "# set up a list of days of the week, starting Monday\n", "# Note the line continuation here with \\\n", "week = ['Monday','Tuesday','Wednesday','Thursday',\\\n", " 'Friday','Saturday','Sunday']\n", "\n", "# This part gives the day of the week\n", "# as an integer, 0 -> Monday, 1 -> Tuesday etc.\n", "day_number = datetime.now().weekday()\n", "\n", "# print item day_number in the list week\n", "print \"Today is\",week[day_number]\n", "\n", "'''New code: my own work\n", " Following the example in the question for E2.2A\n", "'''\n", "\n", "if day_number == 0: # Monday\n", " print 'Spend the day learning Python'\n", "elif day_number == 1: # Tuesday\n", " print 'Spend the day learning Python'\n", "elif day_number == 2: # Wednesday\n", " print 'Go to Python class'\n", "elif day_number == 3: # Thursday\n", " print 'Spend the day learning Python'\n", "elif day_number == 4: # Friday\n", " print 'Spend the day learning Python'\n", "elif day_number == 5: # Saturday\n", " print 'Spend the day learning Python'\n", "elif day_number == 6: # Sunday\n", " print 'Spend the day learning Python'\n", "else:\n", " print \"get some sleep\"\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You should see from this that this is a rather awkward way to set up something of this nature, and it is prone to error in typing (you could easily miss a day out or type something else wrong)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### B." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You could set up the basic calendar for the week in a list, with the first entry representing Monday, the second Tuesday etc." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "my_diary = ['Spend the day practicing Python',\\\n", " 'Spend the day practicing Python',\\\n", " 'Do some reading in the library at UCL', \\\n", " 'Remember to wake up early to get to the Python class at UCL',\\\n", " 'Spend the day practicing Python',\\\n", " 'Remember to wake up early to go to classes at Imperial College',\\\n", " 'Work at Python exercises from home',\\\n", " 'Work at Python exercises from home']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using a list of this sort, **print the diary entry for today *without* using conditional statements.**\n", "\n", "Criticise the code you develop and make suggestions for improvement." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Answer" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Today is Tuesday so do some reading in the library at UCL\n" ] } ], "source": [ "'''\n", " Exercise 2.2B Scientific Computing\n", " \n", " Mon 7 Oct 2013 10:43:38 BST\n", " \n", " P. Lewis : p.lewis@ucl.ac.uk\n", " \n", " This code prints a diary for today.\n", " \n", "'''\n", "\n", "'''The following code block is taken verbatim from \n", " The Scientific Computing notes\n", "'''\n", "# This imports a module that we can use to access dates\n", "from datetime import datetime\n", "\n", "# set up a list of days of the week, starting Monday\n", "# Note the line continuation here with \\\n", "week = ['Monday','Tuesday','Wednesday','Thursday',\\\n", " 'Friday','Saturday','Sunday']\n", "\n", "# This part gives the day of the week\n", "# as an integer, 0 -> Monday, 1 -> Tuesday etc.\n", "day_number = datetime.now().weekday()\n", "\n", "'''New code: my own work\n", " Following the example in the question for E2.2B\n", "'''\n", "\n", "my_diary = ['spend the day doing Python',\\\n", " 'do some reading in the library at UCL', \\\n", " 'remember to wake up early to get to the Python class at UCL',\\\n", " 'spend the day doing Python',\\\n", " 'remember to wake up early to go to classes at Imperial College',\\\n", " 'work at Python exercises from home',\\\n", " 'work at Python exercises from home']\n", "\n", "\n", "print \"Today is\",week[day_number],'so',my_diary[day_number]\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is a bit better, but it's still too easy to get the entries in the list wrong, or get confused that Monday is day 0, so we would typically use a dictionary (`dict`) for something of this nature." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Today is Tuesday so do some reading in the library at UCL\n" ] } ], "source": [ "'''\n", " Exercise 2.2B Scientific Computing\n", " \n", " Mon 7 Oct 2013 10:43:38 BST\n", " \n", " P. Lewis : p.lewis@ucl.ac.uk\n", " \n", " This code prints a diary for today.\n", " \n", "'''\n", "\n", "'''The following code block is taken verbatim from \n", " The Scientific Computing notes\n", "'''\n", "# This imports a module that we can use to access dates\n", "from datetime import datetime\n", "\n", "# This part gives the day of the week\n", "# as an integer, 0 -> Monday, 1 -> Tuesday etc.\n", "day_number = datetime.now().weekday()\n", "\n", "'''New code: my own work\n", " Following the example in the question for E2.2B\n", "'''\n", "\n", "week = {0: 'Monday',\\\n", " 1: 'Tuesday',\\\n", " 2: 'Wednesday',\\\n", " 3: 'Thursday',\\\n", " 4: 'Friday',\\\n", " 5: 'Saturday',\\\n", " 6: 'Sunday'}\n", "\n", "\n", "my_diary = {'Monday': 'spend the day doing Python',\\\n", " 'Tuesday': 'do some reading in the library at UCL',\\\n", " 'Wednesday': 'remember to wake up early to get to the Python class at UCL',\\\n", " 'Thursday': 'spend the day doing Python',\\\n", " 'Friday': 'remember to wake up early to go to classes at Imperial College',\\\n", " 'Saturday': 'work at Python exercises from home',\\\n", " 'Sunday': 'work at Python exercises from home'}\n", "\n", "today = week[day_number]\n", "print \"Today is\",today,'so',my_diary[today]\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise 2.3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The data below are fields of:\n", "\n", "0 year \n", "1 month \n", "2 tmax (degC) \n", "3 tmin (degC) \n", "4 air frost (days) \n", "5 rain (mm) \n", "6 sun (hours) \n", "\n", "for Lowestoft in the UK for the year 2012, taken from [Met Office data](http://www.metoffice.gov.uk/climate/uk/stationdata/lowestoftdata.txt)." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 2012 1 8.7 3.1 5 33.1 53.9\n", " 2012 2 7.1 1.6 13 13.8 86.6\n", " 2012 3 11.3 3.7 2 64.2 141.3\n", " 2012 4 10.9 4.3 3 108.9 151.1\n", " 2012 5 15.1 8.6 0 46.6 171.3\n", " 2012 6 17.9 10.9 0 74.4 189.0\n", " 2012 7 20.3 12.8 0 93.6 206.9\n", " 2012 8 22.0 14.0 0 59.6 217.3\n", " 2012 9 18.9 9.5 0 38.8 200.8\n", " 2012 10 13.6 7.9 0 92.7 94.7\n", " 2012 11 10.5 4.4 2 62.1 79.6 \n", " 2012 12 7.9 2.4 8 95.6 41.9 \n" ] } ], "source": [ "data = \"\"\" 2012 1 8.7 3.1 5 33.1 53.9\n", " 2012 2 7.1 1.6 13 13.8 86.6\n", " 2012 3 11.3 3.7 2 64.2 141.3\n", " 2012 4 10.9 4.3 3 108.9 151.1\n", " 2012 5 15.1 8.6 0 46.6 171.3\n", " 2012 6 17.9 10.9 0 74.4 189.0\n", " 2012 7 20.3 12.8 0 93.6 206.9\n", " 2012 8 22.0 14.0 0 59.6 217.3\n", " 2012 9 18.9 9.5 0 38.8 200.8\n", " 2012 10 13.6 7.9 0 92.7 94.7\n", " 2012 11 10.5 4.4 2 62.1 79.6 \n", " 2012 12 7.9 2.4 8 95.6 41.9 \"\"\"\n", "\n", "print data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can use the Python package `pylab` to simply plot data on a graph:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# import the pylab module\n", "import pylab as plt\n", "%pylab inline\n", "\n", "\n", "# some e.g. x and y data\n", "x = range(100)\n", "y = [i**0.5 for i in x]\n", "\n", "plt.plot(x,y)\n", "plt.xlabel('x')\n", "plt.ylabel('y')\n", "plt.title('Plot of sqrt(x)') " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Produce a plot of the number of sunshine hours for Lowestoft for the year 2012** using the data given above.\n", "\n", "Hint: the data have newline chcracters `\\n` at the end of each line of data, and are separated by white space withion each line." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Answer 2.3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, we need to split the string `data` by newline (`\\n`) to give a list of lines:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[' 2012 1 8.7 3.1 5 33.1 53.9', ' 2012 2 7.1 1.6 13 13.8 86.6', ' 2012 3 11.3 3.7 2 64.2 141.3', ' 2012 4 10.9 4.3 3 108.9 151.1', ' 2012 5 15.1 8.6 0 46.6 171.3', ' 2012 6 17.9 10.9 0 74.4 189.0', ' 2012 7 20.3 12.8 0 93.6 206.9', ' 2012 8 22.0 14.0 0 59.6 217.3', ' 2012 9 18.9 9.5 0 38.8 200.8', ' 2012 10 13.6 7.9 0 92.7 94.7', ' 2012 11 10.5 4.4 2 62.1 79.6 ', ' 2012 12 7.9 2.4 8 95.6 41.9 ']\n" ] } ], "source": [ "ldata = data.split('\\n')\n", "\n", "print ldata" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we need to loop over each line and split by whitespace.\n", "\n", "This will involve something like:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['2012', '1', '8.7', '3.1', '5', '33.1', '53.9']\n" ] } ], "source": [ "# example using first line\n", "this_line = ldata[0]\n", "items = this_line.split()\n", "print items" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]\n", "[53.9, 86.6, 141.3, 151.1, 171.3, 189.0, 206.9, 217.3, 200.8, 94.7, 79.6, 41.9]\n" ] } ], "source": [ "ldata = data.split('\\n')\n", "\n", "# set empty lists to put the data in\n", "x = []\n", "y = []\n", "\n", "for this_line in ldata:\n", " items = this_line.split()\n", " # convert from string to float\n", " x.append(float(items[1])) # the month\n", " y.append(float(items[6])) # sunshine hrs\n", "\n", "print x\n", "print y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we just need to plot it:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAEZCAYAAAB8culNAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xm8lnP+x/HXW5slWgwhUVSIGOHUjO1oLI1lMmOsgywN\nIzKGscTgWIZkjGX8aiyVpZElRCFCR5YkKUuLClGpYytla/38/vhed91OZ7nPOfd9rnv5PB+P8+i+\nr/taPvfdOffn+u4yM5xzzrlkG8QdgHPOuezjycE559x6PDk455xbjycH55xz6/Hk4Jxzbj2eHJxz\nzq3Hk0MBkVQq6cxKXttO0jJJysB150r6TbrPW1eSfi9pXvS+94g7nmwhaaikbyS9GXcsLj6eHGIi\naT9Jb0haIulrSa9J2jvDl7XoZ/0XzD4zs00tMwNfKr1uzP4F9Ine97t1PVlVyTcukkokPViD/fcH\nDga2MbNutTi+WNK8Crav/WzKn1NSa0kzJd2Wwvk7SnpK0hfR380YSR3L7fM3SQslfStpsKTGSa+d\nJ+ltST9JGlruuG6Sxkbn/ULSo5K2SvW95xtPDjGQtBkwGrgdaAG0Bq4BlscZV66T1KAG+wrYDphe\ny2tV9LeTrUmwJrYH5prZT2k+b/Jns/YzkrQ9MB4YaWYXpHCeZsBIoCPQCngLeCrpfIcBlwLdCe9l\nB8LfVsIC4DpgSAXnbg78Nzpue2AZMLSC/QqDmflPPf8AewOLq3i9BHgw6XlbYA2wQfS8FLgWeA1Y\nCjwPbB69tiEwDPgKWEz449kiem1cFcelfI3o9W7AG9E1pgIHVvF+PgEuAt4FlgAPA02SXv8zMBv4\nmvCHvnVFMSXFdWb0+DTgdeDf0fu9FmgPvBJd50vg4QriaQJ8F537O2B2tH2X6PyLgQ+Ao5KOuQ8Y\nBDwbHdO9gvOOA86oYLuAfwBzgTLgfmCz6LX7gQujx62jmPpEz3cEvk46z5HRZ704et+dk167FJgf\n/V/NJHw59iDccKwgfNFNifbdBng6+rxnA72j7WcCPwKrov3frOj4an63i4F5VX02RL/f0fv7FCip\nw99Sy+gzaxE9fwi4Pun1g4CFFRx3HTC0mnN3AZbG/X0R14+XHOLxIbBa0n2SekhqUe71VO4+TyR8\nOW4JNAb+Hm3vBWwGbEv4wzkbSNwFCjipkuNSvoak1oSSz7Vm1iLa/rikX1RyHgHHAocB7YDdo/Mi\nqTtwQ/T61oQvi4eriKn83XkR8FEU4w2EP/oxZtac8GV7x3onMFtuZk2jp7ubWQdJjYBRwBhgC6Av\n8L9yVRYnAtdFx75eRYzlnU74fykm3Mk2Be6MXiuNtgMcCHwMHJD0fDyApD2BwYRE2hK4C3haUiNJ\nOwHnAnub2WbAoYS7/zHRZ/KwhaqzPaPzPgx8Rvi8/wjcIOkgMxsM/AWYEO3frZLj68qiz+EVYJCZ\nldThXAcQvvwXR887EW5CEt4DWlXwN5ZK29oBhJuEguTJIQZmtgzYj/BHcg/wRVSPumW0S3W/uEa4\n65ljofj/KPDL6LUVwOZABwumRNdLHDekkuNqco2TgWejLx/M7EXgbeDwKs51h5ktiv6IRyWd60/A\nYDObamYrgH7AryRtV81nkPC5mf2fma2J4lwBtJXU2sxWmNkbKZ6nG7CJmfU3s1VmNo6QAE9M2mek\nmU2I3nNNqgD/BNxiZnPN7HvCezwhqpoaD+wXVXPtDwwA9o2OO5DwBQpwFnCXmU2K/l8fINzV/4pw\np98E2FVSIwvtRx9Hx4mk3ydJbYBfA5dGn8+7wL3AqUn7J1MF2+pKwG7AxoTfq9qdRNqWkGQvTNrc\nFPg26fnS6N9Nyx1e5Q2YpN2BK4GLaxtfrvPkEBMzm2lmp5tZG8IfyjZAtQ1ySRYlPf6R8EcBobj+\nPPCwpAWSbpLUMIXjanKN7YFjJS1O/BC+0KpqvCt/rk2ix4nSAgDRl+fXhLv+VJRv/LyE8OXzlqQP\nJJ2e4nm2qeBcn0bbIXyZrNfQmqKfvUfCXXtDoJWZfQR8T0iW+xMS0udRieUA1iWH7YGLyn3m2xKq\n4D4CLiBU15RJGi5p6yre5zfR55wcT6qfd3VWAY0q2N4IWBk9NkK11lDg5RrcCKwlaQvgBeD/zOyR\npJe+I5ScE5pF/y7j5ypNeJLaE6oPzzezmpQQ84onhyxgZh8S6p53izZ9T7irSki5x0R013utme1K\nuEM8knV3henyGaFNpEXSz6ZmNqAW5/qc0LYAgKRNCCWfBYTPAar+LH52B2hmZWZ2lpm1JlSpDZS0\nQ4pxtCnXlXf7KI66+tl7JDSEryK0P0BIAMcCjczs8+j5aYTOClOjfT4D/lnuM2+a+GI0s+Fmtn8U\nswE3RceVv0P+HGgpKfmmYDtCe0VF1tTkjUZx/iL6fwTWNv5vz7oEqSjmiwjJ8GVJ25Q/UWWiKqIX\nCCW5G8u9PI2fl4b3AMqSqp0SKiw5RA3kYwlVpv9LNaZ85MkhBpJ2knRhVHefKOqfCEyIdpkKHCCp\njaRmhGqI9U5TybkPktQ56rmzjHC3trq64yoLtZLtw4CjJB0qqYGkDaMujDW5+0ycezhwuqQ9JDUh\n1HG/GVWNfEn4cj4lus4ZhEbMyk8qHRtVN0BolDZS+4J7E/gBuCSqxy8mJNZE+0eqn1uj6PNI/DSK\n3uPfJLWNvpQT9fiJuF4BziNqXyC0Q5wHvGpmiS+xe4C/SCpSsImkIyQ1jbp3do8+v+WENqbE//ki\nQjVb4gt5HqEjwY2SmkTVJ2cQ/k8rUpZ8PKztijquop3N7DNgInBTFGMTQtXMCsJnXH7/8wiN1S8l\nqlWrOn/U0+954DUzu7yCXR4AzpS0S5REriSpx1Hi95VQcmsQfQYNotdaAy8Dd5rZ3ZV8HgXDk0M8\nlgFdgYmSviMkhfcIPXows7HAI9G2SYQ6+vJ3OlbuceJ5K+AxQr3rdMIXzYMpHFf+tUr3NbP5QE/g\ncuALwt3iRaT++5R8rpcIf8CPE+5q2wEnJO37Z8KXy1eExsbXKzpPkr2BNyUtI/R8Ot/M5lYRB1Ec\nK4GjgN8SejndCZxiZrOquFZFBhGSTOJnMKHb5IOEL/+Po+19k44ZT6iySySH14GNkp5jZpMJn8Wd\nwDeEXkaJEmET4MYo7oXAL1h3Q/FY9O/Xkt6OHp9IKMl8DjwBXGVmL1fyPis6vg2hF1tljid0EJhD\nKJEcBBwRtSlVdI2zCL3qxkravJrz/57wf3y6wuDFZZKWJm4IzOx5QrvNOELvsI+Aq5OOv5Lw+V9K\naDv7Ebgieq034fevJPncVbzPvKZ1NyZpPnG4G36A8EtiwN1mdoekmwl3ZCsI/3Gnm9m30TH9CHcx\nqwl/1C9kJDjnXK1JmkLoylu+qiYnzu9Sk8nksBWwlZlNjYrSk4GjCY1oL5nZGkn9AczsMkmdCH2U\n9yE0jr0IdEwqejvnnKsnGatWirotTo0efwfMIAzJH5v0hT+RkCwgVFMMN7OVUTXAHEIfduecc/Ws\nXtocJLUF9iQkg2RnELqMQehil9xjYj7p617nnHOuBjKeHKIqpRHAX6MSRGL7FcAKM3uoisNzfZ4a\n55zLSQ2r36X2om58jwPDzGxk0vbTCKNpk6dxXkDopZCwLRX0MZfkCcM552rBzFLuyp6xkkPUL3ow\nMN3Mbkva3oPQNbGn/Xzmx6cJUwo0ltQO6EDo3rYey4JJqTL1c/XVV8ceg783f3/+/vLvp6YyWXLY\nl9CP+L2oaxqEfvF3ECZxGxuNq5lgZn3MbLqkRwl981cRZqb0UoJzMVu5Eh59FGbNqn5flz8ylhzM\n7DUqLpl0qOKYGwijR51zMVu2DO69F269FXbcEaZOhb/8JTzfaKO4o3OZ5iOks0xxcXHcIWRMPr83\nyJ/3V1YG//gHtGsHb7wBjz8O48bBsGHFfPstFBXBtGlxR5l++fL/ly4ZGwSXKZK8tsm5DJgzB265\nBR5+GE44AS66CNq3//k+ZjB0KFx6Kdx4I5x5JqR/1XGXCZKwGjRIe3JwrsBNmgQDBoTSwV/+An37\nQqtWVR8zYwYcfzzssgvcfTc0a1b1/i5+NU0OXq3kXAEygzFjoHt3OOYY2Hdf+OQTuP766hMDhKQw\ncSL84hew557hscsvXnJwroAkeh4NGABr1sAll4QqpEYVLc+ToieeCCWOiy8OVVEb+C1nVvJqJefc\ner7/HgYPhn//G9q2DUnht79NX3vBp5/CSSfBppvC/fenVvpw9curlZxza335JVx1VUgI48fDI49A\naSkcfnh6G5K33x5eeQX23hu6dIEXX0zfuV08PDk4l4c+/hjOPRc6dgxdU19/HUaMgK5dM3fNhg1D\nm8UDD0CvXtCvX6jGcrnJk4NzeWTy5NCGUFQUehDNmAF33RWSRH35zW9gypQwaO6AA2Du3Pq7tksf\nTw7O5TgzGDsWDj4YevaEffYJPY9uuAG22iqemLbcEp55Bv74x5CoRoyIJw5Xe94g7VyOWrUqfOkO\nGADLl4dG5hNPhMaN447s5yZNCqWZQw7xqTfi5A3SzhWAp5+GDh1g4EC49lp4//1Qz59tiQFCSWbK\nFPJ66o185CUH53LImjVQUhKmsHjwQcil6YB86o14+TgH5/LUkiVw8smwdCk89ljujiXwqTfi4dVK\nzuWhadNC9cwOO8BLL+VuYgCfeiNXeHJwLsuNGBGqj668Eu64o25TXWSLjTaC//s/+Ne/4Kij4Oab\nQ5WZyx6ZXCa0jaRxkqZJ+kDS+dH2lpLGSpol6QVJzZOO6SdptqSZkg7NVGzO5YLVq8NAsr//PUyS\nd+qpcUeUfn/4Q+jNNHJkGLVdVhZ3RC4hkyWHlcDfzGxXoBtwrqRdgMuAsWbWEXgpeo6kTsDxQCeg\nBzBQkpdsXEH65pvwZTlxYvjy3GuvuCPKHJ96Iztl7MvXzBaZ2dTo8XfADKA18Dvg/mi3+4Gjo8c9\ngeFmttLM5gJzgKJMxedctnr33fBF2bkzvPACbLFF3BFlXvmpNy6/3KfeiFu93JlLagvsCUwEWplZ\novBYBiSa1rYB5icdNp+QTJwrGA89FEY6//OfoT6+YcZWec9Oiak3xo8PbRIuPhn/1ZPUFHgc+KuZ\nLVNSx2YzM0lV9Uut8LWSkpK1j4uLi33tV5fzVq0K/f9HjgzVKnvsEXdE8dlySzjnnPBZXHBB3NHk\nrtLSUkpLS2t9fEbHOUhqBIwGnjOz26JtM4FiM1skaWtgnJntLOkyADPrH+03BrjazCaWO6ePc3B5\n5csvw/QSDRvC8OHQsmXcEcVv9uxQgvr007gjyR9ZM85BoYgwGJieSAyRp4Fe0eNewMik7SdIaiyp\nHdABeCtT8TmXDSZPDuMXiorg2Wc9MSS0bw/LlsGiRXFHUrgy2eawL3AycJCkKdFPD6A/cIikWUD3\n6DlmNh14FJgOPAf08SKCy2f33w89eoS2hRtvhAYN4o4oe0ghYU6aFHckhcunz3Cunq1cCRdeCM8/\nD08+CbvuGndE2emqq8LAuOuvjzuS/JA11UrOufWVlYUeOZ98Am+95YmhKkVF4TNy8fDk4Fw9mTgx\njF846KAw5Xbz5tUfU8gS1Uo+rUY8PDk4Vw/uvTfMIXTnnXDNNbCB/+VVa8stQwKdPTvuSApTgQ2x\nca5+LV8O558fBnWNHw877xx3RLklUbW0005xR1J4/P7FuQz5/PMwm+oXX4QqJU8MNeftDvHx5OBc\nBrz+ehi/cOSR8PjjsNlmcUeUm7p29eQQF+/K6lwamcGgQWEpz/vuCzOrutr7/vvQ9vDNN9CkSdzR\n5LaadmX1Ngfn0uSnn6BPn9DD5o03wihfVzebbAIdOoSZaot8juZ65dVKzqXBvHmw//7w3XcwYYIn\nhnTyqqV4eHJwro5efjnc1R57LDzyCDRtGndE+aWoyNeZjoMnB+dqySysffynP8GwYXDJJWFOIJde\n3mMpHt7m4FwtLFsGZ5wBc+eGu9rttos7ovzVqVPoFrx4MbRoEXc0hcNLDs7V0Icfhnrw5s3h1Vc9\nMWRagwZhDW2fobV+eXJwrgaefBL22w/+9je45x7YcMO4IyoMXrVU/7xaybkUrF4NV14J//sfPPOM\nd6usb0VF8MADcUdRWHwQnHPV+OorOOmksM7zww+HQVmufs2bF0acL1zojf61lVXrOUgaIqlM0vtJ\n24okvRWtDDdJ0j5Jr/WTNFvSTEmHZjI251LxzjvhS+mXv4QXXvDEEJdttw1J4bPP4o6kcGS6zWEo\n0KPctgHAlWa2J3BV9BxJnYDjgU7RMQMleZuIi83QoXDYYTBgQPhp6JWwsUksG+rtDvUno1++ZvYq\nsLjc5oVAs+hxc2BB9LgnMNzMVprZXGAO4DW7rt4tXw7nnAP9+8Mrr4TBbS5+nhzqVxx35pcBt0j6\nDLgZ6Bdt3waYn7TffKB1PcfmCtyCBWGa7UWLQtfJTp3ijsgldO3qI6XrUxwF5cHA+Wb2pKRjgSHA\nIZXsW2HLc0lJydrHxcXFFBcXpzlEV4heeQVOPBH69oVLL/XV2rLN3nuHNqBVq7yKLxWlpaWUlpbW\n+viM91aS1BYYZWado+dLzWyz6LGAJWbWTNJlAGbWP3ptDHC1mU0sdz7vreTSygxuuw1uuil0lzzU\nu0JkrZ13hkcfhd13jzuS3JNVvZUqMUfSgdHj7sCs6PHTwAmSGktqB3QAvIbRZdR334XSwrBh8Oab\nnhiync/QWn8y3ZV1OPAGsJOkeZJOB84CBkiaClwfPcfMpgOPAtOB54A+XkRwmTR7NnTrBhttBK+9\nBm3bxh2Rq47P0Fp/fBCcK0ijRsGZZ8K118LZZ/vAqlwxaRL07h0W/3E1U9NqJU8OrqCsXr1uCc/H\nHgslB5c7li+Hli3hiy/CKnEudb5MqHOV+OabsPbCjz/C229Dq1ZxR+RqqkkT6NwZJk+GAw6IO5r8\n5p31XEGYOjV0hezUCcaO9cSQy3wwXP3w5ODy3oMPwiGHwA03wC23QKNGcUfk6sKTQ/3wNgeXt1as\ngIsugjFjwjoMu+0Wd0QuHWbPDsl+7ty4I8kt3ubgHFBWBsccExovJ00Kq7a5/NC+PSxdGv6PvXow\nc7xayeWdjz6CffeFgw6CkSM9MeQbKUyj7lVLmeXJweWVyZNh//3h4ovhuut8fqR85e0Omed/Oi5v\nvPAC/Pa3MHBgGNjm8pfP0Jp53iDt8sKwYaHx+fHHYb/94o7GZVpZWZiE7+uvvXSYqlyYeM+5tDGD\nm2+GK66AceM8MRSKVq2gWTOYMyfuSPKX91ZyOWvNmlBaePFFeP31sM6wKxyJqqWOHeOOJD95ycHl\npOXL4aSTQgP0+PGeGAqRN0pnlicHl3OWLoXDD4eVK0MjdIsWcUfk4uDJIbM8ObicsnBhmHAtsSLY\nhhvGHZGLS5cu8MEHoRTp0s+Tg8sZH34Iv/41HHss3HknNGgQd0QuTptsAh06+NoOmZLpleCGSCqT\n9H657X0lzZD0gaSbkrb3kzRb0kxJvmCjW2viRDjwQLjqqtAzyRfnceBVS5mU6d5KQ4H/AA8kNkg6\nCPgdsLuZrZS0RbS9E3A80AloDbwoqaOZrclwjC7LPfMMnHZaWKDniCPijsZlk6Ki0CHBpV9GSw5m\n9iqwuNzmc4AbzWxltM+X0faewHAzW2lmc4E5QFEm43PZb8iQsJzn6NGeGNz6fKR05sTR5tABOEDS\nm5JKJe0dbd8GmJ+033xCCcIVIDP45z/D/EivvBK+BJwrr1Mn+PxzWFz+FtTVWbXVSpKOA8aY2VJJ\nVwJdgOvM7J06XLOFmXWTtA/wKLBDJftWOE9GSUnJ2sfFxcUUFxfXMhSXjVavhvPPDwPb3ngDtt46\n7ohctmrQIPRaevvtsMaDW6e0tJTS0tJaH1/t3EqS3jezzpL2A64H/gVcaWYp3ctJaguMMrPO0fPn\ngP5m9kr0fA7QDegNYGb9o+1jgKvNbGK58/ncSnnsp5/COs9LloQFejbbLO6IXLa7+OIwLfsVV8Qd\nSXbLxNxKq6N/jwTuMbPRQOPaBBcZCXQHkNQRaGxmXwFPAydIaiypHaH6yfshFJDFi+Gww6BxY3j2\nWU8MLjXe7pAZqSSHBZLuJvQkekbShikeh6ThwBtAR0nzJJ0ODAF2iLq3DgdOBTCz6YQqpunAc0Af\nLyIUjvnzwzoMXbrA//4HTZrEHZHLFYnurP5tkV6pVCttDPwWeM/MZkvaGuhsZi/UR4AVxOM5I89M\nnx7WYejbN0yk52MYXE2YhXapt96C7baLO5rsldY1pCU1BN4xs50T28xsIbCw9iE6t87rr8Mf/gC3\n3AInnxx3NC4XSeuqljw5pE+V1UNmtgr4UNL29RSPKyAjR8Lvfw8PPuiJwdWNj5ROv1RGSLcEpkl6\nC/g+2mZm9rvMheXy3V13wTXXwHPPwV57xR2Ny3VFRXD99XFHkV9SaXMormi7mZVmIJ5qeZtDbjOD\nkpLQ6Pz887DjjnFH5PLBkiXQpk3o8dbQlzCrUFrbHCC+JODyz6pVcM45MGVKGNy25ZZxR+TyRfPm\n0Lp16Nyw++5xR5Mfqu2SKuk7Scuin+WS1khaWh/Bufwxd25oX5g3D0pLPTG49PN2h/SqNjmYWVMz\n29TMNgU2Av4ADMx4ZC7nmcGrr8Ixx4R2hd12g1GjoGnTuCNz+ciTQ3rVaOI9M1tjZiOBHhmKx+WB\n5cvhgQdCQjjzTOjeHT79FG68ERo1ijs6l698pHR6pTLx3jFJTzcA9gJ+zFhELmeVlcF//wuDBoV6\n3+uvhx49YANfb9DVg913h9mz4fvvwypxrm5Sadc/inWzo64C5hLWXnAOCA3Mt98OTz0Fxx0HL70E\nu+4ad1Su0DRpAp07wzvvhKlYXN2k0lvptHqIw+WY1atDMrj9dvj4Yzj33DDKefPN447MFbJE1ZIn\nh7pLpVqpDXAHsF+0aTzwVzObX/lRLl8tWQKDB8Odd4b5bP761zD9hbcluGxQVARPPx13FPkhldrg\noYTptLeJfkZF21wBmTUrTIy3ww6h2P7II2GswvHHe2Jw2cN7LKVPKslhCzMbGq3tvNLM7gO8l3oB\nMIOxY8PazfvtB82awfvvh9HNRb66t8tC7dvDt9+GzhGublJpkP5a0inAQ4CAE4CvMhqVi9UPP8Cw\nYaE9YYMN4IILYMQI2GijuCNzrmobbLCu9HDUUXFHk9tSKTmcARwHLCJM1X0scHoqJ5c0RFJZtLBP\n+dcuikZbt0za1k/SbEkzJR2a2ltw6TJ/PvTrB9tvD6NHw3/+A++9F8YqeGJwucKrltIjlRHSc83s\nKDPbIvrpaWafpXj+oVQwYC5q5D4E+DRpWyfCanOdomMGSvIe8vXgzTfhhBNCP/EffoAJE0KjXvfu\nvvCOyz2eHNIjld5KWwJ/Btom7W9mdkZ1x5rZq5LaVvDSv4FLgKeStvUEhpvZSmCupDlAEfBmdddx\ntfPEE3DTTfDVV6Gx+a67QruCc7kskRzWrPEBmHWRSpvDU4Tuq2OBNdG2Ws+ZLaknMN/M3tPPb0u3\n4eeJYD7QurbXcVX78EM4+2y491448kho0CDuiJxLj1atwk3OnDnQsWPc0eSuVJLDRmZ2aTouFq1H\nfTmhSmnt5ioO8YUbMuS//4XevaGnj3V3eShRevDkUHupJIfRko4ws2fScL0dCdVT70alhm2ByZK6\nAguANkn7bhttW09JScnax8XFxRQXF6chtMLxww9hYrzJk+OOxLnMSCSHQl5+trS0lNLS0lofX+lK\ncJK+Y92d+ybACmBl9NzMbLOULhDaHEaZWecKXvsE2MvMvokapB8itDO0Bl4E2pdf9s1Xgqu7IUNC\ne8Po0XFH4lxmvPoq/P3vPktrspquBFdpc03yOg5mtoGZbZj0PNXEMBx4A+goaZ6k8l1g137Lm9l0\n4FFgOvAc0MezQGYMGhRWZHMuX3XpEgZsLl8edyS5q9o1pLONlxzqZtKkMHPqnDneCO3y2x57hA4X\n++wTdyTZIW0lB5efBg0KvZQ8Mbh854v/1E0qDdIuTyxeHNoaZs2KOxLnMq+oCMaPjzuK3JVSyUHS\n/on2AklbSGqX2bBcJtx/f5hEb0ufNtEVAB8pXTfVtjlIKiEsDbqTmXWU1Bp41Mz2rYf4KorH2xxq\nwQx23jmsxbDfftXv71yuW7UKWrSAzz4L/xa6TLQ5/J4wtcX3AGa2ANi0duG5uLz8MjRuDPvGktKd\nq38NG4ZeS2+/HXckuSmV5LDczBLTZiDJl+7OQYMGQZ8+PpGeKyxetVR7qSSHxyTdBTSXdBbwEnBv\nZsNy6fT556HkUMijRV1h8uRQeymNc4jWVkisr/C8mY3NaFRVx+JtDjV0zTWwaFEoPThXSD77LCSI\nhQu91FzTNgcfBJfnVq2Ctm3h2WfDeg3OFRIz2HrrUHrYbru4o4lX2hukJR0Trc62VNKy6Gdp3cJ0\n9WXUqJAcPDG4QiR51VJtpdLmMAD4nZltVtO5lVz8Bg70eZRcYSsq8pHStZFKclhkZjMyHolLu9mz\n4d134Y9/jDsS5+LTtauXHGojlUFwtwNbASMJ03ZDmLL7iQzHVlk83uaQoosugkaNoH//uCNxLj6L\nF4f2hsWLw9iHQlXTNodUPqpmwI+s662UEEtycKn58ccwXcakSXFH4ly8WrSAbbaBGTOg83qryrjK\nVJsczOy0eojDpdkjj4S61nY+C5Zza2do9eSQukqTg6RLzewmSf+p4GUzs/MzGJero0GD4Mor447C\nueyQ6LHUu3fckeSOqhqkp0f/Tq7kp1qShkgqk/R+0rabJc2Q9K6kJyQ1S3qtX9RtdmY08M7VwuTJ\nUFYGv/1t3JE4lx28O2vNZXQQnKT9ge+ABxJrSEs6BHjJzNZI6g9gZpclrSG9D+vWkO6YPK9TdLw3\nSFejd2/YYQe4/PK4I3EuOyxfDi1bwhdfwCYFOjtc2hukJe0E/B1om7S/mVn36o41s1cltS23LXnq\njYnAMdHjnsBwM1sJzJU0BygC3qzuOm6dJUvg8cdh5sy4I3EuezRpArvtBu+8A/vvH3c0uSGV3kqP\nAYMIk+0qLperAAAWmklEQVStjral69b9DGB49Hgbfp4I5hNKEK4GHngAevSAVq3ijsS57JKoWvLk\nkJpUksNKM0v7lG2SrgBWmNlDVezm9Uc1YBYaou+6K+5InMs+RUUwenTcUeSOqnortQQEjJJ0LmFc\nw/LE62b2TW0vKuk04HDgN0mbFwBtkp5vG21bT0lJydrHxcXFFBcX1zaUvFJaCg0a+J2RcxXp2rWw\nevCVlpZSWlpa6+MrbZCWNJcq7tzNLKUe9FGbw6ikBukewC3AgWb2VdJ+iQbpItY1SLcv3/rsDdKV\nO+44OPBAOPfcuCNxLvusWQObbx7a4wqx2jVtDdJm1jYNwQwHDgR+IWkecDXQD2gMjFWYYH2CmfUx\ns+mSHiV0oV0F9PEskLqFC2HsWLjXl2FyrkIbbAD77BNmDTjyyLijyX6pzK10LGGBn6WSrgT2BK43\ns3fqI8AK4vGcUYHrroP58729wbmq/OMfYRrv666LO5L6l/b1HICrosSwH6GNYAjw39oG6NJv1Sq4\n+26fmtu56vgMralLJTkkuq8eCdxjZqOBRpkLydXUM89Amzbwy1/GHYlz2S1RreSVD9VLJTkskHQ3\ncDzwjKQNUzzO1RNf0Me51Gy1FWy6aVjrxFUtlS/544DngUPNbAnQArg4o1G5lM2ZA1OmwLHHxh2J\nc7nBq5ZSU21yMLPvgaeA7yVtR6hS8skZssRdd8Fpp8GGG8YdiXO5wSfhS00qcyv1JXRB/YJ17Q8A\nPjN6zH78Ee67D9702aecS1lREYwYEXcU2S+V6TMuAHYys68zHYyrmcceg733hh13jDsS53JHly7w\n/vthptYmTeKOJnul0ubwGbA004G4mhs0yBuinauppk2hfXt47724I8luqZQcPgHGSXoGWBFtMzP7\nd+bCctWZMgUWLIAjjog7EudyT6LdYZ994o4ke6VacniRMOVFU2DT6MfFaNAgOOusMNGec65miorC\nmtKuchldCS4TfPoM+PZbaNsWZswI/badczXz3nthospCWhQrEyvBjatgc0orwbnMePBBOPRQTwzO\n1VanTmEusiVLoHnzuKPJTqm0OSQPeNuQsKznqsyE46pjFkZEDxwYdyTO5a6GDUOvpbffhoMPjjua\n7FRtcjCzt8ttek3SpAzF46oxfnz498AD443DuVyXaHfw5FCxVKqVWiY93QDYG9gsYxG5KiW6ryrl\nmkPnXEW6doVhw+KOInulsp7DXNatCLcKmAtcY2avZTSyyuMp2AbpRYtgl11g7lxo1izuaJzLbZ9+\nGhLEwoWFcbOV9vUczKytmbWLfjqY2SGpJgZJQySVSXo/aVtLSWMlzZL0gqTmSa/1kzRb0kxJh6b6\nJgrF4MFhgj1PDM7V3XbbhTa8efPijiQ7VZocJBVJ2jrpeS9JT0u6o1xVU1WGAj3KbbsMGGtmHYGX\noueJNaSPBzpFxwyU5FODR1av9gV9nEsnyWdorUpVX753AcsBJB0A9AfuJ0ylcXcqJzezV4HF5Tb/\nLjoP0b9HR497AsPNbKWZzQXmAEWpXKcQPPssbL017Lln3JE4lz98htbKVZUcNjCzb6LHxwN3mdnj\nZvYPoEMdrtnKzMqix2VAq+jxNsD8pP3mA63rcJ284gv6OJd+nhwqV1VvpQaSGpnZSuBg4KwUj0uZ\nmZmkqlqXK3ytpKRk7ePi4mKKi4vTEU7W+vjj0B/7iSfijsS5/LLPPjB5cqi2zbepaEpLSyktLa31\n8ZX2VpJ0BXAE8BXQBtjLzNZI6gDcZ2b7pnQBqS0wysw6R89nAsVmtihq0xhnZjtLugzAzPpH+40B\nrjazieXOV3C9lS69NPzy/utfcUfiXP7ZaaewvkPnPF+hJm29lczsn8BFhEbl/cxsTeIaQN86xPg0\n0Ct63AsYmbT9BEmNJbUjVF0VfIHvp59g6FA4++y4I3EuP3nVUsWq7A1kZhPM7MloqdDEtllm9k4q\nJ5c0HHgD2EnSPEmnExq2D5E0C+gePcfMpgOPAtOB54A+BVdEqMCIEaERukNdWnmcc5XyGVor5rOy\nZrl994WLL4ajj65+X+dczb31Vpj+furUuCPJrJpWK3lyyGLvvgtHHgmffBImCnPOpd/y5dCiBXz5\nJWyySdzRZE7aR0i7+CQW9PHE4FzmNGkCu+0GL74YdyTZxUsOWWrp0rCgz7RpYfCbcy5zRo+GM84I\nHT+uvBIaN447ovTzkkOeGDYMfvMbTwzO1YcjjwxtDlOnhrEPU6bEHVH8PDlkocSCPn36xB2Jc4Vj\nm23g6afhoovgsMPgmmtg5cq4o4qPJ4cs9NprYdBbng/8di7rSHDqqaHkMHFimJjvvffijioenhyy\n0KBB8Je/FMYc885lo9at4Zln4LzzQvXuP/8JqwpscWRvkM4yX3wRhvN/8okvfO5cNpg3D3r3hq+/\nhvvuCz2bcpE3SOe4wYPhmGM8MTiXLdq0gTFjQk+mgw6C/v0LoxThJYcssno17LgjPP447LVX3NE4\n58r79FM480xYtiyUInbZJe6IUuclhxw2ZgxsuaUnBuey1fbbw9ixcPrpcMABcPPN4aYuH3nJIYsc\nfjgcdxycdlrckTjnqvPJJ2Hg3PLlYebknXaKO6KqeckhRz3xBMyeDccfH3ckzrlUtGsHL70EJ50U\nJsi89db8KkV4ySELlJXBHnvAk0/Cr34VdzTOuZqaMydUNUEoRbRvH288FfGSQ44xgz//OTRyeWJw\nLje1bw+vvBJ6GnbrBv/5D6xZU/1x2cxLDjEbOhRuvz3MKZ+Pk305V2hmzQqliEaNYMgQ2GGHuCMK\ncqLkIKmfpGmS3pf0kKQmklpKGitplqQXJOV9T/+5c+GSS+DBBz0xOJcvOnaE8ePhqKPCKnMDB+Zm\nKaLeSw6S2gIvA7uY2XJJjwDPArsCX5nZAEmXAi3M7LIKjs+LksOaNdC9OxxxRFjpzTmXf2bODL0P\nN9kkDHBt2za+WHKh5LAUWAlsLKkhsDHwOfA74P5on/uBvF4Y87bbQoK48MK4I3HOZcrOO4eJNA87\nLEwFftddoZ0xF8TS5iDpLOAW4EfgeTM7RdJiM2sRvS7gm8TzcsfmfMlh2rQw4+rEidlTH+mcy6zp\n06FXr7Ak6b33wnbb1e/1a1pyqPcFKCXtCFwAtAW+BR6TdHLyPmZmkirNACUlJWsfFxcXU5xDc1uv\nWAGnnAI33uiJwblC0qkTTJgAAwaEWRCefx66dMnc9UpLSyktLa318XG0ORwPHGJmvaPnpwDdgO7A\nQWa2SNLWwDgz27mC43O65HDVVfDOOzBqlE/J7VyhGjIE7r4b3ngDNqinyv1caHOYCXSTtFFUfXQw\nMB0YBfSK9ukFjIwhtoyaODH8Qtx7rycG5wpZYoqc++6LM4qqxdXmcAkhAawB3gF6A5sCjwLbAXOB\n48xsSQXH5mTJ4YcfYM89w6Ihf/xj3NE45+I2eXLorThjRmiHyLSalhx8EFw96dsXFi+GYcPijsQ5\nly3OOQcaNIA778z8tTw5ZKGxY8P0GO+954v4OOfW+eabsCbE88/DL3+Z2WvlQptDQVm8OCSGwYM9\nMTjnfq5lS7juOjj33OwbRe3JIcPOPx969oRDDok7EudcNjrzzNDFPduqnL1aKYNGjIArroApU2Dj\njeOOxjmXrd56C44+OjRON2uWmWt4m0OWWLQo1CE+9RR07Rp3NM65bPfnP4c5mG67LTPn9+SQBczC\njIx77hnqE51zrjpffRVGUb/0EnTunP7ze4N0Fhg8GBYuhCuvjDsS51yu+MUvoKQEzjsvOybn8+SQ\nZh9/DP36wQMP+BoNzrmaOftsWLYMhg+POxKvVkqr1avhoINCw5JPxe2cq40JE8IsCjNmwGabpe+8\nXq0Uo1tvDZNoXXBB3JE453LVr34Fhx4K114bbxxeckiTDz4IpYZJk+Jd7ck5l/vKymC33eCVV0Ij\ndTp4ySEGiTUabrrJE4Nzru5atQodWvr2ja9x2pNDGlxzTVjV6fTT447EOZcv+vQJ3Vsfeyye63u1\nUh1NmAC//z28+27I9s45ly6vvgonnRQap5s2rdu5vFqpHn3/PZx6Kgwa5InBOZd+++8f1pu//vr6\nv7aXHOrg3HPhu+/g/vvjjsQ5l68WLgwjpl9/HXbaqfbnyZmSg6TmkkZImiFpuqSuklpKGitplqQX\nJGXtJNfPPw+jR8Ptt8cdiXMun229NVx+eZjhuT7vi+OsVrodeNbMdgF2J6wtfRkw1sw6Ai9Fz7PO\n4sXQu3dYJNzXaHDOZVrfvrBgATz5ZP1dM641pJsBU8xsh3LbZwIHmlmZpK2AUjPbudw+sVcrnXQS\nbLGFlxqcc/WntBR69QqN07VZAiBXqpXaAV9KGirpHUn3SNoEaGVmZdE+ZUDWNfM+8khYn6F//7gj\ncc4VkuJi+PWv4cYb6+d6DevnMhVetwtwnplNknQb5aqQzMwkVVhEKCkpWfu4uLiY4uLizEWa5PPP\nQ73f6NGw0Ub1cknnnFvr5pvDOjG9ekH79lXvW1paSmlpaa2vFVe10lbABDNrFz3fD+gH7AAcZGaL\nJG0NjMuWaiUzOOIIKCoK0+o651wcBgwI02qMHg1KuZIoR6qVzGwRME9Sx2jTwcA0YBTQK9rWCxgZ\nQ3gVuuce+OKLsOync87F5YILwtIAo0Zl9jqxjXOQtAdwL9AY+Ag4HWgAPApsB8wFjjOzJeWOq/eS\nw0cfQbduMH487LJLvV7aOefW8+KLcNZZMG1a6lXcvkxomq1eDQceGOZX96m4nXPZ4thjw8ytV1+d\n2v6eHNLsppvCgLcXXwxrNTjnXDb47DPo0iUsE9CuXfX7e3JIo/feg4MPhrffDrOuOudcNrnhBpg4\nEZ56qvp9c6JBOlf87W+h65gnBudcNrroojAo7tln039uLzlU4euvoWXLmnUXc865+jRmDJx3XliN\ncsMNK9/PSw5ptPnmnhicc9mtR48wa+stt6T3vF5ycM65HDd3Luy9N0yeDNtvX/E+XnJwzrkC07Zt\nmNrnwgvTd04vOTjnXB746SfYddewMuWhh67/upccnHOuAG24YVhGoG9fWLGi7ufz5OCcc3niyCOh\nY0e49da6n8urlZxzLo989BF07QpTp8K2267b7tVKzjlXwHbcEfr0CQPk6sJLDs45l2d++CE0Tg8e\nDN27h21ecnDOuQK38cah3aFvX1i5snbn8OTgnHN5qGfPMC/cHXfU7vg4F/tpALwNzDezoyS1BB4B\ntqeShX6i47xayTnnUjBrFvz612GG6datc6da6a/AdCDxTX8ZMNbMOgIvRc8LTl0WBM92+fzewN9f\nrsvH99exY1gx7uKLa35sLMlB0rbA4YRlQhOZ7HfA/dHj+4GjYwgtdvn4C5qQz+8N/P3lunx9f1dc\nEdakqam4Sg63AhcDa5K2tTKzsuhxGdCq3qNyzrk8s8kmYTrvmqr35CDpSOALM5vCulLDz0SNCt6w\n4JxzadCoUc2PqfcGaUk3AKcAq4ANgc2AJ4B9gGIzWyRpa2Ccme1cwfGeNJxzrhZyZg1pSQcCf496\nKw0AvjazmyRdBjQ3s4JslHbOubhlwziHRHbqDxwiaRbQPXrunHMuBjk3fYZzzrnMy4aSQ0ok9ZA0\nU9JsSZfGHU86SWojaZykaZI+kHR+3DFlgqQGkqZIGhV3LOkmqbmkEZJmSJouqVvcMaWTpH7R7+f7\nkh6S1CTumGpL0hBJZZLeT9rWUtJYSbMkvSCpeZwx1kUl7+/m6HfzXUlPSGpW3XlyIjlEo6nvBHoA\nnYATJe0Sb1RptRL4m5ntCnQDzs2z95dQfuBjPrkdeNbMdgF2B2bEHE/aSGoL/BnoYmadgQbACXHG\nVEdDCd8lyfJpEG5F7+8FYFcz2wOYBfSr7iQ5kRyAImCOmc01s5XAw0DPmGNKGzNbZGZTo8ffEb5Y\ntok3qvSqZOBjXojuwvY3syEAZrbKzL6NOax0Wkq4gdlYUkNgY2BBvCHVnpm9CiwutzlvBuFW9P7M\nbKyZJcaVTQS2Xe/AcnIlObQG5iU9nx9tyzvRXdqehP/AfFLRwMd80Q74UtJQSe9IukfSxnEHlS5m\n9g1wC/AZ8DmwxMxejDeqtCukQbhnAM9Wt1OuJId8rIZYj6SmwAjgr1EJIi+kMvAxxzUEugADzawL\n8D25XS3xM5J2BC4A2hJKtE0l/SnWoDIonwfhSroCWGFmD1W3b64khwVAm6TnbQilh7whqRHwODDM\nzEbGHU+a/Rr4naRPgOFAd0kPxBxTOs0nzC48KXo+gpAs8sXewBtm9rWZrSIMWv11zDGlW5mkrQCi\nQbhfxBxP2kk6jVC1m1Jiz5Xk8DbQQVJbSY2B44GnY44pbSQJGAxMN7Pb4o4n3czscjNrY2btCA2Z\nL5vZqXHHlS5mtgiYJ6ljtOlgYFqMIaXbTKCbpI2i39WDCR0L8snTQK/ocS8gr27QJPUgVOv2NLOf\nUjkmJ5JDdLdyHvA84ZfyETPLm94gwL7AycBBUVfPKdF/Zr7KxyJ7X+B/kt4l9Fa6IeZ40sbM3gUe\nINykvRdtvju+iOpG0nDgDWAnSfMknU4eDcKt4P2dAfwHaAqMjb5fBlZ7Hh8E55xzrrycKDk455yr\nX54cnHPOrceTg3POufV4cnDOObceTw7OOefW48nBOefcejw5OFeOpGaSzkl6XlyXacYl7SxpqqTJ\nknZI2r6RpGeiqZQ/kHRj0mtNJD0STVH/pqTtk14bI2lx+Zgk/S+a1v59SYOjSfKcqxVPDs6trwXQ\nJ43nOxp4zMz2MrOPy702IJrme09g36TBj2cSls3tQJi08KbkYwjrsJc3zMx2jqbV3gjoncb34AqM\nJweXs6LpVGZGs6F+GN05Hyrp9WjRln2i/VpKGhktdDJBUudoe0m0MMo4SR9J6huduj+wYzSSdABh\nRHdTSY9Fd/nDKonnl9FdfmJBleaSDiesY3GOpJeT9zezH83slejxSuAd1s02nDyF9OPAb5KOexlY\nb2JGM3su6ekkUpiW2bnKeHJwuW5H4F/AzsBOwPFmti/wd+DyaJ9rgMnRQieXE6aCSOgIHEpYM+Tq\naGGpS4GPzGxPM7uEMJPsnoQv+U7ADpL2rSCWB4CLo+u8D1xtZs8C/wX+bWbdK3sT0cpjRxEWmoGk\naeqj6WO+ldQylQ8kmsTxZOC56vZ1rjKeHFyu+8TMpkXTLE8DEusMfECYYhrC3FUPApjZOGBzSZsS\nSgTPmNlKM/uaMBNnKyqeVvwtM/s8us7UpHMDaxf8aRYttALhrv+AxMuVnDNxbEPCbLW3m9ncFN93\nVQYCr5jZ62k4lytQnhxcrlue9HgNsCLpcXKDbGVfziuSHq8ud0xl16lqv4quV90EZncDH5rZHUnb\nFgDbwdrk0SxadKfKc0q6GtjczC6s5prOVcmTgysErxLNYS+pGPjSzJZRecJYBmxakwtEy4IulrRf\ntOkUoDR6XFWp4XpgM+Bv5V5KnkL6j6yrblp7aAXn6k2oIjupJrE7VxHv6uZyXfk7aKvgcQkwJJpO\n+3vWfelWuOKXmX0dNWq/T1hO8dlqrpPQC/hvtEToR8DpVV0nWlf7csKa4e+EpRL4T7QW9WDgQUmz\nga8J62AkjnuV0L7SVNI84AwzGwsMAuYCE6JzPW5m11cQp3PV8im7nXPOrcerlZxzzq3Hk4Nzzrn1\neHJwzjm3Hk8Ozjnn1uPJwTnn3Ho8OTjnnFuPJwfnnHPr8eTgnHNuPf8PtXe9YkzdGvcAAAAASUVO\nRK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# import the pylab module\n", "import pylab as plt\n", "%pylab inline\n", "\n", "plt.plot(x,y)\n", "plt.xlabel('month of 2012')\n", "plt.ylabel('Sunshine hours')\n", "plt.title('Sunshine hours for Lowestoft, UK, 2012') " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We could make it a bit more compact and general, but if you do, make sure it is still easily readable." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pylab as plt\n", "%pylab inline\n", "items = [[float(i) \\\n", " for i in j.split()] \\\n", " for j in data.split('\\n')]\n", "\n", "# get specific columns from items \n", "x = [i[1] for i in items]\n", "y = [i[6] for i in items]\n", "\n", "# bigger graph if we want\n", "plt.figure(figsize=(14, 6))\n", "plt.plot(x,y)\n", "plt.xlabel('month of 2012')\n", "plt.ylabel('Sunshine hours')\n", "plt.title('Sunshine hours for Lowestoft, UK, 2012') " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You *might think* that labelling with the month name would be nicer. \n", "\n", "Thats quite a bit more complicated, but we'll put it in here anyway for future reference:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pylab as plt\n", "%pylab inline\n", "items = [[float(i) \\\n", " for i in j.split()] \\\n", " for j in data.split('\\n')]\n", "\n", "# get specific columns from items \n", "x = [int(i[1]) for i in items]\n", "y = [i[6] for i in items]\n", "\n", "months = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \\\n", " \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ]\n", "\n", "# need access to ax to mess with xticks\n", "fig, ax = plt.subplots(figsize=(14, 6))\n", "plt.plot(x,y)\n", "\n", "# lots of hassle to do this sort of thing ...\n", "# but it is possible\n", "#\n", "# first set the limits to be the\n", "# same as x\n", "plt.xlim(x[0],x[-1])\n", "# then set the xticks to the values of x\n", "# to make sure there are 12 of them\n", "ax.set_xticks(x)\n", "# then replace these by the months\n", "ax.set_xticklabels(months)\n", "\n", "plt.xlabel('month of 2012')\n", "plt.ylabel('Sunshine hours')\n", "plt.title('Sunshine hours for Lowestoft, UK, 2012') " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise 2.4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The text file [files/data/modis_files.txt](files/data/modis_files.txt) contains a listing of hdf format files that are in the directory `/data/geospatial_19/ucfajlg/fire/Angola/MOD09` on the UCL Geography system. The contents of the file looks like (first 10 lines):" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/data/geospatial_19/ucfajlg/fire/Angola/MOD09/MOD09GA.A2004001.h19v10.005.2008109063923.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MOD09/MOD09GA.A2004002.h19v10.005.2008108084250.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MOD09/MOD09GA.A2004003.h19v10.005.2008108054126.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MOD09/MOD09GA.A2004004.h19v10.005.2008108112322.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MOD09/MOD09GA.A2004005.h19v10.005.2008108173219.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MOD09/MOD09GA.A2004006.h19v10.005.2008108214033.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MOD09/MOD09GA.A2004007.h19v10.005.2008109081257.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MOD09/MOD09GA.A2004008.h19v10.005.2008109111447.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MOD09/MOD09GA.A2004009.h19v10.005.2008109211421.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MOD09/MOD09GA.A2004010.h19v10.005.2008110031925.hdf\r\n" ] } ], "source": [ "!head -10 < files/data/modis_files.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Your task is to create a new file `files/data/some_modis_files.txt` that contains *only* the file names for the month of August.\n", "\n", "You will notice that the file names have a field in them such as `A2004006`. This is the one you will need to concentrate on, as it specifies the year (`2004` here) and the day of year (`doy`), (`006` in this example).\n", "\n", "There are various ways to find the day of year for a particular month / year, e,g, look on a [website](http://www.soils.wisc.edu/cgi-bin/asig/doyCal.rb)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Answer 2.4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First then, find out which day of year range you want.\n", "\n", "August 2004 was doy 214 to 244 inclusive, so in python:\n", "\n", "```python\n", " range(214,245)\n", "```\n", "\n", "We should know how to read data from files from the material above." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/data/geospatial_19/ucfajlg/fire/Angola/MOD09/MOD09GA.A2004001.h19v10.005.2008109063923.hdf\n", "\n" ] } ], "source": [ "# ls /data/geospatial_19/ucfajlg/fire/Angola/MOD09/*.hdf > /tmp/modis_files.txt\n", "fp = open('files/data/modis_files.txt','r')\n", "for line in fp.readlines():\n", " print line\n", " break # break in here just so it doesnt print too much \n", " # dont put that in your code !!!\n", "fp.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "we have the filename e.g. \n", "\n", "`/data/geospatial_19/ucfajlg/fire/Angola/MOD09/MOD09GA.A2004001.h19v10.005.2008109063923.hdf` \n", "\n", "in the variable `line`.\n", "\n", "Now we want to split this to find the filename, which will be the last element (-1):" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['', 'data', 'geospatial_19', 'ucfajlg', 'fire', 'Angola', 'MOD09', 'MOD09GA.A2004001.h19v10.005.2008109063923.hdf\\n']\n" ] } ], "source": [ "# split the string on '/', the file separator\n", "aline = line.split('/')\n", "print aline" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "MOD09GA.A2004001.h19v10.005.2008109063923.hdf\n", "\n" ] } ], "source": [ "# and all we want is the last item:\n", "\n", "fname = line.split('/')[-1]\n", "print fname" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we need to split this up, with `.` (dot) as the separator, and get the second item: " ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['MOD09GA', 'A2004001', 'h19v10', '005', '2008109063923', 'hdf\\n']\n", "A2004001\n" ] } ], "source": [ "fname = line.split('/')[-1]\n", "fbits = fname.split('.')\n", "print fbits\n", "\n", "datebit = fbits[1]\n", "print datebit" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The day of year is the last 3 elements of this string:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "doy = int(datebit[-3:])\n", "\n", "print doy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And check to see if doy is in the required range:\n", "\n", "Putting this together:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/data/geospatial_19/ucfajlg/fire/Angola/MOD09/MOD09GA.A2004214.h19v10.005.2010052095834.hdf\n", "\n" ] } ], "source": [ "date_range = range(214,245)\n", "\n", "# ls /data/geospatial_19/ucfajlg/fire/Angola/MOD09/*.hdf > /tmp/modis_files.txt\n", "fp = open('files/data/modis_files.txt','r')\n", "for line in fp.readlines():\n", " fname = line.split('/')[-1]\n", " fbits = fname.split('.')\n", " datebit = fbits[1]\n", " doy = int(datebit[-3:])\n", " if doy in date_range:\n", " print line\n", " break\n", "fp.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now put in the part that writes it to a file:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ifile = 'files/data/modis_files.txt'\n", "ofile = 'files/data/some_modis_files.txt'\n", "\n", "ifp = open(ifile,'r')\n", "ofp = open(ofile,'w')\n", "for line in ifp.readlines():\n", " fname = line.split('/')[-1]\n", " fbits = fname.split('.')\n", " datebit = fbits[1]\n", " doy = int(datebit[-3:])\n", " if doy in date_range:\n", " ofp.write(line)\n", "ifp.close()\n", "ofp.close()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# or in a more compressed form\n", "\n", "ifile = 'files/data/modis_files.txt'\n", "ofile = 'files/data/some_modis_files.txt'\n", "\n", "ifp = open(ifile,'r')\n", "ofp = open(ofile,'w')\n", "for line in ifp.readlines():\n", " doy = int(line.split('/')[-1].split('.')[1][-3:])\n", " if doy in date_range:\n", " ofp.write(line)\n", "ifp.close()\n", "ofp.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "check from unix:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/data/geospatial_19/ucfajlg/fire/Angola/MOD09/MOD09GA.A2004214.h19v10.005.2010052095834.hdf\r\n" ] } ], "source": [ "!head -1 < files/data/some_modis_files.txt" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/data/geospatial_19/ucfajlg/fire/Angola/MOD09/MOD09GA.A2004244.h19v10.005.2008256095130.hdf\r\n" ] } ], "source": [ "!tail -1 < files/data/some_modis_files.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise 2.5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "We want to calculate the **maximum** monthly precipitation for regions of the UK for all years in the 20th Century. " ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "In South East England\n", "In the year 1900 the rainiest month was Feb with 125.9 mm\n", "In the year 1901 the rainiest month was Dec with 98.7 mm\n", "In the year 1902 the rainiest month was Aug with 97.2 mm\n", "In the year 1903 the rainiest month was Oct with 188.4 mm\n", "In the year 1904 the rainiest month was Jan with 96.0 mm\n", "In the year 1905 the rainiest month was Jun with 104.5 mm\n", "In the year 1906 the rainiest month was Jan with 127.3 mm\n", "In the year 1907 the rainiest month was Oct with 129.5 mm\n", "In the year 1908 the rainiest month was Aug with 83.8 mm\n", "In the year 1909 the rainiest month was Oct with 143.9 mm\n", "In the year 1910 the rainiest month was Dec with 119.4 mm\n", "In the year 1911 the rainiest month was Dec with 153.6 mm\n", "In the year 1912 the rainiest month was Aug with 151.6 mm\n", "In the year 1913 the rainiest month was Oct with 106.5 mm\n", "In the year 1914 the rainiest month was Dec with 190.2 mm\n", "In the year 1915 the rainiest month was Dec with 163.9 mm\n", "In the year 1916 the rainiest month was Mar with 110.7 mm\n", "In the year 1917 the rainiest month was Aug with 135.1 mm\n", "In the year 1918 the rainiest month was Sep with 151.1 mm\n", "In the year 1919 the rainiest month was Dec with 121.4 mm\n", "In the year 1920 the rainiest month was Jul with 116.9 mm\n", "In the year 1921 the rainiest month was Jan with 70.8 mm\n", "In the year 1922 the rainiest month was Jul with 92.2 mm\n", "In the year 1923 the rainiest month was Oct with 142.5 mm\n", "In the year 1924 the rainiest month was Oct with 110.2 mm\n", "In the year 1925 the rainiest month was Jul with 98.1 mm\n", "In the year 1926 the rainiest month was Nov with 143.8 mm\n", "In the year 1927 the rainiest month was Sep with 138.5 mm\n", "In the year 1928 the rainiest month was Oct with 137.0 mm\n", "In the year 1929 the rainiest month was Nov with 175.6 mm\n", "In the year 1930 the rainiest month was Nov with 121.0 mm\n", "In the year 1931 the rainiest month was Aug with 101.3 mm\n", "In the year 1932 the rainiest month was Oct with 146.4 mm\n", "In the year 1933 the rainiest month was Mar with 74.1 mm\n", "In the year 1934 the rainiest month was Dec with 176.3 mm\n", "In the year 1935 the rainiest month was Nov with 148.2 mm\n", "In the year 1936 the rainiest month was Jan with 112.8 mm\n", "In the year 1937 the rainiest month was Jan with 124.9 mm\n", "In the year 1938 the rainiest month was Nov with 93.6 mm\n", "In the year 1939 the rainiest month was Oct with 154.0 mm\n", "In the year 1940 the rainiest month was Nov with 203.0 mm\n", "In the year 1941 the rainiest month was Aug with 117.3 mm\n", "In the year 1942 the rainiest month was Oct with 94.3 mm\n", "In the year 1943 the rainiest month was Jan with 130.2 mm\n", "In the year 1944 the rainiest month was Nov with 117.0 mm\n", "In the year 1945 the rainiest month was Jul with 103.8 mm\n", "In the year 1946 the rainiest month was Nov with 126.7 mm\n", "In the year 1947 the rainiest month was Mar with 150.7 mm\n", "In the year 1948 the rainiest month was Jan with 125.3 mm\n", "In the year 1949 the rainiest month was Oct with 189.3 mm\n", "In the year 1950 the rainiest month was Nov with 137.9 mm\n", "In the year 1951 the rainiest month was Nov with 161.9 mm\n", "In the year 1952 the rainiest month was Nov with 99.9 mm\n", "In the year 1953 the rainiest month was Jul with 87.5 mm\n", "In the year 1954 the rainiest month was Nov with 131.0 mm\n", "In the year 1955 the rainiest month was May with 110.5 mm\n", "In the year 1956 the rainiest month was Jan with 113.7 mm\n", "In the year 1957 the rainiest month was Feb with 97.7 mm\n", "In the year 1958 the rainiest month was Sep with 107.4 mm\n", "In the year 1959 the rainiest month was Dec with 143.4 mm\n", "In the year 1960 the rainiest month was Oct with 167.0 mm\n", "In the year 1961 the rainiest month was Dec with 102.0 mm\n", "In the year 1962 the rainiest month was Sep with 94.0 mm\n", "In the year 1963 the rainiest month was Nov with 141.0 mm\n", "In the year 1964 the rainiest month was Mar with 97.7 mm\n", "In the year 1965 the rainiest month was Dec with 126.9 mm\n", "In the year 1966 the rainiest month was Oct with 129.1 mm\n", "In the year 1967 the rainiest month was Oct with 126.6 mm\n", "In the year 1968 the rainiest month was Sep with 135.5 mm\n", "In the year 1969 the rainiest month was Nov with 108.4 mm\n", "In the year 1970 the rainiest month was Nov with 186.4 mm\n", "In the year 1971 the rainiest month was Jun with 134.4 mm\n", "In the year 1972 the rainiest month was Dec with 94.0 mm\n", "In the year 1973 the rainiest month was May with 76.6 mm\n", "In the year 1974 the rainiest month was Sep with 164.7 mm\n", "In the year 1975 the rainiest month was Sep with 122.8 mm\n", "In the year 1976 the rainiest month was Oct with 141.5 mm\n", "In the year 1977 the rainiest month was Aug with 132.8 mm\n", "In the year 1978 the rainiest month was Dec with 144.9 mm\n", "In the year 1979 the rainiest month was Dec with 122.6 mm\n", "In the year 1980 the rainiest month was Oct with 110.1 mm\n", "In the year 1981 the rainiest month was Mar with 131.2 mm\n", "In the year 1982 the rainiest month was Oct with 143.0 mm\n", "In the year 1983 the rainiest month was May with 98.5 mm\n", "In the year 1984 the rainiest month was Jan with 112.4 mm\n", "In the year 1985 the rainiest month was Dec with 103.7 mm\n", "In the year 1986 the rainiest month was Jan with 110.1 mm\n", "In the year 1987 the rainiest month was Oct with 198.7 mm\n", "In the year 1988 the rainiest month was Jan with 143.8 mm\n", "In the year 1989 the rainiest month was Dec with 143.8 mm\n", "In the year 1990 the rainiest month was Feb with 122.3 mm\n", "In the year 1991 the rainiest month was Jun with 102.0 mm\n", "In the year 1992 the rainiest month was Nov with 132.8 mm\n", "In the year 1993 the rainiest month was Dec with 133.9 mm\n", "In the year 1994 the rainiest month was Jan with 115.6 mm\n", "In the year 1995 the rainiest month was Jan with 143.1 mm\n", "In the year 1996 the rainiest month was Nov with 122.6 mm\n", "In the year 1997 the rainiest month was Jun with 100.6 mm\n", "In the year 1998 the rainiest month was Oct with 128.1 mm\n", "In the year 1999 the rainiest month was Dec with 109.5 mm\n" ] } ], "source": [ "# specify filename\n", "filename = 'files/data/HadSEEP_monthly_qc.txt'\n", "\n", "# read the data, chop off first 4 lines \n", "# and store in required_data\n", "fp = open(filename,'r')\n", "raw_data = fp.readlines()\n", "fp.close()\n", "required_data = raw_data[4:]\n", "\n", "# set up list to store data in\n", "data = []\n", "\n", "\n", "# loop over each line\n", "for line_data in required_data:\n", " # split on white space\n", " year_data = line_data.split()\n", " \n", " # convert data to float\n", " for column,this_element in enumerate(year_data):\n", " year_data[column] = float(this_element)\n", " data.append(year_data)\n", "\n", "\n", "# select years \n", "c20_data = []\n", "for line in data:\n", " if (line[0] >= 1900) and (line[0] < 2000):\n", " c20_data.append(line[1:-1])\n", " \n", "# Aside: show which month that was\n", "month_names = [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \\\n", " \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ]\n", "\n", "print \"In South East England\"\n", "for row in xrange(0,100,1):\n", " year = 1900 + row\n", " max_precip = max(c20_data[row])\n", " month = c20_data[row].index(max_precip)\n", "\n", " print \"In the year\",year,\"the rainiest month was\",month_names[month],\"with\",max_precip,\"mm\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That is quite an achievement, given the limited amount of programming you know so far.\n", "\n", "If you go through this though, you will (should) see that it is really not very efficient.\n", "\n", "For example:\n", "\n", " we read all the data in and then filter out the years we want (what if the dataset were huge?)\n", " we loop over the 100 years multiple times\n", " we store intermediate results\n", "\n", "For this exercise, you should look through the code we developed and try to make it more efficient.\n", "\n", "Efficiency should not override clarity and understanding though, so make sure you can understand what is going on at each stage." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Answer 2.5" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "In South East England\n", "In the year 1900 the rainiest month was Jan with 1900.0 mm\n", "In the year 1901 the rainiest month was Jan with 1901.0 mm\n", "In the year 1902 the rainiest month was Jan with 1902.0 mm\n", "In the year 1903 the rainiest month was Jan with 1903.0 mm\n", "In the year 1904 the rainiest month was Jan with 1904.0 mm\n", "In the year 1905 the rainiest month was Jan with 1905.0 mm\n", "In the year 1906 the rainiest month was Jan with 1906.0 mm\n", "In the year 1907 the rainiest month was Jan with 1907.0 mm\n", "In the year 1908 the rainiest month was Jan with 1908.0 mm\n", "In the year 1909 the rainiest month was Jan with 1909.0 mm\n", "In the year 1910 the rainiest month was Jan with 1910.0 mm\n", "In the year 1911 the rainiest month was Jan with 1911.0 mm\n", "In the year 1912 the rainiest month was Jan with 1912.0 mm\n", "In the year 1913 the rainiest month was Jan with 1913.0 mm\n", "In the year 1914 the rainiest month was Jan with 1914.0 mm\n", "In the year 1915 the rainiest month was Jan with 1915.0 mm\n", "In the year 1916 the rainiest month was Jan with 1916.0 mm\n", "In the year 1917 the rainiest month was Jan with 1917.0 mm\n", "In the year 1918 the rainiest month was Jan with 1918.0 mm\n", "In the year 1919 the rainiest month was Jan with 1919.0 mm\n", "In the year 1920 the rainiest month was Jan with 1920.0 mm\n", "In the year 1921 the rainiest month was Jan with 1921.0 mm\n", "In the year 1922 the rainiest month was Jan with 1922.0 mm\n", "In the year 1923 the rainiest month was Jan with 1923.0 mm\n", "In the year 1924 the rainiest month was Jan with 1924.0 mm\n", "In the year 1925 the rainiest month was Jan with 1925.0 mm\n", "In the year 1926 the rainiest month was Jan with 1926.0 mm\n", "In the year 1927 the rainiest month was Jan with 1927.0 mm\n", "In the year 1928 the rainiest month was Jan with 1928.0 mm\n", "In the year 1929 the rainiest month was Jan with 1929.0 mm\n", "In the year 1930 the rainiest month was Jan with 1930.0 mm\n", "In the year 1931 the rainiest month was Jan with 1931.0 mm\n", "In the year 1932 the rainiest month was Jan with 1932.0 mm\n", "In the year 1933 the rainiest month was Jan with 1933.0 mm\n", "In the year 1934 the rainiest month was Jan with 1934.0 mm\n", "In the year 1935 the rainiest month was Jan with 1935.0 mm\n", "In the year 1936 the rainiest month was Jan with 1936.0 mm\n", "In the year 1937 the rainiest month was Jan with 1937.0 mm\n", "In the year 1938 the rainiest month was Jan with 1938.0 mm\n", "In the year 1939 the rainiest month was Jan with 1939.0 mm\n", "In the year 1940 the rainiest month was Jan with 1940.0 mm\n", "In the year 1941 the rainiest month was Jan with 1941.0 mm\n", "In the year 1942 the rainiest month was Jan with 1942.0 mm\n", "In the year 1943 the rainiest month was Jan with 1943.0 mm\n", "In the year 1944 the rainiest month was Jan with 1944.0 mm\n", "In the year 1945 the rainiest month was Jan with 1945.0 mm\n", "In the year 1946 the rainiest month was Jan with 1946.0 mm\n", "In the year 1947 the rainiest month was Jan with 1947.0 mm\n", "In the year 1948 the rainiest month was Jan with 1948.0 mm\n", "In the year 1949 the rainiest month was Jan with 1949.0 mm\n", "In the year 1950 the rainiest month was Jan with 1950.0 mm\n", "In the year 1951 the rainiest month was Jan with 1951.0 mm\n", "In the year 1952 the rainiest month was Jan with 1952.0 mm\n", "In the year 1953 the rainiest month was Jan with 1953.0 mm\n", "In the year 1954 the rainiest month was Jan with 1954.0 mm\n", "In the year 1955 the rainiest month was Jan with 1955.0 mm\n", "In the year 1956 the rainiest month was Jan with 1956.0 mm\n", "In the year 1957 the rainiest month was Jan with 1957.0 mm\n", "In the year 1958 the rainiest month was Jan with 1958.0 mm\n", "In the year 1959 the rainiest month was Jan with 1959.0 mm\n", "In the year 1960 the rainiest month was Jan with 1960.0 mm\n", "In the year 1961 the rainiest month was Jan with 1961.0 mm\n", "In the year 1962 the rainiest month was Jan with 1962.0 mm\n", "In the year 1963 the rainiest month was Jan with 1963.0 mm\n", "In the year 1964 the rainiest month was Jan with 1964.0 mm\n", "In the year 1965 the rainiest month was Jan with 1965.0 mm\n", "In the year 1966 the rainiest month was Jan with 1966.0 mm\n", "In the year 1967 the rainiest month was Jan with 1967.0 mm\n", "In the year 1968 the rainiest month was Jan with 1968.0 mm\n", "In the year 1969 the rainiest month was Jan with 1969.0 mm\n", "In the year 1970 the rainiest month was Jan with 1970.0 mm\n", "In the year 1971 the rainiest month was Jan with 1971.0 mm\n", "In the year 1972 the rainiest month was Jan with 1972.0 mm\n", "In the year 1973 the rainiest month was Jan with 1973.0 mm\n", "In the year 1974 the rainiest month was Jan with 1974.0 mm\n", "In the year 1975 the rainiest month was Jan with 1975.0 mm\n", "In the year 1976 the rainiest month was Jan with 1976.0 mm\n", "In the year 1977 the rainiest month was Jan with 1977.0 mm\n", "In the year 1978 the rainiest month was Jan with 1978.0 mm\n", "In the year 1979 the rainiest month was Jan with 1979.0 mm\n", "In the year 1980 the rainiest month was Jan with 1980.0 mm\n", "In the year 1981 the rainiest month was Jan with 1981.0 mm\n", "In the year 1982 the rainiest month was Jan with 1982.0 mm\n", "In the year 1983 the rainiest month was Jan with 1983.0 mm\n", "In the year 1984 the rainiest month was Jan with 1984.0 mm\n", "In the year 1985 the rainiest month was Jan with 1985.0 mm\n", "In the year 1986 the rainiest month was Jan with 1986.0 mm\n", "In the year 1987 the rainiest month was Jan with 1987.0 mm\n", "In the year 1988 the rainiest month was Jan with 1988.0 mm\n", "In the year 1989 the rainiest month was Jan with 1989.0 mm\n", "In the year 1990 the rainiest month was Jan with 1990.0 mm\n", "In the year 1991 the rainiest month was Jan with 1991.0 mm\n", "In the year 1992 the rainiest month was Jan with 1992.0 mm\n", "In the year 1993 the rainiest month was Jan with 1993.0 mm\n", "In the year 1994 the rainiest month was Jan with 1994.0 mm\n", "In the year 1995 the rainiest month was Jan with 1995.0 mm\n", "In the year 1996 the rainiest month was Jan with 1996.0 mm\n", "In the year 1997 the rainiest month was Jan with 1997.0 mm\n", "In the year 1998 the rainiest month was Jan with 1998.0 mm\n", "In the year 1999 the rainiest month was Jan with 1999.0 mm\n" ] } ], "source": [ "# specify filename\n", "filename = 'files/data/HadSEEP_monthly_qc.txt'\n", "\n", "fp = open(filename,'r')\n", "\n", "# years range\n", "years = range(1900,2000)\n", "\n", "# set up list to store data in\n", "c20_data = []\n", "\n", "# loop over each line\n", "for line_data in fp.readlines()[4:]:\n", " # split on white space\n", " # convert data to float\n", " year_data = [float(i) for i in line_data.split()] \n", " \n", " if year_data[0] in years:\n", " c20_data.append(year_data)\n", " \n", "# Aside: show which month that was\n", "month_names = [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \\\n", " \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ]\n", "\n", "print \"In South East England\"\n", "for row,year in enumerate(years):\n", " max_precip = max(c20_data[row])\n", " month = c20_data[row].index(max_precip)\n", "\n", " print \"In the year\",year,\"the rainiest month was\",month_names[month],\"with\",max_precip,\"mm\"\n", " \n", "fp.close()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise 2.6" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Average Temperature\n", "\n", "We want to calculate the long-term average temperature (tmax degC) using observational data at one or more meteorological stations. Such data are [relevant to understanding climate and its dynamics](http://www.carbonbrief.org/profiles/global-temperatures/).\n", "\n", "We choose the period 1960 to 1990 (30 years average to even out natural variability).\n", "\n", "We can obtain monthly average data for a number of UK stations from the [UK Met. Office](http://www.metoffice.gov.uk/climate/uk/stationdata).\n", "\n", "Not all station records are complete enough for this calculation, so we select, for example [Heathrow](http://www.metoffice.gov.uk/climate/uk/stationdata/heathrowdata.txt).\n", "\n", "Just with the Python skills you have learned so far, you should be able to solve a problem of this nature." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Answer 2.6" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before diving into this though, you need to think through **what steps** you need to go through to achieve your aim?\n", "\n", "At a 'high' level, this could be:\n", "\n", "1. Get hold of the data\n", "2. Read the data into the computer program\n", "3. Select which years you want\n", "4. Average the data for each month over all selected years\n", "5. Print the results\n", "\n", "So now we need to think about how to implement these steps.\n", "\n", "For the first step, there are many ways you could do this." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--2014-09-30 11:13:08-- http://www.metoffice.gov.uk/climate/uk/stationdata/heathrowdata.txt\r\n", "Resolving www.metoffice.gov.uk... 213.120.162.233, 213.120.162.211\r\n", "Connecting to www.metoffice.gov.uk|213.120.162.233|:80... connected.\r\n", "HTTP request sent, awaiting response... 301 Moved Permanently\r\n", "Location: http://www.metoffice.gov.uk/pub/data/weather/uk/climate/stationdata/heathrowdata.txt [following]\r\n", "--2014-09-30 11:13:08-- http://www.metoffice.gov.uk/pub/data/weather/uk/climate/stationdata/heathrowdata.txt\r\n", "Reusing existing connection to www.metoffice.gov.uk:80.\r\n", "HTTP request sent, awaiting response... 200 OK\r\n", "Length: 41280 (40K) [text/plain]\r\n", "Saving to: ‘files/data/heathrowdata.txt’\r\n", "\r\n", "100%[======================================>] 41,280 --.-K/s in 0s \r\n", "\r\n", "2014-09-30 11:13:09 (206 MB/s) - ‘files/data/heathrowdata.txt’ saved [41280/41280]\r\n", "\r\n" ] } ], "source": [ "!wget -O files/data/heathrowdata.txt http://www.metoffice.gov.uk/climate/uk/stationdata/heathrowdata.txt" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ifile = 'files/data/heathrowdata.txt'\n", "fp = open(ifile)\n", "raw_data = fp.readlines()\n", "fp.close()\n", "\n", "raw_data = raw_data[7:] # Skip headers" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[6.9, 7.9, 10.2, 14.3, 18.4, 22.1, 20.1, 20.3, 18.5, 14.2, 11.2, 6.9]\n", "[6.9, 10.3, 13.9, 15.0, 16.8, 21.7, 22.1, 21.7, 20.9, 15.6, 9.9, 6.8]\n", "[7.9, 7.6, 7.4, 12.7, 15.0, 20.4, 20.6, 20.0, 17.8, 15.7, 9.1, 5.0]\n", "[0.8, 2.8, 10.7, 13.6, 16.0, 20.8, 21.1, 19.8, 18.0, 14.8, 11.8, 5.4]\n", "[5.8, 7.6, 7.6, 12.8, 19.6, 19.3, 22.8, 22.3, 21.1, 13.7, 11.2, 7.1]\n", "[6.6, 5.9, 10.5, 13.4, 16.8, 19.7, 19.3, 20.8, 17.4, 16.2, 8.4, 8.4]\n", "[5.3, 9.3, 10.9, 12.2, 17.0, 21.8, 20.1, 20.6, 19.6, 14.7, 8.8, 9.3]\n", "[7.3, 9.3, 11.6, 12.5, 15.6, 20.1, 23.5, 21.5, 18.5, 15.0, 9.7, 7.2]\n", "[7.2, 5.7, 11.1, 13.7, 15.4, 20.6, 20.7, 20.2, 18.8, 16.5, 9.5, 5.4]\n", "[8.9, 4.9, 8.0, 13.6, 17.1, 20.6, 23.9, 21.8, 19.6, 18.2, 9.6, 6.1]\n", "[7.1, 7.2, 8.1, 11.4, 19.2, 23.6, 21.3, 22.3, 20.3, 15.7, 11.9, 7.0]\n", "[7.8, 8.6, 9.1, 12.2, 18.1, 17.8, 24.1, 21.3, 20.7, 17.2, 10.4, 9.3]\n", "[6.9, 7.9, 12.4, 12.9, 16.0, 17.5, 22.3, 21.8, 17.3, 15.6, 9.9, 9.4]\n", "[7.3, 8.1, 11.5, 12.5, 16.9, 21.9, 21.4, 23.7, 20.7, 13.9, 10.3, 8.6]\n", "[9.6, 9.2, 10.3, 14.0, 17.0, 20.1, 20.9, 21.5, 17.5, 11.0, 10.6, 11.0]\n", "[10.3, 9.3, 8.4, 13.3, 15.1, 21.8, 24.1, 25.9, 19.5, 14.4, 10.1, 7.6]\n", "[8.8, 7.8, 9.5, 13.7, 19.3, 25.5, 26.6, 25.1, 19.0, 14.9, 9.9, 5.6]\n", "[6.1, 9.6, 11.2, 12.2, 16.4, 17.4, 22.4, 20.3, 18.0, 16.3, 10.4, 9.2]\n", "[6.7, 6.2, 11.3, 10.7, 17.2, 19.7, 20.5, 20.7, 20.1, 17.1, 12.6, 7.8]\n", "[3.8, 4.5, 9.2, 12.7, 15.9, 19.0, 22.5, 21.0, 19.6, 16.4, 10.8, 9.2]\n", "[6.0, 9.9, 9.0, 14.0, 17.3, 19.8, 19.7, 21.9, 20.1, 14.0, 9.3, 8.9]\n", "[8.1, 7.1, 11.8, 12.9, 16.1, 18.5, 22.0, 22.8, 20.3, 12.9, 11.5, 4.4]\n", "[6.9, 8.4, 11.1, 14.3, 18.0, 21.5, 22.7, 22.2, 20.8, 14.1, 11.4, 8.2]\n", "[10.0, 5.5, 10.8, 12.4, 15.6, 20.8, 27.6, 24.5, 19.3, 15.1, 11.3, 9.2]\n", "[8.0, 7.4, 8.9, 14.6, 14.9, 21.3, 24.2, 24.4, 18.6, 15.8, 12.2, 8.7]\n", "[4.1, 6.3, 9.4, 14.0, 16.4, 18.5, 22.9, 20.3, 20.6, 16.1, 8.1, 10.0]\n", "[7.2, 1.7, 10.1, 10.9, 16.3, 21.8, 22.6, 20.0, 17.4, 16.4, 12.1, 9.7]\n", "[3.6, 7.7, 8.5, 15.8, 16.3, 18.6, 21.8, 21.8, 19.3, 15.0, 9.8, 8.9]\n", "[8.8, 8.7, 10.7, 13.5, 18.0, 19.7, 20.0, 21.8, 18.8, 15.5, 9.9, 10.4]\n", "[9.5, 10.2, 12.9, 11.5, 21.0, 22.1, 25.8, 24.2, 20.7, 17.1, 10.9, 9.4]\n" ] } ], "source": [ "# set up the problem\n", "start_year = 1960\n", "end_year = 1990\n", "\n", "tmax = []\n", "\n", "for l in raw_data:\n", " s = l.split()\n", " year = int( s[0] )\n", " if year >= start_year and year < end_year:\n", " month = int ( s[1] )\n", " if month == 1:\n", " tmax.append([])\n", " tmax[-1].append(float ( s[2] ))\n", "\n", "for l in tmax:\n", " print l" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [], "source": [ "monthly_avg = []\n", "n_years = len(tmax)\n", "\n", "\n", "for month in xrange ( len(tmax[0]) ):\n", " temp = 0.\n", " for year in xrange (n_years):\n", " temp += tmax[year][month]\n", " monthly_avg.append(temp/n_years)\n" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "T results for 30 years: 1960 to 1990\n", "\n", "\tMonth\tTmaxAvg\n", "\n", "\tJan \t7.00666666667\n", "\tFeb \t7.42\n", "\tMar \t10.2033333333\n", "\tApr \t13.11\n", "\tMay \t16.9566666667\n", "\tJun \t20.4666666667\n", "\tJul \t22.32\n", "\tAug \t21.8833333333\n", "\tSep \t19.2933333333\n", "\tOct \t15.3033333333\n", "\tNov \t10.42\n", "\tDec \t8.00333333333\n" ] } ], "source": [ "print \"T results for\",n_years,\"years:\",start_year,\"to\",end_year\n", "\n", "month_names = [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \\\n", " \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ]\n", "\n", "print \"\\n\\tMonth\\tTmaxAvg\\n\"\n", "for i, mname in enumerate ( month_names ):\n", " print '\\t',mname,'\\t',monthly_avg[i]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise 2.7" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "I found 62 files to process\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004214.h19v10.005.2007299212915.hdf\n", "\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004215.h19v10.005.2007300042347.hdf\n", "\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004216.h19v10.005.2007300091257.hdf\n", "\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004217.h19v10.005.2007300153436.hdf\n", "\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004218.h19v10.005.2007300215826.hdf\n", "\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004219.h19v10.005.2007302194509.hdf\n", "\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004220.h19v10.005.2007302093547.hdf\n", "\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004221.h19v10.005.2007302222054.hdf\n", "\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004222.h19v10.005.2007303011606.hdf\n", "\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004223.h19v10.005.2007303073538.hdf\n", "\n" ] } ], "source": [ "# 1. Read the configuration file\n", "# into the dict modis\n", "import ConfigParser\n", "\n", "config = ConfigParser.ConfigParser()\n", "config.read('files/data/modis.cfg')\n", "\n", "# we can convert this to a normal dictionary\n", "modis = {}\n", "for k in config.sections():\n", " modis[k] = dict(config.items(k))\n", "\n", "# 2. Now, loop over config sections\n", "# and get the sub-dictionary which we call sub_dict\n", "\n", "# 3. set up anb empty list to contain the\n", "# files we want to process\n", "wanted_files = []\n", "\n", "for k,v in modis.items():\n", " \n", " sub_dict = v\n", " \n", " # 3a. Read the file list\n", " fp = open(sub_dict['file_list'],'r')\n", " file_data = fp.readlines()\n", " fp.close()\n", " \n", " # 3b. find the doy range\n", " doy_range = range(int(sub_dict['doy_start']),\\\n", " int(sub_dict['doy_end']))\n", " \n", " # 3c. loop over each file read from\n", " # sub_dict['file_list']\n", " for count in xrange(len(file_data)):\n", " # 3d. extract doy from the file name\n", " this_file = file_data[count]\n", " \n", " doy = int(this_file.split('.')[1][-3:])\n", " \n", " # 3e. see if doy is in the range we want?\n", " if doy in doy_range:\n", " \n", " # 3f. put the directory on the fornt\n", " full_name = sub_dict['dir'] + \\\n", " '/' + this_file\n", " wanted_files.append(full_name)\n", " \n", "print \"I found %d files to process\"%len(wanted_files)\n", "\n", "# I won't print the whole list as its too long\n", "# just the first 10\n", "for f in wanted_files[:10]:\n", " print f\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**You should modify the example above to make it simpler, if you can spot any places for that (don't make it more complicated!).**\n", "\n", "**You should then modify it so that the list of files that we want to process is printed to a file.**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Answer 2.7" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Probably the main place you could make the code simpler would be in the loop:\n", "\n", "```python\n", " # 3a. Read the file list\n", " fp = open(sub_dict['file_list'],'r')\n", " file_data = fp.readlines()\n", " fp.close()\n", " \n", " # 3b. find the doy range\n", " doy_range = range(int(sub_dict['doy_start']),\\\n", " int(sub_dict['doy_end']))\n", " \n", " # 3c. loop over each file read from\n", " # sub_dict['file_list']\n", " for count in xrange(len(file_data)):\n", " # 3d. extract doy from the file name\n", " this_file = file_data[count]\n", " \n", " doy = int(this_file.split('.')[1][-3:])\n", " \n", " # 3e. see if doy is in the range we want?\n", " if doy in doy_range:\n", " \n", " # 3f. put the directory on the fornt\n", " full_name = sub_dict['dir'] + \\\n", " '/' + this_file\n", " wanted_files.append(full_name)\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Really, we don't need the `count` variable and structure in here, and we could replace this by:\n", "\n", "```python\n", " # 3a. Read the file list\n", " fp = open(sub_dict['file_list'],'r')\n", " \n", " # 3b. find the doy range\n", " doy_range = range(int(sub_dict['doy_start']),\\\n", " int(sub_dict['doy_end']))\n", " \n", " # 3c. loop over each file read from\n", " # sub_dict['file_list']\n", " for this_file in fp.readlines():\n", " \n", " # 3d. extract doy from the file name\n", " doy = int(this_file.split('.')[1][-3:])\n", " \n", " # 3e. see if doy is in the range we want?\n", " if doy in doy_range:\n", " \n", " # 3f. store the filename in the list\n", " wanted_files.append(\"%s/%s\"%(sub_dict['dir'],this_file))\n", "\n", " # close the file here now\n", " fp.close()\n", "\n", "```\n", "\n", "If you wanted, you could also do some clever things with `and`:\n", "\n", "\n", "```python\n", " # 3a. Read the file list\n", " fp = open(sub_dict['file_list'],'r')\n", " \n", " # 3b. find the doy range\n", " doy_range = range(int(sub_dict['doy_start']),\\\n", " int(sub_dict['doy_end']))\n", " \n", " # 3c. loop over each file read from\n", " # sub_dict['file_list']\n", " for this_file in fp.readlines():\n", " \n", " # 3d. extract doy from the file name\n", " doy = int(this_file.split('.')[1][-3:])\n", " \n", " # 3e. see if doy is in the range we want\n", " # and put in list if so\n", " doy in doy_range and \\\n", " wanted_files.append(\"%s/%s\"%(sub_dict['dir'],this_file))\n", "\n", " # close the file here now\n", " fp.close()\n", "\n", "```\n", "\n", "Writing the results to file should be straightforward enough for you now.\n", "\n", "You could do it at the end:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "I found 62 files to process\n" ] } ], "source": [ "# 1. Read the configuration file\n", "# into the dict modis\n", "import ConfigParser\n", "\n", "# good to open the file early on\n", "# in case it fails\n", "ofile = 'files/data/modis_files.dat'\n", "ofp = open(ofile,\"w\")\n", "\n", "config = ConfigParser.ConfigParser()\n", "config.read('files/data/modis.cfg')\n", "\n", "# we can convert this to a normal dictionary\n", "modis = {}\n", "for k in config.sections():\n", " modis[k] = dict(config.items(k))\n", "\n", "# 2. Now, loop over config sections\n", "# and get the sub-dictionary which we call sub_dict\n", "\n", "# 3. set up anb empty list to contain the\n", "# files we want to process\n", "wanted_files = []\n", "\n", "for k,v in modis.items():\n", " \n", " sub_dict = v\n", " \n", " # 3a. Read the file list\n", " fp = open(sub_dict['file_list'],'r')\n", " \n", " # 3b. find the doy range\n", " doy_range = range(int(sub_dict['doy_start']),\\\n", " int(sub_dict['doy_end']))\n", " \n", " # 3c. loop over each file read from\n", " # sub_dict['file_list']\n", " for this_file in fp.readlines():\n", " \n", " # 3d. extract doy from the file name\n", " doy = int(this_file.split('.')[1][-3:])\n", " # 3e. see if doy is in the range we want\n", " # and put in list if so\n", " doy in doy_range and \\\n", " wanted_files.append(\"%s/%s\"%(sub_dict['dir'],this_file))\n", " fp.close()\n", " \n", "print \"I found %d files to process\"%len(wanted_files)\n", "\n", "ofp.writelines(wanted_files)\n", "ofp.close()\n" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004214.h19v10.005.2007299212915.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004215.h19v10.005.2007300042347.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004216.h19v10.005.2007300091257.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004217.h19v10.005.2007300153436.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004218.h19v10.005.2007300215826.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004219.h19v10.005.2007302194509.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004220.h19v10.005.2007302093547.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004221.h19v10.005.2007302222054.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004222.h19v10.005.2007303011606.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004223.h19v10.005.2007303073538.hdf\r\n" ] } ], "source": [ "!head -10 < files/data/modis_files.dat" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Or you could print as you go along in the loop:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# 1. Read the configuration file\n", "# into the dict modis\n", "import ConfigParser\n", "\n", "# good to open the file early on\n", "# in case it fails\n", "ofile = 'files/data/modis_files.dat'\n", "ofp = open(ofile,\"w\")\n", "\n", "config = ConfigParser.ConfigParser()\n", "config.read('files/data/modis.cfg')\n", "\n", "# we can convert this to a normal dictionary\n", "modis = {}\n", "for k in config.sections():\n", " modis[k] = dict(config.items(k))\n", "\n", "# 2. Now, loop over config sections\n", "# and get the sub-dictionary which we call sub_dict\n", "\n", "# 3. set up anb empty list to contain the\n", "# files we want to process\n", "wanted_files = []\n", "\n", "for k,v in modis.items():\n", " \n", " sub_dict = v\n", " \n", " # 3a. Read the file list\n", " fp = open(sub_dict['file_list'],'r')\n", " \n", " # 3b. find the doy range\n", " doy_range = range(int(sub_dict['doy_start']),\\\n", " int(sub_dict['doy_end']))\n", " \n", " # 3c. loop over each file read from\n", " # sub_dict['file_list']\n", " for this_file in fp.readlines():\n", " \n", " # 3d. extract doy from the file name\n", " # 3e. see if doy is in the range we want\n", " # and put in list if so\n", " (int(this_file.split('.')[1][-3:]) in doy_range) and \\\n", " ofp.write(\"%s/%s\"%(sub_dict['dir'],this_file))\n", " fp.close()\n", " \n", "ofp.close()\n" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004214.h19v10.005.2007299212915.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004215.h19v10.005.2007300042347.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004216.h19v10.005.2007300091257.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004217.h19v10.005.2007300153436.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004218.h19v10.005.2007300215826.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004219.h19v10.005.2007302194509.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004220.h19v10.005.2007302093547.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004221.h19v10.005.2007302222054.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004222.h19v10.005.2007303011606.hdf\r\n", "/data/geospatial_19/ucfajlg/fire/Angola/MYD09/MYD09GA.A2004223.h19v10.005.2007303073538.hdf\r\n" ] } ], "source": [ "!head -10 < files/data/modis_files.dat" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" } }, "nbformat": 4, "nbformat_minor": 0 }