{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Intro to Python Programming" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "# Why Python?\n", "\n", "* It's a full and general purpose programming language.\n", "* Clean and elegant, easy to learn and be productive.\n", "* It's free and open source (you can always know exactly what your code is doing)!\n", "* Huge community.\n", "* Very popular for scientific programming and data science.\n", "\n", "\n", "Projects using Python:\n", "\n", "* YouTube\n", "* Google\n", "* NASA\n", "* Dropbox\n", "* Many more.\n", "\n", "# Workshop Objectives\n", "\n", "* To give you the essential Python tools so that you can start to apply it to help you in your own work or research!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Programming Basics\n", "\n", "We can boil down programming into two main 'entities': Data and Operations. In a program, we have some information, or data, and we perform some operations on it to produce the desired output. So let's see how these two are represented in Python.\n", "\n", "## Data\n", "\n", "As you can imagine, data can come in several forms and be packaged in many ways. The fundamental Python data types that we will cover here are the following: integers, floats, booleans, and strings. We can store the values of these different types in what we call 'variables'. You can just think of them as containers with a name (no spaces or special characters!) that have a piece of data. Below are some examples of how we can work with these data types.\n", "\n", "### Primitives" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4\n", "2\n", "0.5 0.1\n", "False\n" ] } ], "source": [ "# this is a comment. anything that follows a '#' symbol in Python is ignored by the interpeter\n", "\n", "# here are two ways we can represent numbers\n", "\n", "#integers a.k.a int\n", "x = 4 #here we store the integer value of 4 in the variable x\n", "y = 2\n", "\n", "#floating point numbers \n", "a = 0.5\n", "b = 0.1\n", "\n", "# strings are sequences of characters. they are always contained in single or double quotes\n", "s = \"Hello, world.\"\n", "\n", "#booleans are data types that can take on only the values 'True' or 'False':\n", "\n", "n = False\n", "m = True\n", "\n", "#finally, we have the 'None' type which is basically nothing, it's like an empty variable\n", "\n", "t = None\n", "\n", "## so now what we've done is store some values in some variables. how can we see what those values are? print!\n", "\n", "print(x)\n", "print(y)\n", "print(a, b)\n", "\n", "#print the rest of the variables\n", "print(n)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n", "5.0\n" ] } ], "source": [ "#another useful thing is type-casting where we can convert some types into other types.\n", "\n", "x = 5.0\n", "y = \"5.0\"\n", "\n", "#converts a floating point number to an integer\n", "print(int(x))\n", "\n", "#converts the string \"5.0\" into a numeric value\n", "print(float(y))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "8\n", "0.8\n" ] } ], "source": [ "# we can do some basic operations on these data types\n", "\n", "print(4 + 4) #add or subtract two integers\n", "print(4/5) # divide" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5.0\n", "10.0\n" ] } ], "source": [ "# we can assign the value of a variable back to itself.\n", "print(x)\n", "x = x + 5\n", "print(x)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello, world. How are you?\n" ] } ], "source": [ "#we can 'concatenate' two strings\n", "\n", "print(s + \" How are you?\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Data structures\n", "\n", "Now that we have a better idea of the types of information Python handles. We would like to scale things up and be able to store the data in a way as to be able to easily handle many values at once.\n", "\n", "#### Lists\n", "\n", "A list is simply an ordered collection of values." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 2, 3, 4]\n", "1\n", "2\n", "4\n" ] } ], "source": [ "# This is a list:\n", "l = [1, 2, 3, 4]\n", "# we can access each element in a list with its index (starting from 0)\n", "print(l)\n", "print(l[0]) #prints the first element in the list\n", "print(l[1]) #prints the second element in the list\n", "print(l[-1]) #what does this print?" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[3, 4]\n", "[1]\n", "[1, 2, 3]\n" ] } ], "source": [ "#list slicing. very useful way in python to access sub-lists in python\n", "\n", "#say we want to make a list that only has the elements between positions 2 and 4 in list l\n", "\n", "sliced = l[2:4]\n", "\n", "print(sliced)\n", "\n", "#now say we want a list that contains everything but the first number in l\n", "\n", "everything_but_first = l[:1]\n", "\n", "print(everything_but_first)\n", "\n", "#now make a list that has everything except the last element in the list (remember the -1 index)\n", "\n", "everything_but_last = l[:-1]\n", "print(everything_but_last)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3000\n", "[1, 3000, 3, 4]\n" ] } ], "source": [ "#we can modify the values in the list\n", "l[1] = 3000\n", "print(l[1])\n", "print(l)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "adding a value\n", "[1, 3000, 3, 4, 'hi!']\n" ] } ], "source": [ "#we can add values to the end of the list with the append() function\n", "print(\"adding a value\")\n", "l.append(\"hi!\")\n", "print(l)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Tuples\n", "\n", "Tuples are like lists, but they are less flexible. Unlike lists, they have a fixed size, and you can't reassign elements to them once they're assigned. The advantage is that they are more memory efficient than lists. So it's good to use them when you know that you will not be changing your data around much." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('Martin', 50, 1.65)\n", "50\n" ] } ], "source": [ "#declare a tuple. use round brackets instead of square brackets\n", "person = ('Martin', 50, 1.65) \n", "print(person)\n", "\n", "#you can still access its elements just like in a list\n", "print(person[1])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Dictionaries\n", "\n", "Dictionaries are one of the most useful data structures in Python and because they are very powerful for organizing data. A dictionary is like a list, except every element is indexed by a 'key instead of a number like we saw with lists and tuples. \n", "\n", "```d[key] = value ```" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'weights': [], 'heights': []}\n" ] } ], "source": [ "# dictionaries are initialized with curly braces\n", "d = {} # is an empty dictionary\n", "\n", "#let's add some keys to the dictionary and give it a value.\n", "d['heights'] = []\n", "d['weights'] = []\n", "\n", "print(d)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'weights': [221.2, 221.2, 221.2], 'heights': [165.4, 165.4, 165.4]}\n", "dict_keys(['weights', 'heights'])\n", "[165.4, 165.4, 165.4]\n" ] } ], "source": [ "#now we can add 'heights' to the list \n", "d['heights'].append(165.4)\n", "d['weights'].append(221.2)\n", "\n", "print(d)\n", "\n", "#if we want to get the 'keys' of the dictionary we use the keys() function\n", "\n", "print(d.keys())\n", "\n", "print(d['heights'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Python is very flexible with data \n", "\n", "As you may have started to notice, it is possible to store any kind of mixture of data into lists, tuples, and dictionaries. Here are some examples:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['hi', 1, 2, ('a', 2, 'e')]\n", "{1: [1, 2, 3], 'bob': 4}\n" ] } ], "source": [ "mix = ['hi', 1, 2, ('a', 2, 'e')]\n", "print(mix)\n", "\n", "d2 = {1: [1, 2, 3], 'bob': 4}\n", "print(d2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Operations\n", "\n", "Now that we have an idea of how Python stores data, we would like to be able to do something interesting with is. That is, peform operations on the data in an efficient manner." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `for` loops\n", "\n", "Loops make python repeat a set of commands a given number of times. They are by far the most widely used loop." ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "hi\n", "1\n", "2\n", "('a', 2, 'e')\n" ] } ], "source": [ "# for loops store the each item in the list in the variable following the 'for' one at a time.\n", "\n", "#let's iterate through that 'mix' list that we made in the previous cell and print each item in the list\n", "for i in mix:\n", " print(i)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "2\n", "3\n", "4\n", "5\n", "6\n", "7\n", "8\n", "9\n" ] } ], "source": [ "# we can also iterate through a range of numbers by using the range(n) command which returns a special kind of \n", "# list (not exactly a normal list) containing the integers within the specified range\n", "\n", "for i in range(10):\n", " print(i)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "45\n" ] } ], "source": [ "#write a for loop that adds the numbers from 1 to n. declare any variables you may need\n", "\n", "count = 0\n", "n = 10\n", "for i in range(n):\n", " count = count + i\n", "print(count)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `if` statements\n", "\n", "`if` statements allow us to control which parts of code are executed depending on a condition. This condition is expressed as a boolean that can be `True` or `False`. If the statement is `True` then the code contained in the `if` statement will execute. Otherwise, it gets skipped." ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "False\n" ] } ], "source": [ "#first, a bit more about booleans. we can compare two booleans using the '==' operator to obtain a 'True' if they are\n", "# equal and 'False' if they are not equal.\n", "\n", "print(True == True)\n", "print(True == False)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "False\n", "True\n", "False\n" ] } ], "source": [ "# We can perform some operations on boolean variables to better express conditions\n", "\n", "#the 'and' operation gives a True boolean if both elements are true\n", "a,b = True, True\n", "print(a and b)\n", "\n", "a,b = True, False\n", "print(a and b)\n", "\n", "\n", "# the 'or' operator gives True if either one (or both) of the elements is true\n", "print(a or b)\n", "\n", "# the 'not' operator simply gives you the opposite of the given element\n", "print(not a)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "feel_like_it = True\n", "raining = False\n", "date_tonight = True\n", "\n", "\n", "#write a boolean to decide if you should go to the gym based on the three booleans above.\n", "go_to_gym = (feel_like_it and not raining) or date_tonight\n", "\n", "print(go_to_gym)\n", "\n", "#play around with different values of the variables!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use `if` statements to make our loops more powerful" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "2\n", "4\n", "6\n", "8\n", "10\n", "12\n", "14\n", "16\n", "18\n", "20\n", "22\n", "24\n" ] } ], "source": [ "#write a for loop that prints every even number up until n. (hint. use the modulo operator which returns the \n", "# remainder of dividing two numbers. e.g. 5 % 2 = 3, 10%2 = 0)\n", "\n", "n = 25\n", "for i in range(n):\n", " if i % 2 == 0:\n", " print(i)\n", " else:\n", " continue #the 'continue' statement lets you skip to the next iteration in the loop\n" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "i have a date tonight\n" ] } ], "source": [ "if feel_like_it and raining: #whatever follows the if has to be a boolean statement\n", " print(\"i feel like it, but it's raining\")\n", "#if the previous clause is not met, the 'elif' or 'else if' block is checked\n", "elif date_tonight:\n", " print(\"i have a date tonight\")\n", "#if neither the if or the elif match then we go into the 'else'\n", "else:\n", " print(\"i should just stay home\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Try an example for yourself. This is a famous programming challenge to test `if` statements, known as the 'fizzbuzz' test. You have to print the numbers from 0 to 50 following three rules:\n", "\n", "* If the number is divisible by 3, print 'fizz'\n", "* If the number is divisible by 5, print 'buzz'\n", "* If the number is divisible by both 3 and 5, pring 'fizzbuzz'\n", "* Otherwise, print the number.\n", "\n", "There are many different ways to do this, so take a couple of minutes to come up with yours. (hint. use the `%` operator)." ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "fizzbuzz\n", "1\n", "2\n", "fizz\n", "4\n", "buzz\n", "fizz\n", "7\n", "8\n", "fizz\n", "buzz\n", "11\n", "fizz\n", "13\n", "14\n", "fizzbuzz\n", "16\n", "17\n", "fizz\n", "19\n", "buzz\n", "fizz\n", "22\n", "23\n", "fizz\n", "buzz\n", "26\n", "fizz\n", "28\n", "29\n", "fizzbuzz\n", "31\n", "32\n", "fizz\n", "34\n", "buzz\n", "fizz\n", "37\n", "38\n", "fizz\n", "buzz\n", "41\n", "fizz\n", "43\n", "44\n", "fizzbuzz\n", "46\n", "47\n", "fizz\n", "49\n" ] } ], "source": [ "for i in range(50):\n", " if i % 15 == 0:\n", " print(\"fizzbuzz\")\n", " elif i % 5 == 0:\n", " print(\"buzz\")\n", " elif i % 3 == 0:\n", " print(\"fizz\")\n", " else:\n", " print(i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### List comprehensions\n", "\n", "List comprehensions are a very nice Python feature that allow you to make lists in a single line. Let's see how they work." ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n" ] } ], "source": [ "b = []\n", "for i in range(10):\n", " b.append(i)\n", "\n", "print(b)\n", "\n", "b_comprehension = [i for i in range(10)]\n", "print(b_comprehension)" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]\n" ] } ], "source": [ "# this will grow a list where each element in the list is whatever the statement preceding\n", "#the 'for' evaluates to\n", "\n", "numbers_times_two = [n*2 for n in range(11)] \n", "print(numbers_times_two)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 3, 5, 7, 9]\n" ] } ], "source": [ "# we can also add if statements in the list comprehension\n", "odd_numbers = [i for i in range(10) if i % 2 != 0]\n", "print(odd_numbers)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[(0, 0), (1, 1), (2, 4), (3, 9)]" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#now try one yourself. make a list comprehension where \n", "#each item is a tuple (number, number*number) \n", "square_tuples = [(i, i*i) for i in range(10)]\n", "\n", "[(0, 0), (1, 1), (2, 4), (3, 9)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Functions\n", "\n", "That day of the week function was super useful! Let's say we want to use that code again many times, but sometimes we want it to find a different day of the week. We would have to change our if statement each time and re-run the code. This seems like a bit of a pain. Thankfully there is a better way.. functions! Think of a function as a little machine that takes in some input and does something to it and returns some output. So let's turn the days of the week finder into a function." ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#the first line of every function is a header. headers have 3 parts. the 'def' keyword which tells python you are\n", "#about to declare a function, then the name of the function, and finally the inputs to the function\n", "\n", "def day_finder(day_to_find):\n", " days_of_week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Satuday', 'Sunday']\n", " for day in days_of_week:\n", " if day == day_to_find:\n", " #the return statement ends every function and it 'sends' the output of your function to whoever called it\n", " return \"Thank God it's %s.\" % (day) # the %s in the string is like a placeholder that gets filled with\n", " # the value of the string variable 'day'\n", " return \"no match\"\n", " " ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "no match\n" ] } ], "source": [ "#you can call any function just by typing its name and the arguments you want it to work on in braces ()\n", "\n", "match = day_finder(\"tuesday\")\n", "print(match)#\"thank god it's tuesday\" is the return value of the function day_finder()" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "collapsed": false }, "outputs": [ { "ename": "NameError", "evalue": "name 'scope_test' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"hi im here\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mscope_test\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mtest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mscope_test\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mNameError\u001b[0m: name 'scope_test' is not defined" ] } ], "source": [ "a = \"hi im here\"\n", "print(scope_test)\n", "def test(inp):\n", " scope_test = 0\n", " for i\n", " print(a)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "hi im here\n" ] } ], "source": [ "test(\"hi\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### A word on 'variable scope'\n", "\n", "As you may have noticed, it would be a mess if variables were accessible from everywhere in the code. In fact, in Python, anything that is defined within an 'indentation block' is shared but not otherwise.\n", "\n", "Example:\n", "\n", "```\n", "a = 3\n", "\n", "def fun():\n", " b = 3\n", " for i in range(10):\n", " i = i + 1 \n", " \n", "```\n", "\n", "In this example `a` can be accessed from anywhere in the code. `b` can only be seen inside the indentation block started by `fun()` and `i` can only be seen within the indentation block defined by the `for` loop." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Object Oriented Programming\n", "\n", "Just how we generalized a piece of code that runs on similar kinds of input and gave it a name with the functions example, we can do the same thing with just about any piece of Python. Objects let us easily work with instances of some kind of *thing* where each instance might be a little different from the other but still behave according to its type of *thing*. \n", "\n", "Let's illustrate this with our *thing* being a Recipe. We can have many different types of recipes but we would like to be able to deal with each one in a uniform manner. We therefore define a Recipe as an object that is defined by some 'attributes'" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['bread', 'sausage']\n" ] } ], "source": [ "# every object is defined in a 'class' and classes are declared with the 'class' keyword\n", "class Recipe:\n", " def __init__(self, n, ig, ml, pt):\n", " self.name = n\n", " self.ingredients = ig #set the ingredients attribute of the object to the value of ig\n", " self.meal = ml\n", " self.prep_time = pt\n", "\n", "r = Recipe(\"hot dog\", [\"bread\", \"sausage\"], \"snack\", 15)\n", "print(r.ingredients)" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['ham', 'bread', 'cheese']\n", "90\n" ] } ], "source": [ "#now that we've defined what a Recipe should look like, we can nicely store some new recipes. \n", "\n", "#let's make some recipes\n", "\n", "sandwich = Recipe('sandwich', ['ham', 'bread', 'cheese'], 'lunch', 10)\n", "cake = Recipe('cake', ['flour', 'sugar', 'eggs'], 'dessert', 90)\n", "\n", "#add two more recipes of your own!\n", "\n", "# now we can very conveniently access some information about our recipes by name. This can be done with the '.' \n", "# operator that we saw above\n", "\n", "#print the ingredients in the sandwich, and the preparation time of the cake\n", "\n", "print(sandwich.ingredients)\n", "\n", "print(cake.prep_time)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's go even further and make a new object to contain our Recipe objects. Let's call this class *Cookbook* and it will simply contain a list of Recipe objects. However, it will not only have some data variables, but it will also be able to perform functions. " ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[]\n" ] } ], "source": [ "class Cookbook:\n", " def __init__(self, r):\n", " self.recipes = r\n", " \n", " #functions declared inside a class are called 'Class functions' and they act on an object\n", " def get_vegetarian(self):\n", " \"\"\"This function is going to return recipes in the cookbook that do not contain meat.\"\"\"\n", " meats = ['ham', 'beef', 'chicken', 'fish']\n", " veg_dishes = []\n", " #hint: use the 'in' operator which returns true if a value is in the \n", " #given list. e.g.: 5 in [1, 3, 5] returns True.\n", " #the 'self' keyword is used to access the object the function is being called on\n", " for recipe in self.recipes: \n", " if i in recipe.ingredients:\n", " veg_dishes.append(recipe)\n", " return veg_dishes\n", " \n", " #write a class function that returns a list of recipes that take under 'n' minutes to prepare\n", " def preptime(self, n):\n", " matches = []\n", " for r in self.recipes:\n", " if r.prep_time < n:\n", " matches.append(r)\n", " return matches\n", "\n", "# let's make a cookbook\n", "\n", "#gather some recipes\n", "recipes = []\n", "\n", "recipes.append(Recipe('steak', ['beef', 'butter', 'mashed potatoes'], 'main', 120))\n", "recipes.append(Recipe('toast', ['nutella', 'bread'], 'snack', 5))\n", "recipes.append(Recipe('salad', ['lettuce', 'kale', 'tomatoes'], 'main', 15))\n", "recipes.append(Recipe('chicken parm', ['chicken', 'sauce', 'cheese'], 'main', 90))\n", "recipes.append(Recipe('brownie', ['chocolate', 'flour', 'eggs'], 'dessert', 15))\n", "\n", "#put them in a cookbook\n", "\n", "cookbook = Cookbook(recipes)\n", "print([r.name for r in cookbook.get_vegetarian()])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#get vegetarian recipes\n", "\n", "print(cookbook.get_vegetarian())\n", "\n", "#get recipes that take less than 20 minutes to prepare\n", "\n", "print(...)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#oops what is that? because our functions are returning lists of objects we are seeing how the objects are represented\n", "# when we print them. What you see are addresses in memory where the objects are stored. Let's print it in a way\n", "# we can understand\n", "\n", "\n", "#print the name and ingredients of recipes that take under 20 minutes to prepare\n", "short_recipes = cookbook.preptime(20)\n", "\n", "for s in short_recipes:\n", " print(s.name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Libraries\n", "\n", "We've now covered most of the basics you need to get up and running. However, one of the nicest things about Python is that it has a fairly extensive 'standard library'. The standard library is a set of functions that come with Python that do a variety of useful things so that you don't have to reinvent the wheel each time you write a program. We've already seen an example with the `range()` function. I'm going to give some examples of some of the most useful functions in the standard library, but you should always check if what you are trying to do has already been implemented to save you time.\n", "\n", "Some functions are directly built-in and some you have to `import` from a *module* which is just the name of a Python program whose functions you can use in your code." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Help" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on built-in function abs in module builtins:\n", "\n", "abs(x, /)\n", " Return the absolute value of the argument.\n", "\n" ] } ], "source": [ "#help prints what the given function does\n", "help(abs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sets and Lists" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'rihanna', 'lady gaga', 'beyonce'}\n", "{'rihanna', 'lady gaga', 'beyonce'} {'lil kim', 'rihanna', 'nicki minaj'}\n", "{'rihanna'}\n" ] } ], "source": [ "#a set is a group of unique items from a list\n", "pop_stars = [\"beyonce\", \"rihanna\", \"lady gaga\", \"lady gaga\"]\n", "\n", "hip_hop_stars = [\"rihanna\", \"nicki minaj\", \"lil kim\"]\n", "\n", "pop = set(pop_stars)\n", "print(pop)\n", "hip_hop = set(hip_hop_stars)\n", "\n", "print(pop, hip_hop)\n", "\n", "#you can perform some set operations. look up the Python \n", "# set documentation an print the intersection between both sets.\n", "\n", "overlap = pop.intersection(hip_hop)\n", "\n", "print(overlap)" ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 2, 3, 5]\n", "5\n", "1\n", "11\n", "4\n" ] } ], "source": [ "#sort a list\n", "\n", "s = sorted([1, 5, 3, 2])\n", "print(s)\n", "\n", "#max and min of a list\n", "print(max(s))\n", "print(min(s))\n", "\n", "#print the sum of a list's elements\n", "\n", "print(sum(s))\n", "\n", "#get length of list\n", "\n", "print(len(s))" ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "2\n", "3\n", "4\n" ] } ], "source": [ "#write a for loop that iterates through each *index* in s and prints the \n", "# index (Hint: combine range() and len())\n", "\n", "test_list = [1, 2, 3, 4, 5]\n", "\n", "for index in range(len(test_list)):\n", " print(index)" ] }, { "cell_type": "code", "execution_count": 85, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 carlos\n", "1 steve\n", "2 joe\n" ] } ], "source": [ "#the enumerate() function gives you the item and the index of a list at the same time\n", "\n", "string_list = [\"carlos\", \"steve\", \"joe\"]\n", "\n", "for i, name in enumerate(string_list):\n", " print(i, name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Some math" ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#let's import some libraries so we can use their functions\n", "import math\n", "import random\n", "#python numerical tools\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 96, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.7928981520871538\n", "5\n", "watermelon\n" ] } ], "source": [ "#generate a random floating point number between 0 and 1\n", "ran = random.random()\n", "print(ran)\n", "\n", "#print a random integer in the given range\n", "random_integer = random.randint(2, 100)\n", "print(random_integer)\n", "\n", "#sample randomly from a list\n", "print(np.random.choice([\"watermelon\", \"mango\", \"pineapple\"], p=[0.5, 0.25, 0.25], replace=False))" ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "22026.465794806718\n", "8.0\n" ] } ], "source": [ "#compute e^(n)\n", "print(math.exp(10))\n", "\n", "#compute x^n\n", "print(math.pow(2,3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### String functions" ] }, { "cell_type": "code", "execution_count": 98, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "I'm. Walt. Disney.\n", "1\t2\t3\n", "[\"I'm\", ' Walt', ' Disney', '']\n" ] } ], "source": [ "# you can remove characters from the end of a string with the strip() function\n", "\n", "disney = \"I'm. Walt. Disney.\"\n", "\n", "print(disney.strip()) #removes the character from the given string (default removes whitespace characters)\n", "\n", "#the join function inserts characters between elements in a list and joins them into a string\n", "\n", "print(\"\\t\".join([\"1\", \"2\", \"3\"]))\n", "\n", "#the opposite of join is the split() function which breaks a string up into a list of sub-strings\n", "\n", "print(disney.split(\".\")) #you can also tell split() which characters to break on\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### File handling\n", "\n", "A very important part of dealing with scientific data is handling files containing your data and loading them into your Python scripts. Thankfully Python also makes this very easy.\n" ] }, { "cell_type": "code", "execution_count": 103, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "food_item, price, quantity\n", "bananas, 1.5, 10\n", "cupcakes, 3, 4\n", "skittles, 2, 200\n", "tacos, 2, 100\n", "chips, 1, 2.5\n" ] } ], "source": [ "#to open a file you just use the open() function along with the 'with' context manager (more on this below)\n", "\n", "#the 'with' block takes care of opening and closing the file, and giving us the lines of the file to iterate over\n", "with open(\"food.csv\", \"r\") as food: # the \"r\" argument tells open() that we want to read the file\n", " for item in food:\n", " print(item.strip()) #let's get rid of the linebreak character" ] }, { "cell_type": "code", "execution_count": 104, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#we can also write to a file\n", "with open(\"helloworld.txt\", \"w+\") as hello:\n", " hello.write(\"Hello, world!\")\n", " \n", "#check to see if the file was created" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Multiprocessing\n", "\n", "Most computers today have multiple processors, meaning you can use these processors simulaneously to make your computations go a lot faster. Default python code is run as a single process. So if you have some work to do that can be split up into independent parts, you can easily implement this with the `multiprocessing` module in Python." ] }, { "cell_type": "code", "execution_count": 106, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Serial job took 24.030616998672485 seconds.\n", "[1, 4, 9, 16, 25, 36, 49, 64]\n" ] } ], "source": [ "import multiprocessing\n", "import time #this module allows us to do some operations involving time.\n", "\n", "MAX_PROC = 4\n", "\n", "def square(x):\n", " time.sleep(3) #let's make it a bit slower by making python sleep for 10 seconds before returning the output\n", " return x*x\n", "\n", "to_do = [1, 2, 3, 4, 5, 6, 7, 8]\n", "\n", "#let's write a loop that squares each element in that list in series\n", "\n", "#record the time at which we start the computation\n", "t_start_serial = time.time() \n", "\n", "squared_serial = []\n", "for i in to_do:\n", " squared_serial.append(square(i))\n", "\n", "#get the difference in time between now and the start time to get total time.\n", "t_total_serial = time.time() - t_start_serial\n", "\n", "print(\"Serial job took %s seconds.\" % (t_total_serial))\n", "print(squared_serial)" ] }, { "cell_type": "code", "execution_count": 107, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parallel job took 6.007381200790405 seconds!\n", "[1, 4, 9, 16, 25, 36, 49, 64]\n" ] } ], "source": [ "#that was slow! now let's do this in parallel\n", "\n", "pool = multiprocessing.Pool(MAX_PROC) #we start a 'pool' of workers that we can send processing jobs to\n", "\n", "t_start_para = time.time()\n", "\n", "squared_para = []\n", "for squared_number in pool.map(square, to_do):\n", " squared_para.append(squared_number) \n", "\n", "t_total_para = time.time() - t_start_para\n", "print(\"Parallel job took %s seconds!\" % (t_total_para))\n", "print(squared_para)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Mini-project\n", "\n", "At this point you should have a pretty good idea of the Python basics and some of the extras. Yet, we are still only scratching the surface of the surface of the iceberg. Python has appliations in pretty much every field of programming and software development. But since we are mainly interested in using it as a tool for data handling let's do a mini data-science project to get an idea of some more data-specific Python capabilities. Here the goal is to be able to load a data-set efficiently and do some nice visualizations. \n", "\n", "The mini project is to take baby name data from the US social security database and try to identify \"Hipster\" names. This example inspired by a Kaggle post (https://www.kaggle.com/ryanburge/d/kaggle/us-baby-names/hipster-names). You can load the original dataset [here](https://www.kaggle.com/kaggle/us-baby-names). \n", "\n", "I filtered and re-arranged the original data to make it easier for us to handle (but trust, me I used Python for that and it was very easy). So you can find the dataset we will use in this exercise in the workshop downloads under the name `BabyNames.csv`\n", "\n", "Here's what the data looks like:\n", "\n", "```\n", "name, 1880, 1881, 1882, .... , 2014\n", "Aaron, 3, 4, 6, 22, 0, ...., 199\n", "Aaliyah, 0, 0, 0, 0, 1, ...., 100\n", "```\n", "\n", "As you can see, each row in the file is a baby name, and each column contains the number of babies with that name for each year this dataset was collected." ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import os\n", "#this is python's main plotting library\n", "import matplotlib.pyplot as plt\n", "\n", "#tell the notebook to make plots appear inline\n", "%matplotlib inline\n", "\n", "plt.rcParams['figure.figsize'] = 10, 10" ] }, { "cell_type": "code", "execution_count": 112, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Name,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014\n", "\n", "Aaliyah,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18.0,40.0,46.0,38.0,39.0,28.0,28.0,20.0,21.0,10.0,18.0,14.0,17.0,14.0,12.0,15.0,25.0,22.0,1457.0,1254.0,831.0,1738.0,1404.0,1088.0,1494.0,3360.0,4786.0,3677.0,3496.0,3465.0,3739.0,3951.0,4038.0,4365.0,4663.0,5104.0,5502.0,5225.0,4855.0\n", "\n", "Aaron,102.0,94.0,85.0,105.0,97.0,88.0,86.0,78.0,90.0,85.0,96.0,69.0,95.0,81.0,79.0,94.0,69.0,87.0,89.0,71.0,103.0,80.0,78.0,93.0,117.0,96.0,96.0,130.0,114.0,142.0,145.0,187.0,303.0,417.0,490.0,553.0,588.0,601.0,663.0,645.0,668.0,697.0,705.0,626.0,682.0,657.0,600.0,552.0,560.0,475.0,506.0,466.0,514.0,463.0,477.0,465.0,443.0,470.0,482.0,471.0,513.0,562.0,574.0,558.0,514.0,485.0,577.0,689.0,710.0,802.0,804.0,879.0,944.0,905.0,981.0,1108.0,1291.0,1351.0,1405.0,1556.0,1794.0,1892.0,2030.0,2088.0,2413.0,2445.0,2618.0,2929.0,3450.0,4647.0,6655.0,8477.0,7924.0,9319.0,10601.0,10671.0,11502.0,11780.0,12471.0,13218.0,13342.0,14838.0,14563.0,14627.0,13532.0,13271.0,12824.0,12820.0,14526.0,15414.0,14633.0,14342.0,14593.0,13936.0,14484.0,13368.0,12047.0,11231.0,10603.0,9901.0,9586.0,9568.0,9039.0,8897.0,8443.0,7824.0,8314.0,8955.0,8559.0,7995.0,7473.0,7627.0,7530.0,7289.0,7357.0\n", "\n", "Abigail,12.0,8.0,14.0,11.0,13.0,9.0,15.0,13.0,18.0,20.0,9.0,11.0,11.0,21.0,13.0,15.0,15.0,15.0,11.0,7.0,14.0,13.0,18.0,20.0,8.0,11.0,15.0,12.0,13.0,12.0,16.0,18.0,24.0,14.0,25.0,38.0,37.0,41.0,26.0,31.0,33.0,24.0,29.0,32.0,31.0,37.0,30.0,33.0,40.0,33.0,25.0,27.0,30.0,32.0,30.0,37.0,36.0,45.0,50.0,53.0,48.0,40.0,48.0,63.0,56.0,53.0,77.0,78.0,72.0,113.0,111.0,137.0,152.0,167.0,148.0,181.0,189.0,188.0,193.0,206.0,228.0,233.0,264.0,255.0,244.0,211.0,190.0,245.0,263.0,281.0,362.0,392.0,395.0,481.0,605.0,614.0,838.0,796.0,1009.0,1226.0,1587.0,1819.0,1892.0,1920.0,1848.0,1859.0,2011.0,2014.0,2382.0,3423.0,3739.0,3810.0,4003.0,5196.0,7252.0,7833.0,8615.0,9633.0,11117.0,11695.0,13103.0,14822.0,15313.0,15941.0,15512.0,15760.0,15638.0,15488.0,15092.0,14392.0,14237.0,13250.0,12675.0,12377.0,11997.0\n", "\n", "Adam,104.0,116.0,114.0,107.0,83.0,96.0,103.0,84.0,120.0,93.0,74.0,87.0,106.0,87.0,86.0,78.0,96.0,88.0,87.0,74.0,111.0,71.0,99.0,82.0,103.0,101.0,105.0,127.0,109.0,113.0,154.0,189.0,307.0,354.0,489.0,574.0,609.0,614.0,653.0,542.0,579.0,588.0,469.0,435.0,464.0,459.0,425.0,389.0,357.0,308.0,274.0,300.0,257.0,235.0,237.0,238.0,216.0,222.0,214.0,216.0,227.0,230.0,241.0,252.0,221.0,209.0,247.0,270.0,244.0,301.0,306.0,297.0,295.0,332.0,282.0,351.0,394.0,434.0,469.0,585.0,1019.0,1581.0,2155.0,2349.0,2867.0,2578.0,2512.0,2537.0,2557.0,2884.0,4341.0,5883.0,5774.0,6879.0,8489.0,8699.0,9992.0,11096.0,13989.0,17163.0,18965.0,20118.0,20209.0,23612.0,24075.0,20278.0,18244.0,17014.0,16535.0,16987.0,14743.0,12320.0,11939.0,11549.0,11053.0,10495.0,9577.0,8817.0,8367.0,8239.0,8149.0,7762.0,7757.0,7705.0,7505.0,6850.0,6801.0,6786.0,6098.0,5669.0,5102.0,5207.0,5303.0,5232.0,5300.0\n", "\n", "Addison,19.0,17.0,21.0,20.0,17.0,17.0,16.0,12.0,20.0,11.0,14.0,10.0,12.0,9.0,20.0,19.0,14.0,8.0,18.0,12.0,11.0,9.0,14.0,15.0,9.0,16.0,7.0,11.0,17.0,13.0,12.0,20.0,33.0,33.0,59.0,62.0,71.0,73.0,76.0,64.0,59.0,78.0,74.0,64.0,58.0,44.0,59.0,65.0,54.0,49.0,57.0,51.0,42.0,41.0,42.0,34.0,35.0,37.0,33.0,37.0,33.0,35.0,40.0,44.0,32.0,26.0,35.0,34.0,25.0,34.0,42.0,40.0,31.0,31.0,41.0,36.0,30.0,33.0,21.0,30.0,32.0,31.0,26.0,30.0,20.0,28.0,26.0,18.0,16.0,27.0,34.0,38.0,28.0,23.0,22.0,28.0,29.0,16.0,25.0,37.0,43.0,25.0,40.0,36.0,44.0,73.0,327.0,324.0,289.0,310.0,319.0,347.0,382.0,481.0,595.0,664.0,778.0,889.0,1041.0,1213.0,1419.0,1586.0,1856.0,2132.0,2484.0,3414.0,8062.0,12284.0,11021.0,10895.0,10509.0,9484.0,8334.0,7848.0,7079.0\n", "\n", "Adrian,18.0,12.0,18.0,14.0,9.0,12.0,17.0,13.0,19.0,16.0,17.0,16.0,18.0,13.0,18.0,18.0,22.0,27.0,17.0,30.0,27.0,29.0,26.0,23.0,30.0,33.0,34.0,31.0,41.0,38.0,42.0,62.0,138.0,164.0,192.0,242.0,253.0,287.0,337.0,295.0,292.0,295.0,290.0,347.0,350.0,284.0,298.0,235.0,242.0,242.0,220.0,233.0,224.0,210.0,232.0,234.0,243.0,247.0,276.0,270.0,266.0,295.0,277.0,258.0,281.0,273.0,338.0,378.0,371.0,415.0,401.0,450.0,469.0,490.0,463.0,519.0,551.0,568.0,542.0,591.0,666.0,741.0,847.0,773.0,947.0,888.0,914.0,1047.0,1189.0,1244.0,1511.0,1737.0,1917.0,1810.0,2013.0,2167.0,2329.0,2534.0,2624.0,2712.0,2737.0,2783.0,2923.0,3022.0,3112.0,3518.0,3248.0,3200.0,3601.0,3722.0,4375.0,4249.0,4166.0,4076.0,4054.0,4139.0,4322.0,4344.0,5674.0,5242.0,5549.0,5613.0,5875.0,6279.0,6306.0,6883.0,7557.0,7911.0,8083.0,7788.0,7558.0,7487.0,7059.0,6951.0,6764.0\n", "\n", "Adriana,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,5.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.0,0.0,5.0,0.0,0.0,0.0,0.0,0.0,6.0,9.0,0.0,5.0,13.0,19.0,13.0,15.0,11.0,12.0,13.0,18.0,16.0,22.0,20.0,20.0,16.0,15.0,16.0,11.0,16.0,21.0,9.0,6.0,23.0,17.0,25.0,17.0,17.0,16.0,23.0,21.0,21.0,24.0,21.0,23.0,21.0,35.0,45.0,33.0,38.0,43.0,46.0,49.0,71.0,53.0,77.0,89.0,77.0,102.0,137.0,148.0,149.0,172.0,217.0,238.0,258.0,283.0,360.0,475.0,458.0,464.0,447.0,490.0,519.0,614.0,683.0,796.0,816.0,938.0,1113.0,1055.0,1195.0,1067.0,977.0,1137.0,1263.0,1224.0,1465.0,2290.0,2167.0,2264.0,2217.0,2085.0,2188.0,2076.0,2109.0,2561.0,2483.0,2309.0,2686.0,2649.0,2392.0,2838.0,2837.0,2709.0,3101.0,2932.0,2724.0,2567.0,2460.0,2318.0,2147.0,2092.0,1869.0\n", "\n", "Agnes,473.0,424.0,565.0,623.0,703.0,695.0,779.0,901.0,1046.0,1033.0,1095.0,1125.0,1333.0,1399.0,1477.0,1466.0,1661.0,1585.0,1708.0,1619.0,1922.0,1534.0,1681.0,1622.0,1672.0,1729.0,1767.0,1842.0,1941.0,1985.0,2176.0,2315.0,2959.0,3217.0,3735.0,4803.0,4861.0,5078.0,5303.0,4907.0,4920.0,4816.0,4488.0,4235.0,4252.0,3927.0,3551.0,3354.0,3033.0,2782.0,2521.0,2312.0,2126.0,1887.0,1942.0,1588.0,1608.0,1428.0,1395.0,1304.0,1200.0,1093.0,1141.0,1054.0,962.0,824.0,868.0,839.0,833.0,729.0,748.0,655.0,626.0,642.0,523.0,563.0,508.0,494.0,418.0,425.0,429.0,396.0,353.0,320.0,278.0,259.0,202.0,193.0,154.0,129.0,120.0,132.0,121.0,94.0,94.0,86.0,65.0,63.0,65.0,71.0,77.0,93.0,69.0,82.0,62.0,67.0,69.0,70.0,76.0,79.0,76.0,67.0,69.0,54.0,58.0,61.0,64.0,47.0,64.0,63.0,68.0,60.0,53.0,62.0,57.0,59.0,68.0,65.0,61.0,81.0,67.0,96.0,122.0,123.0,187.0\n", "\n", "Aidan,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,5.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.0,7.0,9.0,7.0,5.0,7.0,0.0,5.0,7.0,11.0,9.0,12.0,13.0,14.0,8.0,11.0,23.0,13.0,22.0,25.0,17.0,33.0,28.0,38.0,44.0,37.0,38.0,45.0,67.0,86.0,65.0,75.0,97.0,150.0,184.0,307.0,370.0,551.0,1061.0,1163.0,1466.0,1792.0,2348.0,3440.0,4826.0,7143.0,10290.0,10017.0,9912.0,10199.0,8545.0,7816.0,5881.0,4351.0,3762.0,3254.0,2683.0,2285.0\n", "\n" ] } ], "source": [ "# the os module lets us take care of operating system operations. let's use it to specify \n", "# the path to a file for opening\n", "\n", "#let's load the name dataset. Replace the arguments with your own path.\n", "babypath = os.path.join(\"BabyNames.csv\")\n", "\n", "#let's first get an idea of what the lines look like.\n", "\n", "#print the first 10 lines\n", "with open(babypath, \"r\") as b:\n", " for i, line in enumerate(b):\n", " if i < 10:\n", " print(line)\n", " else:\n", " break" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can write a function that stores the information in the file so that we can work with it in Python." ] }, { "cell_type": "code", "execution_count": 113, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#this function reads the file in the given path line by line and returns two thing:\n", "# 1. a dictionary in the form dict['name'] = [0, 33, 110, 3, 0, ...] where the each key is a baby name\n", "# and the value at each key is a list of counts per year\n", "# 2. a list whose elements are the values of the years in the study i.e. [1880, 1881, .., 2014]\n", "\n", "def read_names(file_path):\n", " names_dict = {}\n", " with open(file_path) as f:\n", " for row_number, row_string in enumerate(f):\n", " #get the values of each column into a list (hint: split())\n", " row_info = row_string.split(\",\")\n", " #first we need to check if we're at a header row\n", " if row_number == 0:\n", " #let's store the years so we can use them as labels later \n", " #we split the row_string by the comma since this is a csv file\n", " #and we only keep the entries after the first one since it is just the first column label\n", " #split() and list slicing come in handy here!\n", " \n", " years = row_info[1:]\n", " \n", " #convert each year in the list to an integer\n", " int_years = [int(y.strip()) for y in years]\n", " \n", " #if we're not at a header then we're in the real data. so we need to store counts and baby names\n", " else: \n", " name = row_info[0]\n", " counts = [float(c.strip()) for c in row_info[1:]]\n", " \n", " #make the key-value entry in the dictionary\n", " names_dict[name] = counts\n", " #return a dictionary with all the names and their data, and a list with the years \n", " return names_dict, int_years" ] }, { "cell_type": "code", "execution_count": 114, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[17.0, 19.0, 20.0, 22.0, 13.0, 28.0, 16.0, 20.0, 29.0, 25.0, 17.0, 16.0, 24.0, 26.0, 25.0, 20.0, 30.0, 28.0, 30.0, 36.0, 37.0, 38.0, 37.0, 41.0, 38.0, 58.0, 50.0, 74.0, 56.0, 60.0, 82.0, 69.0, 124.0, 165.0, 210.0, 273.0, 234.0, 298.0, 347.0, 313.0, 431.0, 399.0, 447.0, 434.0, 453.0, 477.0, 506.0, 551.0, 584.0, 570.0, 587.0, 553.0, 534.0, 573.0, 568.0, 565.0, 541.0, 544.0, 598.0, 589.0, 668.0, 621.0, 659.0, 709.0, 699.0, 736.0, 878.0, 1037.0, 1043.0, 1149.0, 1207.0, 1252.0, 1271.0, 1408.0, 1628.0, 1719.0, 1816.0, 1810.0, 1923.0, 1954.0, 2027.0, 2029.0, 2144.0, 2132.0, 2208.0, 2159.0, 2187.0, 2317.0, 2532.0, 2925.0, 3415.0, 3469.0, 3473.0, 3613.0, 3914.0, 3839.0, 3827.0, 3842.0, 3772.0, 4209.0, 4127.0, 4215.0, 4316.0, 3952.0, 3998.0, 4113.0, 4142.0, 4189.0, 4174.0, 4682.0, 5251.0, 5369.0, 5365.0, 5381.0, 5349.0, 5565.0, 5490.0, 5481.0, 5491.0, 6679.0, 6332.0, 6861.0, 6606.0, 6231.0, 6269.0, 6571.0, 6551.0, 6414.0, 6048.0, 5371.0, 4592.0, 4179.0, 4008.0, 3668.0, 3402.0]\n" ] } ], "source": [ "baby_dict, year_list = read_names(babypath)\n", "\n", "#look up your name in the dictionary!\n", "print(baby_dict[\"Carlos\"])" ] }, { "cell_type": "code", "execution_count": 115, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#first let's look for an individual name and plot its popularity trend in time.\n", "\n", "#notice the 'title=' argument. this is known as keyword argument. it is useful for giving a default value to a function\n", "#so in this case the user can decide whether or not he gives the title of the plot. If he/she doesn't then the title\n", "#defaults to \"Plot Title\"\n", "\n", "def name_plot(name, names_dict, year_list, title=\"Plot Title\"):\n", " #we give the matplotlib function plot() the x and y lists that we would like to plot\n", " plt.plot(year_list, baby_dict[name], label=name)\n", " plt.title(title)\n", " plt.xlabel(\"Year\")\n", " plt.ylabel(\"Count\")\n", " \n", " pass\n", " " ] }, { "cell_type": "code", "execution_count": 116, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nrfWxmNWlK6+EAw90UjFbl2ssZh2weHGar3L//TBkSN7RmG0811jMKmjFCpg2DWbNSgnl5z+HffaB\nL3zBScWsOdUwQdKsaj3xBJxxRtrtcdkymD8fjjoqddh7cUmz5rnGYgZcdFEaNlwY3fXGG/Cd76TZ\n9P/4j/D44zB7duqwv+MOJxWz1rjGYp3ej34EkyfDhAlw9tmw224pkZx8Mjz1FGy//dpzvaik2Ya5\n896qzgcfwJ//DIMGwa67piao6dNT/8Zxx2384o733w+XXgrbbgs9esB996U96AcOhPfeg1//GkaP\nTq9v1ll4HksrnFhq11tvpSG8//mfsOOO0NQEb74JEbDfftC1K7zwAvzDP6Q95HfZJV1z2WVwzTXp\n+S22gN6907877ggnnADHHAO9eqVmrIsvhmuvTYlFgoUL4ZRTYKed8v7uzfJVysTipjDL3erVKTF8\n73tw/PHwxz/C0KHpucWLYbPNYNNN0+MnnoCf/QwOPRQ22STVMMaOhSefTOe9805awn7pUnjuuZRE\nzjgj1YK6dk0d7088AX375vbtmtU911gsN4sXw403phpKr15pGO9++7Xt2giYOzclkx12aP3cFSvS\nqK6u/jPKrEVuCmuFE0t1W7QIpk6FW29NNZOjjoKzzkp9Gl08RtEsN04srXBiycfy5SlZHHdc6t94\n4w349rdTx/jQoakj/LHHUi2joSH1kRx/fOpAN7P8ObG0woklHxdckEZTLVkCJ54Iv/89fO5z8NWv\npmTy4oupmWvkSG/Za1aNnFha4cRSeTNmwJFHpjkfq1fDpElpi14vzmhWO5xYWuHEUn5PPQWXXJKS\nyamnpiTypS/Bl7+cd2Rm1lFehNJysWJFGhJ81FEwYgTcdhv065eGAp91Vt7RmVm1cI3FmrV8eVrR\n98gjU5/IW2/Bpz6VJh/+139B//7pvNmzYautPC/ErNa5KawVTiwbr6kJTjopzXpfuRK+9a00I/7v\n/z7NWPewYLP646YwK5vHHku7Io4enWojkyalmsv558PllzupmNmGucZiQJq4+L3vwc03w09/mlb2\nNbPOwzUWK5kVK9LaW0OGpKHCs2Y5qZjZxqmpxCLpk5KekzRH0vl5x1PrCrPi77wT7r4brroKttkm\n76jMrNbVTGKR1AW4EjgaGAacImnPfKMqvcbGxo26fuXK5svfegvuuQeef37tsOHPfQ5+8hO46y7Y\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#let's try out the function. give it a name and the names_df\n", "name_plot(\"Carlos\", baby_dict, year_list, title=\"Carlos Popularity\")\n" ] }, { "cell_type": "code", "execution_count": 117, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# we define a hipster name with the three following criteria. let's say a name is popular if it reaches 1000 babies in \n", "# a given year.\n", "# Criteria:\n", "# * was very popular a long time ago (at least 1000 count between 1915-1930)\n", "# * very unpopular 30 years ago (under 1000 between 1980-2000)\n", "# * popular in recent years (more than 1000 after 2010)\n", "\n", "\n", "def hipster_names(baby_dict, year_list):\n", " \n", " #let's start an emty list to contain all the matching 'hip' names\n", " hip_names = []\n", " \n", " #let's establish the ranges of time to look at\n", " popular_range = range(1915, 1930)\n", " unpopular_range = range(1960, 2000)\n", " recent = 2010\n", " \n", " #get all the baby names so we can check each one\n", " names = baby_dict.keys()\n", "\n", " #we go through each row in the name group\n", " for name in names:\n", " #set some booleans with some initial values that will tell us together if the name is hip\n", " was_popular = False\n", " was_unpopular = True\n", " becoming_popular = False\n", " \n", " #we go through each year in the name\n", " for index, count in enumerate(baby_dict[name]):\n", " \n", " #look up what year we're in with the year_list\n", " current_year = year_list[index]\n", " \n", " #check if the name was popular a long time ago\n", " if current_year in popular_range and count > 1000:\n", " was_popular = True\n", " continue\n", " #check if the year was unpopular recently (find a year where it was popular in the range)\n", " if current_year in unpopular_range and count > 1000:\n", " was_unpopular = False\n", " continue\n", " #check if the name is growing in popularity\n", " if current_year >= recent and count > 1000:\n", " becoming_popular = True\n", " continue\n", "\n", " #combine all the booleans to tell us if the name matches all our criteria. if it does, add it to the list\n", " if was_popular and was_unpopular and becoming_popular:\n", " hip_names.append(name)\n", "\n", " #return the list.\n", " return hip_names" ] }, { "cell_type": "code", "execution_count": 118, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Eleanor', 'Rosalie', 'Clara', 'Oliver', 'Ella', 'Hazel', 'Genevieve', 'Violet', 'Lena', 'Stella']\n" ] } ], "source": [ "#now we just have to call the function hipster_names.\n", "hip_names = hipster_names(baby_dict, year_list)\n", "print(hip_names)" ] }, { "cell_type": "code", "execution_count": 122, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 122, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nO40xT/Upex1rsAvAbRyJhdYdxzvt+A143TEYI1UGYgOeB2qwOtHuB74MzAU2YY0KWgdMjR3rAV4C\ndsS2vqP8pgPFWMnhU4N9XYMcv3uwRg3twqpU+x7/PawRVqXERkJr/E4vfsD3gQCwOfba3AykafxO\n//XX53kPn+/v3368d2+Ofe5tBx49n2N3pvHTuuO42M0DIsDWPp9lS4BUrMEuZViLIKT0eY7WHf2M\n30DXHTrxslJKKaXUMDfUb+kqpZRSSqmPoAmfUkoppdQwpwmfUkoppdQwpwmfUkoppdQwpwmfUkop\npdQwpwmfUkoppdQwpwmfUkqdgIisEZElfX6+IbZShVJKDTk6D59SSp1AbP3Kl7EWOI/DmvR0sTmy\nvFF/fqfdGBMZmDNUSqnTpwmfUkqdhIj8J9CFteJCuzHmP0TkVuBuwAmsNcZ8I3bsr4GpgBt40Rjz\n77HyauA5YDHWKg5/+uSvRCl1vnMM9gkopdQ57BGslr0QMCPW6ncdMMcYExWRX4vITcaYF7DWu2wV\nETuwSkReMcbsiv2eemPM9MG5BKWU0oRPKaVOyhjTJSIvAgFjTK+ILAJmAJtii5bHY63HCvBFEfkK\n1udqNnAR1tqsAC9+wqeulFJH0YRPKaVOLRrbAARYZox5uO8BIlII3APMMMYEROT3WMngIZ2fyJkq\npdRJ6ChdpZQ6fSuBG0VkBICIpIpIHpAMtAMdIpINXD2I56iUUsfRFj6llDpNxpgdIvJDYKWI2IAe\n4E5jzIciUgqUAlXAe32fNginqpRSR9FRukoppZRSw5ze0lVKKaWUGuY04VNKKaWUGuY04VNKKaWU\nGuY04VNKKaWUGuY04VNKKaWUGuY04VNKKaWUGuY04VNKKaWUGuY04VNKKaWUGub+H23ys1x9FXvc\nAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#let's plot the trendlines of each hip name\n", "for n in hip_names:\n", " name_plot(n, baby_dict, year_list, title=\"Hipster Names\")\n", "\n", "#we set the legend, x-axis label, y-axis label, and title of the plot\n", "plt.legend(loc=\"lower left\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Things we didn't cover\n", "\n", "There are many, many, many more useful libraries that I didn't have time to cover. I'm going to list a few of the ones that you might want to check out.\n", "\n", "* [numpy](http://www.numpy.org/) very powerful numerical and matrix operations \n", "* [pandas](http://pandas.pydata.org/) game changer for data handling\n", "* [seaborn](http://seaborn.pydata.org/index.html) scientific plotting \n", "* [scikit-learn](http://scikit-learn.org/stable/) very complete Machine Learning algorithms and tools\n", "* [BioPython](http://biopython.org/wiki/Biopython) biological sequence data and analysis. (alignments, trees, etc.)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 0 }