{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"2020-11-05 - class #10 - activities.ipynb","provenance":[],"collapsed_sections":["8d6J9xZiFtU2","II3iXc9lS-Xb"]},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"BRAp37uklN9X"},"source":["# Class \\#10 activities"]},{"cell_type":"markdown","metadata":{"id":"75Fru6pykhxR"},"source":["# Practice with `pandas`: Ballard Locks salmon counts"]},{"cell_type":"code","metadata":{"id":"XANgNomokhQp","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1604626782369,"user_tz":480,"elapsed":412,"user":{"displayName":"Ethan C Campbell","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjCBYTiuomqOsCakND1k_5wj0kYvFY53Jt7kunt=s64","userId":"11255944928409084259"}},"outputId":"ca4d09ea-e99e-4779-9eab-8baf33447421"},"source":["# Import NumPy, Pandas, Matplotlib, and datetime at the top of your code\n","import numpy as np\n","import pandas as pd\n","import matplotlib.pyplot as plt\n","from datetime import datetime, timedelta\n","\n","# Give Colab access to Google Drive\n","from google.colab import drive\n","drive.mount('/content/drive')"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"c258zxyZlOuk"},"source":["# Filepath for Ballard Locks salmon count data\n","\n","# Note: you may need to change this to match your own filepath,\n","# which you can get by opening the left sidebar (folder icon),\n","# navigating to the file, clicking the \"...\" on the file, and\n","# selecting \"Copy path\"\n","filepath = '/content/drive/My Drive/OCEAN 215 - Autumn \\'20/OCEAN 215 - Autumn \\'20 - Course documents/Zoom class slides and notebooks/2020-11-05 - class #10 - data/ballard_salmon_counts.csv'"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"eQCX7qkNSpUB"},"source":["## **Breakout rooms, round 1**"]},{"cell_type":"markdown","metadata":{"id":"arXwiCsM6wL1"},"source":["0. Assign roles:\n","> * **Choose one person to write code and share their screen.**\n","> * **Choose a second person to take notes on the answers to report back to the class.**\n","1. Load the salmon data CSV file into Pandas.\n","> * When you do this, specify that the 0th column (the dates) should be the index.\n",">\n","> * Also specify that Pandas should parse the index as dates (datetimes).\n",">\n","> * Consult the documentation for [`pd.read_csv()`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html) to find the arguments to specify these two things.\n","2. Display the data.\n","3. Use `.describe()` to view the summary statistics.\n","4. Answer the following questions with your group:\n","\n","* How many salmon species are counted?\n","* When does this data start and end?\n","* What are the average daily counts for each species?\n","* What are the highest daily counts for each species?"]},{"cell_type":"code","metadata":{"id":"I93RpkPttjHH","colab":{"base_uri":"https://localhost:8080/","height":708},"executionInfo":{"status":"ok","timestamp":1604626785489,"user_tz":480,"elapsed":369,"user":{"displayName":"Ethan C Campbell","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjCBYTiuomqOsCakND1k_5wj0kYvFY53Jt7kunt=s64","userId":"11255944928409084259"}},"outputId":"601bfea5-e38c-408e-ccee-95d31ebe780b"},"source":["# Load the float data file from Google Drive as a Pandas DataFrame\n","salmon_data = pd.read_csv(filepath,index_col=0,parse_dates=True)\n","\n","# View data and stats\n","display(salmon_data)\n","salmon_data.describe()\n","\n","# Answers:\n","# a. 3 species\n","# b. June 2013 to October 2020\n","# c. 242, 247, 1316 for Chinook, Coho, Sockeye\n","# d. 916, 1026, 12936"],"execution_count":null,"outputs":[{"output_type":"display_data","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","
ChinookCohoSockeye
2013-06-12NaNNaN2778.0
2013-06-13NaNNaN2424.0
2013-06-14NaNNaN1285.0
2013-06-15NaNNaN2430.0
2013-06-16NaNNaN3081.0
............
2020-09-28NaN219.0NaN
2020-09-29NaN81.0NaN
2020-09-30NaN13.0NaN
2020-10-01NaN44.0NaN
2020-10-02NaN38.0NaN
\n","

419 rows × 3 columns

\n","
"],"text/plain":[" Chinook Coho Sockeye\n","2013-06-12 NaN NaN 2778.0\n","2013-06-13 NaN NaN 2424.0\n","2013-06-14 NaN NaN 1285.0\n","2013-06-15 NaN NaN 2430.0\n","2013-06-16 NaN NaN 3081.0\n","... ... ... ...\n","2020-09-28 NaN 219.0 NaN\n","2020-09-29 NaN 81.0 NaN\n","2020-09-30 NaN 13.0 NaN\n","2020-10-01 NaN 44.0 NaN\n","2020-10-02 NaN 38.0 NaN\n","\n","[419 rows x 3 columns]"]},"metadata":{"tags":[]}},{"output_type":"execute_result","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","
ChinookCohoSockeye
count55.00000032.000000370.000000
mean224.290909246.7187501315.670270
std218.044395238.5810521746.660107
min0.00000013.0000000.000000
25%59.00000075.750000159.250000
50%164.000000154.500000699.000000
75%305.000000378.5000001745.000000
max916.0000001026.00000012936.000000
\n","
"],"text/plain":[" Chinook Coho Sockeye\n","count 55.000000 32.000000 370.000000\n","mean 224.290909 246.718750 1315.670270\n","std 218.044395 238.581052 1746.660107\n","min 0.000000 13.000000 0.000000\n","25% 59.000000 75.750000 159.250000\n","50% 164.000000 154.500000 699.000000\n","75% 305.000000 378.500000 1745.000000\n","max 916.000000 1026.000000 12936.000000"]},"metadata":{"tags":[]},"execution_count":3}]},{"cell_type":"markdown","metadata":{"id":"h3XnSPJfSvB5"},"source":["## **Breakout rooms, round 2**"]},{"cell_type":"markdown","metadata":{"id":"M_QJKrnm8uaH"},"source":["**Plot the data!**\n","1. Create a single blank figure. Set the `figsize` argument so it will take up the entire width of the page.\n","2. Then use `plt.plot()` or `ax.plot()` to make line plots of each of the three species' counts over time. In other words, the x-values should be datetimes from the index and the y-values should be daily salmon counts.\n","3. Choose the following colors for each line:\n","> * Chinook: 'forestgreen'\n",">\n","> * Coho: 'darkcyan'\n",">\n","> * Sockeye: 'salmon'\n",">\n","\n","\n","4. Label your plot axes and add a title.\n","5. Add a grid to your plot."]},{"cell_type":"code","metadata":{"id":"Ut1zDnxE9yNF","colab":{"base_uri":"https://localhost:8080/","height":284},"executionInfo":{"status":"ok","timestamp":1604626822531,"user_tz":480,"elapsed":499,"user":{"displayName":"Ethan C Campbell","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjCBYTiuomqOsCakND1k_5wj0kYvFY53Jt7kunt=s64","userId":"11255944928409084259"}},"outputId":"ae73cdd5-e8e0-4c61-fc50-ac10318bbfda"},"source":["# Plot the data here:\n","\n","plt.figure(figsize=(14,5))\n","# Alternative way of setting up a figure; then you'll call ax.plot()\n","# fig, ax = plt.subplots(figsize=(30,15))\n","\n","# You can save each to a variable...\n","# x_chinook = salmon_data['Chinook'].index\n","# y_chinook = salmon_data['Chinook']\n","# p_chinook = plt.plot(x_chinook,y_chinook,c='forestgreen')\n","\n","# ... or you can plot each in a single of code\n","plt.plot(salmon_data['Chinook'].index,salmon_data['Chinook']
,c='forestgreen')\n","plt.plot(salmon_data['Coho'].index,salmon_data['Coho']
,c='darkcyan')\n","plt.plot(salmon_data['Sockeye'].index,salmon_data['Sockeye']
,c='salmon')\n","\n","plt.xlabel('Years')\n","plt.ylabel('Daily salmon count')\n","plt.title('Salmon counts at Ballard Locks')\n","plt.grid()"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"tags":[],"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"AQnarvUKSxA3"},"source":["## **Breakout rooms, round 3**"]},{"cell_type":"markdown","metadata":{"id":"2qGdvYufAY__"},"source":["**Index into the data to discover information**\n","1. Use indexing to find out how many coho salmon passed through Ballard Locks on September 30, 2020, the day that Autumn Quarter started at UW. Hint: you'll need either `.iloc[]` or `.loc[]` to do this.\n","2. Use indexing with slicing (`:`) to get the sockeye salmon counts for all dates in the years specified below. You may wish to `print()` the results to check that they're correct.\n","> * First, do this for 2020. Save the result as a new variable, `sockeye_2020`.\n",">\n","> * Then, do the same for 2013. Save this as `sockeye_2013`.\n",">\n","3. Apply NumPy functions to `sockeye_2020` and `sockeye_2013` to find the following:\n","> * The highest daily sockeye count in each year (2013 and 2020).\n",">\n","> * The total number of sockeye that passed through Ballard Locks in each year.\n",">\n","4. Think about how you'd do Steps 2-3 in a single line of code — in other words, without saving the sliced Pandas objects as new variables.\n"]},{"cell_type":"code","metadata":{"id":"U1rdkWr2AYTy","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1604626910424,"user_tz":480,"elapsed":359,"user":{"displayName":"Ethan C Campbell","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjCBYTiuomqOsCakND1k_5wj0kYvFY53Jt7kunt=s64","userId":"11255944928409084259"}},"outputId":"fa834797-5ac3-44e4-eeef-f775497a317b"},"source":["# Part 1\n","salmon_data.loc[datetime(2020,9,30)]['Coho']\n","print('Number of coho on 9/30/20:',salmon_data.loc[datetime(2020,9,30)]['Coho'])\n","\n","# Alternative methods:\n","# print(salmon_data['Coho'].loc[datetime(2020,9,30)])\n","# print(salmon_data.loc['2020-09-30']['Coho'])\n","\n","# Part 2\n","sockeye_2020 = salmon_data['Sockeye'].loc[datetime(2020,1,1):datetime(2020,12,31)]\n","sockeye_2013 = salmon_data['Sockeye'].loc[datetime(2013,1,1):datetime(2013,12,31)]\n","\n","# Alternative methods:\n","# sockeye_2020 = salmon_data['Sockeye'].loc[datetime(2020,1,1):]\n","# sockeye_2013 = salmon_data['Sockeye'].loc['2013-1-1':'2013-12-31']\n","# sockeye_2013 = salmon_data['Sockeye'].loc['2013']\n","\n","# Part 3\n","print('Highest sockeye count in 2013:',sockeye_2013.max())\n","print('Highest sockeye count in 2020:',sockeye_2020.max())\n","print('Total sockeye in 2013:',sockeye_2013.sum())\n","print('Total sockeye in 2020:',sockeye_2020.sum())\n","\n","# Part 4\n","# Example of syntax:\n","salmon_data['Sockeye'].loc[datetime(2020,1,1):datetime(2020,12,31)].max()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Number of coho on 9/30/20: 13.0\n","Highest sockeye count in 2013: 12936.0\n","Highest sockeye count in 2020: 1961.0\n","Total sockeye in 2013: 178422.0\n","Total sockeye in 2020: 22954.0\n"],"name":"stdout"},{"output_type":"execute_result","data":{"text/plain":["1961.0"]},"metadata":{"tags":[]},"execution_count":6}]},{"cell_type":"markdown","metadata":{"id":"8d6J9xZiFtU2"},"source":["# Practice with `xarray`: World Ocean Atlas global ocean temperatures"]},{"cell_type":"code","metadata":{"id":"XR63HVK2Fsu1","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1604619659481,"user_tz":480,"elapsed":5307,"user":{"displayName":"Ethan C Campbell","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjCBYTiuomqOsCakND1k_5wj0kYvFY53Jt7kunt=s64","userId":"11255944928409084259"}},"outputId":"3828557c-11b1-4067-c1d7-b7088b54eee2"},"source":["# Import xarray and download netCDF4 library\n","import xarray as xr\n","!pip install netcdf4 # You can comment this out once it has run\n","\n","# Filepath for World Ocean Atlas 2018 (WOA18) temperature netCDF file\n","# Note: you may need to change this to match your own filepath\n","filepath = '/content/drive/My Drive/OCEAN 215 - Autumn \\'20/OCEAN 215 - Autumn \\'20 - Course documents/Zoom class slides and notebooks/2020-11-05 - class #10 - data/woa18_temp.nc'"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Collecting netcdf4\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/09/39/3687b2ba762a709cd97e48dfaf3ae36a78ae603ec3d1487f767ad58a7b2e/netCDF4-1.5.4-cp36-cp36m-manylinux1_x86_64.whl (4.3MB)\n","\u001b[K |████████████████████████████████| 4.3MB 4.5MB/s \n","\u001b[?25hCollecting cftime\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/81/f4/31cb9b65f462ea960bd334c5466313cb7b8af792f272546b68b7868fccd4/cftime-1.2.1-cp36-cp36m-manylinux1_x86_64.whl (287kB)\n","\u001b[K |████████████████████████████████| 296kB 46.3MB/s \n","\u001b[?25hRequirement already satisfied: numpy>=1.9 in /usr/local/lib/python3.6/dist-packages (from netcdf4) (1.18.5)\n","Installing collected packages: cftime, netcdf4\n","Successfully installed cftime-1.2.1 netcdf4-1.5.4\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2RgrRzzmS2lF"},"source":["## **Breakout rooms, round 4**"]},{"cell_type":"markdown","metadata":{"id":"mgowxnn4Jr0-"},"source":["0. Assign new roles:\n","> * **Choose a different person to write code and share their screen.**\n","> * **Choose a different person to take notes on the answers to report back to the class.**\n","1. Load the WOA18 netCDF file into xarray using `xr.open_dataset()`.\n","2. Display the data.\n","3. Using just the interactive display, answer the following questions with your group:\n","\n","* How many data variables are there?\n","* The variable abbreviations aren't very informative. Using the attributes button (page icon), can you tell what the variables represent?\n","* What is the time range of the data?\n","* What is the latitude and longitude resolution (spacing) of the data? Note that we call this the \"grid spacing\" or \"resolution\" of the data.\n","* What is the deepest depth level in the data?\n","* Take a peek at the 46 attributes. What is one thing you can learn from them?"]},{"cell_type":"code","metadata":{"id":"7r4RNUVAJr0_"},"source":["# Load the data file from Google Drive as an xarray Dataset\n","\n","\n","# View data and stats\n","\n"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"QP5nPdjQS4fV"},"source":["## **Breakout rooms, round 5**"]},{"cell_type":"markdown","metadata":{"id":"iF62lvBHNQn2"},"source":["![Image](https://www.mapsofworld.com/images/map-of-world-oceans.jpg)\n","\n","1. Use the ocean map to find the longitude (in units of °N) and latitude (in units of °E) of your favorite part of the global oceans.\n","2. Use indexing to find out the most recent ocean surface temperature (in 2011) at that location. Hint: you'll need either `.isel()` or `.sel()` to do this.\n","3. Convert this result from `xarray` format to a single float number."]},{"cell_type":"code","metadata":{"id":"vDQK3HYuJpOe"},"source":["# Write code here:\n","\n"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"46ZS5QgBS7wv"},"source":["## **Breakout rooms, round 6**"]},{"cell_type":"markdown","metadata":{"id":"muw9gRBaO4hZ"},"source":["1. Use indexing to get a time series of ocean surface temperature at the location you choose earlier. Save this as a new variable, `time_series`. (In other words, select in latitude, longitude, and depth, leaving a single dimension: time.)\n","2. Use indexing to get a depth profile of ocean temperature at the location you choose earlier in 2011. Save this as a new variable, `depth_profile`. (In other words, select in latitude, longitude, and time, leaving a single dimension: depth.)\n","3. Take a peek into these new variables using `display()`. How would you convert these from `xarray` format to 1-D NumPy arrays?"]},{"cell_type":"code","metadata":{"id":"ZjDw5qBLO3i5"},"source":["# Write code here:\n","\n"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"II3iXc9lS-Xb"},"source":["## **Breakout rooms, round 7**"]},{"cell_type":"markdown","metadata":{"id":"T-9fo04ZRGHj"},"source":["1. Apply a NumPy function to `time_series` to calculate the average temperature at your chosen location over time. Get the answer as a single float number, not an `xarray` object.\n","\n","2. Create a new blank Matplotlib figure with two subplots, side-by-side. Use `ax.plot()` to make a line plot on each subplot:\n","> * On the left subplot, plot the time series (time vs. temperature).\n",">\n","> * On the right subplot, plot the depth profile (temperature vs. depth). Reverse the depth axis using `ax.invert_yaxis()`.\n",">\n","> * Label your axes and add a grid.\n","\n"]},{"cell_type":"code","metadata":{"id":"TyUljlReP5U3"},"source":["# Part 1:\n","\n","\n","# Part 2:\n","\n"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"zsWD2olqQceF"},"source":[""],"execution_count":null,"outputs":[]}]}