{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-4591728b0e94385d", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "outputs": [], "source": [ "# You must run this cell, but you can ignore its contents.\n", "\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-b2a0e9ec110c03e1", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-bfeafe88c3a0be38", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "source": [ "Let's get started by making a sample dataframe with fake data:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-710e679d69e83ae2", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
numbercolor
01blue
12blue
23red
3234red
42red
53blue
62blue
72red
81green
92yellow
\n", "
" ], "text/plain": [ " number color\n", "0 1 blue\n", "1 2 blue\n", "2 3 red\n", "3 234 red\n", "4 2 red\n", "5 3 blue\n", "6 2 blue\n", "7 2 red\n", "8 1 green\n", "9 2 yellow" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sample_df = pd.DataFrame({'number':[1,2,3,234,2,3,2,2,1,2], 'color':['blue','blue','red','red','red','blue','blue','red','green','yellow']})\n", "display(sample_df)" ] }, { "cell_type": "markdown", "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-0320bf7579e7a5e0", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "source": [ "## Q1 Create a Series named `condition` which is true for all rows where the color is red" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-c57131439b7d2882", "locked": false, "schema_version": 3, "solution": true, "task": false } }, "outputs": [], "source": [ "condition = sample_df[\"color\"]==\"red\"" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "nbgrader": { "grade": true, "grade_id": "cell-c53eedea62c243e1", "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(condition)=='28612bf01a'" ] }, { "cell_type": "markdown", "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-ac32ae211af0e86d", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "source": [ "## Q2 Create a new `DataFrame` named `red_sample_df` which contains only the rows with red color from `sample_df`.\n", "\n", "Hint: use your `condition` Series from above." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-c4be64a1d42e707d", "locked": false, "schema_version": 3, "solution": true, "task": false } }, "outputs": [], "source": [ "red_sample_df = sample_df[ condition ]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "nbgrader": { "grade": true, "grade_id": "cell-3c7eee81fa01c6e7", "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(red_sample_df)=='354bd7ec89'\n", "assert ads_hash(sample_df)=='21692a4d62'" ] }, { "cell_type": "markdown", "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-98dc0525f2068315", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "source": [ "Now let's use the DataFrame `.groupby()` method to find the mean value of `number` for each `color`. (Hint: this will be useful later in this exercise.)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-43c0e1a1816c47a2", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "blue 2.0\n", "green 1.0\n", "red 60.25\n", "yellow 2.0\n" ] } ], "source": [ "for color, gdf in sample_df.groupby('color'):\n", " mean_number = gdf[\"number\"].mean()\n", " print(f\"{color} {mean_number}\")" ] }, { "cell_type": "markdown", "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-9f757e6f5f690e81", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "source": [ "# Using Pandas to work with real data\n", "\n", "\"\"" ] }, { "cell_type": "markdown", "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-927793ccea2a12d7", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "source": [ "## Get the CSV file and upload it to Jupyter\n", "\n", "* Go to https://datadryad.org/stash/dataset/doi:10.5061/dryad.vb06d3k and download the data by clicking \"Download Dataset\".\n", " * Check that now have a file called `doi_10.5061_dryad.vb06d3k__v1.zip` about 99KB in size in your Downloads.\n", " * Unzip this file, which should create:\n", " - `spectra.csv`\n", " - `data_onevalueperbee.csv`\n", " - `data_visitationsequence.csv`\n", " * We are going focus on the file `data_onevalueperbee.csv`. Upload this file to your Jupyter server using the `Upload` button in the file view. Upload it into the same directory as this `.ipynb` file. Alternatively, if you are running this on your own computer, you can copy this `.csv` file into the directory with your `.ipynb` file.\n", "\n", "## Look at the file\n", "\n", "As we have covered, CSV stands for \"Comma separated values\" and is one of the most widely used file formats for scientific data. CSV files are typically like tables, potentially with column names in the first line. The lines of the file are then rows of the table. Spreadsheet programs can open most CSV files, sometimes with a few settings being required to deal with various CSV dialects.\n", "\n", "Let's take a look at this CSV file. This is mostly a repitition of what we recently looked at. We open the CSV file read the first few lines." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-0964768c19f2b15e", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "b'bee;nest;treatment;tstartforaging;logtstartforaging;maxminusstarttime;sumfeedingtime;logsumfeedingtime;numberofvisitations;sumdistcovered;meanvisitduration;revisitations;countyellow;countorange;countblue;visitblue;visitorange;visityellow;allcolorsvisited;averagedistance;meanspeed;sumflowersvisited;visitspatchA;visitspatchB;visitspatchC;patchesvisited;allpatchesvisited;visitsperpatchrounded\\r\\n'\n", "b'201531004;3;control;815;2.911157609;1965;80;1.903089987;21;1287.688282;3.80952381;4;14;4;3;1;1;1;1;80.4805176;2.767026543;12;6;13;2;3;1;7\\r\\n'\n", "b'201531005;3;control;108;2.033423755;;1;0;1;;1;0;1;0;0;0;0;1;0;;;1;1;0;0;1;0;0\\r\\n'\n", "b'201531006;3;control;90;1.954242509;788;136;2.133538908;56;2787.280939;2.428571429;9;41;10;5;1;1;1;1;60.5930639;4.572772117;21;9;25;22;3;1;19\\r\\n'\n" ] } ], "source": [ "# Open the file in Python. The variable `fd` will be assigned the open file object.\n", "fd = open('data_onevalueperbee.csv', mode=\"rb\")\n", "\n", "# Iterate over the lines in the file, also creating an integer called `line_number` via the\n", "# use of the `enumerate()` function.\n", "for (line_number, line) in enumerate(fd.readlines()):\n", " # Print each line.\n", " print(line)\n", " if line_number >= 3:\n", " # Stop after a few lines\n", " break\n", "# Close the open file object.\n", "fd.close()" ] }, { "cell_type": "markdown", "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-5dd558e28f33dab8", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "source": [ "So, note that instead of a comma (`,`) separating the columns, we have a semicolon (`;`) instead. So we will need to use this when calling the Pandas `read_csv()` function. Thus, we must use the `sep=';'` keywoard argument. Also, this CSV file has some slightly unusual characters in it. From trial and error, I have learned that it must be opened with a `encoding='latin_1'` keyword argument to `read_csv()`.\n", "\n", "## Q3. Read the file `data_onevalueperbee.csv`? Into a dataframe named `df`.\n", "\n", "Hint: use the `read_csv` function not only with the filename as the required first positional argument, but also with the keyword arguments described above." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-107a3973d184c577", "locked": false, "schema_version": 3, "solution": true, "task": false } }, "outputs": [], "source": [ "df = pd.read_csv('data_onevalueperbee.csv', sep=';', encoding='latin_1')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "nbgrader": { "grade": true, "grade_id": "cell-66fcba98183cb481", "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(df)=='15994f5b0e'" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-bdfe656f6d2cf933", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
beenesttreatmenttstartforaginglogtstartforagingmaxminusstarttimesumfeedingtimelogsumfeedingtimenumberofvisitationssumdistcovered...allcolorsvisitedaveragedistancemeanspeedsumflowersvisitedvisitspatchAvisitspatchBvisitspatchCpatchesvisitedallpatchesvisitedvisitsperpatchrounded
02015310043control8152.9111581965.0801.903090211287.688282...180.4805182.767027126132317
12015310053control1082.033424NaN10.0000001NaN...0NaNNaN1100100
22015310063control901.954243788.01362.133539562787.280939...160.5930644.57277221925223119
32015311013control10.000000320.0611.78533016578.355534...172.2944423.65135170151205
42015311023control00.000000656.02582.411620492845.622453...171.1405616.30713018424213116
\n", "

5 rows × 28 columns

\n", "
" ], "text/plain": [ " bee nest treatment tstartforaging logtstartforaging \\\n", "0 201531004 3 control 815 2.911158 \n", "1 201531005 3 control 108 2.033424 \n", "2 201531006 3 control 90 1.954243 \n", "3 201531101 3 control 1 0.000000 \n", "4 201531102 3 control 0 0.000000 \n", "\n", " maxminusstarttime sumfeedingtime logsumfeedingtime numberofvisitations \\\n", "0 1965.0 80 1.903090 21 \n", "1 NaN 1 0.000000 1 \n", "2 788.0 136 2.133539 56 \n", "3 320.0 61 1.785330 16 \n", "4 656.0 258 2.411620 49 \n", "\n", " sumdistcovered ... allcolorsvisited averagedistance meanspeed \\\n", "0 1287.688282 ... 1 80.480518 2.767027 \n", "1 NaN ... 0 NaN NaN \n", "2 2787.280939 ... 1 60.593064 4.572772 \n", "3 578.355534 ... 1 72.294442 3.651351 \n", "4 2845.622453 ... 1 71.140561 6.307130 \n", "\n", " sumflowersvisited visitspatchA visitspatchB visitspatchC \\\n", "0 12 6 13 2 \n", "1 1 1 0 0 \n", "2 21 9 25 22 \n", "3 7 0 15 1 \n", "4 18 4 24 21 \n", "\n", " patchesvisited allpatchesvisited visitsperpatchrounded \n", "0 3 1 7 \n", "1 1 0 0 \n", "2 3 1 19 \n", "3 2 0 5 \n", "4 3 1 16 \n", "\n", "[5 rows x 28 columns]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Let's look at the first few lines of the file with the pandas DataFrame `.head()` method:\n", "\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-85664fce05868fd1", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "source": [ "## Q4. How many rows of data are in the dataframe you read from the file `data_onevalueperbee.csv`? Put the answer in a variable `num_rows`.\n", "\n", "Hint: you can use `len(df)` to calculate the number of rows in the DataFrame `df`." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-e10d9bb147d32ad5", "locked": false, "schema_version": 3, "solution": true, "task": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "159\n" ] } ], "source": [ "# Type your answer here and then run this and the following cell.\n", "num_rows = len(df)\n", "print(num_rows)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "nbgrader": { "grade": true, "grade_id": "cell-227f7cff2325cb9a", "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_rows)=='ff2ccb6ba4'" ] }, { "cell_type": "markdown", "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-6b133b10967bef7a", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "source": [ "## Q5. What are the unique values of the `nest` column?\n", "\n", "Put your answer in the variable `unique_nests`. Hint: use the `.unique()` method on the Series for the `nest` column." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-e0b36658308de988", "locked": false, "schema_version": 3, "solution": true, "task": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 3 4 6 8 9 10]\n" ] } ], "source": [ "unique_nests = df['nest'].unique()\n", "print(unique_nests)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "nbgrader": { "grade": true, "grade_id": "cell-208034c33360f85d", "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(unique_nests)=='59e69ce283'" ] }, { "cell_type": "markdown", "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-7802496c83a4d50a", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "source": [ "## Q6. What are the unique values of the `treatment` column?\n", "\n", "Put your answer in the variable `unique_treatments`." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-7a258af7f499be42", "locked": false, "schema_version": 3, "solution": true, "task": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['control' 'imidacloprid']\n" ] } ], "source": [ "unique_treatments = df['treatment'].unique()\n", "print(unique_treatments)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "nbgrader": { "grade": true, "grade_id": "cell-96c51bcd8e5a3ac3", "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(unique_treatments) == '670c49c25a'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's check which nests are in each treatment:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-2c145981d446e40d", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "control\n", "[3 4 8]\n", "\n", "imidacloprid\n", "[ 6 9 10]\n", "\n" ] } ], "source": [ "for treatment, gdf in df.groupby('treatment'):\n", " print(treatment)\n", " print(gdf['nest'].unique())\n", " print()" ] }, { "cell_type": "markdown", "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-e5dbccbf3a349a88", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "source": [ "## Q7. Now make a `seaborn` `boxplot` of the time to start foraging (`tstartforaging` in the CSV file) on the `y` axis, `nest` number on the `x` axis, and with the color (`hue`) being the `treatment`. Save the plot to a file named `Figure2a.png`.\n", "\n", "Your plot should look like: \"\"\n", "\n", "Check the left panel of [Figure 2a](https://royalsocietypublishing.org/doi/10.1098/rspb.2018.0506#RSPB20180506F2) from the Lämsä et al. *Proc. Roy Soc B.* 2018 paper. Do you see any similarities or differences with your plot?\n", "\n", "Hint: import seaborn and call its `boxplot()` function with `data`, `x`, `y`, `hue` keyword arguments with values `df`, `nest`, `tstartforaging`, `treatment`." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-df2e372b53d245fd", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "outputs": [], "source": [ "# Run this cell to import seaborn\n", "import seaborn as sns" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "nbgrader": { "grade": true, "grade_id": "cell-208bdcdc93f0ff65", "locked": false, "points": 1, "schema_version": 3, "solution": true, "task": false }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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c+Zg5MiR+Nvf/gaJRIITJ05g7969ePfddzFt2jS89dZbOHHiBD799NPmqrvFcR4iIiKi/6md2LE5J1U0hmabh2jGjBno3r07Nm3ahC+++AKCIKBr1656Y3sWLVrU+MqJiIiIWlijJmYMCgpCUFCQsWshIiIiEkWjApFWq8XPP/+MkpISaLVavXXBwcFGKYyIiIiopRgciI4dO4YJEyYgPz8ffx5+JJFIoNFojFYcERERUUswOBDNnj0bgYGB+Oabb+Dh4fGXs0YTERERmTqDA9FPP/2E//znP7rZpYmIiIjMncETM/bt2xc///xzc9RCREREJAqDe4jmzp2LRYsWoaioCD179oSdnZ3e+oCAAKMVR0RERNQSDA5Ezz77LABg6tSpumUSiUT39HgOqiYiIiJzY3AgysvLa446iIiIiERjcCDy9vZujjqIiIiIRNOgQLR7926MGDECdnZ22L179wPbjhkzxiiFEREREbWUBgWisWPHoqioCO7u7hg7dux923EMEREREZmjBgWiPz6e48+P6iAiIiIydwbPQ0RERERkaQweVP3222/Xu1wikcDBwQGdOnVCcHAwpFJpk4sjIiIiagkGB6L169fj+vXruHPnDtq0aQNBEHDz5k04OTmhVatWKCkpga+vLw4fPgwvL6/mqJmIiIjIqAy+ZLZq1So8/vjj+Omnn/Dbb7+htLQUFy9eRN++fbFx40YUFBRAqVRiwYIFzVEvERERkdEZ3EMUFRWFnTt3omPHjrplnTp1wptvvolnn30Wly5dwtq1a3UzWhMRERGZOoN7iAoLC1FTU1NneU1NDYqKigAAnp6eqKioaHp1RERERC3A4EA0cOBAzJo1C6dPn9YtO336NObMmYNBgwYBAM6cOQMfHx/jVUlERETUjAwORB988AHc3NzQp08fyGQyyGQyBAYGws3NDR988AEAoFWrVnjrrbeMXiwRERFRczB4DJFSqcTBgwfx448/4uLFixAEAV27dkWXLl10bQYOHGjUIomIiIiak8GBqFbXrl3RtWtXY9ZCREREJIpGBaKrV69i9+7dKCgoQHV1td66devWGaUwIiIiopZicCA6dOgQxowZAx8fH1y4cAE9evTA5cuXIQgCHnvsseaokYiIiKhZGTyoeunSpVi0aBHOnj0LBwcH7Ny5E1euXEFISAiee+655qiRiIiIqFkZ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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.boxplot(data=df,x='nest',y='tstartforaging',hue='treatment')" ] }, { "cell_type": "markdown", "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-c9c67275053aadd0", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "source": [ "## Q8. Now make a plot using a single line using seaborn's `boxplot` function which shows the duration of the foraging period on the y axis.\n", "\n", "This should be fairly similar to the second panel in [Figure 2a](https://royalsocietypublishing.org/doi/10.1098/rspb.2018.0506#RSPB20180506F2) from the Lämsä et al. Proc. Roy Soc B. 2018 paper.\n", "\n", "Hint: the duration of the foraging period is in the `'maxminusstarttime'` column." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "nbgrader": { "grade": true, "grade_id": "cell-d6bb242d388543aa", "locked": false, "points": 1, "schema_version": 3, "solution": true, "task": false }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAGwCAYAAABIC3rIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJ9UlEQVR4nO3de1wU5f4H8M9y2wWFVVB2MQFBARXFTDqGesB73lLL0hIR00TDQryWaQEmalbeRUNLvGB2USs7pqlHofIOGt7S30kCSy6WuKBcXeb3h4c5baDhsjK7zOf9evHSfebZme9sBB+feeYZhSAIAoiIiIhkzErqAoiIiIikxkBEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyZyN1AZaisrIS165dg6OjIxQKhdTlEBERUS0IgoCioiK0aNECVlb3HgdiIKqla9euwd3dXeoyiIiIyAhXr15Fy5Yt77mdgaiWHB0dAdz9QJ2cnCSuhoiIiGqjsLAQ7u7u4u/xe2EgqqWqy2ROTk4MRERERBbm76a7cFI1ERERyR4DEREREckeAxERERHJHucQERGRxaisrER5ebnUZZAZsbW1hbW1dZ33w0BEREQWoby8HJmZmaisrJS6FDIzTZo0gVarrdM6gQxERERk9gRBQE5ODqytreHu7n7fBfZIPgRBQHFxMfLz8wEAbm5uRu+LgYiIiMzenTt3UFxcjBYtWsDBwUHqcsiM2NvbAwDy8/Ph6upq9OUzRmwiIjJ7er0eAGBnZydxJWSOqkJyRUWF0ftgICIiIovBZ0lSTUzxfcFLZg2EXq9HRkYGbty4AWdnZwQEBJhk1j0REZEcMBA1AKmpqUhISEBubq7YptVqERkZieDgYAkrIyIisgy8ZGbhUlNTERMTA29vb6xZswZ79uzBmjVr4O3tjZiYGKSmpkpdIhERkdljILJger0eCQkJCAoKwoIFC+Dv7w8HBwf4+/tjwYIFCAoKwtq1a8XJiEREVHc9e/ZEdHR0vRxr3LhxGD58eL0cqzaSkpLQpEkTqct4KBiILFhGRgZyc3MRGhpabU0OKysrhIaGIicnBxkZGRJVSEQkP4Ig4M6dO1KXQQ+IgciC3bhxAwDg5eVV4/aq9qp+RERUN+PGjUNKSgpWrFgBhUIBhUKBpKQkKBQK7Nu3D4GBgVAqlfjuu+8gCAKWLFkCb29v2Nvbo1OnTvj888/Ffen1ekyYMAFeXl6wt7eHn58fVqxYIW6PjY3Fpk2b8OWXX4rHOnz4MH755RcoFAp8+umn+Oc//wl7e3s8/vjjuHz5Mk6ePInAwEA0btwYAwYMwPXr1w3q37hxI9q1aweVSoW2bdsiISFB3Fa13507d6JXr15wcHBAp06dcPToUQDA4cOH8eKLL0Kn04n1xMbGPtwPvD4JVCs6nU4AIOh0OqlLEaWnpwshISHCuXPnatx+7tw5ISQkREhPT6/nyoiITKukpES4cOGCUFJSImkdN2/eFIKCgoSJEycKOTk5Qk5OjnDgwAEBgBAQECB8++23wn/+8x/h999/F9544w2hbdu2wt69e4Wff/5Z2Lhxo6BUKoXDhw8LgiAI5eXlwltvvSWcOHFCuHLlirB161bBwcFB+OSTTwRBEISioiJh5MiRwoABA8RjlZWVCZmZmQIAcd8XLlwQnnjiCeGxxx4TevbsKXz//fdCenq60KZNG2Hy5Mli7YmJiYKbm5uwY8cO4cqVK8KOHTsEZ2dnISkpSRAEwWC/X3/9tXDp0iXh2WefFTw9PYWKigqhrKxMWL58ueDk5CTWU1RUVP//EWpwv++P2v7+ZiCqJXMMRHfu3BFGjRolzJkzR9Dr9Qbb9Hq9MGfOHOH5558X7ty5I1GFRESmYS6BSBAEISQkRJg6dar4+tChQwIA4YsvvhDbbt26JahUKuHIkSMG750wYYLwwgsv3HPfkZGRwogRI8TX4eHhwrBhwwz6VAWXDRs2iG0ff/yxAEA4ePCg2LZo0SLBz89PfO3u7i5s27bNYF9vv/22EBQUdM/9nj9/XgAgXLx4URAEQdi4caOgVqvvWb9UTBGIeNu9BbO2tkZkZCRiYmIwb948hIaGwsvLC5mZmUhOTsbRo0cRFxfH9YiIzEBpaSmys7OlLgMA4OHhAZVKJXUZDU5gYKD49wsXLqC0tBT9+vUz6FNeXo7OnTuLr9etW4cNGzYgKysLJSUlKC8vx6OPPlqr4wUEBIh/12g0AICOHTsatFU94+v69eu4evUqJkyYgIkTJ4p97ty5A7Vafc/9Vj0bLD8/H23btq1VXZaKgcjCBQcHIy4uDgkJCZgyZYrY7ubmhri4OK5DRGQmsrOzERERIXUZAIDExET4+vpKXUaD06hRI/HvlZWVAIB//etfeOSRRwz6KZVKAMCnn36KadOm4f3330dQUBAcHR3x7rvv4vjx47U6nq2trfj3qpWa/9pWVUfVn+vXr0fXrl0N9vPXfzTXtN+q9zdkDEQNQHBwMLp3786VqonMmIeHBxITE41+f1ZWFuLj4zF37lx4enrWuRYynp2d3d8uZ9K+fXsolUpkZ2cjJCSkxj7fffcdunXrhsjISLHt559/fuBj1YZGo8EjjzyCK1euIDQ01Oj9mKoec8RA1EBYW1sbDMMSkXlRqVQmGZXx9PTk6I7EWrVqhePHj+OXX35B48aNaxw9cXR0xMyZMzFt2jRUVlaiR48eKCwsxJEjR9C4cWOEh4ejTZs22Lx5M/bt2wcvLy9s2bIFJ0+eNLhzuFWrVti3bx8uXboEFxeXape3HkRsbCyioqLg5OSEgQMHoqysDKdOnUJBQQGmT59e63O/desWDh48iE6dOsHBwUF8sKql4233RERED2DmzJmwtrZG+/bt0bx583vODXv77bfx1ltvYdGiRWjXrh2efPJJ7N69Www8kydPxjPPPINRo0aha9eu+OOPPwxGiwBg4sSJ8PPzQ2BgIJo3b44ffvjB6LpfeuklbNiwAUlJSejYsSNCQkKQlJR0z6VbatKtWzdMnjwZo0aNQvPmzbFkyRKj6zE3CkEQBKmLsASFhYVQq9XQ6XRwcnKSuhwikpnLly8jIiJCtvN/SktLkZmZCS8vL04Ip2ru9/1R29/fHCEiIiIi2WMgIiIiItljICIiIiLZYyAiIiIi2WMgIiIiItljICIiIiLZYyAiIiIi2WMgIiIiItnjozuIiMhi5eXlQafT1dvx1Gq1+GT5higpKQnR0dG4efOm1KXUO7MJRIsWLcIbb7yBqVOnYvny5QAAQRAQFxeHxMREFBQUoGvXrlizZg38/f3F95WVlWHmzJn4+OOPUVJSgj59+iAhIQEtW7YU+xQUFCAqKgpfffUVAGDo0KFYtWoVmjRpUp+nSEREJpSXl4cxYWNRUV5Wb8e0tVNi65bNZhWKWrVqhejoaERHR0tdikUzi0B08uRJJCYmIiAgwKB9yZIlWLp0KZKSkuDr64sFCxagX79+uHTpEhwdHQEA0dHR2L17N7Zv3w4XFxfMmDEDQ4YMQVpamvi099GjR+PXX3/F3r17AQAREREICwvD7t276/dEiYjIZHQ6HSrKy1DiHYJKlfEPPa0tq1IdcCUFOp3OrAJRbej1eigUClhZcabMvUj+ydy6dQuhoaFYv349mjZtKrYLgoDly5dj7ty5eOaZZ9ChQwds2rQJxcXF2LZtG4C7/zN8+OGHeP/999G3b1907twZW7duxdmzZ3HgwAEAwMWLF7F3715s2LABQUFBCAoKwvr16/H111/j0qVLkpwzERGZTqVKjcpGzR7+l5Ghq7KyEu+88w7atGkDpVIJDw8PxMfHAwDOnj2L3r17w97eHi4uLoiIiMCtW7fE944bNw7Dhw/He++9Bzc3N7i4uGDKlCmoqKgAAPTs2RNZWVmYNm0aFAoFFAoFgLuXvpo0aYKvv/4a7du3h1KpRFZWFgoKCjB27Fg0bdoUDg4OGDhwIP7v//6vjv8FGgbJA9GUKVMwePBg9O3b16A9MzMTubm56N+/v9imVCoREhKCI0eOAADS0tJQUVFh0KdFixbo0KGD2Ofo0aNQq9Xo2rWr2OeJJ56AWq0W+9SkrKwMhYWFBl9EREQPas6cOXjnnXfw5ptv4sKFC9i2bRs0Gg2Ki4sxYMAANG3aFCdPnsRnn32GAwcO4JVXXjF4/6FDh/Dzzz/j0KFD2LRpE5KSkpCUlAQA2LlzJ1q2bIn58+cjJycHOTk54vuKi4uxaNEibNiwAefPn4erqyvGjRuHU6dO4auvvsLRo0chCAIGDRokBiw5k/SS2fbt25Geno6TJ09W25abmwsA1YYlNRoNsrKyxD52dnYGI0tVfaren5ubC1dX12r7d3V1FfvUZNGiRYiLi3uwEyIiIvqToqIirFixAqtXr0Z4eDgAoHXr1ujRowfWr1+PkpISbN68GY0aNQIArF69Gk899RTeeecd8fdf06ZNsXr1alhbW6Nt27YYPHgwDh48iIkTJ8LZ2RnW1tZwdHSEVqs1OHZFRQUSEhLQqVMnAMD//d//4auvvsIPP/yAbt26AQCSk5Ph7u6OL774As8991x9fSxmSbIRoqtXr2Lq1KnYunUrVCrVPftVDf9VEQShWttf/bVPTf3/bj9z5syBTqcTv65evXrfYxIREf3VxYsXUVZWhj59+tS4rVOnTmIYAoDu3bujsrLSYEqHv7+/OCcWANzc3JCfn/+3x7azszOYm3vx4kXY2NgYXDFxcXGBn58fLl68+MDn1tBIFojS0tKQn5+PLl26wMbGBjY2NkhJScHKlSthY2MjJuO/juLk5+eL27RaLcrLy1FQUHDfPnl5edWOf/369ftOilMqlXBycjL4IiIiehD29vb33Ha/f5j/ud3W1rbatsrKylod+8/7EQThgeuQE8kCUZ8+fXD27FmcOXNG/AoMDERoaCjOnDkDb29vaLVa7N+/X3xPeXk5UlJSxKG+Ll26wNbW1qBPTk4Ozp07J/YJCgqCTqfDiRMnxD7Hjx+HTqcT+xARET0MPj4+sLe3x8GDB6tta9++Pc6cOYPbt2+LbT/88AOsrKzg6+tb62PY2dlBr9f/bb/27dvjzp07OH78uNj2xx9/4PLly2jXrl2tj9dQSTaHyNHRER06dDBoa9SoEVxcXMT26OhoLFy4ED4+PvDx8cHChQvh4OCA0aNHA7i7QNaECRMwY8YMuLi4wNnZGTNnzkTHjh3FSdrt2rXDgAEDMHHiRHzwwQcA7t52P2TIEPj5+dXjGRMRkdyoVCq89tprmD17Nuzs7NC9e3dcv34d58+fR2hoKGJiYhAeHo7Y2Fhcv34dr776KsLCwh7otv5WrVohNTUVzz//PJRKJZo1a1ZjPx8fHwwbNkz8fejo6IjXX38djzzyCIYNG2aqU7ZYZrEO0b3Mnj0bJSUliIyMFBdm/Pbbb8U1iABg2bJlsLGxwciRI8WFGZOSkgyutyYnJyMqKkq8G23o0KFYvXp1vZ8PERGZnlVp/axUbexx3nzzTdjY2OCtt97CtWvX4ObmhsmTJ8PBwQH79u3D1KlT8fjjj8PBwQEjRozA0qVLH2j/8+fPx6RJk9C6dWuUlZXd89IYAGzcuBFTp07FkCFDUF5ejuDgYOzZs6faZTk5Ugj3++RIVFhYCLVaDZ1Ox/lERFTvLl++jIiICCQmJj7Q5ZSGorS0FJmZmfDy8hJvxOFK1VSlpu+PKrX9/W3WI0RERET3otFosHXLZj7LjEyCgYiIiCyWRqNhQCGTkHylaiIiIiKpMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHscR0iIiKyWHl5eWa9MGPPnj3x6KOPYvny5UYdLykpCdHR0bh58+Y9+8TGxuKLL77AmTNnjDqGMcc0FSnO714YiIiIyCLl5eVhbNgYlJVX1NsxlXa22Lxla61D0c6dO+v0nLBRo0Zh0KBBRr/f3JnT+TEQERGRRdLpdCgrr8Dk9kVo0Uj/0I937bY11l1whE6nq3UgcnZ2rtMx7e3tYW9vX6d9mKuKigqzOj/OISIiIovWopEerRwf/pcxoatnz56Ijo4GALRq1QoLFizA2LFj0bhxY3h6euLLL7/E9evXMWzYMDRu3BgdO3bEqVOnxPcnJSWhSZMmBvtcvHgxNBoNHB0dMWHCBJSWlhpsP3nyJPr164dmzZpBrVYjJCQE6enpBn1u3ryJiIgIaDQaqFQqdOjQAV9//fU9z2Pt2rVo3bo17Ozs4Ofnhy1bthhsVygUWLt2LQYOHAh7e3t4eXnhs88+E7f/8ssvUCgU+PTTT9GzZ0+oVCps3brVqPN7WBiIiIiI6smyZcvQvXt3nD59GoMHD0ZYWBjGjh2LMWPGID09HW3atMHYsWMhCEKN7//0008RExOD+Ph4nDp1Cm5ubkhISDDoU1RUhPDwcHz33Xc4duwYfHx8MGjQIBQVFQEAKisrMXDgQBw5cgRbt27FhQsXsHjxYlhbW9d4zF27dmHq1KmYMWMGzp07h0mTJuHFF1/EoUOHDPq9+eabGDFiBH788UeMGTMGL7zwAi5evGjQ57XXXkNUVBQuXryIJ5980qjze1h4yYyIiKieDBo0CJMmTQIAvPXWW1i7di0ef/xxPPfccwDuBoagoCDk5eVBq9VWe//y5csxfvx4vPTSSwCABQsW4MCBAwajKL179zZ4zwcffICmTZsiJSUFQ4YMwYEDB3DixAlcvHgRvr6+AABvb+971vzee+9h3LhxiIyMBABMnz4dx44dw3vvvYdevXqJ/Z577jmxrrfffhv79+/HqlWrDAJNdHQ0nnnmmXseqzbn97BwhIiIiKieBAQEiH+vmofUsWPHam35+fk1vv/ixYsICgoyaPvr6/z8fEyePBm+vr5Qq9VQq9W4desWsrOzAQBnzpxBy5YtxTD0dy5evIju3bsbtHXv3r3a6E9Ndf21T2Bg4N8e6+/O72HhCBEREVE9+fMdZwqF4p5tlZWVRh9j3LhxuH79OpYvXw5PT08olUoEBQWhvLwcAIyaxFxVVxVBEKq11eZ9jRo1euBj1xeOEBEREVmIdu3a4dixYwZtf3393XffISoqCoMGDYK/vz+USiV+//13cXtAQAB+/fVXXL58udbH/P777w3ajhw5gnbt2t23jmPHjqFt27a1Osafj/V35/ewcISIiIjIQkydOhXh4eEIDAxEjx49kJycjPPnzxvMAWrTpg22bNmCwMBAFBYWYtasWQajQiEhIQgODsaIESOwdOlStGnTBj/99BMUCgUGDBhQ7ZizZs3CyJEj8dhjj6FPnz7YvXs3du7ciQMHDhj0++yzzwzqOnHiBD788EOTn9/DwkBEREQW7drtmu+OstTj3M+oUaPw888/47XXXkNpaSlGjBiBl19+Gfv27RP7fPTRR4iIiEDnzp3h4eGBhQsXYubMmQb72bFjB2bOnIkXXngBt2/fRps2bbB48eIajzl8+HCsWLEC7777LqKiouDl5YWNGzeiZ8+eBv3i4uKwfft2REZGQqvVIjk5Ge3btzf5+T0sCuFe9/aRgcLCQqjVauh0Ojg5OUldDhHJzOXLlxEREYHExMRaT4ZtSEpLS5GZmQkvLy+oVCoAlrFStVwoFArs2rULw4cPl+T4NX1/VKnt72+OEBERkUXSaDTYvGWrWT/LjCwHAxEREVksjUbDgEImwUBEREREddIQZt/wtnsiIiKSPQYiIiKyGA1hJIJMzxTfFwxERERk9qoePFq12jLRnxUXFwMwXPX7QXEOERERmT0bGxs4ODjg+vXrsLW1hZUV/z1Pd0eGiouLkZ+fjyZNmojB2RgMREREZPYUCgXc3NyQmZmJrKwsqcshM9OkSRNotdo67YOBiIiILIKdnR18fHx42YwM2Nra1mlkqAoDERERWQwrK6tqKxETmQIDEdFf6PV6ZGRk4MaNG3B2dkZAQIBJ/vVBRETmi4GI6E9SU1ORkJCA3NxcsU2r1SIyMhLBwcESVkZERA8Tp+kT/VdqaipiYmLg7e2NNWvWYM+ePVizZg28vb0RExOD1NRUqUskIqKHhIGICHcvkyUkJCAoKAgLFiyAv78/HBwc4O/vjwULFiAoKAhr166FXq+XulQiInoIGIiIAGRkZCA3NxehoaHV1jexsrJCaGgocnJykJGRIVGFRET0MDEQEQG4ceMGAMDLy6vG7VXtVf2IiKhhYSAiAuDs7AwAyMzMrHF7VXtVPyIialgYiIgABAQEQKvVIjk5GZWVlQbbKisrkZycDDc3NwQEBEhUIRERPUwMRES4++DIyMhIHD16FPPmzcP58+dRXFyM8+fPY968eTh69ChefvllrkdERNRAcR0iov8KDg5GXFwcEhISMGXKFLHdzc0NcXFxXIeIiKgBYyAi+pPg4GB0796dK1UTEckMAxHRX1hbW6Nz585Sl0FERPWIc4iIiIhI9hiIiIiISPYYiIiIiEj2GIiIiIhI9hiIiIiISPYYiIiIiEj2GIiIiIhI9hiIiIiISPYYiIiIiEj2GIiIiIhI9hiIiIiISPYYiIiIiEj2GIiIiIhI9hiIiIiISPYYiIiIiEj2GIiIiIhI9hiIiIiISPYYiIiIiEj2GIiIiIhI9hiIiIiISPYYiIiIiEj2GIiIiIhI9hiIiIiISPYYiIiIiEj2GIiIiIhI9iQNRGvXrkVAQACcnJzg5OSEoKAgfPPNN+J2QRAQGxuLFi1awN7eHj179sT58+cN9lFWVoZXX30VzZo1Q6NGjTB06FD8+uuvBn0KCgoQFhYGtVoNtVqNsLAw3Lx5sz5OkYiIiCyApIGoZcuWWLx4MU6dOoVTp06hd+/eGDZsmBh6lixZgqVLl2L16tU4efIktFot+vXrh6KiInEf0dHR2LVrF7Zv347vv/8et27dwpAhQ6DX68U+o0ePxpkzZ7B3717s3bsXZ86cQVhYWL2fLxEREZkpwcw0bdpU2LBhg1BZWSlotVph8eLF4rbS0lJBrVYL69atEwRBEG7evCnY2toK27dvF/v89ttvgpWVlbB3715BEAThwoULAgDh2LFjYp+jR48KAISffvrpnnWUlpYKOp1O/Lp69aoAQNDpdKY+ZSKiv3Xp0iUhJCREuHTpktSlEFkUnU5Xq9/fZjOHSK/XY/v27bh9+zaCgoKQmZmJ3Nxc9O/fX+yjVCoREhKCI0eOAADS0tJQUVFh0KdFixbo0KGD2Ofo0aNQq9Xo2rWr2OeJJ56AWq0W+9Rk0aJF4iU2tVoNd3d3U58yERERmQnJA9HZs2fRuHFjKJVKTJ48Gbt27UL79u2Rm5sLANBoNAb9NRqNuC03Nxd2dnZo2rTpffu4urpWO66rq6vYpyZz5syBTqcTv65evVqn8yQiIiLzZSN1AX5+fjhz5gxu3ryJHTt2IDw8HCkpKeJ2hUJh0F8QhGptf/XXPjX1/7v9KJVKKJXK2p4GERERWTDJR4js7OzQpk0bBAYGYtGiRejUqRNWrFgBrVYLANVGcfLz88VRI61Wi/LychQUFNy3T15eXrXjXr9+vdroExEREcmT0YHo5s2b2LBhA+bMmYMbN24AANLT0/Hbb7/VqSBBEFBWVgYvLy9otVrs379f3FZeXo6UlBR069YNANClSxfY2toa9MnJycG5c+fEPkFBQdDpdDhx4oTY5/jx49DpdGIfIiIikjejLpllZGSgb9++UKvV+OWXXzBx4kQ4Oztj165dyMrKwubNm2u1nzfeeAMDBw6Eu7s7ioqKsH37dhw+fBh79+6FQqFAdHQ0Fi5cCB8fH/j4+GDhwoVwcHDA6NGjAQBqtRoTJkzAjBkz4OLiAmdnZ8ycORMdO3ZE3759AQDt2rXDgAEDMHHiRHzwwQcAgIiICAwZMgR+fn7GnD6ZudLSUmRnZ0tdBgDAw8MDKpVK6jKIiOhvGBWIpk+fjnHjxmHJkiVwdHQU2wcOHCiGldrIy8tDWFgYcnJyoFarERAQgL1796Jfv34AgNmzZ6OkpASRkZEoKChA165d8e233xocc9myZbCxscHIkSNRUlKCPn36ICkpCdbW1mKf5ORkREVFiXejDR06FKtXrzbm1MkCZGdnIyIiQuoyAACJiYnw9fWVugwiIvobCkEQhAd9k1qtRnp6Olq3bg1HR0f8+OOP8Pb2RlZWFvz8/FBaWvowapVUYWEh1Go1dDodnJycpC6H7sMUI0RZWVmIj4/H3Llz4enpafR+OEJEpnL58mVEREQwZBM9oNr+/jZqhEilUqGwsLBa+6VLl9C8eXNjdklkMiqVymS/MDw9PfnLh4hIBoyaVD1s2DDMnz8fFRUVAO7e1p6dnY3XX38dI0aMMGmBRERERA+bUYHovffew/Xr1+Hq6oqSkhKEhISgTZs2cHR0RHx8vKlrJCIiInqojLpk5uTkhO+//x7//ve/kZ6ejsrKSjz22GPinV1ERERElqROK1X37t0bvXv3NlUtRERERJIwOhCdOHEChw8fRn5+PiorKw22LV26tM6FEREREdUXowLRwoULMW/ePPj5+UGj0fztc8OIiIiIzJlRgWjFihX46KOPMG7cOBOXQ0RERFT/jLrLzMrKCt27dzd1LURERESSMCoQTZs2DWvWrDF1LURERESSMOqS2cyZMzF48GC0bt0a7du3h62trcH2nTt3mqQ4IiIiovpgVCB69dVXcejQIfTq1QsuLi6cSE1EREQWzahAtHnzZuzYsQODBw82dT1ERERE9c6oOUTOzs5o3bq1qWshIiIikoRRgSg2NhYxMTEoLi42dT1ERERE9c6oS2YrV67Ezz//DI1Gg1atWlWbVJ2enm6S4oiIiIjqg1GBaPjw4SYug4iIiEg6RgWimJgYU9dBREREJBmj5hARERERNSS1HiFydnbG5cuX0axZMzRt2vS+aw/duHHDJMURERER1YdaB6Jly5bB0dFR/DsXYyQiIqKGotaBKDw8XPw7n3JPREREDYlRc4isra2Rn59frf2PP/6AtbV1nYsiIiIiqk9GBSJBEGpsLysrg52dXZ0KIiIiIqpvD3Tb/cqVKwEACoUCGzZsQOPGjcVter0eqampaNu2rWkrJCIi+q/S0lJkZ2dLXQYAwMPDAyqVSuoyyEQeKBAtW7YMwN0RonXr1hlcHrOzs0OrVq2wbt0601ZIRET0X9nZ2YiIiJC6DABAYmIifH19pS6DTOSBAlFmZiYAoFevXti5cyeaNm36UIoiIiKqiYeHBxITE+u0j6ysLMTHx2Pu3Lnw9PSsUy3UcBi1UnWvXr2gVCqrtZeUlODdd9/FW2+9VefCiIiI/kqlUplsVMbT05MjPCQyalJ1XFwcbt26Va29uLgYcXFxdS6KiIiIqD4ZfZdZTQsz/vjjj3B2dq5zUURERET16YEumVU9skOhUMDX19cgFOn1ety6dQuTJ082eZFERERED9MDBaLly5dDEASMHz8ecXFxUKvV4raqu8yCgoJMXiQRERHRw/RAgSg8PBx37twBAPTt2xctW7Z8KEURERER1acHnkNkY2ODyMhI6PX6h1EPERERUb0zalJ1165dcfr0aVPXQkRERCQJo9YhioyMxIwZM/Drr7+iS5cuaNSokcH2gIAAkxRHREREVB+MCkSjRo0CAERFRYltCoVCvB2fl9OIiIjIkhgViKoe4UFERETUEBgViOry7BciIiIic2NUIKpy4cIFZGdno7y83KB96NChdSqKiIiIqD4ZFYiuXLmCp59+GmfPnhXnDgEQV67mHCIiIiKyJEbddj916lR4eXkhLy8PDg4OOH/+PFJTUxEYGIjDhw+buEQiIiKih8uoEaKjR4/i3//+N5o3bw4rKytYWVmhR48eWLRoEaKiorhGEREREVkUowKRXq9H48aNAQDNmjXDtWvX4OfnB09PT1y6dMmkBRIREZHplZaWIjs7W+oyAAAeHh5QqVSS1mBUIOrQoQMyMjLg7e2Nrl27YsmSJbCzs0NiYiK8vb1NXSMRERGZWHZ2NiIiIqQuAwCQmJgIX19fSWswKhDNmzcPt2/fBgAsWLAAQ4YMwT//+U+4uLhg+/btJi2QiMgc5OXlQafTSXb8rKwsgz+lolarodFoJK2BTMPDwwOJiYlGvz8rKwvx8fGYO3dunZfj8fDwqNP7TcGoQPTkk0+Kf/f29saFCxdw48YNNG3aVLzTjIioocjLy8OYsLGoKC+TuhTEx8dLenxbOyW2btnMUNQAqFQqk4zKeHp6Sj66YwpGBaLx48djxYoVcHR0FNucnZ1x+/ZtvPrqq/joo49MViARkdR0Oh0qystQ4h2CSpVa6nIkY1WqA66kQKfTMRBRg2NUINq0aRMWL15sEIgAoKSkBJs3b2YgIiLo9XpkZGTgxo0bcHZ2RkBAAKytraUuq04qVWpUNmomdRlE9BA8UCAqLCyEIAgQBAFFRUUGM8L1ej327NkDV1dXkxdJRJYlNTUVCQkJyM3NFdu0Wi0iIyMRHBwsYWVERDV7oEDUpEkTKBQKKBSKGq8XKhQKxMXFmaw4IrI8qampiImJQVBQEN588014eXkhMzMTycnJiImJQVxcHEMREZmdBwpEhw4dgiAI6N27N3bs2AFnZ2dxm52dHTw9PdGiRQuTF0lElkGv1yMhIQFBQUFYsGABrKzuLobv7++PBQsWYN68eVi7di26d+9u8ZfPiKhheaBAFBISAgDIzMyEh4cH7ygjIgMZGRnIzc3Fm2++KYahKlZWVggNDcWUKVOQkZGBzp07S1QlEVF1Rj3L7OLFi/jhhx/E12vWrMGjjz6K0aNHo6CgwGTFEZFluXHjBgDAy8urxu1V7VX9iIjMhVGBaNasWSgsLAQAnD17FtOnT8egQYNw5coVTJ8+3aQFEpHlqLqMnpmZWeP2qvY/X24nIjIHRgWizMxMtG/fHgCwY8cOPPXUU1i4cCESEhLwzTffmLRAIrIcAQEB0Gq1SE5ORmVlpcG2yspKJCcnw83NDQEBARJVSERUM6MCkZ2dHYqLiwEABw4cQP/+/QHc/Vdf1cgREcmPtbU1IiMjcfToUcybNw/nz59HcXExzp8/j3nz5uHo0aN4+eWXOaGaiMyOUQsz9ujRA9OnT0f37t1x4sQJfPLJJwCAy5cvo2XLliYtkIgsS3BwMOLi4pCQkIApU6aI7W5ubrzlnojMllGBaPXq1YiMjMTnn3+OtWvX4pFHHgEAfPPNNxgwYIBJCyQiyxMcHIzu3bs3uJWqiajhMioQeXh44Ouvv67WvmzZsjoXREQNg7W1NW+tJyKLYdQcovT0dJw9e1Z8/eWXX2L48OF44403UF5ebrLiiIiIiOqDUYFo0qRJuHz5MgDgypUreP755+Hg4IDPPvsMs2fPNmmBRERERA+bUYHo8uXLePTRRwEAn332GYKDg7Ft2zYkJSVhx44dpqyPiIiI6KEzKhAJgiCuMXLgwAEMGjQIAODu7o7ff//ddNURERER1QOjAlFgYCAWLFiALVu2ICUlBYMHDwZwd8FGjUZj0gKJiIiIHjaj7jJbvnw5QkND8cUXX2Du3Llo06YNAODzzz9Ht27dTFqgnJSWliI7O1vqMgDcvZNQpVJJXQYREVG9MCoQBQQEGNxlVuXdd9/lOiN1kJ2djYiICKnLAAAkJibC19dX6jKIiIjqhVGB6F4edERh0aJF2LlzJ3766SfY29ujW7dueOedd+Dn5yf2EQQBcXFxSExMREFBAbp27Yo1a9bA399f7FNWVoaZM2fi448/RklJCfr06YOEhASDVbMLCgoQFRWFr776CgAwdOhQrFq1Ck2aNKnbSZuQh4cHEhMTjX5/VlYW4uPjMXfuXHh6eta5FiIiIrkwKhBZWVlBoVDcc7ter6/VflJSUjBlyhQ8/vjjuHPnDubOnYv+/fvjwoULaNSoEQBgyZIlWLp0KZKSkuDr64sFCxagX79+uHTpEhwdHQEA0dHR2L17N7Zv3w4XFxfMmDEDQ4YMQVpamjhiNXr0aPz666/Yu3cvACAiIgJhYWHYvXu3MR/BQ6FSqUwyKuPp6cnRHSIiogdgVCDatWuXweuKigqcPn0amzZtQlxcXK33UxVOqmzcuBGurq5IS0tDcHAwBEHA8uXLMXfuXDzzzDMAgE2bNkGj0WDbtm2YNGkSdDodPvzwQ2zZsgV9+/YFAGzduhXu7u44cOAAnnzySVy8eBF79+7FsWPH0LVrVwDA+vXrERQUhEuXLhmMSNVFXl4edDqdSfZljKysLIM/paJWqzm5noiILIpRgWjYsGHV2p599ln4+/vjk08+wYQJE4wqpipMODs7A7h711pubi769+8v9lEqlQgJCcGRI0cwadIkpKWloaKiwqBPixYt0KFDBxw5cgRPPvkkjh49CrVaLYYhAHjiiSegVqtx5MiRGgNRWVkZysrKxNeFhYX3rT0vLw9jwsaiorzsvv3qQ3x8vKTHt7VTYuuWzQxFRERkMUw6h6hr166YOHGiUe8VBAHTp09Hjx490KFDBwBAbm4uAFT7xarRaMRRkNzcXNjZ2aFp06bV+lS9Pzc3F66urtWO6erqKvb5q0WLFj3QaJdOp0NFeRlKvENQqVLX+n0NjVWpDriSAp1Ox0BEREQWw2SBqKSkBKtWrTKYyPwgXnnlFWRkZOD777+vtu2v85UEQbjvHKaa+tTU/377mTNnDqZPny6+LiwshLu7+32PCQCVKjUqGzX7235ERERkPowKRE2bNjUIEoIgoKioCA4ODti6desD7+/VV1/FV199hdTUVINApdVqAdwd4XFzcxPb8/PzxdEHrVaL8vJyFBQUGIwS5efni2siabVa5OXlVTvu9evX7zmKoVQqoVQqH/hciIiIyPIYvTDjn1lZWaF58+bo2rVrtUtX9yMIAl599VXs2rULhw8fhpeXl8F2Ly8vaLVa7N+/H507dwYAlJeXIyUlBe+88w4AoEuXLrC1tcX+/fsxcuRIAEBOTg7OnTuHJUuWAACCgoKg0+lw4sQJ/OMf/wAAHD9+HDqdjgtJEhERkXGBKDw83CQHnzJlCrZt24Yvv/wSjo6O4nwetVoNe3t7KBQKREdHY+HChfDx8YGPjw8WLlwIBwcHjB49Wuw7YcIEzJgxAy4uLnB2dsbMmTPRsWNH8a6zdu3aYcCAAZg4cSI++OADAHdvux8yZIjJ7jAjIiIiy2X0HKKbN2/ixIkTyM/PFx/0WmXs2LG12sfatWsBAD179jRo37hxI8aNGwcAmD17NkpKShAZGSkuzPjtt9+KaxABwLJly2BjY4ORI0eKCzMmJSUZrJqdnJyMqKgo8W60oUOHYvXq1Q962kRERNQAGRWIdu/ejdDQUNy+fRuOjo7VJi/XNhAJgvC3fRQKBWJjYxEbG3vPPiqVCqtWrcKqVavu2cfZ2dmo+U1ERETU8Bn1tPsZM2Zg/PjxKCoqws2bN1FQUCB+3bhxw9Q1EhERET1URgWi3377DVFRUXBwcDB1PURERET1zqhA9OSTT+LUqVOmroWIiIhIEkbNIRo8eDBmzZqFCxcuoGPHjrC1tTXYPnToUJMUR0RERFQfjApEVY/nmD9/frVtCoWi1k+7JyIiIjIHRgWiv95mT0RERGTJjJpDRERERNSQ1HqEaOXKlYiIiIBKpcLKlSvv2zcqKqrOhRERERHVl1oHomXLliE0NBQqlQrLli27Zz+FQsFARERERBal1oEoMzOzxr8TERERWTrOISIiIiLZM+ouM0EQ8Pnnn+PQoUM1Ptx1586dJimOiIiIqD4YFYimTp2KxMRE9OrVCxqNxuDhrkRERESWxqhAtHXrVuzcuRODBg0ydT1ERERE9c6oOURqtRre3t6mroWIiIhIEkYFotjYWMTFxaGkpMTU9RARERHVO6MumT333HP4+OOP4erqilatWlV7uGt6erpJiiMiIiKqD0YFonHjxiEtLQ1jxozhpGoiInogeXl50Ol0kh0/KyvL4E+pqNVqaDQaSWug/zEqEP3rX//Cvn370KNHD1PXQ0REDVheXh7Gho1BWXmF1KUgPj5e0uMr7WyxectWhiIzYVQgcnd3h5OTk6lrIRLxX5B38V+Q1NDodDqUlVdgcvsitGikl7ocyVy7bY11Fxyh0+n4/7iZMCoQvf/++5g9ezbWrVuHVq1ambgkkru8vDyMCRuLivIyqUuR/F+QtnZKbN2ymT8wqcFp0UiPVo7yDURkfowKRGPGjEFxcTFat24NBweHapOqb9y4YZLiSJ50Oh0qystQ4h2CSpVa6nIkY1WqA66k8F+QRET1wKhAtHz5chOXQVRdpUqNykbNpC6DiIhkwKhAFB4ebuo6iIiIiCRj1MKMH374YY3td+7cwZw5c+pUEBEREVF9MyoQzZgxAyNGjDCYK/TTTz/hH//4Bz799FOTFUdElkuv1+P06dM4ePAgTp8+Db2eE2iJyHwZdcns9OnTCAsLQ8eOHZGUlITLly9j1qxZePbZZ7FmzRpT10hEFiY1NRUJCQnIzc0V27RaLSIjIxEcHCxhZURENTNqhMjLywupqal49tlnMWDAAEybNg0fffQRNm/eDEdHR1PXSEQWJDU1FTExMfD29saaNWuwZ88erFmzBt7e3oiJiUFqaqrUJRIRVWNUIAKAr7/+Gh9//DG6deuGJk2aYP369bh27ZopayMiC6PX65GQkICgoCAsWLAA/v7+cHBwgL+/PxYsWICgoCCsXbuWl8+IyOwYFYgmTZqEkSNHYvbs2UhNTUVGRgaUSiU6duzIOUREMpaRkYHc3FyEhobCysrwx4uVlRVCQ0ORk5ODjIwMiSokIqqZUXOIfvjhBxw/fhydOnUCcHduQNWw+Pjx4zFy5EiTFklElqHqRgsvL68at1e1c/FWIjI3RgWitLQ0KJXKau1TpkxB375961wUEVkmZ2dnAEBmZibatm2LjIwM3LhxA87OzggICEBmZqZBPyIic2FUIKopDFXx8/MzuhgismwBAQHQarVYuXIldDpdtbvM1Go13NzcEBAQIGGVRETVGRWIAODzzz/Hp59+iuzsbJSXlxtsS09Pr3NhRGR5rK2t0bNnT2zfvh1NmzbFzJkzERQUhKNHj+LDDz/EpUuX8Pzzz8Pa2lrqUomIDBg1qXrlypV48cUX4erqitOnT+Mf//gHXFxccOXKFQwcONDUNRKRhdDr9Th8+DD8/PxgZ2eH9957DyNGjMB7770HpVIJPz8/pKSk8C4zIjI7Ro0QJSQkIDExES+88AI2bdqE2bNnw9vbG2+99RYnSxLJWNVdZm+++WaNc4h++uknTJkyBRkZGejcubPU5RIRiYwKRNnZ2ejWrRsAwN7eHkVFRQCAsLAwPPHEE1i9erXpKiQii/Hnu8ysra2rhR7eZUZE5sqoS2ZarRZ//PEHAMDT0xPHjh0DcPfOEkEQTFcdEVmUP99lVhPeZUZE5sqoQNS7d2/s3r0bADBhwgRMmzYN/fr1w6hRo/D000+btEAishxVd5klJyejsrLSYFtlZSWSk5N5lxkRmSWjLpklJiaKP+wmT54MFxcXfPfdd3jqqafw8ssvm7RAIrIc1tbWiIyMRExMDObNm4fQ0FB4eXkhMzMTycnJOHr0KOLi4niXGRGZHaMCkZWVFcrLy5Geno78/HwolUpxQca9e/fiqaeeMmmRRGQ5goODERcXh4SEBEyZMkVsd3NzQ1xcHJ92T0RmyahAtHfvXoSFhYnziP5MoVDwlloimQsODkb37t2r3WXGkSEi08nLy4NOp5Ps+FlZWQZ/SkmtVkOj0dRpH0YFoldeeQUjR47EW2+9VecCiKhhqukuMyIyjby8PIwNG4Oy8gqpS0F8fLzUJUBpZ4vNW7bWKZMYFYjy8/Mxffp0hiEiIiIJ6HQ6lJVXYHL7IrRoJO+rMtduW2PdBUfodLr6D0TPPvssDh8+jNatWxt9YCIiS2NVclPqEiQl9/M3Ry0a6dHKUd6ByFSMCkSrV6/Gc889h++++w4dO3aEra2twfaoqCiTFEdEZE7sM1OlLoGIHhKjAtG2bduwb98+2Nvb4/Dhw1AoFOI2hULBQEREDVKJVzAq7ZtIXYZkrEpuMhRSg2VUIJo3bx7mz5+P119/HVZWRq3tSERkcSrtm6CyUTOpyyCih8CoNFNeXo5Ro0YxDBEREVGDYFSiCQ8PxyeffGLqWoiIiIgkYdQlM71ejyVLlmDfvn0ICAioNql66dKlJimOiIiIqD4YFYjOnj0rLrh27tw5g21/nmBNREREZAmMCkSHDh0ydR1EREREkuGsaCIiIpI9BiIiIiKSPQYiIiIikj0GIiIiIpI9BiIiIiKSPQYiIiIikj0GIiIiIpI9BiIiIiKSPQYiIiIikj2jVqomIiKqi2u3raUuQVJyP39zxEBERET1bt0FR6lLIDLAQERERPVucvsitGikl7oMyVy7bc1QaGYYiIiIqN61aKRHK0f5BiIyPwxERHRPpaWlyM7OlroMAICHhwdUKpXUZRBRA8VARET3lJ2djYiICKnLAAAkJibC19dX6jKIqIGSNBClpqbi3XffRVpaGnJycrBr1y4MHz5c3C4IAuLi4pCYmIiCggJ07doVa9asgb+/v9inrKwMM2fOxMcff4ySkhL06dMHCQkJaNmypdinoKAAUVFR+OqrrwAAQ4cOxapVq9CkSZP6OlUii+Th4YHExESj35+VlYX4+HjMnTsXnp6eda6FiOhhkTQQ3b59G506dcKLL76IESNGVNu+ZMkSLF26FElJSfD19cWCBQvQr18/XLp0CY6OdyejRUdHY/fu3di+fTtcXFwwY8YMDBkyBGlpabC2vntb4+jRo/Hrr79i7969AICIiAiEhYVh9+7d9XeyRBZIpVKZZFTG09OToztEZNYkDUQDBw7EwIEDa9wmCAKWL1+OuXPn4plnngEAbNq0CRqNBtu2bcOkSZOg0+nw4YcfYsuWLejbty8AYOvWrXB3d8eBAwfw5JNP4uLFi9i7dy+OHTuGrl27AgDWr1+PoKAgXLp0CX5+fvVzskRERGS2zHal6szMTOTm5qJ///5im1KpREhICI4cOQIASEtLQ0VFhUGfFi1aoEOHDmKfo0ePQq1Wi2EIAJ544gmo1WqxT03KyspQWFho8EVEREQNk9kGotzcXACARqMxaNdoNOK23Nxc2NnZoWnTpvft4+rqWm3/rq6uYp+aLFq0CGq1Wvxyd3ev0/kQERGR+TLbQFRFoVAYvBYEoVrbX/21T039/24/c+bMgU6nE7+uXr36gJUTERGRpTDbQKTVagGg2ihOfn6+OGqk1WpRXl6OgoKC+/bJy8urtv/r169XG336M6VSCScnJ4MvIiIiapjMNhB5eXlBq9Vi//79Ylt5eTlSUlLQrVs3AECXLl1ga2tr0CcnJwfnzp0T+wQFBUGn0+HEiRNin+PHj0On04l9iIiISN4kvcvs1q1b+M9//iO+zszMxJkzZ+Ds7AwPDw9ER0dj4cKF8PHxgY+PDxYuXAgHBweMHj0aAKBWqzFhwgTMmDEDLi4ucHZ2xsyZM9GxY0fxrrN27dphwIABmDhxIj744AMAd2+7HzJkCO8wIyIiIgASB6JTp06hV69e4uvp06cDAMLDw5GUlITZs2ejpKQEkZGR4sKM3377rbgGEQAsW7YMNjY2GDlypLgwY1JSkrgGEQAkJycjKipKvBtt6NChWL16dT2dJREREZk7SQNRz549IQjCPbcrFArExsYiNjb2nn1UKhVWrVqFVatW3bOPs7Mztm7dWpdSiYiIqAEz2zlERERERPWFgYiIiIhkj4GIiIiIZE/SOURE9HDl5eVBp9NJdvysrCyDP6WkVqvvu/YYEckbAxFRA5WXl4exYWNQVl4hdSmIj4+XugQo7WyxectWhiIiqhEDEVEDpdPpUFZegcnti9CikV7qciR17bY11l1whE6nYyAiohoxEBE1cC0a6dHKUd6BiIjo73BSNREREckeR4hMzKrkptQlSEru509ERJaJgcjE7DNTpS6BiIiIHhADkYmVeAWj0r6J1GVIxqrkJkMhERFZHAYiE6u0b4LKRs2kLoOIiIgeACdVExERkewxEBEREZHsMRARERGR7HEOERERkYW6dtta6hIkZ6rPgIGIzJbc1zSS+/kT0d9bd8FR6hIaDAYiMlu8fZ+I6P74rML/PauwrhiIyGxxTSfTrOnEIXXTfQZWpTqT7MdSyf38zRGfVWg6DEQmJvcfGKY8f67pZBocUq87tVoNWzslcCVF6lIkZ2unhFqtlroMIpNjIDIR/sD8H/7ANC8cUq/7kLpGo8HWLZuh00n3D56srCzEx8dj7ty58PT0lKwOtVoNjUYj2fGJHhYGIhPhD8z/4Q9M88IhddPQaDRm8X3t6ekJX19fqcsganAYiEyIPzCJiIgsExdmJCIiItljICIiIiLZ4yUzMlu8Y0/e509EVJ8YiMjs8I69/+Ede0RE9YOBiMwO79j7H96xR0RUPxiIyCzxjj0iIqpPDEREREQWio/m4dPuiYiIZEutVkNpZ8tH8/yX0s62zvMtGYiIiIgsjEajweYtWznX8r9MMd+SgYiIiMgCca6laXFhRiIiIpI9jhARNXCcdMnPwBzJ/b+J3M/fHDEQETVQnHRpyBSTLqnu+H35P/yeNC8MREQNFCddGuIil+aB35f/w+9J88JARNSAcdIlmSN+X5I54qRqIiIikj0GIiIiIpI9BiIiIiKSPQYiIiIikj0GIiIiIpI9BiIiIiKSPQYiIiIikj2uQ2RGSktLkZ2dbfT7s7KyDP6sCw8PD6hUqjrvh4iIyBIwEJmR7OxsRERE1Hk/8fHxdd5HYmIiFywjIiLZYCAyIx4eHkhMTJS6DAB3ayEiIpILBiIzolKpOCpDREQkAU6qJiIiItljICIiIiLZYyAiIiIi2WMgIiIiItljICIiIiLZYyAiIiIi2WMgIiIiItljICIiIiLZYyAiIiIi2WMgIiIiItljICIiIiLZYyAiIiIi2WMgIiIiItljICIiIiLZs5G6ACIiotoqLS1FdnZ2nfaRlZVl8KexPDw8oFKp6rQPMh8MREREZDGys7MRERFhkn3Fx8fX6f2JiYnw9fU1SS0kPQYiIiKyGB4eHkhMTJS6DAB3a6GGg4GIGhwOqRM1XCqViqMy9FAwEFGDwyF1IiJ6ULIKRAkJCXj33XeRk5MDf39/LF++HP/85z+lLotMjEPqZI7qOnJpqlFLgCOXRDWRTSD65JNPEB0djYSEBHTv3h0ffPABBg4ciAsXLvCXVgPDIXUyR6YauazrqCXAkUu6iyHdkEIQBEHSCupJ165d8dhjj2Ht2rViW7t27TB8+HAsWrSoWv+ysjKUlZWJrwsLC+Hu7g6dTgcnJ6d6qZlIaqb4gRkfH4+5c+fC09OzTrWYww/MujDF3DZTsfTPkkzj8uXLJpteUFcPM6QXFhZCrVb/7e9vWQSi8vJyODg44LPPPsPTTz8ttk+dOhVnzpxBSkpKtffExsYiLi6uWjsDEcmJXH5gEsmRXEJ6bQORLC6Z/f7779Dr9dBoNAbtGo0Gubm5Nb5nzpw5mD59uvi6aoSISE44H4uo4eL0AkOyCERVFAqFwWtBEKq1VVEqlVAqlfVRFpHZ4g9MIpILWTzLrFmzZrC2tq42GpSfn19t1IiIiIjkRxaByM7ODl26dMH+/fsN2vfv349u3bpJVBURERGZC9lcMps+fTrCwsIQGBiIoKAgJCYmIjs7G5MnT5a6NCIiIpKYbALRqFGj8Mcff2D+/PnIyclBhw4dsGfPnjrfCkxERESWTxa33ZtCbW/bIyIiIvNR29/fsphDRERERHQ/DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQke7JZqbquqtavLCwslLgSIiIiqq2q39t/tw41A1EtFRUVAQDc3d0lroSIiIgeVFFREdRq9T2389EdtVRZWYlr167B0dERCoVC6nJqVFhYCHd3d1y9epWPF6kjfpamwc/RdPhZmg4/S9OwlM9REAQUFRWhRYsWsLK690whjhDVkpWVFVq2bCl1GbXi5ORk1t+cloSfpWnwczQdfpamw8/SNCzhc7zfyFAVTqomIiIi2WMgIiIiItljIGpAlEolYmJioFQqpS7F4vGzNA1+jqbDz9J0+FmaRkP7HDmpmoiIiGSPI0REREQkewxEREREJHsMRERERCR7DEREREQkewxEDcDatWsREBAgLo4VFBSEb775RuqyLN6iRYugUCgQHR0tdSkW6bfffsOYMWPg4uICBwcHPProo0hLS5O6LItz584dzJs3D15eXrC3t4e3tzfmz5+PyspKqUuzOEVFRYiOjoanpyfs7e3RrVs3nDx5UuqyzF5qaiqeeuoptGjRAgqFAl988YXBdkEQEBsbixYtWsDe3h49e/bE+fPnpSm2DhiIGoCWLVti8eLFOHXqFE6dOoXevXtj2LBhFvkNaS5OnjyJxMREBAQESF2KRSooKED37t1ha2uLb775BhcuXMD777+PJk2aSF2axXnnnXewbt06rF69GhcvXsSSJUvw7rvvYtWqVVKXZnFeeukl7N+/H1u2bMHZs2fRv39/9O3bF7/99pvUpZm127dvo1OnTli9enWN25csWYKlS5di9erVOHnyJLRaLfr16yc+A9RiCNQgNW3aVNiwYYPUZVikoqIiwcfHR9i/f78QEhIiTJ06VeqSLM5rr70m9OjRQ+oyGoTBgwcL48ePN2h75plnhDFjxkhUkWUqLi4WrK2t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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Type your answer here\n", "sns.boxplot(data=df,x='nest',y='maxminusstarttime',hue='treatment')" ] }, { "cell_type": "markdown", "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-b926439e7eb1c2b5", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "source": [ "## Q9. Make a dictionary called `mean_duration_of_foraging_by_treatment`. Fill this with items whose keys are treatment strings (`'control'` and `'imidacloprid'`) and whose values are the mean of all `'maxminusstarttime'` values for rows in which the `treatment` variable is the same as the key. \n", "\n", "Hint: use `groupby` to group on the `treatment` column and use the `.mean()` method on the `maxminusstarttime` Series within each group data frame. Store each mean as the value in your dictionary for the key." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-cdfad08c7777905d", "locked": false, "schema_version": 3, "solution": true, "task": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "control\n", "1394.4603174603174\n", "\n", "imidacloprid\n", "910.8152173913044\n", "\n", "{'control': 1394.4603174603174, 'imidacloprid': 910.8152173913044}\n" ] } ], "source": [ "mean_duration_of_foraging_by_treatment = {}\n", "\n", "for treatment, gdf in df.groupby('treatment'):\n", " print(treatment)\n", " print(gdf['maxminusstarttime'].mean())\n", " print()\n", " mean_duration_of_foraging_by_treatment[treatment] = gdf['maxminusstarttime'].mean()\n", " \n", "print(mean_duration_of_foraging_by_treatment)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "nbgrader": { "grade": true, "grade_id": "cell-ad0c60eabc04c1b7", "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([(k,int(round(v))) for (k,v) in mean_duration_of_foraging_by_treatment.items()]) == '14fe49a61a'" ] }, { "cell_type": "markdown", "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-6718f15155ae17c2", "locked": true, "schema_version": 3, "solution": false, "task": false } }, "source": [ "## Q10. Make a dictionary `num_unique_bees_per_nest` which has key-value pairs of nest number and the number of unique bees from that nest.\n", "\n", "Hint use `.groupby` on the `'nest'` column." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "nbgrader": { "grade": false, "grade_id": "cell-0df074ae6ba331e7", "locked": false, "schema_version": 3, "solution": true, "task": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{3: 8, 4: 23, 6: 37, 8: 34, 9: 33, 10: 24}\n" ] } ], "source": [ "num_unique_bees_per_nest = {}\n", "for nest, gdf in df.groupby('nest'):\n", " num_unique_bees_per_nest[nest] = len(gdf['bee'].unique())\n", "print(num_unique_bees_per_nest)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "nbgrader": { "grade": true, "grade_id": "cell-9fe3a1593835ed57", "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_unique_bees_per_nest)=='ddc47911c0'" ] } ], "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.10" } }, "nbformat": 4, "nbformat_minor": 4 }