{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from IPython.display import Image\n", "from IPython.display import clear_output\n", "from IPython.display import FileLink, FileLinks" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "## Introduction to\n", "\n", "![title](img/python-logo-master-flat.png)\n", "\n", "### with Application to Bioinformatics\n", "\n", "#### - Day 4" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Start by doing today's quiz\n", "\n", "Go to Canvas, `Modules -> Day 4 -> Review Day 3`\n", " \n", "~20 minutes\n" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "#### In what ways does the type of an object matter?\n", "- Questions 1, 2 and 3" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The price is a string!\n" ] } ], "source": [ "row = 'sofa|2000|buy|Uppsala'\n", "fields = row.split('|')\n", "price = fields[1]\n", "if price == 2000:\n", " print('The price is a number!')\n", "if price == '2000':\n", " print('The price is a string!')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[30, 100, 2000]\n" ] } ], "source": [ "print(sorted([ 2000, 30, 100 ]))" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['100', '2000', '30']\n" ] } ], "source": [ "print(sorted(['2000', '30', '100']))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "ord('3')" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "#### In what ways does the type of an object matter?\n", "\n", "- Each type store a specific type of information\n", " - `int` for integers,\n", " - `float` for floating point values (decimals),\n", " - `str` for strings,\n", " - `list` for lists,\n", " - `dict` for dictionaries.\n", "\n", "- Each type supports different operations, functions and methods." ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "lines_to_next_cell": 0, "slideshow": { "slide_type": "slide" } }, "source": [ "- Each type supports different **operations**" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "lines_to_next_cell": 0 }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "30 > 2000" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "lines_to_next_cell": 0 }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'30' > '2000'" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "30 > int('2000')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "'12345'[2]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "12345[2]" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "lines_to_next_cell": 0, "slideshow": { "slide_type": "slide" } }, "source": [ "- Each type supports different **functions**" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "lines_to_next_cell": 0 }, "outputs": [ { "data": { "text/plain": [ "'2'" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "max('2000')" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "lines_to_next_cell": 0 }, "outputs": [ { "ename": "TypeError", "evalue": "'int' object is not iterable", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[7], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;43mmax\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m2000\u001b[39;49m\u001b[43m)\u001b[49m\n", "\u001b[0;31mTypeError\u001b[0m: 'int' object is not iterable" ] } ], "source": [ "max(2000)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "lines_to_next_cell": 0, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import math\n", "math.cos(3.14)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "lines_to_next_cell": 0, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "math.cos('3.14')" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "lines_to_next_cell": 0, "slideshow": { "slide_type": "slide" } }, "source": [ "- Each type supports different **methods**" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "lines_to_next_cell": 0 }, "outputs": [ { "data": { "text/plain": [ "'actg'" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'ACTG'.lower()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "ename": "AttributeError", "evalue": "'list' object has no attribute 'lower'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[9], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43m[\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m3\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlower\u001b[49m()\n", "\u001b[0;31mAttributeError\u001b[0m: 'list' object has no attribute 'lower'" ] } ], "source": [ "[1, 2, 3].lower()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "set([]).add('tiger')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "[].add('tiger')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- How to find what methods are available: Python documentation, or `dir()`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dir('ACTG') # list all attributes" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "dir(str) # list all attributes" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "#### Convert string to number\n", "- Questions 4, 5 and 6\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2000.0" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "float('2000')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "float('0.5')" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1000000000.0" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "float('1e9')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "lines_to_next_cell": 2, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "float('1e-2')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "int('2000')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "int('1.5')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "lines_to_next_cell": 2, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "int('1e9')" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "#### Convert to boolean: `1`, `0`, `'1'`, `'0'`, `''`, `{}`\n", "- Question 7\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "lines_to_next_cell": 0, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "bool(1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "lines_to_next_cell": 0, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "bool(0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "lines_to_next_cell": 0, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "bool('0')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "lines_to_next_cell": 0, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "bool('')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "lines_to_next_cell": 0, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "bool([])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "bool({})" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "skip" } }, "source": [ "- Python and the truth: true and false values" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "lines_to_next_cell": 2 }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 is true!\n", "0 is false!\n", "'' is false!\n", "'0' is true!\n", "'1' is true!\n", "[] is false!\n", "[0] is true!\n" ] } ], "source": [ "values = [1, 0, '', '0', '1', [], [0]]\n", "for x in values:\n", " if x:\n", " print(repr(x), 'is true!')\n", " else:\n", " print(repr(x), 'is false!')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- `if x` is equivalent to `if bool(x)`" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "- Is `1` equivalent to `True`?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "lines_to_next_cell": 2, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "1 == True" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "lines_to_next_cell": 2, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "x = 1\n", "if x is True:\n", " print(repr(x), 'is true!')\n", "else:\n", " print(repr(x), 'is false!')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "lines_to_next_cell": 2, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "x = 1\n", "if bool(x) is True:\n", " print(repr(x), 'is true!')\n", "else:\n", " print(repr(x), 'is false!')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "- Be careful: `if x is True` is **not** equivalent to `if bool(x) is True`" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "#### Container types, when should you use which? (Question 8)\n", "\n", "- **lists**: when order is important\n", "- **dictionaries**: to keep track of the relation between keys and values\n", "- **sets**: to check for membership. No order, no duplicates." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "lines_to_next_cell": 0 }, "outputs": [ { "data": { "text/plain": [ "['comedy', 'drama', 'drama', 'sci-fi']" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "genre_list = [\"comedy\", \"drama\", \"drama\", \"sci-fi\"]\n", "genre_list" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "lines_to_next_cell": 0 }, "outputs": [ { "data": { "text/plain": [ "{'comedy', 'drama', 'sci-fi'}" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "genres = set(genre_list)\n", "genres" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'drama' in genre_list\n", "'drama' in genres\n", "# which operation is faster?" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "lines_to_next_cell": 0, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "{'comedy': 1, 'drama': 2, 'sci-fi': 1}" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "genre_counts = {\"comedy\": 1, \"drama\": 2, \"sci-fi\": 1}\n", "genre_counts" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'rating': 10.0, 'title': 'Toy Story'}" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "movie = {\"rating\": 10.0, \"title\": \"Toy Story\"}\n", "movie" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "#### Python syntax (Question 9)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def echo(message): # starts a new function definition\n", " # this function echos the message \n", " print(message) # print state of the variable\n", " return message # return the value to end the function\n" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "#### Converting between strings and lists\n", "- Question 10" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['h', 'e', 'l', 'l', 'o']" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(\"hello\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "str(['h', 'e', 'l', 'l', 'o'])" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'h_e_l_l_o'" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'_'.join('hello')" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### TODAY\n", "\n", "- More on functions:\n", " - scope of variables\n", " - positional arguments and keyword arguments\n", " - `return` statement\n", "- Reusing code:\n", " - comments and documentation\n", " - importing modules: using libraries\n", "- Pandas - explore your data!\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### More on functions: scope - global vs local variables\n", "- Global variables can be accessed inside the function" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "HOST inside the function = global\n", "HOST outside the function = global\n" ] } ], "source": [ "HOST = 'global'\n", "\n", "def show_host():\n", " print(f'HOST inside the function = {HOST}')\n", "\n", "show_host()\n", "print(f'HOST outside the function = {HOST}')\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "- Change in the function will not change the global variable" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "HOST outside the function before change = global\n", "HOST inside the function = local\n", "HOST outside the function after change = global\n", "global\n" ] } ], "source": [ "HOST = 'global'\n", "\n", "def change_host():\n", " HOST = 'local'\n", " print(f'HOST inside the function = {HOST}')\n", "def app2():\n", " print(HOST)\n", "print(f'HOST outside the function before change = {HOST}')\n", "change_host()\n", "print(f'HOST outside the function after change = {HOST}')\n", "app2()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "- Pass global variable as argument" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "HOST = 'global'\n", "\n", "def change_host(HOST):\n", " HOST = 'local'\n", " print(f'HOST inside the function = {HOST}')\n", "\n", "print(f'HOST outside the function before change = {HOST}')\n", "change_host(HOST)\n", "print(f'HOST outside the function after change = {HOST}')\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "### More on functions: scope - global vs local variables cont.\n", "List as global variables\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "MOVIES = ['Toy story', 'Home alone']\n", "\n", "def change_movie():\n", " MOVIES = ['Fargo', 'The Usual Suspects']\n", " print(f'MOVIES inside the function = {MOVIES}')\n", "\n", "print(f'MOVIES outside the function before change = {MOVIES}')\n", "change_movie()\n", "print(f'MOVIES outside the function after change = {MOVIES}')\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Will the global variable never to changed by function?" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "MOVIES outside the function before change = ['Toy story', 'Home alone']\n", "MOVIES inside the function = ['Toy story', 'Home alone', 'Fargo', 'The Usual Suspects']\n", "MOVIES outside the function after change = ['Toy story', 'Home alone', 'Fargo', 'The Usual Suspects']\n" ] } ], "source": [ "MOVIES = ['Toy story', 'Home alone']\n", "\n", "def change_movie():\n", " MOVIES.extend(['Fargo', 'The Usual Suspects'])\n", " print(f'MOVIES inside the function = {MOVIES}')\n", "\n", "print(f'MOVIES outside the function before change = {MOVIES}')\n", "change_movie()\n", "print(f'MOVIES outside the function after change = {MOVIES}')\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Take away: be careful when using global variables. Do not use it unless you know what you are doing." ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "lines_to_next_cell": 1, "slideshow": { "slide_type": "slide" } }, "source": [ "### More on functions: `return` statement\n", "A function that counts the number of occurences of `'C'` in the argument string." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "lines_to_next_cell": 1 }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2 \n", " 0\n" ] } ], "source": [ "def cytosine_count(nucleotides):\n", " count = 0\n", " for x in nucleotides:\n", " if x == 'c' or x == 'C':\n", " count += 1\n", " return count\n", "\n", "count1 = cytosine_count('CATATTAC')\n", "count2 = cytosine_count('tagtag')\n", "print(count1, \"\\n\", count2)" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "Functions that `return` are easier to repurpose than those that `print` their result" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "lines_to_next_cell": 1 }, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cytosine_count('catattac') + cytosine_count('tactactac')" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n", "0\n" ] } ], "source": [ "def print_cytosine_count(nucleotides):\n", " count = 0\n", " for x in nucleotides:\n", " if x == 'c' or x == 'C':\n", " count += 1\n", " print(count)\n", "\n", "print_cytosine_count('CATATTAC')\n", "print_cytosine_count('tagtag')" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n", "3\n" ] }, { "ename": "TypeError", "evalue": "unsupported operand type(s) for +: 'NoneType' and 'NoneType'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[27], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mprint_cytosine_count\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mcatattac\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mprint_cytosine_count\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mtactactac\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n", "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for +: 'NoneType' and 'NoneType'" ] } ], "source": [ "print_cytosine_count('catattac') + print_cytosine_count('tactactac')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "- Functions without any `return` statement returns `None`\n" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Return value of foo() = None\n" ] } ], "source": [ "def foo():\n", " do_nothing = 1\n", "\n", "result = foo()\n", "print(f'Return value of foo() = {result}')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Use `return` for all values that you might want to use later in your program" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Small detour: Python's value for missing values: `None`\n", "\n", "- Default value for optional arguments\n", "- Implicit return value of functions without a `return` statement\n", "- `None` is `None`, not anything else" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "None == 0" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "None == False" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "None == ''" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bool(None)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "NoneType" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(None)" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Keyword arguments\n" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "fh = open('../files/fruits.txt', mode='w', encoding='utf-8'); fh.close()" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[100, 6, 5, 4, 1]" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sorted([1, 4, 100, 5, 6], reverse=True)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Why do we use keyword arguments?" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['gene_id', 'INSR', '\"insulin receptor\"']" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "record = 'gene_id INSR \"insulin receptor\"'\n", "\n", "record.split(' ', 2)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "['gene_id', 'INSR', '\"insulin receptor\"']" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "record.split(sep=' ', maxsplit=2)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* It increases the clarity and readability" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### The order of keyword arguments does not matter" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "fh = open('../files/fruits.txt', mode='w', encoding='utf-8'); fh.close()" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "fh = open('../files/fruits.txt', encoding='utf-8', mode='w'); fh.close()" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Can be used in both ways, with or without keyword \n", "- if there is no ambiguity" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "fh = open('../files/fruits.txt', 'w', encoding='utf-8'); fh.close()" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "fh = open('../files/fruits.txt', mode='w', encoding='utf-8'); fh.close()" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### But there are some exceptions " ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "ename": "SyntaxError", "evalue": "positional argument follows keyword argument (986095044.py, line 1)", "output_type": "error", "traceback": [ "\u001b[0;36m Cell \u001b[0;32mIn[42], line 1\u001b[0;36m\u001b[0m\n\u001b[0;31m fh = open('files/recipes.txt', encoding='utf-8', 'w'); fh.close()\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m positional argument follows keyword argument\n" ] } ], "source": [ "fh = open('files/recipes.txt', encoding='utf-8', 'w'); fh.close()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Positional arguments must be in front of keyword arguments" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Restrictions by purpose" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[100, 6, 5, 4, 1]" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sorted([1, 4, 100, 5, 6], reverse=True)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "sorted expected 1 argument, got 2", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[44], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;43msorted\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m4\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m100\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m5\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m6\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n", "\u001b[0;31mTypeError\u001b[0m: sorted expected 1 argument, got 2" ] } ], "source": [ "sorted([1, 4, 100, 5, 6], True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "sorted(iterable, /, *, key=None, reverse=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- arguments before `/` must be specified with position\n", "- arguments after `*` must be specified with keyword" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "lines_to_next_cell": 1, "slideshow": { "slide_type": "slide" } }, "source": [ "### How to define functions taking keyword arguments\n", "\n", "- Just define them as usual:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The lecture is ongoing.\n" ] }, { "ename": "TypeError", "evalue": "format_sentence() got multiple values for argument 'value'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[45], line 6\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mThe \u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m+\u001b[39m subject \u001b[38;5;241m+\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m is \u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m+\u001b[39m value \u001b[38;5;241m+\u001b[39m end\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28mprint\u001b[39m(format_sentence(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlecture\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mongoing\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m'\u001b[39m))\n\u001b[0;32m----> 6\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[43mformat_sentence\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mlecture\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m!\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mongoing\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m)\n\u001b[1;32m 8\u001b[0m \u001b[38;5;28mprint\u001b[39m(format_sentence(subject\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlecture\u001b[39m\u001b[38;5;124m'\u001b[39m, value\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mongoing\u001b[39m\u001b[38;5;124m'\u001b[39m, end\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m...\u001b[39m\u001b[38;5;124m'\u001b[39m))\n", "\u001b[0;31mTypeError\u001b[0m: format_sentence() got multiple values for argument 'value'" ] } ], "source": [ "def format_sentence(subject, value = 13, end = \"....\"):\n", " return 'The ' + subject + ' is ' + value + end\n", "\n", "print(format_sentence('lecture', 'ongoing', '.'))\n", "\n", "print(format_sentence('lecture', '!', value='ongoing'))\n", "\n", "print(format_sentence(subject='lecture', value='ongoing', end='...'))" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "lines_to_next_cell": 1, "slideshow": { "slide_type": "slide" } }, "source": [ "### Defining functions with default arguments" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The lecture is ongoing...\n" ] } ], "source": [ "def format_sentence(subject, value, end='.'):\n", " return 'The ' + subject + ' is ' + value + end\n", "\n", "#print(format_sentence('lecture', 'ongoing'))\n", "\n", "print(format_sentence('lecture', 'ongoing', '...'))" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "lines_to_next_cell": 1, "slideshow": { "slide_type": "slide" } }, "source": [ "### Defining functions with optional arguments\n", "\n", "- Convention: use the object `None`" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The lecture is ongoing.\n", "The lecture is ongoing and self-referential!\n" ] } ], "source": [ "def format_sentence(subject, value, end='.', second_value=None):\n", " if second_value is None:\n", " return 'The ' + subject + ' is ' + value + end\n", " else:\n", " return 'The ' + subject + ' is ' + value + ' and ' + second_value + end\n", "\n", "print(format_sentence('lecture', 'ongoing'))\n", "\n", "print(format_sentence('lecture', 'ongoing', second_value='self-referential', end='!'))" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "skip" } }, "source": [ "#### Comparing `None`\n", "\n", "- To differentiate `None` to the other false values such as `0`, `False` and `''` use `is None`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "counts = {'drama': 2, 'romance': 0}\n", "\n", "counts.get('romance'), counts.get('thriller')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "counts.get('romance') is None" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "counts.get('thriller') is None" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "skip" } }, "source": [ "- Python and the truth, take two" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "lines_to_next_cell": 2, "scrolled": true, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "values = [None, 1, 0, '', '0', '1', [], [0]]\n", "for x in values:\n", " if x is None:\n", " print(repr(x), 'is None')\n", " if not x:\n", " print(repr(x), 'is false')\n", " if x:\n", " print(repr(x), 'is true')" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Exercise 1\n", "\n", "- Notebook Day_4_Exercise_1 (~30 minutes)\n", "- Go to Canvas, `Modules -> Day 4 -> Exercise 1 - day 4`\n", "\n", "\n", "- Extra reading:\n", " - https://realpython.com/python-kwargs-and-args/\n", " - https://able.bio/rhett/python-functions-and-best-practices--78aclaa\n" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### A short note on code structure\n", "\n", "- Functions\n", " - e.g. sum(), print(), open()\n", "- Modules\n", " - files containing a collection of functions and methods, e.g. string.py \n", "- Documentation\n", " - docstring, comments" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Why functions?\n", "- Cleaner code\n", "- Better defined tasks in code\n", "- Re-usability\n", "- Better structure" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Why modules?\n", "\n", "- Cleaner code\n", "- Better defined tasks in code\n", "- Re-usability\n", "- Better structure" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "fragment" } }, "source": [ "- Collect all related functions in one file\n", "- Import a module to use its functions\n", "- Only need to understand what the functions do, not how" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Example of modules" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'-f'" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import sys\n", "\n", "sys.argv[1]" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2024-11-14 14:43:47.521944\n" ] } ], "source": [ "from datetime import datetime\n", "print(datetime.now())" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "import os\n", "\n", "os.system(\"ls\")" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### How to find the right module and instructions?\n", "\n", "- Look at the [module index](https://docs.python.org/3/py-modindex.html) for Python standard modules\n", "- Search [PyPI](http://pypi.org)\n", "- Search https://www.w3schools.com/python/\n", "- Ask your colleagues\n", "- Search the web\n", "- Use ChatGPT" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Standard modules: no installation needed\n", "- Other libraries: install with `pip install` or `conda install`" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### How to understand it?\n", "- E.g. I want to know how to split a string by the separator `,`" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "text = 'Programming,is,cool'" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on built-in function split:\n", "\n", "split(sep=None, maxsplit=-1) method of builtins.str instance\n", " Return a list of the words in the string, using sep as the delimiter string.\n", " \n", " sep\n", " The delimiter according which to split the string.\n", " None (the default value) means split according to any whitespace,\n", " and discard empty strings from the result.\n", " maxsplit\n", " Maximum number of splits to do.\n", " -1 (the default value) means no limit.\n", "\n" ] } ], "source": [ "help(text.split)" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "['Programming', 'is', 'cool']" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "text.split(sep=',')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "#### For slightly more complicated problems\n", "- e.g. how to download Python logo from internet with `urllib`, given the URL https://www.python.org/static/img/python-logo@2x.png" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on package urllib:\n", "\n", "NAME\n", " urllib\n", "\n", "MODULE REFERENCE\n", " https://docs.python.org/3.9/library/urllib\n", " \n", " The following documentation is automatically generated from the Python\n", " source files. It may be incomplete, incorrect or include features that\n", " are considered implementation detail and may vary between Python\n", " implementations. When in doubt, consult the module reference at the\n", " location listed above.\n", "\n", "PACKAGE CONTENTS\n", " error\n", " parse\n", " request\n", " response\n", " robotparser\n", "\n", "FILE\n", " /Users/kostas/opt/miniconda3/envs/python-workshop-teacher/lib/python3.9/urllib/__init__.py\n", "\n", "\n" ] } ], "source": [ "import urllib\n", "\n", "help(urllib)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Probably easier to find the answer by searching the web or using ChatGPT" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### One minute exercise \n", "- get help from ChatGPT (https://chat.openai.com/)\n", "\n", "Using Python to download the Python logo from internet with urllib\n", "providing the url as https://www.python.org/static/img/python-logo@2x.png" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "import urllib.request\n", "\n", "url = \"https://www.python.org/static/img/python-logo@2x.png\"\n", "filename = \"python-logo.png\" # The name you want to give to the downloaded file\n", "\n", "urllib.request.urlretrieve(url, filename)\n", "\n", "print(\"Download completed.\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "help(math.sqrt)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "math.sqrt(3)" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "skip" } }, "source": [ "### Various ways of importing" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import math\n", "\n", "math.sqrt(3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import math as m\n", "m.sqrt(3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from math import sqrt\n", "sqrt(3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from pprint import pprint" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Documentation and commenting your code\n" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "def process_file(filename, chrom, pos):\n", " \"\"\"\n", " Read a very large vcf file, search for lines matching\n", " chromosome chrom and position pos.\n", "\n", " Print the genotypes of the matching lines.\n", " \"\"\"\n", " for line in open(filename):\n", " if not line.startswith('#'):\n", " col = line.split('\\t')\n", " if col[0] == chrom and int(col[1]) == pos:\n", " print(col[9:])" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on function process_file in module __main__:\n", "\n", "process_file(filename, chrom, pos)\n", " Read a very large vcf file, search for lines matching\n", " chromosome chrom and position pos.\n", " \n", " Print the genotypes of the matching lines.\n", "\n" ] } ], "source": [ "help(process_file)" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "fragment" } }, "source": [ "- This works because somebody has documented the code!" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Your code may have two types of users:\n", "\n", "- library users\n", "- maintainers (maybe yourself!)" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "fragment" } }, "source": [ "### Write documentation for both of them!\n", "\n", "- library users (docstrings):\n", " ```python\n", " \"\"\"\n", " What does this function do?\n", " \"\"\"\n", " ```\n", "- maintainers (comments):\n", " ```python\n", " # implementation details\n", " ```" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Places for documentation" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''" }, "source": [ "- At the beginning of the file\n", "\n", " ```python\n", " \"\"\"\n", " This module provides functions for ...\n", " \"\"\"\n", " ```" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''" }, "source": [ "- At every function definition" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "import random\n", "def make_list(x):\n", " \"\"\"Returns a random list of length x.\"\"\"\n", " li = list(range(x))\n", " random.shuffle(li)\n", " return li" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Comments" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''" }, "source": [ " - Wherever the code is hard to understand\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "my_list[5] += other_list[3] # explain why you do this!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "### Demo: write a Python script with documentation and use it" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from files import mywork\n", "mywork.pipeline([\"accctt\", \"gaccct\"])" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Read more:\n", "\n", "https://realpython.com/documenting-python-code/\n", "\n", "https://www.python.org/dev/peps/pep-0008/?#comments" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Quiz time\n", "\n", "Go to Canvas, `Modules -> Day 4 -> PyQuiz 4.1`\n", "\n", "~10 min" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Lunch" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "title = 'Toy Story'\n", "rating = 10\n", "print('The result is: ' + title + ' with rating: ' + str(rating))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "# f-strings (since python 3.6)\n", "print(f'The result is: {title} with rating: {rating}')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "# format method\n", "print('The result is: {} with rating: {}'.format(title, rating))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "# the ancient way (python 2)\n", "print('The result is: %s with rating: %s' % (title, rating))" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "skip" } }, "source": [ "Learn more from the Python docs: https://docs.python.org/3.9/library/string.html#format-string-syntax" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "skip" } }, "source": [ "#### Exercise 2 (??) wrong example?\n", "\n", "\n", "```py\n", "pick_movie(year=1996, rating_min=8.5)\n", "The Bandit\n", "pick_movie(rating_max=8.0, genre=\"Mystery\")\n", "Twelve Monkeys\n", "```\n", "\n", "- Notebook Day_4_Exercise_2" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "skip" } }, "source": [ "#### Exercise 2\n", "\n", "\n", "Documentation\n", "\n", "- Notebook Day_4_Exercise_2" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Pandas!!!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Pandas\n", "- Library for working with tabular data\n", "- Data analysis: \n", " - filter\n", " - transform\n", " - aggregate\n", " - plot\n", "- Main hero: the `DataFrame` type" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### DataFrame " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "![01_table_dataframe1](img/01_table_dataframe1.png)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Creating a small DataFrame" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agecircumferenceheight
01230
12335
23540
341050
\n", "
" ], "text/plain": [ " age circumference height\n", "0 1 2 30\n", "1 2 3 35\n", "2 3 5 40\n", "3 4 10 50" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "data = {\n", " 'age': [1,2,3,4],\n", " 'circumference': [2,3,5,10],\n", " 'height': [30, 35, 40, 50]\n", "}\n", "df = pd.DataFrame(data)\n", "df" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "# add row index\n", "row_index = [\"tree1\", \"tree2\", \"tree3\", \"tree4\"]\n", "df = df.set_index(pd.Index(row_index))\n", "help(pd.Index)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Pandas can import data from many formats\n", "\n", "- `pd.read_table`: tab separated values `.tsv`\n", "- `pd.read_csv`: comma separated values `.csv`\n", "- `pd.read_excel`: Excel spreadsheets `.xlsx`\n", "\n", "- For a data frame `df`: `df.to_table()`, `df.to_csv()`, `df.to_excel()`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![test](img/02_io_readwrite.png)" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "#### Orange tree data" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "lines_to_next_cell": 2, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agecircumferenceheight
01230
12335
23540
341050
\n", "
" ], "text/plain": [ " age circumference height\n", "0 1 2 30\n", "1 2 3 35\n", "2 3 5 40\n", "3 4 10 50" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_table('../downloads/Orange_1.tsv')\n", "df" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "fragment" } }, "source": [ "- One implict index (0, 1, 2, 3)\n", "- Columns: `age`, `circumference`, `height`\n", "- Rows: one per data point, identified by their index" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Read data from Excel file" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agecircumferenceheight
01230
12335
23540
341050
\n", "
" ], "text/plain": [ " age circumference height\n", "0 1 2 30\n", "1 2 3 35\n", "2 3 5 40\n", "3 4 10 50" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2 = pd.read_excel('../downloads/Orange_1.xlsx')\n", "df2" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Overview of your data, basic statistics" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agecircumferenceheight
01230
12335
23540
341050
\n", "
" ], "text/plain": [ " age circumference height\n", "0 1 2 30\n", "1 2 3 35\n", "2 3 5 40\n", "3 4 10 50" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "(4, 3)" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.shape" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agecircumferenceheight
count4.0000004.0000004.000000
mean2.5000005.00000038.750000
std1.2909943.5590268.539126
min1.0000002.00000030.000000
25%1.7500002.75000033.750000
50%2.5000004.00000037.500000
75%3.2500006.25000042.500000
max4.00000010.00000050.000000
\n", "
" ], "text/plain": [ " age circumference height\n", "count 4.000000 4.000000 4.000000\n", "mean 2.500000 5.000000 38.750000\n", "std 1.290994 3.559026 8.539126\n", "min 1.000000 2.000000 30.000000\n", "25% 1.750000 2.750000 33.750000\n", "50% 2.500000 4.000000 37.500000\n", "75% 3.250000 6.250000 42.500000\n", "max 4.000000 10.000000 50.000000" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe()" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "age 4\n", "circumference 10\n", "height 50\n", "dtype: int64" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.max()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Selecting columns from a dataframe\n", "```py\n", "dataframe.columnname\n", "dataframe['columnname']\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![03_subset_columns](img/03_subset_columns.png)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Selecting one column" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agecircumferenceheight
01230
12335
23540
341050
\n", "
" ], "text/plain": [ " age circumference height\n", "0 1 2 30\n", "1 2 3 35\n", "2 3 5 40\n", "3 4 10 50" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "0 1\n", "1 2\n", "2 3\n", "3 4\n", "Name: age, dtype: int64" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_new = df.age\n", "df_new " ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "0 1\n", "1 2\n", "2 3\n", "3 4\n", "Name: age, dtype: int64" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['age']" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Selecting multiple columns" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agecircumferenceheight
01230
12335
23540
341050
\n", "
" ], "text/plain": [ " age circumference height\n", "0 1 2 30\n", "1 2 3 35\n", "2 3 5 40\n", "3 4 10 50" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ageheight
0130
1235
2340
3450
\n", "
" ], "text/plain": [ " age height\n", "0 1 30\n", "1 2 35\n", "2 3 40\n", "3 4 50" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[['age', 'height']]" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
heightage
0301
1352
2403
3504
\n", "
" ], "text/plain": [ " height age\n", "0 30 1\n", "1 35 2\n", "2 40 3\n", "3 50 4" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[['height', 'age']]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Selecting rows from a dataframe" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agecircumferenceheight
01230
12335
23540
341050
\n", "
" ], "text/plain": [ " age circumference height\n", "0 1 2 30\n", "1 2 3 35\n", "2 3 5 40\n", "3 4 10 50" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "age 1\n", "circumference 2\n", "height 30\n", "Name: 0, dtype: int64" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[0] # select the first row" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agecircumferenceheight
12335
23540
341050
\n", "
" ], "text/plain": [ " age circumference height\n", "1 2 3 35\n", "2 3 5 40\n", "3 4 10 50" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[1:3] # select from row 2 to 4" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agecircumferenceheight
12335
341050
01230
\n", "
" ], "text/plain": [ " age circumference height\n", "1 2 3 35\n", "3 4 10 50\n", "0 1 2 30" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[[1, 3, 0]] # select row 2, 4 and 1" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Selecting cells from a dataframe " ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agecircumferenceheight
01230
12335
23540
341050
\n", "
" ], "text/plain": [ " age circumference height\n", "0 1 2 30\n", "1 2 3 35\n", "2 3 5 40\n", "3 4 10 50" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
age
01
\n", "
" ], "text/plain": [ " age\n", "0 1" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[[0], ['age']]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Run statistics on specific rows, columns, cells" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agecircumference
count4.0000004.000000
mean2.5000005.000000
std1.2909943.559026
min1.0000002.000000
25%1.7500002.750000
50%2.5000004.000000
75%3.2500006.250000
max4.00000010.000000
\n", "
" ], "text/plain": [ " age circumference\n", "count 4.000000 4.000000\n", "mean 2.500000 5.000000\n", "std 1.290994 3.559026\n", "min 1.000000 2.000000\n", "25% 1.750000 2.750000\n", "50% 2.500000 4.000000\n", "75% 3.250000 6.250000\n", "max 4.000000 10.000000" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[['age', 'circumference']].describe()" ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "1.2909944487358056" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['age'].std()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "df.loc[1:10]" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Selecting data from a dataframe by index\n", "```py\n", "dataframe.iloc[index]\n", "dataframe.iloc[start:stop]\n", "```\n", "Further reading from pandas documentation: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.iloc.html" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df\n", "#df.iloc[:,0] # Show the first column\n", "#df.iloc[1] # Show the second row\n", "df.iloc[1,0] # Show the cell of the second row and the first column (you get number without index)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Creating new column derived from existing column" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![05_newcolumn_1](img/05_newcolumn_1.png)" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agecircumferenceheightradius
012300.318310
123350.477465
235400.795775
3410501.591549
\n", "
" ], "text/plain": [ " age circumference height radius\n", "0 1 2 30 0.318310\n", "1 2 3 35 0.477465\n", "2 3 5 40 0.795775\n", "3 4 10 50 1.591549" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import math\n", "df['radius'] = df['circumference'] / (2.0 * math.pi)\n", "df" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "![03_subset_rows](img/03_subset_rows.png)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Expand dataframe by concatenating " ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agecircumferenceheight
01230
12335
23540
341050
\n", "
" ], "text/plain": [ " age circumference height\n", "0 1 2 30\n", "1 2 3 35\n", "2 3 5 40\n", "3 4 10 50" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1 = pd.DataFrame({\n", " 'age': [1,2,3,4],\n", " 'circumference': [2,3,5,10],\n", " 'height': [30, 35, 40, 50]\n", "})\n", "\n", "df1" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nameprice
0palm1423
1ada2000
2ek102
3olive30
\n", "
" ], "text/plain": [ " name price\n", "0 palm 1423\n", "1 ada 2000\n", "2 ek 102\n", "3 olive 30" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2 = pd.DataFrame({\n", " 'name': ['palm', 'ada', 'ek', 'olive'],\n", " 'price': [1423, 2000, 102, 30]\n", "})\n", "\n", "df2" ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namepriceagecircumferenceheight
0palm1423.0NaNNaNNaN
1ada2000.0NaNNaNNaN
2ek102.0NaNNaNNaN
3olive30.0NaNNaNNaN
4NaNNaN1.02.030.0
5NaNNaN2.03.035.0
6NaNNaN3.05.040.0
7NaNNaN4.010.050.0
\n", "
" ], "text/plain": [ " name price age circumference height\n", "0 palm 1423.0 NaN NaN NaN\n", "1 ada 2000.0 NaN NaN NaN\n", "2 ek 102.0 NaN NaN NaN\n", "3 olive 30.0 NaN NaN NaN\n", "4 NaN NaN 1.0 2.0 30.0\n", "5 NaN NaN 2.0 3.0 35.0\n", "6 NaN NaN 3.0 5.0 40.0\n", "7 NaN NaN 4.0 10.0 50.0" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat([df2, df1], axis=0).reset_index(drop=True)\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Selecting/filtering the dataframe by condition\n", "e.g. \n", "* Only trees with age larger than 100 \n", "* Only tree with circumference shorter than 20" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Slightly bigger data frame of orange trees " ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Treeagecircumference
0111830
1148458
2166487
\n", "
" ], "text/plain": [ " Tree age circumference\n", "0 1 118 30\n", "1 1 484 58\n", "2 1 664 87" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_table('../downloads/Orange.tsv')\n", "df.head(3) # can also use .head()" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 2, 3])" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.Tree.unique()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Selecting with condition" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Treeagecircumference
0111830
1148458
2166487
311004115
411231120
511372142
611582145
\n", "
" ], "text/plain": [ " Tree age circumference\n", "0 1 118 30\n", "1 1 484 58\n", "2 1 664 87\n", "3 1 1004 115\n", "4 1 1231 120\n", "5 1 1372 142\n", "6 1 1582 145" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df['Tree'] == 1]" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Treeagecircumference
2166487
311004115
411231120
511372142
611582145
92664111
1021004156
1121231172
1221372203
1321582203
16366475
1731004108
1831231115
1931372139
2031582140
\n", "
" ], "text/plain": [ " Tree age circumference\n", "2 1 664 87\n", "3 1 1004 115\n", "4 1 1231 120\n", "5 1 1372 142\n", "6 1 1582 145\n", "9 2 664 111\n", "10 2 1004 156\n", "11 2 1231 172\n", "12 2 1372 203\n", "13 2 1582 203\n", "16 3 664 75\n", "17 3 1004 108\n", "18 3 1231 115\n", "19 3 1372 139\n", "20 3 1582 140" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df.age > 500]" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Treeagecircumference
2166487
16366475
\n", "
" ], "text/plain": [ " Tree age circumference\n", "2 1 664 87\n", "16 3 664 75" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[(df.age > 500) & (df.circumference < 100) ]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "type(pd.DataFrame({\"genre\": ['Thriller', 'Drama'], \"rating\": [10, 9]}).rating.iloc[0])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "#young = df[df.age < 200]\n", "#young\n", "df[df.age < 1000]" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Small exercise 1\n", "* Find the maximal circumference and then filter the data frame by it" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Treeagecircumference
1221372203
1321582203
\n", "
" ], "text/plain": [ " Tree age circumference\n", "12 2 1372 203\n", "13 2 1582 203" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df\n", "max_c=df.circumference.max()\n", "max_c\n", "df[df.circumference==max_c]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "max_c = df.circumference.max()\n", "print(max_c)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "df[df.circumference == max_c]" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "skip" } }, "source": [ "### Filter with multiple conditions" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "df[(df.age > 100) & (df.age <= 250)]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Small exercise 2\n", "\n", "Here's a dictionary of students and their grades:\n", "```\n", "students = {'student': ['bob', 'sam', 'joe'], 'grade': [1, 3, 4]}\n", "```\n", "Use Pandas to:\n", "- create a dataframe with this information\n", "- get the mean value of the grades" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.6666666666666665" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "students = {'student': ['bob', 'sam', 'joe'], 'grade': [1, 3, 4]}\n", "\n", "ds=pd.DataFrame(students)\n", "\n", "ds.grade.mean()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "students = {'student': ['bob', 'sam', 'joe'], 'grade': [1, 3, 4]}\n", "\n", "df = pd.DataFrame(students)\n", "\n", "df.grade.mean()\n", "# df['grade'].mean()" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Plotting\n", "```py\n", "df.columnname.plot()\n", "```" ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agecircumferenceheight
01230
12335
23540
341050
\n", "
" ], "text/plain": [ " age circumference height\n", "0 1 2 30\n", "1 2 3 35\n", "2 3 5 40\n", "3 4 10 50" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "small_df = pd.read_table('../downloads/Orange_1.tsv')\n", "small_df" ] }, { "cell_type": "code", "execution_count": 98, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "small_df.plot(x='age', y='circumference', kind='line') # plot the relationship of age and height\n", "# try with other types of plots, e.g. scatter" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Tips: what if no plots shows up?" ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Plotting - bars" ] }, { "cell_type": "code", "execution_count": 101, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGYCAYAAACQz+KaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAioUlEQVR4nO3da3BU5eHH8d9CwgaFJBpN2JREwmBjDHJL7BCGW42GEpuqw1SmWrAidAIolW2KBkY7aPnHzjAaKZiAAimDgC8WKBZE0oEEEWhJSBTLxRuSNGbNRMcsBtxAsv8XDjvd5gInEJ5k8/3MnBfnOc/JPsu2zbdnT3ZtPp/PJwAAAEP6mF4AAADo3YgRAABgFDECAACMIkYAAIBRxAgAADCKGAEAAEYRIwAAwChiBAAAGBViegFXoqWlRV9++aUGDhwom81mejkAAOAK+Hw+nT17VrGxserTp/3rHz0iRr788kvFxcWZXgYAAOiE6upqDR48uN3jPSJGBg4cKOmHJxMeHm54NQAA4Ep4PB7FxcX5f4+3p0fEyKW3ZsLDw4kRAAB6mMvdYsENrAAAwChiBAAAGEWMAAAAo3rEPSNXqrm5WRcuXDC9jG4rNDRUffv2Nb0MAAACBEWM+Hw+ud1uffvtt6aX0u1FRkZq0KBBfF4LAKDbCIoYuRQi0dHRuuGGG/hF2wafz6dz586prq5OkuRwOAyvCACAH/T4GGlubvaHSFRUlOnldGv9+/eXJNXV1Sk6Opq3bAAA3UKPv4H10j0iN9xwg+GV9AyX/p24twYA0F30+Bi5hLdmrgz/TgCA7iZoYgQAAPRMVxUjeXl5stlsevrppzucV1paqpSUFIWFhWno0KEqLCy8mocFAABBpNM3sB45ckRr1qzRiBEjOpx3+vRpZWZmas6cOdq4caPef/99zZs3T7feequmTZvW2Ye/rCHP7uyyn92WL166/7o+HgAAwaJTV0a+++47Pfroo3r99dd10003dTi3sLBQ8fHxys/PV1JSkmbPnq1Zs2Zp+fLlnVowAAAILp2Kkfnz5+v+++/Xvffee9m5hw4dUkZGRsDYlClTVFZW1u5fdHi9Xnk8noAtGO3evVvjx49XZGSkoqKi9POf/1yfffaZ//jBgwc1atQohYWFKTU1Vdu3b5fNZlNlZaV/zvHjx5WZmakBAwYoJiZGM2bMUH19vYFnAwBA51h+m2bLli06evSojhw5ckXz3W63YmJiAsZiYmJ08eJF1dfXt/nhW3l5eVq6dKnVpfU4jY2Ncjqduuuuu9TY2Kjnn39eDz30kCorK9XY2KisrCxlZmZq06ZNOnPmTKt7c2prazVp0iTNmTNHL7/8ss6fP69nnnlGDz/8sPbu3WvmSQFAN3a938LvLrr7rQSWYqS6ulq/+93vtGfPHoWFhV3xef/756Q+n6/N8Utyc3PldDr9+x6PR3FxcVaW2iP87z0za9euVXR0tI4fP64DBw7IZrPp9ddfV1hYmO68807V1NRozpw5/vkFBQUaM2aM/u///s8/tm7dOsXFxenjjz/Wj3/84+v2XAAA6CxLMVJeXq66ujqlpKT4x5qbm7V//36tXLlSXq+31ad6Dho0SG63O2Csrq5OISEh7X5iqt1ul91ut7K0Humzzz7Tc889p8OHD6u+vl4tLS2SpKqqKp06dUojRowIiL6f/OQnAeeXl5dr3759GjBgQJs/mxgBAPQElmIkPT1dx44dCxh7/PHHdccdd+iZZ55p8+PF09LS9PbbbweM7dmzR6mpqQoNDe3EkoNHVlaW4uLi9Prrrys2NlYtLS0aPny4mpqa5PP52r2idElLS4uysrL05z//udXP5rtnAAA9haUYGThwoIYPHx4wduONNyoqKso/npubq5qaGm3YsEGSlJ2drZUrV8rpdGrOnDk6dOiQ1q5dq82bN1+jp9Azff311zpx4oRWr16tCRMmSJIOHDjgP37HHXfozTfflNfr9V8lKisrC/gZY8aMkcvl0pAhQxQS0uO/ZggA0Etd809gra2tVVVVlX8/ISFBu3btUklJiUaNGqUXX3xRK1as6NLPGOkJbrrpJkVFRWnNmjX69NNPtXfv3oD7ZB555BG1tLTot7/9rU6cOKF3333X/+fQl66YzJ8/X998841+9atf6V//+pc+//xz7dmzR7NmzVJzc7OR5wUAgFVX/X+nS0pKAvaLiopazZk0aZKOHj16tQ9lSXe/c7hPnz7asmWLFixYoOHDhysxMVErVqzQ5MmTJUnh4eF6++23NXfuXI0aNUp33XWXnn/+eT3yyCP++0hiY2P1/vvv65lnntGUKVPk9Xp122236Wc/+5n69OGT/gEAPQPX9g269957dfz48YCx/74vZNy4cfrggw/8+2+++aZCQ0MVHx/vH7v99tu1devWrl8sAABdhBjpxjZs2KChQ4fqRz/6kT744AP/Z4j079/f9NIAALhmiJFuzO126/nnn5fb7ZbD4dAvf/lLLVu2zPSyAAC4poiRbmzRokVatGiR6WUAANCluMsRAAAYFTQx8r8fCIa28e8EAOhuenyMXPoU13PnzhleSc9w6d+pt3/6LQCg++jx94z07dtXkZGRqqurkyTdcMMN7X4BX2/m8/l07tw51dXVKTIyss2P7gcAwIQeHyPSD1/GJ8kfJGhfZGSk/98LAIDuIChixGazyeFwKDo6WhcuXDC9nG4rNDSUKyIAgG4nKGLkkr59+/LLFgCAHqbH38AKAAB6NmIEAAAYRYwAAACjiBEAAGAUMQIAAIwiRgAAgFHECAAAMIoYAQAARhEjAADAKGIEAAAYRYwAAACjiBEAAGAUMQIAAIwiRgAAgFHECAAAMIoYAQAARhEjAADAKGIEAAAYRYwAAACjiBEAAGAUMQIAAIwiRgAAgFGWYqSgoEAjRoxQeHi4wsPDlZaWpnfeeafd+SUlJbLZbK22kydPXvXCAQBAcAixMnnw4MF66aWXNGzYMEnSX//6Vz3wwAOqqKhQcnJyu+edOnVK4eHh/v1bb721k8sFAADBxlKMZGVlBewvW7ZMBQUFOnz4cIcxEh0drcjIyE4tEAAABLdO3zPS3NysLVu2qLGxUWlpaR3OHT16tBwOh9LT07Vv377L/myv1yuPxxOwAQCA4GQ5Ro4dO6YBAwbIbrcrOztb27Zt05133tnmXIfDoTVr1sjlcmnr1q1KTExUenq69u/f3+Fj5OXlKSIiwr/FxcVZXSYAAOghbD6fz2flhKamJlVVVenbb7+Vy+XSG2+8odLS0naD5H9lZWXJZrNpx44d7c7xer3yer3+fY/Ho7i4ODU0NATcewIAgBVDnt1peglGfPHS/UYe1+PxKCIi4rK/vy3dMyJJ/fr189/AmpqaqiNHjujVV1/V6tWrr+j8sWPHauPGjR3OsdvtstvtVpcGAAB6oKv+nBGfzxdwFeNyKioq5HA4rvZhAQBAkLB0ZWTx4sWaOnWq4uLidPbsWW3ZskUlJSXavXu3JCk3N1c1NTXasGGDJCk/P19DhgxRcnKympqatHHjRrlcLrlcrmv/TAAAQI9kKUa++uorzZgxQ7W1tYqIiNCIESO0e/du3XfffZKk2tpaVVVV+ec3NTUpJydHNTU16t+/v5KTk7Vz505lZmZe22cBAAB6LMs3sJpwpTfAAADQEW5gvb6u9Pc3300DAACMIkYAAIBRxAgAADCKGAEAAEYRIwAAwChiBAAAGEWMAAAAo4gRAABgFDECAACMIkYAAIBRxAgAADCKGAEAAEYRIwAAwChiBAAAGEWMAAAAo4gRAABgFDECAACMIkYAAIBRxAgAADCKGAEAAEYRIwAAwChiBAAAGEWMAAAAo4gRAABgFDECAACMIkYAAIBRxAgAADCKGAEAAEYRIwAAwChiBAAAGEWMAAAAo4gRAABgFDECAACMshQjBQUFGjFihMLDwxUeHq60tDS98847HZ5TWlqqlJQUhYWFaejQoSosLLyqBQMAgOBiKUYGDx6sl156SWVlZSorK9M999yjBx54QP/+97/bnH/69GllZmZqwoQJqqio0OLFi7VgwQK5XK5rsngAANDzhViZnJWVFbC/bNkyFRQU6PDhw0pOTm41v7CwUPHx8crPz5ckJSUlqaysTMuXL9e0adM6v2oAABA0On3PSHNzs7Zs2aLGxkalpaW1OefQoUPKyMgIGJsyZYrKysp04cKFdn+21+uVx+MJ2AAAQHCydGVEko4dO6a0tDR9//33GjBggLZt26Y777yzzblut1sxMTEBYzExMbp48aLq6+vlcDjaPC8vL09Lly61ujQAsGzIsztNL8GIL1663/QSAD/LV0YSExNVWVmpw4cPa+7cuXrsscd0/PjxdufbbLaAfZ/P1+b4f8vNzVVDQ4N/q66utrpMAADQQ1i+MtKvXz8NGzZMkpSamqojR47o1Vdf1erVq1vNHTRokNxud8BYXV2dQkJCFBUV1e5j2O122e12q0sDAAA90FV/zojP55PX623zWFpamoqLiwPG9uzZo9TUVIWGhl7tQwMAgCBgKUYWL16s9957T1988YWOHTumJUuWqKSkRI8++qikH95emTlzpn9+dna2zpw5I6fTqRMnTmjdunVau3atcnJyru2zAAAAPZalt2m++uorzZgxQ7W1tYqIiNCIESO0e/du3XfffZKk2tpaVVVV+ecnJCRo165dWrhwoVatWqXY2FitWLGCP+sFAAB+lmJk7dq1HR4vKipqNTZp0iQdPXrU0qIAAEDvwXfTAAAAo4gRAABgFDECAACMIkYAAIBR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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "small_df[['age']].plot(kind='bar')" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "slide" } }, "source": [ "### Plotting multiple columns" ] }, { "cell_type": "code", "execution_count": 102, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAGYCAYAAADiAIAsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAe6UlEQVR4nO3deXRU9d3H8c9kYZJAFghNSDQYEJAlyF6PGBQVqYhUFJW6ckCrLCIakeVQeQICkRaFukXBGsFK8JxWqFVkKQIKaAvBUJWtgEgUYsRlEgmOmMzzh4c5DgkIeuc7meT9Omf+mLvM7zeZyLy992bG5fP5fAIAADASEeoJAACAhoX4AAAApogPAABgivgAAACmiA8AAGCK+AAAAKaIDwAAYIr4AAAApqJCPYETVVdX6+DBg4qPj5fL5Qr1dAAAwGnw+XyqqKhQenq6IiJOfWyjzsXHwYMHlZGREeppAACAn6GkpERnn332Kbepc/ERHx8v6YfJJyQkhHg2AADgdJSXlysjI8P/Pn4qdS4+jp9qSUhIID4AAAgzp3PJBBecAgAAU8QHAAAwRXwAAABTde6aj9NVVVWlY8eOhXoaCHPR0dGKjIwM9TQAoEEJu/jw+XwqLS3V119/HeqpoJ5ISkpSixYt+FwZADASdvFxPDxSUlIUFxfHGwZ+Np/Pp8rKSpWVlUmS0tLSQjwjAGgYwio+qqqq/OGRnJwc6umgHoiNjZUklZWVKSUlhVMwAGAgrC44PX6NR1xcXIhngvrk+O8T1xABgI2wio/jONUCJ/H7BAC2wjI+AABA+Drj+Hjrrbc0aNAgpaeny+VyadmyZQHrfT6fcnNzlZ6ertjYWPXt21cffvihU/Otl/bv3y+Xy6Xi4uJQT6VWlZWVGjJkiBISEuRyufhLIwDAL3LGF5weOXJEXbp00fDhwzVkyJAa6//4xz/qscce0wsvvKB27dppxowZuuKKK7Rr167T+rKZnytz0utBe+za7H9koGOPlZGRoUOHDql58+aOPaaTFi5cqLffflubNm1S8+bNlZiYGOopAQDC2BnHx4ABAzRgwIBa1/l8Ps2bN09TpkzRddddJ+mHN67U1FQtXrxYd9999y+bbT0VGRmpFi1anHS9z+dTVVWVoqJC88dJe/fuVYcOHZSVlfWzH6Oqqkoul0sREZzpA4CGztF3go8++kilpaXq37+/f5nb7dYll1yiTZs21bqP1+tVeXl5wK2+qq6u1uzZs9WmTRu53W61bNlSM2fOrHHaZd26dXK5XFq5cqV69uwpt9utt99++6T7/3ifH58SKS4ulsvl0v79+yVJL7zwgpKSkvTaa6/pvPPOU1xcnK6//nodOXJECxcuVGZmppo2baqxY8eqqqpKktS3b189+uijeuutt+RyudS3b19J0nfffacJEyborLPOUuPGjXXBBRdo3bp1/rF/PFbHjh3ldrv18ccfn/Z+K1euVIcOHdSkSRNdeeWVOnToUMDP8vnnn1enTp3kdruVlpame+65x7/O4/HorrvuUkpKihISEnTZZZdp27ZtzryIAIBfzNH/lS4tLZUkpaamBixPTU3Vxx9/XOs+eXl5mjZtmpPTqLMmT56sBQsWaO7cucrOztahQ4e0c+fOk24/YcIEzZkzR61bt1ZSUtIZ71+byspKPf7441qyZIkqKip03XXX6brrrlNSUpKWL1+uffv2aciQIcrOztbQoUP1yiuvaNKkSfrggw/0yiuvqFGjRpKk4cOHa//+/VqyZInS09O1dOlSXXnllXr//ffVtm1b/1h5eXl67rnnlJycrJSUlNPeb86cOXrxxRcVERGhW2+9VePHj9dLL70kScrPz1dOTo4eeeQRDRgwQB6PRxs3bpT0w1GigQMHqlmzZlq+fLkSExP17LPP6vLLL9fu3bvVrFmzM37dAIQn69PxP+bkqfn6KCjH8U/800Wfz3fSP2ecPHmycnJy/PfLy8uVkZERjGmFVEVFhf785z/rySef1LBhwyRJ5557rrKzs/1HJk40ffp0XXHFFT+5/5k4duyY8vPzde6550qSrr/+er344ov67LPP1KRJE3Xs2FGXXnqp1q5dq6FDh6pZs2aKi4tTo0aN/KeG9u7dq8LCQn3yySdKT0+XJI0fP14rVqxQQUGBZs2a5R/r6aefVpcuXc54v2eeecY/x3vuuUfTp0/3P4cZM2bogQce0Lhx4/zLevXqJUlau3at3n//fZWVlcntdkuS5syZo2XLlulvf/ub7rrrrjP6eQEAnOdofBx/cyotLQ34qOqysrIaR0OOc7vd/jeJ+mzHjh3yer26/PLLT3ufnj17/qL9axMXF+d/U5d+OCqVmZmpJk2aBCw7/pHjtdm6dat8Pp/atWsXsNzr9QZ88myjRo10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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "small_df[['circumference', 'age']].plot(kind='bar')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "df[['circumference', 'age']].plot(kind='bar', figsize=(12, 8), fontsize=16)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Plotting histogram" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 103, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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f3V9FhkZqaqqKh05ckRHjhzRG2+8oYyMDM2ePdubhwQAADo4n59Jqqmp0fjx42Wz2dSzZ0999NFHKi8vl8Ph0Nq1axUVFaW9e/dq0qRJzW77ueeecwWk++67T1999ZXsdru++eYb5ebmauTIkXI6nZozZ45yc3O9fWgAAKAD83lIWr16tfbv3y9JWrdunVJTUyVJAQEBmjBhglasWCFJ2rhxo3JycprVdmZmpiTppptu0iuvvKJevXq52h46dKg++OADRUZGyjAMrVu3zluHBAAA/IDPQ9KaNWskScnJyRo+fHiD8rS0NCUmJkr6T+hxV3FxsSRp2LBhpuUxMTHq37+/JKmsrKxZbQMAAP/m05DkcDi0c+dOSdK4ceNM61gsFo0dO1aStGXLlma1f+WVV0qSdu/ebVpeUlKiI0eOSGo8SAEAgM7JpyEpLy9PTqdTkpSUlNRovdqykydP6uzZs263/9vf/laStH37ds2cOVOFhYWSJMMwtGfPHt12220qKyvT97//fY/WPAEAAP/l05BUVFTk2q5dL2SmblndfS5l5syZmjdvngICArRs2TJdccUVioqKUlhYmIYOHap//etfeuSRR7R161YFBTV9oV9lZaVKS0vrvQAAgP/yaUiy2+2ubavV2mi9umV197mUgIAALViwQG+88YYiIyMlXVx7VHvfpYqKCpWUlKi8vPySbS1YsEAxMTGuV+/evd3uBwAA6Hh8vnC7NZ0+fVopKSn65S9/qeHDh2vHjh06f/68iouLtX79enXr1k3Lly/XjTfe6PoprjGPPvqoSkpKXK8TJ0600VEAAABf8OnNJKOiolzbDoej0Xp1y+rucylTp07V9u3bddNNN2nz5s2yWCySLl7Vdvvtt2vEiBG65pprdOzYMT3yyCN66623Gm0rNDRUoaGhbn83AADo2Hx6Jik+Pt613dSZnLpldfdpSl5enj788ENJ0pw5c1wBqa7u3btrypQpkqT169fLMAy32gYAAP7PpyHp6quvVkDAxS4cOHCg0Xq1ZXFxcerSpYtbbR86dMi1/Z3vfKfRev369ZN08WzV119/7VbbAADA//k0JFmtVo0YMUKStGnTJtM6hmFo8+bNkqQxY8a43XZt+JIuPhuuMadOnXJt1y7uBgAA8PnC7alTp0qStm3bps8++6xBeXZ2to4dOyZJrp/G3HHddde5tpcvX25ap7y83HUX7+9+97uKiIhwu30AAODf2kVIGjx4sAzD0J133ul6PpvT6VR2drZmzJgh6eIduVNSUurtm56eLovFIovFIpvNVq+sb9++Gj9+vCTpr3/9q+6++24dPXpUhmGourpaf/vb3zR69GhXAJszZ04rHykAAOhIfHp1myQFBQVpw4YNSk5Ols1mU2pqqqxWq5xOpyoqKiRJQ4YMUVZWVrPbfuONNzR27Fjt3r1bb7/9tt5++21ZrVZVVVXpwoULrnpz585t1lkqAADg/3x+JkmSEhIStG/fPj311FNKSkqSxWJRcHCwhg4dqoyMDO3atUuxsbHNbvfyyy/Xrl279Nprr+nmm29Wjx49VF1draCgIF155ZWaPHmyPvnkEy1evLgVjgoAAHRkFoPr3j1SWlqqmJgYlZSUKDo62uvtJzzyf15vs7XZFt7q6y50CswNNIa5gcYwN/6jOf9+t4szSQAAAO0NIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMAEIQkAAMBEuwlJdrtd6enpGjx4sCIjIxUTE6Prr79eS5YsUVVVVYvbP3nypJ588kkNHTpUXbp0UXh4uPr27auxY8dq4cKFqq6u9sJRAAAAfxHk6w5I0vHjxzV69GjZbDZJktVqVWVlpXJzc5Wbm6usrCzl5OQoNjbWo/bfffdd3XPPPSotLZUkhYSEKDw8XAUFBSooKNDmzZv1m9/8RpdddpmXjggAAHR0Hp1Jys/P91oHampqNH78eNlsNvXs2VMfffSRysvL5XA4tHbtWkVFRWnv3r2aNGmSR+1nZ2dr4sSJKi0t1YQJE7R3715VVlbq/Pnzstvt+uSTTzR79mwFBwd77ZgAAEDH51FIuuqqq5ScnKy3335bFRUVLerA6tWrtX//fknSunXrlJqaerFjAQGaMGGCVqxYIUnauHGjcnJymtV2cXGx7r33XjmdTs2ePVtr167Vtdde6yqPjIzUyJEjtXTpUkVERLToOAAAgH/xKCR9+eWXGjJkiObMmaO4uDjde++9+vzzzz3qwJo1ayRJycnJGj58eIPytLQ0JSYmSpIyMzOb1fZLL72kc+fO6YorrtDChQs96h8AAOicPApJSUlJWrp0qQoLC/Xmm2/q5MmTGjlypK655hotXbpU//73v91qx+FwaOfOnZKkcePGmdaxWCwaO3asJGnLli3N6mdtqJo8ebJCQkKatS8AAOjcWnR1W1BQkG6//Xa99957ev7553X06FHNnTtXV1xxhaZMmaLi4uIm98/Ly5PT6ZR0MXg1prbs5MmTOnv2rFt9y8/PV1FRkSTppptu0t69ezVhwgTFxcUpNDRUvXv3Vlpamj799FO32gMAAJ1Li0JSbm6u7rvvPvXs2VNLly7V3LlzdfToUW3dulWFhYX66U9/2uT+tSFGknr16tVovbpldfdpypEjR1zbn3/+uW688Ua99957KikpUXh4uL766iu9++67GjFihBYsWHDJ9iorK1VaWlrvBQAA/JdHIWnp0qUaPHiwfvCDH6ioqEiZmZk6fvy4nnnmGSUmJmrEiBFasWKF9uzZ02Q7drvdtW21WhutV7es7j5NOXfunGt7/vz56tGjhzZt2qTy8nKdP39eeXl5SklJkWEYeuyxx/T+++832d6CBQsUExPjevXu3dutfgAAgI7Jo5C0fPlyTZw4UQUFBXr//fd12223KSCgflN9+vTR66+/7pVOeqL2Z7za7ezsbN18882ufg4cOFB/+ctfFB8fL0lKT09vsr1HH31UJSUlrteJEydare8AAMD3PLqZ5D//+c9L1gkJCdHUqVObrBMVFeXadjgcjdarW1Z3H3fbHjlypL7//e83qBMREaH77rtPTzzxhL788kudOnVKPXr0MG0vNDRUoaGhbn03AADo+Dw6k/Tmm28qOzu7wefZ2dmuS/rdUXsWR5IKCwsbrVe3rO4+Tam7junqq69utF7dsuPHj7vVNgAA8H8ehaSFCxfq8ssvb/B59+7d9dxzz7ndztVXX+36+evAgQON1qst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CgkJaVabtY87kaTq6mqdOnWqyfrffPONR30HAAD+qV2EJOni/Y/mz5+v+fPnu71Penq60tPTTctGjx4twzC81DsAANDZ+HxNEgAAQHtESAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADBBSAIAADAR5OsOAIAk1dTUqLq62tfdaLeCg4MVGBjo624AnQohCYBPGYahkydP6vz5877uSrt32WWXKS4uThaLxdddAToFQhIAn6oNSN27d5fVaiUAmDAMQw6HQ19//bUkqWfPnj7uEdA5EJIA+ExNTY0rIHXt2tXX3WnXwsPDJUlff/21unfvzk9vQBtg4TYAn6ldg2S1Wn3ck46hdpxYuwW0DUISAJ/jJzb3ME5A2yIkAQAAmCAkAQAAmGDhNoB2KeGR/2uz77ItvLXNvgtAx8GZJAAAABOEJADwwKZNmzRy5Ehddtll6tq1q2677TYdPXrUVf63v/1N1157rcLCwjRs2DC9//77slgs+uKLL1x1Dh06pFtuuUWRkZHq0aOH7r77bp0+fdoHRwPADCEJADxQXl6uBx98UH//+9+Vk5OjgIAA3X777XI6nbLb7Ro/frwGDx6sPXv26Pe//70efvjhevsXFxfrpptu0rXXXqvc3Fxt2rRJp06d0s9//nMfHRGAb2NNEgB44M4776z3/vXXX1f37t116NAh7dixQxaLRatWrVJYWJgGDRqkwsJCzZgxw1V/+fLluu666/Tcc8+5PnvjjTfUu3dvHTlyRP3792+zYwFgjjNJAOCBo0ePauLEibryyisVHR2txMRESVJBQYEOHz6s7373uwoLC3PVv+GGG+rtv3v3bm3btk2RkZGu18CBA11tA/A9ziQBgAfGjx+v3r17a9WqVYqPj5fT6VRSUpKqqqpkGEaDGz8ahlHvvdPp1Pjx4/X88883aJtnswHtAyEJAJrpzJkzysvL04oVKzRq1ChJ0o4dO1zlAwcOVFZWliorKxUaGipJys3NrdfGddddp3Xr1ikhIUFBQfwpBtojfm4DgGaKjY1V165dtXLlSv3rX//S1q1b9eCDD7rKJ06cKKfTqXvuuUd5eXnavHmzMjIyJP3n0SIzZ87U2bNn9Ytf/EKff/65jh07pi1btmjatGmqqanxyXEBqI+QBADNFBAQoLVr12r37t1KSkrS7NmztXjxYld5dHS0/vrXv+qLL77Qtddeq8cff1xPPfWUJLnWKcXHx2vnzp2qqanRzTffrKSkJN1///2KiYlRQAB/moH2gHO8ANql9n4X7NTUVB06dKjeZ3XXHf3gBz/Ql19+6XqflZWl4OBg9enTx/VZv379tH79+tbvLACPEJIAoBVkZmbqyiuvVK9evfTll1/q4Ycf1s9//nOFh4f7umsA3ERIAoBWcPLkST311FM6efKkevbsqbvuukvPPvusr7sFoBkISQDQCubNm6d58+b5uhsAWoDVgQAAACYISQAAACYISQB8zul0+roLHQLjBLStdrMmyW63a8mSJVq3bp3y8/MVGBio/v37Ky0tTbNmzVJISIjHbZ86dUqLFi3SBx98oIKCAoWHh+uaa67R1KlTNX369AaPDwDQNkJCQhQQEKCioiJ169ZNISEh/O/RhGEYqqqq0r///W8FBAS06O8hAPe1i5B0/PhxjR49WjabTZJktVpVWVmp3Nxc5ebmKisrSzk5OYqNjW1227t379bNN9+sM2fOSJIiIyNlt9u1Y8cO7dixQ9nZ2dqwYYPr0QEA2k5AQIASExNVXFysoqIiX3en3bNarerTpw83mwTaiM9DUk1NjcaPHy+bzaaePXsqMzNTqampcjqdys7O1owZM7R3715NmjRJH374YbPaLikp0W233aYzZ85o4MCBeuuttzRs2DBVVVVp1apVmj17trZs2aLZs2dr2bJlrXSEAJoSEhKiPn366MKFCzyOowmBgYEKCgriTBvQhnweklavXq39+/dLktatW6fhw4dLuvj/MCdMmCCn06mJEydq48aNysnJUUpKitttZ2Rk6OTJkwoPD9eHH36oxMRESRf/KM+cOVOlpaV67LHHtHLlSj3wwAPq37+/9w8QwCVZLBYFBwcrODjY110BABefn7Nds2aNJCk5OdkVkOpKS0tzhZvMzMxmtV1bv24bdc2aNUuRkZGqqalRVlZWc7sOAAD8mE9DksPh0M6dOyVJ48aNM61jsVg0duxYSdKWLVvcbvvw4cMqKChosu3IyEiNGjWq2W0D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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "small_df.plot(kind='hist', y = 'age', fontsize=18)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Plotting box" ] }, { "cell_type": "code", "execution_count": 104, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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5ZVXJkmmTp2azZs355vf/GYefPDBd6299NJL097e3mvfvn37Mnjw4IwYMeKkr1FdXZ3q6upKRwMAzkKn/XdGuru709XVdcLnpk2blg0bNvTat379+kydOjVDhgw53ZcGAAaAimJkyZIl+bu/+7v8x3/8R3bs2JGvfe1raWlpyRe+8IUkv/p45eabb+5Zv2DBgrz66qtpamrKiy++mIceeiirV6/OokWL+vddAABnrYo+pnnjjTdy0003pa2tLXV1dZk0aVLWrVuXT3ziE0mStra27N69u2f92LFj88wzz+TOO+/Mt7/97YwaNSr333+/X+sFAHpUFCOrV68+5fNr1qx5174bbrghW7durWgoAODc4btpAICixAgAUJQYAQCKEiMAQFFiBAAoSowAAEWJEQCgKDECABQlRgCAosQIAFCUGAEAihIjAEBRYgQAKEqMAABFiREAoCgxAgAUJUYAgKLECABQlBgBAIoSIwBAUWIEAChKjAAARYkRAKAoMQIAFCVGAICixAgAUJQYAQCKEiMAQFFiBAAoSowAAEWJEQCgKDECABQlRgCAosQIAFCUGAEAihIjAEBRYgQAKEqMAABFiREAoCgxAgAUJUYAgKLECABQlBgBAIoSIwBAUWIEACiqohhZunRpPvrRj2b48OGpr6/Ppz/96ezcufOUx7S0tKSqqupdj5deeum0BgcABoaKYmTjxo1ZuHBhXnjhhWzYsCFHjx7NrFmzcujQofc8dufOnWlra+t5/OZv/mafhwYABo7BlSxet25dr+2HH3449fX12bJlS66//vpTHltfX58LL7yw4gEBgIGtohj5dR0dHUmSiy+++D3XXnvttXn77bdzzTXX5Otf/3puvPHGk67t6upKV1dXz3ZnZ+fpjAn8j65jb2dQzd7s6tyZQTXDSo/zobWr82AG1exN17G3k9SVHgcGvD7HSHd3d5qamjJ9+vRMnDjxpOsaGhqyatWqTJkyJV1dXfnrv/7rzJw5My0tLSe9mrJ06dLcc889fR0NOInXD72aC8Z+K0t+XnqSD78LxiavH5qcKRlZehQY8Kq6u7u7+3LgwoUL8/TTT+e5557L6NGjKzp23rx5qaqqylNPPXXC5090ZaSxsTEdHR2pra3ty7hAki2738hnHvphvvm5ybmi3pWRk3ll38F85bHt+ZsvfipTxogR6KvOzs7U1dW958/vPl0Zue222/LUU09l06ZNFYdIklx33XVZu3btSZ+vrq5OdXV1X0YDTqH6vJocf/uyjK0dn2tG+PjhZI6/3ZHjb7+Z6vNqSo8C54SKYqS7uzu33XZbnnjiibS0tGTs2LF9etFt27aloaGhT8cCAANLRTGycOHCfP/7388Pf/jDDB8+PO3t7UmSurq6DB06NEmyePHi7N27N4888kiSZPny5bn88sszYcKEHD58OGvXrk1zc3Oam5v7+a0AAGejimJkxYoVSZKPf/zjvfY//PDD+aM/+qMkSVtbW3bv3t3z3OHDh7No0aLs3bs3Q4cOzYQJE/L0009n7ty5pzc5ADAgVPwxzXtZs2ZNr+2vfvWr+epXv1rRUADAucN30wAARYkRAKAoMQIAFCVGAICixAgAUJQYAQCKEiMAQFFiBAAoSowAAEWJEQCgKDECABQlRgCAosQIAFCUGAEAihIjAEBRYgQAKEqMAABFiREAoCgxAgAUJUYAgKLECABQlBgBAIoSIwBAUWIEAChKjAAARYkRAKAoMQIAFCVGAICixAgAUJQYAQCKEiMAQFFiBAAoSowAAEWJEQCgKDECABQlRgCAosQIAFCUGAEAihIjAEBRYgQAKEqMAABFiREAoCgxAgAUJUYAgKLECABQVEUxsnTp0nz0ox/N8OHDU19fn09/+tPZuXPnex63cePGTJkyJTU1NRk3blxWrlzZ54EBgIGlohjZuHFjFi5cmBdeeCEbNmzI0aNHM2vWrBw6dOikx+zatStz587NjBkzsm3btixZsiS33357mpubT3t4AODsN7iSxevWreu1/fDDD6e+vj5btmzJ9ddff8JjVq5cmTFjxmT58uVJkquvvjqtra1ZtmxZ5s+f37epAYAB47TuGeno6EiSXHzxxSdd8/zzz2fWrFm99s2ePTutra05cuTICY/p6upKZ2dnrwcAMDD1OUa6u7vT1NSU6dOnZ+LEiSdd197enpEjR/baN3LkyBw9ejT79+8/4TFLly5NXV1dz6OxsbGvYwIAH3J9jpEvf/nL+ed//uf84Ac/eM+1VVVVvba7u7tPuP8dixcvTkdHR89jz549fR0TAPiQq+iekXfcdttteeqpp7Jp06aMHj36lGsvvfTStLe399q3b9++DB48OCNGjDjhMdXV1amuru7LaADAWaaiKyPd3d358pe/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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "small_df.plot(kind='box', y = 'age')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Further reading: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "skip" } }, "source": [ "#### Scatterplot\n", "\n", "```py\n", " df.plot(kind=\"scatter\", x=\"column_name\", y=\"other_column_name\")\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "df.plot(kind=\"scatter\", x='age', y='circumference',\n", " figsize=(12, 8), fontsize=14)" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "slideshow": { "slide_type": "skip" } }, "source": [ "#### Line plot\n", "```py\n", "dataframe.plot(kind=\"line\", x=..., y=...)\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "tree1 = df[df['Tree'] == 1]\n", "tree1.plot(kind=\"line\", x='age', y='circumference',\n", " fontsize=14, figsize=(12,8))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "#### Multiple graphs - grouping" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "df.groupby('Tree')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "df.groupby('Tree').plot(kind=\"line\", x='age', y='circumference')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "df.groupby('Tree').groups" ] }, { "cell_type": "markdown", "metadata": { "cell_marker": "'''", "lines_to_next_cell": 2, "slideshow": { "slide_type": "slide" } }, "source": [ "### Exercise 2 (~30 minutes)\n", "- Go to Canvas, `Modules -> Day 4 -> Exercise 2 - day 4` \n", "- **Easy**:\n", " - Explore the `Orange_1.tsv`\n", "- **Medium/hard**:\n", " - Use Pandas to read IMDB\n", " - Explore it by making graphs\n", "- **Extra exercises**:\n", " - Read the pandas documentation :)\n", " - Start exploring your own data\n", "- After exercise, do Quiz 4.2 and then take a break\n", "- After break, working on the project" ] } ], "metadata": { "celltoolbar": "Slideshow", "jupytext": { "cell_markers": "'''" }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.4" } }, "nbformat": 4, "nbformat_minor": 4 }