Copy disabled (too large)
Download .txt
Showing preview only (11,177K chars total). Download the full file to get everything.
Repository: earth-env-data-science/earth-env-data-science-book
Branch: master
Commit: c279e1b1b74a
Files: 49
Total size: 10.7 MB
Directory structure:
gitextract_bf1j6390/
├── .github/
│ └── workflows/
│ └── deploy.yml
├── .gitignore
├── README.md
├── binder/
│ └── Dockerfile
├── final_projects/
│ └── final_project_list.py
├── requirements.txt
├── scripts/
│ ├── clean.py
│ └── templates/
│ └── jekyllmd.tpl
└── src/
├── LICENSE.md
├── _config.yml
├── _toc.yml
├── assignments/
│ ├── basic_pandas.ipynb
│ ├── basic_xarray.ipynb
│ ├── cartopy.ipynb
│ ├── cmip.ipynb
│ ├── files_markdown_git.md
│ ├── more_matplotlib.ipynb
│ ├── more_xarray.ipynb
│ ├── numpy_matplotlib.ipynb
│ ├── pandas_groupby.ipynb
│ └── python_basics_and_functions.ipynb
├── intro.md
├── lectures/
│ ├── basic_scipy/
│ │ ├── more_matplotlib.ipynb
│ │ └── numpy_and_matplotlib.ipynb
│ ├── core_python/
│ │ ├── functions_classes.ipynb
│ │ ├── organization_and_packaging.ipynb
│ │ └── python_fundamentals.ipynb
│ ├── dask/
│ │ ├── dask_arrays.ipynb
│ │ └── intro.md
│ ├── data.ipynb
│ ├── environment/
│ │ ├── binder.ipynb
│ │ ├── intro_to_git.md
│ │ ├── intro_to_jupyterlab.md
│ │ ├── intro_to_unix.md
│ │ └── python_environments.md
│ ├── introduction.md
│ ├── mapping_cartopy.ipynb
│ ├── models/
│ │ ├── cmip.ipynb
│ │ ├── intro_models.ipynb
│ │ ├── regridding.ipynb
│ │ └── xgcm.ipynb
│ ├── pandas/
│ │ ├── basic_pandas.ipynb
│ │ ├── pandas_groupby.ipynb
│ │ └── pandas_intro.md
│ └── xarray/
│ ├── xarray-part2.ipynb
│ ├── xarray.ipynb
│ ├── xarray_intro.md
│ └── xarray_tips_and_tricks.ipynb
└── projects.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/workflows/deploy.yml
================================================
name: deploy-book
# Trigger the workflow on push to main branch and PRs
on:
push:
branches:
- master
pull_request:
branches:
- master
# This job installs dependencies, builds the book, and deploys the html
jobs:
build-and-deploy-book:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest]
python-version: [3.8]
steps:
- uses: actions/checkout@v2
# Install dependencies
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v1
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
pip install -r requirements.txt
# Build the book
- name: Build the book
run: |
jupyter-book build src
# Deploy the book's html to earth-env-data-science.github.io
- name: GitHub Pages action
if: github.ref == 'refs/heads/master'
uses: peaceiris/actions-gh-pages@v3
with:
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
external_repository: earth-env-data-science/earth-env-data-science.github.io
publish_branch: master
publish_dir: src/_build/html
full_commit_message: "GitHub action book deploy"
================================================
FILE: .gitignore
================================================
*~
._*
*.lock
*.DS_Store
*.swp
*.out
*.py[cod]
*.pid
*.ipynb_checkpoints
_build
secrets/
================================================
FILE: README.md
================================================
# Earth and Environmental Data Science Book
[](https://binder.pangeo.io/v2/gh/earth-env-data-science/earth-env-data-science-book/master)
This is the source repository for <https://earth-env-data-science.github.io>.
To deploy changes to the site, push to the master branch of this repo.
================================================
FILE: binder/Dockerfile
================================================
FROM pangeo/pangeo-notebook:2020.11.18
================================================
FILE: final_projects/final_project_list.py
================================================
import pandas as pd
url = 'https://docs.google.com/spreadsheets/d/e/2PACX-1vQZuGOVK_afpqjadVaI9wd29iXRC78Ofvp-hL3IQV7SbJN11LIW0SbcRtjhpdreHjqh6Efhh8UMlkqH/pub?gid=1496620424&single=true&output=csv'
df = pd.read_csv(url)
df
for idx, row in df.iterrows():
repo = row['repo']
repo_base = repo.replace('https://github.com/', '')
github_badge = f'[]({repo})'
binder_badge = f'[]({row.binder})' if row.binder else ''
name = row['name']
print(f'- _{row.title.strip()}_ by {name}\n {github_badge} {binder_badge}')
================================================
FILE: requirements.txt
================================================
jupyter-book==0.13.1
sphinxext-opengraph
================================================
FILE: scripts/clean.py
================================================
"""A helper script to "clean up" all of your generated markdown and HTML files."""
import shutil as sh
import os.path as op
path_root = op.join(op.dirname(op.abspath(__file__)), '..')
paths = [op.join(path_root, '_site'),
op.join(path_root, '_build')]
for path in paths:
print('Removing {}...'.format(path))
sh.rmtree(path, ignore_errors=True)
print('Done!')
================================================
FILE: scripts/templates/jekyllmd.tpl
================================================
{%- extends 'markdown.tpl' -%}
<!-- All code cells -->
{%- block codecell %}
{% if 'remove_cell' not in cell.metadata.tags and 'removecell' not in cell.metadata.tags %}
<div markdown="1" class="cell code_cell">
{{- super() }}
</div>
{% endif %}
{% endblock codecell %}
<!-- Add class for input area -->
{% block input %}
{%- if 'remove_input' not in cell.metadata.tags %}
{%- if cell.source != '' -%}
<div class="input_area{% if 'hide_input' in cell.metadata.tags or 'hidecode' in cell.metadata.tags %} hidecode{% endif %}" markdown="1">
```
{%- if 'magics_language' in cell.metadata -%}
{{ cell.metadata.magics_language}}
{%- elif 'name' in nb.metadata.get('language_info', {}) -%}
{{ nb.metadata.language_info.name }}
{% endif %}
{{- cell.source }}
{% endif %}
```
</div>
{%- endif %}
{% endblock input %}
<!-- All output areas -->
{% block output %}
<div class="output_wrapper" markdown="1">
<div class="output_subarea{% if 'interactive' in cell.metadata.tags %} output_widget_view{% endif %}" markdown="1">
{{- super() -}}
</div>
</div>
{%- endblock output %}
<!-- Remove indentations for output text -->
{%- block stream %}
{:.output_stream}
```
{{ output.text -}}
```
{% endblock stream %}
{% block data_text -%}
{:.output_data_text}
```
{{ output.data['text/plain'] }}
```
{% endblock data_text %}
{%- block error %}
{:.output_traceback_line}
```
{{- super() }}
```
{% endblock error %}
{%- block data_html %}
<div markdown="0" class="output output_html">
{{ output.data['text/html'] }}
</div>
{% endblock data_html %}
{%- block data_png %}
{:.output_png}
{{- super() -}}
{% endblock data_png %}
<!-- Markdown cells -->
{% block markdowncell %}
{% if 'remove_cell' not in cell.metadata.tags and 'removecell' not in cell.metadata.tags %}
{{- super() }}
{% endif %}
{%- endblock markdowncell %}
================================================
FILE: src/LICENSE.md
================================================
# License for this book
All content in this book (ie, any files and content in the `content/` folder)
is licensed under the [Creative Commons Attribution-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-sa/4.0/)
(CC BY-SA 4.0) license.
================================================
FILE: src/_config.yml
================================================
title: Earth and Environmental Data Science
author: Ryan Abernathey
copyright: 2016-2021
logo: eeds-logo.png
exclude_patterns: [_build, Thumbs.db, .DS_Store, "**.ipynb_checkpoints"]
only_build_toc_files: true
execute:
execute_notebooks: 'off'
# Information about where the book exists on the web
repository:
url: https://github.com/earth-env-data-science/earth-env-data-science-book
path_to_book: src
branch: master
# Launch button settings
launch_buttons:
notebook_interface: jupyterlab # The interface interactive links will activate ["classic", "jupyterlab"]
binderhub_url: "" # The URL of the BinderHub (e.g., https://mybinder.org)
jupyterhub_url: "https://https://us-central1-b.gcp.pangeo.io/"
# HTML-specific settings
html:
favicon : "" # A path to a favicon image
use_edit_page_button : true # Whether to add an "edit this page" button to pages. If `true`, repository information in repository: must be filled in
use_repository_button : true # Whether to add a link to your repository button
use_issues_button : true # Whether to add an "open an issue" button
use_multitoc_numbering : true # Continuous numbering across parts/chapters
extra_navbar : Powered by <a href="https://jupyterbook.org">Jupyter Book</a> # Will be displayed underneath the left navbar.
extra_footer : "" # Will be displayed underneath the footer.
google_analytics_id : "" # A GA id that can be used to track book views.
home_page_in_navbar : true # Whether to include your home page in the left Navigation Bar
baseurl : "https://earth-env-data-science.github.io" # The base URL where your book will be hosted. Used for creating image previews and social links. e.g.: https://mypage.com/mybook/
comments:
hypothesis : false
utterances : false
sphinx:
extra_extensions:
- sphinxext.opengraph
config:
ogp_site_url: "https://earth-env-data-science.github.io/"
ogp_image: "https://earth-env-data-science.github.io/_static/eeds-logo.png"
ogp_description_length: 200
ogp_use_first_image: true
================================================
FILE: src/_toc.yml
================================================
format: jb-book
root: intro
parts:
- caption: About this Book
chapters:
- file: LICENSE
- file: projects
- caption: The Interactive Computing Environment
chapters:
- file: lectures/environment/intro_to_jupyterlab
- file: lectures/environment/intro_to_unix
- file: lectures/environment/intro_to_git
- file: assignments/files_markdown_git
- file: lectures/environment/python_environments
- file: lectures/environment/binder
- file: lectures/data
- caption: The Core Python Language
chapters:
- file: lectures/core_python/python_fundamentals
- file: lectures/core_python/functions_classes
- file: lectures/core_python/organization_and_packaging
- file: assignments/python_basics_and_functions
- caption: Scientific Python Fundamentals
chapters:
- file: lectures/basic_scipy/numpy_and_matplotlib
- file: assignments/numpy_matplotlib
- file: lectures/basic_scipy/more_matplotlib
- file: assignments/more_matplotlib
- caption: High Level Data Analysis Frameworks
chapters:
- file: lectures/pandas/pandas_intro
sections:
- file: lectures/pandas/basic_pandas
- file: assignments/basic_pandas
- file: lectures/pandas/pandas_groupby
- file: assignments/pandas_groupby
- file: lectures/xarray/xarray_intro
sections:
- file: lectures/xarray/xarray
- file: assignments/basic_xarray
- file: lectures/xarray/xarray-part2
- file: assignments/more_xarray
- file: lectures/xarray/xarray_tips_and_tricks
- caption: Geoscience Package
chapters:
- file: lectures/mapping_cartopy
- file: assignments/cartopy
- caption: Climate Model Data
chapters:
- file: lectures/models/intro_models
- file: lectures/models/cmip
- file: assignments/cmip
- file: lectures/models/regridding
- file: lectures/models/xgcm
- caption: Big Data
chapters:
- file: lectures/dask/intro
- file: lectures/dask/dask_arrays
================================================
FILE: src/assignments/basic_pandas.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Assignment: Pandas Fundamentals with Earthquake Data\n",
"\n",
"In this assignment, we will review pandas fundamentals, such as how to\n",
"\n",
"- Open csv files\n",
"- Manipulate dataframe indexes\n",
"- Parse date columns\n",
"- Examine basic dataframe statistics\n",
"- Manipulate text columns and extract values\n",
"- Plot dataframe contents using\n",
" - Bar charts\n",
" - Histograms\n",
" - Scatter plots"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, import Numpy, Pandas and Matplotlib and set the display options."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Data for this assignment in .csv format downloaded from the [USGS Earthquakes Database](https://earthquake.usgs.gov/earthquakes/search/) is available at:\n",
"\n",
"http://www.ldeo.columbia.edu/~rpa/usgs_earthquakes_2014.csv\n",
"\n",
"You don't need to download this file. You can open it directly with Pandas."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1) Use Pandas' read_csv function directly on this URL to open it as a DataFrame\n",
"(Don't use any special options). Display the first few rows and the DataFrame info."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You should have seen that the dates were not automatically parsed into datetime types.\n",
"\n",
"### 2) Re-read the data in such a way that all date columns are identified as dates and the earthquake ID is used as the index\n",
"\n",
"Verify that this worked using the `head` and `info` functions.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3) Use `describe` to get the basic statistics of all the columns\n",
"\n",
"Note the highest and lowest magnitude of earthquakes in the databse."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4) Use `nlargest` to get the top 20 earthquakes by magnitude\n",
"\n",
"https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.nlargest.html"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Examine the structure of the `place` column. The state / country information seems to be in there. How would you get it out?\n",
"\n",
"### 5) Extract the state or country using Pandas [text data functions](https://pandas.pydata.org/pandas-docs/stable/text.html)\n",
"\n",
"Add it as a new column to the dataframe called `country`. Note that some of the \"countries\" are actually U.S. states."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 6) Display each unique value from the new column\n",
"\n",
"https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.unique.html"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 7) Create a filtered dataset that only has earthquakes of magnitude 4 or larger and"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### 8) Using the filtered dataset (magnitude > 4), count the number of earthquakes in each country/state. Make a bar chart of this number for the top 5 locations with the most earthquakes\n",
"\n",
"Location name on the x axis, Earthquake count on the y axis"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 9) Make a histogram the distribution of the Earthquake magnitudes\n",
"\n",
"https://pandas.pydata.org/pandas-docs/version/0.23/generated/pandas.DataFrame.hist.html\n",
"https://matplotlib.org/api/_as_gen/matplotlib.pyplot.hist.html\n",
"\n",
"Do one subplot for the filtered and one for the unfiltered dataset.\n",
"Use a Logarithmic scale. What sort of relationship do you see?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 11) Visualize the locations of earthquakes by making a scatterplot of their latitude and longitude\n",
"\n",
"Use a two-column subplot with both the filtered and unfiltered datasets. Color the points by magnitude. Make it pretty\n",
"\n",
"What difference do you note between the filtered and unfiltered datasets?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.8.12"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
================================================
FILE: src/assignments/basic_xarray.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Assignment: Xarray Fundamentals with Atmospheric Radiation Data\n",
"\n",
"In this assignment, we will use Xarray to analyze top-of-atmosphere radiation data from [NASA's CERES project](https://ceres.larc.nasa.gov/).\n",
"\n",
"<img src=\"https://upload.wikimedia.org/wikipedia/commons/b/bb/The-NASA-Earth%27s-Energy-Budget-Poster-Radiant-Energy-System-satellite-infrared-radiation-fluxes.jpg\" width=65%>\n",
"\n",
"_Public domain, by NASA, from Wikimedia Commons_\n",
"\n",
"\n",
"A pre-downloaded and subsetted a portion of the CERES dataset is available here: http://ldeo.columbia.edu/~rpa/CERES_EBAF-TOA_Edition4.0_200003-201701.condensed.nc. The size of the data file is 702.53 MB. It may take a few minutes to download.\n",
"\n",
"Please review the CERES [FAQs](https://ceres.larc.nasa.gov/resources/faqs) before getting started.\n",
"\n",
"Start by importing Numpy, Matplotlib, and Xarray. Set the default figure size to (12, 6)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import xarray as xr\n",
"import numpy as np\n",
"from matplotlib import pyplot as plt\n",
"plt.rcParams['figure.figsize'] = (12, 6)\n",
"%config InlineBackend.figure_format = 'retina'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, download the NetCDF file using pooch."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pooch\n",
"fname = pooch.retrieve(\n",
" 'http://ldeo.columbia.edu/~rpa/CERES_EBAF-TOA_Edition4.0_200003-201701.condensed.nc',\n",
" known_hash='a876cc7106e7dcb1344fbec5dcd7510e5cd947e62049a8cbc188ad05ffe00345'\n",
")\n",
"print(fname)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1) Opening data and examining metadata"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### 1.1) Open the dataset and display its contents \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.2) Print out the `long_name` attribute of each variable\n",
"Print `variable`: `long name` for each variable. Format the output so that the start of the `long name` attributes are aligned. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2) Basic reductions, arithmetic, and plotting"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### 2.1) Calculate the time-mean of the entire dataset"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.2) From this, make a 2D plot of the the time-mean Top of Atmosphere (TOA) Longwave, Shortwave, and Incoming Solar Radiation\n",
"(Use \"All-Sky\" conditions)\n",
"\n",
"Note the sign conventions on each variable."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.3) Add up the three variables above and verify (visually) that they are equivalent to the TOA net flux\n",
"\n",
"You have to pay attention to and think carefully about the sign conventions (positive or negative) for each variable in order for the variables to sum to the right TOA net flux. Refer to the NASA figure at the top of the page to understand incoming and outgoing radiation."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3) Mean and weighted mean\n",
"\n",
"### 3.1) Calculate the global (unweighted) mean of TOA net radiation\n",
"\n",
"Since the Earth is approximately in radiative balance, the net TOA radiation should be zero. But taking the naive mean from this dataset, you should find a number far from zero. Why?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The answer is that each \"pixel\" or \"grid point\" of this dataset does not represent an equal area of Earth's surface. So naively taking the mean, i.e. giving equal weight to each point, gives the wrong answer.\n",
"\n",
"On a lat / lon grid, the relative area of each grid point is proportional to $\\cos(\\lambda)$. ($\\lambda$ is latitude)\n",
"\n",
"### 3.2) Create a `weight` array proportional to $\\cos(\\lambda)$\n",
"\n",
"Think carefully a about radians vs. degrees\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.3) Redo your global mean TOA net radiation calculation with this weight factor\n",
"\n",
"Use xarray's [weighted array reductions](http://xarray.pydata.org/en/stable/user-guide/computation.html#weighted-array-reductions) to compute the weighted mean."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This time around, you should have found something much closer to zero. Ask a climate scientist what the net energy imbalance of Earth due to global warming is estimated to be. Do you think our calculation is precise enough to detect this? \n",
"\n",
"### 3.4) Now that you have a `weight` factor, verify that the TOA incoming solar, outgoing longwave, and outgoing shortwave approximately match up with infographic shown in the first cell of this assignment"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4) Meridional Heat Transport Calculation\n",
"\n",
"We can go beyond a weight factor and actually calculate the area of each pixel of the dataset, using the formula\n",
"\n",
"$$ dA = R^2 \\cos(\\lambda) d\\lambda d \\varphi $$\n",
"\n",
"where $d\\lambda$ and $d\\varphi$ are the spacing of the points in latitude and longitude (measured in radians). We can approximate Earth's radius as $R = 6,371$ km.\n",
"\n",
"### 4.1) calculate the pixel area using this formula and create a 2D (lon, lat) DataArray for it\n",
"\n",
"(Xarray's `ones_like` function can help you easily create and broadcast DataArrays.) Verify that the sum of all the pixels equals the Earth's true surface area as evaluated using the formula for the area of a sphere (yes, the Earth is not a sphere ... it's just a homework problem)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"\n",
"### 4.2) Calculate and plot the total amount of net radiation in each 1-degree latitude band\n",
"Multiplying the pixel area (m$^2$) from above with the radiative flux (W m$^{-2}$) gives you the total amount of radiation absorbed in each pixel in W.\n",
"\n",
"Label with correct units."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.3) Plot the cumulative sum of the total amount of net radiation as a function of latitude\n",
"\n",
"Label with correct units. (Hint: check out xarray's [cumsum](http://xarray.pydata.org/en/stable/generated/xarray.DataArray.cumsum.html) function.)\n",
"\n",
"This curve tells you how much energy must be transported meridionally by the ocean and atmosphere in order to account for the radiative imbalance at the top of the atmosphere."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You should get a curve that looks something like this: https://journals.ametsoc.org/view/journals/clim/14/16/full-i1520-0442-14-16-3433-f07.gif (Figure from Trenberth & Caron, 2001)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5) Selecting and Merging Data\n",
"\n",
"For the next problem, use the following approximate locations of four different cities.\n",
"\n",
"| city | lon | lat |\n",
"| -- | -- | -- |\n",
"| NYC |74 W | 40 N | \n",
"| Nome, Alaska | 165 W | 64 N | \n",
"| Columbo, Sri Lanka | 80 E | 7 N |\n",
"| Hobart, Tasmania | 147 E | 43 S |\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 5.1) Create a `Dataset` for each point from the global dataset\n",
"Each city should get its own `Dataset` with the same variables as the one you imported. Find the nearest associated incoming solar radiation and net radiation timeseries at each city."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 5.2) Merge these four datasets into a new dataset with the new dimension `city`\n",
"\n",
"Create a new dimension coordinate to hold the city name.\n",
"Display the merged dataset."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 5.3) Plot the incoming solar and net radiation at each city\n",
"\n",
"Make two separate plots.\n",
"Try to have your legend created automatically from the data."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.9.13"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
================================================
FILE: src/assignments/cartopy.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Assignment: Making Maps with Cartopy\n",
"\n",
"### 1) Plot data from NARR\n",
"\n",
"NARR is NCEP's [North American Regional Reanalysis](https://www.esrl.noaa.gov/psd/data/gridded/data.narr.html), a widely used product for studying the weather and climate of the continental US. The data is available from NOAA's [Earth System Research Laboratory](https://www.esrl.noaa.gov/) via [OPeNDAP](https://en.wikipedia.org/wiki/OPeNDAP), meaing that xarray can open the data \"remotely\" without downloading a file.\n",
"\n",
"For this problem, you should open this geopential height file:\n",
"\n",
" https://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/NARR/Dailies/pressure/hgt.201810.nc\n",
" \n",
"And this precipitation file:\n",
"\n",
" https://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/NARR/Dailies/monolevel/apcp.2018.nc\n",
" \n",
"Your goal is to make a map that looks like the one below. It shows total precipitation on Oct. 15, 2018 in blue, plus contours of the 500 mb geopotential surface.\n",
"\n",
"_Hint: examine the dataset variables and attirbutes carefully in order to determine the projection of the data._\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2) Antarctic Sea Ice\n",
"\n",
"Download this file and then use it to plot the concentration of Antarctic Sea Ice on Aug. 7, 2017. Again, you will need to explore the file contents in order to determine the correct projection.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import xarray as xr\n",
"import pooch\n",
"url = 'https://polarwatch.noaa.gov/erddap/files/nsidcCDRiceSQsh1day/2017/seaice_conc_daily_sh_f17_20170807_v03r01.nc'\n",
"fname = pooch.retrieve(url, known_hash='19b74e7e97f1c0786da0c674c4d5e4af0da5b32e2fe8c66a8f1a8a9a1241e73c')\n",
"ds_ice = xr.open_dataset(fname, drop_variables='melt_onset_day_seaice_conc_cdr')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3) Global USGS Earthquakes\n",
"\n",
"Reload the file we explored in homework 5 using pandas\n",
"\n",
" http://www.ldeo.columbia.edu/~rpa/usgs_earthquakes_2014.csv\n",
" \n",
"and use the data to recreate this map."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
}
],
"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.9.13"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
================================================
FILE: src/assignments/cmip.ipynb
================================================
{
"cells": [
{
"attachments": {
"8fffbb48-ab88-4728-9e14-56cf8ccb51b7.png": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAsQAAABNCAYAAAChdXK6AAAKrGlDQ1BJQ0MgUHJvZmlsZQAASImVlwdUk8kWgOf/0xsQEiKd0DvSCSAl9FAE6WAjJCEJJcZAELEjiyu4FlREsKzoKkXBCshaEFEsLIq9b5BFQF0XCzZU3g8cgrvvvPfOu3Mm9zv3v3PvnTkz59wAQNHkSqWZsBoAWZIcWXSwHzMxKZmJ6wcQMqiAAACXly1lR0WFA0Qm9d/l/R3EF5GbtmOx/v37fxUqX5DNAwCKQjiVn83LQvg4Mt/wpLIcAFDViN14UY50jDsRpsuQAhFWjLFwgt+Nceo4o/HjPrHR/gjrAoAnc7kyIQBkC8TOzOUJkTjkEITtJXyxBOE8hL2zshbwEW5G2ALxkSI8Fp+V+l0c4d9ipipjcrlCJU/sZVzwAeJsaSZ38f95HP9bsjLlkznMkEkWyUKiEa2NnNm9jAVhSpakzoycZDF/3H+cRfKQuEnmZfsnTzKfGxCmXJs5M3yS08RBHGWcHE7sJAuyA2MmWbYgWpkrTebPnmSubCqvPCNOaRcJOMr4+aLYhEnOFcfPnOTsjJiwKR9/pV0mj1bWL5AE+03lDVLuPSv7u/2KOcq1OaLYEOXeuVP1CyTsqZjZicra+IKAwCmfOKW/NMdPmUuaGaX0F2QGK+3ZuTHKtTnIhZxaG6U8w3RuaNQkgwAQCMKRwQQxwAk4A0dkBIAEEAxAjiAvZ2xD/guki2VioSiHyUZemoDJkfDsbJiO9o5OAIy924lr8fbe+HuEGPgpW1EVAF5U5P5WT9nCkZqO2AKgFj1lM36KPMk2AM448uSy3AkbeuwHA4hAFdCBFtAHxsAC2CLVuQJP4ItUHQoiQSxIAvMAD4hAFpCBRWApWAWKQAnYCLaCCrAb7AXV4BA4CprAKXAOXARXwXVwGzwECtAHXoAh8B6MQBCEgygQDdKCDCBTyBpyhFiQNxQIhUPRUBKUAgkhCSSHlkKroRKoFKqA9kA10BHoJHQOugx1Q/ehHmgQegN9hlEwGabDerAZPB1mwWw4DI6F58JCeCGcDxfC6+FyuAo+CDfC5+Cr8G1YAb+Ah1EARUIxUIYoWxQL5Y+KRCWj0lAy1HJUMaoMVYWqR7WgOlA3UQrUS9QnNBZNQzPRtmhPdAg6Ds1DL0QvR69DV6Cr0Y3odvRNdA96CP0NQ8HoYqwxHhgOJhEjxCzCFGHKMPsxJzAXMLcxfZj3WCyWgTXHumFDsEnYdOwS7DrsTmwDthXbje3FDuNwOC2cNc4LF4nj4nJwRbjtuIO4s7gbuD7cRzwJb4B3xAfhk/ESfAG+DF+LP4O/ge/HjxDUCKYED0IkgU9YTNhA2EdoIVwj9BFGiFSiOdGLGEtMJ64ilhPriReIj4hvSSSSEcmdNIskJq0klZMOky6RekifyOpkK7I/eQ5ZTl5PPkBuJd8nv6VQKGYUX0oyJYeynlJDOU95QvmoQlOxU+Go8FVWqFSqNKrcUHmlSlA1VWWrzlPNVy1TPaZ6TfWlGkHNTM1fjau2XK1S7aTaXbVhKo3qQI2kZlHXUWupl6kD6jh1M/VAdb56ofpe9fPqvTQUzZjmT+PRVtP20S7Q+uhYujmdQ0+nl9AP0bvoQxrqGs4a8Rp5GpUapzUUDBTDjMFhZDI2MI4y7jA+T9Obxp4mmLZ2Wv20G9M+aOpo+moKNIs1GzRva37WYmoFamVobdJq0nqsjda20p6lvUh7l/YF7Zc6dB1PHZ5Osc5RnQe6sK6VbrTuEt29up26w3r6esF6Ur3teuf1Xuoz9H310/W36J/RHzSgGXgbiA22GJw1eM7UYLKZmcxyZjtzyFDXMMRQbrjHsMtwxMjcKM6owKjB6LEx0ZhlnGa8xbjNeMjEwCTCZKlJnckDU4Ipy1Rkus20w/SDmblZgtkasyazAXNNc455vnmd+SMLioWPxUKLKotbllhLlmWG5U7L61awlYuVyKrS6po1bO1qLbbead1tg7Fxt5HYVNnctSXbsm1zbetse+wYduF2BXZNdq+mm0xPnr5pesf0b/Yu9pn2++wfOqg7hDoUOLQ4vHG0cuQ5VjrecqI4BTmtcGp2eu1s7Sxw3uV8z4XmEuGyxqXN5aurm6vMtd510M3ELcVth9tdFp0VxVrHuuSOcfdzX+F+yv2Th6tHjsdRj788bT0zPGs9B2aYzxDM2Dej18vIi+u1x0vhzfRO8f7ZW+Fj6MP1qfJ56mvsy/fd79vPtmSnsw+yX/nZ+8n8Tvh98PfwX+bfGoAKCA4oDugKVA+MC6wIfBJkFCQMqgsaCnYJXhLcGoIJCQvZFHKXo8fhcWo4Q6FuoctC28PIYTFhFWFPw63CZeEtEXBEaMTmiEczTWdKZjZFgkhO5ObIx1HmUQujfp2FnRU1q3LWs2iH6KXRHTG0mPkxtTHvY/1iN8Q+jLOIk8e1xavGz4mvif+QEJBQmqBInJ64LPFqknaSOKk5GZccn7w/eXh24Oyts/vmuMwpmnNnrvncvLmX52nPy5x3er7qfO78YymYlISU2pQv3EhuFXc4lZO6I3WI58/bxnvB9+Vv4Q8KvASlgv40r7TStAGhl3CzcFDkIyoTvRT7iyvEr9ND0nenf8iIzDiQMZqZkNmQhc9KyTopUZdkSNoX6C/IW9AttZYWSRULPRZuXTgkC5Ptz4ay52Y359CRBqlTbiH/Qd6T651bmftxUfyiY3nUPEle52KrxWsX9+cH5f+yBL2Et6RtqeHSVUt7lrGX7VkOLU9d3rbCeEXhir6VwSurVxFXZaz6rcC+oLTg3eqE1S2FeoUrC3t/CP6hrkilSFZ0d43nmt0/on8U/9i11mnt9rXfivnFV0rsS8pKvqzjrbvyk8NP5T+Nrk9b37XBdcOujdiNko13Nvlsqi6lluaX9m6O2Ny4hbmleMu7rfO3Xi5zLtu9jbhNvk1RHl7evN1k+8btXypEFbcr/SobdujuWLvjw07+zhu7fHfV79bbXbL788/in+/tCd7TWGVWVbYXuzd377N98fs6fmH9UrNfe3/J/q8HJAcU1dHV7TVuNTW1urUb6uA6ed3gwTkHrx8KONRcb1u/p4HRUHIYHJYffn4k5cido2FH246xjtUfNz2+4wTtRHEj1Li4cahJ1KRoTmruPhl6sq3Fs+XEr3a/HjhleKrytMbpDWeIZwrPjJ7NPzvcKm19eU54rrdtftvD84nnb7XPau+6EHbh0sWgi+c72B1nL3ldOnXZ4/LJK6wrTVddrzZ2unSe+M3ltxNdrl2N19yuNV93v97SPaP7zA2fG+duBty8eItz6+rtmbe778TduXd3zl3FPf69gfuZ918/yH0w8nDlI8yj4sdqj8ue6D6p+t3y9waFq+J0T0BP59OYpw97eb0v/sj+40tf4TPKs7J+g/6aAceBU4NBg9efz37e90L6YuRl0Z/UP3e8snh1/C/fvzqHEof6Xstej75Z91br7YF3zu/ahqOGn7zPej/yofij1sfqT6xPHZ8TPvePLPqC+1L+1fJry7ewb49Gs0ZHpVwZd7wVQCETTksD4M0BAChJANCuA0CcPdFXjws08V9gnMB/4onee1xcAahFVIQv0t2sRBjRJq1IT4LMKIRjfQHs5KSckz3weL8+JmoHAei2sXeKjn9iUwP+KRO9/Hd1/1MDZdS/6X8BK2AFsqY8awEAAABWZVhJZk1NACoAAAAIAAGHaQAEAAAAAQAAABoAAAAAAAOShgAHAAAAEgAAAESgAgAEAAAAAQAAAsSgAwAEAAAAAQAAAE0AAAAAQVNDSUkAAABTY3JlZW5zaG90aA5AiAAAAdVpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDYuMC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+Nzc8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+NzA4PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6VXNlckNvbW1lbnQ+U2NyZWVuc2hvdDwvZXhpZjpVc2VyQ29tbWVudD4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+ChtgewkAAEAASURBVHgB7F0FwFbF0p4PpATEpAzKAAMVAxEVuxUTMFBRsa9d99piXrtQVEARAwuwRUQBCTEoBelukEby2/95Zs/sOed930+se3+vnoXv7O7s7Mzu7GzHW+RgpIAhsCgJB8ABYDDGKoo8HjcRw5xqO3GIZfE8SUNIMki78zAAyPhn8jc9yvQvq39Z+5NsTRMtpjnVztrfrP/J+l/rN5I1Jj3iSPusCgUoANn4468//ihlBc5mM2mKcsfJ0KiUUhXF+B6eCLUwtROV0aJQs9QYAMqW8U+KXzL5x7qhgoHKmNZ4fxzu4YnQTP+8LmX1D3LI2p9QM6zKZO2vrx+JPifrf0w5rOlI+9n4Bj0iirWxdGqURKiFZe2PSidIxkSa1T/VGI76zPxZ6l+RK8bIN5SYTx6TaSAuIBdFSzFJuGXE7LywHECOV6MprEBAEpTxz+Sf6Z+vjcl6YfXO7LywHECON6t/kIDKpIBgkqCs/cnan6z9ydofNpjJdkEb0MQnLywHkOPVmAorEJAEZe3Pf7f9KRVGvqGI4sEwVcAaA3UnFCCBrk4bQHu1wVcBKFqWLkwcDk+0+qywdEAObsY/k78pCHRBtSPxiXSLkDjMAzP9o1Sy+pe1P9SDZP2AJ2t/Y5nEDQcFE8PVlfU/Wf9jCpL1PyYJrRr8/AX7X+zMq0kNfH2Go+wz09HWh+XfBKNBKpU0xMdPfDUiPnboLxFEZ3IWFEs5469iUiHHkiYsLW0fpripsvAQ/RKFYZn8E0KJnZn+pTt+L5ms/qkctHr5OqbVCMCs/nkNiaWSlogPTXxVcPhk7U9CKLEza3+y9ic58fCakbW/KgdtZOKWhrB0a+PDvMySbg/RL8G/cPyjA2I/joqZ2hGgwDlBuySn8kSgJjblyY+RF6ys9RMnhdEs5/kk8iApmilPHqryIDSQz/hDGJn8qRFBFVIKkq9DuZCUyqU8uZh5Uz4PyOQPQWXyz/QvaopYbUIDnV+HciGpKpfy5GJm9S9PPEHpsvoXREG1yfQvv/KUAEnpVMqTHyEvOAj9/1//SmnitOB96WuS6FQvQ6Pkp62QSw/22wmpgbQn5/GAlDw0TR4+OIKqx0My/hAWRaHioHS9hHOsTP6RBLx0Mv1TlYlUJdafWEhZ/TPhsGpl7Y9vbbP2V7VCheElkvU/kIg2Jmw7KJ2o3qStqGGx0Kz9VZFFMorlF4kJ8Kz9NeH8ydtfh1t1Pon4Ms2+XQgKT0cJ4BTOz3lS8emhCXx8qH5TiB6N3xLAMcJ6XKn49NBk/L0cIumqjFKCioJhlQCOEdbjSsWnhyaTv5dDJn9VBtWRlKJE4oFVAjhGWI8rFZ8emkz/vBwy/VNlUB1JKUokHlglgGOE9bhS8emhyfTPyyHTP1UG1ZGUokTigVUCOEZYjysVnx6aTP+8HHL0D8+uecmUNBhW2UWXMBjX5BlRW68VF0ZiNSIUhlJXGhl/iCEll1i04Qm2TP6Z/sVq8YtcWf2zapW1P9p2s41JtTPek7W/uXKJq1fW/qrmaOcfuWLhrMeVtT9W3bL253+h/SnCq2vhVbyUbnMQrG1lqvUMKLGiB1Ds0JxH3oLRo9iwyLwwCgI1oGBoNK6PWaZcGf9YHAXFl8lflSvTv6z+oX4UriJZ+5O1v2xGC2pH1v+UKBkEZP0vFcebguqT9b9/1v63lJ6ZssJLKTJLMhUKf4QAS8s5iW80aHO5AQg20s5DswDgpDgkEfVGcio045/J32uZV6+gjh6Y+Gb6l9W/rP3J2l/tpAo0E1n/4xvLrP/Nxh82pqBGZOMviVeIKQw2IGZTQCUYj1IyYn5ILiT2B5c5zC6BN8EepWTE/JBcSOwPLnOYnfEvUQJeRCULKj8kFxL7g8scZpfIPSt/L6KSBZUfkguJ/cFlDrMz+ZcoAS+ikgWVH5ILif3BZQ6zS+Se6b8XUcmCyg/JhcT+4DKH2Zn8S5SAF1HJgsoPyYXE/uAyh9klcs/034uoZEHlh+RCYn9wmcPsv6n8sUIcGXPoYTLCKBn+0cBOOD1qCau3QDRSPi6/McSTgV8dCVxDyfhHYqOAEkJPOL2oMvmbSLzAzJfQqUiSmf5Z5TKNyupf1v6wciTqiqlI1v5GrQbbk7hNSTqz9pciyvof0w6vMOZL1CkfoLIyp8fK2t8/a/tbyhJmBRYPHljtQysZtt8CSENjJUjiGi0+OO5N/OiIUgTY71rFimFx0nQy/l4uaHxiUQRRxU0S5ZyPkMk/0z+vLFn9M03QWrKe9mf16jVy1113S9u2F0Z1La5/fft9rrCHHnpYtqxZQ8qXLy/33HM3YFn988IyOaCNz9p/LxJ0sr9G/2I5mixj/QtqphpnVGnHuBHTTP6Z/kWqkOmf1RStJfCUNP7Un25OzWksZqjCXqZW3ayyJaEW3/TP7PDrK+Ceig9P8MNh8ZVmxj8ScRCE+oO8olBveajJz+Rudib/SGqZ/sX1jYoDsQR9gsP0R3UqqF1wKDjgq88+HmrxTe/M/l/Uv2lTp8lbb74hgwcPkhUrlltGVV6r16yRp59+Rt5++23ZfPPNZcb0GfLii12k3d13y6effmq/iBzs/8X8x83+37P8s/ybymflb5Kg/Xdp//7u+o9n19KF7UfOrAyxCviqEVUQ6+0YMTKGab/MabYPRrwIQSngE1Gy6Bas/ow/xUAJmVRNXpHUMvmrniQ/JinTO7M9DuSW6Z+KQjUIn0iTgghNfgT83evfVttsLaedfprUrLklpOEl4+XlZOL48VKndm2pVauWnH32WVJUqpS0bNlCtt5yK5k0eVL4ZeJM/4JqUaNMjF7vMv3L6l9SPUIt88C/e/uT5Z96wBY37pWs/VUN+Q+Pf3RArIw8tygZSIxPBaC2/uMT6BKtvaVNUQN+TM27GM8HKgV8PKVcPPoTvAK9BIwYGf8guEz+XhSZ/mnVCXqRdmT177e3P9SsuP3p0bOnND/xRNljjz1UxFb/ypQtJ3vtsVda7MGXyf+3y59CjOWvvqz9D5pl+pe1f6omQS5pR1b/svrnB5M67sRH7bSSRD4nOQPi+FQqYyXIhOgxMTRUEY7C4oCAGzuMrqdIeOFKbHhAiGjnJj9mk/HPlf/q1avlmKOPkdNPP11uu+02+eKLL6IiMLn+evkX44cMV6xYEdFJlka+/EeNGhXwko5lS5dHuvTr+Sc5kubvLf/idevkvvvuk6XLlpmCJ5JqcvKMfGpjjn8Ef2P2V9f/pUuXWlZVmF6Wv73816xZK19//bWsXrkyopuvf7Nmz5YfF/yY4GtOK9eYf8dOnWT+3HmGENmGB2+B9mfcuHGyz957R7ie/ye9e8vRRx0pu+62q8JHjBihde+cc86RY445RmbOnKHEfm/+I6a/W/+NjqYnFkcE/vn8EymuDfnyN9rTp0+XJ5980rwa6++U/0TGI6fJNRb4L5H/vPnzpUuXl2Tt2rWB5C+Rf0AOjt/G36c25khysa/k8g9sg+P38Z80aZI8++xzSu3/g3/IBhx/Zv7pNjed6p+rf7PRbo4ePVpzFzQUGf015f/tsG9l8eLFSaYJ9+8rfyO0bPkyvOhrKfT69/LLr8j0adOSBWPoCfuX8+fBezX8gY7Cphg/7kyTwAjO4MiJmoY/1f4pV6lSZXfAAQfgb3+3/fbbwV/RNWq0h8J2372Rq1ipkhs6dGgOHc/XU0vQDM7gyIlXEtzT88hpnLTPuW+//RZprIQ07u72P6CZ23333VylipXc9jts7w7Yvxn+DtA8PP10+xzeSR4FgoIc0xzTvmS8Xy7/n376CdpS5Hr27JEk4EaMHOFatTrNvfjii+6mm/7l7mrXDuFpjmmfjz5gwADXuPHebvCXQ9L4ETK2jV3lypW0bCmro446KuLrERYtWuzuvvsud+KJJ0ZwWsbJbOcWLPjRtWzVStOHwSpku7/D4EPj/PTTCle9Rk2VNeVfifwqVnaVoU933nmH4hx33PFaVkwD9Yy6RbzDDz9Cw+2DjsVde+017ttvvgGo2OE8qMOgReNsVKUKdBHlCh2tV7euO/DAA4F7rZszZ3aU4mJH+d56262u4S67Kv8qVTZy11xztRs4cJCyQKPi/vWvm9wWW2yu/Pfbb3937733GHs3b948lENLdxtoHH/8ce7++/8dwiiNESNGuhYtWgSYd/zy8o8jxrKNYebyYXPnznE33vhP98QTT7gOHZ51Bx50kPvoo48NKWF7/mvWrHaPP/64q1a9msq/Xt16wP8wgeed48dPcCeddKJ7+pmnC4SNdwcddGCkMxXdWWedrTIlYkkpnj17lju/7QXu4osvch9//LFbV7wuID/yyMMp/dtuu+3c0qXLlNpqpPeKK650Dzzwb/dMh2dQnge5Tz75JHBatmwpyv5YN2XKFLLP49+2bVuHiaWGMG0LFswHvSuIGpAx2HWXXnqJW7cuN/XFrs9nfbQumh77iInIORxzKSTxfVgCIziDI0ZXV0nw/zz/6dNnuAsvvMAthXzNoMN1m2++hdt55521/d9nn8ZaR2vVqq31jfVuk003dddff4NFSdh/rP7PRzmy/m233bZa72vXZhqaoY0/wG255VbuuOOOcy++8ILD4kKUhmL3xptvudatz9T2X9uVww53jz/2OMK9nB944EFtL9j+MJ833niDtrmWiU96f4L4Z7lbb71V8z8Q7arFJc7tt9/hXn3tNUNP2V9+Odi1Rj1ZvXpVDA/FGxxxmLpKgjPQwsz2UdM+D7MQH5bACM7gSEaAuyQ40SzMbB817fMwfidOnOAuuvgStBMr3OxZs7X9rVO7rra/devWcc2acUzRDGW3pZZd164vu7Vr1wQCgwYNdFdffbWrUmVjlHcl17DhLlr+pEfz6quvutNOO13HH+w7LrzwQvfRh3G79t5777qzzj4HZXeL26/pfu6rr76Ks4C8sKx79nwn8POOknLDUAsze30x1q//y5ev0Hacfdf6qCX59+nzmfbZTz75FPR1pEYdM2aM2xh9oe9L2Z9WhGx8n9rttW4p8mxDr776Knfmma0hg55u1SrT0Thv33zztdttN4ydlEYld8MN17tituGRHNg2nHTSyUH+HEMsWrjQ89Gvz3+PHt3d1ltt7VauWmlRlca6dWvdySefgr5zRCpOwpPjtLSZ7YPNhwGxOaN4wRscOQRjbxrDCi6XjnPnYOA0bOgwDcCKIwYR13KY78ZPGA9YsVuzZo3bZ599fMRANDgigvlWGqNk/prHCJn80yYHEHkffewR99JLL6FyrVX07t27a5o7o7E0c8WVVzqswkbeX8f/w1DpCvPPKxdjmrDTMYvdipV+QDxoEAZoUSBlu+cejVzPHj015jro4gknnOjatbszpDtBUuNNmzbNPf7EY1C0kzXPX375ZQqFnrlz57oTTzrJ9ejRI/rr7saOH6d468Dkow8/wuDwX65atWru2GOODunJlT8b+r322guy7uJ5IN0PPPCAq1O3tsPKtHvjjTe00l4JWfOPMr/kkktcqVKl3HBUglmzZmGysjvCrtCwK6+8SvGqblHVPfXUU54mhYH//7j8csDSA7X58+dpHps2bRr4c+B7Z7s7FN64ceOIRmy9+eabGnbMscfGQDCIRI5B0qUa3rt37yjc8z/8iCPczTffqrAlS5a4qtWqug8//CDQOO2009zAAQPjOCGksMP4MXTJksXu3vvujRGTgVH+GUj5Y7XVNW26r+v9KdPnEb/7/jt0Ghu5+fPmRzRSBNwrr7yi5Tlj5kxMAAaiY2noOIlYsGCB4i9c+KPr/EJnd9ll/9C8P4VGNjbFbvmy5e7M1q1dr1693by58zEIuB1TfNGOJsaDK7AtdtTjHXfc0fX59NMUCj3U6xMw0Urq35CvOHHz5tw257qrrroq8mGA+mkfbXRHjx5jKG7kdyPdIYcc7FauRCNrJuLf9oLzowGxD+jWrZv74IO4rDhgug15WLRoURQzLn8Cpk+brnLwA2IQjejm6n8IiKgQ77PPPnOf9O5lkBLtiGQUnuZv/HxgzH/RoiXui/4ckJlJU4nj5cANPWGnMYrdIuhg48b7uLFjx6ay9e47PV27O9s5XEpU/Rs+fITKhpNLQ3zs8cdcly4vmjfAE+zynL0wwaGsvPll+Tf5P/3006p/jz76SKDLye++TfbVtD308IMBTgd2llyNGjU0rNAk6nvUH/Zp7NzVRMKZNn06BtIbuhHIM0337j0dzqe7Zcs4cXPuxx8XaN+nHT0BQajBoe3hXXfdxdCUiTEI/nX5jwmlqRTiH+OmXYw5f/58N2SIXzBJUcr1RH6Tf0wphZjKPxcQ9t577zBptTgPPfSQyrrDs88ayHFyusdeewJe5Nq3b5+gQ5Ri9EHHcknRvf76myGOdxRrH18FbVmdOrXd6lU2mC52EydOdHhFxk0Yz3GKHzxvU6tWaC/moA/cd999o8nT/4/8+/TpoxMtpp35DyYlVnhy5P/Pf/5TF6qmT58WotBx5x13ujPOOMNdedUV2o+yz22FxaoNN9wQiw3xJJftWgO0zWwXi7VQ8/PPvplxv/n6Kzd1ylR3Mfptlk/nzvEY6vzzz3PsTxctXuSwq+RKlyrtsLuGlPgEc2HykUceQX/VVMs82VZbFufMmeP23HMPtxA0grFABcAT+denfxgQm0lRQHzzxy7DDLahBIB35ILfjzoSDy9G4vd0W2K0nzRvvPF60vuH8rf0GH8yMljMNA15/4P3oyCffw60OAibgBmrmc8+7aMNgvnNTlOKeRn//v37u6OOPsbQIzsdK5Z67MqJEBOOAlbqCrG4gZgVm3kBA/iy5cq5teyMFFjs3sWsl7O+5cuXGxrsmP+oUaPRea12ixcvUSUcXGBA3A6rzBPG+YYiQUSd7Pi+//57dbNCHY1VWBrjH7sdVhk/0kaHHYOZSZMmKV/OvNtjd2ENZoFJwwFZ/fr1lSAHavPCIM5jLUO+qlat6qZOnaoA8u2NznPLrbbCap5v8Cy3HNCwI+OKbdIsX7EcK71VeWTdDRsxPBmkgzDGObH5CSm4eS7HSiLDhw2LJoEIWIQBY6nSpd1jmGjRkP+uu+4K/2Pq52orB9Jm4lKPXRYWbMsEAOyYTsEEhiYBTvk9vFhXqitsWBGr33M0nJ9Fixa6ihUruu+++y6KY1SK3dLly9wLL2CwkjCU+4blK+iEhGBsk7sfMThm47j9DjskJiM+Pd1ee9Ut+PFHYHq6a7Gquv322+vqjSdr/LyPg1XK//3338vLDzF0IPx2d4+c852FVeXSkLVNVkmZdaMmVpFuu+0WxTZuJ2FSd+ednBwaxBM7vy0HxGconCGXXHKpTgIZysEwO5T+ffvpygRX9rt0iSZ0GsPLgzowHnXEKHs7+SU1M4bllNZzzz8XBfyy8jcqtGNKHmp+2ldc8Q/XqXOnPJzcWDHX2OWpJb5GOAL947LL3EUXXZRH+0PUcQ4oPXqxe+LJJ1A/ilw8YXRuAhZHvtGdG08s5hq7EpzV2fG553XRIheek6yQHuNP/GcRl+XTtWvXKLoPff/99xVevwHaFzUx/5o1a+ogesaMGRYU4TjHlTXuMl9wwQWBHwM7deyk9GZhwEYOY8aMVv+MmbM0LnciOKj5OfkvXrrEbbbZ5rprqZHs45NsvmDngs3v7eQ3RIHDsDwsznXsSmKrG1HatGmDRYv0IDNNKaac5JyLE2PF/M/Gyix39HJx2Way7Lq/9XYqSW9FCxWNsACUNIx/4gknaJwe3X2cXJobb1xFVzItHnP9xBNPahwbaHFwxkm8TYJbn3GmGzx4sEUJdi5t83s7+Q1R4DAsD4ulHruS2OpGFFsZvffee91eGFfRpCnFfuNM3Lr1ti3Y/3PHkIPGmGuxe75TRwyeT1La/HBVd5tttnHPPtMhwJIO49+xY0e3auWqkB6OC8qXK6v1nzjvvfeemzx5chTVxzrkkEN0Ic74j8TuNkP69euvZREmjoxljODkLsB5555LaBKc8nv05FeDo4+H6xlifywDJR2dGoGyobmy0zJmMz3QwvCBQ4MAsXMdHiV1zoYRjj7qKMZS+IwZM/Us4AnNj1cYP4zevPmJ/zH+lgNvJ78+CYXyf/SRR0fpKxIoiLz7Tg/ZZZeGUqdO3UgIIk33308222zTvPyvWL4C53f7y1NPPSmDBw0O8iDnr7/+Rk499VRZvGih8MwtBjKR+Ipk4qSJggZasI0jC+bND/yjVMrECROF5yTnzpknL3V9ST7u9TGCYvlbMRSFo+FOPu39qey///5SeoMNonQUyTZbbyPLly3F01KDlXRu/hs0qC9lSpeRMhuUjtJAyxcuvwt/XCSPPvaoHHXM0YItI/lu5EiP51EQbwPByp7G2aA0+PKwM0z+V6Rv375SGjibbLJpKH8cOVD84cOGysUXXyKYNcIf83/1ldfkkksvUYKnndZKNmcZ0ET8sTqNPO8nW2+9lcLI94EHH5Tmxx0npUptoKg+LeqMPnySOyIASPmy5WWLzTcDfinkpywgMX99igEEwo1gE3wUPX5kEAD8Jy9evNp0k01Q1p4zzzJjtqu8164tlgceeEiuufYa9fPzW+qfJSPOW8xfaSp1aEfp0lK8bq38+9//VgjjTZ48VbAdDJlt7bES9b/ihhXxqkJrj8sv8FetXiVntD5TqlevBr8TbFlqGbKsWebexPxbtGyl+TctwAhJNt54Y8FqQNB/kz+2weSiCy6UJvs0lqNxJj7QggMUZe2adXLPvffIBRddKDiyIJ9/9lkSRQZ8MVCwS4Gn0TbTCJRHObwXXLlSJRk6dLjimoyaN2+uT6mtXr0WtJ1g2096oV7NnjlbVuDM2uef9xV0gNBBkS222EL5d+rYWd559x256JKLhfp3WquWgsmlTxyoe9pMKUCQjfHydvKrKHn5J/S3lD8Tx7R+1ucztD1PyYgRyCtg5IgVdXnk4Ydxtre9sA0ejbaHMBqW/7hxE+T5js/LW2+9pTRy+X83coQsW7pMps+YIR2f7yT90b75jCEyCGDHSDp27CTYVQr5VeYIPvKII/RFDst59+49pFq1qtKkSZPAv1atOuEcNoG5/JUW08pA/cBSgp4/wQb3fCIAgs1v/BnC3s4M8+8hDq+L1NS7MeVRX72x2BE+LasbGgSAJxAoWgwmiDpDgtQCwpct8/cxCMEqm2DSLgcccCBCSu5/cTxMDmy2v57L1lRESVGC5Brxp5MmyZ8w83s7+fX4yfx7COJEeeR5cOzSyYsvdBas+HkWoMn6f9fdd+HZwRdwhnOq9mXr1q7T6OSACQLO/XaQHihrrCwGuKUGx9a0/cNupHTo8Bz6oiGgHWUA2NOmTJXXXn1FTjnlFI1LWdLol2nD/9zyr1GjpuKUL1dBbcVGBKbHKFttJMyMz3+6/Wf+q0NH1Sij6C4NCcGPHTXBjojsvTcu0/4H5W/yshz4/EcpRyZ22WVn5b8B+lxLRpw3YOO/+Wlj8i533HGH3If2E6u+PntK1OvfZZddpvpv5c/Yr+Cc7mWXXuxx8b3yiqtkk003kXPPPw8+8lAC6iSS8Tv33DZStmzZ4F+H9qZO3XqCwbXCeMeiFl7s8dE9fyxkiKbBF67svPMuJIk+2F930/4zYucJe/7HH3+8PoHJ9s/4+7TF6fHw5FdJp/grl2i8AkIxKY/qv0mouvFrRpom/QASE0CEhFozUxrBcoABEDoYgpo1axZYMHqZMhywKXKAmyMJVXcJ/F9/43VphWeQWrRsCbultGzRSlqis2rZogWeR4KtsJYy5gceII9NnPwkpzgc2woyYeIkOaDZAT6FEf8yG5QBEuLEBGTa1CmyM5R07py5cughh8m/bvqXnHnmGUoMsx6ET5MqG1VGw7hMvvtupGBbSKPfdPNNctUVVwqOjqAzL5a6devKsGG+8/4UF3eOPPJI2QED1YcfekguvuRCefzxJ+ToI4+SZzp0SPFnDkIJQP7jxo9LD2xRFNtvt62m56uvhqgdJz+df2s8FCn6EGPGzGloqE6VKpU3kvsxqMJWjdxx5x2hrENpW/kj38FoYMAQnPvEIGSlTgas/G3QOOSrrzVaMlVY6ZYPPnxPjj++eVQBERpnAPhO3sA7sqcifdpiIngOJhF8J7YhLz7l8A/pQpkaf8KGDv1WRo3+QXbbbXfZEXI3o2kpQn5IR2nl86f8Fc/yDz8bHw6+Pv7oY1mN/GK1QQcROLOId23f1AF8ndp1jE3KVloRRN2F9J8BGhhKP+Q/SqingDRvusnGcs011wi2otA4nSg4pygvvNhZsOMhG220UYo3Pbn8F/w4X4YM+Uruxo9XaGiO/AvlPxCN5P/yyy/rYHaXXXZJFJ/nNGLEdzJg4EA57PAjBCtQssMOO0jr1q3lK1yqI8aKn5YJ7h3IzjvtjEFcRznksEP1qTTsaiDUybbQb+KN+h71XEkqU3V/hXQn5YEziOjoZ8oHH7wP1CIpV66c4Oy5vPvuu9K9Rw/BWXLZBAP3hzCYpCG5Cy9qKyNHfoeJIP6++x6d4/eCldHAi9yCLiX5k0CUfzrNxOJTZIBDbEUxKD3qLlT+CMNdAdlrzz2EcsA5fDm3zXnRJMtpO1OufDmdKMyaMR3p/k6w0q30L7igreCIkBx+2OGYGE2GvOvLlCmTNQwr8RiwHSC77b67PPTIw3L5P/4hjzz6EORykHR/uztwkCJkoOc7PWXN2jWy044NfBYZO6H/SgyfJYuXyHDULRyTCh0y818aMw4/8TXM2C4p/xADWHj+iq2I69f/ZPnTnZQ/FyPY/uD4UkiA8Y+0CPktThRjxD9CSg1rQafZgc30B1zeeeddpffqK6/KUUcegQlBNbn99tvl/vvvR9595HSpB/Za5s2gh2+8+Sbkh4tLJZS/V45fm38tvkh8llPP+6mn2ssZZ5yJMt1RNsO72zvtvLP0+hiLMOA/a9ZsqVC+gmBdTaaif+QAcS0mspRnK8juwQcewAXvY1UnG9TfQbAbpURxDlX2bbIPBpJ7C46ryD+gTw8//KDsf8B+8uknvT1jfLGNDj6lpH79Bj5bUYimsIT299XXXlXcVpikqsnVP0Yuqf4hT/qjDBEfWoeiPvC98Xeg2zSvQDfYXm5UpZLceutt8sD9/4buYAgVKxCw/jj5K1N8kqXi8x/x0LwAonXAEH+ef+dOnXX8wQWDo48+WrBbL9dff50sWboEfJKcPHdOdDm52Q/tCc08+N96+w3tf6+8/ArBsQk5FWMuHL+LEloy/0cfe0wee/QxrQ+euv+a+D7GQtZhhx2mbW4qHB6re6xfhfR/36b7Ql2KdOJmuIXanxLLHzyYf1vKiVgqOy8WyIaEVUTqSAtLffxomMfk15NVhybcU4jpdu/ZQ6M0a3ZghGRWTMNoewjC1bF+/kehgHE5Amn2MWkXw8e5H21L7mabRiuKxlrtkvm/g1kuzYEHHag2P5ZGzyqOO+jLIXiwf7qchJUSJpwDj5NQiZ59/nnBFrOccNKJ8uBDDwoOmUuLFi2VHvYo5B10PKedeabU23Zb2bZePXns8Uflre5vYUC2KwbWhwq2fLEi3Et23203rCb+WxuiRhis9Xi7h1x0IX9Ry+c6TglB9DHEJIIUIeF+uAaHaaJixTEtbw7xGbdIp3AKVUxcjpFnnn4abifffzdKrr7mKrnz9jtQufbSShYwS+DvS0JJya677qa3qHsjbxdceJEXJ78g0mCnBh5Jk+apDsVAko1UrW22SYTFaV+5cpV80b+/PN2+fZT/IsHZUuWxF9Ln28iQQtDw7uVYxRiLFRtOUPp99rl0fKGTHNf8OHkeqxc+Uck4nvWYMT/IbWgYKWfmyYb9X2Ll3SeZXxovf968Z6N6x53tsDq3Vvr176fv3T70UCt0NB8pps+JRolkAbcnpuH2YcO0ePEi0bkG+OMCo76cMWbsOJ8jJJflVqt2HZ2lG13Lf7t2d2kDcvdd9wi2iaUTVgfZuBkeiQR3xH8Nbrt3fO45XRniKuMCyOqll7pK2XJ+Ykg05pWSIh+vf+oItL4b9T1kdis6mXdlw4oVpHbtuhhwsbH13PjtyxVfRPtu1HdYybgPk8s5cuk/LoNuHSXjkb8qG1eJ9A+TM/w4Bgdzz+EW+k4YIN90001SG6sOVTCI/eijD+RE1DcS07Th02CnHdWPj5oKFSqqfLgbccIJJ4R0kj/jMPV0lCnDXYLYKJwfRfKY/DJGAKvfwzwG0BGY1H+GchC6BituDp0rV5TnYCVuNQaXY8aNlVKMAFiZsmWkdp06CYpwBkae+meffy6roFdckaW5+OIL5dbbOOi6T2pg5RPnKLHSc5nsudfeaHtaKA7rC8v/XvzaHrZBBWf05XF0XB989CEG+RerTOZhcs86xZ0mlt1yrJzvuNNOmDS8owMElvPALwYIjiRJdbzfzGSp0fpPX9z+9MPK8oIfF2JB5ECPE76xDDU+PiYz7yjCW8+TZS0G8drlou2aM3eOlsvYsWPAwdc/rkjVqV3bUy3AP5Y/GOD/7NlzZdzYsbhlP0re+/BDef+996UdVtCuue7aPP5sLvEfg70HpXKVjVS9fdPowusm1s9oAsC/cuXK8tWQIdLhuef19RHGexWDwgEDBmLXrjTaP/86ieU25BmMghuOjTaqgpXWJTJp4kRMTnbTdOhHkTwmv6tXr5EpkBPDWP+1ZYKbbRPF4TEFuzObSNWqWL0OJqbBPDJ+D+yKNsSu6E477oS6tZNO2t94/XU54ojDtY4ddfSRci3ktC9W+rlAQgo4ria4lIbdgo7Qh5qCeyQYBD0qOO8trdG/tcAC1Qy8vDJo8BA55NBDscP4T92RqL/D9tLzvfcwuT1MszVg0EDZvv72grO9UaI1VSG1dMyaPVPGjhmLwfhILbeP0IfciwnGpZdc4vFyyp8JfLXbazIUdT0SEGiTLnaG0L8Ww2nyYSLYzgz9dqg8//xzKLvbUYdqYBB8v+ByLnYlN9MFKh8hlh3phpTm8FdO+KxetRoTzqlRgRCf8VFWUf3HEFuTtTF2FKtujjJS8oEqQjX1/qNh+Pj/sH6e/+f9+mJBYSV+YbOC4OiU7qa1aXMO9He+dMRgWclFDOj+8IMP5bBDDkEbWY5QGYSFCvZdXDDqgB8pwr0cLPr9U4456mgZ9cMPupAXUhrlfwBeu7odfR4X9qpVr44drD6Y6MSLTNwluf22W+Xl117DziUWA9FnnXTKyXFamBBK1f+nh85U/rk4WQGLTkOHj/BhGm65idufuP4TIWk8rg6IvRMs4GClN6MDoagVMNI+lUkkYufHzcXzsnHSv18/bJXt4ytjRPSP4s8tUf6pCQn2Xp8eA9KGibzeys+D5b8vBi48cnAst28VueT8H48VP5x9VbwfFy6S8XjMn79wNeybYbJv030gKcYlEfx5xoJ9eax0dZKt8MA/O79xiLMQncZXg79kKlW8G6ChJ74e2QCNUigXTgDwModHQFg8w/V5scJUNtEnxT8awWlQgTIswlER/iMdjwNW6rD8F2HVYCfhFujeezWWTs93xKrA0UxxCk+jRJ+Yv09jo0a7yUUXX4xB9XWopBvKPtANnGPS+LVxtEONZQee19CZcPs9GE2KR6CqcgWDA/NN0OCbmTlzFpxEZHNBE+UGFu5ZKGTc+Ik64x+ObWbcJMas+Xq5H8+zpWRoUSMqO6BS68q4wT1xXQXDRURwYdPmDdmUxwrduVjxTPLv1LmjHAudqbzRxvLkE0/K9xgwcvuLDUbb88/HYBMNEehGKY4cRbrijbOHRh4TplUyDp3Dg5gsUROoR0z77bffpscZrP6Z/D/5pJcsXrhYPvu8DyZt18rZ55yLycACuerqqwJN03/jz6MwF+Aow5E4AoVzaNgSfVZ2adhQbr75Zk0X5e8NHKpbAaCdMT87o2PtiME3V5jPOfscHB86WX5AurkKy0ySBgeCXC28HunCqxb69wQmE7th8MBndvS4TMRpy622lPbtn0Z9WYzB+vNyMwbE7ETvufse6NQ1ghdK5KyzzkKH+YHgnKrgcgZiRtKExUFBrdq1ZczY8YF/RFoHFJogpCmKETnifHlV8Ahx/j0L0zbSy5V/slBxOUhwmRG0KQAeXxiHY1rFOvgx/WPn+AB2Y3xCCvM/q/VZsivKg4Y7VJNwDGbmzJkybdp0qVO7DqDMBU1kw6JOcpLWECv1a9HRjcHgcgUGB1+i7bkYE1TyL1POTwbq1gENxKlYsZIchBVipaJJKQKf2dr+qNdYJARi+e+HI1I0zXlkjgQQwVvekYiSJ39Octkuepn7bXlusTLNHEEw7hYoz7vxy4GeKACRMf6m/4oAxu+9/66Mxo4ht/ZXYDDHY2gc+KuJ6pClkTSZ1muuuw6rXH57PiKPgdk4HFNpD1RiwNCKMlMDk4Tbo4mzT7zTSQone7PnzMZOzaOovyt19bctVutxUUtJJOvf3o0bK80xqCtcrQ9GsxjLjgMbvHoBXCRA+Vt6gMOVVRWe0xX+M04/Q72a1CiTSfk/DDrlK1RQHE5G5uGZwgk4WuNpeBY+HTH/ShUrYnX3LfQHe2FwvlZ+gGzZ/w3BALg1dkop/7KY3DEzdTEZpuHktel+WMhCf6PZAWwW2mz61XjyPkxBHov9ztChw/RIxzocO8PLLth52NPH0UwZNaRYB76C402tMMlrDpyYKFG540rxxDEYx8lWOHZ3OyZISo6U4fj3vx+QZ555RnichH0Vj74tXrRELsOkHZe7iKV4Vv70JvUPlzd1UUuJWlOt6QHxRAIOx+TgVE5c46Tm0fX4RODCn9du8vMJjokZf07+9tijkZcB2J188kmCO0fa9/DY3qZ2/FDT7OQ1TCBwDyjkn/pHc83V1wjuZKj7mWc64Ejp+4Izxdgxvl9hSf5N99tfXsMxx96f9pLzz28reIVId9h0RwhJ3BoT8ccef1Latr1Qzmlzjpx2xukydq+xftGLCsnskSo+VOuUkDSLHqFJ4310ckuMJH96Lf9x/Y+IBss7dEAMp+eUrA1KJTEQop9Gkb3Tvkyjj6ouD87Boz7+MOoH3To579xzIxyP/0fxf/vtt3TrThxVQ4dyIS3aPkTJuwmzVlz8MSn5LIUGxEfRLzK1FlsLPC/XZJ8mupKUCA3OZP5xK1VwWUi3IdahU9sWK75aoCwRCkEzq58UfzYgfBv1awwUDsA2G27wIzxH/oweRSVzU3/jz3XwYBJ4nj/ZkUAcz2uJgkosf6WXQyvwiBycmZ17XhsM0nrHQTlxlHUJ+W+P846HHnyw4PKl4DkcqVOnjmxQpozgMp7X64gqt2RxyUpXymNGSd138vobGDC3wHGJBP+xGGApFvmriWyUiR3P2G3XhoKLTDgnuRQraHvpmWOep730MpypimLFUT0kV/5RSmI0Tb2PXCj/PHrAFdZevXrJC5it43lCGYl3bHnGl6sneOFEcEGvAH807NiWtG1dlj8utAmeu5LnMCgsZJL8cdFLzsHZXZ5zr1dvW8ErDlg5vFRXe/ijEzwapCZX/wAsha3t2rVr49zt0zh6NAZn0kYk2h7VRGChY0sJDRD4Tf+4OnX44YfLi11e0OMJs7Eiukmk754xVrAwAGRDaRR5tIYrNExzckBMfMrrkkt5nrevRcexoouxirmjdpZvvvWmbr2uxRlHHlsJyuFbSS9fLrXnpDmv/pF6Lg5AVv9S5a94DPEmmf9AJOJ/7z33ICpwI6HhdRtd6TvvvHND/gOln+G/ySZVZHOcv8dLH5hgVMHAtaJnjjjk7z/kHhGJ+O+HScITjz+OickYrCIfg0Fy+Sieb38MXYEJ/kaHaRsz9gfM61OBnkb0tfx/jlVs7u7wSFjUS3nyifyHiJAHaRtVO/Nu4biwhgljWTkDK48eJ4FtkXL4e8Q48PzzzsexgDOkNf5Y53AxVT7HoL1BA+xO5fBn3DimpcKXOvOS6HHyEC3/JPDWW29j5283HK3bCUfhjsLxn92xivqITJ4yRVdb+2CHRFfQCvEvkADNtcKd8Bztc889GyfO8g87Ku5EmJeXjwp3pH+GwMkuj2lwkLP33o313OjSJUssGFnxidF8R/yZcR6xeRTHayZOmqQ7CNzd4G6jbwSI4eP5BNEPk1P/qItbY8fBpzCwjJB9fK4E46UZORnnjLkQc/zxx8oXAwZIvbr1Irw4nvInGwUl+UepyeHv0dL6R9jLL3fFMZgDtV8/ELschxx6iNyHVWMONLnTNQi7g3Vq1ynAHyBVAsFOTC2U0XOglshdIf1PY5B9Hl2CNE+qfyX0/8RBlm1SsBt2ZdVECnEQ8sOjmINxdI7HKMzwHWw8xyYHHXyQgSIVKUrsbIgep6Eu9+33ecCzIjbApptvqkdYcVEf/dSFen+hdPlSCPbyr1ypojTZtwkmpt11keUH9C16vlgx8IlElaOiSl6DkD8//lFp5Mkp5B94ITDKv4Ii+euAWKkmOUXMQ1T4k8GKrx+PqAQ9EUt3jBK5iMNzZjQ8o8dKFCoGgUkGv5H/IQcfIrs32iMuCzIlrRxTvVr1X8x/8KBButpyxT8uz6FCb37++VD/2ViRwq1zORQNLLdXiKYyMkHB7yuoB3A1qDlmrZQHbuxKOawGP4kLeTSKAXyqDg3LzYwqABCMLOeIuYbnL4cPH+5xIkQqGwFN9vErERqnoPyjCAXGCp4PE+NLsQFWNPG0VSSRnFQATSlF5IhkxzGIyYtYbNT4x0HLLjiSwZ/GrV27tifE+IiLd2ix+rdxDM+RP3+U4d1338eWL1aYE6Za1WreV5A/8wATdeaVsMXJs5GHHn6obr/jeTGcx8TqhcVVZMZhY+kboDgoGkAgRKnGAQXz/+QTT+nAtAwG/93eeF07YU4EGLlhw13kdWxP4u1b9af5ayLw8ekwNv5wUCRrQ4lsxYkQu3V7XeptV08HwwzmiuqTGIxzy50dIDs0n+DIAptc/rxsuNPOO+oxDeNPbM03aJodsS+Y/10b7obzk6Wx7Y08Jxjsg5k+3g7Giu5EDAwwcQWxDbFSxXRWxdnL2JCL1z8OIHLzz3sKdlcBz//oudWjcOyC9JL6p/SSgzlPVsGaN/gTyYvZay6TrVjcgZKEz7RHT8q/IP8kA+WvFDyJX8if51NvxGT/TVyC4hndLi918cwZP5EetiHW/vIuA97+xALB9tIBKzzcnbgcZwMt7RrP6r96PEkiJPW/OrZCuYLIVKfQInTCpk2fpjtarc9srROrFGZe/n1EpVVC/nPbP5+mFNWIewSzhDH/6AyTJcdBDo80cTLR5pw2ODLyAc7ab+rzkuDv88cvjfeRrP+jTIyJIoSPQvHhpP5RrAi//ubruNswV/phx/QcTE6pYLVr19b4vGdgW8oaD2ysZU+2/0n+nlGsf4Fx5DD+6gW93PynFNxnS8477zzdrXgHO54b494Bd5WS/GP5K3WQLpKFuNTElU2ucrd/uj2a1VL6l+SvNABI9Vc59a9GjeqaVI2H9EA8CeMTyPPLNDwi9CAuTV937XWQZRvsBr2XdxfCohu9vPzn8LdiNHzy59l8vDwhH0I3eORh0OCBcvW1VysqF8G4S9er1ydy4QUXJNLqnUpHP/Aj2Xn8kxn02dOISf55RBP6x7Dc9i+Jb/x5R2kQLvpb/ScOz7MzE6zDaiL+nTt3xnFNHJfQS+U+CM8qwuFwCfJLtBtHwO1rEWmUw7GKRNJ9hOhr/NmfEs8rtEI9RpR/HtvjpezyFYADoxggasVD+rHx3IyKz7/5Yiy6FGpBiFaS/K2e+dhEDLHhMO03Qh4r/nLYHRmNh9gxBAEeGNlOZxDcAmYnRTFasNEgQGFG5Ffy55mfOrVrS2372yZy16JdS/+4PcoVkF/Kv2/ffpq8w7CilWcK5J/b7LxUx8EwM1MUIjFn0UCJ3BFX8wrogAFfyPsYyP0T56m44qGRGDeRf8XlJyYIcvBERGixgWJwSBaAvFA4ehS2rXBGkRjE4wC5FmapezfBNhwMt3wWzF+gtJRcxKOIs2ZSjPyKnPwERiKfo2E/HmduU6ggpn4lyo/ln/A4/4EkUPAeKc5HF+vZ0Vz944WMFjjAH0yCP6m/3f1taYbtzs1wvkuN8hVsI+/q/TqLjpw5/HX2DHxGabBjA2mP7c+VK1ZgheMknFWb5SMlvpr6HP6Mrfk1IVB8NJoOfuL8T5o4Sb4dPjSs8urYOuKvRIiOiZIao+d98TeHP+WWQlW+QFebH8+f51SXYIvPgkmwCs4ocuVgoyobaaHhLWb5ESsEalJEPYhfvCeMFTV/C9zTysm/MVCbnzj/LP9Zc2dLo0a7+10UEgQKsQ4+5GBtFMfa5VfwZ3p4IcsGuESPFR3njqF/xx2fr39E643LOn36fCodnn0GAz5u18b6h+fmsGs1W+pvjzNtEf8gxET900i5nxz5k4CJivkgPfWbBwB1Iqgk/ddwRqLjV/LnUYGD0LZyMKwG6pPirysiDCF3X/94mRDP08ktN92iMi+Jv8L140nn6n9DHGfBg0een0fxeaA7ijxg4Be663EEX52I+Buq2sBT1CDEiKH5U8iki4AIxVux/I1ebBMjIX/EZacYCMB1EY6InNn6TPlyyJc4rtRWirFDo8b4E13dESBR/qyppG6oGs8nKmLheeENVl01rVG9hqyzSp/IBGmEVCbKnyumRNuBE0QzCf6e1fr5W5LWJ38e2+nywgu49Ha5DoZDfpIjBpM/iBr/7nil5Otvvpabb7kFY54IWQP5sZxBSvAWB32EWCNaiopgttnJ/s+ybDb1j3kwc+VVV+HezkkyAGfduYPERaYoUZENyp6tRsnNfy5/RUrIn/6ncTTr7DZn+9d0mBdf6B4VX9V/i0OoZsZseiz/vgZaMFHVAKAwy5bRMr/hmZ1T/tb/WzCJrcGZex6f8pQdLiofLpMmTdZzzMafFx4333RzvaSc5P9GN+62tox03lNtjDEDFybG4v5Msv2dDRr7Y4U8lVRjoDY/DkeE5mCX7gR9xcmCk+nlqjR3Apvu2xToEYaVG71JBjn55/Gc+tz5N2MM1OZn/fL3GmsRwcz4Kago5fNsDJc+Cw7OBCAZDjALpe/n/XVLyOKF+mA0gWcU/mj+nnJUhSIm6+PPNLyJFwtKlykddzKW1mT+EvnnLf0f8DrBGBww/x5PGz2rWyOiZwT5tBFZV6teFTijZfT3o7AF87JsVHljbZx5U5Pbx6/hcDlvrq+EMvM1Ahak3ghHZB7IN8NLJXgEX72ka5U85AtAdj6N8XzVS/gJUGLwch4P09+Cc5/ly/hZ2H333i916tXBmcNJKfmPRBrIe+r0qcpDP8g/n8JpfVZrXKBYBp11OEPcHa9nTMXK+NkxnsYUwXvEek6O5xN9CtVSvJBO0MT7grjJ/xCeeHlZV9V5qzleFnA6aO+NQc3JJ52scT2BtBM/PqI3nAOUQoHhEQBepBzypX+lwDJJ/rxFy3QNHjJYV2+iKBjcN5eHcRkE7yPLYUccFm5JQxxaFqyLXDEw4+Pxib5ivehFON7S9cEayE+sf9wmv/zSf/hjOKB5astTsWX9A85xrlEaLP/DUHbeAMFMwmn5YBCp81x5yphXbX48f04qFqDh+QgXJtSAJs9RLsTg0C6k3ILLU9ti1YNnUBcsXKCvgVx3w/V4rm+5po862hDHTPjcDY1nVaTPCPL8H59TCulD4O233Y7zu/vjEkd/hc+fN08ef+QxeQWrmpSpGuCRDo+q3HDjjdIe5/R4bIQI+NVEqYrzxPxp8tvws+QHH3ywXs5hPNaRLi++KHfcfju9wXAFiavsfM6OZ0R3362RT5JPLDpcPlO2GJcTl0qzg5op8yjIJynI0xII0glnyB/APp7FzvErmJ+4/JnIpP7TTyJGQdn8Sv7sqL7FnYKJEyfqSmxXbO+SzpRpU1UnK25YGZd5K+JIwGcyDHgD+n+hl7XI9eNPPtaJXwfIHO+M6jniYZg406xew8l0pO9R/mej7dGzuxoicgLqC97n1b8IFGcmyv/r3d7UIG6N0vzR+Y8ZKvnYG/EnwJy8qEnh9IcMQpki8Dmc5+Zixttvvy1XXn21vspBBOrhWjwVSFx7nSMUFtjx52NJm+2dDsaYBGVmdpEsWbIMl1c74s4EzmbD1KxWQ/bD+cqRI9jOikxFOfEc80EHHeSTlCh//BiIVMOq6Q7bJzp8o4+43pkAkKB51eYnzr8GR2WZzL9F4dnh0ti5+Qzncmfi8hovXvKi21qcC8b76tpWcgGKr7J89vln8jXuXQz5cgjuQmBCDbq8y8GFhEfRhvIFAz5FOnz4SE0S9Yl81qyM2k/gz5nn9cn4N8cF1x/Qt/mfA7aEIhJxUXZsf/XpP2YEhvG64qhR0/32k5e7vix4J1wvnlvgGlw2ZCReXlVkxonIcqV+FdLEHYzFWOGm0aCE/BcuXCiv4BWL89qcp+H4gQ7tV0fiSAENfrxDdQW/+Kl+/Vhm1Obnl8s/l38gGqU5RR8ePn3K8/X6/KMhgyWPZtTCYuBwfbGqSK7AJbhNN9tEXsdg1/L/erc35LobrtPFOEsyj7tMQ30+DC/4RNJQquUwZsAPo0hHjCFW4HgjzQ8Y67A9Px87CklzHp5lw7vC2q8x73zasxv6jeeef1bReOaYr1y8+857kLfT8US7O+/U8Q/vbCX7f5UzEjdtCvoVM5ZY+Dnw57OAqQUTC1ebn/XLv/TtMKYgxocCiKJGIBBjQXiaMRpdCrdA84cAOrRxZsfEw/P4wQQdRJWrUN5fpCEC6DJDX3/9tSokL7qQPxsX4uPnQGX61Gm4MFHVp4FxzPwC/pY6sxlV3cwPjdneh6+TKZhFcaDHCslbthwI8IkVfXc14Ckq4seUucrG56HexBb4UmxH8s0/rl6xEp+Oc2rcHub5sV4Y/LKT53kazvoJ5xvEVOxDcS5pTxz94PELXgLikYKXX+qKc3f1MNCYqheTePGL5zdrVK+J1bPlGJzsqo02V4nOw2WsrXHZiBkrwtY2jyLwnCrPprGh4tMm50J5rb5TsXkZAj9SoFumHATydinzX69ePcGvzMgiXBDEz6vqzVueI+PxBR7vmAIl32H7bXH+9DqNa3ryLVYJumJw++OPP+rZM65K8zgAXwCgMfnz+Rc+x9L38766UvhvnMfi2865+sf3nEdhAnHFFZdr/PBRQnwj8ie9THMPBpr+7GRcJuTLN58XIF/HHnusRmUonxvj0RaeVa1TuzYO+o+UatAx0z9WVh4N4Lbf0G++1bNNvbBtyFuy9erV1WejZs6YhcuQNXRgwTelu6KcJk+dgmMfO+nTRPi1PX2uiCpmKeJgkeV/DTpcNQjkhTGeV2ej/vHHH6nO3YhBIbewVUEtMgkljcKddkx8YYVvlnp9tggxX4NwBf1wPP30zjvv6OrgUHRw30CfeBaO7wkzBhtW4h133HE4rrAhVosXIF29pAdeiZkyeTJksQueQjsrIs4J2xq96NcJ5+B5rIHvXPNpJpYF660frH2rHSQHXNNmTJfroDN899WnN52pZsgL38nlu7gsl7E45vPww4/oahVfZeELHR06dNBt57KYsN6GATfbFxNyVxwX6IX6w3aFDTi3NC3/5KRuyBI/Z46OcLrc3a6dHt/wqfj97d8yDAIexlNtvIXNepMs/yR/5ZdTpnXq1Nanrvh2sjdAsMTn4Hq4D+TrL/ilQ1zq7albjPgpZN2S5+o6n4viO9PcFmVbvAaDu7PwlB3P8vLS04vYHuUqJM/Q1sQKDS8/czKNXyLUF0G2w1nzyZPxpCT0Gj9ygy3jybIp8lWqqLTUb7AD6NbQJ/Dw87baZsQJxgUpdFR4hB9nZCfjCcMGqKsrsDbq9Iyo5i83TwjLrf+F8s+2qf4ODfDGNHbVTIlMTiEmJP39AABAAElEQVRCnBIGcUGA7+oOxeXZ7bbdTgevc+fN1UkYfq5WdYCDAF5yXIx2jheneEzrGawO8mUg5p9vOG+4YQU940g2ffr0Fh5D2hbn3PmqBF+r4VNjvHxIY0nqgrq9PwZsjRo18jDkmwOGL7BD+AEGnB/gdYZbsbLKs6i5+f8Xdg953vjoY+IznjFx45BgFrjG/BNYgb/SKCB/7hixfDkx4AVLvmhE/ly0YRmyD+Piz6abbIZBzit4BaWs7nZRpsvRn3TCfYzxEybo+WweQ2Nfdxwmz1MxsGdftO3222GlchLkubO8C92YizaB9MpjgL3ddttKTZyF5j0F6uBWW22tmeALFnxalfInDtuc+fMWoE/ZGuVRUS++czLDdngh2nr2uWxfXkAdJ4zb8XNmz9Hdpu1RPqXRtvP5QfxQjPLTp04xUdym1jZ4g34LFY3/FOmFceafu79myKvv5/3wZON78hH6w7vQ9zbeG7uuKs9Y2uYym/HVbXI32wgjNLf8Q3Hm4I4c8R0Gt6/KFCxI8SUZ/LiN7oJRJuz7V6H942CzJS6ic3eeF6N5Zv4t7Kby9QdObmohv3xCjeMMb5ye5WV5hDsXlnigUH85DmLfSf5ff/Wl3rnRvsPwwJOTJS5WPIznPXnHZfGSxTpRYR0hGl+LIn/Kn+Mt7kpwwM7jW5Z/vkDRAwtdg9Cubb89jn+i3q5etUrfMa+AfkkJYfz17rvvqV5xFZ/PS8ZaH7tC0izUsms24NiVwDoKZk4mi2QkhKsxmNkEmttsj1nom8RIug0XxQX+P61YLm1x9ma7HXbAjdxbhedX+MTMneioPsa5nA4dntbLCJZ2o2S2Ucu3kxhJt2F6/v/f+f8j+PPoQwXM7PGTt/qesc9hMs9J918v/5ajtO3zzNc++EzQkC+/wpbXJgmUv075JzKVcCbLPOk2lL9v/rmSh59uxssZF6Ezb6UCKSwh38clw8xttknT7OkY8G+z1TYYHI3BRG+7CFwI+68jf746wve+8XOuJgbYyTwn3Yby18m/5ShtJ/OcdBvW+vM/FRPopk331XOb9rqFUTLbqOXbSYyk2zDXz99imc2Y5jbbqOXbSYyk2zBL5s+LXvjVVHkOr9Kw30/GNrfZRi3fTmIk3YZZMv8Y49fXf4tbONVxKMP/DOOvP2L8kcxV7E7KPOk2jD8m/2fiYi3PJ/N1qLRJ8ky6DSvNH0cmbDBMZI6Q+fVuuujWQShAfjAa4fnACBZ5Clo2hGWgnjzzWCBjlFgYG1bcULdl+dTKPMzY8Xvk8sXAAcDFSsLWW8ppLU/7j/IPqdFE+ZRZQv8b+f/j+DO1yfT/MvlbnP+v8v9P8+drH7fcfKvO4rVcISIvpT+H/ofUaKKS5fffqX9/R/5vYweEl5f8YDjShj9I/lzh8GdU/z71j5fDypUrr4Ni33by+/fJf5znpOv3559PJz7z1NPRU2+RnkYsktSTXGN3EqPk/vfPWP8vuexSWbJsse7ksbH2Ofn75N+XYdb+a7n/TPkPGTJEd/K545hvfp3+R6feSSaKqFai4hgcGElVtPPOjOnh/kt/BIhsjMAV6D+eCyBwRByjUO+bMGG8vNPzXTwof1sUvwjbNt315449nYhCgqh35gF+E3+fqP+//P9+/nzr+QtZtHiRrFrJs3+/Tv6/n7+y9GWqRfLn4c/3aPlOK9/+ZT4L6d9fOf8slKj2/O3zP27cWOGbuI8++rjXVdMGFdBvr/88X8rjRT1xHMU3fH8e/f9Plz9/FIM/YvDuO+/iVx5H/+3yHylSlG/4/oD2j+9u88nPY3DUy/dwUQ3O6+7yAH8If2sxmLf/Nv/ymFx1efElvf/C3eL/Nn9fnnEvkfGnRP5c+jcXdxl4T+uVV7rGRz6sKqj969rfMCBOR0O2kyPeSA6xalAuxtVElAi1MLW5VhIZi8IT8WoMwMrm3XwDckusCFfC27bf4Cxut9e74SmVc5SJxdKoxgMeD0+EWthv4K+0SfP/Kf+/hz/Pm/Lc4gY4U9m50wt4Q5CXYn6d/H8Pf4sbdONPKH8OimtW3wpnXJchufn6Z3n4Xyx/S/ufWf6axp+p/5aH/7T8+XOkDzzwb6xo8vxp3P78Xv680NYZv3LIyejDuCS6Oc4ihpbJ1O1PkH+fT0vQH5d/Dor//cD9+AGH8WxEwSZrf35r+fPiK394pm3bthRjrEcsPOvjVMIK4McbC/sLyJ8vQvFJtVGjR/0t829F+nct//Xlfxh+mOURjHkqV64SUEPd+A36j5e1MPILNdbT9M1Y5GZwdMAkCY+558dRSA5yjjdGSQS0w3lh/oTmy7h5zotb/NWU/v3woxj4aUiaBKr6k5+8sBxAjlejKqxAQBLEVxT+W/m3/GT848Y/k3+mf1n98w10sl2wtsLsvLAcQI43a/8gAZVJAcEkQVn7k7U/Wfvz92l/sBCTXApNNgVsM5P+pFvb03RwBDKgx8aXqyE5A26cIgcsFyh4NWG41KlTV2/qMlnd8LOBrVqdVjKzAkn6PfwtbsjKfzn/Gf/cAk36k+6SVcJk6LHx/RX6Z3Gz8jcJJGWedGfyVwkUEInpkA/CN9O/X9z+m+xM+9L+AsIuALI4mfwp9kz/svr3y8dfVnf+zvVPB8TJWbAXCkUSDVi1ZQnNi8rKhrIxNA2JBRq5iMjKWWAQrCGJVdiMvwoLYsnkT93wc5JY0whKa5sPIzxC9s7kV0WKT6Z/SakEd1b/41WwrP3RygLdyNofrSDavOhHmyLCsvZHJeOb5uibhHh34qsqhU/W/iaEEjuz9vfP0/76FeKcSm9HkELNj8uuRJfqPEK1sUh58qPkBWf8ITgVQjz+o9is5c0XYR4kJdOUJw81r2GPmfrLRFn5RzLL5J+vPCVAUiqX8uRHyAsmINN/CiGuihRbpn+Uwi8yKZ1KefKj5wVn+pfVv6z9QUXJ2p9S2jhow+tbXxUJneplaNR8pK3QyngwRviMEuF4T0BREnZpjlDy8NwiqHo8JOMPIaowKSkKNBJq2mKgGg/O5K8ii2QUyy8WUqZ/Jpys/mXtT9b++t4m63+0VVBheIlk/S8kop0J+w5KJ2o301bUsVho1v+qyCIZxfKLxAT4/0z/yx/m8F0kvsyQrxehwOkoAZzC+TlPKj49NIGPD9VvCtGj8VsCOEZYjysVnx6ajL+XQyRdlVFKUFEwrBLAMcJ6XKn49NBk8vdyyOSvyqA6klKUSDywSgDHCOtxpeLTQ5Ppn5dDpn+qDKojKUWJxAOrBHCMsB5XKj49NJn+eTlk+qfKoDqSUpRIPLBKAMcI63Gl4tNDk+mfl0OO/ukPc6h8UlKLcCMrPIEEHJNnGqNkX0w2MRsPhcF43lPSYFwx7N5fxj+Tf8mqVjAk0z+rYVn907aLzU3W/iTqStb+UhhZ/5NbL2IVyfp/bTl08BO5YuGsx5X1P9bc/m/0P/hhOP5wYAGjL0EQXjD052ctSa0pGD1SE1iFLmFrajL+kegLCjCTf4maiYBM/7QK6aeg+mT1TytX1v5k7S/qR+EqAuXQgIKhWfubtb+F9YaNbtb/aNejn4LV58/b/5TSM0OW/FRBMiepUPgjBFiazyS+0aDN6TYQbKSdh2YBwElxSCLqjdRUaMY/k7/XMq9eQR09MPHN9C+rf1n7k7W/2kkVaCay/sc3lln/m40/bExBjcjGXxKvEFMYbEDMpoBKMB6lZMT8kFxI7A8uc5hdAm+CPUrJiPkhuZDYH1zmMDvjX6IEvIhKFlR+SC4k9geXOcwukXtW/l5EJQsqPyQXEvuDyxxmZ/IvUQJeRCULKj8kFxL7g8scZpfIPdN/L6KSBZUfkguJ/cFlDrMz+ZcoAS+ikgWVH5ILif3BZQ6zS+Se6b8XUcmCyg/JhcT+4DKH2X9T+WOFODLm0MNUhFEy/KOBnXB61BJWb4FopHxcfmOIJwO/OhK4hpLxj8RGASWEnnB6UWXyN5F4gZkvoVORJDP9s8plGpXVv6z9YeVI1BVTkaz9jVoNtidxm5J0Zu0vRZT1P6YdXmHMl6hTPkBlZU6PlbW/f9b2t5QlzAosHjyw2odWMmy/BZCGxkqQxDVafHDam/jRDaUIsN+1ihXD4qTpZPy9XND4xKIIooqbJMo5HyGT//+G/hUXr5V77rlXmjdvLs89/3xUvizPIlm3bp3Mmzdf1havk/bt20vzE5rLjTfeKD/9tBKhcf6y8s/03yuOyQFtbNb+RnUp63+spVDtgCfrf6kakIYKxqQTwVRrKCmrS1n/+3cZf/hfqksUvSqI1ZqgEKohJX6oToyi9+DgMDtEMIQASDtSwcETHGnkAj7DNL5mB1RDCIC0IxUcPMGRRi7gM0zja3ZANYQASDtSwcETHGnkAj7DNL5mB1RDCIC0IxUcPMGRRi7gM0zja3ZANYQASDtSwcETHGnkAj7DNL5mB1RDCIC0IxUcPMGRRi7gM0zja3ZANYQAiB0c8D751FOy2aabSrmy5eTSSy+VJ598Qlq0bAGkIunXr59MGD9eJk2eLFWrVQNOWbn77rvlwAMPlBdeeEEJGXnja3bgYggBkHakgoMnONLIBXyGaXzNDqiGEABpRyo4eIIjjVzAZ5jG1+yAaggBkHakgoMnONLIBXyGaXzNDqiGEABpRyo4eIIjjVzAZ5jG1+yAaggBkHakgoMnONLIBXyGaXzNDqiGEABpRyo4eIIjjVzAZ5jG1+yAaggBkHakgoMnONLIBXyGaXzNDqiGEABpRyo4eIIjjVzAZ5jG1+yAaggBkHakgoMnONLIBXyGaXzNDqiGEABpRyo4eIIjjVzAZ5jG1+yAaggBkHakgoMnONLIBXyGaXzNDqiGEABpRyo4eIIjjVzAZ5jG1+yAaggBkHakgoMnONLIBXyGaXzNDqiGEABpRyo4eIIjjVzAZ5jG1+yAaggBkHYkgzdgkM2D6OZMwK88xVAfIYqWxy2Ob7/MaDbp6RQsAigFfDwPH8pvzMnCIl4RivdFsIw/BJaUWCw/A5vtxQe5ZfJXUagG4fNn0r9Vq1bJCVgZrlWrlqaxz+efSekNSsPty/j9D96XU045VbaouoUce+xxSLyTjTbaSC697FJfvAEzFLMVdxSelb8J5M9Y/iykZG3O2l/KQ0sq0l+ovMoogmXtf1zRIwmZ/li7b7YPhtyy9l9FoRqEz5+p/WfCrPzozur//2/91wExC8Ibnn9h8eAvan/oCDCEOFQuK0Brm0zRQkBEzVvE9sQ0Hj4WP4WmngSvjH8kqIRMKMlM/kF//gr6t+GGG4bB8MIfF0jlSpVwdOIErTLrcExi2pQpsteee4aqwvIvU6aMbFmzZtiJyeofqkpoL4KoIkfW/mTtb9b/sDPJ+l80Cdn4I/SfuS0l24kw1gvtaQKGCH/18Qd+mCNp4lOJlBplEo3KApJWKvVBUBGOwuKAgBs7jK6nSLi6Ym+EanjwRrQz/mnBxr6/r/x/GD1axo0b+z+lfz+MGSPTpk2N9Dxf/z/88EM5/vgT5PmOHaVf/36q9jNnzZK69bYNcehg+Q8bOlRuve22/4n8jxw5UiZPmhK1JXGFz+o/CjIWB4sW5s/T/vXt11dWr12jadKkRZ+s/TFp/Gfa3+UrVngGELRXj1jiDIh9/xn+QSUz/pn8VRNjjfs76J+eIWZGWRHSWSeUhhcSOG9IYARncHjU8C0J7ul5TmmctC8QguN/kz/z0+vjT2To0G+w3V1VShWVljZtztH8lJT/n1b8JC+91EUqlC8v06ZPl4MPPliaNNknyJ8roh/3+liGDx0uW2yxhZQqXSTnnNMGNGPz2Wefy/PPPwsWRbJtve3kn/+8UcqDXmy8pPGT3dKhw3Oy4YYVZO7cebJ02VL5543/BG65GBWuuXPnyLXX3SBdXuwMX6QhnoSGvfTSS1K37rYycMAA2aXhLnLWWWcBL0JIUBozZqw88sjDsnTpEtl8883lmmuukW22qRUwZs+ZI11Bq169ekqr4a67SuvWrZVWUv++H/W9PP/s8/LAAw/IhInj5eWXX5YJEyZFPEmOaSyWzcBj990ayYknNpeNN96EAWo6dHhGOEhbuHAh/KWQls1kn32aSKvTWsmqlavk3nvvkenTpslKHGUoVaoU8lZHLrzoEqlZoxrwi+SHMT/ISy92ldKlS0mZshvIDTfcIGVx9tfMs88+J40b7yW77rqbgdQuxi+k33nnHdKs2QFy0EEHA5aWEX1LlyyVm276l3zau7eMwqD/KZwt3n777eTQww4P9e+bb76RDz/4UG6+5eY8GspIP2naMZwuCzPbh6Z9yRi/vf4NHTpMXn31Zbnn3ntlg9J+M+qrr7+SD95/Xxo0aCBTp06Xyy//B+RXNqQqyZnuZdDLTp1fxBnrjWUiyvmYY4+RRrs3ilTRyY8//ogyu19mzpyhUU844UQ59dST4Y5bs/fef09efeU1wJzsvMvOct2118oGGzA9MU4y/zNQ926/4w557rnnNE5S/6ZBNzp17ITy3VWGDR8qF198sVSrVh14sVmLgeSLXbrIpptsBv3Dan9kHnvsMfnhh9GoA0uxuk+OpfDnOe/deG/Ze6+9UN+bGLosXrxYHn74IZk8ZZqsXbMK8CKpVbuWnHryqbJ7o91l+PBh8sYbb8gkTDhIp3LlytCXHeTqq69U3LVrcT79ycdl4aJFsmTxUrQVZyPdDTWM+NOmzUD96aqXNJP5B4LKlbp99913of2qFvSPYVGSkw4Fx59canFIHDmNk/al8SdNnipPPP4oZPGIDwjIwZGMIIMGDZRur78uVTbaWM47r01oZyZNmgR4N6kPGXHAf/DBh8pxxx2rcZOUli5ZIu2fflqWwN5hh+2l9Vln5+WfYc+hnd16661l9OgxcvLJJ8nOO+8cpcPJ6jVr5OGHHkFbM0LV7LRWp+PI0zEIN05OJk6cLLdoPWbv6oTt/zXXXC377bdfIj+/vf4liCScMf+S9D+BDGfGP1n/VTYmwlCWaYnFZZwLp98im+1x0r5kvEz+/1X5Y2CEtjlhgjc4EoFpZxqjOE0pFQhP5MfAIMfkAII3OHLwY28a4z/D//33348Z5rh+jv8LnV9whx9+uMMZUeR9nbug7QXuznbtXEn5Z+rPOeccd8ftdyiXFT8td3vvvbfr1atX4NqpUyd3xJFHKs1iEDrv/PNdO9D0pth16tzZ4ZypwyDVndX6LFeuXDmHASqCkdIoseTPv+uuu9ZhUKphpHXuuW3c8ccfH/CWr1jmOoMeGnyHbf2IR2xNnjzZNdl3XzdjxgwFYuDimu6/n+vUqbNHivjR8/13I13TfZs6dDLu5ptvdVWqbOzq19/BrVy1EqHFbtKkSW5fpTVd+S9btsw13W9fh0tjnlb0HTVqlDvMZKoxmZdi16JFC7Yn7qmn27tp06Y7pu3BBx7U/G+22Wbuh9GjQr6A7kaO/E7xK2xYwWEgleJBOT3++OOsg65NmzapsAkTJrhtatVy48aNc7gM584480zXtm3bCKfYzZs/z2Fw7VavXh34+UAQxf8lS5e6Qw45zP3ww5gEXQQkzMwZM92mm24KSLGWndKKwufNm+euuvpqT18xEhGBn6KU64n8zL+ZiZMmwpkAMCB4g8PQ8+w0Rpr/sKHD3DHHHBOlFZj4P+Srr9yOO+7s5syeq7SeePIJd9pprUJ+FBiIFru1a9e6E0880T2B8qDBJMbt3qiR++KLL9Q/f8ECh0mja9Wqlepvrdq1XenSGzgMZEM+WJannHySe6nLS65Fy5Zugw3KuiuuuFLj+09g6DBQdU892d7VqFHD1dyyRgLHO+fPn+92qF/fDRkyRAFfwt5zzz3d7Nmz4ff5/+qrr92pp56q+qXpUEyffzq/+GIgwopco0a7Q1en4W+q6927N/RmH6S9lLv+uus1RsgAfHfddZfSO+SQQ9yaNWuicI9BGR1xxBEa/nb3t0MY5X3BBRe4K69kXovdwAEDXbXq1VE3pgacK668wvXo0T341RHEUey+/fZbbcPWJngmkQNqFDHlz/VE/qT+eVopxES2PZz637hxY4eJcpJ1xDEJKnar1qx2V111tTvllFPcrJmzEoHFbui3Q91B0JUFCxYqfN68ua7hrg3dBx+k23fK6YADDnAvv9JV9S9BJDiZpsMOO8x1jtqnuXNBq+Eu7ptvv1Echrdq2cpdf/31rkOHDm7PPRo5TAjdRx9/nGr/r732WnfmmWdAd89V/b3hhuvd2jXrIj45cgncY0caI13/WP6xgSfy/1r5xzTyXSkWYJDy53oy/irATP65epRSlKCnCUduhOBPx/xj9I8rFZEpiXwOI0OnnY4SQnLB5vd28hui5BGLucauJLa6jXBOQC7Y/EnOBoujpiHG9cADm5WUzRLzvxQDuqpVq7q33norJHPa1CmuqFQpN3782ACLeTv35ZeD0Vlv4Ni40pD/iy92cbVqbaP8ly5d5rAq7LonOrApkyajEy0NmhPc1KlTXfunnoriqqUDbKyOhvRb/tnRlUIDzQGemW/RmBcVFbnBgwcr6OVXXnZz5szFALejq1Axf0B8yy23uEsvvsSiq33P3Xe7o48+OvAjcO2atToRWI2JgfF/vuPzGHCWcsOHD9d4N998s7vsskvVbZ87292pg3svCYdB0xodNGC1z1CC/K+++hodEHz7je+QrCSvxuCRg4/zo0Gr8V+8ZLHCcTktppVIdY8ePZXeI488inDTBOfuu+8+t/EmG4c4Pd7u7jbeOPZffdVV6GA/SFDyqJYe2p9/1gedZ0NMBjBohuHAes6cOXB5rO+//95dcsklDiv27tJLL1M4QxYtWuyefPJJtxqdPg3jjRjm5aeAxMf4Gcj83vbfFT+t1IGU4Rh/88e5jl0WFmwjHADeseKnnzDga+T69OmjAKKtw8Ct6X77udtuuyXAVqxY4WrWrOnefpsDuTQxcv3oo48xedrILVy8SOPw8+hjj7rddttN/fffe58bNGhQCFv44486mN01Ch89erROqowy7RNOON7VqVMnhxtJFLuuXbs6TjoefvhhV6OmDYjj/F933XXukEMPCfxI5LjjjsPE8lqFjYA+9+/f3y1avNhVq1bND8yVso9C/tMxAObk7YwzW3tg9J04cYLW/4oVK6o+xFzRDnTpovqKHZNUHMvEueeepzQnRvWZfDh4r1SpkuvcqbOhudrId+fOHZXGCEwKOZGIB9iMFRvjfyUGzdffcEMckHSlo4SQXLD5vZ38hihwGJaHGf/777/P7bTLzhgQb5tENqQAYz7aYEEBTxe6NdC1pCHl888717XDxML4EIYXXdz5WFTwpljbPrbbbAONP/HTKXOuW7durjomFyuWLY/iOnfHHXe4ZhhI07zy6itu2LBhIYz6sAnaicuvuAIwT20h6vPll18ecAxugJhr7LKwYOcmLArIBZvf28lvoASHYXlYzDV2JbHVnY4SgnPB5vd28huiwGFYHhZzjV1JbHWno4TgXLD5vZ38hihwGJaHxVxjVxJb3ekoITgXbH5vJ78hChyG5WEx19iVxFZ3OkoIzgWb39vJb4gCh2F5WMw1diWx1Z2OEoJzweb3dvIbosBhWB4Wc41dSWx1p6OE4Fyw+b2d/IYocHg49+z0cg63T7g4b6aI1x3VmO3D9GtoGgSPbv8BOYJbDAUAZn5vJ7+eg4/+Z+Xv02iZ0yxG+fQZgycn/5/j2MKCBfOx9dVUozHH1arXkLK4DNWz57tK0GRCD6N36/aGNNixgR6FIIzyr7XN1thWnioYwMpnfXrrNn+TJvtaUqRajeq6df/uOz31GAI6RkYN8q5Wraq0bNEi+E3yn/fti+e7yuA4QF3FJ//69XdEOpz0RRjN6djiq4qXDaoj3b5cfab1iw9Wd+WDjz6U1auxlRvlf/bsOdg+5vaqGafHDtDw43hB2QheJNWxxbxjg/qCgaEi8k3dDz/8WFaRVmTmzp4LvKrweWpvvP4azg2PE6ywhvz7ICQGxz9oomQE/pjMEIqjHXM13PKfzE8cL9Y/zAsifNqWG6fyVx4+WG8Ea2IAZNqw8ixHHXVUiOHDYgqk1GTfpkqnZ4/uyoPHN3bccSfd9u+K7Wusfsqjjz4in3zcSw7Yn1unRbJq1Wo5/rhjgHOvbonXrVNP6kN+5XHcxfgrsShdlmKGzZ41WxbMn6/Bln+sqsu/cJSGxy9ovNzi/P/00wqZPpXb9MkzpJ44v6tWrtZ4K4A3Y8Z0I6BJYUDXl7rK7NmzUvo/Y+ZMGYC8NWt2kMZlWipUqAAdqyqYgMAX8ycC9f/1bq8JBr/Y+q4CiOe/9dbbyMgR3+G4zATZvv4OOO7SOPDn0RjsysjcOb68t956Kzn9tNNDeZBn1arVpWXLlgFGXpb/0884XeuR6nAkSyu94nVr5c0335QDDmhmSdEgTFilR/e3SUZ22aWhbndXwSsglStXImX97+XuKXHrgYa5NUP+derUlW1Aa/ny5XpMJLf9Jb4dXAtRlRR55Ov/ypU/Cf9Yp1P8o3a9HY7vXHXVVXp0xPJfqP2nrHh0Z8H8eZpcTbUlPfCPAJFl/Arl3+QZ4wBL4+WX/3eoGxjo4ujT7shDlEemogD/Ljii8uabb+lb3RuU5istNEDEf/L6Cceh3n/vPbzr7ekQhomotlfkv2TJMjmnzTl65Asr0qp/pGDpNaZk/Traah5xwUIBfOTh9GLswIGDtK056sij9UiNDxPo70ZSCcdZTjrxxEDvWRzdGjFihLzyyis4nsLjW/n5B1Dh3ibnKBXeGSXN848D4xQbf5O1t5NfjVWi/H2oxc74Ux4qhUz+CdX4a+mfDoh5OY6GDW4hk4SqGwOGWDEAiQkgeqJZZeOrEUyDNNg+gVUcXZED3BxJqLr/q/zTUvkl/AfiDFvpUqWl6hY4d6oRnL4MsMeee0i/vv0K5n/Q4IFSg4PPhNkHg1821nyLduCgQTgzXFqqYQCB1lrlz3drG+2xh/TFJSwOLsrp+V8f9hMuZyxetESwopbmB3pF6ECxwijzo05O5Q+aTOqXX36ZSEG+0/J//PHNZeb0GXIkBoCTp06R8RPGyxTYd9x+m9cNRkX5F+G3EKtsVDkQwkRMhn77jZ59NGDz5sfL1GlT5OijjhYcd8DgcrxMnz4NF8duVxTyfPW112SfJk2kfLmyIf+eEUL5e4tE4l9C//r17U+A7N8UExMzzH+cQoXm6p+LBg02lFCywGx+wgmyZvVqmT1nllLo36+/8KxzMXz33X+ftLurHbB+Xv/Llikr++Jc+LPP4pw3DM+ifvXVEKlZs4bsh8EytrmhK2WlIQZXJ5x4kuKULbMBztF21slK708+kU96fyxYPZXttt0O4cx7lMJE/nv26CGn4KwpdhQEq3y4sNdcFuEsKRP+CgbevMSHFVq5DZfz3njjdeWzDGeYzzzzTD8479pVDmh2oLwGuZMsn4fDERZ9Iu7iSy7Ut5N3xzlpHFOQCy++SOOb/F/DQHb//faXMhuwrBjkcK5zkLo5GdJE+Bh6ZrYfznPSpGuaQOcH64RMSUT4+0IH1uGHTPr3/wJp4flchCbyXwF1YD+dSIhU3LASJmJlgINMwzD/lD8Hg0kTRzdOZnss+njGfRLOoNaojvQn2p/GSM8UXJacPGWyJoW8yE3zUkL7l6buk0+95ySkdu3aOJdayzNOfEmTeqZxE/yVaQH933LLrWTPPfZCvZqKmA5pnyyzMEnZscGO8uXgQYLVY8GRLOWQn/+Y8c4776J3EF7GwI2mIP+YADB+Xv9VOP6j9JRmJJBk+WNHQZ5q/zR09yrF8yVYmD9/tObue+6WU049RcbijP9NN98snTt1EhzNiSI4Oemkk4Tn11uc2gITptny9ddfQ22KMCm4UtXnjTdflwlod3D8CncwOsqtt94iffp8pu1klDxNB92DBg/w58Y1UYCATpN9m8ganB0fNHCAVNmYEziYqPw5EbzuuusxGWxG8TAACyM9BavIcsYZZ0idOrUFR9/ERYN1YiRNLv+k/mkG/wPyz/jHEsjknyOL3PbnL6R//qaL5pc11Q8VVAHw8RCA1ZFUi6idIUjD4rgMCZgQnMeM6fo2ImAg3ExMQ0Pxsdj/v/wtIek0WxpLyj/TzoYrmX/irsCqjYcRITa43ajtp8WgEB3iU5or9eYxXIkkBP5Y8ODgl4ZxuZr4Sa9eupo4CxeNWg05TbCV55NJHERsiIEMjiCgYR8sx/FtWxjjz5UMDzD5gy9H5XGpavB+GGS+1PUlXBQ8V3beaSdpjgFXF1yK48WekMxE/tmZDxowUJ7FRaUPP/hAKuPCy4477qi09t9/f+mKFZ4257eVnXAx5SQMPLuAdqVKPi3YmpTevT+Vf918k+LzE/LPpCF9ZKVOhHA1q+c772C16ElcdjlZLr/i8lT+/bCiSDuwV1/1l62oocUUMIgM5copnZp+0ifDIlyWayz3YZWWg9ZdsLo9evQopLurXgJcC3nujXBFBbqaRP4NTvlXr1FTPsKFy7VYdeRlszp16uCvNqLE9aTedtsqrf9r70rgvyqq/fxRS0BFDLNefggRpB6Qe/Y+CoLaczdNK0XLhXAFNcoNFdTc2ETBJZ9L4uulaApqKloq5S5YoiKgKFjmkopZgpjCfd/vOXNm5t77+wm0oODM5/+/M3PmzJyZM2fmN3fumTkAYr3fCocNuzDonZWGqAQ1zifL4M7uYBxaHIwfex76gn642wiHFaHC4w7r398d9N3vuUcfm+aun3Cdw6deycWCJuCAFvQc3Ruv625gG+xynnzSyQ76kFjcruG2xgLqtFNPde3Xa4+dtIMhPw+7s88+x40dd5E78UcnuM5duuDLyHz3wP33w/LeuaiK1VPbxbqy/axjdC2wuscxEdtgKCb/mqR5LCd3P6UYyaZ53120yP0ai5irr/LW/jx9LuZvufU2N/z883F49B03/cmn3JZ4kSy7hD7lHYtMhfiqkZj+STapB+MYf1ALcux/4hOJaZLX5AcQK4vtNzxi8+vIbCziBh5ztGsH4yw/wyHRNfACRGd5dPw59yIW3ddfdx3EHSmQR6GDIFQlSvJPON3ll1/mTh86DH14kpv17HPukosvcVtuvZXbGbvoV1/9U0UKT6WmTwB9PblwXrttW7woPxYwGRAaUgFGYl6mGH2DE2blsv0JRlJmLIP5zzz7LHfAgQc4qJCgGMsd0YUGH0h67tln3dznX5CXp2dmzcZGxPp4QR0uB1R/98R0fGnawO2DBfEYHMqD+ofbpNuXXL9+B8r8xU0FursnT3at0dYb8RWgK8bKa6//2X1956+7M4ee4aDShUoLRcHlI6XPdlpXLxALkor2yit/cj+/foK7YNQo95XNN8OY+a5bp107af+DOIQM1S18+Zvixo69yA0bOtS14KDuqUNODWWHVkvgw+kbj0vc9f1iacIuPJaF/6xEpk9ewWX+gxHCCRVsPCXGh/BGJYXPknSthPInM682B61DIG23TEQEaFJj4SBTPEKatypEyhtd4IWhpoQVtUEZK5r+49Mex0JiMBukDhPxk/hstz0+vfuqStX7D/i++57cgAC0hu33DNNEKUsnTF2KNWo/lAvkx1WK8+RbsJsq+y1gLOnLQyqSYFXoc2cFB8nc7rvtLrt4e+6xh+yGbNJ1E9RV+d+7dy/sDm3tTj7xZPkkzd2ku+7+tZTf3S9SSY78T+kLKU+fP8pt8GN1PBZdnNx/joUlf7fGXztedsOlrqlALHa47aGdnKTnDvHgwT+QH6rv7P8dB+0d13atddzg44539z9wvywKFuOz/rXjx7vV11jDLYIqxSIsdtqsCRWBJu1ny44YcDjq1AY7rtPkM+W99/0Gi1jdBdN8qfwVbrWW1dwWW2wG+uxGtI4NgAddVKFD/otjEgKt0J5Bg451g6ACYo58OBqLmeHnj3Dv42Vk8l2T3SOPPOq+1K2b64fdn9XFyIawXh6kszUWJbxxYMZTM9ymm22qVRP6QBEma+n/qPzznuLD8KKy5Vbadu44t1urHXaYp+DUPdVq2Br869fjQL/Xttu5Qw85RInj+dnPdHAvQSWCu/8bY7FL2aBawpexy9inTx/Bw8EsNwYqHu+99z5bAHWKd+VlqzX7SiCCBlnShumT9BGCR/UUxmJcIgoJ8q81Zl52kTjzpUAta/xPr3Hf2m8/16tXb59BEuUlcQN8rdlrrz3duHEXu1122Rm3vzzhNoTc+2rA0zLIf6kq6ybyAIAmSZlKHwBzPsivCglUceUWCUWM85/G78ZtMdtD/eJPL7+EW1JewI7kMPfLXx7voKNuJSf0teT24P1mUB8oE3IY7x3AwxbOIDEJ9eeLL3cixZFfqMQduKEEB1rxib+jm/H0DHf7nbcLT/fB7RybdO3aUP74ovfgQw8l5SQtlSAeKB869vhycScJIU4GMpGE6SHMtwek3YCbHuRmDqmTYqT8hw4vvsS873pDHsWhHF+KR2a53iFIVQW2/xC8pA04fIAk8EW/R8+e7jKYO+dL35IPlmDBvIE78YQT3G233eouu+xSsfp4wZjRqFIrtO8R1x6qOTgHIWokUgrkb9ToURjvg/xCFkVLRcr02Sbtf7bC2kvUVm6jTp3crrvthh3ra9z+mOtuv/0O+WrGPO3Wbuf2hin2XXfbVV46R48Y5Y4dCFpQsaCryp9QFZ7V6ZNsOndINRJAlD/mlUIqHuCVMjJ9zxBlDXrMWCchxtiN+qjwLvOfbIl8WlnkTxbE2tHVHtUGAap9Dl9cbKNBkr5PsCt4Mh/Kg9l8onLJC9pHT58qDaZDa43r07evm3LffTaFGLjkS6uViaFtiSwILpvOHwXiNm4/fiwqPAsCJXl9tioOwLpoZblYWGKRihsb5H8vqCLgcJN8Nj/xxJMwwSIz/lbHbt8kfFLnlWy9sXjASX7sVK4Gcvj0hyvIgkNc6pvS9GF+SueOy2P43M/F6xn49H7++ee59Tq0dxePu6TWlpbVWrCg6uG6d+8hnwlxOh87NNc6Loivw+fYsVgg4tQ+1CGXYFdrqOzw8Hq2i8aOxadz/2PMiqV18RXVJVWB3efL3Wabb+6OOPwId9WVV0L38WLsBF6tepLIZ+23ZQOvreuG3SJx4QfcYcdutsJ8+0skSxEnqgedN+4M/e8vydVLG0Jv9bxzh4MHY2Fhbl/RO+UVX8J6z/82bdr68hNpSOhrIp7LQJ+4jeTvVOymU695OHbKaODj7b+97RYu4E4snW+EjD8fA/1uWChxQXArdtdxuwl+5Av5ZJzqdqNKKhNaEK7ta6MhKauQlyOhUOFT2G0X7Ehfmk3Yh7RfsvgH6Yf6exjbz+ut7n/gtw4n/xWa0OcCo3ef3nrl3Q47uh0wpnH4ETv9XPZ4aajQV7lX+ZeihMnATspVQv7p2291UzwpRRCs/w1CXWdesciXJ9xY4C7/yWUiP+mC2Prfuouf4qk7XnXrtOMCiqPAv+EQoVJP0n8X/T9u3Dj3U6jf4GYLuQZyypTfSpt2x6KNX3i2xtVvwaERrC9fMkOnV8olrrAG8FNOOUnmlJA/CQiOPBJgg/l/IXSoKbNjxoxxb+LFlFkof4txhdybb6rhmk99Wnd1rSTisBa9t+9lINzf3VkW/nwh4IJ4zEVj3P1QV7sF5y34lQMH3OTLBi1ADhkyBNmXuG236y1zhRXChSy/aE3BiyRVjsRJ+8tMEPpoi85DPjdQqAZFVQ3+d8CuNb9QUPXmPz7vVeN8+2mO/YxhQ90WqNvCBQvDgtj6v0StFFFawlaBSyipp68LPJM/lQtfSAP+xxwI+f4vkSxFFDvTt3kh8z9MPBU5WVnkT3SIRazTmZ796p20C/FK+3yqIsY0W/BZ7ugLjiEim04eBgDeKkSfd9uSM/wkbg6nGDHBvwm9T3z6btD+DpiYcYWSoitboeOrh6G64j7hz67fQdICDmKLUf78t+a7bl27eTJl/vfEDgkXnqRX5f/ncCDvmmvGi17k6NGj3WwYutgci8le2D2WyocSEais1al/PAz6vUcdrbqjq7VqJTpwxxw9EHe3XuXv+PUFpOX47l633bpu72/ujTq1kjZTj/WoY44WTNzE4c7+8dn41H+k3AP7NvQ+V2+1ern+oWhllC1w6bdgt2fEiBFuK/ywU6WDB4Lo0vZz7UMA6QdXlT9fV/GMfwFZA++//3d3Nu5pPe3U0+Sz9aSJt2CR0R8vJW1wd/GR8uOLmzQEOaUv/F0afU/rw+hbRwmOp8KmcSF74YUX4jPxPvgh3wsH6IbgHt/1PBOIgD/8GFbbP2fOHNen7w4w/PGE7Iz1xcJRXNL/sm4MAqKMEb4LYgvMTq8hBFiP1K1v8ssxQfpSRovIeFfsTDYa/3wh4hcPolobX5cxUbiu/OIhZTg3B+oA3J3kLhx3wxs5yY9Hb6jnbNx5Y2l/LBU5Kv1vUckH+m1aryl6t7jBICm+cG/g8CzlmfeCszxrt/hWaUnRh4H0BaEFhwK/JupNr6Mc3uH99tt/tWYJHcFP+C/A8FBqUf5bBfoBxQdYDscD9Vipx30R1Fx2wgHVjbFw5OHar0EHll8txFkjEDH6VFOuO6NvKbH9BjFfslsZyGb9b+nG/1dxIJIv6xt13kgOOK4PGbhhwg3uDy/Ow6KyAw4f3xCyGKO4s00385mZpfZ379FddN95UJGqTvySQ0cZuRQ7xPt+cz/c03yxqOx07baJw7WOkm6F8OWd7r133wvyxzjnd97xbPTZLM7V7IcuIpfEKrtDDz1EAMKCBu3HzShywFT4UOU/4sa6cqmKGNP+ef5L+Zl+YLP1V+RxSEIg85/ciLxZ+eUvWRFo/0oXWwtl5VBqMdsfHZf93qlo8Ec2cTawxOcjvkNz8rDkkAMAgVkhHwv6qIzVJ1TUB5q0f29cxs/T0Y898pgiolGLoCc5+9nZDndhCqza/n2+sQ90Lx8otX86LJKtiU/P2263rRzoouGIqVOnhlq8u3ARDpE8C0MPfT0v6/xfgsXrNl/dBnnI2cb8nzJlirsLtzxcAaMSdf7X2497Nt1cnPL/3AbxECDzHX7EAHya/EAWCVJJKcyTrtBf/P5i99X/2kZ+sObNw2EllgV8o89d3sXgIXVS2X6BJxtgWr51jPpUvWCoffv27pcw/vAZGEb4EXRpJ02c5Cth7QcWClwiOyRSkj4S+kyXT4ZMMTIJKoM8bb7XnnvJYuiZWbOQJfJf6ovHLMBZlj6UPttEndy119VPo0wVBzxBNXr/oPw/il173iBwxeVXiAGMQB/tlfJBjLvl1fYPPGYgdLvXxmHGoTi8uKZvPypj9WElZcbwAMq/r7N2TYHDdNtFfCMG/2v47L7B5z4rh+FYDOWfeuVPPjldDNAQZmUZvX2+8Q3sOD8UywMKDyKxf7eATia3vbjYob40dUY/9ek1LKt7hIdDE/oawR4qeEq2brO16nsLXXsALlnYPAYS/rfHCwUPCj7w4AOGjfQWNx06qlvipbPdulR1iP0vSCavUqgU6KuE1iOvgIE4cOBAfCo/FoY2prtvwsADLhpSGgn9UISm+HTrGPW5Q2wQQTAC8GkQZ9ItE/ESq4vC2TAmkfY/6zNrJmUYzgrx9Lnop6GbmkMec0qq0v6EvmdoaHN1/pNygP+FDb8gfcyXMs5/T4C/e0Dta0MYwCBsD29IQ/GVPo3gkP9z580LVWf6B3//wPXt0weH617DS/p86O5vUKI/4MjDcbsEvpwsXOC277W93E5CPXQrZDFeeFu1Wk03CYSgPnC1G25MwYHdpP2/h1xSJaP7l78cMZP2U69/4y6dAx+r7X8dxpHWxpmJtXg7ibE16f9YaBJK6P+r+C/lZPrK5Mx/5YPJQyJ6ElwF5U8XxDZw0XBruw6MUswLScIVSwZIgwmAaBYVnw9OAxEe1iMfa/qsnFWwHAztC03SBnf6Yif5DHoXPjuLA5iLsh7de+LkP6xoIT4bC6Wtt9xKr75C8dwx5SdRqmfQkeLN2CkZAH3lz2M3l7s4O359J1i/82UinTcI8Ooy7gSyPFzqHz/3I/0+LHS589Cnbx/EWLc6/3n1zyD8GE+4cQJurNgiNElajG0yXh/H3SzuCotDAm+02AV6bzAEoDAp2bmpj00Frb7+9gMF8laGH/7ohzjo9ysBsBZ/xA0SPAjzw+MHi4rHzv+9q7tp4k1SRabTUX2i7447yg5Wm7atxQrUnLnPl7rCKsudcrq5L7wgPh88WHP3r+6GbvJa7vvgIS7mB9Tarz/cotJIZGmsJEuR1tY3qEsszhAQ8cF3FryDT65j3XH49ErHz/C8Xomfdenegs+dqG2hvqL1jPx/esZTrtMXv+g26thJcK1M4ln7hYxtUwYEoCdVCcgAaz59vvryK1Iu7gMWnzrAXBS4opXckkFkqsi8v+jvcvPCH2AJbQEWBbyF4D0sCHgtG3dCH4IuJwlyocUXPHG2yGME5SivYDFO2t3iYFRE+h93XFulxKeayEEHfg/ye1eAz3jyaVx99Wd33LHHS9G0lsgdXNzzKs38Fq78otW3ab+bJumsCcfRoEGDcLBvPcdr3xjGXbWwCtfeLcDhS14ldxmsjM2bO9f9/onfY3f8FAcDJFpZVJjX3e0N64W8zq3Z/MM+5MKZ/+rU59mBhx98WBbhhJNnVC2htbGU/9R350KdqkTiJJEPvASIrMJKmT8IJ+kofvjI4XIA9N577nEw2KB5ff+buon8/liVmFGJypciRufjRavkfDrxRgwf4b570MEio4zvjUXd/NdVVsnsN+a/IWclLIuQ8fSfgrzKDQksvAF9gjWf5SYEzqLi82HjT1Ib8p/qA7x5hbe3fAV9tOmmX3HrrreuWDMknHrUdLwibxhutKHDXdVQkzocfTtJvo4QRtWLe+691x0MnXiqT/DqtptvmqRV8vWaig2LfffdD19POrj+A/rLVZKP8DYUODZzElSHdt11F5l/BegTeDMEd/RptZKO44W02W88V4H7rB2/upkZZr7gjBs7DhsOV8nVmzyMOvT006HCooehYbfJnXPeOW4IrFSuhfx0A9CeXjgMDWMxiCVMT4KBv8DQJvmGsQA6i4rPx9L5b1mEzD84/wjtTD/z34RpJZI/TiANHH4Kqq4BSFAEniSGYAiEK5cjxK5BrhKxeIrpYQ1AK4I+dGW1AstJ/+2/vFXgDk+5nJ8X/sMkawFzvNbAYurj0wro+xZ3wXqROV7m/m1YuZow4friHBi54CXzmBAD/bfe+ouUeSUscf3sZ/8rZc6aSatnS2CcY45cFk9DHNhxKoYNPb248sorJa9V3XwCf/vA/bAad1px5JFHFlOnTRO8+FhSPI/ymJ9GEGip7tv7fau45ZZbC5iTFTQslKUu/Q/7fnEHjGVgEVLQcMA7MCCiTqnRahN20MRq3AH9+hVDhw4VAxd/W2B4BSy8aVm8JB9mfYtLL72kOBgW9rCoCFU695xzYc1u2xBngMYHrvifK4vOG3WSOtLa3fjx44u//pU8U/q43qxojfrT4h6ujpJL99lmGhvBjRhiTQovBVIuL/f/xY03Fj1hCKAt8nTs2FGs1kkfpMwD9siRI6TNSkYTyS/ohha4KaDYc4/di3POPVfKtaz0aVmP9TwBVqmaO8uRYDQASarAk0QEFy58t9h8s00LWumjdbNRo0aJ1Tjs8hXQIZVsT814WizidenSpYBpZYGRd2vCuuHmm28GS1vfEaMWNBZDYyvPzpoNwyCXSJkbdeokMkojMocd2h+8al3gNo/ipZdeErZTrnbacYdQeavde5AFGiPADRTFxFsmFVhkwfjG5IBHS3T4RA7DGKMDDPcyw5rdAeiXXxSnnDIElr0OKvC1RdL7QZ7atG4r9Cmj8t+6TQFT6cV8yCfHE9QuCrYbO+YFdNPF+AYzW50CIQSwm19c/pOfiBVF9j/lmZYqaUDEMkAFpxiE8UU4LaKNHnVBKA0L4WLynZOLQ2F5jDyhdTXiz4CFRbopv/mN5GE911m3nYw/Wl80R6uPPXv0QDtai/y//PLLxXXXXVfstNNORVu0q0uXrhgbl8IK28uShRbyxlxwYbEejMWwzB1gic2MAYUKA5PGRmAOuMDup5Eq/vinlwp8WZKxiN31ok+fPmI5TxEid2hND6bfC1wxGPKWAoIa8Y1PKX1LNZ/503CpPImUU3EQtOjxn91LaDgULLKgBS0pyHu8nBZHHXkUjOPcWRx37CAxZMNMLO3FF18s9sJ8Shz23YhRI8Uwh1gS9SVT1nADR3HttePxf61YwGQfiCtXSSyIUhYn3jyp+AGMlxxxxBFqcRF4F154UYHr/wqYci5owGjYGWfA8NKjoc003sP+T9PxIuRrQW9JgZ1tMfoD0+QKr9APyAJPEkMwBALdCFk+/gutNHMgjoDAk8QQDIFM3/MrciTzP+VFKk4abpDaACS4Ak8SQzAElkv+sCDG+2vMGzKnlbRk85lmYfNT/HI4xUjDhrVq06dpVlrMUrds7ae1MjOJzHyWy3xapZuJH+80TSJ4PP3006W8MXfEhhoFzM8+6rP8c/z/YDEtPD1a0NxyY6e15g/S7NnGhxQz0od+dPEwfjiqZbGEV197VRY6bDud8cJ8ATZ8pBhp2JAjfUIaYyhummaLnBRGLLaBlq7iYj7F0BcXvgi9hvZYqf+u8QedSpBQ+lzsP/ccX56iw04ozA6/Uhr/2BX3pogVbx6sIS7AApuu3BJNT2EK0cUHzQTDKEjDXKT7OF4IrYRlaf/0J6dDBmjRz3KVfYPX/SViERFGGJDUqLbL3/9cROHKwgLXxTUssVyHlGYaNqzlp8+cVpL5Vlrdh0lxLIjVAmYd+/nn54ilS8tXxbhg9AWwzreTJKdpFjbf8tf9FCMNG+a/tv3sE74IRZfSXCJ9xvEZF8J1+txc4Mu2OSvBfMIt/Disfr7xxpuGGnzW41HMizBcFGAxVxHqwfRG8s+XMBjUkbxGy3wCLWx+QqQSTDHSsKHV228p5lsu8wm3sPmGW/dTjDRsmJl+o/437tA3rpnfDJbmieFGuWIqS8/0Iz+gJmnfBfmRBHvb4vmwfPtI4QSkaYKwXI+QGwF+ArRd9VCuIASsSC+AQmC56BpyyI1Apr9y8Z93Bt9+x234JPl/1p3L7X/U/X8M9EVpXOJA3IO6Ksvf1TCMwE/D1EtP3UfN/0zfj/llmP+okrLjjjvIQbaOG3aMGZNZO+3bZQln/kc2rsrjv5ks5P7P/S9rvmWYf1SGvMSkgvNvnH9Uh1go+6WpePHAh+8+wWCdLG7LaEIUrk/Gg8qTgOJBHiYpFSQg4CkSDOdj4mX6kZuRSwrT+CeR//v321/06vAZOZx3ouQoXyLHPq7ydw/0Q9tA//pA6D+u6vJ/2GGHuZ7de7qbb74pdEcc5egriHGU7JiiwDz+ozRHLilsxY3/s848y5115o9dR5jLplvR9IVoIiWZPjmy4vo/8z/ym6Esf5Efq+r6IyyIy8tWDLu0xZ4PcWoGIJxIsSGapFqa+F6Rn2WoRME3XAMwKYaFXKZPNkQHlhnXBGg8RkThSaqlrYL85+0TUKlwz8ycEXizMrR/1syZ7oU5z7uRI0d+YuT/2OMGuVdxmG8O7kMWZ0M8j38vu8aQj9/8N2niRJhS31UOB0tlMciSGQaRWPeVYfxl+QMHrMvy+PvYj7+8/jJh9V21guafFiqolGc6HTc2+VGjggYb6FhFgwsgedTSKoBKVHIKrEFCCsr0M/+z/OXxxwkjnReSqSfOJSmwglyJxjwNElJQnn/y/JPnnzz/cMJI54V0qmmYVkGuRCW7wBokpKA8/6zY+YfWPhPHrkgXvbEyFIcSKhEVnaEkTYH6Eoqwxynl9bu/Aisn1MqyySjTCFrgKgAABTtJREFUz/wviQolJcufjBc+Im/y+CM/8vwjXAhjJMoHmaMyIrByAjOVZCnPv8agPP8aJ0RI+Mjzb2BF5E2ef0U0hCHghZeRyB/KjQIFVk4QfkbQil9/yqG69C0ktMCmRdbdf3r3bbMUaatq+1kTBFkaVXpIRjzCvYalVPCn3HBN9WVKkVquFIPEMjVN0zxpOKEhGfHI9BOmxGDmf5a/dOGjkpHHn/BBphSdV2QaATDPPyohkStljmhq8hTG4ZHn34QpMZjn3zz/5vk3nUM4Nj6a3x+9ZUJmtmR6kwks1ikO3eahUpZSpJ6nlkxAsugO6mnGo3oRNUipzFKkhmovLcZyfQfI9NkJ+pKzFP7VOVp5jVpK/loyAZn/mf9Z/vL4s6mAk0ye/8mFZXKlObUUqWevJef5N//+5N9fDJQW10oGh0w8OvvIkohBiTLVD5+yF0aZgvGGxyweRyMBRYpID82RhlLzUIkoJNMHE4WZ5B8Z6pla9gJzFZz5LyzzPIr882wCPMufMYfilcefzjZ5/hGpEGYoR/L8C47IZMK5g9zx46bs+YnFUvP8KyzzPIr882wCPM+/xpw8/36sf394MbN2EZ7sM50Xw4BnoAm4hPNhkVJ+RugCHU2VZwlR0fhsAo4ISwmV8jNCl+krHzx3hUclRvlkeE3AEWEpoVJ+Rugy/5UPmf8iDCIjJUHx7IHXBBwRlhIq5WeELsuf8iHLnwiDyEhJUDx74DUBR4SlhEr5GaHL8qd8yPInwiAyUhIUzx54TcARYSmhUn5G6LL8KR8q8odr15QzzRbDwjuvBM28xk9f2lK92BnJbkzoDCldysj0wYYSXyJrwxUsmf9Z/qJYLFMojz8bVnn+kbmbc0xpntFInn+rfInDK8+/Ijny4+9DkTlLCeX5x4Zbnn9WhvmnhYb9SvOjCTgXwZLQMNWvqw254qejpmF2P0zgkXhjlEw/859y1VA6svw15QwS8vij4KhrKD55/pFxleff/PuTf38b/8Lk9c8ncv3XSnTG7Mej9EPKX5JSKuIeAZ78zqT4VgZ9bjcAwVbaNTRLkMGYpCZBPZGc6acsyfz33ICX5S8Ox3ToSTiPvzz/5Pk3//7IJBl+NeI0kX9/lRd5/VFe4aWLDbkR5pO3/oo7xGQGB5D5cfjUQorSHLGeUoXEeAhZwPwa1QhQlOaI9ZQqJMZDyALmR3K1kKI0R6ynVCExHkIWML9GNQIUpTliPaUKifEQsoD5kVwtpCjNEespVUiMh5AFzK9RjQBFaY5YT6lCYjyELGB+JFcLKUpzxHpKFRLjIWQB82tUI0BRmiPWU6qQGA8hC5gfydVCitIcsZ5ShcR4CFnA/BrVCFCU5oj1lCokxkPIAuZHcrWQojRHrKdUITEeQhYwv0Y1AhSlOWI9pQqJ8RCygPmRXC2kKM0R6ylVSIyHkAXMr1GNAEVpjlhPqUJiPIQsYH4kVwspSnPEekoVEuMhZAHza1QjQFGaI9ZTqpAYDyELmB/J1UKK0hyxnlKFxHgIWcD8GtUIUJTmiPWUKiTGQ8gC5kdytZCiNEesp1QhMR5CFjC/RjUCFKU5Yj2lConxELKA+ZFcLaQozRHrKVVIjIeQBcyvUY0ARWmOWE+pQmI8hHwAO8TeWUCUyQgjBv/p4CdBRW3y9gBEK0rz8hkhWgziEkhwDSXT92wjgxKmJ0FlVea/sUQZZrFEpjwns/zZ4DKJyuMvzz8cHMlYMRHJ86+fNTifxDklDeb5lyzKvz8mHSowFkvGlCYIryyoWHn+/bjOv/8Prpiy+JNFP8IAAAAASUVORK5CYII="
}
},
"cell_type": "markdown",
"id": "e2406ca1-e06e-48fe-9fb1-05ae01429d44",
"metadata": {},
"source": [
"# Assignment: Calculate wet bulb temperature for CMIP6 models\n",
"\n",
"Global temperatures are increasing due to the effects of anthropogenic greenhouse gas emissions. This has many potentially disastrous consequences for many people around the world. One of the concerns is that in hot and humid climates, depending on the humidity and increase in temperature could lead to fatal conditions. \n",
"One way to quantify the combined effect of temperature and humidity for human health is the wet bulb temperature (WBT), which can be approximated as:\n",
"\n",
"\n",
"\n",
"[source](https://journals.ametsoc.org/view/journals/apme/50/11/jamc-d-11-0143.1.xml)\n",
"\n",
"[\"The wet-bulb temperature is the lowest temperature that can be reached under current ambient conditions by the evaporation of water only\"](https://en.wikipedia.org/wiki/Wet-bulb_temperature#:~:text=Wet%2Dbulb%20temperature%20and%20health,-See%20also%3A%20Effects&text=A%20sustained%20wet%2Dbulb%20temperature,to%20gaining%20heat%20from%20it.). Simply put, if the wet bulb temperature gets too high, the evaporation of sweat can not cool the human body sufficiently. \n",
"\n",
"A sustained wet bulb temperature >35C is likely to be fatal, but lower WBT can also be dangerous depending on other external factors (e.g. solar radiation and insufficient air flow). From [Raymond et al. 2020](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7209987/): \"for example, regions affected by the deadly 2003 European and 2010 Russian heat waves experienced TW values no greater than 28°C\"\n",
"\n",
"This exercise aims to practice working with the CMIP6 cloud archive by computing the wet bulb temperature from available variables and summarizing the results in timeseries plots."
]
},
{
"cell_type": "markdown",
"id": "7e09f4c1-ab6c-4faf-8e97-267f55f33608",
"metadata": {},
"source": [
"> Lets start by importing matplotlib, xarray, numpy, and combined_preprocessing from xmip.preprocessing. Set the default figure size to (12, 6). \n",
"\n",
"> Then load the intake-esm collection for CMIP6 data on Google Cloud Storage (you can use xmip, as we did in the lecture, or set this up according to the [pangeo instructions](http://gallery.pangeo.io/repos/pangeo-gallery/cmip6/intake_ESM_example.html)). The result should be the same."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8df78194-8e21-49a3-a4a3-1ff94abb5ab8",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "23482f5d-12b5-469f-88d6-e1b54e01051f",
"metadata": {},
"source": [
"> The ingredients we need for wet bulb temperature are surface temperature and relative humidity. \n",
"\n",
"> Find the relevant variables using the [spreadheet](https://docs.google.com/spreadsheets/d/1UUtoz6Ofyjlpx5LdqhKcwHFz2SGoTQV2_yekHyMfL9Y/edit#gid=1221485271) from the lecture. You can enter multiple variables in the search query like so: `.search(..., variable_id=['a', 'b'], ...)`.\n",
"\n",
"> Select a subset of the variables, the `'historical'` experiment, the native model grid, monthly output, thres models (`['NorESM2-MM', 'MPI-ESM1-2-LR', 'CanESM5']` are recommended but feel free to explore), and a single member (`'r1i1p1f1'`) for starters. *Check out some more models/members later if you are curious!*\n",
"\n",
"> Then load the data into a dictionary of xarray datasets like we did in the lecture."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a01765b1-296f-41bd-b490-2ce6c24854a5",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "c07d209c-ae0c-4530-a256-bd5e1da565f8",
"metadata": {},
"source": [
"> Now lets calculate the wet bulb temperature according to the formula above. Write a function that calculates wet bulb temperature from temperature and humidity. \n",
"\n",
"> 🚨 Watch the units and convert if necessary! You can always check the units by looking at the metadata of a variable (`ds['your_variable'].attrs['units]`).\n",
"\n",
"> A good test to see if your function is doint the right thing is to calculate the example from the [paper](https://journals.ametsoc.org/view/journals/apme/50/11/jamc-d-11-0143.1.xml): For relative humidity of 50% and temperature of 20C, we expect ~13.7C for the wet bulb temperature."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "10db86d6-d08b-4220-bdc4-47133ad174c7",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "a3c94714-3e38-408e-848c-4423f0c887b9",
"metadata": {},
"source": [
"> To get an idea of the extremes globally lets compute the 90th percentile (`xarray.DataArray.quantile()` is your friend) of wet bulb temperature at every timesteps and then compute the annual average of that and plot is as a timeseries for each model. "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1cbfccce-0eef-4267-8688-0a22193cb49f",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "34c85f6d-3189-44af-ab94-a49f5d0455fc",
"metadata": {},
"source": [
"> What we are really interested in is to see how these extreme WBT are going to evolve in the future. Lets use your new CMIP6 skills to get some more data!\n",
"> Make another query to get two of the future scenario experiments (`ssp585` and `ssp245`- the 'worst case' and 'middle of the road' scenarios) for the same models and load them into separate dataset_dictionaries."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "33e7c796-03c9-4c10-bea9-0204b805aeb0",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "e92cf583-7107-44dd-a45f-99ae174524c4",
"metadata": {},
"source": [
"> Plot the same quantity as before (90th percentile in space and annual maximum) for each model and all 3 experiments to see how each model predicts wet bulb temperature extremes until the end of the century. Use color/linestyle/lineweight to separate the experiments."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d216def6-b8a3-42d9-a70d-455ac0b3af75",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "feef1773-f240-4554-b3b9-bb43f9a1ee4f",
"metadata": {},
"source": [
"> As a final step, lets look where these extremes occur. Plot a map of an annual average from 2099-2100 for each model and scenario. Make sure to restrict the colormap to + 30 to see where extremes occur"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "130c11a0-d8b3-4e1f-974a-275a60c53b66",
"metadata": {},
"outputs": [],
"source": []
}
],
"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.10.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
================================================
FILE: src/assignments/files_markdown_git.md
================================================
# Assignment: Files, Git, and Github
## Create a Dummy Resume Repository
Use JupyterLab to launch a terminal and use the terminal to do the following tasks:
1. Create a new directory called `resume` within your home directory
2. Create an empty file within this directory called `Readme.md`
Now use JupyterLab to edit the file:
1. Navigate to the directory in the file browser
1. Open `Readme.md` in the text editor
1. Open `Readme.md` in in Markdown Preview
1. Arrange these files side-by-side so you can see your document rendered
1. Edit the file in the editor. Add the following information:
1. Top level heading with your name
1. An image. It can be a photo of you or, if you prefer, a photo of your spirit animal.
1. Secondary heading entitled "Education"
1. A list of schools you attended, hyperlinked to the websites of those insitutions
1. Save the file
Now go back to the terminal and do the following:
1. Initialize a new git repository in the `resume` directory
1. Add the `Readme.md` file to the repository
1. Create a new commit with a commit message
1. Check the git log to see your commit history
1. Go to GitHub and create a [new public repository](https://github.com/new) entitled `resume`
1. Push your local resume repository to GitHub following the instructions.
1. View your online resume at `http://github.com/<your github username>/resume`
Finally, go back to the editor and add a new subsection called "Research Interests" to your `Readme.md` file. Update your local git repository and push your changes to GitHub. Verify that the remote repository is updated.
To "hand in" this part of the assignment, put a link to it in the `Readme.md` file in the next part.
## Create your Assignments Repository
Now that you know how to create a git repository, you should create your assignments repository.
- Create a new directory called `rces-assignments` in your home directory.
- Create a `Readme.md` markdown file that contains your name and a link to your "resume" repo.
- Initialize a new git repository
- Add the file and make your first commit
- Create a new **private** repository on GitHub called `rces-assignments`. (Call it exactly like that. Do not vary the spelling, capitalization, or punctuation.)
- Push your `rces-assignments` repository to GitHub
- On GitHub, go to "settings" -> "collaborators" and add `rabernat` and `stb2145`.
- Push new commits to this repository whenever you are ready to hand in your assignments
================================================
FILE: src/assignments/more_matplotlib.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Assignment: More Matplotlib\n",
"\n",
"The goal here is to replicate the figures you see as closely as possible.\n",
"\n",
"In order to get some data, you will have to run the code in the cells below. **Don't worry about how this code works.** In the end, it will give you some numpy arrays, which you will use in your plots. You are not allowed to use any packages other than numpy and matplotlib to complete your assignment."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Problem 1: Line plots\n",
"\n",
"In this problem, we will plot some daily weather data from a NOAA station in [Millbrook, NY](https://www.ncdc.noaa.gov/cdo-web/datasets/GHCND/stations/GHCND:US1NYDT0008/detail). A full description of this dataset is available at: <https://www.ncdc.noaa.gov/data-access/land-based-station-data>\n",
"\n",
"The cell below uses pandas to download the data and populate a bunch of numpy arrays (`t_daily_min`, `t_daily_max`, etc.) Run the cell and then use the numpy arrays to try to re-create the plot you see."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pooch\n",
"POOCH = pooch.create(\n",
" path=pooch.os_cache(\"noaa-data\"),\n",
" # Use the figshare DOI\n",
" base_url=\"doi:10.5281/zenodo.5553029/\",\n",
" registry={\n",
" \"HEADERS.txt\": \"md5:2a306ca225fe3ccb72a98953ded2f536\",\n",
" \"CRND0103-2016-NY_Millbrook_3_W.txt\": \"md5:eb69811d14d0573ffa69f70dd9c768d9\",\n",
" \"CRND0103-2017-NY_Millbrook_3_W.txt\": \"md5:b911da727ba1bdf26a34a775f25d1088\",\n",
" \"CRND0103-2018-NY_Millbrook_3_W.txt\": \"md5:5b61bc687261596eba83801d7080dc56\",\n",
" \"CRND0103-2019-NY_Millbrook_3_W.txt\": \"md5:9b814430612cd8a770b72020ca4f2b7d\",\n",
" \"CRND0103-2020-NY_Millbrook_3_W.txt\": \"md5:cd8de6d5445024ce35fcaafa9b0e7b64\"\n",
" },\n",
")\n",
"\n",
"\n",
"import pandas as pd\n",
"\n",
"with open(POOCH.fetch(\"HEADERS.txt\")) as fp:\n",
" data = fp.read()\n",
"lines = data.split('\\n')\n",
"headers = lines[1].split(' ')\n",
"\n",
"dframes = []\n",
"for year in range(2016, 2019):\n",
" fname = f'CRND0103-{year}-NY_Millbrook_3_W.txt' \n",
" df = pd.read_csv(POOCH.fetch(fname), parse_dates=[1],\n",
" names=headers, header=None, sep='\\s+',\n",
" na_values=[-9999.0, -99.0])\n",
" dframes.append(df)\n",
"\n",
"df = pd.concat(dframes)\n",
"df = df.set_index('LST_DATE')\n",
"df\n",
"\n",
"#########################################################\n",
"#### BELOW ARE THE VARIABLES YOU SHOULD USE IN THE PLOTS!\n",
"#### (numpy arrays) \n",
"#### NO PANDAS ALLOWED!\n",
"#########################################################\n",
"\n",
"t_daily_min = df.T_DAILY_MIN.values\n",
"t_daily_max = df.T_DAILY_MAX.values\n",
"t_daily_mean = df.T_DAILY_MEAN.values\n",
"p_daily_calc = df.P_DAILY_CALC.values\n",
"soil_moisture_5 = df.SOIL_MOISTURE_5_DAILY.values\n",
"soil_moisture_10 = df.SOIL_MOISTURE_10_DAILY.values\n",
"soil_moisture_20 = df.SOIL_MOISTURE_20_DAILY.values\n",
"soil_moisture_50 = df.SOIL_MOISTURE_50_DAILY.values\n",
"soil_moisture_100 = df.SOIL_MOISTURE_100_DAILY.values\n",
"date = df.index.values"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"units = lines[2].split(' ')\n",
"for name, unit in zip(headers, units):\n",
" print(f'{name}: {unit}')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### Problem 2: Contour Plots\n",
"\n",
"Now we will visualize some global temperature data from the NCEP-NCAR atmospheric reanalysis."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import xarray as xr\n",
"ds_url = 'http://iridl.ldeo.columbia.edu/SOURCES/.NOAA/.NCEP-NCAR/.CDAS-1/.MONTHLY/.Diagnostic/.surface/.temp/dods'\n",
"ds = xr.open_dataset(ds_url, decode_times=False)\n",
"\n",
"#########################################################\n",
"#### BELOW ARE THE VARIABLES YOU SHOULD USE IN THE PLOTS!\n",
"#### (numpy arrays) \n",
"#### NO XARRAY ALLOWED!\n",
"#########################################################\n",
"\n",
"temp = ds.temp[-1].values - 273.15\n",
"lon = ds.X.values\n",
"lat = ds.Y.values"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Problem 3: Scatter plots\n",
"Here we will make a map plot of earthquakes from a USGS catalog of historic large earthquakes. Color the earthquakes by log10(depth) and adjust the marker size to be magntiude$^4$/100"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"fname = pooch.retrieve(\n",
" \"https://rabernat.github.io/research_computing/signif.txt.tsv.zip\",\n",
" known_hash='22b9f7045bf90fb99e14b95b24c81da3c52a0b4c79acf95d72fbe3a257001dbb',\n",
" processor=pooch.Unzip()\n",
")[0]\n",
"\n",
"earthquakes = np.genfromtxt(fname, delimiter='\\t')\n",
"depth = earthquakes[:, 8]\n",
"magnitude = earthquakes[:, 9]\n",
"latitude = earthquakes[:, 20]\n",
"longitude = earthquakes[:, 21]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.8.12"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
================================================
FILE: src/assignments/more_xarray.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Assignment: More Xarray with El Niño-Southern Oscillation (ENSO) Data\n",
"\n",
"Here will will calculate the NINO 3.4 index of El Nino variabillity and use it to analyze datasets.\n",
"\n",
"First read [this page from NOAA](https://www.ncdc.noaa.gov/teleconnections/enso/indicators/sst). It tells you the following:\n",
"\n",
"- The Niño 3.4 region is defined as the region between +/- 5 deg. lat, 170 W - 120 W lon.\n",
"- Warm or cold phases of the Oceanic Niño Index are defined by a five consecutive 3-month running mean of sea surface temperature (SST) anomalies in the Niño 3.4 region that is above the threshold of +0.5°C (warm), or below the threshold of -0.5°C (cold). This is known as the Oceanic Niño Index (ONI).\n",
"\n",
"(Note that \"anomaly\" means that the seasonal cycle, also called the \"climatology\" has been removed.)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Start by importing Numpy, Matplotlib, and Xarray. Set the default figure size to (12, 6)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1. Reproduce the SST curve from the figure below\n",
"\n",
"Use the `sst.mnmean.nc` file that we worked with in class, located at <http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/noaa.ersst.v5/sst.mnmean.nc>.\n",
"\n",
"You don't have to match the stylistic details, or use different colors above and below zero, just the \"3mth running mean\" curve."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Load the data as an Xarray dataset. Drop the `time_bnds` variable as we did in class and trim the data to 1950 onward for this assignment."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now calculate the climatology and the SST anomaly."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now reproduce the plot. Keep the rolling 3-month average of the SST anomaly as a DataArray for the next question."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2. Calculate boolean timeseries representing the positive / negative ENSO phases\n",
"\n",
"Refer to the definitions of warm/cold phases above."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plot them somehow."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3. Plot composites of SST anomaly for the positive and negative ENSO regimes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"These should be pcolormesh maps. First positive ONI."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And negative ONI."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4. Calculate the composite of preciptiation for positive and negative ENSO phases.\n",
"\n",
"First load the precip dataset. Code to fix the broken time coordinate is included."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
"<defs>\n",
"<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n",
"<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n",
"<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
"<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
"</symbol>\n",
"<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n",
"<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n",
"<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"</symbol>\n",
"</defs>\n",
"</svg>\n",
"<style>/* CSS stylesheet for displaying xarray objects in jupyterlab.\n",
" *\n",
" */\n",
"\n",
":root {\n",
" --xr-font-color0: var(--jp-content-font-color0, rgba(0, 0, 0, 1));\n",
" --xr-font-color2: var(--jp-content-font-color2, rgba(0, 0, 0, 0.54));\n",
" --xr-font-color3: var(--jp-content-font-color3, rgba(0, 0, 0, 0.38));\n",
" --xr-border-color: var(--jp-border-color2, #e0e0e0);\n",
" --xr-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
" --xr-background-color: var(--jp-layout-color0, white);\n",
" --xr-background-color-row-even: var(--jp-layout-color1, white);\n",
" --xr-background-color-row-odd: var(--jp-layout-color2, #eeeeee);\n",
"}\n",
"\n",
"html[theme=dark],\n",
"body.vscode-dark {\n",
" --xr-font-color0: rgba(255, 255, 255, 1);\n",
" --xr-font-color2: rgba(255, 255, 255, 0.54);\n",
" --xr-font-color3: rgba(255, 255, 255, 0.38);\n",
" --xr-border-color: #1F1F1F;\n",
" --xr-disabled-color: #515151;\n",
" --xr-background-color: #111111;\n",
" --xr-background-color-row-even: #111111;\n",
" --xr-background-color-row-odd: #313131;\n",
"}\n",
"\n",
".xr-wrap {\n",
" display: block;\n",
" min-width: 300px;\n",
" max-width: 700px;\n",
"}\n",
"\n",
".xr-text-repr-fallback {\n",
" /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
" display: none;\n",
"}\n",
"\n",
".xr-header {\n",
" padding-top: 6px;\n",
" padding-bottom: 6px;\n",
" margin-bottom: 4px;\n",
" border-bottom: solid 1px var(--xr-border-color);\n",
"}\n",
"\n",
".xr-header > div,\n",
".xr-header > ul {\n",
" display: inline;\n",
" margin-top: 0;\n",
" margin-bottom: 0;\n",
"}\n",
"\n",
".xr-obj-type,\n",
".xr-array-name {\n",
" margin-left: 2px;\n",
" margin-right: 10px;\n",
"}\n",
"\n",
".xr-obj-type {\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-sections {\n",
" padding-left: 0 !important;\n",
" display: grid;\n",
" grid-template-columns: 150px auto auto 1fr 20px 20px;\n",
"}\n",
"\n",
".xr-section-item {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-section-item input {\n",
" display: none;\n",
"}\n",
"\n",
".xr-section-item input + label {\n",
" color: var(--xr-disabled-color);\n",
"}\n",
"\n",
".xr-section-item input:enabled + label {\n",
" cursor: pointer;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-section-item input:enabled + label:hover {\n",
" color: var(--xr-font-color0);\n",
"}\n",
"\n",
".xr-section-summary {\n",
" grid-column: 1;\n",
" color: var(--xr-font-color2);\n",
" font-weight: 500;\n",
"}\n",
"\n",
".xr-section-summary > span {\n",
" display: inline-block;\n",
" padding-left: 0.5em;\n",
"}\n",
"\n",
".xr-section-summary-in:disabled + label {\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-section-summary-in + label:before {\n",
" display: inline-block;\n",
" content: '►';\n",
" font-size: 11px;\n",
" width: 15px;\n",
" text-align: center;\n",
"}\n",
"\n",
".xr-section-summary-in:disabled + label:before {\n",
" color: var(--xr-disabled-color);\n",
"}\n",
"\n",
".xr-section-summary-in:checked + label:before {\n",
" content: '▼';\n",
"}\n",
"\n",
".xr-section-summary-in:checked + label > span {\n",
" display: none;\n",
"}\n",
"\n",
".xr-section-summary,\n",
".xr-section-inline-details {\n",
" padding-top: 4px;\n",
" padding-bottom: 4px;\n",
"}\n",
"\n",
".xr-section-inline-details {\n",
" grid-column: 2 / -1;\n",
"}\n",
"\n",
".xr-section-details {\n",
" display: none;\n",
" grid-column: 1 / -1;\n",
" margin-bottom: 5px;\n",
"}\n",
"\n",
".xr-section-summary-in:checked ~ .xr-section-details {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-array-wrap {\n",
" grid-column: 1 / -1;\n",
" display: grid;\n",
" grid-template-columns: 20px auto;\n",
"}\n",
"\n",
".xr-array-wrap > label {\n",
" grid-column: 1;\n",
" vertical-align: top;\n",
"}\n",
"\n",
".xr-preview {\n",
" color: var(--xr-font-color3);\n",
"}\n",
"\n",
".xr-array-preview,\n",
".xr-array-data {\n",
" padding: 0 5px !important;\n",
" grid-column: 2;\n",
"}\n",
"\n",
".xr-array-data,\n",
".xr-array-in:checked ~ .xr-array-preview {\n",
" display: none;\n",
"}\n",
"\n",
".xr-array-in:checked ~ .xr-array-data,\n",
".xr-array-preview {\n",
" display: inline-block;\n",
"}\n",
"\n",
".xr-dim-list {\n",
" display: inline-block !important;\n",
" list-style: none;\n",
" padding: 0 !important;\n",
" margin: 0;\n",
"}\n",
"\n",
".xr-dim-list li {\n",
" display: inline-block;\n",
" padding: 0;\n",
" margin: 0;\n",
"}\n",
"\n",
".xr-dim-list:before {\n",
" content: '(';\n",
"}\n",
"\n",
".xr-dim-list:after {\n",
" content: ')';\n",
"}\n",
"\n",
".xr-dim-list li:not(:last-child):after {\n",
" content: ',';\n",
" padding-right: 5px;\n",
"}\n",
"\n",
".xr-has-index {\n",
" font-weight: bold;\n",
"}\n",
"\n",
".xr-var-list,\n",
".xr-var-item {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-var-item > div,\n",
".xr-var-item label,\n",
".xr-var-item > .xr-var-name span {\n",
" background-color: var(--xr-background-color-row-even);\n",
" margin-bottom: 0;\n",
"}\n",
"\n",
".xr-var-item > .xr-var-name:hover span {\n",
" padding-right: 5px;\n",
"}\n",
"\n",
".xr-var-list > li:nth-child(odd) > div,\n",
".xr-var-list > li:nth-child(odd) > label,\n",
".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n",
" background-color: var(--xr-background-color-row-odd);\n",
"}\n",
"\n",
".xr-var-name {\n",
" grid-column: 1;\n",
"}\n",
"\n",
".xr-var-dims {\n",
" grid-column: 2;\n",
"}\n",
"\n",
".xr-var-dtype {\n",
" grid-column: 3;\n",
" text-align: right;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-var-preview {\n",
" grid-column: 4;\n",
"}\n",
"\n",
".xr-var-name,\n",
".xr-var-dims,\n",
".xr-var-dtype,\n",
".xr-preview,\n",
".xr-attrs dt {\n",
" white-space: nowrap;\n",
" overflow: hidden;\n",
" text-overflow: ellipsis;\n",
" padding-right: 10px;\n",
"}\n",
"\n",
".xr-var-name:hover,\n",
".xr-var-dims:hover,\n",
".xr-var-dtype:hover,\n",
".xr-attrs dt:hover {\n",
" overflow: visible;\n",
" width: auto;\n",
" z-index: 1;\n",
"}\n",
"\n",
".xr-var-attrs,\n",
".xr-var-data {\n",
" display: none;\n",
" background-color: var(--xr-background-color) !important;\n",
" padding-bottom: 5px !important;\n",
"}\n",
"\n",
".xr-var-attrs-in:checked ~ .xr-var-attrs,\n",
".xr-var-data-in:checked ~ .xr-var-data {\n",
" display: block;\n",
"}\n",
"\n",
".xr-var-data > table {\n",
" float: right;\n",
"}\n",
"\n",
".xr-var-name span,\n",
".xr-var-data,\n",
".xr-attrs {\n",
" padding-left: 25px !important;\n",
"}\n",
"\n",
".xr-attrs,\n",
".xr-var-attrs,\n",
".xr-var-data {\n",
" grid-column: 1 / -1;\n",
"}\n",
"\n",
"dl.xr-attrs {\n",
" padding: 0;\n",
" margin: 0;\n",
" display: grid;\n",
" grid-template-columns: 125px auto;\n",
"}\n",
"\n",
".xr-attrs dt, dd {\n",
" padding: 0;\n",
" margin: 0;\n",
" float: left;\n",
" padding-right: 10px;\n",
" width: auto;\n",
"}\n",
"\n",
".xr-attrs dt {\n",
" font-weight: normal;\n",
" grid-column: 1;\n",
"}\n",
"\n",
".xr-attrs dt:hover span {\n",
" display: inline-block;\n",
" background: var(--xr-background-color);\n",
" padding-right: 10px;\n",
"}\n",
"\n",
".xr-attrs dd {\n",
" grid-column: 2;\n",
" white-space: pre-wrap;\n",
" word-break: break-all;\n",
"}\n",
"\n",
".xr-icon-database,\n",
".xr-icon-file-text2 {\n",
" display: inline-block;\n",
" vertical-align: middle;\n",
" width: 1em;\n",
" height: 1.5em !important;\n",
" stroke-width: 0;\n",
" stroke: currentColor;\n",
" fill: currentColor;\n",
"}\n",
"</style><pre class='xr-text-repr-fallback'><xarray.Dataset>\n",
"Dimensions: (X: 144, Y: 72, time: 362)\n",
"Coordinates:\n",
" * X (X) float32 1.25 3.75 6.25 8.75 ... 351.25 353.75 356.25 358.75\n",
" * time (time) datetime64[ns] 1960-01-01 1960-02-01 ... 1990-02-01\n",
" * Y (Y) float32 88.75 86.25 83.75 81.25 ... -81.25 -83.75 -86.25 -88.75\n",
"Data variables:\n",
" prcp (time, Y, X) float32 nan nan nan ... 0.023939257 0.024468819\n",
"Attributes:\n",
" Conventions: IRIDL</pre><div class='xr-wrap' hidden><div class='xr-header'><div class='xr-obj-type'>xarray.Dataset</div></div><ul class='xr-sections'><li class='xr-section-item'><input id='section-9d4df79f-2659-40f6-a8d0-e0828b66e509' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-9d4df79f-2659-40f6-a8d0-e0828b66e509' class='xr-section-summary' title='Expand/collapse section'>Dimensions:</label><div class='xr-section-inline-details'><ul class='xr-dim-list'><li><span class='xr-has-index'>X</span>: 144</li><li><span class='xr-has-index'>Y</span>: 72</li><li><span class='xr-has-index'>time</span>: 362</li></ul></div><div class='xr-section-details'></div></li><li class='xr-section-item'><input id='section-1032b644-6305-4bd9-9448-5674726be205' class='xr-section-summary-in' type='checkbox' checked><label for='section-1032b644-6305-4bd9-9448-5674726be205' class='xr-section-summary' >Coordinates: <span>(3)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>X</span></div><div class='xr-var-dims'>(X)</div><div class='xr-var-dtype'>float32</div><div class='xr-var-preview xr-preview'>1.25 3.75 6.25 ... 356.25 358.75</div><input id='attrs-d5118480-3464-4910-890c-66cf4f1cbf78' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-d5118480-3464-4910-890c-66cf4f1cbf78' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-d69af45e-8307-47ce-8de0-d1bbefa66023' class='xr-var-data-in' type='checkbox'><label for='data-d69af45e-8307-47ce-8de0-d1bbefa66023' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>longitude</dd><dt><span>pointwidth :</span></dt><dd>2.5</dd><dt><span>gridtype :</span></dt><dd>1</dd><dt><span>units :</span></dt><dd>degree_east</dd></dl></div><div class='xr-var-data'><pre>array([ 1.25, 3.75, 6.25, 8.75, 11.25, 13.75, 16.25, 18.75, 21.25,\n",
" 23.75, 26.25, 28.75, 31.25, 33.75, 36.25, 38.75, 41.25, 43.75,\n",
" 46.25, 48.75, 51.25, 53.75, 56.25, 58.75, 61.25, 63.75, 66.25,\n",
" 68.75, 71.25, 73.75, 76.25, 78.75, 81.25, 83.75, 86.25, 88.75,\n",
" 91.25, 93.75, 96.25, 98.75, 101.25, 103.75, 106.25, 108.75, 111.25,\n",
" 113.75, 116.25, 118.75, 121.25, 123.75, 126.25, 128.75, 131.25, 133.75,\n",
" 136.25, 138.75, 141.25, 143.75, 146.25, 148.75, 151.25, 153.75, 156.25,\n",
" 158.75, 161.25, 163.75, 166.25, 168.75, 171.25, 173.75, 176.25, 178.75,\n",
" 181.25, 183.75, 186.25, 188.75, 191.25, 193.75, 196.25, 198.75, 201.25,\n",
" 203.75, 206.25, 208.75, 211.25, 213.75, 216.25, 218.75, 221.25, 223.75,\n",
" 226.25, 228.75, 231.25, 233.75, 236.25, 238.75, 241.25, 243.75, 246.25,\n",
" 248.75, 251.25, 253.75, 256.25, 258.75, 261.25, 263.75, 266.25, 268.75,\n",
" 271.25, 273.75, 276.25, 278.75, 281.25, 283.75, 286.25, 288.75, 291.25,\n",
" 293.75, 296.25, 298.75, 301.25, 303.75, 306.25, 308.75, 311.25, 313.75,\n",
" 316.25, 318.75, 321.25, 323.75, 326.25, 328.75, 331.25, 333.75, 336.25,\n",
" 338.75, 341.25, 343.75, 346.25, 348.75, 351.25, 353.75, 356.25, 358.75],\n",
" dtype=float32)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>time</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>datetime64[ns]</div><div class='xr-var-preview xr-preview'>1960-01-01 ... 1990-02-01</div><input id='attrs-fca9011a-0032-403c-b857-b300271b3cdb' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-fca9011a-0032-403c-b857-b300271b3cdb' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-f0a98582-c74f-4567-91ea-083335d7fc23' class='xr-var-data-in' type='checkbox'><label for='data-f0a98582-c74f-4567-91ea-083335d7fc23' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array(['1960-01-01T00:00:00.000000000', '1960-02-01T00:00:00.000000000',\n",
" '1960-03-01T00:00:00.000000000', ..., '1989-12-01T00:00:00.000000000',\n",
" '1990-01-01T00:00:00.000000000', '1990-02-01T00:00:00.000000000'],\n",
" dtype='datetime64[ns]')</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>Y</span></div><div class='xr-var-dims'>(Y)</div><div class='xr-var-dtype'>float32</div><div class='xr-var-preview xr-preview'>88.75 86.25 83.75 ... -86.25 -88.75</div><input id='attrs-a65806af-e587-4873-88bc-ba7e5a101c9d' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-a65806af-e587-4873-88bc-ba7e5a101c9d' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-8a952d08-34df-4735-9fe7-1a49be861393' class='xr-var-data-in' type='checkbox'><label for='data-8a952d08-34df-4735-9fe7-1a49be861393' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>latitude</dd><dt><span>pointwidth :</span></dt><dd>2.5</dd><dt><span>gridtype :</span></dt><dd>0</dd><dt><span>units :</span></dt><dd>degree_north</dd></dl></div><div class='xr-var-data'><pre>array([ 88.75, 86.25, 83.75, 81.25, 78.75, 76.25, 73.75, 71.25, 68.75,\n",
" 66.25, 63.75, 61.25, 58.75, 56.25, 53.75, 51.25, 48.75, 46.25,\n",
" 43.75, 41.25, 38.75, 36.25, 33.75, 31.25, 28.75, 26.25, 23.75,\n",
" 21.25, 18.75, 16.25, 13.75, 11.25, 8.75, 6.25, 3.75, 1.25,\n",
" -1.25, -3.75, -6.25, -8.75, -11.25, -13.75, -16.25, -18.75, -21.25,\n",
" -23.75, -26.25, -28.75, -31.25, -33.75, -36.25, -38.75, -41.25, -43.75,\n",
" -46.25, -48.75, -51.25, -53.75, -56.25, -58.75, -61.25, -63.75, -66.25,\n",
" -68.75, -71.25, -73.75, -76.25, -78.75, -81.25, -83.75, -86.25, -88.75],\n",
" dtype=float32)</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-acd72690-ce2f-4014-bae7-e70696a79b46' class='xr-section-summary-in' type='checkbox' checked><label for='section-acd72690-ce2f-4014-bae7-e70696a79b46' class='xr-section-summary' >Data variables: <span>(1)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>prcp</span></div><div class='xr-var-dims'>(time, Y, X)</div><div class='xr-var-dtype'>float32</div><div class='xr-var-preview xr-preview'>nan nan ... 0.023939257 0.024468819</div><input id='attrs-51e69ac2-db30-45dd-ba1c-9d79ada056c2' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-51e69ac2-db30-45dd-ba1c-9d79ada056c2' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-65ca08ca-b440-4fd4-874a-193b266098aa' class='xr-var-data-in' type='checkbox'><label for='data-65ca08ca-b440-4fd4-874a-193b266098aa' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>pointwidth :</span></dt><dd>0</dd><dt><span>long_name :</span></dt><dd>precipitation rate</dd><dt><span>units :</span></dt><dd>mm/day</dd><dt><span>iridl:hasSemantics :</span></dt><dd>iridl:PrecipitationRate</dd></dl></div><div class='xr-var-data'><pre>array([[[ nan, nan, nan, ..., nan,\n",
" nan, nan],\n",
" [ nan, nan, nan, ..., nan,\n",
" nan, nan],\n",
" [ nan, nan, nan, ..., nan,\n",
" nan, nan],\n",
" ...,\n",
" [0. , 0. , 0. , ..., 0. ,\n",
" 0. , 0. ],\n",
" [0. , 0. , 0. , ..., 0. ,\n",
" 0. , 0. ],\n",
" [0. , 0. , 0. , ..., 0. ,\n",
" 0. , 0. ]],\n",
"\n",
" [[0.8194625 , 0.88875395, 0.8091981 , ..., 0.9492164 ,\n",
" 0.82411003, 0.78667456],\n",
" [1.0099076 , 0.9892432 , 0.98398215, ..., 0.8937486 ,\n",
" 1.0330029 , 0.9554615 ],\n",
" [1.041718 , 1.124445 , 1.1302058 , ..., 1.0546163 ,\n",
" 1.0768677 , 1.0590024 ],\n",
"...\n",
" [0.0388062 , 0.02617484, 0.02632195, ..., 0.03951803,\n",
" 0.04346019, 0.04225701],\n",
" [0.02660953, 0.02801275, 0.02830904, ..., 0.02524056,\n",
" 0.023809 , 0.02494283],\n",
" [0.06468108, 0.0645658 , 0.06004713, ..., 0.07233888,\n",
" 0.06633606, 0.06525925]],\n",
"\n",
" [[0.03070718, 0.02990827, 0.02791063, ..., 0.03007989,\n",
" 0.03042011, 0.03045618],\n",
" [0.07962694, 0.08658402, 0.09354889, ..., 0.06384834,\n",
" 0.06523342, 0.06917968],\n",
" [0.3978056 , 0.3911632 , 0.3591685 , ..., 0.20908825,\n",
" 0.29971218, 0.35676065],\n",
" ...,\n",
" [0.01469258, 0.01184803, 0.00796852, ..., 0.03738775,\n",
" 0.02957931, 0.02097237],\n",
" [0.00995823, 0.00965142, 0.00722192, ..., 0.01297611,\n",
" 0.01213069, 0.01111982],\n",
" [0.02359816, 0.02303343, 0.02243581, ..., 0.02560936,\n",
" 0.02393926, 0.02446882]]], dtype=float32)</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-e68f98ed-c46a-4eb1-8a2e-245072c37aed' class='xr-section-summary-in' type='checkbox' checked><label for='section-e68f98ed-c46a-4eb1-8a2e-245072c37aed' class='xr-section-summary' >Attributes: <span>(1)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'><dt><span>Conventions :</span></dt><dd>IRIDL</dd></dl></div></li></ul></div></div>"
],
"text/plain": [
"<xarray.Dataset>\n",
"Dimensions: (X: 144, Y: 72, time: 362)\n",
"Coordinates:\n",
" * X (X) float32 1.25 3.75 6.25 8.75 ... 351.25 353.75 356.25 358.75\n",
" * time (time) datetime64[ns] 1960-01-01 1960-02-01 ... 1990-02-01\n",
" * Y (Y) float32 88.75 86.25 83.75 81.25 ... -81.25 -83.75 -86.25 -88.75\n",
"Data variables:\n",
" prcp (time, Y, X) float32 nan nan nan ... 0.023939257 0.024468819\n",
"Attributes:\n",
" Conventions: IRIDL"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"import xarray as xr\n",
"url = 'http://iridl.ldeo.columbia.edu/SOURCES/.NASA/.GPCP/.V2p1/.multi-satellite/.prcp/dods'\n",
"dsp = xr.open_dataset(url, decode_times=False)\n",
"true_time = (pd.date_range(start='1960-01-01', periods=len(dsp['T']), freq='MS'))\n",
"dsp['T'] = true_time\n",
"dsp = dsp.rename({'T': 'time'})\n",
"dsp.load()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now plot the *difference* between the time-mean of `prcp` during positive and negative ENSO phases."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.8"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
================================================
FILE: src/assignments/numpy_matplotlib.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Assignment: Numpy and Matplotlib\n",
"\n",
"The goal of this assignment is to gain comfort creating, visualizating, and computing with numpy array. By the end of the assignment, you should feel comfortable:\n",
"\n",
"```{admonition} Learning Goals\n",
":class: tip\n",
"\n",
"- Creating new arrays using `linspace` and `arange`\n",
"- Computing basic formulas with numpy arrays\n",
"- Loading data from `.npy` files\n",
"- Performing reductions (e.g. `mean`, `std` on numpy arrays)\n",
"- Making 1D line plots\n",
"- Making scatterplots\n",
"- Annotating plots with titles and axes\n",
"```\n",
"\n",
"## 1 Creating and Manipulating Arrays"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First import numpy and matplotlib"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.1. Create two 2D arrays representing coordinates x, y on the cartesian plan\n",
"Both should cover the range (-2, 2) and have 100 points in each direction"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.2. Visualize each 2D array using `pcolormesh`\n",
"\n",
"Use the correct coordiantes for the x and y axes."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.3 From your cartesian coordinates, create polar coordinates $r$ and $\\varphi$\n",
"\n",
"Refer to the [wikipedia page](https://en.wikipedia.org/wiki/Polar_coordinate_system#Converting_between_polar_and_Cartesian_coordinates) for the conversion formula. You will need to use numpy's `arctan2` function. Read its documentation.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.4. Visualize $r$ and $\\varphi$ on the 2D $x$ / $y$ plane using `pcolormesh`"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.5 Caclulate the quanity $f = \\cos^2(4r) + \\sin^2(4\\varphi)$\n",
"\n",
"And plot it on the x$ / $y$ plane"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.6 Plot the mean of f with respect to the x axis\n",
"\n",
"as a function of y"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.7 Plot the mean of f with respect to the y axis\n",
"\n",
"as a function of x"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.8 Plot the mean of $f$ with respect to $\\phi$ as a function of $r$\n",
"\n",
"This is hard. You will need to define a discrete range of $r$ values and then figure out how to average $f$ within the bins defined by your $r$ grid. There are many different ways to accomplish this."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"## Part 2: Analyze [ARGO](http://www.argo.ucsd.edu) Data\n",
"\n",
"In this problem, we use real data from ocean profiling floats.\n",
"ARGO floats are autonomous robotic instruments that collect Temperature, Salinity, and Pressure data from the ocean. ARGO floats collect one \"profile\" (a set of messurements at different depths or \"levels\").\n",
"\n",
"<img src=\"https://argo.ucsd.edu/wp-content/uploads/sites/361/2020/06/float_cycle_1.png\" width=\"80%\" />\n",
"\n",
"Each profile has a single latitude, longitude, and date associated with it, in addition to many different levels.\n",
"\n",
"Let's start by using [pooch](https://www.fatiando.org/pooch/latest/) to download the data files we need for this exercise.\n",
"The following code will give you a list of `.npy` files that you can open in the next step."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pooch\n",
"url = \"https://www.ldeo.columbia.edu/~rpa/float_data_4901412.zip\"\n",
"files = pooch.retrieve(url, processor=pooch.Unzip(), known_hash=\"2a703c720302c682f1662181d329c9f22f9f10e1539dc2d6082160a469165009\")\n",
"files"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### 2.1 Load each data file as a numpy array.\n",
"\n",
"You can use whatever names you want for your arrays, but I recommend\n",
"\n",
"`T`: temperature\n",
"\n",
"`S`: salinity\n",
"\n",
"`P`: pressure\n",
"\n",
"`date`: date\n",
"\n",
"`lat`: latitude\n",
"\n",
"`lon`: longitude\n",
"\n",
"`level`: depth level\n",
"\n",
"**Note**: you have to actually look at the file name (the items in `files`) to know which files corresponds to which variable.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.2 Examine the shapes of T, S and P compared to `lon`, `lat`, `date` and `level`. How do you think they are related?\n",
"\n",
"Based on the shapes, which dimensions do you think are shared among the arrays?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### 2.3 Make a plot for each column of data in T, S and P (three plots). \n",
"\n",
"The vertical scale should be the `levels` data. Each plot should have a line for each column of data. It will look messy."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.4 Compute the mean and standard deviation of each of T, S and P at each depth in `level`."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.5 Now make three similar plot, but show only the mean T, S and P at each depth. Show [error bars](https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.errorbar.html) on each plot using the standard deviations. \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.6 Account For Missing Data\n",
"\n",
"The profiles contain many missing values. These are indicated by the special \"Not a Number\" value, or `np.nan`.\n",
"\n",
"When you take the mean or standard deviation of data with NaNs in it, the entire result becomes NaN. Instead, if you use the special functions `np.nanmean` and `np.nanstd`, you tell NumPy to ignore the NaNs.\n",
"\n",
"Recalculate the means and standard deviations as in the previous sections using these functions and plot the results."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### 2.7 Create a scatter plot of the `lon`, `lat` positions of the ARGO float.\n",
"\n",
"Use the [plt.scatter](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html) function."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
================================================
FILE: src/assignments/pandas_groupby.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Assignment: Pandas Groupby with Hurricane Data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Import Numpy, Pandas and Matplotlib and set the display options."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Use the following code to load a CSV file of the [NOAA IBTrACS](https://www.ncdc.noaa.gov/ibtracs/index.php?name=ibtracs-data) hurricane dataset:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"url = 'https://www.ncei.noaa.gov/data/international-best-track-archive-for-climate-stewardship-ibtracs/v04r00/access/csv/ibtracs.ALL.list.v04r00.csv'\n",
"df = pd.read_csv(url, parse_dates=['ISO_TIME'], usecols=range(12),\n",
" skiprows=[1], na_values=[' ', 'NOT_NAMED'],\n",
" keep_default_na=False, dtype={'NAME': str})\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Basin Key: (NI - North Indian, SI - South Indian, WP - Western Pacific, SP - Southern Pacific, EP - Eastern Pacific, NA - North Atlantic)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"How many rows does this dataset have?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"How many North Atlantic hurricanes are in this dataset?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1) Get the unique values of the `BASIN`, `SUBBASIN`, and `NATURE` columns"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2) Rename the `WMO_WIND` and `WMO_PRES` columns to `WIND` and `PRES`"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3) Get the 10 largest rows in the dataset by `WIND`"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You will notice some names are repeated.\n",
"\n",
"### 4) Group the data on `SID` and get the 10 largest hurricanes by `WIND`"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 5) Make a bar chart of the wind speed of the 20 strongest-wind hurricanes\n",
"\n",
"Use the name on the x-axis."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 6) Plot the count of all datapoints by Basin\n",
"\n",
"as a bar chart"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 7) Plot the count of unique hurricanes by Basin\n",
"\n",
"as a bar chart."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 8) Make a `hexbin` of the location of datapoints in Latitude and Longitude"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 9) Find Hurricane Katrina (from 2005) and plot its track as a scatter plot\n",
"\n",
"First find the SID of this hurricane."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next get this hurricane's group and plot its position as a scatter plot. Use wind speed to color the points."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 10) Make time the index on your dataframe"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 11) Plot the count of all datapoints per year as a timeseries\n",
"\n",
"You should use `resample`"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 12) Plot all tracks from the North Atlantic in 2005\n",
"\n",
"You will probably have to iterate through a `GroupBy` object"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 13) Create a filtered dataframe that contains only data since 1970 from the North Atlantic (\"NA\") Basin\n",
"\n",
"Use this for the rest of the assignment"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 14) Plot the number of datapoints per day from this filtered dataframe\n",
"\n",
"Make sure you figure is big enough to actually see the plot"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 15) Calculate the climatology of datapoint counts as a function of `dayofyear`\n",
"\n",
"Plot the mean and standard deviation on a single figure"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 16) Use `transform` to calculate the anomaly of daily counts from the climatology\n",
"\n",
"Resample the anomaly timeseries at annual resolution and plot a line with dots as markers."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Which years stand out as having anomalous hurricane activity?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.8"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
================================================
FILE: src/assignments/python_basics_and_functions.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Assignment: Basic Python\n",
"\n",
"\n",
"```{admonition} Learning Goals\n",
":class: tip\n",
"\n",
"This assignment will verify that you have the following skills:\n",
"- Create lists and dictionaries\n",
"- Iterate through lists, tuples, and dictionaries\n",
"- Index sequences (e.g. lists and tuples)\n",
"- Define functions\n",
"- Use optional keyword arguments in functions\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part I: Lists and Loops\n",
"\n",
"In this problem, we will explore the basic data structures and flow controls of Python by _manually creating data structures_.\n",
"\n",
"\n",
"```{warning}\n",
"Pluto is [not a planet any more](https://www.loc.gov/everyday-mysteries/item/why-is-pluto-no-longer-a-planet/).\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1) Create a list with the names of every planet in the solar system (in order)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### 2) Have Python tell you how many planets there are by examining your list"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3) Use slicing to display the first four planets (the rocky planets)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4) Iterate through your planets and print the planet name only if it has an `s` at the end"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part II: Dictionaries\n",
"\n",
"### 1) Now create a dictionary that maps each planet name to its mass\n",
"\n",
"You can use values from this [NASA fact sheet](https://nssdc.gsfc.nasa.gov/planetary/factsheet/).\n",
"You can use whatever units you want, but be consistent."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2) Use your dictionary to look up Earth's mass"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### 3) Loop through the data and create a list of planets whose mast is greater than 100 x 10^24 kg \n",
"\n",
"Display your result"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4) Now add pluto to your dictionary"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part III: Functions\n",
"\n",
"### 1. Write a function to convert temperature from kelvin to celsius\n",
"\n",
"and celsius to kelvin"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### 2. Write a function to convert temperature to fahrenheit\n",
"\n",
"Include an optional keyword argument to specify whether the input is in celcius or kelvin.\n",
"Call your previously defined functions if necessary."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3) Check that the outputs are sensible\n",
"\n",
"by trying a few examples"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4) Now write a function that converts _from_ farenheit\n",
"\n",
"and uses a keyword argument to specify whether you want the output in celcius or kelvin"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 5) Write a function that takes two arguments (feet and inches) and returns height in meters\n",
"\n",
"Verify it gives sensible answers"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 6. Write a function takes one argument (height in meters) and returns two arguments (feet and inches)\n",
"\n",
"(Consult the [tutorial on numbers](https://docs.python.org/3/tutorial/introduction.html#numbers) if you are stuck on how to implement this.)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### 7) Verify that the \"round trip\" conversion from and back to meters is consistent \n",
"\n",
"Check for 3 different values of height in meters"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
================================================
FILE: src/intro.md
================================================
# An Introduction to Earth and Environmental Data Science
## History
This book grew out of a course developed at Columbia University called _Research Computing in Earth Science_.
It was written mostly by [Ryan Abernathey](https://rabernat.github.io), with significant contributions from
[Kerry Key](https://emlab.ldeo.columbia.edu/index.php/team/kerry-key/),
[Tim Crone](https://github.com/tjcrone), and [Julius Busecke](https:www.juliusbusecke.com).
By separating the book from the class, we hope to create an open-source community resource for Python education
in the Earth and Environmental Sciences.
## Motivation and Scope
Computing has become an indispensable tool for nearly all Earth and Environmental Scientists, but it doesn't often appear in our curriculums.
This book focuses on _data analysis_, a subset of computing in which the data already exist, e.g.from observations or from the output of a simulation, but have to be transformed into understanding.
There are many different ways to gain understanding, but most workflows often boil down to:
- read data files
- perform some analysis operations, from very simple (e.g. take the mean) to very complex (e.g. train a deep neural network)
- visualize the output in a plot
This book doesn't attempt to teach deep learning; its goal is to teach the basic foundations of Earth and Environmental Data Science which are often overlooked.
The material is designed to be accessible for Earth Science graduate students in any discipline, with no prerequisites.
This book is intended to introduce new graduate students to modern computing software, programming tools and best practices that are broadly applicable to the analysis and visualization of Earth and Environmental data.
This includes an introduction to Unix, version control, and basic programming in the open-source Python language.
The bulk of the content is devoted to in-depth exploration of the numerical analysis and visualization packages which comprise the modern Scientific Python ecosystem, including Numpy, Scipy, Matplotlib, Pandas, Xarray, using real Earth and Environmental datasets.
## Learning Goals
After completing all of the material, students should have the ability to:
- Use unix commands to work with files and directories
- Navigate the JupyterHub Environment effectively
- Identify common geoscience data formats and the python packages which can load them
- Perform basic exploratory data analysis on Earth and Environmental data, distinguishing between
- _Tabular data_: rows and columns
- _Gridded data_: multidimensional numerical arrays
- Use visualization to enhance interpretation of data, including maps and interactive visualizations
- Construct complete, well-structured programs in Python
- Practice reproducible research through version control and binder
## Recommended Course Structure
This course material can be used however you want.
However, it was developed for a full-credit, semester-long course that meets twice a week.
The idea is to complete one lecture and one homework assignment per week.
One of the weekly meetings consists of a lecture in which the instructor presents the week's lecture, with students typing along.
The other should be used as "collaborative time," during which the students work on their assignments, ask questions, and interact with their peers.
A final project is an important capstone experience for a semester-long course.
================================================
FILE: src/lectures/basic_scipy/more_matplotlib.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# More Matplotlib\n",
"\n",
"Matplotlib is the dominant plotting / visualization package in python. It is important to learn to use it well. In the last lecture, we saw some basic examples in the context of learning numpy. This week, we dive much deeper. The goal is to understand how matplotlib represents figures internally."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from matplotlib import pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Figure and Axes\n",
"\n",
"The *figure* is the highest level of organization of matplotlib objects. If we want, we can create a figure explicitly."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.figure.Figure at 0x116913b38>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.figure.Figure at 0x116b31c50>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure(figsize=(13, 5))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\ngCGiCwBDRBcAhoguAAwRXQAYIroAMER0AWCI6ALAENEFgCGiCwBDRBcAhoguAAwRXQAYIroAMER0\nAWCI6ALAENEFgCGiCwBDRBcAhoguAAwRXQAYIroAMER0AWCI6ALAENEFgCGiCwBDRBcAhoguAAxZ\nFN2qurWqnqyqC1V17wGPf2tVfWz38U9V1Y2rHhQANt2h0a2qq5Lcn+S2JCeT3FVVJ/ctuzvJl7r7\ne5P8bpLfXvWgALDplrzSvSXJhe5+qrufT/JAkjv2rbkjyR/v3v7zJG+rqlrdmACw+ZZE97okT+85\n3t6978A13f1CkueSfNcqBgSAo+LqBWsOesXal7EmVXU6yendw69W1WcX/HxemmuT/PuVHuKIsrfr\nYV/Xx96ux/dd7jcuie52kuv3HB9P8swl1mxX1dVJXpPkP/Y/UXefSXImSarqfHdvXc7QXJp9XR97\nux72dX3s7XpU1fnL/d4lp5cfTXKiqm6qqmuS3Jnk7L41Z5P8zO7tdyT52+7+ule6APBydugr3e5+\noaruSfJQkquSfLi7H6+q+5Kc7+6zSf4oyZ9W1YXsvMK9c51DA8AmWnJ6Od19Lsm5ffe9b8/tryT5\nyZf4s8+8xPUsY1/Xx96uh31dH3u7Hpe9r+UsMADMcBlIABiy9ui6hOR6LNjXX66qJ6rqsar6m6r6\n7isx5yY6bG/3rHtHVXVV+XToAkv2tap+avf39vGq+rPpGTfRgr8FN1TVw1X1md2/B7dfiTk3TVV9\nuKqevdQ/ba0dv7e7749V1ZsXPXF3r+0rOx+8+uck35PkmiT/lOTkvjU/l+SDu7fvTPKxdc50FL4W\n7uuPJfn23ds/a19Xt7e7616d5JNJHkmydaXn/mb/Wvg7eyLJZ5J85+7x66703N/sXwv39UySn929\nfTLJ56/03JvwleRHkrw5yWcv8fjtSf46O9epeEuSTy153nW/0nUJyfU4dF+7++Hu/vLu4SPZ+ffV\nHG7J72yS/FaS9yf5yuRwG2zJvr4nyf3d/aUk6e5nh2fcREv2tZN8x+7t1+Trr7PAAbr7kzngehN7\n3JHkT3rHI0leW1WvP+x51x1dl5BcjyX7utfd2fkvMg536N5W1ZuSXN/dfzU52IZb8jv7hiRvqKq/\nr6pHqurWsek215J9/c0k76yq7ez8K5RfmBntyHupf4eTLPwnQ9+AlV1Ckq+xeM+q6p1JtpL86Fon\nOjpedG+r6hXZ+T9pvWtqoCNiye/s1dk5xfzW7JyZ+buqurm7/3PNs22yJft6V5KPdPfvVNUPZeea\nCjd39/+sf7wj7bLate5Xui/lEpJ5sUtI8jWW7Guq6u1Jfi3Jqe7+6tBsm+6wvX11kpuTfKKqPp+d\n93LO+jDVoZb+LfjL7v6v7v6XJE9mJ8Jc2pJ9vTvJg0nS3f+Q5Nuyc01mvjGL/g7vt+7ouoTkehy6\nr7unQD+UneB6b2y5F93b7n6uu6/t7hu7+8bsvF9+qrsv+1qsLxNL/hb8RXY+AJiqujY7p5ufGp1y\n8yzZ1y8keVuSVNX3Zye6F0enPJrOJvnp3U8xvyXJc939b4d901pPL7dLSK7Fwn39QJJXJfn47ufS\nvtDdp67Y0Bti4d7yEi3c14eS/ERVPZHkv5P8Snd/8cpN/c1v4b6+N8kfVtUvZef057u8sDlcVX00\nO291XLv7fvhvJPmWJOnuD2bn/fHbk1xI8uUk7170vPYeAGa4IhUADBFdABgiugAwRHQBYIjoAsAQ\n0QWAIaILAENEFwCG/C89W5iskzQcrAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x116b4b470>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()\n",
"ax = fig.add_axes([0, 0, 1, 1])"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQUAAAFDCAYAAAAzlxvgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAADZBJREFUeJzt23+o3Xd9x/Hny2adzFUd9grSpLay\ndDUrg7pL6RBmRTfSDpJ/nCRQto5i0Fn3hzLocHRS/5qyCUI2F5j4A7RG/5gXiRR0FaWY2luq1aRk\n3EW3Xipr1Oo/YmvZe3+cozvv05vcb9LzI9meD7hwvt/zud/7zuHkme/53m9SVUjSL7xo2QNIurgY\nBUmNUZDUGAVJjVGQ1BgFSc22UUjy0SRPJfnOWZ5Pkg8n2UjyWJLXzX5MSYsy5EzhY8Deczx/K7B7\n/HUI+McXPpakZdk2ClX1VeBH51iyH/hEjRwHXp7kVbMaUNJizeKawlXAExPbm+N9ki5BO2ZwjGyx\nb8t7p5McYvQRg5e85CW/e/3118/gx0ua9sgjj/ygqlYu5HtnEYVNYNfE9k7gya0WVtUR4AjA6upq\nra+vz+DHS5qW5D8u9Htn8fFhDfiT8W8hbgZ+UlXfn8FxJS3BtmcKST4N3AJcmWQT+BvgVwCq6iPA\nMeA2YAP4KfBn8xpW0vxtG4WqOrjN8wW8c2YTSVoq72iU1BgFSY1RkNQYBUmNUZDUGAVJjVGQ1BgF\nSY1RkNQYBUmNUZDUGAVJjVGQ1BgFSY1RkNQYBUmNUZDUGAVJjVGQ1BgFSY1RkNQYBUmNUZDUGAVJ\njVGQ1BgFSY1RkNQYBUmNUZDUGAVJjVGQ1BgFSY1RkNQYBUmNUZDUGAVJjVGQ1BgFSY1RkNQYBUmN\nUZDUGAVJjVGQ1BgFSY1RkNQYBUmNUZDUGAVJjVGQ1AyKQpK9SU4l2Uhy9xbPX53kgSSPJnksyW2z\nH1XSImwbhSSXAYeBW4E9wMEke6aW/TVwtKpuBA4A/zDrQSUtxpAzhZuAjao6XVXPAvcB+6fWFPDS\n8eOXAU/ObkRJizQkClcBT0xsb473TXofcHuSTeAY8K6tDpTkUJL1JOtnzpy5gHElzduQKGSLfTW1\nfRD4WFXtBG4DPpnkeceuqiNVtVpVqysrK+c/raS5GxKFTWDXxPZOnv/x4E7gKEBVfR14MXDlLAaU\ntFhDovAwsDvJtUkuZ3QhcW1qzX8CbwJI8lpGUfDzgXQJ2jYKVfUccBdwP/A4o98ynEhyb5J942Xv\nAd6W5FvAp4E7qmr6I4akS8COIYuq6hijC4iT++6ZeHwSeP1sR5O0DN7RKKkxCpIaoyCpMQqSGqMg\nqTEKkhqjIKkxCpIaoyCpMQqSGqMgqTEKkhqjIKkxCpIaoyCpMQqSGqMgqTEKkhqjIKkxCpIaoyCp\nMQqSGqMgqTEKkhqjIKkxCpIaoyCpMQqSGqMgqTEKkhqjIKkxCpIaoyCpMQqSGqMgqTEKkhqjIKkx\nCpIaoyCpMQqSGqMgqTEKkhqjIKkxCpIaoyCpMQqSGqMgqTEKkppBUUiyN8mpJBtJ7j7LmrcmOZnk\nRJJPzXZMSYuyY7sFSS4DDgN/AGwCDydZq6qTE2t2A38FvL6qnk7yynkNLGm+hpwp3ARsVNXpqnoW\nuA/YP7XmbcDhqnoaoKqemu2YkhZlSBSuAp6Y2N4c75t0HXBdkgeTHE+yd1YDSlqsbT8+ANliX21x\nnN3ALcBO4GtJbqiqH7cDJYeAQwBXX331eQ8raf6GnClsArsmtncCT26x5vNV9fOq+i5wilEkmqo6\nUlWrVbW6srJyoTNLmqMhUXgY2J3k2iSXAweAtak1/wK8ESDJlYw+Tpye5aCSFmPbKFTVc8BdwP3A\n48DRqjqR5N4k+8bL7gd+mOQk8ADwl1X1w3kNLWl+UjV9eWAxVldXa319fSk/W/q/LskjVbV6Id/r\nHY2SGqMgqTEKkhqjIKkxCpIaoyCpMQqSGqMgqTEKkhqjIKkxCpIaoyCpMQqSGqMgqTEKkhqjIKkx\nCpIaoyCpMQqSGqMgqTEKkhqjIKkxCpIaoyCpMQqSGqMgqTEKkhqjIKkxCpIaoyCpMQqSGqMgqTEK\nkhqjIKkxCpIaoyCpMQqSGqMgqTEKkhqjIKkxCpIaoyCpMQqSGqMgqTEKkhqjIKkxCpIaoyCpMQqS\nmkFRSLI3yakkG0nuPse6tySpJKuzG1HSIm0bhSSXAYeBW4E9wMEke7ZYdwXwF8BDsx5S0uIMOVO4\nCdioqtNV9SxwH7B/i3XvBz4A/GyG80lasCFRuAp4YmJ7c7zvl5LcCOyqqi/McDZJSzAkCtliX/3y\nyeRFwIeA92x7oORQkvUk62fOnBk+paSFGRKFTWDXxPZO4MmJ7SuAG4CvJPkecDOwttXFxqo6UlWr\nVbW6srJy4VNLmpshUXgY2J3k2iSXAweAtV88WVU/qaorq+qaqroGOA7sq6r1uUwsaa62jUJVPQfc\nBdwPPA4craoTSe5Nsm/eA0parB1DFlXVMeDY1L57zrL2lhc+lqRl8Y5GSY1RkNQYBUmNUZDUGAVJ\njVGQ1BgFSY1RkNQYBUmNUZDUGAVJjVGQ1BgFSY1RkNQYBUmNUZDUGAVJjVGQ1BgFSY1RkNQYBUmN\nUZDUGAVJjVGQ1BgFSY1RkNQYBUmNUZDUGAVJjVGQ1BgFSY1RkNQYBUmNUZDUGAVJjVGQ1BgFSY1R\nkNQYBUmNUZDUGAVJjVGQ1BgFSY1RkNQYBUmNUZDUGAVJjVGQ1BgFSc2gKCTZm+RUko0kd2/x/LuT\nnEzyWJIvJ3n17EeVtAjbRiHJZcBh4FZgD3AwyZ6pZY8Cq1X1O8DngA/MelBJizHkTOEmYKOqTlfV\ns8B9wP7JBVX1QFX9dLx5HNg52zElLcqQKFwFPDGxvTnedzZ3Al/c6okkh5KsJ1k/c+bM8CklLcyQ\nKGSLfbXlwuR2YBX44FbPV9WRqlqtqtWVlZXhU0pamB0D1mwCuya2dwJPTi9K8mbgvcAbquqZ2Ywn\nadGGnCk8DOxOcm2Sy4EDwNrkgiQ3Av8E7Kuqp2Y/pqRF2TYKVfUccBdwP/A4cLSqTiS5N8m+8bIP\nAr8OfDbJN5OsneVwki5yQz4+UFXHgGNT++6ZePzmGc8laUm8o1FSYxQkNUZBUmMUJDVGQVJjFCQ1\nRkFSYxQkNUZBUmMUJDVGQVJjFCQ1RkFSYxQkNUZBUmMUJDVGQVJjFCQ1RkFSYxQkNUZBUmMUJDVG\nQVJjFCQ1RkFSYxQkNUZBUmMUJDVGQVJjFCQ1RkFSYxQkNUZBUmMUJDVGQVJjFCQ1RkFSYxQkNUZB\nUmMUJDVGQVJjFCQ1RkFSYxQkNUZBUmMUJDVGQVJjFCQ1g6KQZG+SU0k2kty9xfO/muQz4+cfSnLN\nrAeVtBjbRiHJZcBh4FZgD3AwyZ6pZXcCT1fVbwIfAv521oNKWowhZwo3ARtVdbqqngXuA/ZPrdkP\nfHz8+HPAm5JkdmNKWpQhUbgKeGJie3O8b8s1VfUc8BPgFbMYUNJi7RiwZqt/8esC1pDkEHBovPlM\nku8M+PkXgyuBHyx7iIEupVnh0pr3Upr1ty70G4dEYRPYNbG9E3jyLGs2k+wAXgb8aPpAVXUEOAKQ\nZL2qVi9k6EVz1vm5lOa91Ga90O8d8vHhYWB3kmuTXA4cANam1qwBfzp+/BbgX6vqeWcKki5+254p\nVNVzSe4C7gcuAz5aVSeS3AusV9Ua8M/AJ5NsMDpDODDPoSXNz5CPD1TVMeDY1L57Jh7/DPjj8/zZ\nR85z/TI56/xcSvP+v5g1nuVLmuRtzpKauUfhUrpFesCs705yMsljSb6c5NXLmHM8yzlnnVj3liSV\nZGlXzYfMmuSt49f2RJJPLXrGqVm2ex9cneSBJI+O3wu3LWnOjyZ56my/2s/Ih8d/jseSvG7Qgatq\nbl+MLkz+O/Aa4HLgW8CeqTV/Dnxk/PgA8Jl5zvQCZ30j8Gvjx++4mGcdr7sC+CpwHFi9WGcFdgOP\nAr8x3n7lMmY9j3mPAO8YP94DfG9Js/4+8DrgO2d5/jbgi4zuI7oZeGjIced9pnAp3SK97axV9UBV\n/XS8eZzRPRvLMOR1BXg/8AHgZ4scbsqQWd8GHK6qpwGq6qkFzzhpyLwFvHT8+GU8/76dhaiqr7LF\n/UAT9gOfqJHjwMuTvGq74847CpfSLdJDZp10J6MKL8O2sya5EdhVVV9Y5GBbGPK6Xgdcl+TBJMeT\n7F3YdM83ZN73Abcn2WT0W7l3LWa083a+72lg4K8kX4CZ3SK9AIPnSHI7sAq8Ya4Tnd05Z03yIkb/\nW/WORQ10DkNe1x2MPkLcwujs62tJbqiqH895tq0Mmfcg8LGq+rskv8foHp0bquq/5z/eebmgv1vz\nPlM4n1ukOdct0gswZFaSvBl4L7Cvqp5Z0GzTtpv1CuAG4CtJvsfo8+Taki42Dn0PfL6qfl5V3wVO\nMYrEMgyZ907gKEBVfR14MaP/F3GxGfSefp45XwjZAZwGruV/L9r89tSad9IvNB5d0kWbIbPeyOgi\n1O5lzHg+s06t/wrLu9A45HXdC3x8/PhKRqe8r7iI5/0icMf48WvHf9GypHmv4ewXGv+IfqHxG4OO\nuYChbwP+bfyX6b3jffcy+pcWRpX9LLABfAN4zTJe3IGzfgn4L+Cb46+1i3XWqbVLi8LA1zXA3wMn\ngW8DB5Y168B59wAPjoPxTeAPlzTnp4HvAz9ndFZwJ/B24O0Tr+vh8Z/j20PfA97RKKnxjkZJjVGQ\n1BgFSY1RkNQYBUmNUZDUGAVJjVGQ1PwPylNi4xfKN+EAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x119fd68d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()\n",
"ax = fig.add_axes([0, 0, 0.5, 1])"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAbUAAAFDCAYAAAC9YZDZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAFWFJREFUeJzt3H+M3Hed3/Hni5iA4EKAs5EgdohR\nnQNfdFJgFaVFKqHkeo4r2T0dRbYUHaFpXK6E+wN0UhCnXBT+aAtqkVB9x7kqyoFEciZ/HFtkFF0h\nEQhhLovyA+zId4vJXVZGjQkhUhWRkOu7f8yETiazO9/dnZ1Zf/b5kFb+fr/z2e/3NV/P9/ua+c7s\npKqQJKkFr5h1AEmSJsVSkyQ1w1KTJDXDUpMkNcNSkyQ1w1KTJDVjbKkl+UKSJ5P8cJnbk+RzSRaT\nPJrknZOPKUnSeF1eqd0F7Fvh9huAPf2fI8CfrT+WJEmrN7bUqupbwM9WGHIQ+GL1nARen+TNkwoo\nSVJXk3hP7TLgiYH5pf4ySZKmatsE1pERy0Z+91aSI/QuUfLa1772XW9/+9snsHlJw77//e//tKp2\nzDqHNG2TKLUlYNfA/E7g3KiBVXUMOAYwNzdXCwsLE9i8pGFJ/n7WGaRZmMTlx3ng9/ufgrwWeKaq\nfjKB9UqStCpjX6kluRu4DtieZAn4E+CVAFX1eeAEsB9YBJ4FPrRRYSVJWsnYUquqw2NuL+AjE0sk\nSdIa+Y0ikqRmWGqSpGZYapKkZlhqkqRmWGqSpGZYapKkZlhqkqRmWGqSpGZYapKkZlhqkqRmWGqS\npGZYapKkZlhqkqRmWGqSpGZYapKkZlhqkqRmWGqSpGZYapKkZlhqkqRmWGqSpGZYapKkZlhqkqRm\nWGqSpGZYapKkZlhqkqRmWGqSpGZYapKkZlhqkqRmWGqSpGZYapKkZlhqkqRmWGqSpGZYapKkZlhq\nkqRmWGqSpGZYapKkZlhqkqRmWGqSpGZYapKkZlhqkqRmWGqSpGZYapKkZlhqkqRmWGqSpGZYapKk\nZlhqkqRmWGqSpGZYapKkZlhqkqRmdCq1JPuSnEmymOS2EbdfnuT+JA8leTTJ/slHlSRpZWNLLclF\nwFHgBmAvcDjJ3qFhfwwcr6qrgUPAn046qCRJ43R5pXYNsFhVZ6vqeeAe4ODQmAJe15++FDg3uYiS\nJHXTpdQuA54YmF/qLxt0B3BjkiXgBPDRUStKciTJQpKF8+fPryGuJEnL61JqGbGshuYPA3dV1U5g\nP/ClJC9bd1Udq6q5qprbsWPH6tNKkrSCLqW2BOwamN/Jyy8v3gwcB6iq7wKvBrZPIqAkSV11KbUH\ngT1Jdie5mN4HQeaHxvwD8D6AJO+gV2peX5QkTdXYUquqF4BbgfuAx+h9yvFUkjuTHOgP+zhwS5JH\ngLuBm6pq+BKlJEkbaluXQVV1gt4HQAaX3T4wfRp492SjSZK0On6jiCSpGZaaJKkZlpokqRmWmiSp\nGZaaJKkZlpokqRmWmiSpGZaaJKkZlpokqRmWmiSpGZaaJKkZlpokqRmWmiSpGZaaJKkZlpokqRmW\nmiSpGZaaJKkZlpokqRmWmiSpGZaaJKkZlpokqRmWmiSpGZaaJKkZlpokqRmWmiSpGZaaJKkZlpok\nqRmWmiSpGZaaJKkZlpokqRmWmiSpGZaaJKkZlpokqRmWmiSpGZaaJKkZlpokqRmWmiSpGZaaJKkZ\nlpokqRmWmiSpGZaaJKkZlpokqRmWmiSpGZaaJKkZlpokqRmWmiSpGZaaJKkZlpokqRmdSi3JviRn\nkiwmuW2ZMR9IcjrJqSRfnmxMSZLG2zZuQJKLgKPAbwNLwINJ5qvq9MCYPcAngHdX1dNJ3rRRgSVJ\nWk6XV2rXAItVdbaqngfuAQ4OjbkFOFpVTwNU1ZOTjSlJ0nhdSu0y4ImB+aX+skFXAlcm+U6Sk0n2\nTSqgJEldjb38CGTEshqxnj3AdcBO4NtJrqqqn79kRckR4AjA5ZdfvuqwkiStpMsrtSVg18D8TuDc\niDFfrapfVtWPgTP0Su4lqupYVc1V1dyOHTvWmlmSpJG6lNqDwJ4ku5NcDBwC5ofG/BXwXoAk2+ld\njjw7yaCSJI0zttSq6gXgVuA+4DHgeFWdSnJnkgP9YfcBTyU5DdwP/FFVPbVRoSVJGiVVw2+PTcfc\n3FwtLCzMZNtS65J8v6rmZp1Dmja/UUSS1AxLTZLUDEtNktQMS02S1AxLTZLUDEtNktQMS02S1AxL\nTZLUDEtNktQMS02S1AxLTZLUDEtNktQMS02S1AxLTZLUDEtNktQMS02S1AxLTZLUDEtNktQMS02S\n1AxLTZLUDEtNUmdJvpDkySQ/XOb2JPlcksUkjyZ557Qzamuz1CStxl3AvhVuvwHY0/85AvzZFDJJ\nv2KpSeqsqr4F/GyFIQeBL1bPSeD1Sd48nXSSpSZpsi4DnhiYX+ovk6Zi26wDSGpKRiyrlw1KjtC7\nPAmv5F1s3+BU2vx+wk+rasd6V2OpSZqkJWDXwPxO4NzwoKo6BhwDyFtS/PvphNMmdgd/P4nVePlR\n0iTNA7/f/xTktcAzVfWTWYfS1uErNUmdJbkbuA7YnmQJ+BPglQBV9XngBLAfWASeBT40m6Taqiw1\nSZ1V1eExtxfwkSnFkV7Gy4+SpGZYapKkZlhqkqRmWGqSpGZYapKkZlhqkqRmWGqSpGZYapKkZlhq\nkqRmWGqSpGZYapKkZlhqkqRmWGqSpGZYapKkZlhqkqRmWGqSpGZYapKkZlhqkqRmWGqSpGZYapKk\nZnQqtST7kpxJspjkthXGvT9JJZmbXERJm8W4c0GSy5Pcn+ShJI8m2T+LnNq6xpZakouAo8ANwF7g\ncJK9I8ZdAvwh8L1Jh5Q0ex3PBX8MHK+qq4FDwJ9ON6W2ui6v1K4BFqvqbFU9D9wDHBwx7lPAp4Ff\nTDCfpM2jy7mggNf1py8Fzk0xn9Sp1C4DnhiYX+ov+5UkVwO7quprE8wmaXMZey4A7gBuTLIEnAA+\nOp1oUk+XUsuIZfWrG5NXAJ8FPj52RcmRJAtJFs6fP989paTNYMVzQd9h4K6q2gnsB77UP0e8dEUD\n5wKe3YCk2rK6lNoSsGtgficvvaRwCXAV8ECSx4FrgflRHxapqmNVNVdVczt27Fh7akmzMO5cAHAz\ncBygqr4LvBrYPryiwXMBr9mgtNqSupTag8CeJLuTXEzvzd/5F2+sqmeqantVXVFVVwAngQNVtbAh\niSXNyorngr5/AN4HkOQd9ErNyzKamrGlVlUvALcC9wGP0ftk06kkdyY5sNEBJW0OHc8FHwduSfII\ncDdwU1UNX6KUNsy2LoOq6gS9N30Hl92+zNjr1h9L0mY07lxQVaeBd087l/Qiv1FEktQMS02S1AxL\nTZLUDEtNktQMS02S1AxLTZLUDEtNktQMS02S1AxLTZLUDEtNktQMS02S1AxLTZLUDEtNktQMS02S\n1AxLTZLUDEtNktQMS02S1AxLTZLUDEtNktQMS02S1AxLTVJnSfYlOZNkMclty4z5QJLTSU4l+fK0\nM2pr2zbrAJIuDEkuAo4Cvw0sAQ8mma+q0wNj9gCfAN5dVU8nedNs0mqr8pWapK6uARar6mxVPQ/c\nAxwcGnMLcLSqngaoqiennFFbnKUmqavLgCcG5pf6ywZdCVyZ5DtJTibZN2pFSY4kWUiywLMblFZb\nkpcfJXWVEctqaH4bsAe4DtgJfDvJVVX185f8UtUx4BhA3pLhdUhr5is1SV0tAbsG5ncC50aM+WpV\n/bKqfgycoVdy0lRYapK6ehDYk2R3kouBQ8D80Ji/At4LkGQ7vcuRZ6eaUluapSapk6p6AbgVuA94\nDDheVaeS3JnkQH/YfcBTSU4D9wN/VFVPzSaxtiLfU5PUWVWdAE4MLbt9YLqAj/V/pKnzlZokqRmW\nmiSpGZaaJKkZlpokqRmWmiSpGZaaJKkZlpokqRmWmiSpGZaaJKkZlpokqRmWmiSpGZaaJKkZlpok\nqRmWmiSpGZaaJKkZlpokqRmWmiSpGZaaJKkZlpokqRmWmiSpGZ1KLcm+JGeSLCa5bcTtH0tyOsmj\nSb6R5K2Tjypp1sadCwbGvT9JJZmbZj5pbKkluQg4CtwA7AUOJ9k7NOwhYK6qfgu4F/j0pINKmq2O\n5wKSXAL8IfC96SaUur1SuwZYrKqzVfU8cA9wcHBAVd1fVc/2Z08COycbU9ImMPZc0Pcpek9sfzHN\ncBJ0K7XLgCcG5pf6y5ZzM/D1UTckOZJkIcnC+fPnu6eUtBmMPRckuRrYVVVfW2lFg+cCnl1ppLQ6\nXUotI5bVyIHJjcAc8JlRt1fVsaqaq6q5HTt2dE8paTNY8VyQ5BXAZ4GPj1vR4LmA10wwoba8LqW2\nBOwamN8JnBselOR64JPAgap6bjLxJG0i484FlwBXAQ8keRy4Fpj3wyKapi6l9iCwJ8nuJBcDh4D5\nwQH9Sw5/Tq/Qnpx8TEmbwIrngqp6pqq2V9UVVXUFvffXD1TVwmziaisaW2pV9QJwK3Af8BhwvKpO\nJbkzyYH+sM8AvwZ8JcnDSeaXWZ2kC1THc4E0U9u6DKqqE8CJoWW3D0xfP+FckjahceeCoeXXTSOT\nNMhvFJEkNcNSkyQ1w1KTJDXDUpMkNcNSkyQ1w1KTJDXDUpMkNcNSkyQ1w1KTJDXDUpMkNcNSkyQ1\nw1KTJDXDUpMkNcNSkyQ1w1KTJDXDUpMkNcNSkyQ1w1KTJDXDUpMkNcNSk9RZkn1JziRZTHLbiNs/\nluR0kkeTfCPJW2eRU1uXpSapkyQXAUeBG4C9wOEke4eGPQTMVdVvAfcCn55uSm11lpqkrq4BFqvq\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11a0bb208>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()\n",
"ax1 = fig.add_axes([0, 0, 0.5, 1])\n",
"ax2 = fig.add_axes([0.6, 0, 0.3, 0.5], facecolor='g')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Subplots\n",
"\n",
"Subplot syntax is one way to specify the creation of multiple axes."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nYGaWcf8fiv5/FT1ilzQAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x116c18358>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()\n",
"axes = fig.subplots(nrows=2, ncols=3)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nPrq4/7NV9bJlBwWm0VdYLToL87XjoFxVlyW5M8n1SU4kuaWqTmxbdmuSb3T3TyZ5f5I/WnZQYGf6\nCqtFZ2HepjyjfF2Sc939aHc/meTuJDdtW3NTkr9a3P7bJL9YVbW8mMBE+gqrRWdhxqYMylcmeWzL\n9sZi33BNdz+V5JtJXryMgMCu6CusFp2FGTsyYc3ot9bew5pU1akkpxab36mqL084/mG4IsnXDzvE\nRcw535yzJfPO91NLeIxLsa/JvL+uc86WzDvfnLMto6/JpdnZOX9dk3nnk23v9tTZKYPyRpKrtmwf\nS/L4BdZsVNWRJC9M8t/bH6i7Tyc5nSRVtd7da3sJvd/mnC2Zd745Z0vmna+q1pfwMJdcX5N555tz\ntmTe+eaebUkPdcl1ds7Zknnnk23v9trZKW+9eCDJ8aq6uqouT3JzkjPb1pxJ8uuL229M8o/d/Yzf\ndoF9p6+wWnQWZmzHZ5S7+6mqui3JvUkuS/LB7n6oqu5Ist7dZ5L8ZZIPVdW5bP6We/N+hgbG9BVW\ni87CvE1560W6+2ySs9v2vWvL7W8n+dVdHvv0LtcfpDlnS+adb87ZknnnW0q2S7CvybzzzTlbMu98\nl0S2S7Czc86WzDufbHu3p3zl1RsAAHgml7AGAICBfR+U53xpzgnZ3lFVD1fVg1X1iar6iYPKNiXf\nlnVvrKquqgP7tOmUbFX1psX5e6iqPjyXbFX10qq6r6q+sPja3nCA2T5YVU9c6M821aYPLLI/WFWv\nPqhsi+Pr6z7l27JOX3eZT2cvmG22fZ2Y79A6O+e+Ts3nZ+ww2/L72t379i+bH0z41yQvT3J5ki8l\nObFtzW8l+fPF7ZuTfHQ/M+0y2y8k+ZHF7bcdVLap+Rbrnp/kU0nuT7I2l2xJjif5QpIfW2z/+Iyy\nnU7ytsXtE0m+doBf159P8uokX77A/Tck+Xg2/27qa5J8dk7fc/q693yLdfq6t3w6u7fzdih93UW+\nQ+nsnPu6i3PnZ+w439L7ut/PKM/50pw7Zuvu+7r7W4vN+7P59y0PypRzlyTvSfLeJN+eWba3Jrmz\nu7+RJN39xIyydZIXLG6/MM/8m6X7prs/lcHfP93ipiR/3ZvuT/KiqnrJwaTT1/3Mt6Cve8uns880\n575OyneInZ1zX5N5d/aS6+t+D8pzvjTnlGxb3ZrN30IOyo75quraJFd1998fYK5k2rl7RZJXVNWn\n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\nmU9nL5httn2dmO/QOjvnvk7N52fsMNvy+9rd+/Yvmx9M+NckL09yeZIvJTmxbc1vJfnzxe2bk3x0\nPzPtMtsvJPmRxe23HVS2qfkW656f5FNJ7k+yNpdsSY4n+UKSH1ts//iMsp1O8rbF7RNJvnaAX9ef\nT/LqJF++wP03JPl4Nv9u6muSfHZO33P6uvd8i3X6urd8Oru383Yofd1FvkPp7Jz7uotz52fsON/S\n+7rfzyjP+dKcO2br7vu6+1uLzfuz+fctD8qUc5ck70ny3iTfnlm2tya5s7u/kSTd/cSMsnWSFyxu\nvzDP/Jul+6a7P5XB3z/d4qYkf92b7k/yoqp6ycGk09f9zLegr3vLp7PPNOe+Tsp3iJ2dc1+TeXf2\nkuvrfg/Kc74055RsW92azd9CDsqO+arq2iRXdfffH2CuZNq5e0WSV1TVp6vq/qo6OaNs707y5qra\nyOYnzX/7YKJNstvvy4M+tr6O6eve6ez+HfcwL309587Oua/JvDt7yfV10p+HexaWdmnOfTD5uFX1\n5iRrSV63r4m2HXaw7/v5quo5Sd6f5C0HFWiLKefuSDZfGnp9Np8l+Kequqa7/2cG2W5Jcld3/3FV\n/Vw2/z7pNd39v/ucbYrD6sPUY+vrmL7unc7u33Hn/v+TzYUH39k59zWZd2cvub7u9zPKu7k0Z+oi\nl+Y8pGypqjckeWeSG7v7OweQ63t2yvf8JNck+WRVfS2b77U5c0AfOJj6df1Yd3+3u7+a5JFslnoO\n2W5Nck+SdPdnkjw3m9eon4NJ35eHeGx9HdPX/c2ns3s77mH19WnHXphTZ+fc1yn5vrfGz9jd231f\n9/lN1UeSPJrk6vzfm75/etuat+fpHza4Zz8z7TLbtdl80/rxg8i023zb1n8yB/fhoCnn7mSSv1rc\nviKbL3W8eCbZPp7kLYvbr1qUpA7wa/uyXPiDBr+Sp3/Q4HNz+p7T173n27ZeX3eXT2f3dt4Opa+7\nyHconZ1zX3dx7vyMvXDGpfb1IALfkORfFmV452LfHdn87THZ/E3jb5KcS/K5JC8/wJO5U7Z/SPKf\nSb64+HfmoLJNybdt7UEXeadzV0n+JMnDSf45yc0zynYiyacXBf9ikl8+wGwfSfIfSb6bzd9sb03y\nm0l+c8t5u3OR/Z8P8ms68dzp6x7zbVurr7vLp7N7O2+H1teJ+Q6ts3Pu68
gitextract_bf1j6390/
├── .github/
│ └── workflows/
│ └── deploy.yml
├── .gitignore
├── README.md
├── binder/
│ └── Dockerfile
├── final_projects/
│ └── final_project_list.py
├── requirements.txt
├── scripts/
│ ├── clean.py
│ └── templates/
│ └── jekyllmd.tpl
└── src/
├── LICENSE.md
├── _config.yml
├── _toc.yml
├── assignments/
│ ├── basic_pandas.ipynb
│ ├── basic_xarray.ipynb
│ ├── cartopy.ipynb
│ ├── cmip.ipynb
│ ├── files_markdown_git.md
│ ├── more_matplotlib.ipynb
│ ├── more_xarray.ipynb
│ ├── numpy_matplotlib.ipynb
│ ├── pandas_groupby.ipynb
│ └── python_basics_and_functions.ipynb
├── intro.md
├── lectures/
│ ├── basic_scipy/
│ │ ├── more_matplotlib.ipynb
│ │ └── numpy_and_matplotlib.ipynb
│ ├── core_python/
│ │ ├── functions_classes.ipynb
│ │ ├── organization_and_packaging.ipynb
│ │ └── python_fundamentals.ipynb
│ ├── dask/
│ │ ├── dask_arrays.ipynb
│ │ └── intro.md
│ ├── data.ipynb
│ ├── environment/
│ │ ├── binder.ipynb
│ │ ├── intro_to_git.md
│ │ ├── intro_to_jupyterlab.md
│ │ ├── intro_to_unix.md
│ │ └── python_environments.md
│ ├── introduction.md
│ ├── mapping_cartopy.ipynb
│ ├── models/
│ │ ├── cmip.ipynb
│ │ ├── intro_models.ipynb
│ │ ├── regridding.ipynb
│ │ └── xgcm.ipynb
│ ├── pandas/
│ │ ├── basic_pandas.ipynb
│ │ ├── pandas_groupby.ipynb
│ │ └── pandas_intro.md
│ └── xarray/
│ ├── xarray-part2.ipynb
│ ├── xarray.ipynb
│ ├── xarray_intro.md
│ └── xarray_tips_and_tricks.ipynb
└── projects.md
Copy disabled (too large)
Download .json
Condensed preview — 49 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (11,469K chars).
[
{
"path": ".github/workflows/deploy.yml",
"chars": 1241,
"preview": "name: deploy-book\n\n# Trigger the workflow on push to main branch and PRs\non:\n push:\n branches:\n - master\n pull_r"
},
{
"path": ".gitignore",
"chars": 89,
"preview": "*~\n._*\n*.lock\n*.DS_Store\n*.swp\n*.out\n*.py[cod]\n*.pid\n*.ipynb_checkpoints\n_build\nsecrets/\n"
},
{
"path": "README.md",
"chars": 404,
"preview": "# Earth and Environmental Data Science Book\n\n[\nis licensed under"
},
{
"path": "src/_config.yml",
"chars": 2169,
"preview": "title: Earth and Environmental Data Science\nauthor: Ryan Abernathey\ncopyright: 2016-2021\nlogo: eeds-logo.png\nexclude_pat"
},
{
"path": "src/_toc.yml",
"chars": 1897,
"preview": "format: jb-book\nroot: intro\nparts:\n- caption: About this Book\n chapters:\n - file: LICENSE\n - file: projects\n\n- captio"
},
{
"path": "src/assignments/basic_pandas.ipynb",
"chars": 6366,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Assignment: Pandas Fundamentals w"
},
{
"path": "src/assignments/basic_xarray.ipynb",
"chars": 12226,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Assignment: Xarray Fundamentals w"
},
{
"path": "src/assignments/cartopy.ipynb",
"chars": 3220,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Assignment: Making Maps with Cart"
},
{
"path": "src/assignments/cmip.ipynb",
"chars": 57749,
"preview": "{\n \"cells\": [\n {\n \"attachments\": {\n \"8fffbb48-ab88-4728-9e14-56cf8ccb51b7.png\": {\n \"image/png\": \"iVBORw0KGgoAA"
},
{
"path": "src/assignments/files_markdown_git.md",
"chars": 2489,
"preview": "# Assignment: Files, Git, and Github\n\n## Create a Dummy Resume Repository\n\nUse JupyterLab to launch a terminal and use t"
},
{
"path": "src/assignments/more_matplotlib.ipynb",
"chars": 6969,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Assignment: More Matplotlib\\n\",\n "
},
{
"path": "src/assignments/more_xarray.ipynb",
"chars": 29066,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Assignment: More Xarray with El N"
},
{
"path": "src/assignments/numpy_matplotlib.ipynb",
"chars": 9135,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Assignment: Numpy and Matplotlib\\"
},
{
"path": "src/assignments/pandas_groupby.ipynb",
"chars": 7983,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Assignment: Pandas Groupby with H"
},
{
"path": "src/assignments/python_basics_and_functions.ipynb",
"chars": 6373,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Assignment: Basic Python\\n\",\n "
},
{
"path": "src/intro.md",
"chars": 3433,
"preview": "# An Introduction to Earth and Environmental Data Science\n\n## History\n\nThis book grew out of a course developed at Colum"
},
{
"path": "src/lectures/basic_scipy/more_matplotlib.ipynb",
"chars": 1969993,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# More Matplotlib\\n\",\n \"\\n\",\n "
},
{
"path": "src/lectures/basic_scipy/numpy_and_matplotlib.ipynb",
"chars": 248215,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Numpy and Matplotlib\\n\",\n \"\\n\""
},
{
"path": "src/lectures/core_python/functions_classes.ipynb",
"chars": 19176,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Python Functions and Classes\\n\",\n"
},
{
"path": "src/lectures/core_python/organization_and_packaging.ipynb",
"chars": 22253,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Organization and Packaging of Pyt"
},
{
"path": "src/lectures/core_python/python_fundamentals.ipynb",
"chars": 30256,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Python Fundamentals\\n\",\n \"\\n\","
},
{
"path": "src/lectures/dask/dask_arrays.ipynb",
"chars": 789587,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Computing with Dask\"\n ]\n },\n "
},
{
"path": "src/lectures/dask/intro.md",
"chars": 2760,
"preview": "# Dask for Parallel Computing in Python\n\nIn past lectures, we learned how to use numpy, pandas, and xarray to analyze va"
},
{
"path": "src/lectures/data.ipynb",
"chars": 87377,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"id\": \"596b7615-cbce-4e6b-8f81-c3a241b01056\",\n \"metadata\": {},\n \"so"
},
{
"path": "src/lectures/environment/binder.ipynb",
"chars": 12249,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Binder for Reproducible Research\\"
},
{
"path": "src/lectures/environment/intro_to_git.md",
"chars": 5042,
"preview": "# Intro to Git for Version Control\n\n## Overview\n\n[_Version control_](https://en.wikipedia.org/wiki/Version_control) is a"
},
{
"path": "src/lectures/environment/intro_to_jupyterlab.md",
"chars": 2049,
"preview": "# Intro to JupyterLab\n\n[JupyterLab](https://jupyterlab.readthedocs.io) will be our primary method for\ninteracting with t"
},
{
"path": "src/lectures/environment/intro_to_unix.md",
"chars": 18953,
"preview": "# Intro to Unix\n\nAn introduction to basic Unix commands and the file system.\n\n*The notes below are modified from the exc"
},
{
"path": "src/lectures/environment/python_environments.md",
"chars": 15129,
"preview": "# Managing Python Environments\n\n_Note: many elements in this guide 2343 adapted from\n[Daniel Rothenberg](http://danielro"
},
{
"path": "src/lectures/introduction.md",
"chars": 316,
"preview": "Title: Course Introduction\nDate: 9/4/2018\nCategory: Lectures\nAuthor: Ryan Abernathey\n\nHere is the Keynote presentation g"
},
{
"path": "src/lectures/mapping_cartopy.ipynb",
"chars": 2251700,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Maps in Scientific Python\\n\",\n "
},
{
"path": "src/lectures/models/cmip.ipynb",
"chars": 740027,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Working with output from many dif"
},
{
"path": "src/lectures/models/intro_models.ipynb",
"chars": 7440,
"preview": "{\n \"cells\": [\n {\n \"attachments\": {},\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Working Wit"
},
{
"path": "src/lectures/models/regridding.ipynb",
"chars": 973461,
"preview": "{\n \"cells\": [\n {\n \"attachments\": {},\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Model valid"
},
{
"path": "src/lectures/models/xgcm.ipynb",
"chars": 131604,
"preview": "{\n \"cells\": [\n {\n \"attachments\": {},\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Calculating"
},
{
"path": "src/lectures/pandas/basic_pandas.ipynb",
"chars": 436272,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Pandas Fundamentals\"\n ]\n },\n "
},
{
"path": "src/lectures/pandas/pandas_groupby.ipynb",
"chars": 411218,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Pandas: Groupby\\n\",\n \"\\n\",\n "
},
{
"path": "src/lectures/pandas/pandas_intro.md",
"chars": 3497,
"preview": "# Pandas\n\n[Pandas](http://pandas.pydata.org/) is a an open source library providing high-performance, easy-to-use data s"
},
{
"path": "src/lectures/xarray/xarray-part2.ipynb",
"chars": 986867,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Xarray Interpolation, Groupby, Re"
},
{
"path": "src/lectures/xarray/xarray.ipynb",
"chars": 1658230,
"preview": "{\r\n \"cells\": [\r\n {\r\n \"cell_type\": \"markdown\",\r\n \"metadata\": {},\r\n \"source\": [\r\n \"# Xarray Fundamentals\"\r\n ]\r"
},
{
"path": "src/lectures/xarray/xarray_intro.md",
"chars": 3762,
"preview": "# Xarray for multidimensional gridded data\n\nIn the previous set of lectures, we saw how Pandas provided a way to keep tr"
},
{
"path": "src/lectures/xarray/xarray_tips_and_tricks.ipynb",
"chars": 173177,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Xarray Tips and Tricks\"\n ]\n },"
},
{
"path": "src/projects.md",
"chars": 12887,
"preview": "# Final Projects\n\nWhen taught at Columbia, the capstone of this course has been a final project.\nThese final projects ar"
}
]
About this extraction
This page contains the full source code of the earth-env-data-science/earth-env-data-science-book GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 49 files (10.7 MB), approximately 2.8M tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.