Commit be25570a authored by Emilio Ambite's avatar Emilio Ambite

filled directory

parent ad54ac4c
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Errors and Exceptions\n",
"\n",
"Two main questions to be answered\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<li>How Python report errors?\n",
"\n",
"<li>How I can handle errors in Python programs?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Every programmer makes Errors\n",
"\n",
"Errors in Python have a very specific form called <b>\"traceback\"</b>. Traceback are made of levels wich are marked with special symbol <b>--></b>"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"ename": "IndexError",
"evalue": "list index out of range",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-1-c34fcf537534>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mice_creams\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 10\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mfavorite_ice_cream\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m<ipython-input-1-c34fcf537534>\u001b[0m in \u001b[0;36mfavorite_ice_cream\u001b[1;34m()\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[1;34m\"strawberry\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 8\u001b[0m ]\n\u001b[1;32m----> 9\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mice_creams\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 10\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 11\u001b[0m \u001b[0mfavorite_ice_cream\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mIndexError\u001b[0m: list index out of range"
]
}
],
"source": [
"# This code has an intentional error. You can type it directly or\n",
"# use it for reference to understand the error message below.\n",
"def favorite_ice_cream():\n",
" ice_creams = [\n",
" \"chocolate\",\n",
" \"vanilla\",\n",
" \"strawberry\"\n",
" ]\n",
" print(ice_creams[3])\n",
"\n",
"favorite_ice_cream()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Traceback with two levels. Are read from bottom to top:\n",
"<li> 1) Last level is the line with the error actually is\n",
"\n",
"<li> 2) Upper level(s) show what function was executed to get the next level down"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Tracebacks could be very long but important info is usually at the bottom"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Error categories"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"All errors at the end of a traceback, are usually in the form:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<code>Category: Some more info</code>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Where Categories are:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Syntax Errors"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You forget a colon, add too many spaces, forget a parenthesis etc... Makes Python not to know how to read your program. That gives you:\n",
"<code>SyntaxError</code>"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"ename": "SyntaxError",
"evalue": "invalid syntax (<ipython-input-2-dbf32ad5d3e8>, line 1)",
"output_type": "error",
"traceback": [
"\u001b[1;36m File \u001b[1;32m\"<ipython-input-2-dbf32ad5d3e8>\"\u001b[1;36m, line \u001b[1;32m1\u001b[0m\n\u001b[1;33m def some_function()\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n"
]
}
],
"source": [
"def some_function()\n",
" msg = \"hello, world!\"\n",
" print(msg)\n",
" return msg"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"ename": "IndentationError",
"evalue": "unexpected indent (<ipython-input-3-e169556d667b>, line 4)",
"output_type": "error",
"traceback": [
"\u001b[1;36m File \u001b[1;32m\"<ipython-input-3-e169556d667b>\"\u001b[1;36m, line \u001b[1;32m4\u001b[0m\n\u001b[1;33m return msg\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mIndentationError\u001b[0m\u001b[1;31m:\u001b[0m unexpected indent\n"
]
}
],
"source": [
"def some_function():\n",
" msg = \"hello, world!\"\n",
" print(msg)\n",
" return msg"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<li>Remember: Both SyntaxError and IntentationError indicate a problem with the syntax of the program"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Variable Name Errors"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Difficult to state a general case but common mistakes are:\n",
"<li> You meant to use a string but forgot quotes\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'hello' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-1-43a14fcd4265>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mhello\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mNameError\u001b[0m: name 'hello' is not defined"
]
}
],
"source": [
"print(hello)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<li> You forgot to create a variable before using it\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'count' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-6-3cc942c225b7>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mnumber\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mcount\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcount\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mnumber\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"The count is:\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcount\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mNameError\u001b[0m: name 'count' is not defined"
]
}
],
"source": [
"for number in range(10):\n",
" count = count + number\n",
"print(\"The count is:\", count)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<li> There is a typo in a variable name (maybe because Python's Case Sensitivity)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'count' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-7-79d2bb4fcc22>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mCount\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mnumber\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mcount\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcount\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mnumber\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"The count is:\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcount\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mNameError\u001b[0m: name 'count' is not defined"
]
}
],
"source": [
"Count = 0\n",
"for number in range(10):\n",
" count = count + number\n",
"print(\"The count is:\", count)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### IndexErrors"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Typically you try to access something out of bounds:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Letter #1 is a\n",
"Letter #2 is b\n",
"Letter #3 is c\n"
]
},
{
"ename": "IndexError",
"evalue": "list index out of range",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-9-656a22fa6ec5>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Letter #2 is\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mletters\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Letter #3 is\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mletters\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 5\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Letter #4 is\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mletters\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mIndexError\u001b[0m: list index out of range"
]
}
],
"source": [
"letters = ['a', 'b', 'c']\n",
"print(\"Letter #1 is\", letters[0])\n",
"print(\"Letter #2 is\", letters[1])\n",
"print(\"Letter #3 is\", letters[2])\n",
"print(\"Letter #4 is\", letters[3])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### File Errors"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Typically two:\n",
"<li> Trying to access a file that does not exist:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"ename": "FileNotFoundError",
"evalue": "[Errno 2] No such file or directory: 'myfile.txt'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mFileNotFoundError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-10-f6e1ac4aee96>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mfile_handle\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'myfile.txt'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'r'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'myfile.txt'"
]
}
],
"source": [
"file_handle = open('myfile.txt', 'r')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<li> You try to read(write) a write-only(read-only) file:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"ename": "UnsupportedOperation",
"evalue": "not readable",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mUnsupportedOperation\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-12-02e2f546ed29>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mfile_handle\u001b[0m\u001b[1;33m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'myfile.txt'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'w'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mfile_handle\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mread\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mUnsupportedOperation\u001b[0m: not readable"
]
}
],
"source": [
"file_handle= open('myfile.txt', 'w')\n",
"file_handle.read()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Exercises\n",
"\n",
"### Reading Error Messages "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Read the python code and the resulting traceback below, and answer the following questions:\n",
"\n",
"* How many levels does the traceback have? **3 levels**\n",
"* What is the function name where the error occurred? **print_message**\n",
"* On which line number in this function did the error occurr? **11**\n",
"* What is the type of error? **Keyerror**\n",
"* What is the error message? **'Friday'**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"```\n",
"# This code has an intentional error. Do not type it directly;\n",
"# use it for reference to understand the error message below.\n",
"def print_message(day):\n",
" messages = {\n",
" \"monday\": \"Hello, world!\",\n",
" \"tuesday\": \"Today is tuesday!\",\n",
" \"wednesday\": \"It is the middle of the week.\",\n",
" \"thursday\": \"Today is Donnerstag in German!\",\n",
" \"friday\": \"Last day of the week!\",\n",
" \"saturday\": \"Hooray for the weekend!\",\n",
" \"sunday\": \"Aw, the weekend is almost over.\"\n",
" }\n",
" print(messages[day])\n",
"\n",
"def print_friday_message():\n",
" print_message(\"Friday\")\n",
"\n",
"print_friday_message()\n",
"---------------------------------------------------------------------------\n",
"KeyError Traceback (most recent call last)\n",
"<ipython-input-1-4be1945adbe2> in <module>()\n",
" 14 print_message(\"Friday\")\n",
" 15\n",
"---> 16 print_friday_message()\n",
"\n",
"<ipython-input-1-4be1945adbe2> in print_friday_message()\n",
" 12\n",
" 13 def print_friday_message():\n",
"---> 14 print_message(\"Friday\")\n",
" 15\n",
" 16 print_friday_message()\n",
"\n",
"<ipython-input-1-4be1945adbe2> in print_message(day)\n",
" 9 \"sunday\": \"Aw, the weekend is almost over.\"\n",
" 10 }\n",
"---> 11 print(messages[day])\n",
" 12\n",
" 13 def print_friday_message():\n",
"\n",
"KeyError: 'Friday'```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Identifying Syntax Errors"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Read the code below, and (without running it) try to identify what the errors are.\n",
"\n",
"Run the code, and read the error message. Is it a SyntaxError or an IndentationError?\n",
"Fix the error.\n",
"Repeat steps 2 and 3, until you have fixed all the errors.\n",
"```\n",
"def another_function # Falta ():\n",
" print(\"Syntax errors are annoying.\")\n",
" print(\"But at least python tells us about them!\") # Mala indentación\n",
" print(\"So they are usually not too hard to fix.\")```"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Syntax errors are annoying.\n",
"But at least python tells us about them!\n",
"So they are usually not too hard to fix.\n"
]
}
],
"source": [
"def another_function():\n",
" print(\"Syntax errors are annoying.\")\n",
" print(\"But at least python tells us about them!\")\n",
" print(\"So they are usually not too hard to fix.\")\n",
"another_function()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Analyzing Patient Data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We are studying inflammation in patients who have been given a new treatment for arthritis, and need to analyze the first dozen data sets of their daily inflammation. The data sets are stored in comma-separated values (CSV) format: each row holds information for a single patient, and the columns represent successive days"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We want to:\n",
"\n",
" * load that data into memory,\n",
" * calculate the average inflammation per day across all patients, and\n",
" * plot the result.\n",
"\n",
"To do all that, we’ll have to learn a little bit about programming."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Python as a calculator\n",
"\n",
"Any Python interpreter can be used as a calculator:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"23"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"3 + 5 * 4"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here you have an overview of math operators:\n",
"\n",
"| Operators | Operations | Examples |\n",
"| :--------:| :---------------- | ---------- |\n",
"| + | Addition | 2 + 3 = 5 |\n",
"| - | Substraction | 3 - 2 = 1 |\n",
"| * | Multiplication | 2 * 3 = 6 |\n",
"| / | Division | 3 / 2 = 1.5|\n",
"| // | Integer division | 7 // 3 = 2 |\n",
"| % | remainder division| 7 % 2 = 1 |\n",
"| ** | Exponent | 2**3 = 8 |"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Variables"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This only outputs a value. To use values in any manner, we have to access them in memory by using a variable.\n",
"\n",
"In Python, variable names:\n",
"\n",
"* can include letters, digits, and underscores\n",
"* cannot start with a digit\n",
"* are case sensitive.\n",
"\n",
"Let's assign a value 55 to variable named ``weight_kg``:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"weight_kg = 55 # we assign the value 55 to the variable weight_kg using ="
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We use ``print`` to output the value of a variable. Is a built-in function:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"55\n"
]
}
],
"source": [
"print(weight_kg) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can do some arithmetics with variables:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Weight in pounds: 121.00000000000001\n"
]
}
],
"source": [
"print(\"Weight in pounds: \", 2.2 * weight_kg) # Don't forget to explain about printing\n",
" # types, strings and comma separation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"What the ...?? why is not simply giving 121.0??? <br>\n",
"(<strong>Pro tip:</strong> <em>Because 2.2 is a number with no exact float representation, so it multiplies by the closest number with a float representation. That produces a 1 at the last decimal position so Python realices that there is something non-zero at the end and plots it.</em>)<br><br>\n",
"Well it looks 121 enought to me.... Ok let's continue. \n",
"\n",
"We can change the value of a variable by re-assigning it:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Weight in kilograms is now: 57.5\n"
]
}
],
"source": [
"weight_kg = 57.5\n",
"print('Weight in kilograms is now:', weight_kg)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Variables as sticky notes with the name put in a particular value.<br>\n",
"<img src=\"https://scw-ss.github.io/python-novice-inflammation-2016-06-27-cfmehu/fig/python-sticky-note-variables-01.svg\">\n",
"\n",
"We can create new variables from others:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"weight in kilograms: 57.5 and in pounds: 126.50000000000001\n"
]
}
],
"source": [
"weight_lb = 2.2 * weight_kg\n",
"\n",
"print( 'weight in kilograms: ', weight_kg, 'and in pounds: ', weight_lb) #concatenating complex expressions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"https://scw-ss.github.io/python-novice-inflammation-2016-06-27-cfmehu/fig/python-sticky-note-variables-02.svg\">"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"What happens to ``weight_lb`` if you change ``weight_kg``?:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"weight in kilograms: 100 and in pounds: 126.50\n"
]
}
],
"source": [
"weight_kg = 100 # we change the sticky note of weight to 100 \n",
"print( 'weight in kilograms: ', weight_kg, 'and in pounds: %.2f' %weight_lb) #Do it as an exercise"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"https://scw-ss.github.io/python-novice-inflammation-2016-06-27-cfmehu/fig/python-sticky-note-variables-03.svg\">"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<br>\n",
"Command <code>%whos</code> shows memory stored variables defined along the notebook:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Variable Type Data/Info\n",
"------------------------------\n",
"weight_kg int 100\n",
"weight_lb float 126.50000000000001\n"
]
}
],
"source": [
"%whos"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Exercise\n",
"\n",
"What does the following program print out?\n",
"\n",
"<code>\n",
"first, second = 'Grace', 'Hopper'\n",
"third, fourth = second, first\n",
"print(third, fourth)\n",
"<code/>"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hopper Grace\n"
]
}
],
"source": [
"first, second = 'Grace', 'Hopper'\n",
"third, fourth = second, first\n",
"print(third, fourth)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Using libraries (modules)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, we will load a library. Let's import Numpy. Numpy is important for fancy number manipulations:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Libraries provide additional functionality to the basic Python package. Importing too many libraries can sometimes complicate and slow down your programs - so we only import what we need for each program.\n",
"\n",
"Now we read the first file where patient data are stored. \n",
"\n",
"We will use functions which belong to a certain library and perform \"something\" for us. In this case we want to load a data file"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0., 0., 1., ..., 3., 0., 0.],\n",
" [ 0., 1., 2., ..., 1., 0., 1.],\n",
" [ 0., 1., 1., ..., 2., 1., 1.],\n",
" ..., \n",
" [ 0., 1., 1., ..., 1., 1., 1.],\n",
" [ 0., 0., 0., ..., 0., 2., 0.],\n",
" [ 0., 0., 1., ..., 1., 1., 0.]])"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"numpy.loadtxt(fname=\"inflammation-01.csv\", delimiter=\",\") #Explain what is a function call\n",
" # and what are parameters briefly\n",
"# Do not forget to explain why the elipsis below "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The expression ``numpy.loadtxt(...)`` is a function call that asks Python to run the function loadtxt which belongs to the numpy library. This dotted notation is used everywhere in Python: the thing that appears before the dot contains the thing that appears after."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"``numpy.loadtxt`` has two parameters: the name of the file we want to read, and the delimiter that separates values on a line. These both need to be character strings (or strings for short), so we put them in quotes."
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"We did not assign the output of the function to any variable, so the notebook just dumped the ouptut to an ``Out[]`` cell. But, just the same way we asigned values to a variable, we can assing the array of values to an variable using the same syntax:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"data = numpy.loadtxt(fname='inflammation-01.csv', delimiter=',') "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"No output here, as we just assigned, as we did before with ``weight_kg``. To print out the variable value:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 0. 0. 1. ..., 3. 0. 0.]\n",
" [ 0. 1. 2. ..., 1. 0. 1.]\n",
" [ 0. 1. 1. ..., 2. 1. 1.]\n",
" ..., \n",
" [ 0. 1. 1. ..., 1. 1. 1.]\n",
" [ 0. 0. 0. ..., 0. 2. 0.]\n",
" [ 0. 0. 1. ..., 1. 1. 0.]]\n"
]
}
],
"source": [
"print(data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's check what type of \"thing\" ``data`` variable refers to:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'numpy.ndarray'>\n"
]
}
],
"source": [
"print(type(data)) #You should explain numpy arrays at this point"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"When we create a variable, <strong>we also create information about it</strong>, as the attribute shape! That's very important!!\n"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(60, 40)\n"
]
}
],
"source": [
"print(data.shape) # Explain here that once we created \n",
" # data we also created a information about \n",
" # the array called members or attributes that describe \n",
" # data in the same way an adjetive describes a noun"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So we have 60 rows and 40 columns in ``data`` variable."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In order to get a single number from the array we provide an index in square brackets, just as we do in maths"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"first value in data: 0.0\n"
]
}
],
"source": [
"print('first value in data:', data[0,0]) # You should explain here than in many \n",
" # languages arrays start by 0"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"middle value in data: 13.0\n"
]
}
],
"source": [
"print('middle value in data:', data[30,20])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"Selecting intervals of data by using ranges : . <strong>Caution here!:</strong>ranges seem closed but they are [) "
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 0. 0. 1. 2. 2. 4. 2. 1. 6. 4.]\n",
" [ 0. 0. 2. 2. 4. 2. 2. 5. 5. 8.]\n",
" [ 0. 0. 1. 2. 3. 1. 2. 3. 5. 3.]\n",
" [ 0. 0. 0. 3. 1. 5. 6. 5. 5. 8.]\n",
" [ 0. 1. 1. 2. 1. 3. 5. 3. 5. 8.]]\n"
]
}
],
"source": [
"print(data[5:10, 0:10]) # Selecting rows 0,1,2,3 and cols from 0 to 9. Important! notice upper limits are not \n",
" # included in the counting\n",
" # You don't have to start slices at 0"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is how index is assigned by python:\n",
"<img width=\"700px\" src=\"http://swcarpentry.github.io/python-novice-inflammation/fig/python-zero-index.png\">\n",
"<br>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There is no need to include upper and lower bounds:"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"small is: \n",
"[[ 2. 3. 0. 0.]\n",
" [ 1. 1. 0. 1.]\n",
" [ 2. 2. 1. 1.]]\n"
]
}
],
"source": [
"small = data[:3, 36:] # There is no need to include upper and lower bounds\n",
"print ('small is: ')\n",
"print (small)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Exercise\n",
"\n",
"what does ``data[3:3, 4:4]`` produce? \n",
"What about ``data[3:3, :]``?\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[]\n",
"[]\n"
]
}
],
"source": [
"print(data[3:3, 4:4])\n",
"print(data[3:3, :])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Some array math\n",
"Basic arithmetics: The operation is performed in <strong>every element</strong> of the array"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"original:\n",
"[[ 2. 3. 0. 0.]\n",
" [ 1. 1. 0. 1.]\n",
" [ 2. 2. 1. 1.]]\n",
"doubledata: \n",
"[[ 4. 6. 0. 0.]\n",
" [ 2. 2. 0. 2.]\n",
" [ 4. 4. 2. 2.]]\n"
]
}
],
"source": [
"doubledata = 2 * data # The x2 operation is made in every element of the array\n",
"print('original:')\n",
"print(data[:3,36:])\n",
"print('doubledata: ')\n",
"print(doubledata[:3,36:])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Array to Array operations: The operation is made on <strong>each corresponding element</strong> of the arrays:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"tripledata:\n",
"[[ 6. 9. 0. 0.]\n",
" [ 3. 3. 0. 3.]\n",
" [ 6. 6. 3. 3.]]\n"
]
}
],
"source": [
"tripledata = doubledata + data #Array-Array operations are made on each corresponding element\n",
"print('tripledata:')\n",
"print(tripledata[:3,36:])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"More complex operations:\n",
"<br>The following is a method. Method are actions that can be made on the variable, Python knows how to!. <strong> The actions available depend on the variable type</strong>:"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"6.14875\n"
]
}
],
"source": [
"print(data.mean()) # method: Difference with attribute->\n",
" # they can take parameters that modify the behavior\n",
" # Note the parenthesis. They are \n",
" # actions related to the object, whereas the attributes \n",
" # are descriptions of the object in \n",
" # question. Maybe is better to explain tab completion here...!!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div class=\"panel panel-info\">\n",
"<div class=\"panel-heading\">\n",
"<h3 class=\"panel-title\">\n",
"Reminder: method vs attribute\n",
"</h3>\n",
"</div>\n",
"<div class=\"panel-body\">\n",
"<ul>\n",
"<li> attributes are descriptions of variable properties\n",
"<li> methods are actions that Python knows to perform on the variable\n",
"</ul>\n",
"</div>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Several important methods for numpy variables:"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"maximum inflammation: 20.0\n",
"minimum inflammation: 0.0\n",
"standard deviation: 4.61383319712\n"
]
}
],
"source": [
"print('maximum inflammation:', data.max())\n",
"print('minimum inflammation:', data.min())\n",
"print('standard deviation:', data.std())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Sometimes is useful to make some partial statistics. For instance max inflammation for first patient of all days: "
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"maximum inflammation for patient 0: 18.0\n"
]
}
],
"source": [
"patient_0 = data[0,:] #One possibility is creating an array\n",
"print('maximum inflammation for patient 0:', patient_0.max())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Oh wait... maybe I am creating to many variables... let's check:"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Variable Type Data/Info\n",
"---------------------------------\n",
"data ndarray 60x40: 2400 elems, type `float64`, 19200 bytes\n",
"doubledata ndarray 60x40: 2400 elems, type `float64`, 19200 bytes\n",
"numpy module <module 'numpy' from '/ho<...>kages/numpy/__init__.py'>\n",
"patient_0 ndarray 40: 40 elems, type `float64`, 320 bytes\n",
"small ndarray 3x4: 12 elems, type `float64`, 96 bytes\n",
"weight_kg int 100\n",
"weight_lb float 126.50000000000001\n"
]
}
],
"source": [
"%whos"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Sometimes we can avoid the use of some variables:"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"maximum inflamation for patient 2: 19.0\n"
]
}
],
"source": [
"print('maximum inflamation for patient 2:', data[2, :].max())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"What if we need max inflammation for all patients at once?. Operations along all columns or rows at once:<br>\n",
"<img src=\"https://scw-ss.github.io/python-novice-inflammation-2016-06-27-cfmehu/fig/python-operations-across-axes.png\">\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then the calculation for the average inflammation over all patients per day is:"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0. 0.45 1.11666667 1.75 2.43333333 3.15\n",
" 3.8 3.88333333 5.23333333 5.51666667 5.95 5.9\n",
" 8.35 7.73333333 8.36666667 9.5 9.58333333\n",
" 10.63333333 11.56666667 12.35 13.25 11.96666667\n",
" 11.03333333 10.16666667 10. 8.66666667 9.15 7.25\n",
" 7.33333333 6.58333333 6.06666667 5.95 5.11666667 3.6\n",
" 3.3 3.56666667 2.48333333 1.5 1.13333333\n",
" 0.56666667]\n"
]
}
],
"source": [
"print(data.mean(axis=0)) #columns"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A quick check that the array is ok:"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(40,)\n"
]
}
],
"source": [
"print(data.mean(axis=0).shape) #Quick check everything if fine"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Or if preferred, the average inflammation over all days per patient:"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 5.45 5.425 6.1 5.9 5.55 6.225 5.975 6.65 6.625 6.525\n",
" 6.775 5.8 6.225 5.75 5.225 6.3 6.55 5.7 5.85 6.55\n",
" 5.775 5.825 6.175 6.1 5.8 6.425 6.05 6.025 6.175 6.55\n",
" 6.175 6.35 6.725 6.125 7.075 5.725 5.925 6.15 6.075 5.75\n",
" 5.975 5.725 6.3 5.9 6.75 5.925 7.225 6.15 5.95 6.275 5.7\n",
" 6.1 6.825 5.975 6.725 5.7 6.25 6.4 7.05 5.9 ]\n"
]
}
],
"source": [
"print(data.mean(axis=1)) # mean of each row"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(60,)\n"
]
}
],
"source": [
"print(data.mean(axis=1).shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data visualization"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ploting is great for insight! Matplotlib is <em>the facto</em> standar. Some basics:\n",
"<br>\n",
"Just pick the pyplot library of Matplotlib:"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import matplotlib.pyplot # Diffrence with numpy: Matplotlib is a extense package.\n",
" # We only want pyplot at the moment\n",
" # You may get a warning here about rendering fonts. If we re-run it not htere anymore."
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div class=\"panel panel-info\">\n",
"<div class=\"panel-heading\">\n",
"<h3 class=\"panel-title\">\n",
"IPython Magic!\n",
"</h3>\n",
"</div>\n",
"<div class=\"panel-body\">\n",
"The % indicates an IPython magic function - a funciton that is valid only within the notebook environment.\n",
"</div>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's plot data array (the average inflammation per day):"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nTQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f77beaa4860>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"image = matplotlib.pyplot.imshow(data) # Remider: explain %matplotlib inline Note: Ipython!!\n",
" # otherwise matplotlib.pyplot.show() is mandatory!!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Average inflammation over time. Linear plot:"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f77bea78048>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ave_inflammation = data.mean(axis=0)\n",
"ave_plot = matplotlib.pyplot.plot(ave_inflammation)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This plot does not correspond with the expected. The model predices a smooth sharper rise and a slower after fall. Let's have a look to the other statistics:"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nxP8DpFAe9vF8qV0AAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x77e6050>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"max_plot = matplotlib.pyplot.plot(data.max(axis=0))"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nPeTuS1uPfU/Se+7+d60fhKe6+201rHO1pA/c/e+rrG2MmS2QtMDdh8xslqT/UrSn4Kuq0XpOUucf\nqkbrKUlmdpK7729d2/qlpFsk/YFqtJ6T1PlF1W89b5W0XNJsd78uzfd61jPtWmy8iclUw1kr7v6C\npGN/kFwv6cHW5w9K+r1Si5pAmzqlaF1rwd23uftQ6/O9kjZK6lfN1rNNnWN7H2qznpLk7vtbn56g\n6BqYq2brKbWtU6rReppZv6QvSbp33MOJ1zJriNVi401MLukZM1tnZl+rupgO5rv7din6Bpc0v+J6\nJnOzmQ2Z2b1V/5o8npktkjQg6T8lnVHX9RxX59rWQ7Vaz9av8+slbZP0jLuvUw3Xs02dUr3W8weS\nvqP//4EipVjL2p15Fugqd79U0U+6m1q/7oeirleL/1HSee4+oOibpRa/hrZaDj+S9K3Wmeyx61eL\n9Zygztqtp7sfcfdLFP3GssLMlqiG6zlBnRepRutpZqskbW/9hjXZ2X/Htcwa2v8jaeG4P/e3Hqsd\nd9/a+udOSU8oau3U1XYzO0P6pP+5o+J6JuTuO8e9x9w/Sbqsynokycz6FAXhw+7+ZOvh2q3nRHXW\ncT3HuPseSU1JK1XD9Rwzvs6aredVkq5rXVt7VNLnzexhSduSrmXW0F4n6XwzO8fMpku6QdJTGV8z\nd2Z2UuusRmY2U9IXJNXpDYVMR//0fUrSn7c+/zNJTx77H1TkqDpbX2Rjfl/1WNP7Jb3i7neNe6yO\n63lcnXVbTzObN9ZSMLMZkn5XUf+9VuvZps5NdVpPd/+uuy909/MU5eRz7v4nkn6ipGvp7pk+FP3k\nfVXSa5Juy/p6RXxIOlfSkKT1kkbqVKekRxTdeXNA0tuK7nQ4VdKzrXVdI+mUmtb5kKSXWmv7Y0X9\nuSprvErS4XF/1y+2vj5Pq9N6TlJn3dbz4lZtQ626/qr1eN3Ws12dtVrPcfX+lqSn0q4lm2sAICC9\ndCESAIJHaANAQAhtAAgIoQ0AASG0ASAghDYABITQBoCAENoAEJD/A05hwmP+LPV6AAAAAElFTkSu\nQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7805410>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"min_plot = matplotlib.pyplot.plot(data.min(axis=0))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"None of them seems very likely to fit the model. <strong> Something could be wrong with the data</strong>\n",
"<br>\n",
"<br>\n",
"We can further improve the visualization by grouping plots in a multiplot:"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f77bea35668>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = matplotlib.pyplot.figure(figsize=(10.0, 3.0)) # Figure canvas, size in inches!!\n",
"\n",
"\n",
"axes1 = fig.add_subplot(1,3,1) # Means: add subplot to a 1x3 grid in the first place\n",
"axes2 = fig.add_subplot(1,3,2) # Means: add subplot to a 1x3 grid in the second place\n",
"axes3 = fig.add_subplot(1,3,3) # Means: add subplot to a 1x3 grid in the third place\n",
"\n",
"axes1.set_ylabel('average')\n",
"axes1.plot(data.mean(axis=0))\n",
"axes2.set_ylabel('max')\n",
"axes2.plot(data.max(axis=0))\n",
"axes3.set_ylabel('min')\n",
"axes3.plot(data.min(axis=0))\n",
"\n",
"fig.tight_layout() # Adjust the subplots to fit the margins\n",
"\n",
"matplotlib.pyplot.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Additional Exercises "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Slicing strings"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"first three characters: oxi\n",
"last three characters: gen\n"
]
}
],
"source": [
"element = 'oxigen'\n",
"print('first three characters:', element[0:3])\n",
"print('last three characters:', element[-3:])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"What is the value of element[:4]? What about element[4:]? Or element[:]?"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'en'"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"element[4:]"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'oxig'"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"element[:4]\n"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'oxigen'"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"element[:]\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"What is element[-1]? What is element[-2]?"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'n'"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"element[-1]"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'e'"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"element[-2]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Given those answers, explain what element[1:-1] does."
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'xige'"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"element[1:-1]"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Lists\n",
"They are used to store many values. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Difference with array?\n",
"<li>They are very similar but they do not belong to numpy, and do not have some of the attributes of numpy arrays, such as mean sd max min etc... Beside this they are pretty similar in concept\n",
"<li>We create a list the same "
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"odds are: [1, 3, 5, 7]\n"
]
}
],
"source": [
"odds = [1, 3, 5, 7]\n",
"print('odds are:', odds)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Selecting elements of a list:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"first and last: 1 7\n"
]
}
],
"source": [
"print('first and last:', odds[0], odds[-1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can loop over a list:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1\n",
"3\n",
"5\n",
"7\n"
]
}
],
"source": [
"for number in odds: #explain iterables\n",
" print(number)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"List are also pretty similar to strings. There is an <strong>IMPORTANT</strong> difference between strings and lists: Elements in a list can be modified but not ones in a string:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"names originally: ['Newton', 'Darwing', 'Turing']\n",
"names corrected: ['Newton', 'Darwin', 'Turing']\n"
]
}
],
"source": [
"names = ['Newton', 'Darwing', 'Turing']\n",
"print('names originally:', names)\n",
"names[1]='Darwin'\n",
"print('names corrected:', names)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"But:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "'str' object does not support item assignment",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-5-7d3b982a1b78>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mname\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'Bell'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mname\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'a'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment"
]
}
],
"source": [
"name = 'Bell' #Explain mutability\n",
"name[1] = 'a'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### List of Lists or nested lists\n",
"Making a list whose elements are also lists."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Example: Products in the shelves of a shop. We can print the results of the index operations in the images:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"x = [['salt', 'zuchini', 'onion'], ['cabbage', 'lettuce', 'garlic'],['apple','pear','banana']]"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[['salt', 'zuchini', 'onion']]\n"
]
}
],
"source": [
"print([x[0]])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can print the first element of the list <code>x</code>:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['salt', 'zuchini', 'onion']\n"
]
}
],
"source": [
"print(x[0]) # Prints x's first element, in this case again a list"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Printing first element of <code>x[0]</code> list:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"salt\n"
]
}
],
"source": [
"print(x[0][0]) # Prints x's first element's first element. In this case a string"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Modifying list contents\n",
"Many ways to change a string"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1, 3, 5, 7, 11]\n"
]
}
],
"source": [
"odds.append(11) # Add 11 at the end of the list. Also written as +=[] \n",
"print(odds) # Explain that operators have different effects depending on the nature of the operands"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[3, 5, 7, 11]\n"
]
}
],
"source": [
"del odds[0]\n",
"print(odds)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"reversed odds: [11, 7, 5, 3]\n"
]
}
],
"source": [
"odds.reverse()\n",
"print('reversed odds:', odds)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Exercise\n",
"\n",
"#### Turn string into a list\n",
"\n",
"Use a for-loop to convert the string “hello” into a list of letters:\n",
"\n",
"<code>\n",
"[\"h\", \"e\", \"l\", \"l\", \"o\"]\n",
"<code/>\n",
"\n",
"Hint: You can create an empty list like this:\n",
"\n",
"``my_list = []``"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"the list: ['h', 'e', 'l', 'l', 'o']\n"
]
}
],
"source": [
"my_list = []\n",
"\n",
"for letter in 'hello':\n",
" my_list +=[letter] \n",
"print('the list:', my_list)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<strong>Caution here!</strong>: List are treated slightly conterintuitive:<br>\n",
"<em>Pro-tip: Technically it is said that lists are copied \"by reference\" instead of \"by value\"</em>"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"primes: [1, 3, 5, 7, 2]\n",
"odds: [1, 3, 5, 7, 2]\n"
]
}
],
"source": [
"odds = [1, 3, 5, 7]\n",
"primes = odds # list do not behave has simple variables, \n",
" # when assigning it does not copy the whole list, but adds\n",
" # a reference to the list odds named primes\n",
"primes += [2] \n",
"print('primes:', primes)\n",
"print('odds:', odds)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can make a single copy of the original list using list built-in"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"primes: [1, 3, 5, 7, 2]\n",
"odds: [1, 3, 5, 7]\n"
]
}
],
"source": [
"odds = [1, 3, 5, 7]\n",
"primes = list(odds) # This time a new copy of the list is done\n",
"primes += [2]\n",
"print('primes:', primes)\n",
"print('odds:', odds)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div class=\"panel panel-info\">\n",
"<div class=\"panel panel-heading\">\n",
"<h3>Reminder: When not to use \"list\" method?</h3>\n",
"</div>\n",
"<div class=\"panel panel-body\">\n",
"<li>Reference copy uses less resources \n",
"<li>Is the default when relating lists through assignment\n",
"<li>But whether you need to do a reference or a copy is your choice!!\n",
"</div>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Exercise\n",
"\n",
"#### Overloading\n",
"\n",
"`+` usually means addition, but when used on strings or lists, it means “concatenate”. Given that, what do you think the multiplication operator * does on lists? In particular, what will be the output of the following code?\n",
"\n",
"<code>\n",
"counts = [2, 4, 6, 8, 10]\n",
"repeats = counts * 2\n",
"<code/>"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2, 4, 6, 8, 10, 2, 4, 6, 8, 10]\n"
]
}
],
"source": [
"counts = [2, 4, 6, 8, 10]\n",
"repeats = counts * 2 # The * operator applied to lists replicates the elements in it a given number of times\n",
"print(repeats)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Repeating Actions with Loops"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We found some suspicious features in our firs dataset \"inflammation-01.csv\". It is possible that other datasets are also affected by this?? We would like to check... Fast!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Repeat tasks:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We have a lot of data sets and we have to tell the computer how to repeat things.\n",
"<br>\n",
"Let's first do something simpler: Show each character in a string!"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"l\n",
"e\n",
"a\n",
"d\n"
]
}
],
"source": [
"word = 'lead' # From wich number to wich number we had to go? Ask people\n",
"print(word[0])\n",
"print(word[1])\n",
"print(word[2])\n",
"print(word[3])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bad approach: tedious and if the string is larger it misses some characters, and if it shorter:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"t\n",
"i\n",
"n\n"
]
},
{
"ename": "IndexError",
"evalue": "string index out of range",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-2-61757d5ac451>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mword\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mword\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mword\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mIndexError\u001b[0m: string index out of range"
]
}
],
"source": [
"word = 'tin' # Bad approach, if the string is larger it misses characters and if it shorter it fails!\n",
"print(word[0])\n",
"print(word[1])\n",
"print(word[2])\n",
"print(word[3])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### There is a better approach: Recursion\n",
"Recursion is made by for loops:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Example 1. A better way:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"l\n",
"e\n",
"a\n",
"d\n"
]
}
],
"source": [
"word = 'lead'\n",
"for char in word:\n",
" print(char)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The method supports strings of any lenght:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"o\n",
"x\n",
"i\n",
"g\n",
"e\n",
"n\n"
]
}
],
"source": [
"word = 'oxigen'\n",
"for char in word:\n",
" print (char)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's see it in action:\n",
"<img src=\"https://scw-ss.github.io/python-novice-inflammation-2016-06-27-cfmehu/fig/loops_image.png\">"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### General form of a for-loop:\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img width=\"800px\" src=\"https://www.safaribooksonline.com/library/view/head-first-python/9781449397524/httpatomoreillycomsourceoreillyimages1368346.png.jpg\">"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can choose any name we want for variables. "
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"o\n",
"x\n",
"y\n",
"g\n",
"e\n",
"n\n"
]
}
],
"source": [
"word = 'oxygen'\n",
"for banana in word:\n",
" print(banana)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Example 2. This loop repeatedly updates a variable that acts as counter. It is very usual to find this structure:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"There are 5 vowels\n"
]
}
],
"source": [
"lenght = 0\n",
"for vowel in 'aeiou': # The process details can be explained here\n",
" lenght = lenght + 1 # Explain what happens if lenght is inside\n",
"print('There are ',lenght,'vowels')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The for body is executed 5 times\n",
"<ul>\n",
"<li>1st: vowel eqs a; lenght eqs 1\n",
"<li>2st: vowel eqs e; lenght eqs 2\n",
"<li>etc.."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Off-topic tip: Some loops frecuently used are wraped inside very useful methods, such as <code>len</code> which returns the length of the variable. The methods avaiable by default in Python without import a thing are called <em>built-in</em> methods"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"5\n"
]
}
],
"source": [
"print(len('aeiou')) # built-in function to get the length of a string (and the length of many other things...). \n",
" # Is faster and much easier to read than a for loop"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Exercises"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### From 1 to N"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Python has a built-in function called range that creates a sequence of numbers. Using range, write a loop that uses range to print the first 3 odd natural numbers. Use the builtin help!"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1\n",
"3\n",
"5\n"
]
}
],
"source": [
"for num in range(1,6,2):\n",
" print (num)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Making choices\n",
"\n",
"In last section we discovered something suspicios in our inflammation data by drawing some plots. How can we use Python\n",
"to automatically detect the anomalies we found and take an action for each of them?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<strong>By writing code that runs only certain conditions</strong>:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Conditionals\n",
"\n",
"A conditional is a piece of code that takes different actions depending on a condition:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Imagine we want to determine if a certain number is lower or greater than 100. The flow of this conditional:\n",
"<img src=\"https://scw-ss.github.io/python-novice-inflammation-2016-06-27-cfmehu/fig/python-flowchart-conditional.png\">"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This scheme is achieved in Python by means of the <code>if</code>/<code>else</code> clause:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"not greater\n",
"done\n"
]
}
],
"source": [
"num = 37\n",
"if num > 100:\n",
" print('greater')\n",
"else:\n",
" print('not greater')\n",
"print('done')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Sometimes there is no need to use a else, it depends on the logic of the problem:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"before conditional....\n",
"... after conditional\n"
]
}
],
"source": [
"num = 53\n",
"print ('before conditional....')\n",
"if num > 100:\n",
" print ('53 is greater than 100')\n",
"print('... after conditional')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Sometimes the flow of the decision is more complex. There are still multiple choices available \n",
"when the first condition is discarded. <br>\n",
"As an example imagine we want to know if a given number is positive negative or zero. We make use of the <code>elif</code> clause:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-3 is negative\n"
]
}
],
"source": [
"\n",
"num = -3\n",
"\n",
"if num > 0:\n",
" print(num, 'is positive')\n",
"elif num == 0: # note the sign == instead of =. The reason is that \"==\" tests equality whereas \"=\" means assignment\n",
" print(num, 'is zero')\n",
"else:\n",
" print(num, 'is negative')\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<strong>Note the \"==\"</strong>. This symbol checks equality rather than \"=\" wich means assingment"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Exercises\n",
"\n",
"#### What Is Truth?"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"word is true\n",
"non-empty list is true\n",
"one is true\n"
]
}
],
"source": [
"if '':\n",
" print('empty string is true')\n",
"if 'word':\n",
" print('word is true')\n",
"if []:\n",
" print('empty list is true')\n",
"if [1, 2, 3]:\n",
" print('non-empty list is true')\n",
"if 0:\n",
" print('zero is true')\n",
"if 1:\n",
" print('one is true')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### That’s Not Not What I Meant"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"empty string is not true\n",
"not not True is true\n"
]
}
],
"source": [
"if not '':\n",
" print('empty string is not true')\n",
"if not 'word':\n",
" print('word is not true')\n",
"if not not True:\n",
" print('not not True is true')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Composed conditions\n",
"We can write complex conditions in the if clause by using concatenation of simple conditions by means of <code>and</code> and <code>or</code>. <br>\n",
"As in human language an <code>and</code> condition is True if all its components are True:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"at least one part is false\n"
]
}
],
"source": [
"# We can add complex conditions to the if clause, concatenating sentences with \"or\" and \"and\"\n",
"\n",
"if (1 > 0) and (-1 > 0): # Note the () the are not really needed but the reading is clearer\n",
" # and the \"and\". For and \"and\" to be true every part has to be true by itself\n",
" print ('both parts are true')\n",
"else:\n",
" print('at least one part is false')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Whereas an <code>or</code> condition is True if any of it components is True:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"at least one part is true\n"
]
}
],
"source": [
"if (1 > 0) or (-1 > 0): # Note that an \"or\" condition is true if any of the parts is true\n",
" print('at least one part is true')\n",
"else:\n",
" print('none of them are true')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Exercise\n",
"\n",
"#### Close Enough\n",
"\n",
"Write some conditions that print True if the variable a is within 5% of the variable b and False otherwise. Compare your implementation with your partner’s: do you get the same answer for all possible pairs of numbers?"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"False\n"
]
}
],
"source": [
"a = .9\n",
"b = 1\n",
"if (a > 0.9 * b) and (a < 1.1 * b): # We consider within as strictly below b+5% and above b-5%\n",
" print('True')\n",
"else:\n",
" print('False')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"True\n"
]
}
],
"source": [
"print(abs(a - b) < 0.1 * abs(b))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"multiplication=a*b\n",
"substraction=a-b"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Variable Type Data/Info\n",
"-----------------------------------\n",
"a float 0.9\n",
"b int 1\n",
"multiplication float 0.9\n",
"substraction float -0.09999999999999998\n"
]
}
],
"source": [
"%whos"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Checking our Data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we are in conditions to check our suspicious data in the inflammation tests.<br>\n",
"First two files max inflammation seems to rise linearly. So let's write a code that check this behavior and show warning:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Suspicious looking maxima\n"
]
}
],
"source": [
"import numpy\n",
"\n",
"data = numpy.loadtxt(fname='inflammation-01.csv', delimiter=',')\n",
"if (data.max(axis=0)[0]==0) and (data.max(axis=0)[20]==20): # Anomalous linear behavior of the max in the data\n",
" print('Suspicious looking maxima')\n",
"elif (data.min(axis=0).sum() == 0):\n",
" print('Minima add up to zero')\n",
"else:\n",
" print('Everything seems OK')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We saw a different issue in file 3. All minima where 0. So we write a code to check that:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Minima add up to zero\n"
]
}
],
"source": [
"data = numpy.loadtxt(fname='inflammation-03.csv', delimiter=',')\n",
"if (data.max(axis=0)[0]==0) and (data.max(axis=0)[20]==20): # Anomalous linear behavior of the max in the data\n",
" print('Suspicious looking maxima')\n",
"elif (data.min(axis=0).sum() == 0):\n",
" print('Minima add up to zero')\n",
"else:\n",
" print('Everything seems OK')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can check now several files putting all toghether:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import glob"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"inflammation-01.csv :\n",
"Suspicious looking maxima\n",
"inflammation-02.csv :\n",
"Suspicious looking maxima\n",
"inflammation-03.csv :\n",
"Minima add up to zero\n"
]
}
],
"source": [
"filenames = sorted(glob.glob('inflammation*.csv'))\n",
"filenames = filenames[0:3] # Get elements 0, 1 and 2 of the list corresponding to inf-01 inf-02 and inf-03\n",
"filenames\n",
"for f in filenames:\n",
" print(f,':')\n",
" data = numpy.loadtxt(fname=f, delimiter=',')\n",
" if (data.max(axis=0)[0]==0) and (data.max(axis=0)[20]==20): # Anomalous linear behavior of the max in the data\n",
" print('Suspicious looking maxima')\n",
" elif (data.min(axis=0).sum() == 0):\n",
" print('Minima add up to zero')\n",
" else:\n",
" print('Everything seems OK')\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Additional Exercises"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## How many paths?"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"C\n"
]
}
],
"source": [
"if 4 > 5:\n",
" print('A')\n",
"elif 4 == 5:\n",
" print('B')\n",
"elif 4 < 5:\n",
" print('C')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### In-place operators"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Python (and most other languages in the C family) provides in-place operators that work like this:\n",
"\n",
"```x = 1 # original value\n",
"x += 1 # add one to x, assigning result back to x\n",
"x *= 3 # multiply x by 3\n",
"print(x)```\n",
"\n",
"\n",
"``6``\n",
"\n",
"Write some code that sums the positive and negative numbers in a list separately, using in-place operators. Do you think the result is more or less readable than writing the same without in-place operators?"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"positive sum is 14 , and the negative sum is -6\n"
]
}
],
"source": [
"numbers = [-1, 2, -3, 7, 5, -2] # Given a list. Not an array!!\n",
"\n",
"pos_sum = 0\n",
"neg_sum = 0\n",
"\n",
"for number in numbers:\n",
" if number > 0:\n",
" pos_sum += number\n",
" else:\n",
" neg_sum += number\n",
"print('positive sum is', pos_sum, ', and the negative sum is', neg_sum ) \n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Counting Vowels "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* Write a loop that counts the number of vowels in a character string.\n",
"* Test it on a few individual words and full sentences.\n",
"* Once you are done, compare your solution to your neighbor’s. Did you make the same decisions about how to handle the letter ‘y’ (which some people think is a vowel, and some do not)?"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"number of vowels: 4\n"
]
}
],
"source": [
"string = 'aljdiajdi'\n",
"vowels = 0\n",
"for char in string:\n",
" if (char == 'a') or (char == 'e') or (char == 'i' ) or (char == 'o') or (char == 'u'):\n",
" vowels += 1\n",
" \n",
"print('number of vowels:', vowels )"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment