diff --git a/exercises/source/exercise-05/1__for_loops_functions_and_dicts.ipynb b/exercises/source/exercise-05/1__for_loops_functions_and_dicts.ipynb new file mode 100644 index 0000000..b1cd87f --- /dev/null +++ b/exercises/source/exercise-05/1__for_loops_functions_and_dicts.ipynb @@ -0,0 +1,1130 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-494826e8c27cdbcb", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "# You must run this cell, but you can ignore its contents.\n", + "import hashlib\n", + "\n", + "def ads_hash(ty):\n", + " \"\"\"Return a unique string for input\"\"\"\n", + " ty_str = str(ty).encode()\n", + " m = hashlib.sha256()\n", + " m.update(ty_str)\n", + " return m.hexdigest()[:10]" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-592b21fffec74d63", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "# You must also run this cell.\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-4e22e2660edab610", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "tags": [] + }, + "source": [ + "# Flow control - `for` loops with `range(n)`\n", + "\n", + "Remember from the previous exercise you defined a function like this:\n", + "\n", + "```python\n", + "def simulate_generation(a,Rt):\n", + " previous = a[-1]\n", + " new_infected = previous*Rt\n", + " a.append(new_infected)\n", + "```\n", + "\n", + "This implements a single new generation using the basic formula for reproduction:\n", + "\n", + "$N_{t+1} = R_t N_t$\n", + "\n", + "Now, consider this code:\n", + "\n", + "```python\n", + "x = [1]\n", + "for i in range(5):\n", + " simulate_generation(x, 2)\n", + "```\n", + "\n", + "When run, `x` will have a value of `[1, 2, 4, 8, 16, 32]`.\n", + "\n", + "## Q1\n", + "\n", + "Write a function called `simulate_n_generations` which takes two arguments, `n` and `Rt`. The first argument `n` will be the number of generations to simulate. The second argument, `Rt` is as above. Your function should return the number of infected individuals, starting from a single individual, after `n` generations.\n", + "\n", + "The function signature should look like this:\n", + "\n", + "```python\n", + "def simulate_n_generations(n,Rt):\n", + "```\n", + "\n", + "If you run your new function like this:\n", + "\n", + "```python\n", + "simulate_n_generations(10, 2)\n", + "```\n", + "\n", + "the result should be `[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]`.\n", + "\n", + "Hint: copy the `simulate_generation` function definiton from above and use it." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-d2a294ee5e6f9e3b", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + } + }, + "outputs": [], + "source": [ + "def simulate_generation(a,Rt):\n", + " previous = a[-1]\n", + " new_infected = previous*Rt\n", + " a.append(new_infected)\n", + " \n", + "def simulate_n_generations(n,Rt):\n", + " a = [1]\n", + " for i in range(n):\n", + " simulate_generation(a,Rt)\n", + " return a" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-34471e259a21b377", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "# If this runs without error, it means the answer in your previous cell was correct.\n", + "\n", + "assert ads_hash(simulate_n_generations(10, 2)) == 'a9ad958975'\n", + "assert ads_hash(simulate_n_generations(9, 3)) == '1f0b039679'" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-7d95e6913ad535d7", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "## Q2\n", + "\n", + "Recall that \n", + "\n", + "- `range(n)` returns an *iterator* starting at `0` and ending at `n`.\n", + "- `range(start, end)` returns an iterator starting at `start` and ending before `end`.\n", + "- `range(start, end, inc)` returns an iterator starting at `start` and ending before `end` with an increment of `inc`.\n", + "\n", + "Thus, this code\n", + "\n", + "```python\n", + "x = []\n", + "for i in range(10, 1000, 203):\n", + " x.append(i)\n", + "```\n", + "\n", + "Will set `x` equal to `[10, 213, 416, 619, 822]`\n", + "\n", + "Create a list named `my_list` which starts at 10, ends before 1000 and has an increment of 21." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-97f27abad4bca5a7", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + } + }, + "outputs": [], + "source": [ + "my_list = []\n", + "for i in range(10, 1000, 21):\n", + " my_list.append(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-ba9f9e26ac285bb5", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "# If this runs without error, it means the answer in your previous cell was correct.\n", + "\n", + "assert ads_hash(my_list)=='c25a617fa9'" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-90de2683a98d0ac5", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "tags": [] + }, + "source": [ + "# Flow control - for loops that iterate through a list\n", + "\n", + "Remember that `for` loops will *iterate* through any *iterator*, and lists are iterators.\n", + "\n", + "Therefore this\n", + "\n", + "```python\n", + "cumulative = 0\n", + "for x in [1,2,3,100]:\n", + " cumulative = cumulative + x\n", + "```\n", + "\n", + "sets `cumulative` to 106.\n", + "\n", + "## Q1\n", + "\n", + "Create a function `cum_sum` which takes a single argument `x`. `x` will be an iterator and your function should return the sum of all values in the iterator.\n", + "\n", + "The function signature is:\n", + "\n", + "```python\n", + "def cum_sum(x):\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "jupyter": { + "source_hidden": true + }, + "nbgrader": { + "grade": false, + "grade_id": "cell-5c41a83f5efb3f97", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "tags": [] + }, + "outputs": [], + "source": [ + "def cum_sum(x):\n", + " cum = 0\n", + " for i in x:\n", + " cum = cum + i\n", + " return cum" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-01d1590cc0a3c37f", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "# If this runs without error, it means the answer in your previous cell was correct.\n", + "\n", + "assert ads_hash(cum_sum([1,3,3,451,34,2,3]))=='dcb5d6e69e'\n", + "assert ads_hash(cum_sum([1,3,3,-12,32,1,3]))=='eb1e33e8a8'" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-c6115c6a8fc2824f", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "## Practice with functions" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-6e6f3ca73e99b3e7", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "### Q1 Make a function `compute_seq2(n)` which computes the a sequence of length `n` according to the following pattern:\n", + "\n", + "`2, 2, 4, 6, 10, 16, 26 ...`\n", + "\n", + "Hint: this is a Fibonacci sequence with initial elements 2." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-8d48778fdbfb317e", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + } + }, + "outputs": [], + "source": [ + "def compute_seq2(n):\n", + " if n == 1:\n", + " return [2]\n", + " elif n == 2:\n", + " return [2,2]\n", + " else:\n", + " result = compute_seq2(n-1)\n", + " a = result[-2]\n", + " b = result[-1]\n", + " result.append(a+b)\n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-e7e80f9bdb4eeb08", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "# If this runs without error, it means `compute_seq2()` behaves correctly.\n", + "assert compute_seq2(16)==[2, 2, 4, 6, 10, 16, 26, 42, 68, 110, 178, 288, 466, 754, 1220, 1974]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-2ce1883510b6a1b4", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "### Q2 Make a function `compute_seq3(n)` which computes the a sequence of length `n` according to the following pattern:\n", + "\n", + "`1, 1, 1, 2, 3, 4, 6, 9, 13, 19, 28, ...`\n", + "\n", + "Hint: this is very similar to the Fibonacci sequence, but each element at index `n` is the sum of the elements at index `n-1` and `n-3`. The first three elements are `1`." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-5aeb59f4e391239b", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + } + }, + "outputs": [], + "source": [ + "def compute_seq3(n):\n", + " assert type(n)==int\n", + " assert n > 0\n", + " if n == 1:\n", + " return [1]\n", + " elif n == 2:\n", + " return [1,1]\n", + " elif n == 3:\n", + " return [1,1,1]\n", + " else:\n", + " result = compute_seq3(n-1)\n", + " a = result[-3]\n", + " b = result[-1]\n", + " result.append(a+b)\n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-0c52f8d0b74caa5e", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "# If this runs without error, it means `compute_seq1()` behaves correctly.\n", + "assert compute_seq3(16)==[1, 1, 1, 2, 3, 4, 6, 9, 13, 19, 28, 41, 60, 88, 129, 189]\n", + "assert ads_hash(compute_seq3(30)) == '210bfe49ef'" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-03d11f5c31865fa6", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "## Practice converting types and using loops\n", + "\n", + "You are a biologist at Cape Verde to study one of the most important nesting sites for loggerhead sea turtles. You are studying the numbers and sexes of young turtles as they hatch. During the data collection part of your project, you have taken notes by typing \"m\" for male and \"f\" for female." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-06a01be28c18339a", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "# Here are your data.\n", + "\n", + "nest1 = \"fffffmmmfmmfffmfmmmfffffffmmffmmfffmmmmffmmffmmmfmmmffmmmmffffmmmfffmffmfmfmfmmffmfmmffmfmmf\"\n", + "nest2 = \"mmmfmffffmmmfmmfmfmmffmffmfmfmffmffmmmfmfffmfmfffmffmmfmfmfmmffmfmmf\"\n", + "nest3 = \"ffffffmmmfmmfffmfmmmffmfmmmfffmmfffmffffmffmmmffffffmmmfmmfffmfmmmffmfmm\"\n", + "nest4 = \"fmfmfmmffmffmfmffffffmfmfmffmffmfmfmmfffffmfmfmmffmffmfmmmfmmmmmmfmfmmm\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-c998e2a3545270ce", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "A string (`str` in Python) is a *sequence* which can be *iterated*, as in a for loop. You also know the `range` and `list` types, which can also be iterated. When you iterate over an `str`, each item is a signle character `str`:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-7f96e853d095f8fc", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "count = 0\n", + "for char in nest1:\n", + " assert type(char)==str\n", + " count = count + 1" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-23e2ec7eac2011ae", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "92" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "count" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-e874a549c51ed6e9", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "## Q3 How many male turtles are in nest1? Count the number of `\"m\"` characters are in the `nest` string. Put the answer in a variable `num_males`." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-efbc7c6cbe040063", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + } + }, + "outputs": [], + "source": [ + "num_males = 0\n", + "for char in nest1:\n", + " assert type(char)==str\n", + " if char=='m':\n", + " num_males = num_males + 1\n", + " else:\n", + " assert char=='f'" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-62ab53f78c7a1aa4", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "44" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "num_males" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-f6cf427c0e834b6d", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "# If this runs without error, it means the answer in your previous cell was correct.\n", + "assert ads_hash(num_males)=='71ee45a3c0'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Q4 What fraction of all turtles from nest1 are male? Put the answer in a variable `sex_ratio`." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-545e9eaa06507765", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + } + }, + "outputs": [], + "source": [ + "sex_ratio=num_males / len(nest1)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-aec1f9ca60c05951", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "# If this runs without error, it means the answer in your previous cell was correct.\n", + "assert ads_hash(round(sex_ratio*1000))=='200dd69b70'" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-9a788ebd56edca64", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "## Q5 Create an empty dict called `empty_observations` with keys 'nest1', 'nest2', 'nest3', 'nest4'. Each value should be an empty list." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-cc33b612e98cae30", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + } + }, + "outputs": [], + "source": [ + "empty_observations = {'nest1':[],'nest2':[],'nest3':[],'nest4':[]}" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-b24ea76aaa1c504a", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "# If this runs without error, it means the answer in your previous cell was correct.\n", + "assert ads_hash(tuple([item for item in empty_observations.items()]))=='5c604a4cc5'" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-73e0ee5363629b1a", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "## Q6 Create a dict called `observations` with keys 'nest1', 'nest2', 'nest3', 'nest4'. The values for each key should be as given above in the section just after \"Here are your data.\"\n", + "\n", + "The key 'nest1' should have value given above for the `nest1` variable (i.e. `\"fffffmmmfmmfffmfmmmfffffffmmffmmfffmmmmffmmffmmmfmmmffmmmmffffmmmfffmffmfmfmfmmffmfmmffmfmmf\"`)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-40c757b8f13d8839", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + } + }, + "outputs": [], + "source": [ + "observations = {'nest1': \"fffffmmmfmmfffmfmmmfffffffmmffmmfffmmmmffmmffmmmfmmmffmmmmffffmmmfffmffmfmfmfmmffmfmmffmfmmf\",\n", + "'nest2': \"mmmfmffffmmmfmmfmfmmffmffmfmfmffmffmmmfmfffmfmfffmffmmfmfmfmmffmfmmf\",\n", + "'nest3': \"ffffffmmmfmmfffmfmmmffmfmmmfffmmfffmffffmffmmmffffffmmmfmmfffmfmmmffmfmm\",\n", + "'nest4': \"fmfmfmmffmffmfmffffffmfmfmffmffmfmfmmfffffmfmfmmffmffmfmmmfmmmmmmfmfmmm\",}" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-41699e4baeb4f512", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "# If this runs without error, it means the answer in your previous cell was correct.\n", + "assert ads_hash(tuple([item for item in observations.items()]))=='19ea06edbc'" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-d2bdc242834633ea", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "## Iterating through a `dict`\n", + "\n", + "Consider the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-57062ecaa6dd4e24", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "data = {'a': 1, 'b': 2, 'c': 3}" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-1a4e6fb36a964a4c", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "key: a, value: 1\n", + "key: b, value: 2\n", + "key: c, value: 3\n" + ] + } + ], + "source": [ + "for key in data:\n", + " value = data[key]\n", + " print(f\"key: {key}, value: {value}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-7a45e8eeafa0152b", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "We see in the above that we can iterate through this dictionary. Let's create a new dictionary based on the first one:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-154ab8a613fe8638", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'a': 1, 'b': 4, 'c': 9}\n" + ] + } + ], + "source": [ + "squared_data = {}\n", + "for key in data:\n", + " value = data[key]\n", + " squared_data[key] = value*value\n", + "print(squared_data)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-55d5e2b1c6ca9071", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "## Q7. Putting things together: create a dict called `sex_ratios`.\n", + "\n", + "There should be key for every key from the `observations` dictionary and the value for each key should be the sex ratio for each value in the `observations` dictionary." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-d890f019a87700d7", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + } + }, + "outputs": [], + "source": [ + "def calc_sex_ratio(x):\n", + " num_males = 0\n", + " for c in x:\n", + " if c == 'm':\n", + " num_males = num_males + 1\n", + " else:\n", + " assert c=='f'\n", + " return num_males/len(x)\n", + "\n", + "sex_ratios = {}\n", + "for nest in observations:\n", + " sex_ratios[nest] = calc_sex_ratio(observations[nest])" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'nest1': 0.4782608695652174,\n", + " 'nest2': 0.4852941176470588,\n", + " 'nest3': 0.4444444444444444,\n", + " 'nest4': 0.4788732394366197}" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sex_ratios" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-a583495a57a86cfe", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "# If this runs without error, it means the answer in your previous cell was correct.\n", + "assert ads_hash(tuple([(k,round(v*10000)) for (k,v) in sex_ratios.items()]))=='9d19a5431a'" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-839a79cbcdf3f3cf", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "## Q8. Plotting data\n", + "\n", + "Given the following data, make a plot that looks like the following:\n", + "\n", + "\"\"\n", + "\n", + "```\n", + "year= [1950, 1955, 1960, 1965, 1970, 1975, 1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015]\n", + "sex_ratio = [0.51, 0.502, 0.49, 0.495, 0.503, 0.498, 0.51, 0.502, 0.49, 0.495, 0.503, 0.498, 0.73, 0.80]\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-369c41d4c436ea90", + "locked": false, + "points": 1, + "schema_version": 3, + "solution": true, + "task": false + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "year= [1950, 1955, 1960, 1965, 1970, 1975, 1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015]\n", + "sex_ratio = [0.51, 0.502, 0.49, 0.495, 0.503, 0.498, 0.51, 0.502, 0.49, 0.495, 0.503, 0.498, 0.73, 0.80]\n", + "plt.plot(year,sex_ratio,'o-');" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-e3d96d589e391631", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "# Read more about this topic\n", + "\n", + "While the above \"data\" in this notebook are completely fake, it was inspired by the paper [here](https://www.int-res.com/abstracts/meps/v621/p209-219), which was covered in the press [here](https://www.washingtonpost.com/world/africa/the-warming-climate-is-turning-baby-sea-turtles-one-gender/2019/10/21/d571f3fe-e3a6-11e9-b0a6-3d03721b85ef_story.html)." + ] + } + ], + "metadata": { + "celltoolbar": "Create Assignment", + "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.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/exercises/source/exercise-05/2__reading_csv_files.ipynb b/exercises/source/exercise-05/2__reading_csv_files.ipynb new file mode 100644 index 0000000..a50a66f --- /dev/null +++ b/exercises/source/exercise-05/2__reading_csv_files.ipynb @@ -0,0 +1,263 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9be665b8-0e4b-43f0-96b5-1cc821fc7d67", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-293ccdf5e42bf800", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "tags": [] + }, + "source": [ + "# Reading CSV files\n", + "\n", + "Step 1: Download file from https://archive.ics.uci.edu/ml/datasets/Wine+Quality . Click the \"Download\" button to get the `wine+quality.zip` file. Open this file and extract `winequality-red.csv`. Place it in the folder alongside this notebook.\n", + "\n", + "Let's look at the first lines of this file." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "5c2e4658-ad84-4a02-8176-6ca65fa9140f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "line 0: '\"fixed acidity\";\"volatile acidity\";\"citric acid\";\"residual sugar\";\"chlorides\";\"free sulfur dioxide\";\"total sulfur dioxide\";\"density\";\"pH\";\"sulphates\";\"alcohol\";\"quality\"'\n", + "line 1: '7.4;0.7;0;1.9;0.076;11;34;0.9978;3.51;0.56;9.4;5'\n", + "line 2: '7.8;0.88;0;2.6;0.098;25;67;0.9968;3.2;0.68;9.8;5'\n", + "line 3: '7.8;0.76;0.04;2.3;0.092;15;54;0.997;3.26;0.65;9.8;5'\n", + "line 4: '11.2;0.28;0.56;1.9;0.075;17;60;0.998;3.16;0.58;9.8;6'\n" + ] + } + ], + "source": [ + "fobj = open('winequality-red.csv')\n", + "for line_num, line in enumerate(fobj.readlines()):\n", + " line = line.strip()\n", + " print(f\"line {line_num}: '{line}'\")\n", + " if line_num > 3:\n", + " break" + ] + }, + { + "cell_type": "markdown", + "id": "7b803dcd-a408-476e-9e05-bab37dd64aac", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-65efe24785650af1", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "tags": [] + }, + "source": [ + "## Q10 Read the file into a dict called `data`\n", + "\n", + "The dict should have a key for each column in the CSV file and each dictionary value should be a list with all the values in that column.\n", + "\n", + "For example, a CSV file like this:\n", + "\n", + "```\n", + "name,home planet\n", + "Arthur,Earth\n", + "Zaphod,Betelgeuse V\n", + "Trillian,Earth\n", + "```\n", + "\n", + "Would result in a dictionary like this:\n", + "\n", + "```python\n", + "{'name':['Arthur','Zaphod','Trillian'], 'home planet':['Earth', 'Betelgeuse V', 'Earth']}\n", + "```\n", + "\n", + "But here, we read the file `winequality-red.csv` which you have uploaded into this folder. Note that in this wine quality \"CSV\" file, the values are separated with semicolons (`;`), not commas." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5443bf3d-2303-4971-85f4-0af37b783247", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-bbe508684824a047", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys(['\"fixed acidity\"', '\"volatile acidity\"', '\"citric acid\"', '\"residual sugar\"', '\"chlorides\"', '\"free sulfur dioxide\"', '\"total sulfur dioxide\"', '\"density\"', '\"pH\"', '\"sulphates\"', '\"alcohol\"', '\"quality\"'])" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fobj = open('winequality-red.csv')\n", + "data = {}\n", + "for line_num, line in enumerate(fobj.readlines()):\n", + " line = line.strip()\n", + " #print(f\"line {line_num}: '{line}'\")\n", + " entries = line.split(';')\n", + " if line_num == 0:\n", + " column_names = entries\n", + " for column_name in column_names:\n", + " data[column_name] = []\n", + " continue\n", + " for (colname, entry) in zip(column_names, entries):\n", + " data[colname].append(float(entry))\n", + "data.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9880f13b-acc5-431c-836e-a0d34bdc632c", + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-1978372e733238bd", + "locked": true, + "points": 0, + "schema_version": 3, + "solution": false, + "task": false + }, + "tags": [] + }, + "outputs": [], + "source": [ + "assert len(data.keys()) == 12\n", + "assert len(data['\"alcohol\"'])==1599\n", + "acc = 0; [acc := acc+x for x in data['\"quality\"']]\n", + "assert acc==9012" + ] + }, + { + "cell_type": "markdown", + "id": "075f13ae-1d24-4e26-ba68-fa3828da1861", + "metadata": { + "nbgrader": { + "grade": false, + "grade_id": "cell-c76a021eff929a4e", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + }, + "tags": [] + }, + "source": [ + " ## Q11 Plot the \"Density\" (Y axis) versus \"Alcohol\" (X axis).\n", + " \n", + " Your plot should look like this:\n", + " \n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "57ace93a-fc8e-48c7-9fb4-b1ebe2b521f0", + "metadata": { + "nbgrader": { + "grade": true, + "grade_id": "cell-0dd13f6a5af90429", + "locked": false, + "points": 1, + "schema_version": 3, + "solution": true, + "task": false + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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2rVrsWvXLixbtgxjxozBsGHD8Jvf/Aapqal4/fXXndv39vbihRdeQFlZGa688krcdtttqKmpAdA30Tl79ixmz56NwsJClJeX44EHHsCAAQM8jpuSkoK4uDgkJSUhOzsb2dnZiImJwZ133ol9+/Zhy5YtAIAzZ87g5Zdfxl133RWcASGigOBEh4hCQhRFCIKAbdu24dSpUxg0aBAGDBjg/FdfX+/2lVFhYSEGDhzo/DknJwetra0AgJEjR2LatGkoLy/HzTffjCVLlsButxtqT05ODq699lo899xzAIBVq1bh9OnTuPnmm03oLRGFSr9QN4CIotOePXtQVFSE3t5e5OTkYN26dR7buAaIY2Nj3X4nCIJz5VZMTAw++OADbNq0Ce+//z7++Mc/4rHHHsPmzZtRVFSku0333HMPbrvtNvzud7/D888/j1tuuQVJSUk+9Y+IrIETHSIKujVr1mDXrl340Y9+hIsuuggtLS3o168fCgsLfd6nIAiYOHEiJk6ciP/+7//GkCFDsHLlSjz66KMe28bFxeHcuXMej8+cORP9+/fHM888g9WrV2P9+vU+t4eIrIETHSIKqO7ubrS0tODcuXM4evQo3n33XSxcuBDXXXcdbr/9dthsNowfPx6zZs3C4sWLUVJSgiNHjuCdd97BrFmzMGbMGK/H2Lx5M2pqanDNNdcgKysLmzdvxrFjxzB8+HDF7QsLC7F582Y0NDRgwIABSE9Ph81mQ0xMDO644w4sWLAAF198McaPH2/2cBBRkDGjQ0QB9e677yInJweFhYWYMWMG1q5diz/84Q948803ERMTA0EQ8M4772Dy5Mm46667cMkll+DWW29FQ0MDBg8erOsYycnJWL9+PWbOnIlLLrkEP//5z/Hkk0+iqqpKcfuf/OQniImJwaWXXorMzEw0NjY6f3f33Xejp6eHIWSiCCGISusviYii1MaNG1FZWYmvvvpK90SLiKyLEx0iIvR9xdbU1ITvf//7yMnJwSuvvBLqJhGRCfjVFRERgH/84x8oKSmBw+HAr371q1A3h4hMwk90iIiIKGLxEx0iIiKKWJzoEBERUcTiRIeIiIgiFic6REREFLE40SEiIqKIxYkOERERRSxOdIiIiChicaJDREREEev/B85WoOsR1o+eAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.plot(data['\"density\"'], data['\"alcohol\"'], '.')\n", + "plt.xlabel(\"Density\")\n", + "plt.ylabel(\"Alcohol\");" + ] + }, + { + "cell_type": "markdown", + "id": "7cff50a5-7642-47f6-b342-043bc398e981", + "metadata": {}, + "source": [ + " ## Q12 Make a Python program that does this\n", + "\n", + "Create a Python program called `plot_red_wine.py` which makes the above plot (alcohol vs density for the red wine dataset) and saves the plot to a file called `red_wine.png`.\n", + "\n", + "Hint: save the figure using the `plt.savefig()` function. (You might also want to play around with the `plot.show()` function.)" + ] + }, + { + "cell_type": "markdown", + "id": "c7ce822f-3b1e-4982-a6c7-cfabb3ee5f80", + "metadata": {}, + "source": [ + "# Uploading the exercise\n", + "\n", + "For this exercise, the following files should be uploaded:\n", + "\n", + "* The two `.ipynb` files (overwriting the original ones, as usual).\n", + "* `plot_red_wine.py` - Your Python script\n", + "* `winequality-red.csv` - The file you downloaded\n", + "* `red_wine.png` - The plot you generated using `plot_red_wine.py`." + ] + } + ], + "metadata": { + "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.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}