├── tutorial ├── images │ ├── stack.png │ ├── dataset-diagram.png │ ├── collections-schedulers.png │ ├── xarray-data-structures.png │ ├── scientific-python-28-638.jpg │ └── transpose.svg ├── 1.4.xarray-visualization.ipynb ├── 1.5.xarray-input-and-output.ipynb ├── 1.2.xarray-the-power-of-labels.ipynb ├── 1.6.xarray-and-dask.ipynb ├── 1.1.xarray-data-structures.ipynb ├── 1.3.xarray-computation-toolkit.ipynb ├── 1.0.scientific_python_ecosystem.ipynb └── data │ └── co2.csv ├── README.md ├── binder ├── postBuild ├── start └── environment.yml ├── .dask └── config.yaml └── getting_started.ipynb /tutorial/images/stack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhamman/xarray_tutorial/HEAD/tutorial/images/stack.png -------------------------------------------------------------------------------- /tutorial/images/dataset-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhamman/xarray_tutorial/HEAD/tutorial/images/dataset-diagram.png -------------------------------------------------------------------------------- /tutorial/images/collections-schedulers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhamman/xarray_tutorial/HEAD/tutorial/images/collections-schedulers.png -------------------------------------------------------------------------------- /tutorial/images/xarray-data-structures.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhamman/xarray_tutorial/HEAD/tutorial/images/xarray-data-structures.png -------------------------------------------------------------------------------- /tutorial/images/scientific-python-28-638.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhamman/xarray_tutorial/HEAD/tutorial/images/scientific-python-28-638.jpg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Xarray Tutorial for Binder 2 | ========================== 3 | 4 | [![Binder](http://binder.pangeo.io/badge.svg)](http://binder.pangeo.io/v2/gh/jhamman/xarray_tutorial/master) 5 | 6 | More coming soon. 7 | -------------------------------------------------------------------------------- /binder/postBuild: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | jupyter serverextension enable --py nbserverproxy --sys-prefix 3 | jupyter labextension install @jupyter-widgets/jupyterlab-manager \ 4 | @jupyterlab/hub-extension \ 5 | @pyviz/jupyterlab_pyviz \ 6 | jupyter-leaflet \ 7 | dask-labextension 8 | 9 | #EOF 10 | -------------------------------------------------------------------------------- /binder/start: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | export DASK_KUBERNETES__WORKER_TEMPLATE_PATH=${PWD}/.dask/config.yaml 4 | export DASK_KUBERNETES__WORKER_NAME=dask-{JUPYTERHUB_USER}-{uuid} 5 | 6 | 7 | # set worker image url in worker template 8 | if [[ -z "${JUPYTER_IMAGE_SPEC}" ]]; then 9 | echo "JUPYTER_IMAGE_SPEC is not set" 10 | else 11 | sed -i -e "s|WORKER_IMAGE|${JUPYTER_IMAGE_SPEC}|g" ${DASK_KUBERNETES__WORKER_TEMPLATE_PATH} 12 | fi 13 | 14 | exec "$@" 15 | -------------------------------------------------------------------------------- /binder/environment.yml: -------------------------------------------------------------------------------- 1 | name: xarray 2 | channels: 3 | - conda-forge 4 | - intake 5 | - default 6 | dependencies: 7 | - python=3.6 8 | - numpy 9 | - scipy 10 | - pandas 11 | - xarray 12 | - matplotlib 13 | - dask 14 | - distributed 15 | - bokeh 16 | - holoviews 17 | - geoviews 18 | - netcdf4 19 | - zarr 20 | - numcodecs 21 | - python-blosc 22 | - lz4 23 | - nbserverproxy 24 | - jupyterlab 25 | - ipywidgets 26 | - graphviz 27 | - pip: 28 | - kubernetes 29 | - git+https://github.com/dask/dask-kubernetes.git 30 | -------------------------------------------------------------------------------- /.dask/config.yaml: -------------------------------------------------------------------------------- 1 | distributed: 2 | logging: 3 | bokeh: critical 4 | 5 | dashboard: 6 | link: /user/{JUPYTERHUB_USER}/proxy/{port}/status 7 | 8 | admin: 9 | tick: 10 | limit: 5s 11 | 12 | kubernetes: 13 | worker-template: 14 | metadata: 15 | spec: 16 | restartPolicy: Never 17 | containers: 18 | - args: 19 | - dask-worker 20 | - --nthreads 21 | - '2' 22 | - --no-bokeh 23 | - --memory-limit 24 | - 6GB 25 | - --death-timeout 26 | - '60' 27 | image: null # overwrite with env variable 28 | name: dask-worker 29 | resources: 30 | limits: 31 | cpu: "1.75" 32 | memory: 2G 33 | requests: 34 | cpu: "1.75" 35 | memory: 2G 36 | -------------------------------------------------------------------------------- /tutorial/1.4.xarray-visualization.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Plotting and Visualization\n", 8 | "\n", 9 | "Labeled data enables expressive computations. These same labels can also be used to easily create informative plots.\n", 10 | "\n", 11 | "xarray plotting functionality is a thin wrapper around the popular matplotlib library. Matplotlib syntax and function names were copied as much as possible, which makes for an easy transition between the two.\n", 12 | "\n", 13 | "### Outline\n", 14 | "- Matplotlib Integration\n", 15 | "- Maps using Cartopy\n", 16 | "- Extensions using Bokeh/Holoviews/Geoviews\n", 17 | "\n", 18 | "### Tutorial Duriation\n", 19 | "10 minutes\n", 20 | "\n", 21 | "### Going Further\n", 22 | "\n", 23 | "Xarray's Documentation on Plotting: http://xarray.pydata.org/en/latest/plotting.htm\n" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": null, 29 | "metadata": {}, 30 | "outputs": [], 31 | "source": [ 32 | "%matplotlib inline\n", 33 | "\n", 34 | "import xarray as xr\n", 35 | "import matplotlib.pyplot as plt\n", 36 | "\n", 37 | "\n", 38 | "# load some tutorial data\n", 39 | "ds = xr.tutorial.load_dataset('air_temperature')" 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": {}, 45 | "source": [ 46 | "## Plotting 1d data" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": null, 52 | "metadata": {}, 53 | "outputs": [], 54 | "source": [ 55 | "da_point_resample = ds['air'].isel(lat=20, lon=40).resample(time='1D')\n", 56 | "\n", 57 | "t_max = da_point_resample.max('time')\n", 58 | "t_min = da_point_resample.min('time')\n", 59 | "t_max.plot(label='t_max')\n", 60 | "t_min.plot(label='t_min')\n", 61 | "plt.legend()" 62 | ] 63 | }, 64 | { 65 | "cell_type": "markdown", 66 | "metadata": {}, 67 | "source": [ 68 | "## Plotting 2d Data" 69 | ] 70 | }, 71 | { 72 | "cell_type": "code", 73 | "execution_count": null, 74 | "metadata": {}, 75 | "outputs": [], 76 | "source": [ 77 | "t_mean = ds['air'].mean('time')\n", 78 | "\n", 79 | "t_mean.plot()" 80 | ] 81 | }, 82 | { 83 | "cell_type": "markdown", 84 | "metadata": {}, 85 | "source": [ 86 | "## Plotting >2d Data" 87 | ] 88 | }, 89 | { 90 | "cell_type": "code", 91 | "execution_count": null, 92 | "metadata": {}, 93 | "outputs": [], 94 | "source": [ 95 | "ds['air'].plot()" 96 | ] 97 | }, 98 | { 99 | "cell_type": "markdown", 100 | "metadata": {}, 101 | "source": [ 102 | "## FacetGrid Plots" 103 | ] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": null, 108 | "metadata": {}, 109 | "outputs": [], 110 | "source": [ 111 | "# Calculate some seasonal anomalies\n", 112 | "\n", 113 | "da_month = ds['air'].resample(time='QS-Dec').mean('time')\n", 114 | "\n", 115 | "climatology = da_month.groupby('time.season').mean('time')\n", 116 | "anomalies = da_month.groupby('time.season') - climatology\n", 117 | "anomalies" 118 | ] 119 | }, 120 | { 121 | "cell_type": "code", 122 | "execution_count": null, 123 | "metadata": {}, 124 | "outputs": [], 125 | "source": [ 126 | "anomalies.plot(col='time', col_wrap=4)" 127 | ] 128 | }, 129 | { 130 | "cell_type": "markdown", 131 | "metadata": {}, 132 | "source": [ 133 | "## Plotting maps using Cartopy" 134 | ] 135 | }, 136 | { 137 | "cell_type": "code", 138 | "execution_count": null, 139 | "metadata": {}, 140 | "outputs": [], 141 | "source": [ 142 | "import cartopy.crs as ccrs" 143 | ] 144 | }, 145 | { 146 | "cell_type": "code", 147 | "execution_count": null, 148 | "metadata": {}, 149 | "outputs": [], 150 | "source": [ 151 | "ax = plt.axes(projection=ccrs.Orthographic(-80, 35))\n", 152 | "t_mean.plot.contourf(ax=ax, transform=ccrs.PlateCarree())\n", 153 | "ax.set_global()\n", 154 | "ax.coastlines()" 155 | ] 156 | }, 157 | { 158 | "cell_type": "markdown", 159 | "metadata": {}, 160 | "source": [ 161 | "## Plotting using Holoviews and Geoviews" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": null, 167 | "metadata": {}, 168 | "outputs": [], 169 | "source": [ 170 | "import holoviews as hv\n", 171 | "import geoviews as gv\n", 172 | "import geoviews.feature as gf\n", 173 | "\n", 174 | "hv.notebook_extension()\n" 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": null, 180 | "metadata": {}, 181 | "outputs": [], 182 | "source": [ 183 | "# initialize the holoviews dataset\n", 184 | "ds_hv = hv.Dataset(t_mean)\n", 185 | "ds_hv" 186 | ] 187 | }, 188 | { 189 | "cell_type": "code", 190 | "execution_count": null, 191 | "metadata": {}, 192 | "outputs": [], 193 | "source": [ 194 | "# make a plot with holoviews\n", 195 | "%opts Image [colorbar=True fig_size=200] (cmap='viridis')\n", 196 | "ds_hv.to(hv.Image, ['lon', 'lat'])" 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": null, 202 | "metadata": {}, 203 | "outputs": [], 204 | "source": [ 205 | "# repeat the same steps but now use geoviews\n", 206 | "%opts Image [colorbar=True fig_size=200] (cmap='viridis')\n", 207 | "ds_hv.to(gv.Image, ['lon', 'lat'], ['air'], ['time']) * gf.coastline()" 208 | ] 209 | }, 210 | { 211 | "cell_type": "code", 212 | "execution_count": null, 213 | "metadata": {}, 214 | "outputs": [], 215 | "source": [ 216 | "# This may require the legacy notebook interface?\n", 217 | "%opts Image [colorbar=True fig_size=200] (cmap='RdBu_r')\n", 218 | "ds_hv2 = hv.Dataset(anomalies)\n", 219 | "ds_hv2.to(gv.Image, ['lon', 'lat'], ['air'], ['time']) * gf.coastline()" 220 | ] 221 | }, 222 | { 223 | "cell_type": "code", 224 | "execution_count": null, 225 | "metadata": {}, 226 | "outputs": [], 227 | "source": [] 228 | }, 229 | { 230 | "cell_type": "code", 231 | "execution_count": null, 232 | "metadata": {}, 233 | "outputs": [], 234 | "source": [] 235 | } 236 | ], 237 | "metadata": { 238 | "kernelspec": { 239 | "display_name": "Python (pangeo)", 240 | "language": "python", 241 | "name": "pangeo" 242 | }, 243 | "language_info": { 244 | "codemirror_mode": { 245 | "name": "ipython", 246 | "version": 3 247 | }, 248 | "file_extension": ".py", 249 | "mimetype": "text/x-python", 250 | "name": "python", 251 | "nbconvert_exporter": "python", 252 | "pygments_lexer": "ipython3", 253 | "version": "3.6.5" 254 | } 255 | }, 256 | "nbformat": 4, 257 | "nbformat_minor": 2 258 | } 259 | -------------------------------------------------------------------------------- /tutorial/1.5.xarray-input-and-output.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Input and Output\n", 8 | "\n", 9 | "Xarray supports direct serialization and I/O to several file formats including pickle, netCDF, OPeNDAP (read-only), GRIB1/2 (read-only), and HDF by integrating with third-party libraries. Additional serialization formats for 1-dimensional data are available through pandas.\n", 10 | "\n", 11 | "File types\n", 12 | "- Pickle\n", 13 | "- NetCDF 3/4\n", 14 | "- RasterIO\n", 15 | "- Zarr\n", 16 | "- PyNio\n", 17 | "\n", 18 | "Interoperability\n", 19 | "- Pandas\n", 20 | "- Iris\n", 21 | "- CDMS\n", 22 | "- dask DataFrame\n", 23 | "\n", 24 | "### Tutorial Duriation\n", 25 | "10 minutes\n", 26 | "\n", 27 | "### Going Further\n", 28 | "\n", 29 | "Xarray I/O Documentation: http://xarray.pydata.org/en/latest/io.html" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": null, 35 | "metadata": {}, 36 | "outputs": [], 37 | "source": [ 38 | "%matplotlib inline\n", 39 | "\n", 40 | "import os\n", 41 | "\n", 42 | "import xarray as xr" 43 | ] 44 | }, 45 | { 46 | "cell_type": "markdown", 47 | "metadata": {}, 48 | "source": [ 49 | "## Setup" 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "execution_count": null, 55 | "metadata": {}, 56 | "outputs": [], 57 | "source": [ 58 | "ds = xr.tutorial.load_dataset('rasm') # this actually loads data using xr.open_dataset\n", 59 | "ds" 60 | ] 61 | }, 62 | { 63 | "cell_type": "markdown", 64 | "metadata": {}, 65 | "source": [ 66 | "## Saving xarray datasets as netcdf files\n", 67 | "\n", 68 | "Xarray provides a high-level method for writing netCDF files directly from Xarray Datasets/DataArrays." 69 | ] 70 | }, 71 | { 72 | "cell_type": "code", 73 | "execution_count": null, 74 | "metadata": {}, 75 | "outputs": [], 76 | "source": [ 77 | "# writing data to a netcdf file\n", 78 | "ds.to_netcdf('./data/rasm.nc')" 79 | ] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "execution_count": null, 84 | "metadata": {}, 85 | "outputs": [], 86 | "source": [ 87 | "!ncdump -h ./data/rasm.nc" 88 | ] 89 | }, 90 | { 91 | "cell_type": "markdown", 92 | "metadata": {}, 93 | "source": [ 94 | "# Opening xarray datasets\n", 95 | "\n", 96 | "Xarray's `open_dataset` and `open_mfdataset` are the primary functions for opening local or remote datasets such as netCDF, GRIB, OpenDap, and HDF. These operations are all supported by third party libraries (engines) for which xarray provides a common interface. " 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": null, 102 | "metadata": {}, 103 | "outputs": [], 104 | "source": [ 105 | "ds2 = xr.open_dataset('./data/rasm.nc', engine='netcdf4')\n", 106 | "ds2\n", 107 | "\n", 108 | "# Note that only metadata/coordinates were actually read\n", 109 | "# The rest of the dataset remains on disk (aka lazy loading)" 110 | ] 111 | }, 112 | { 113 | "cell_type": "code", 114 | "execution_count": null, 115 | "metadata": {}, 116 | "outputs": [], 117 | "source": [ 118 | "assert ds is not ds2 # they aren't the same dataset\n", 119 | "assert ds.equals(ds2) # but they are equal" 120 | ] 121 | }, 122 | { 123 | "cell_type": "markdown", 124 | "metadata": {}, 125 | "source": [ 126 | "*Definition*\n", 127 | "\n", 128 | "**Roundtrip**: the ability to read/write a dataset without changing its contents" 129 | ] 130 | }, 131 | { 132 | "cell_type": "markdown", 133 | "metadata": {}, 134 | "source": [ 135 | "## Multifile datasets\n", 136 | "\n", 137 | "Xarray can read/write multifile datasets using the `open_mfdataset` and `save_mfdataset` functions. " 138 | ] 139 | }, 140 | { 141 | "cell_type": "code", 142 | "execution_count": null, 143 | "metadata": {}, 144 | "outputs": [], 145 | "source": [ 146 | "years, datasets = zip(*ds.groupby('time.year'))\n", 147 | "paths = ['./data/%s.nc' % y for y in years]\n", 148 | "print(paths)" 149 | ] 150 | }, 151 | { 152 | "cell_type": "code", 153 | "execution_count": null, 154 | "metadata": {}, 155 | "outputs": [], 156 | "source": [ 157 | "# write the 4 netcdf files\n", 158 | "xr.save_mfdataset(datasets, paths)" 159 | ] 160 | }, 161 | { 162 | "cell_type": "code", 163 | "execution_count": null, 164 | "metadata": {}, 165 | "outputs": [], 166 | "source": [ 167 | "!ls ./data/\n", 168 | "!ncdump -h data/1981.nc" 169 | ] 170 | }, 171 | { 172 | "cell_type": "code", 173 | "execution_count": null, 174 | "metadata": {}, 175 | "outputs": [], 176 | "source": [ 177 | "# open a group of files and concatenate them into a single xarray.Dataset\n", 178 | "ds3 = xr.open_mfdataset('./data/19*nc')\n", 179 | "assert ds3.equals(ds2)" 180 | ] 181 | }, 182 | { 183 | "cell_type": "markdown", 184 | "metadata": {}, 185 | "source": [ 186 | "## Zarr\n", 187 | "\n", 188 | "Zarr is a Python package providing an implementation of chunked, compressed, N-dimensional arrays. Zarr has the ability to store arrays in a range of ways, including in memory, in files, and in cloud-based object storage such as Amazon S3 and Google Cloud Storage. Xarray’s Zarr backend allows xarray to leverage these capabilities.\n", 189 | "\n", 190 | "*Note: Zarr support is still an experimental feature. Please report any bugs or unexepected behavior via github issues.*" 191 | ] 192 | }, 193 | { 194 | "cell_type": "code", 195 | "execution_count": null, 196 | "metadata": {}, 197 | "outputs": [], 198 | "source": [ 199 | "# Zarr\n", 200 | "ds.to_zarr('./data/rasm.zarr', mode='w')" 201 | ] 202 | }, 203 | { 204 | "cell_type": "code", 205 | "execution_count": null, 206 | "metadata": {}, 207 | "outputs": [], 208 | "source": [ 209 | "!ls data/*zarr\n", 210 | "!du -h data/*zarr" 211 | ] 212 | }, 213 | { 214 | "cell_type": "code", 215 | "execution_count": null, 216 | "metadata": {}, 217 | "outputs": [], 218 | "source": [ 219 | "import zarr\n", 220 | "compressor = zarr.Blosc(clevel=2, shuffle=-1)\n", 221 | "ds.to_zarr('./data/rasm_compressed.zarr', mode='w', encoding={var: {'compressor': compressor} for var in ds.variables})" 222 | ] 223 | }, 224 | { 225 | "cell_type": "code", 226 | "execution_count": null, 227 | "metadata": {}, 228 | "outputs": [], 229 | "source": [ 230 | "!ls data/*zarr\n", 231 | "!du -h data/*zarr" 232 | ] 233 | }, 234 | { 235 | "cell_type": "markdown", 236 | "metadata": {}, 237 | "source": [ 238 | "## Interoperability\n", 239 | "\n", 240 | "Xarray objects include exports methods that allow users to transform data from the Xarray data model to other data models such as Pandas, Iris, and CDMS. \n", 241 | "\n", 242 | "Below is a quick example of how to export a time series from Xarray to Pandas. " 243 | ] 244 | }, 245 | { 246 | "cell_type": "code", 247 | "execution_count": null, 248 | "metadata": {}, 249 | "outputs": [], 250 | "source": [ 251 | "t_series = ds.isel(x=100, y=100)['Tair'].to_pandas()\n", 252 | "t_series.head()" 253 | ] 254 | }, 255 | { 256 | "cell_type": "code", 257 | "execution_count": null, 258 | "metadata": {}, 259 | "outputs": [], 260 | "source": [ 261 | "t_series.to_csv('data/rasm_point.csv')" 262 | ] 263 | } 264 | ], 265 | "metadata": { 266 | "kernelspec": { 267 | "display_name": "Python (pangeo)", 268 | "language": "python", 269 | "name": "pangeo" 270 | }, 271 | "language_info": { 272 | "codemirror_mode": { 273 | "name": "ipython", 274 | "version": 3 275 | }, 276 | "file_extension": ".py", 277 | "mimetype": "text/x-python", 278 | "name": "python", 279 | "nbconvert_exporter": "python", 280 | "pygments_lexer": "ipython3", 281 | "version": "3.6.5" 282 | } 283 | }, 284 | "nbformat": 4, 285 | "nbformat_minor": 2 286 | } 287 | -------------------------------------------------------------------------------- /tutorial/1.2.xarray-the-power-of-labels.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# The Power of labeled data structures\n", 8 | "\n", 9 | "***Purpose: Your data has labels; you should use them***\n", 10 | "\n", 11 | "![](images/dataset-diagram.png)\n", 12 | "\n", 13 | "Scientific data is inherently labeled. For example, time series data includes timestamps that label individual periods or points in time, spatial data has coordinates (e.g. longitude, latitude, elevation), and model or laboratory experiments are often identified by unique identifiers. The figure above provides an example of a labeled dataset. In this case the data is a map of global air temperature from a numeric weather model. The labels on this particular dataset are time (e.g. “2016-05-01”), longitude (x-axis), and latitude (y-axis).\n", 14 | "\n", 15 | "----\n", 16 | "\n", 17 | "### Outline\n", 18 | "- Numpy index (in brief)\n", 19 | "- Named dimensions/axes\n", 20 | "- Coordinate labels\n", 21 | "- Label based indexing\n", 22 | "- Alignment\n", 23 | "\n", 24 | "### Tutorial Duriation\n", 25 | "10 minutes\n", 26 | "\n", 27 | "### Going Further\n", 28 | "\n", 29 | "Xarray Documentation on Indexing: http://xarray.pydata.org/en/latest/indexing.html" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": null, 35 | "metadata": {}, 36 | "outputs": [], 37 | "source": [ 38 | "import xarray as xr\n" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": null, 44 | "metadata": {}, 45 | "outputs": [], 46 | "source": [ 47 | "# load a sample dataset\n", 48 | "ds = xr.tutorial.load_dataset('air_temperature')\n", 49 | "ds" 50 | ] 51 | }, 52 | { 53 | "cell_type": "markdown", 54 | "metadata": {}, 55 | "source": [ 56 | "## The old way (numpy positional indexing)\n", 57 | "\n", 58 | "When working with numpy, indexing is done by position (slices/ranges/scalars). " 59 | ] 60 | }, 61 | { 62 | "cell_type": "code", 63 | "execution_count": null, 64 | "metadata": {}, 65 | "outputs": [], 66 | "source": [ 67 | "t = ds['air'].data # numpy array\n", 68 | "t" 69 | ] 70 | }, 71 | { 72 | "cell_type": "code", 73 | "execution_count": null, 74 | "metadata": {}, 75 | "outputs": [], 76 | "source": [ 77 | "t.shape" 78 | ] 79 | }, 80 | { 81 | "cell_type": "code", 82 | "execution_count": null, 83 | "metadata": {}, 84 | "outputs": [], 85 | "source": [ 86 | "# extract a time-series for one spatial location\n", 87 | "t[:, 10, 20]" 88 | ] 89 | }, 90 | { 91 | "cell_type": "markdown", 92 | "metadata": {}, 93 | "source": [ 94 | "but wait, what labels go with `10` and `20`? Was that lat/lon or lon/lat? Where are the timestamps that go along with this time-series?" 95 | ] 96 | }, 97 | { 98 | "cell_type": "markdown", 99 | "metadata": {}, 100 | "source": [ 101 | "# Indexing with Xarray\n", 102 | "\n", 103 | "xarray offers extremely flexible indexing routines that combine the best features of NumPy and pandas for data selection." 104 | ] 105 | }, 106 | { 107 | "cell_type": "code", 108 | "execution_count": null, 109 | "metadata": {}, 110 | "outputs": [], 111 | "source": [ 112 | "da = ds['air']" 113 | ] 114 | }, 115 | { 116 | "cell_type": "code", 117 | "execution_count": null, 118 | "metadata": {}, 119 | "outputs": [], 120 | "source": [ 121 | "# numpy style indexing still works (but preserves the labels/metadata)\n", 122 | "da[:, 10, 20]" 123 | ] 124 | }, 125 | { 126 | "cell_type": "code", 127 | "execution_count": null, 128 | "metadata": {}, 129 | "outputs": [], 130 | "source": [ 131 | "# Positional indexing using dimension names\n", 132 | "da.isel(lat=10, lon=20)" 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": null, 138 | "metadata": {}, 139 | "outputs": [], 140 | "source": [ 141 | "# Label-based indexing\n", 142 | "da.sel(lat=50., lon=250.)" 143 | ] 144 | }, 145 | { 146 | "cell_type": "code", 147 | "execution_count": null, 148 | "metadata": {}, 149 | "outputs": [], 150 | "source": [ 151 | "# Nearest neighbor lookups\n", 152 | "da.sel(lat=52.25, lon=251.8998, method='nearest')" 153 | ] 154 | }, 155 | { 156 | "cell_type": "code", 157 | "execution_count": null, 158 | "metadata": {}, 159 | "outputs": [], 160 | "source": [ 161 | "# all of these indexing methods work on the dataset too, e.g.:\n", 162 | "ds.sel(lat=52.25, lon=251.8998, method='nearest')" 163 | ] 164 | }, 165 | { 166 | "cell_type": "markdown", 167 | "metadata": {}, 168 | "source": [ 169 | "## Vectorized indexing\n", 170 | "\n", 171 | "Like numpy and pandas, xarray supports indexing many array elements at once in a vectorized manner." 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": null, 177 | "metadata": {}, 178 | "outputs": [], 179 | "source": [ 180 | "# generate a coordinates for a transect of points\n", 181 | "lat_points = xr.DataArray([52, 52.5, 53], dims='points')\n", 182 | "lon_points = xr.DataArray([250, 250, 250], dims='points')" 183 | ] 184 | }, 185 | { 186 | "cell_type": "code", 187 | "execution_count": null, 188 | "metadata": {}, 189 | "outputs": [], 190 | "source": [ 191 | "# nearest neighbor selection along the transect\n", 192 | "da.sel(lat=lat_points, lon=lon_points, method='nearest')" 193 | ] 194 | }, 195 | { 196 | "cell_type": "markdown", 197 | "metadata": {}, 198 | "source": [ 199 | "## Alignment\n", 200 | "\n", 201 | "xarray enforces alignment between index Coordinates (that is, coordinates with the same name as a dimension, marked by *) on objects used in binary operations." 202 | ] 203 | }, 204 | { 205 | "cell_type": "code", 206 | "execution_count": null, 207 | "metadata": {}, 208 | "outputs": [], 209 | "source": [ 210 | "da" 211 | ] 212 | }, 213 | { 214 | "cell_type": "code", 215 | "execution_count": null, 216 | "metadata": {}, 217 | "outputs": [], 218 | "source": [ 219 | "arr = da.isel(time=0, lat=slice(5, 10), lon=slice(7, 11))\n", 220 | "arr" 221 | ] 222 | }, 223 | { 224 | "cell_type": "code", 225 | "execution_count": null, 226 | "metadata": {}, 227 | "outputs": [], 228 | "source": [ 229 | "part = arr[:-1]\n", 230 | "part" 231 | ] 232 | }, 233 | { 234 | "cell_type": "code", 235 | "execution_count": null, 236 | "metadata": {}, 237 | "outputs": [], 238 | "source": [ 239 | "# default behavior is an \"inner join\"\n", 240 | "(arr + part) / 2" 241 | ] 242 | }, 243 | { 244 | "cell_type": "code", 245 | "execution_count": null, 246 | "metadata": {}, 247 | "outputs": [], 248 | "source": [ 249 | "# we can also use an outer join\n", 250 | "with xr.set_options(arithmetic_join=\"outer\"):\n", 251 | " print((arr + part) / 2)\n", 252 | " \n", 253 | "# notice that missing values (nan) were inserted" 254 | ] 255 | }, 256 | { 257 | "cell_type": "markdown", 258 | "metadata": {}, 259 | "source": [ 260 | "## Broadcasting\n", 261 | "\n", 262 | "DataArray objects are automatically align themselves (“broadcasting” in the numpy parlance) by dimension name instead of axis order. With xarray, you do not need to transpose arrays or insert dimensions of length 1 to get array operations to work, as commonly done in numpy with np.reshape() or np.newaxis." 263 | ] 264 | }, 265 | { 266 | "cell_type": "code", 267 | "execution_count": null, 268 | "metadata": {}, 269 | "outputs": [], 270 | "source": [ 271 | "mults = xr.DataArray([1, 2], [('mult', ['one', 'two'])])\n", 272 | "mults" 273 | ] 274 | }, 275 | { 276 | "cell_type": "code", 277 | "execution_count": null, 278 | "metadata": {}, 279 | "outputs": [], 280 | "source": [ 281 | "arr * mults" 282 | ] 283 | }, 284 | { 285 | "cell_type": "code", 286 | "execution_count": null, 287 | "metadata": {}, 288 | "outputs": [], 289 | "source": [] 290 | } 291 | ], 292 | "metadata": { 293 | "kernelspec": { 294 | "display_name": "Python (pangeo)", 295 | "language": "python", 296 | "name": "pangeo" 297 | }, 298 | "language_info": { 299 | "codemirror_mode": { 300 | "name": "ipython", 301 | "version": 3 302 | }, 303 | "file_extension": ".py", 304 | "mimetype": "text/x-python", 305 | "name": "python", 306 | "nbconvert_exporter": "python", 307 | "pygments_lexer": "ipython3", 308 | "version": "3.6.5" 309 | } 310 | }, 311 | "nbformat": 4, 312 | "nbformat_minor": 2 313 | } 314 | -------------------------------------------------------------------------------- /tutorial/1.6.xarray-and-dask.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Xarray and parallel computing with dask\n", 8 | "\n", 9 | "xarray integrates with dask to support parallel computations and streaming computation on datasets that don’t fit into memory.\n", 10 | "\n", 11 | "### Outline\n", 12 | "- reading and writing data\n", 13 | "- automatic parallelization\n", 14 | "- dask schedulers and deployments\n", 15 | "\n", 16 | "### Tutorial Duriation\n", 17 | "10 minutes\n", 18 | "\n", 19 | "### Going Further\n", 20 | "\n", 21 | "- Xarray's Documentation on using dask: http://xarray.pydata.org/en/latest/dask.html\n", 22 | "- Dask's Documentation: http://dask.pydata.org/en/latest/" 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": {}, 28 | "source": [ 29 | "## Dask\n", 30 | "\n", 31 | "Dask is a flexible parallel computing library for analytic computing.\n", 32 | "\n", 33 | "Dask is composed of two components:\n", 34 | "\n", 35 | "- Dynamic task scheduling optimized for computation. This is similar to Airflow, Luigi, Celery, or Make, but optimized for interactive computational workloads.\n", 36 | "- “Big Data” collections like parallel arrays, dataframes, and lists that extend common interfaces like NumPy, Pandas, or Python iterators to larger-than-memory or distributed environments. These parallel collections run on top of the dynamic task schedulers.\n", 37 | "\n", 38 | "![](images/collections-schedulers.png)\n", 39 | "\n", 40 | "\n", 41 | "Dask works by constructing \"task graphs\"\n", 42 | "\n", 43 | "![](images/transpose.svg)\n" 44 | ] 45 | }, 46 | { 47 | "cell_type": "markdown", 48 | "metadata": {}, 49 | "source": [ 50 | "## Reading and Writing data\n", 51 | "\n", 52 | "The usual way to create a dataset filled with dask arrays is to load the data from a netCDF file or files. You can do this by supplying a chunks argument to open_dataset() or using the open_mfdataset() function." 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": null, 58 | "metadata": {}, 59 | "outputs": [], 60 | "source": [ 61 | "%matplotlib inline\n", 62 | "\n", 63 | "import xarray as xr\n", 64 | "import numpy as np\n", 65 | "\n", 66 | "np.warnings.filterwarnings('ignore')\n" 67 | ] 68 | }, 69 | { 70 | "cell_type": "code", 71 | "execution_count": null, 72 | "metadata": {}, 73 | "outputs": [], 74 | "source": [ 75 | "# use dask's distributed scheduler for now\n", 76 | "# (see the last section of this notebook for more details)\n", 77 | "from distributed import Client, progress\n", 78 | "client = Client()\n", 79 | "client" 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": null, 85 | "metadata": {}, 86 | "outputs": [], 87 | "source": [ 88 | "ds = xr.open_dataset('./data/rasm.nc', chunks={'time': 10}) # this actually loads data using xr.open_dataset\n", 89 | "ds" 90 | ] 91 | }, 92 | { 93 | "cell_type": "code", 94 | "execution_count": null, 95 | "metadata": {}, 96 | "outputs": [], 97 | "source": [ 98 | "# xarray is now using dask arrays under the hood\n", 99 | "ds['Tair'].data" 100 | ] 101 | }, 102 | { 103 | "cell_type": "code", 104 | "execution_count": null, 105 | "metadata": {}, 106 | "outputs": [], 107 | "source": [ 108 | "## Xarray operations using dask are now lazy\n", 109 | "t_range = (ds['Tair'].resample(time='AS').max('time') -\n", 110 | " ds['Tair'].resample(time='AS').min('time')).mean('time')" 111 | ] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "execution_count": null, 116 | "metadata": {}, 117 | "outputs": [], 118 | "source": [ 119 | "t_range.data.visualize()" 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": null, 125 | "metadata": {}, 126 | "outputs": [], 127 | "source": [ 128 | "results = t_range.persist()\n", 129 | "progress(results)" 130 | ] 131 | }, 132 | { 133 | "cell_type": "code", 134 | "execution_count": null, 135 | "metadata": {}, 136 | "outputs": [], 137 | "source": [ 138 | "results" 139 | ] 140 | }, 141 | { 142 | "cell_type": "markdown", 143 | "metadata": {}, 144 | "source": [ 145 | "## Automatic parallelization\n", 146 | "\n", 147 | "Almost all of xarray’s built-in operations work on dask arrays. If you want to use a function that isn’t wrapped by xarray, one option is to extract dask arrays from xarray objects (.data) and use dask directly.\n", 148 | "\n", 149 | "Another option is to use xarray’s apply_ufunc(), which can automate embarrassingly parallel “map” type operations where a functions written for processing NumPy arrays should be repeatedly applied to xarray objects containing dask arrays. It works similarly to `dask.array.map_blocks()` and `dask.array.atop()`, but without requiring an intermediate layer of abstraction." 150 | ] 151 | }, 152 | { 153 | "cell_type": "code", 154 | "execution_count": null, 155 | "metadata": {}, 156 | "outputs": [], 157 | "source": [ 158 | "import bottleneck\n", 159 | "\n", 160 | "def covariance_gufunc(x, y):\n", 161 | " return ((x - x.mean(axis=-1, keepdims=True))\n", 162 | " * (y - y.mean(axis=-1, keepdims=True))).mean(axis=-1)\n", 163 | "\n", 164 | "def pearson_correlation_gufunc(x, y):\n", 165 | " return covariance_gufunc(x, y) / (x.std(axis=-1) * y.std(axis=-1))\n", 166 | "\n", 167 | "def spearman_correlation_gufunc(x, y):\n", 168 | " x_ranks = bottleneck.rankdata(x, axis=-1)\n", 169 | " y_ranks = bottleneck.rankdata(y, axis=-1)\n", 170 | " return pearson_correlation_gufunc(x_ranks, y_ranks)\n", 171 | "\n", 172 | "def spearman_correlation(x, y, dim):\n", 173 | " return xr.apply_ufunc(\n", 174 | " spearman_correlation_gufunc, x, y,\n", 175 | " input_core_dims=[[dim], [dim]],\n", 176 | " dask='parallelized',\n", 177 | " output_dtypes=[float])" 178 | ] 179 | }, 180 | { 181 | "cell_type": "code", 182 | "execution_count": null, 183 | "metadata": {}, 184 | "outputs": [], 185 | "source": [ 186 | "ds['Tair'].roll(time=1)" 187 | ] 188 | }, 189 | { 190 | "cell_type": "code", 191 | "execution_count": null, 192 | "metadata": {}, 193 | "outputs": [], 194 | "source": [ 195 | "ds = ds.chunk({'x': 25, 'y': 25, 'time': -1}) # rechunk this dataset\n", 196 | "\n", 197 | "# create some toy data using our dataset\n", 198 | "x = ds['Tair']\n", 199 | "y = ds['Tair'].roll(time=1) # lag the air temp data by one month\n", 200 | "y['time'] = x['time'] # reset the index \n", 201 | "\n", 202 | "\n", 203 | "# calculate the spearman correlation\n", 204 | "corr = spearman_correlation(x, y, 'time')\n", 205 | "corr = corr.where(corr < 1) # make sure nans are masked properly\n", 206 | "corr" 207 | ] 208 | }, 209 | { 210 | "cell_type": "code", 211 | "execution_count": null, 212 | "metadata": {}, 213 | "outputs": [], 214 | "source": [ 215 | "corr.plot()" 216 | ] 217 | }, 218 | { 219 | "cell_type": "markdown", 220 | "metadata": {}, 221 | "source": [ 222 | "## dask schedulers and deployments\n", 223 | "\n", 224 | "Dask provides 4 different mechanisms for executing dask task graphs.\n", 225 | "\n", 226 | "- `dask.threaded.get`: a scheduler backed by a thread pool\n", 227 | "- `dask.multiprocessing.get`: a scheduler backed by a process pool\n", 228 | "- `dask.get`: a synchronous scheduler, good for debugging\n", 229 | "- `distributed.Client.get`: a distributed scheduler for executing graphs" 230 | ] 231 | }, 232 | { 233 | "cell_type": "code", 234 | "execution_count": null, 235 | "metadata": {}, 236 | "outputs": [], 237 | "source": [ 238 | "import dask.multiprocessing\n", 239 | "dask.config.set(scheduler='processes') # overwrite default with multiprocessing scheduler\n", 240 | "\n", 241 | "# or\n", 242 | "\n", 243 | "from distributed import Client\n", 244 | "client = Client()" 245 | ] 246 | }, 247 | { 248 | "cell_type": "markdown", 249 | "metadata": {}, 250 | "source": [ 251 | "## Lots more! \n", 252 | "\n", 253 | "- Setting up dask: http://dask.pydata.org/en/latest/setup.html" 254 | ] 255 | }, 256 | { 257 | "cell_type": "code", 258 | "execution_count": null, 259 | "metadata": {}, 260 | "outputs": [], 261 | "source": [] 262 | } 263 | ], 264 | "metadata": { 265 | "kernelspec": { 266 | "display_name": "Python (pangeo)", 267 | "language": "python", 268 | "name": "pangeo" 269 | }, 270 | "language_info": { 271 | "codemirror_mode": { 272 | "name": "ipython", 273 | "version": 3 274 | }, 275 | "file_extension": ".py", 276 | "mimetype": "text/x-python", 277 | "name": "python", 278 | "nbconvert_exporter": "python", 279 | "pygments_lexer": "ipython3", 280 | "version": "3.6.5" 281 | } 282 | }, 283 | "nbformat": 4, 284 | "nbformat_minor": 2 285 | } 286 | -------------------------------------------------------------------------------- /tutorial/1.1.xarray-data-structures.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Data Structures \n", 8 | "\n", 9 | "xarray has two core data structures. Both are fundamentally N-dimensional:\n", 10 | "\n", 11 | "- DataArray is xarray's implementation of a labeled, N-dimensional array.\n", 12 | "- Dataset is a multi-dimensional, in-memory array database. It is a dict-like container of DataArray objects aligned along any number of shared dimensions.\n", 13 | "\n", 14 | "-----\n", 15 | "\n", 16 | "### Outline\n", 17 | "- Arrays of Numbers (Numpy is Python's most common array library)\n", 18 | "- The common data model (labels, netcdf)\n", 19 | "- N-Dimensional labeled arrays (xarray)\n", 20 | " - DataArray\n", 21 | " - Dataset\n", 22 | " \n", 23 | "### Tutorial Duriation\n", 24 | "10 minutes\n", 25 | "\n", 26 | "### Going Further\n", 27 | "\n", 28 | "Xarray Documentation on Data Structures: http://xarray.pydata.org/en/latest/data-structures.html" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": null, 34 | "metadata": {}, 35 | "outputs": [], 36 | "source": [ 37 | "import numpy as np\n", 38 | "import xarray as xr" 39 | ] 40 | }, 41 | { 42 | "cell_type": "markdown", 43 | "metadata": {}, 44 | "source": [ 45 | "## Arrays of Numbers\n", 46 | "\n", 47 | "Unlabeled, N-dimensional arrays of numbers (e.g., NumPy’s ndarray) are the most widely used data structure in scientific computing. However, they lack a meaningful representation of the metadata associated with their data. Implementing such functionality is left to individual users and domain-specific packages. As a result, programmers frequently encounter pitfalls in the form of questions like “is the time axis of my array in the first or third index position?” or “does my array of timestamps still align with my data after resampling?”." 48 | ] 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": null, 53 | "metadata": {}, 54 | "outputs": [], 55 | "source": [ 56 | "myvar = np.random.random(size=(2, 3, 6))\n", 57 | "myvar" 58 | ] 59 | }, 60 | { 61 | "cell_type": "markdown", 62 | "metadata": {}, 63 | "source": [ 64 | "## The Common Data Model and Inspiration from NetCDF\n", 65 | "\n", 66 | "![](images/dataset-diagram.png)\n", 67 | "*An example of how a dataset (netCDF or xarray) for a weather forecast might be structured. This dataset has three dimensions, time, y, and x, each of which is also a one-dimensional coordinate. Temperature and precipitation are three-dimensional data variables. Also included in the dataset are two-dimensional coordinates latitude and longitude, having dimensions y and x, and reference time, a zero-dimensional (scalar) coordinate.*\n", 68 | "\n", 69 | "xarray adopts Unidata’s self-describing Common Data Model on which the network Common Data Form (netCDF) is built [20, 7]. NetCDF provides a well-defined data model for labeled N-dimensional array-oriented scientific data analysis." 70 | ] 71 | }, 72 | { 73 | "cell_type": "markdown", 74 | "metadata": {}, 75 | "source": [ 76 | "## Xarray Data Structures\n", 77 | "\n", 78 | "![](images/xarray-data-structures.png)\n", 79 | "\n", 80 | "The Common Data Model and NetCDF forms the basis of the xarray data model and provides a natural and portable serialization format. Building on netCDF, xarray features two main data structures: the DataArray and the Dataset. The API for these data structures is summarized in the following sections and in the figure above." 81 | ] 82 | }, 83 | { 84 | "cell_type": "markdown", 85 | "metadata": {}, 86 | "source": [ 87 | "## `xarray.DataArray`\n", 88 | "\n", 89 | "The DataArray is xarray’s implementation of a labeled, multi-dimensional array. It has several key properties:\n", 90 | "\n", 91 | "- data: N-dimensional array (NumPy or dask) holding the array's values,\n", 92 | "- coords: dict-like container of arrays (coordinates) that label each point (e.g., 1-dimensional arrays of numbers, datetime objects or strings),\n", 93 | "- dims: dimension names for each axis [e.g., (‘time’, ‘latitude’, ‘longitude’)],\n", 94 | "- attrs: OrderedDict holding arbitrary metadata (e.g. units or descriptions), and\n", 95 | "- name: an arbitrary name for the array.\n", 96 | "\n", 97 | "xarray uses dims and coords to enable its core metadata-aware operations. Dimensions provide names that xarray uses instead of the axis argument found in many NumPy functions. Coordinates are ancillary variables used to enable fast label based indexing and alignment, building on the functionality of the pandas Index. DataArray objects also can have a name and can hold arbitrary metadata in the form of their attrs property, which can be used to further describe data (e.g. by providing units). Names and attributes are strictly for users and user-written code; in general xarray makes no attempt to interpret them, and propagates them only in unambiguous cases. In contrast, xarray does interpret and persist coordinates in operations that transform xarray objects.\n", 98 | "\n" 99 | ] 100 | }, 101 | { 102 | "cell_type": "code", 103 | "execution_count": null, 104 | "metadata": {}, 105 | "outputs": [], 106 | "source": [ 107 | "my_da = xr.DataArray(myvar)\n", 108 | "my_da" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": null, 114 | "metadata": {}, 115 | "outputs": [], 116 | "source": [ 117 | "# Adding labels/metadata\n", 118 | "my_da = xr.DataArray(myvar,\n", 119 | " dims=('lat', 'lon', 'time'),\n", 120 | " coords={'lat': [15., 30.], 'lon': [-110., -115., -120.]},\n", 121 | " attrs={'long_name': 'temperature', 'units': 'C'},\n", 122 | " name='temp')\n", 123 | "my_da" 124 | ] 125 | }, 126 | { 127 | "cell_type": "code", 128 | "execution_count": null, 129 | "metadata": {}, 130 | "outputs": [], 131 | "source": [ 132 | "# The underlying data is still there:\n", 133 | "my_da.data" 134 | ] 135 | }, 136 | { 137 | "cell_type": "markdown", 138 | "metadata": {}, 139 | "source": [ 140 | "## `xarray.Dataset`\n", 141 | "\n", 142 | "The Dataset is xarray’s multi-dimensional equivalent of a DataFrame. It is a dict-like container of labeled arrays (DataArrays) with aligned dimensions. It is designed as an in-memory representation of a netCDF dataset. In addition to the dict-like interface of the dataset itself, which can be used to access any DataArray in a Dataset, datasets have four key properties:\n", 143 | "\n", 144 | "- data_vars: OrderedDict of DataArray objects corresponding to data variables,\n", 145 | "- coords: OrderedDict of DataArray objects intended to label points used in data_vars (e.g., 1-dimensional arrays of numbers, datetime objects or strings),\n", 146 | "- dims: dictionary mapping from dimension names to the fixed length of each dimension (e.g., {‘x’: 6, ‘y’: 6, ‘time’: 8}), and\n", 147 | "- attrs: OrderedDict to hold arbitrary metadata pertaining to the dataset.\n", 148 | "DataArray objects inside a Dataset may have any number of dimensions but are presumed to share a common coordinate system. Coordinates can also have any number of dimensions but denote constant/independent quantities, unlike the varying/dependent quantities that belong in data. Figure 3 illustrates these concepts for an example Dataset containing meteorological data." 149 | ] 150 | }, 151 | { 152 | "cell_type": "code", 153 | "execution_count": null, 154 | "metadata": {}, 155 | "outputs": [], 156 | "source": [ 157 | "# Datasets are dict-like containers of DataArrays\n", 158 | "\n", 159 | "xr.Dataset()" 160 | ] 161 | }, 162 | { 163 | "cell_type": "code", 164 | "execution_count": null, 165 | "metadata": {}, 166 | "outputs": [], 167 | "source": [ 168 | "my_ds = xr.Dataset({'temperature': my_da})\n", 169 | "# also equivalent to:\n", 170 | "# my_da.to_dataset()\n", 171 | "my_ds" 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": null, 177 | "metadata": {}, 178 | "outputs": [], 179 | "source": [ 180 | "my_ds['precipitation'] = xr.DataArray(np.random.random(myvar.shape),\n", 181 | " dims=('lat', 'lon', 'time'),\n", 182 | " coords={'lat': [15., 30.], 'lon': [-110., -115., -120.]},\n", 183 | " attrs={'long_name': 'precipitation', 'units': 'mm'},\n", 184 | " name='pcp') \n", 185 | "\n", 186 | "my_ds.attrs['history'] = 'created for the xarray tutorial'" 187 | ] 188 | }, 189 | { 190 | "cell_type": "code", 191 | "execution_count": null, 192 | "metadata": {}, 193 | "outputs": [], 194 | "source": [ 195 | "my_ds" 196 | ] 197 | }, 198 | { 199 | "cell_type": "code", 200 | "execution_count": null, 201 | "metadata": {}, 202 | "outputs": [], 203 | "source": [] 204 | } 205 | ], 206 | "metadata": { 207 | "kernelspec": { 208 | "display_name": "Python (pangeo)", 209 | "language": "python", 210 | "name": "pangeo" 211 | }, 212 | "language_info": { 213 | "codemirror_mode": { 214 | "name": "ipython", 215 | "version": 3 216 | }, 217 | "file_extension": ".py", 218 | "mimetype": "text/x-python", 219 | "name": "python", 220 | "nbconvert_exporter": "python", 221 | "pygments_lexer": "ipython3", 222 | "version": "3.6.5" 223 | } 224 | }, 225 | "nbformat": 4, 226 | "nbformat_minor": 2 227 | } 228 | -------------------------------------------------------------------------------- /tutorial/1.3.xarray-computation-toolkit.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Computation with Xarray\n", 8 | "\n", 9 | "- Aggregation: calculation of statistics (e.g. sum) along a dimension of an xarray object can be done by dimension name instead of an integer axis number.\n", 10 | "- Arithmetic: arithmetic between xarray objects vectorizes based on dimension names, automatically looping (broadcasting) over each distinct dimension. This eliminates the need to insert dummy dimensions of size one to facilitate broadcasting, a common pattern with NumPy.\n", 11 | "- Split-apply-combine: xarray includes N-dimensional grouped operations implementing the split-apply-combine strategy [24].\n", 12 | "- Resampling and rolling window operations: Utilizing the efficient resampling methods from pandas and rolling window operations from Bottleneck [15], xarray offers a robust set of resampling and rolling window operations along a single dimension.\n", 13 | "\n", 14 | "\n", 15 | "### Outline\n", 16 | "- Arithmetic\n", 17 | "- Aggregation\n", 18 | "- Groupby and resample\n", 19 | "- Rolling\n", 20 | "- Universal Functions\n", 21 | "\n", 22 | "### Tutorial Duriation\n", 23 | "10 minutes\n", 24 | "\n", 25 | "### Going Further\n", 26 | "\n", 27 | "- Xarray documentation on its Computation Toolkit: http://xarray.pydata.org/en/latest/computation.html\n", 28 | "- Xarray documentation on Groupby: http://xarray.pydata.org/en/latest/groupby.html" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": null, 34 | "metadata": {}, 35 | "outputs": [], 36 | "source": [ 37 | "import numpy as np\n", 38 | "import xarray as xr" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": null, 44 | "metadata": {}, 45 | "outputs": [], 46 | "source": [ 47 | "ds = xr.tutorial.load_dataset('rasm')\n", 48 | "da = ds['Tair']\n", 49 | "\n", 50 | "ds" 51 | ] 52 | }, 53 | { 54 | "cell_type": "markdown", 55 | "metadata": {}, 56 | "source": [ 57 | "## Aggregation\n", 58 | "\n", 59 | "Xarray supports many of the aggregations methods that numpy has. A partial list includes: all, any, argmax, argmin, max, mean, median, min, prod, sum, std, var.\n", 60 | "\n", 61 | "Whereas the numpy syntax would require scalar axes, xarray can use dimension names:" 62 | ] 63 | }, 64 | { 65 | "cell_type": "code", 66 | "execution_count": null, 67 | "metadata": {}, 68 | "outputs": [], 69 | "source": [ 70 | "da.mean(dim=('x', 'y'))" 71 | ] 72 | }, 73 | { 74 | "cell_type": "markdown", 75 | "metadata": {}, 76 | "source": [ 77 | "## Arithmetic\n", 78 | "\n", 79 | "Arithmetic operations with a single DataArray automatically vectorize (like numpy) over all array values:" 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": null, 85 | "metadata": {}, 86 | "outputs": [], 87 | "source": [ 88 | "# dataarray + scalars\n", 89 | "da - 273.15 # (K --> C)" 90 | ] 91 | }, 92 | { 93 | "cell_type": "markdown", 94 | "metadata": {}, 95 | "source": [ 96 | "Here we do two computations:\n", 97 | "1. Calculate the time-mean\n", 98 | "2. Calculate the \"anomalies\" relative to the time mean" 99 | ] 100 | }, 101 | { 102 | "cell_type": "code", 103 | "execution_count": null, 104 | "metadata": {}, 105 | "outputs": [], 106 | "source": [ 107 | "da_mean = da.mean(dim='time')\n", 108 | "da_mean" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": null, 114 | "metadata": {}, 115 | "outputs": [], 116 | "source": [ 117 | "# dataarray + dataarray\n", 118 | "da - da_mean \n", 119 | "\n", 120 | "# Notice that this required broadcasting along the time dimension" 121 | ] 122 | }, 123 | { 124 | "cell_type": "markdown", 125 | "metadata": {}, 126 | "source": [ 127 | "## Groupby\n", 128 | "\n", 129 | "xarray supports “group by” operations with the same API as pandas to implement the split-apply-combine strategy:\n", 130 | "\n", 131 | "- Split your data into multiple independent groups.\n", 132 | "- Apply some function to each group.\n", 133 | "- Combine your groups back into a single data object.\n", 134 | "\n", 135 | "Group by operations work on both Dataset and DataArray objects. Most of the examples focus on grouping by a single one-dimensional variable, although support for grouping over a multi-dimensional variable has recently been implemented." 136 | ] 137 | }, 138 | { 139 | "cell_type": "code", 140 | "execution_count": null, 141 | "metadata": {}, 142 | "outputs": [], 143 | "source": [ 144 | "# Using groupby to calculate a monthly climatology:\n", 145 | "\n", 146 | "da_climatology = da.groupby('time.month').mean('time')\n", 147 | "\n", 148 | "da_climatology" 149 | ] 150 | }, 151 | { 152 | "cell_type": "markdown", 153 | "metadata": {}, 154 | "source": [ 155 | "In this case, we provide what we refer to as a virtual variable (`time.month`). Other virtual variables include:\n", 156 | "“year”, “month”, “day”, “hour”, “minute”, “second”, “dayofyear”, “week”, “dayofweek”, “weekday” and “quarter”. It is also possible to use another DataArray or pandas object as the grouper." 157 | ] 158 | }, 159 | { 160 | "cell_type": "markdown", 161 | "metadata": {}, 162 | "source": [ 163 | "## Rolling Operations\n", 164 | "\n", 165 | "Xarray objects include a rolling method to support rolling window aggregations:" 166 | ] 167 | }, 168 | { 169 | "cell_type": "code", 170 | "execution_count": null, 171 | "metadata": {}, 172 | "outputs": [], 173 | "source": [ 174 | "roller = da.rolling(time=3)\n", 175 | "roller" 176 | ] 177 | }, 178 | { 179 | "cell_type": "code", 180 | "execution_count": null, 181 | "metadata": {}, 182 | "outputs": [], 183 | "source": [ 184 | "roller.mean()" 185 | ] 186 | }, 187 | { 188 | "cell_type": "code", 189 | "execution_count": null, 190 | "metadata": {}, 191 | "outputs": [], 192 | "source": [ 193 | "# we can also provide a custom function \n", 194 | "\n", 195 | "def sum_minus_2(da, axis):\n", 196 | " return da.sum(axis=axis) - 2\n", 197 | "\n", 198 | "roller.reduce(sum_minus_2)" 199 | ] 200 | }, 201 | { 202 | "cell_type": "markdown", 203 | "metadata": {}, 204 | "source": [ 205 | "## Universal Functions\n", 206 | "\n", 207 | "In practice, not all use standard functions/methods from numpy and xarray is not allways possible. Sometimes there is good reason to work with numpy/dask array's directly. \n", 208 | "\n", 209 | "Xarray's documentation on wrapping custom computations: http://xarray.pydata.org/en/latest/computation.html#wrapping-custom-computation" 210 | ] 211 | }, 212 | { 213 | "cell_type": "code", 214 | "execution_count": null, 215 | "metadata": {}, 216 | "outputs": [], 217 | "source": [ 218 | "da_noise = da + np.random.random(size=da.shape)\n", 219 | "da_noise" 220 | ] 221 | }, 222 | { 223 | "cell_type": "code", 224 | "execution_count": null, 225 | "metadata": {}, 226 | "outputs": [], 227 | "source": [ 228 | "# some example legacy code to calculate the spearman correlation coefficient\n", 229 | "\n", 230 | "import bottleneck\n", 231 | "\n", 232 | "\n", 233 | "def covariance_gufunc(x, y):\n", 234 | " return ((x - x.mean(axis=-1, keepdims=True))\n", 235 | " * (y - y.mean(axis=-1, keepdims=True))).mean(axis=-1)\n", 236 | "\n", 237 | "def correlation_gufunc(x, y):\n", 238 | " return covariance_gufunc(x, y) / (x.std(axis=-1) * y.std(axis=-1))\n", 239 | "\n", 240 | "def spearman_correlation_gufunc(x, y):\n", 241 | " x_ranks = bottleneck.rankdata(x, axis=-1)\n", 242 | " y_ranks = bottleneck.rankdata(y, axis=-1)\n", 243 | " return correlation_gufunc(x_ranks, y_ranks)" 244 | ] 245 | }, 246 | { 247 | "cell_type": "code", 248 | "execution_count": null, 249 | "metadata": {}, 250 | "outputs": [], 251 | "source": [ 252 | "# Wrap the \"legacy code\" with xarray's apply_ufunc. \n", 253 | "def spearman_correlation(x, y, dim):\n", 254 | " return xr.apply_ufunc(\n", 255 | " spearman_correlation_gufunc, x, y,\n", 256 | " input_core_dims=[[dim], [dim]],\n", 257 | " dask='parallelized',\n", 258 | " output_dtypes=[float])" 259 | ] 260 | }, 261 | { 262 | "cell_type": "code", 263 | "execution_count": null, 264 | "metadata": {}, 265 | "outputs": [], 266 | "source": [ 267 | "da_corr = corr = spearman_correlation(da, da_noise, 'time')\n", 268 | "da_corr" 269 | ] 270 | }, 271 | { 272 | "cell_type": "markdown", 273 | "metadata": {}, 274 | "source": [ 275 | "## Masking\n", 276 | "\n", 277 | "Indexing methods on xarray objects generally return a subset of the original data. However, it is sometimes useful to select an object with the same shape as the original data, but with some elements masked. To do this type of selection in xarray, use where():" 278 | ] 279 | }, 280 | { 281 | "cell_type": "code", 282 | "execution_count": null, 283 | "metadata": {}, 284 | "outputs": [], 285 | "source": [ 286 | "# mask out 1's in the correlation array\n", 287 | "\n", 288 | "da_corr.where(da_corr < 1)" 289 | ] 290 | }, 291 | { 292 | "cell_type": "code", 293 | "execution_count": null, 294 | "metadata": {}, 295 | "outputs": [], 296 | "source": [ 297 | "# xarray also provides a function for where\n", 298 | "xr.where(da_corr > 0.996, 0, 1)" 299 | ] 300 | }, 301 | { 302 | "cell_type": "code", 303 | "execution_count": null, 304 | "metadata": {}, 305 | "outputs": [], 306 | "source": [] 307 | } 308 | ], 309 | "metadata": { 310 | "kernelspec": { 311 | "display_name": "Python (pangeo)", 312 | "language": "python", 313 | "name": "pangeo" 314 | }, 315 | "language_info": { 316 | "codemirror_mode": { 317 | "name": "ipython", 318 | "version": 3 319 | }, 320 | "file_extension": ".py", 321 | "mimetype": "text/x-python", 322 | "name": "python", 323 | "nbconvert_exporter": "python", 324 | "pygments_lexer": "ipython3", 325 | "version": "3.6.5" 326 | } 327 | }, 328 | "nbformat": 4, 329 | "nbformat_minor": 2 330 | } 331 | -------------------------------------------------------------------------------- /tutorial/1.0.scientific_python_ecosystem.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# The Scientific Python Ecosystem\n", 8 | "\n", 9 | "The Scientific Python Ecosystem is made up of a robust collection of packages that provide functionality for everything from simple numeric arrays to sophisticated machine learning algorithms. In this notebook, we'll introduce the core scientific python packages and some important terminology.\n", 10 | "\n", 11 | "![](images/stack.png)\n", 12 | "\n", 13 | "### Outline\n", 14 | "- Python\n", 15 | "- Numpy\n", 16 | "- Scipy\n", 17 | "- Pandas\n", 18 | "\n", 19 | "### Tutorial Duriation\n", 20 | "10 minutes\n", 21 | "\n", 22 | "### Going Further\n", 23 | "\n", 24 | "This notebook is just meant to make sure we all have the same base terminology before moving on to the fun `xarray` and `dask`. If you are new to Python or just want to brush up, you may be interested in the following online resources:\n", 25 | "\n", 26 | "- Scientific Python Lectures: http://scipy-lectures.org/\n", 27 | "- Numpy Tutorial: https://docs.scipy.org/doc/numpy-dev/user/quickstart.html\n", 28 | "- Scipy Tutorial: https://docs.scipy.org/doc/scipy/reference/tutorial/index.html\n", 29 | "- Pandas Tutorials: https://pandas.pydata.org/pandas-docs/stable/tutorials.html" 30 | ] 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "metadata": {}, 35 | "source": [ 36 | "## Python built-ins" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": null, 42 | "metadata": {}, 43 | "outputs": [], 44 | "source": [ 45 | "# data types\n", 46 | "x = 4\n", 47 | "type(x)" 48 | ] 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": null, 53 | "metadata": {}, 54 | "outputs": [], 55 | "source": [ 56 | "pi = 3.14\n", 57 | "type(pi)" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": null, 63 | "metadata": {}, 64 | "outputs": [], 65 | "source": [ 66 | "name = 'my string'\n", 67 | "type(name)" 68 | ] 69 | }, 70 | { 71 | "cell_type": "code", 72 | "execution_count": null, 73 | "metadata": {}, 74 | "outputs": [], 75 | "source": [ 76 | "# data structures / objects\n", 77 | "\n", 78 | "my_list = [2, 4, 10] # a list\n", 79 | "\n", 80 | "my_list[2] # access by position" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": null, 86 | "metadata": {}, 87 | "outputs": [], 88 | "source": [ 89 | "my_dict = {'pi': 3.14, 'd': 4} # a dictionary\n", 90 | "\n", 91 | "\n", 92 | "my_dict['pi'] # access by key" 93 | ] 94 | }, 95 | { 96 | "cell_type": "markdown", 97 | "metadata": {}, 98 | "source": [ 99 | "## Numpy\n", 100 | "\n", 101 | "NumPy is the fundamental package for scientific computing with Python. It contains among other things:\n", 102 | "\n", 103 | "- a powerful N-dimensional array object\n", 104 | "- sophisticated (broadcasting) functions\n", 105 | "- tools for integrating C/C++ and Fortran code\n", 106 | "- useful linear algebra, Fourier transform, and random number capabilities\n", 107 | "\n", 108 | "Numpy Documentation: https://docs.scipy.org/doc/numpy/" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": null, 114 | "metadata": {}, 115 | "outputs": [], 116 | "source": [ 117 | "import numpy as np" 118 | ] 119 | }, 120 | { 121 | "cell_type": "code", 122 | "execution_count": null, 123 | "metadata": {}, 124 | "outputs": [], 125 | "source": [ 126 | "x = np.zeros(shape=(4, 5))\n", 127 | "x" 128 | ] 129 | }, 130 | { 131 | "cell_type": "code", 132 | "execution_count": null, 133 | "metadata": {}, 134 | "outputs": [], 135 | "source": [ 136 | "y = x + 4\n", 137 | "y" 138 | ] 139 | }, 140 | { 141 | "cell_type": "code", 142 | "execution_count": null, 143 | "metadata": {}, 144 | "outputs": [], 145 | "source": [ 146 | "# random numbers\n", 147 | "z = np.random.random(x.shape)\n", 148 | "z" 149 | ] 150 | }, 151 | { 152 | "cell_type": "code", 153 | "execution_count": null, 154 | "metadata": {}, 155 | "outputs": [], 156 | "source": [ 157 | "# aggregations\n", 158 | "z_sum = z.sum(axis=1)\n", 159 | "z_sum" 160 | ] 161 | }, 162 | { 163 | "cell_type": "code", 164 | "execution_count": null, 165 | "metadata": {}, 166 | "outputs": [], 167 | "source": [ 168 | "# broadcasting\n", 169 | "y.transpose() * z_sum" 170 | ] 171 | }, 172 | { 173 | "cell_type": "code", 174 | "execution_count": null, 175 | "metadata": {}, 176 | "outputs": [], 177 | "source": [ 178 | "# slicing\n", 179 | "z[2:4, ::2] # 2-4 on the first axis, stride of 2 on the second" 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "execution_count": null, 185 | "metadata": {}, 186 | "outputs": [], 187 | "source": [ 188 | "# data types\n", 189 | "\n", 190 | "xi = np.array([1, 2, 3], dtype=np.int) # integer\n", 191 | "xi.dtype" 192 | ] 193 | }, 194 | { 195 | "cell_type": "code", 196 | "execution_count": null, 197 | "metadata": {}, 198 | "outputs": [], 199 | "source": [ 200 | "xf = np.array([1, 2, 3], dtype=np.float) # float\n", 201 | "xf.dtype" 202 | ] 203 | }, 204 | { 205 | "cell_type": "code", 206 | "execution_count": null, 207 | "metadata": {}, 208 | "outputs": [], 209 | "source": [ 210 | "# universal functions (ufuncs, e.g. sin, cos, exp, etc)\n", 211 | "np.sin(z_sum)\n" 212 | ] 213 | }, 214 | { 215 | "cell_type": "markdown", 216 | "metadata": {}, 217 | "source": [ 218 | "### SciPy\n", 219 | "\n", 220 | "SciPy is a collection of mathematical algorithms and convenience functions built on the Numpy extension of Python. It adds significant power to the interactive Python session by providing the user with high-level commands and classes for manipulating and visualizing data. SciPy includes a number of subpackages covering different scientific computing domains:\n", 221 | "\n", 222 | "| Subpackage | Description|\n", 223 | "| ------| ------|\n", 224 | "| cluster |\tClustering algorithms|\n", 225 | "| constants |\tPhysical and mathematical constants|\n", 226 | "| fftpack |\tFast Fourier Transform routines|\n", 227 | "| integrate |\tIntegration and ordinary differential equation solvers|\n", 228 | "| interpolate |\tInterpolation and smoothing splines|\n", 229 | "| io |\tInput and Output|\n", 230 | "| linalg |\tLinear algebra|\n", 231 | "| ndimage |\tN-dimensional image processing|\n", 232 | "| odr |\tOrthogonal distance regression|\n", 233 | "| optimize |\tOptimization and root-finding routines|\n", 234 | "| signal |\tSignal processing|\n", 235 | "| sparse |\tSparse matrices and associated routines|\n", 236 | "| spatial |\tSpatial data structures and algorithms|\n", 237 | "| special |\tSpecial functions|\n", 238 | "| stats |\tStatistical distributions and functions\n", 239 | "\n", 240 | "Because SciPy is built directly on Numpy, we'll skip any examples for now. The SciPy API is well documented with examples how to use specific subpackages.\n", 241 | "\n", 242 | "SciPy Documentation: " 243 | ] 244 | }, 245 | { 246 | "cell_type": "markdown", 247 | "metadata": {}, 248 | "source": [ 249 | "### Pandas\n", 250 | "\n", 251 | "pandas is a Python package providing fast, flexible, and expressive data structures designed to make working with “relational” or “labeled” data both easy and intuitive. It aims to be the fundamental high-level building block for doing practical, real world data analysis in Python.\n", 252 | "\n", 253 | "Pandas Documentation: http://pandas.pydata.org/pandas-docs/stable/" 254 | ] 255 | }, 256 | { 257 | "cell_type": "code", 258 | "execution_count": null, 259 | "metadata": {}, 260 | "outputs": [], 261 | "source": [ 262 | "import pandas as pd" 263 | ] 264 | }, 265 | { 266 | "cell_type": "code", 267 | "execution_count": null, 268 | "metadata": {}, 269 | "outputs": [], 270 | "source": [ 271 | "# This data can also be loaded from the statsmodels package\n", 272 | "# import statsmodels as sm\n", 273 | "# co2 = sm.datasets.co2.load_pandas().data \n", 274 | "\n", 275 | "co2 = pd.read_csv('./data/co2.csv', index_col=0, parse_dates=True)" 276 | ] 277 | }, 278 | { 279 | "cell_type": "code", 280 | "execution_count": null, 281 | "metadata": {}, 282 | "outputs": [], 283 | "source": [ 284 | "# co2 is a pandas.DataFrame\n", 285 | "co2.head() # head just prints out the first few rows" 286 | ] 287 | }, 288 | { 289 | "cell_type": "code", 290 | "execution_count": null, 291 | "metadata": {}, 292 | "outputs": [], 293 | "source": [ 294 | "# The pandas DataFrame is made up of an index\n", 295 | "co2.index" 296 | ] 297 | }, 298 | { 299 | "cell_type": "code", 300 | "execution_count": null, 301 | "metadata": {}, 302 | "outputs": [], 303 | "source": [ 304 | "# and 0 or more columns (in this case just 1 - co2)\n", 305 | "# Each column is a pandas.Series\n", 306 | "co2['co2'].head() \n" 307 | ] 308 | }, 309 | { 310 | "cell_type": "code", 311 | "execution_count": null, 312 | "metadata": {}, 313 | "outputs": [], 314 | "source": [ 315 | "# label based slicing\n", 316 | "co2['1990-01-01': '1990-02-14']" 317 | ] 318 | }, 319 | { 320 | "cell_type": "code", 321 | "execution_count": null, 322 | "metadata": {}, 323 | "outputs": [], 324 | "source": [ 325 | "# aggregations just like in numpy\n", 326 | "co2.mean(axis=0)" 327 | ] 328 | }, 329 | { 330 | "cell_type": "code", 331 | "execution_count": null, 332 | "metadata": {}, 333 | "outputs": [], 334 | "source": [ 335 | "# advanced grouping/resampling\n", 336 | "\n", 337 | "# here we'll calculate the annual average timeseris of co2 concentraions\n", 338 | "co2_as = co2.resample('AS').mean() # AS is for the start of each year\n", 339 | "\n", 340 | "co2_as.head()" 341 | ] 342 | }, 343 | { 344 | "cell_type": "code", 345 | "execution_count": null, 346 | "metadata": {}, 347 | "outputs": [], 348 | "source": [ 349 | "# we can also quickly calculate the monthly climatology\n", 350 | "\n", 351 | "co2_climatology = co2.groupby(co2.index.month).mean()\n", 352 | "co2_climatology" 353 | ] 354 | }, 355 | { 356 | "cell_type": "code", 357 | "execution_count": null, 358 | "metadata": {}, 359 | "outputs": [], 360 | "source": [ 361 | "%matplotlib inline\n", 362 | "\n", 363 | "# and even plot that using pandas and matplotlib\n", 364 | "co2_climatology.plot()" 365 | ] 366 | }, 367 | { 368 | "cell_type": "code", 369 | "execution_count": null, 370 | "metadata": {}, 371 | "outputs": [], 372 | "source": [] 373 | } 374 | ], 375 | "metadata": { 376 | "kernelspec": { 377 | "display_name": "Python (pangeo)", 378 | "language": "python", 379 | "name": "pangeo" 380 | }, 381 | "language_info": { 382 | "codemirror_mode": { 383 | "name": "ipython", 384 | "version": 3 385 | }, 386 | "file_extension": ".py", 387 | "mimetype": "text/x-python", 388 | "name": "python", 389 | "nbconvert_exporter": "python", 390 | "pygments_lexer": "ipython3", 391 | "version": "3.6.5" 392 | } 393 | }, 394 | "nbformat": 4, 395 | "nbformat_minor": 2 396 | } 397 | -------------------------------------------------------------------------------- /getting_started.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "%matplotlib inline" 10 | ] 11 | }, 12 | { 13 | "cell_type": "markdown", 14 | "metadata": {}, 15 | "source": [ 16 | "Getting Started with Xarray\n", 17 | "===========================\n", 18 | "\n", 19 | "Welcome to the xarray tutorial. These notebooks will walk you through some of the basics of xarray and will provide you with oportunities to explore the package a bit on your own.\n", 20 | "\n", 21 | "Some resources for you before we get started:\n", 22 | "\n", 23 | "- Xarray documentation: http://xarray.pydata.org/en/latest/index.html\n", 24 | "- Xarray paper: http://doi.org/10.5334/jors.148\n", 25 | "- Xarray Github page: https://github.com/pydata/xarray\n", 26 | "\n", 27 | "In this notebook, we'll just make sure we can import xarray and access the tutorial data. After that, you should head over to the `tutorial` directory to go through the rest of the material." 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": 2, 33 | "metadata": {}, 34 | "outputs": [], 35 | "source": [ 36 | "# import xarray\n", 37 | "import xarray as xr" 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": 3, 43 | "metadata": {}, 44 | "outputs": [], 45 | "source": [ 46 | "# load the air temperature dataset\n", 47 | "# you can replace 'air_temperature' with `rasm` to get a different dataset\n", 48 | "\n", 49 | "ds = xr.tutorial.load_dataset('air_temperature')" 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "execution_count": 4, 55 | "metadata": {}, 56 | "outputs": [ 57 | { 58 | "data": { 59 | "text/plain": [ 60 | "\n", 61 | "Dimensions: (lat: 25, lon: 53, time: 2920)\n", 62 | "Coordinates:\n", 63 | " * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 62.5 60.0 57.5 55.0 52.5 ...\n", 64 | " * lon (lon) float32 200.0 202.5 205.0 207.5 210.0 212.5 215.0 217.5 ...\n", 65 | " * time (time) datetime64[ns] 2013-01-01 2013-01-01T06:00:00 ...\n", 66 | "Data variables:\n", 67 | " air (time, lat, lon) float32 241.2 242.5 243.5 244.0 244.1 243.89 ...\n", 68 | "Attributes:\n", 69 | " Conventions: COARDS\n", 70 | " title: 4x daily NMC reanalysis (1948)\n", 71 | " description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n", 72 | " platform: Model\n", 73 | " references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly..." 74 | ] 75 | }, 76 | "execution_count": 4, 77 | "metadata": {}, 78 | "output_type": "execute_result" 79 | } 80 | ], 81 | "source": [ 82 | "ds" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 5, 88 | "metadata": {}, 89 | "outputs": [], 90 | "source": [ 91 | "# calculate the season means\n", 92 | "avg_temp = ds['air'].groupby('time.season').mean('time')" 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": 6, 98 | "metadata": {}, 99 | "outputs": [ 100 | { 101 | "data": { 102 | "text/plain": [ 103 | "" 104 | ] 105 | }, 106 | "execution_count": 6, 107 | "metadata": {}, 108 | "output_type": "execute_result" 109 | }, 110 | { 111 | "data": { 112 | "image/png": "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\n", 113 | "text/plain": [ 114 | "
" 115 | ] 116 | }, 117 | "metadata": {}, 118 | "output_type": "display_data" 119 | } 120 | ], 121 | "source": [ 122 | "# make a quick plot\n", 123 | "avg_temp.plot(col='season', robust=True)" 124 | ] 125 | }, 126 | { 127 | "cell_type": "code", 128 | "execution_count": null, 129 | "metadata": {}, 130 | "outputs": [], 131 | "source": [] 132 | }, 133 | { 134 | "cell_type": "code", 135 | "execution_count": null, 136 | "metadata": {}, 137 | "outputs": [], 138 | "source": [] 139 | } 140 | ], 141 | "metadata": { 142 | "kernelspec": { 143 | "display_name": "Python 3", 144 | "language": "python", 145 | "name": "python3" 146 | }, 147 | "language_info": { 148 | "codemirror_mode": { 149 | "name": "ipython", 150 | "version": 3 151 | }, 152 | "file_extension": ".py", 153 | "mimetype": "text/x-python", 154 | "name": "python", 155 | "nbconvert_exporter": "python", 156 | "pygments_lexer": "ipython3", 157 | "version": "3.6.5" 158 | } 159 | }, 160 | "nbformat": 4, 161 | "nbformat_minor": 2 162 | } 163 | -------------------------------------------------------------------------------- /tutorial/images/transpose.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | %3 11 | 12 | 13 | -7568912189774035779 14 | 15 | ('add-#0', 0, 0) 16 | 17 | 18 | -269699972550886834 19 | 20 | add 21 | 22 | 23 | -269699972550886834->-7568912189774035779 24 | 25 | 26 | 27 | 28 | 1832483939544313498 29 | 30 | ('wrapped-#1', 0, 0) 31 | 32 | 33 | 1832483939544313498->-269699972550886834 34 | 35 | 36 | 37 | 38 | 2968229022803582678 39 | 40 | transpose 41 | 42 | 43 | 1832483939544313498->2968229022803582678 44 | 45 | 46 | 47 | 48 | -2864674034747732923 49 | 50 | ('transpose-#2', 0, 0) 51 | 52 | 53 | -2864674034747732923->-269699972550886834 54 | 55 | 56 | 57 | 58 | -7568912189772870730 59 | 60 | ('add-#0', 0, 1) 61 | 62 | 63 | 1088706989993509341 64 | 65 | add 66 | 67 | 68 | 1088706989993509341->-7568912189772870730 69 | 70 | 71 | 72 | 73 | 1832483939543148449 74 | 75 | ('wrapped-#1', 0, 1) 76 | 77 | 78 | 1832483939543148449->1088706989993509341 79 | 80 | 81 | 82 | 83 | -9048924627777257049 84 | 85 | transpose 86 | 87 | 88 | 1832483939543148449->-9048924627777257049 89 | 90 | 91 | 92 | 93 | -2864674034746567874 94 | 95 | ('transpose-#2', 0, 1) 96 | 97 | 98 | -2864674034746567874->1088706989993509341 99 | 100 | 101 | 102 | 103 | -7568912189776365877 104 | 105 | ('add-#0', 0, 2) 106 | 107 | 108 | 6429812205594246832 109 | 110 | add 111 | 112 | 113 | 6429812205594246832->-7568912189776365877 114 | 115 | 116 | 117 | 118 | 1832483939541983400 119 | 120 | ('wrapped-#1', 0, 2) 121 | 122 | 123 | 1832483939541983400->6429812205594246832 124 | 125 | 126 | 127 | 128 | 3467732049900900916 129 | 130 | transpose 131 | 132 | 133 | 1832483939541983400->3467732049900900916 134 | 135 | 136 | 137 | 138 | -2864674034750063021 139 | 140 | ('transpose-#2', 0, 2) 141 | 142 | 143 | -2864674034750063021->6429812205594246832 144 | 145 | 146 | 147 | 148 | -7568910928577036956 149 | 150 | ('add-#0', 1, 0) 151 | 152 | 153 | -5302097737346974433 154 | 155 | add 156 | 157 | 158 | -5302097737346974433->-7568910928577036956 159 | 160 | 161 | 162 | 163 | 1832482678347314675 164 | 165 | ('wrapped-#1', 1, 0) 166 | 167 | 168 | 1832482678347314675->-5302097737346974433 169 | 170 | 171 | 172 | 173 | 6076892855581121253 174 | 175 | transpose 176 | 177 | 178 | 1832482678347314675->6076892855581121253 179 | 180 | 181 | 182 | 183 | -2864672773550734100 184 | 185 | ('transpose-#2', 1, 0) 186 | 187 | 188 | -2864672773550734100->-5302097737346974433 189 | 190 | 191 | 192 | 193 | -7568910928578202005 194 | 195 | ('add-#0', 1, 1) 196 | 197 | 198 | 2281173829062926608 199 | 200 | add 201 | 202 | 203 | 2281173829062926608->-7568910928578202005 204 | 205 | 206 | 207 | 208 | -2864672773551899149 209 | 210 | ('transpose-#2', 1, 1) 211 | 212 | 213 | -2864672773551899149->2281173829062926608 214 | 215 | 216 | 217 | 218 | 1832482678348479724 219 | 220 | ('wrapped-#1', 1, 1) 221 | 222 | 223 | 1832482678348479724->2281173829062926608 224 | 225 | 226 | 227 | 228 | 6863370313580418776 229 | 230 | transpose 231 | 232 | 233 | 1832482678348479724->6863370313580418776 234 | 235 | 236 | 237 | 238 | -7568910928574706858 239 | 240 | ('add-#0', 1, 2) 241 | 242 | 243 | -4472990369494402883 244 | 245 | add 246 | 247 | 248 | -4472990369494402883->-7568910928574706858 249 | 250 | 251 | 252 | 253 | 1832482678349644773 254 | 255 | ('wrapped-#1', 1, 2) 256 | 257 | 258 | 1832482678349644773->-4472990369494402883 259 | 260 | 261 | 262 | 263 | -4106302257920999725 264 | 265 | transpose 266 | 267 | 268 | 1832482678349644773->-4106302257920999725 269 | 270 | 271 | 272 | 273 | -2864672773548404002 274 | 275 | ('transpose-#2', 1, 2) 276 | 277 | 278 | -2864672773548404002->-4472990369494402883 279 | 280 | 281 | 282 | 283 | -7568914712168033425 284 | 285 | ('add-#0', 2, 0) 286 | 287 | 288 | -5017106245455663700 289 | 290 | add 291 | 292 | 293 | -5017106245455663700->-7568914712168033425 294 | 295 | 296 | 297 | 298 | 1832486461938311144 299 | 300 | ('wrapped-#1', 2, 0) 301 | 302 | 303 | 1832486461938311144->-5017106245455663700 304 | 305 | 306 | 307 | 308 | 659148793014177912 309 | 310 | transpose 311 | 312 | 313 | 1832486461938311144->659148793014177912 314 | 315 | 316 | 317 | 318 | -2864676557141730569 319 | 320 | ('transpose-#2', 2, 0) 321 | 322 | 323 | -2864676557141730569->-5017106245455663700 324 | 325 | 326 | 327 | 328 | -7568914712166868376 329 | 330 | ('add-#0', 2, 1) 331 | 332 | 333 | -1626244237506246709 334 | 335 | add 336 | 337 | 338 | -1626244237506246709->-7568914712166868376 339 | 340 | 341 | 342 | 343 | -2864676557140565520 344 | 345 | ('transpose-#2', 2, 1) 346 | 347 | 348 | -2864676557140565520->-1626244237506246709 349 | 350 | 351 | 352 | 353 | 1832486461937146095 354 | 355 | ('wrapped-#1', 2, 1) 356 | 357 | 358 | 1832486461937146095->-1626244237506246709 359 | 360 | 361 | 362 | 363 | -8092072985900237499 364 | 365 | transpose 366 | 367 | 368 | 1832486461937146095->-8092072985900237499 369 | 370 | 371 | 372 | 373 | -7568914712165703327 374 | 375 | ('add-#0', 2, 2) 376 | 377 | 378 | -365120496690679334 379 | 380 | add 381 | 382 | 383 | -365120496690679334->-7568914712165703327 384 | 385 | 386 | 387 | 388 | -2864676557139400471 389 | 390 | ('transpose-#2', 2, 2) 391 | 392 | 393 | -2864676557139400471->-365120496690679334 394 | 395 | 396 | 397 | 398 | 1832486461940641242 399 | 400 | ('wrapped-#1', 2, 2) 401 | 402 | 403 | 1832486461940641242->-365120496690679334 404 | 405 | 406 | 407 | 408 | 6429879677358970466 409 | 410 | transpose 411 | 412 | 413 | 1832486461940641242->6429879677358970466 414 | 415 | 416 | 417 | 418 | -8070292692300870999 419 | 420 | ones 421 | 422 | 423 | -8070292692300870999->1832483939544313498 424 | 425 | 426 | 427 | 428 | -9090691081674131174 429 | 430 | ones 431 | 432 | 433 | -9090691081674131174->1832483939543148449 434 | 435 | 436 | 437 | 438 | 8030296630591782667 439 | 440 | ones 441 | 442 | 443 | 8030296630591782667->1832483939541983400 444 | 445 | 446 | 447 | 448 | -8905230860801093928 449 | 450 | ones 451 | 452 | 453 | -8905230860801093928->1832482678347314675 454 | 455 | 456 | 457 | 458 | -8692111377862321753 459 | 460 | ones 461 | 462 | 463 | -8692111377862321753->1832482678348479724 464 | 465 | 466 | 467 | 468 | -7322287080745992778 469 | 470 | ones 471 | 472 | 473 | -7322287080745992778->1832482678349644773 474 | 475 | 476 | 477 | 478 | 5912433153670749771 479 | 480 | ones 481 | 482 | 483 | 5912433153670749771->1832486461938311144 484 | 485 | 486 | 487 | 488 | -4133305945815896020 489 | 490 | ones 491 | 492 | 493 | -4133305945815896020->1832486461937146095 494 | 495 | 496 | 497 | 498 | -1424506233946400279 499 | 500 | ones 501 | 502 | 503 | -1424506233946400279->1832486461940641242 504 | 505 | 506 | 507 | 508 | 2968229022803582678->-2864674034747732923 509 | 510 | 511 | 512 | 513 | 6076892855581121253->-2864674034746567874 514 | 515 | 516 | 517 | 518 | 659148793014177912->-2864674034750063021 519 | 520 | 521 | 522 | 523 | -9048924627777257049->-2864672773550734100 524 | 525 | 526 | 527 | 528 | 6863370313580418776->-2864672773551899149 529 | 530 | 531 | 532 | 533 | -8092072985900237499->-2864672773548404002 534 | 535 | 536 | 537 | 538 | 3467732049900900916->-2864676557141730569 539 | 540 | 541 | 542 | 543 | -4106302257920999725->-2864676557140565520 544 | 545 | 546 | 547 | 548 | 6429879677358970466->-2864676557139400471 549 | 550 | 551 | 552 | 553 | 554 | -------------------------------------------------------------------------------- /tutorial/data/co2.csv: -------------------------------------------------------------------------------- 1 | ,co2 2 | 1958-03-29,316.1 3 | 1958-04-05,317.3 4 | 1958-04-12,317.6 5 | 1958-04-19,317.5 6 | 1958-04-26,316.4 7 | 1958-05-03,316.9 8 | 1958-05-10, 9 | 1958-05-17,317.5 10 | 1958-05-24,317.9 11 | 1958-05-31, 12 | 1958-06-07, 13 | 1958-06-14, 14 | 1958-06-21, 15 | 1958-06-28, 16 | 1958-07-05,315.8 17 | 1958-07-12,315.8 18 | 1958-07-19,315.4 19 | 1958-07-26,315.5 20 | 1958-08-02,315.6 21 | 1958-08-09,315.1 22 | 1958-08-16,315.0 23 | 1958-08-23, 24 | 1958-08-30,314.1 25 | 1958-09-06,313.5 26 | 1958-09-13, 27 | 1958-09-20, 28 | 1958-09-27, 29 | 1958-10-04, 30 | 1958-10-11, 31 | 1958-10-18, 32 | 1958-10-25, 33 | 1958-11-01, 34 | 1958-11-08,313.0 35 | 1958-11-15,313.2 36 | 1958-11-22,313.5 37 | 1958-11-29,314.0 38 | 1958-12-06,314.5 39 | 1958-12-13,314.4 40 | 1958-12-20,314.7 41 | 1958-12-27,315.2 42 | 1959-01-03,315.2 43 | 1959-01-10,315.5 44 | 1959-01-17,315.6 45 | 1959-01-24,315.8 46 | 1959-01-31,315.4 47 | 1959-02-07, 48 | 1959-02-14,316.9 49 | 1959-02-21,316.6 50 | 1959-02-28,316.6 51 | 1959-03-07,316.8 52 | 1959-03-14, 53 | 1959-03-21,316.7 54 | 1959-03-28,316.7 55 | 1959-04-04,317.7 56 | 1959-04-11,317.1 57 | 1959-04-18,317.6 58 | 1959-04-25,318.3 59 | 1959-05-02,318.2 60 | 1959-05-09,318.7 61 | 1959-05-16,318.0 62 | 1959-05-23,318.4 63 | 1959-05-30, 64 | 1959-06-06,318.5 65 | 1959-06-13,318.1 66 | 1959-06-20,317.8 67 | 1959-06-27,317.7 68 | 1959-07-04,316.8 69 | 1959-07-11,316.8 70 | 1959-07-18,316.4 71 | 1959-07-25,316.1 72 | 1959-08-01,315.6 73 | 1959-08-08,314.9 74 | 1959-08-15, 75 | 1959-08-22,315.0 76 | 1959-08-29,314.1 77 | 1959-09-05,314.4 78 | 1959-09-12,313.9 79 | 1959-09-19,313.5 80 | 1959-09-26,313.5 81 | 1959-10-03,313.0 82 | 1959-10-10,313.1 83 | 1959-10-17,313.4 84 | 1959-10-24,313.4 85 | 1959-10-31,314.1 86 | 1959-11-07,314.4 87 | 1959-11-14,314.8 88 | 1959-11-21,315.2 89 | 1959-11-28,315.1 90 | 1959-12-05,315.0 91 | 1959-12-12,315.6 92 | 1959-12-19,315.8 93 | 1959-12-26,315.7 94 | 1960-01-02,315.7 95 | 1960-01-09,316.4 96 | 1960-01-16,316.7 97 | 1960-01-23,316.5 98 | 1960-01-30,316.6 99 | 1960-02-06,316.6 100 | 1960-02-13,316.9 101 | 1960-02-20,317.4 102 | 1960-02-27,317.0 103 | 1960-03-05,316.9 104 | 1960-03-12,317.7 105 | 1960-03-19,318.0 106 | 1960-03-26,317.7 107 | 1960-04-02,318.6 108 | 1960-04-09,319.3 109 | 1960-04-16,319.0 110 | 1960-04-23,319.0 111 | 1960-04-30,319.7 112 | 1960-05-07,319.9 113 | 1960-05-14,319.8 114 | 1960-05-21,320.0 115 | 1960-05-28,320.0 116 | 1960-06-04,319.4 117 | 1960-06-11,320.0 118 | 1960-06-18,319.4 119 | 1960-06-25,319.0 120 | 1960-07-02,318.1 121 | 1960-07-09,318.6 122 | 1960-07-16,318.4 123 | 1960-07-23,317.9 124 | 1960-07-30,317.3 125 | 1960-08-06,316.6 126 | 1960-08-13,316.7 127 | 1960-08-20,315.1 128 | 1960-08-27,314.7 129 | 1960-09-03,314.7 130 | 1960-09-10,314.5 131 | 1960-09-17,314.2 132 | 1960-09-24,313.3 133 | 1960-10-01,313.6 134 | 1960-10-08,313.3 135 | 1960-10-15,313.9 136 | 1960-10-22,314.2 137 | 1960-10-29,314.2 138 | 1960-11-05,314.5 139 | 1960-11-12,315.1 140 | 1960-11-19,315.1 141 | 1960-11-26,315.4 142 | 1960-12-03,315.8 143 | 1960-12-10,316.0 144 | 1960-12-17,316.2 145 | 1960-12-24,316.4 146 | 1960-12-31,316.6 147 | 1961-01-07,316.7 148 | 1961-01-14,317.0 149 | 1961-01-21,317.0 150 | 1961-01-28,317.0 151 | 1961-02-04,317.0 152 | 1961-02-11,317.7 153 | 1961-02-18,317.9 154 | 1961-02-25,318.0 155 | 1961-03-04,318.0 156 | 1961-03-11,318.5 157 | 1961-03-18,318.9 158 | 1961-03-25,318.7 159 | 1961-04-01,319.4 160 | 1961-04-08,319.5 161 | 1961-04-15,318.9 162 | 1961-04-22,319.7 163 | 1961-04-29,319.6 164 | 1961-05-06,320.6 165 | 1961-05-13,320.4 166 | 1961-05-20,320.6 167 | 1961-05-27,320.3 168 | 1961-06-03,320.0 169 | 1961-06-10,320.0 170 | 1961-06-17,319.6 171 | 1961-06-24,319.4 172 | 1961-07-01,319.2 173 | 1961-07-08,319.0 174 | 1961-07-15,318.4 175 | 1961-07-22,317.1 176 | 1961-07-29,317.9 177 | 1961-08-05,317.9 178 | 1961-08-12,317.3 179 | 1961-08-19,316.7 180 | 1961-08-26,315.2 181 | 1961-09-02,315.2 182 | 1961-09-09,314.9 183 | 1961-09-16,314.5 184 | 1961-09-23,315.0 185 | 1961-09-30,315.6 186 | 1961-10-07,314.9 187 | 1961-10-14,315.4 188 | 1961-10-21,315.4 189 | 1961-10-28,315.7 190 | 1961-11-04,315.8 191 | 1961-11-11,315.7 192 | 1961-11-18,316.2 193 | 1961-11-25,316.5 194 | 1961-12-02,316.5 195 | 1961-12-09,317.0 196 | 1961-12-16,316.9 197 | 1961-12-23,317.1 198 | 1961-12-30,317.4 199 | 1962-01-06,317.9 200 | 1962-01-13,318.1 201 | 1962-01-20,318.0 202 | 1962-01-27,317.7 203 | 1962-02-03,318.0 204 | 1962-02-10,318.3 205 | 1962-02-17,318.9 206 | 1962-02-24,319.3 207 | 1962-03-03,319.2 208 | 1962-03-10,319.4 209 | 1962-03-17,319.9 210 | 1962-03-24,319.7 211 | 1962-03-31,320.2 212 | 1962-04-07,320.2 213 | 1962-04-14,321.0 214 | 1962-04-21,320.7 215 | 1962-04-28,320.3 216 | 1962-05-05,320.8 217 | 1962-05-12,320.7 218 | 1962-05-19,321.0 219 | 1962-05-26,321.1 220 | 1962-06-02,320.9 221 | 1962-06-09,320.8 222 | 1962-06-16,320.5 223 | 1962-06-23,320.1 224 | 1962-06-30,320.2 225 | 1962-07-07,320.1 226 | 1962-07-14,319.9 227 | 1962-07-21,319.0 228 | 1962-07-28,318.7 229 | 1962-08-04,318.6 230 | 1962-08-11,317.2 231 | 1962-08-18,317.4 232 | 1962-08-25, 233 | 1962-09-01, 234 | 1962-09-08, 235 | 1962-09-15,316.6 236 | 1962-09-22,315.7 237 | 1962-09-29,315.9 238 | 1962-10-06,315.1 239 | 1962-10-13,315.4 240 | 1962-10-20,315.7 241 | 1962-10-27,315.7 242 | 1962-11-03,315.9 243 | 1962-11-10,316.4 244 | 1962-11-17,316.9 245 | 1962-11-24,317.0 246 | 1962-12-01,317.1 247 | 1962-12-08,317.3 248 | 1962-12-15,317.6 249 | 1962-12-22,318.1 250 | 1962-12-29, 251 | 1963-01-05,318.5 252 | 1963-01-12,318.7 253 | 1963-01-19,318.9 254 | 1963-01-26,318.8 255 | 1963-02-02,318.7 256 | 1963-02-09,318.9 257 | 1963-02-16, 258 | 1963-02-23,319.3 259 | 1963-03-02,319.3 260 | 1963-03-09,319.7 261 | 1963-03-16,319.8 262 | 1963-03-23,320.3 263 | 1963-03-30,320.2 264 | 1963-04-06,320.3 265 | 1963-04-13,320.9 266 | 1963-04-20,322.0 267 | 1963-04-27,321.9 268 | 1963-05-04, 269 | 1963-05-11,321.9 270 | 1963-05-18,322.2 271 | 1963-05-25,322.2 272 | 1963-06-01,322.3 273 | 1963-06-08,322.0 274 | 1963-06-15,321.8 275 | 1963-06-22,320.8 276 | 1963-06-29,320.4 277 | 1963-07-06,320.1 278 | 1963-07-13,319.8 279 | 1963-07-20,319.5 280 | 1963-07-27,319.0 281 | 1963-08-03,318.6 282 | 1963-08-10,318.2 283 | 1963-08-17,317.7 284 | 1963-08-24,317.1 285 | 1963-08-31,316.4 286 | 1963-09-07,316.8 287 | 1963-09-14,315.9 288 | 1963-09-21,316.0 289 | 1963-09-28,315.9 290 | 1963-10-05,316.2 291 | 1963-10-12,315.6 292 | 1963-10-19,316.1 293 | 1963-10-26,316.3 294 | 1963-11-02,316.6 295 | 1963-11-09,316.8 296 | 1963-11-16,317.1 297 | 1963-11-23, 298 | 1963-11-30,317.5 299 | 1963-12-07,318.0 300 | 1963-12-14,318.2 301 | 1963-12-21,318.5 302 | 1963-12-28,318.7 303 | 1964-01-04,319.0 304 | 1964-01-11,319.4 305 | 1964-01-18,319.8 306 | 1964-01-25, 307 | 1964-02-01, 308 | 1964-02-08, 309 | 1964-02-15, 310 | 1964-02-22, 311 | 1964-02-29, 312 | 1964-03-07, 313 | 1964-03-14, 314 | 1964-03-21, 315 | 1964-03-28, 316 | 1964-04-04, 317 | 1964-04-11, 318 | 1964-04-18, 319 | 1964-04-25, 320 | 1964-05-02, 321 | 1964-05-09, 322 | 1964-05-16, 323 | 1964-05-23, 324 | 1964-05-30,322.0 325 | 1964-06-06,322.0 326 | 1964-06-13, 327 | 1964-06-20, 328 | 1964-06-27,321.5 329 | 1964-07-04,321.1 330 | 1964-07-11,319.9 331 | 1964-07-18,320.2 332 | 1964-07-25,320.0 333 | 1964-08-01,319.1 334 | 1964-08-08, 335 | 1964-08-15,318.6 336 | 1964-08-22,318.2 337 | 1964-08-29,318.1 338 | 1964-09-05,317.4 339 | 1964-09-12,316.5 340 | 1964-09-19,315.5 341 | 1964-09-26,317.0 342 | 1964-10-03,316.9 343 | 1964-10-10,316.5 344 | 1964-10-17,316.8 345 | 1964-10-24,317.0 346 | 1964-10-31,317.6 347 | 1964-11-07,317.7 348 | 1964-11-14,317.6 349 | 1964-11-21,317.5 350 | 1964-11-28,318.1 351 | 1964-12-05,318.4 352 | 1964-12-12,318.5 353 | 1964-12-19,318.9 354 | 1964-12-26,318.9 355 | 1965-01-02,319.0 356 | 1965-01-09,319.1 357 | 1965-01-16,319.1 358 | 1965-01-23,319.7 359 | 1965-01-30,320.1 360 | 1965-02-06,320.2 361 | 1965-02-13,320.1 362 | 1965-02-20,320.7 363 | 1965-02-27,320.8 364 | 1965-03-06,321.0 365 | 1965-03-13,320.9 366 | 1965-03-20,320.4 367 | 1965-03-27,321.4 368 | 1965-04-03,321.9 369 | 1965-04-10,322.2 370 | 1965-04-17,322.1 371 | 1965-04-24,321.8 372 | 1965-05-01,322.4 373 | 1965-05-08,322.2 374 | 1965-05-15,321.9 375 | 1965-05-22,321.6 376 | 1965-05-29,322.2 377 | 1965-06-05,321.8 378 | 1965-06-12,321.7 379 | 1965-06-19,321.7 380 | 1965-06-26,321.9 381 | 1965-07-03,321.9 382 | 1965-07-10,321.8 383 | 1965-07-17,321.7 384 | 1965-07-24,320.4 385 | 1965-07-31,319.4 386 | 1965-08-07,319.4 387 | 1965-08-14,318.0 388 | 1965-08-21,318.8 389 | 1965-08-28,318.7 390 | 1965-09-04,318.3 391 | 1965-09-11,318.0 392 | 1965-09-18,318.2 393 | 1965-09-25,316.8 394 | 1965-10-02,316.6 395 | 1965-10-09,317.2 396 | 1965-10-16,317.8 397 | 1965-10-23,317.5 398 | 1965-10-30,317.6 399 | 1965-11-06,318.3 400 | 1965-11-13,319.2 401 | 1965-11-20,318.9 402 | 1965-11-27,319.1 403 | 1965-12-04,319.0 404 | 1965-12-11,319.3 405 | 1965-12-18,319.3 406 | 1965-12-25,319.7 407 | 1966-01-01,319.6 408 | 1966-01-08,320.4 409 | 1966-01-15,320.6 410 | 1966-01-22,321.0 411 | 1966-01-29,321.1 412 | 1966-02-05,321.2 413 | 1966-02-12,321.7 414 | 1966-02-19,321.6 415 | 1966-02-26,321.8 416 | 1966-03-05,322.1 417 | 1966-03-12,322.1 418 | 1966-03-19,322.5 419 | 1966-03-26,322.8 420 | 1966-04-02,323.5 421 | 1966-04-09,323.6 422 | 1966-04-16,323.8 423 | 1966-04-23,323.9 424 | 1966-04-30,323.5 425 | 1966-05-07,324.0 426 | 1966-05-14,324.1 427 | 1966-05-21,323.7 428 | 1966-05-28,324.3 429 | 1966-06-04,324.0 430 | 1966-06-11,323.8 431 | 1966-06-18,323.7 432 | 1966-06-25,323.3 433 | 1966-07-02,322.8 434 | 1966-07-09,322.9 435 | 1966-07-16, 436 | 1966-07-23, 437 | 1966-07-30, 438 | 1966-08-06,321.3 439 | 1966-08-13,320.8 440 | 1966-08-20,319.1 441 | 1966-08-27,319.6 442 | 1966-09-03,319.9 443 | 1966-09-10,318.2 444 | 1966-09-17,318.4 445 | 1966-09-24,318.3 446 | 1966-10-01,317.9 447 | 1966-10-08,317.9 448 | 1966-10-15,318.2 449 | 1966-10-22,318.6 450 | 1966-10-29,318.3 451 | 1966-11-05, 452 | 1966-11-12,319.5 453 | 1966-11-19,320.0 454 | 1966-11-26,320.2 455 | 1966-12-03,320.8 456 | 1966-12-10,320.8 457 | 1966-12-17,321.1 458 | 1966-12-24,321.3 459 | 1966-12-31,321.3 460 | 1967-01-07,321.9 461 | 1967-01-14,322.9 462 | 1967-01-21, 463 | 1967-01-28, 464 | 1967-02-04,322.1 465 | 1967-02-11,322.2 466 | 1967-02-18,322.8 467 | 1967-02-25,322.6 468 | 1967-03-04,322.9 469 | 1967-03-11,322.6 470 | 1967-03-18,323.3 471 | 1967-03-25,323.2 472 | 1967-04-01,323.1 473 | 1967-04-08,324.2 474 | 1967-04-15,324.4 475 | 1967-04-22,324.6 476 | 1967-04-29,325.1 477 | 1967-05-06,325.2 478 | 1967-05-13,324.7 479 | 1967-05-20,325.0 480 | 1967-05-27,324.9 481 | 1967-06-03,324.9 482 | 1967-06-10,324.6 483 | 1967-06-17,323.3 484 | 1967-06-24,323.5 485 | 1967-07-01,322.8 486 | 1967-07-08,322.8 487 | 1967-07-15,322.4 488 | 1967-07-22,322.4 489 | 1967-07-29,322.0 490 | 1967-08-05,321.6 491 | 1967-08-12,321.4 492 | 1967-08-19,320.4 493 | 1967-08-26,320.0 494 | 1967-09-02,320.0 495 | 1967-09-09,319.4 496 | 1967-09-16,319.3 497 | 1967-09-23,319.0 498 | 1967-09-30,318.8 499 | 1967-10-07,318.8 500 | 1967-10-14,319.8 501 | 1967-10-21,319.4 502 | 1967-10-28,319.8 503 | 1967-11-04,320.0 504 | 1967-11-11,320.3 505 | 1967-11-18,320.9 506 | 1967-11-25,321.5 507 | 1967-12-02,321.4 508 | 1967-12-09,321.8 509 | 1967-12-16,322.2 510 | 1967-12-23,321.9 511 | 1967-12-30,322.3 512 | 1968-01-06,322.4 513 | 1968-01-13,322.5 514 | 1968-01-20,322.5 515 | 1968-01-27,322.8 516 | 1968-02-03,322.6 517 | 1968-02-10,323.1 518 | 1968-02-17,323.4 519 | 1968-02-24,323.1 520 | 1968-03-02,323.1 521 | 1968-03-09,323.8 522 | 1968-03-16,323.8 523 | 1968-03-23,324.2 524 | 1968-03-30,324.7 525 | 1968-04-06,324.7 526 | 1968-04-13,325.0 527 | 1968-04-20,324.8 528 | 1968-04-27,325.4 529 | 1968-05-04,325.6 530 | 1968-05-11,325.0 531 | 1968-05-18,325.5 532 | 1968-05-25,325.8 533 | 1968-06-01,325.6 534 | 1968-06-08,325.7 535 | 1968-06-15,325.5 536 | 1968-06-22,324.9 537 | 1968-06-29,324.6 538 | 1968-07-06,324.7 539 | 1968-07-13,324.1 540 | 1968-07-20,323.9 541 | 1968-07-27,323.4 542 | 1968-08-03,322.4 543 | 1968-08-10,322.2 544 | 1968-08-17,322.0 545 | 1968-08-24,321.7 546 | 1968-08-31,321.4 547 | 1968-09-07,320.4 548 | 1968-09-14,321.1 549 | 1968-09-21,319.7 550 | 1968-09-28,319.8 551 | 1968-10-05,320.5 552 | 1968-10-12,320.5 553 | 1968-10-19,320.2 554 | 1968-10-26,319.9 555 | 1968-11-02,320.7 556 | 1968-11-09,320.8 557 | 1968-11-16,321.4 558 | 1968-11-23,321.7 559 | 1968-11-30,322.0 560 | 1968-12-07,322.4 561 | 1968-12-14,322.9 562 | 1968-12-21,323.3 563 | 1968-12-28,323.1 564 | 1969-01-04,323.3 565 | 1969-01-11,324.0 566 | 1969-01-18,324.3 567 | 1969-01-25,324.1 568 | 1969-02-01,324.1 569 | 1969-02-08,323.9 570 | 1969-02-15,324.3 571 | 1969-02-22,324.8 572 | 1969-03-01,325.1 573 | 1969-03-08,325.5 574 | 1969-03-15,325.7 575 | 1969-03-22,325.9 576 | 1969-03-29,325.8 577 | 1969-04-05,326.2 578 | 1969-04-12,327.1 579 | 1969-04-19,326.5 580 | 1969-04-26,326.5 581 | 1969-05-03,327.5 582 | 1969-05-10,327.8 583 | 1969-05-17,326.8 584 | 1969-05-24,326.9 585 | 1969-05-31,327.4 586 | 1969-06-07,326.5 587 | 1969-06-14,326.7 588 | 1969-06-21,326.7 589 | 1969-06-28,326.3 590 | 1969-07-05,326.1 591 | 1969-07-12,326.0 592 | 1969-07-19,325.7 593 | 1969-07-26,325.4 594 | 1969-08-02,324.5 595 | 1969-08-09,324.5 596 | 1969-08-16,323.1 597 | 1969-08-23,322.5 598 | 1969-08-30,323.1 599 | 1969-09-06,322.2 600 | 1969-09-13,322.7 601 | 1969-09-20,322.8 602 | 1969-09-27,321.9 603 | 1969-10-04,321.5 604 | 1969-10-11,321.8 605 | 1969-10-18,322.0 606 | 1969-10-25,321.9 607 | 1969-11-01,322.2 608 | 1969-11-08,322.6 609 | 1969-11-15,322.7 610 | 1969-11-22,323.1 611 | 1969-11-29,323.5 612 | 1969-12-06,323.9 613 | 1969-12-13,323.9 614 | 1969-12-20,324.2 615 | 1969-12-27,324.5 616 | 1970-01-03,324.7 617 | 1970-01-10,325.4 618 | 1970-01-17,325.0 619 | 1970-01-24,324.8 620 | 1970-01-31,325.5 621 | 1970-02-07,325.7 622 | 1970-02-14,326.0 623 | 1970-02-21,326.3 624 | 1970-02-28,326.1 625 | 1970-03-07,326.8 626 | 1970-03-14,326.8 627 | 1970-03-21,327.5 628 | 1970-03-28,326.9 629 | 1970-04-04,328.2 630 | 1970-04-11,327.8 631 | 1970-04-18,327.8 632 | 1970-04-25,328.5 633 | 1970-05-02,327.9 634 | 1970-05-09,327.5 635 | 1970-05-16,328.0 636 | 1970-05-23,328.3 637 | 1970-05-30,327.9 638 | 1970-06-06,327.5 639 | 1970-06-13,327.8 640 | 1970-06-20,327.7 641 | 1970-06-27,327.2 642 | 1970-07-04,327.2 643 | 1970-07-11,326.2 644 | 1970-07-18,326.2 645 | 1970-07-25,325.6 646 | 1970-08-01,325.2 647 | 1970-08-08,325.2 648 | 1970-08-15,324.8 649 | 1970-08-22,324.8 650 | 1970-08-29,323.3 651 | 1970-09-05,322.9 652 | 1970-09-12,323.5 653 | 1970-09-19,323.1 654 | 1970-09-26,323.1 655 | 1970-10-03,323.2 656 | 1970-10-10,323.5 657 | 1970-10-17,322.9 658 | 1970-10-24,323.0 659 | 1970-10-31,323.1 660 | 1970-11-07,323.6 661 | 1970-11-14,323.7 662 | 1970-11-21,324.2 663 | 1970-11-28,324.7 664 | 1970-12-05,324.7 665 | 1970-12-12,325.0 666 | 1970-12-19,325.2 667 | 1970-12-26,325.5 668 | 1971-01-02,325.7 669 | 1971-01-09,325.8 670 | 1971-01-16,325.9 671 | 1971-01-23,326.7 672 | 1971-01-30,326.6 673 | 1971-02-06,326.5 674 | 1971-02-13,326.4 675 | 1971-02-20,326.7 676 | 1971-02-27,327.0 677 | 1971-03-06,327.1 678 | 1971-03-13,327.3 679 | 1971-03-20,327.0 680 | 1971-03-27,327.4 681 | 1971-04-03,327.4 682 | 1971-04-10,327.1 683 | 1971-04-17,327.7 684 | 1971-04-24,328.5 685 | 1971-05-01,328.2 686 | 1971-05-08,329.0 687 | 1971-05-15,329.2 688 | 1971-05-22,328.9 689 | 1971-05-29,328.8 690 | 1971-06-05,328.5 691 | 1971-06-12,328.8 692 | 1971-06-19,328.1 693 | 1971-06-26,328.5 694 | 1971-07-03,327.9 695 | 1971-07-10,327.8 696 | 1971-07-17,327.5 697 | 1971-07-24,326.2 698 | 1971-07-31,326.7 699 | 1971-08-07,326.1 700 | 1971-08-14,325.6 701 | 1971-08-21,325.3 702 | 1971-08-28,324.0 703 | 1971-09-04,323.6 704 | 1971-09-11,323.5 705 | 1971-09-18,323.2 706 | 1971-09-25,323.3 707 | 1971-10-02,323.3 708 | 1971-10-09,322.9 709 | 1971-10-16,323.5 710 | 1971-10-23,323.6 711 | 1971-10-30,324.4 712 | 1971-11-06,324.3 713 | 1971-11-13,324.5 714 | 1971-11-20,325.0 715 | 1971-11-27,325.5 716 | 1971-12-04,325.3 717 | 1971-12-11,325.9 718 | 1971-12-18,326.2 719 | 1971-12-25,326.3 720 | 1972-01-01,326.6 721 | 1972-01-08,326.6 722 | 1972-01-15,326.6 723 | 1972-01-22,326.6 724 | 1972-01-29,327.2 725 | 1972-02-05,327.4 726 | 1972-02-12,327.9 727 | 1972-02-19,327.8 728 | 1972-02-26,327.4 729 | 1972-03-04,327.5 730 | 1972-03-11,327.1 731 | 1972-03-18,327.7 732 | 1972-03-25,328.6 733 | 1972-04-01,328.9 734 | 1972-04-08,329.4 735 | 1972-04-15,329.8 736 | 1972-04-22,330.1 737 | 1972-04-29,330.0 738 | 1972-05-06,330.0 739 | 1972-05-13,329.7 740 | 1972-05-20,330.1 741 | 1972-05-27,330.2 742 | 1972-06-03,329.7 743 | 1972-06-10,329.1 744 | 1972-06-17,329.0 745 | 1972-06-24,328.5 746 | 1972-07-01,328.6 747 | 1972-07-08,328.3 748 | 1972-07-15,327.7 749 | 1972-07-22,328.1 750 | 1972-07-29,327.5 751 | 1972-08-05,326.9 752 | 1972-08-12,326.6 753 | 1972-08-19,326.5 754 | 1972-08-26,325.0 755 | 1972-09-02,325.4 756 | 1972-09-09,325.7 757 | 1972-09-16,324.8 758 | 1972-09-23,324.2 759 | 1972-09-30,324.2 760 | 1972-10-07,324.8 761 | 1972-10-14,325.5 762 | 1972-10-21,325.1 763 | 1972-10-28,325.8 764 | 1972-11-04,326.3 765 | 1972-11-11,326.1 766 | 1972-11-18,326.4 767 | 1972-11-25,326.9 768 | 1972-12-02,326.9 769 | 1972-12-09,327.1 770 | 1972-12-16,327.6 771 | 1972-12-23,327.9 772 | 1972-12-30,328.2 773 | 1973-01-06,328.4 774 | 1973-01-13,328.4 775 | 1973-01-20,328.6 776 | 1973-01-27,328.8 777 | 1973-02-03,329.1 778 | 1973-02-10,329.5 779 | 1973-02-17,329.6 780 | 1973-02-24,329.7 781 | 1973-03-03,329.9 782 | 1973-03-10,330.1 783 | 1973-03-17,330.5 784 | 1973-03-24,330.8 785 | 1973-03-31,330.6 786 | 1973-04-07,331.2 787 | 1973-04-14,331.1 788 | 1973-04-21,331.9 789 | 1973-04-28,332.1 790 | 1973-05-05,332.2 791 | 1973-05-12,332.3 792 | 1973-05-19,332.6 793 | 1973-05-26,332.5 794 | 1973-06-02,332.2 795 | 1973-06-09,332.5 796 | 1973-06-16,332.0 797 | 1973-06-23,331.6 798 | 1973-06-30,331.4 799 | 1973-07-07,331.5 800 | 1973-07-14,331.0 801 | 1973-07-21,330.0 802 | 1973-07-28,330.1 803 | 1973-08-04,330.0 804 | 1973-08-11,329.5 805 | 1973-08-18,329.3 806 | 1973-08-25,328.5 807 | 1973-09-01,328.4 808 | 1973-09-08,327.6 809 | 1973-09-15,327.8 810 | 1973-09-22,327.1 811 | 1973-09-29,326.6 812 | 1973-10-06,327.0 813 | 1973-10-13,327.4 814 | 1973-10-20,327.4 815 | 1973-10-27,327.1 816 | 1973-11-03,327.5 817 | 1973-11-10,328.0 818 | 1973-11-17,328.2 819 | 1973-11-24,328.5 820 | 1973-12-01,329.0 821 | 1973-12-08,328.7 822 | 1973-12-15,328.6 823 | 1973-12-22,328.2 824 | 1973-12-29,328.7 825 | 1974-01-05,328.9 826 | 1974-01-12,329.2 827 | 1974-01-19,329.4 828 | 1974-01-26,329.8 829 | 1974-02-02,330.5 830 | 1974-02-09,330.8 831 | 1974-02-16,330.6 832 | 1974-02-23,330.6 833 | 1974-03-02,330.7 834 | 1974-03-09,331.2 835 | 1974-03-16,332.1 836 | 1974-03-23,332.0 837 | 1974-03-30,331.5 838 | 1974-04-06,332.4 839 | 1974-04-13,332.1 840 | 1974-04-20,332.9 841 | 1974-04-27,333.1 842 | 1974-05-04,332.9 843 | 1974-05-11,333.0 844 | 1974-05-18,333.2 845 | 1974-05-25,332.8 846 | 1974-06-01,332.9 847 | 1974-06-08,332.0 848 | 1974-06-15,332.0 849 | 1974-06-22,332.2 850 | 1974-06-29,331.7 851 | 1974-07-06,331.7 852 | 1974-07-13,331.2 853 | 1974-07-20,330.4 854 | 1974-07-27,331.0 855 | 1974-08-03,330.0 856 | 1974-08-10,329.9 857 | 1974-08-17,329.2 858 | 1974-08-24,328.9 859 | 1974-08-31,328.1 860 | 1974-09-07,328.0 861 | 1974-09-14,327.3 862 | 1974-09-21,326.9 863 | 1974-09-28,327.3 864 | 1974-10-05,327.3 865 | 1974-10-12,327.0 866 | 1974-10-19,327.5 867 | 1974-10-26,327.7 868 | 1974-11-02,327.9 869 | 1974-11-09,328.0 870 | 1974-11-16,328.8 871 | 1974-11-23,328.6 872 | 1974-11-30,328.7 873 | 1974-12-07,329.5 874 | 1974-12-14,329.7 875 | 1974-12-21,329.8 876 | 1974-12-28,329.7 877 | 1975-01-04,329.9 878 | 1975-01-11,329.8 879 | 1975-01-18,330.2 880 | 1975-01-25,331.1 881 | 1975-02-01,331.1 882 | 1975-02-08,331.4 883 | 1975-02-15,331.0 884 | 1975-02-22,331.7 885 | 1975-03-01,331.8 886 | 1975-03-08,331.6 887 | 1975-03-15,331.9 888 | 1975-03-22,332.2 889 | 1975-03-29,332.5 890 | 1975-04-05,333.0 891 | 1975-04-12,333.5 892 | 1975-04-19,333.5 893 | 1975-04-26,333.1 894 | 1975-05-03,333.9 895 | 1975-05-10,333.9 896 | 1975-05-17,333.7 897 | 1975-05-24,333.7 898 | 1975-05-31,334.1 899 | 1975-06-07,333.8 900 | 1975-06-14,333.3 901 | 1975-06-21,333.4 902 | 1975-06-28,333.1 903 | 1975-07-05,332.7 904 | 1975-07-12,332.0 905 | 1975-07-19,331.0 906 | 1975-07-26,331.5 907 | 1975-08-02,330.8 908 | 1975-08-09,330.7 909 | 1975-08-16,330.3 910 | 1975-08-23,329.3 911 | 1975-08-30,328.8 912 | 1975-09-06,329.4 913 | 1975-09-13,328.5 914 | 1975-09-20,328.0 915 | 1975-09-27,328.2 916 | 1975-10-04,328.0 917 | 1975-10-11,328.0 918 | 1975-10-18,328.5 919 | 1975-10-25,328.8 920 | 1975-11-01,329.3 921 | 1975-11-08,329.2 922 | 1975-11-15,329.1 923 | 1975-11-22,329.5 924 | 1975-11-29,330.1 925 | 1975-12-06,330.3 926 | 1975-12-13,330.5 927 | 1975-12-20,331.1 928 | 1975-12-27,331.2 929 | 1976-01-03,331.5 930 | 1976-01-10,331.5 931 | 1976-01-17,331.7 932 | 1976-01-24,331.8 933 | 1976-01-31,332.2 934 | 1976-02-07,332.1 935 | 1976-02-14,332.5 936 | 1976-02-21,333.2 937 | 1976-02-28,332.4 938 | 1976-03-06,332.8 939 | 1976-03-13,333.6 940 | 1976-03-20,333.1 941 | 1976-03-27,334.3 942 | 1976-04-03,334.7 943 | 1976-04-10,334.2 944 | 1976-04-17,334.4 945 | 1976-04-24,334.5 946 | 1976-05-01,334.7 947 | 1976-05-08,334.3 948 | 1976-05-15,334.6 949 | 1976-05-22,335.4 950 | 1976-05-29,334.8 951 | 1976-06-05,334.3 952 | 1976-06-12,334.6 953 | 1976-06-19,334.3 954 | 1976-06-26, 955 | 1976-07-03,333.6 956 | 1976-07-10,333.4 957 | 1976-07-17,332.8 958 | 1976-07-24,332.4 959 | 1976-07-31,332.1 960 | 1976-08-07,331.7 961 | 1976-08-14,330.6 962 | 1976-08-21,330.6 963 | 1976-08-28,330.0 964 | 1976-09-04,329.7 965 | 1976-09-11,330.0 966 | 1976-09-18,329.3 967 | 1976-09-25,328.4 968 | 1976-10-02,328.8 969 | 1976-10-09,329.0 970 | 1976-10-16,329.6 971 | 1976-10-23,329.1 972 | 1976-10-30,329.0 973 | 1976-11-06,329.8 974 | 1976-11-13,330.4 975 | 1976-11-20,330.5 976 | 1976-11-27,330.7 977 | 1976-12-04,331.1 978 | 1976-12-11,331.3 979 | 1976-12-18,331.9 980 | 1976-12-25,332.2 981 | 1977-01-01,332.5 982 | 1977-01-08,332.4 983 | 1977-01-15,333.1 984 | 1977-01-22,333.2 985 | 1977-01-29,333.2 986 | 1977-02-05,333.4 987 | 1977-02-12,333.3 988 | 1977-02-19,333.4 989 | 1977-02-26,333.6 990 | 1977-03-05,334.1 991 | 1977-03-12,334.6 992 | 1977-03-19,335.1 993 | 1977-03-26,335.0 994 | 1977-04-02,335.5 995 | 1977-04-09,335.9 996 | 1977-04-16,336.0 997 | 1977-04-23,336.1 998 | 1977-04-30,336.7 999 | 1977-05-07,336.8 1000 | 1977-05-14,336.4 1001 | 1977-05-21,336.8 1002 | 1977-05-28,336.7 1003 | 1977-06-04,336.4 1004 | 1977-06-11,336.3 1005 | 1977-06-18,336.1 1006 | 1977-06-25,336.0 1007 | 1977-07-02,335.5 1008 | 1977-07-09,335.1 1009 | 1977-07-16,335.1 1010 | 1977-07-23,334.6 1011 | 1977-07-30,333.7 1012 | 1977-08-06,333.0 1013 | 1977-08-13,332.9 1014 | 1977-08-20,332.8 1015 | 1977-08-27,332.8 1016 | 1977-09-03,332.1 1017 | 1977-09-10,331.2 1018 | 1977-09-17,332.1 1019 | 1977-09-24,330.9 1020 | 1977-10-01,330.4 1021 | 1977-10-08,330.9 1022 | 1977-10-15,331.5 1023 | 1977-10-22,331.5 1024 | 1977-10-29,331.7 1025 | 1977-11-05,332.1 1026 | 1977-11-12,332.0 1027 | 1977-11-19,332.5 1028 | 1977-11-26,332.8 1029 | 1977-12-03,333.2 1030 | 1977-12-10,333.5 1031 | 1977-12-17,333.8 1032 | 1977-12-24,334.2 1033 | 1977-12-31,334.6 1034 | 1978-01-07,334.2 1035 | 1978-01-14,334.6 1036 | 1978-01-21,335.4 1037 | 1978-01-28,335.9 1038 | 1978-02-04,335.0 1039 | 1978-02-11,335.1 1040 | 1978-02-18,335.6 1041 | 1978-02-25,335.7 1042 | 1978-03-04,336.2 1043 | 1978-03-11,336.1 1044 | 1978-03-18,336.8 1045 | 1978-03-25,337.3 1046 | 1978-04-01,337.0 1047 | 1978-04-08,337.9 1048 | 1978-04-15,337.9 1049 | 1978-04-22,337.4 1050 | 1978-04-29,338.0 1051 | 1978-05-06,338.0 1052 | 1978-05-13,338.1 1053 | 1978-05-20,337.8 1054 | 1978-05-27,337.9 1055 | 1978-06-03,338.4 1056 | 1978-06-10,338.2 1057 | 1978-06-17,337.8 1058 | 1978-06-24,337.3 1059 | 1978-07-01,337.6 1060 | 1978-07-08,336.7 1061 | 1978-07-15,336.7 1062 | 1978-07-22,335.9 1063 | 1978-07-29,335.6 1064 | 1978-08-05,335.1 1065 | 1978-08-12,334.8 1066 | 1978-08-19,334.4 1067 | 1978-08-26,334.3 1068 | 1978-09-02,333.8 1069 | 1978-09-09,332.8 1070 | 1978-09-16,332.1 1071 | 1978-09-23,332.3 1072 | 1978-09-30,332.7 1073 | 1978-10-07,332.1 1074 | 1978-10-14,332.4 1075 | 1978-10-21,333.0 1076 | 1978-10-28,333.1 1077 | 1978-11-04,333.5 1078 | 1978-11-11,333.8 1079 | 1978-11-18,333.8 1080 | 1978-11-25,334.2 1081 | 1978-12-02,334.5 1082 | 1978-12-09,334.8 1083 | 1978-12-16,335.1 1084 | 1978-12-23,335.1 1085 | 1978-12-30,335.3 1086 | 1979-01-06,335.3 1087 | 1979-01-13,335.9 1088 | 1979-01-20,336.8 1089 | 1979-01-27,336.9 1090 | 1979-02-03,336.9 1091 | 1979-02-10,336.5 1092 | 1979-02-17,336.7 1093 | 1979-02-24,336.7 1094 | 1979-03-03,337.1 1095 | 1979-03-10,337.7 1096 | 1979-03-17,337.4 1097 | 1979-03-24,339.0 1098 | 1979-03-31,338.8 1099 | 1979-04-07,338.1 1100 | 1979-04-14,338.6 1101 | 1979-04-21,339.2 1102 | 1979-04-28,339.6 1103 | 1979-05-05,339.3 1104 | 1979-05-12,338.8 1105 | 1979-05-19,339.8 1106 | 1979-05-26,339.6 1107 | 1979-06-02,339.9 1108 | 1979-06-09,339.5 1109 | 1979-06-16,338.9 1110 | 1979-06-23,338.9 1111 | 1979-06-30,339.0 1112 | 1979-07-07,338.2 1113 | 1979-07-14,337.8 1114 | 1979-07-21,337.3 1115 | 1979-07-28,336.8 1116 | 1979-08-04,337.0 1117 | 1979-08-11,336.5 1118 | 1979-08-18,336.1 1119 | 1979-08-25,334.5 1120 | 1979-09-01,334.4 1121 | 1979-09-08,334.0 1122 | 1979-09-15,334.2 1123 | 1979-09-22,333.2 1124 | 1979-09-29,334.1 1125 | 1979-10-06,334.1 1126 | 1979-10-13,333.9 1127 | 1979-10-20,333.7 1128 | 1979-10-27,334.1 1129 | 1979-11-03,334.7 1130 | 1979-11-10,334.8 1131 | 1979-11-17,335.5 1132 | 1979-11-24,335.6 1133 | 1979-12-01,335.9 1134 | 1979-12-08,336.5 1135 | 1979-12-15,336.7 1136 | 1979-12-22,336.8 1137 | 1979-12-29,337.4 1138 | 1980-01-05,337.6 1139 | 1980-01-12,337.4 1140 | 1980-01-19,338.3 1141 | 1980-01-26,338.4 1142 | 1980-02-02,338.0 1143 | 1980-02-09,338.1 1144 | 1980-02-16,338.6 1145 | 1980-02-23,338.2 1146 | 1980-03-01,339.3 1147 | 1980-03-08,339.5 1148 | 1980-03-15,340.0 1149 | 1980-03-22,340.5 1150 | 1980-03-29,341.0 1151 | 1980-04-05,340.4 1152 | 1980-04-12,340.9 1153 | 1980-04-19,340.7 1154 | 1980-04-26,341.0 1155 | 1980-05-03,341.5 1156 | 1980-05-10,341.3 1157 | 1980-05-17,341.3 1158 | 1980-05-24,340.9 1159 | 1980-05-31,341.7 1160 | 1980-06-07,341.3 1161 | 1980-06-14,341.3 1162 | 1980-06-21,340.8 1163 | 1980-06-28,340.4 1164 | 1980-07-05,340.4 1165 | 1980-07-12,339.7 1166 | 1980-07-19,338.5 1167 | 1980-07-26,338.9 1168 | 1980-08-02,337.9 1169 | 1980-08-09,337.7 1170 | 1980-08-16,337.7 1171 | 1980-08-23,337.7 1172 | 1980-08-30,337.0 1173 | 1980-09-06,336.6 1174 | 1980-09-13,335.7 1175 | 1980-09-20,335.2 1176 | 1980-09-27,336.0 1177 | 1980-10-04,335.8 1178 | 1980-10-11,335.8 1179 | 1980-10-18,336.1 1180 | 1980-10-25,336.4 1181 | 1980-11-01,336.6 1182 | 1980-11-08,336.9 1183 | 1980-11-15,337.1 1184 | 1980-11-22,337.3 1185 | 1980-11-29,337.4 1186 | 1980-12-06,337.7 1187 | 1980-12-13,338.1 1188 | 1980-12-20,338.3 1189 | 1980-12-27,338.7 1190 | 1981-01-03,338.9 1191 | 1981-01-10,339.1 1192 | 1981-01-17,339.3 1193 | 1981-01-24,339.3 1194 | 1981-01-31,339.5 1195 | 1981-02-07,340.5 1196 | 1981-02-14,340.0 1197 | 1981-02-21,340.2 1198 | 1981-02-28,341.1 1199 | 1981-03-07,340.7 1200 | 1981-03-14,341.0 1201 | 1981-03-21,341.8 1202 | 1981-03-28,342.1 1203 | 1981-04-04,342.4 1204 | 1981-04-11,342.4 1205 | 1981-04-18,342.7 1206 | 1981-04-25,342.3 1207 | 1981-05-02,342.9 1208 | 1981-05-09,343.0 1209 | 1981-05-16,342.8 1210 | 1981-05-23,342.7 1211 | 1981-05-30,342.7 1212 | 1981-06-06,342.6 1213 | 1981-06-13,342.5 1214 | 1981-06-20,341.8 1215 | 1981-06-27,341.6 1216 | 1981-07-04,341.0 1217 | 1981-07-11,340.8 1218 | 1981-07-18,339.7 1219 | 1981-07-25,340.2 1220 | 1981-08-01,339.5 1221 | 1981-08-08,338.9 1222 | 1981-08-15,338.4 1223 | 1981-08-22,337.5 1224 | 1981-08-29,337.7 1225 | 1981-09-05,337.2 1226 | 1981-09-12,337.0 1227 | 1981-09-19,336.7 1228 | 1981-09-26,335.9 1229 | 1981-10-03,336.3 1230 | 1981-10-10,336.6 1231 | 1981-10-17,337.1 1232 | 1981-10-24,337.2 1233 | 1981-10-31,337.5 1234 | 1981-11-07,337.8 1235 | 1981-11-14,338.1 1236 | 1981-11-21,338.5 1237 | 1981-11-28,339.3 1238 | 1981-12-05,339.2 1239 | 1981-12-12,339.4 1240 | 1981-12-19,339.6 1241 | 1981-12-26,340.2 1242 | 1982-01-02,340.2 1243 | 1982-01-09,340.3 1244 | 1982-01-16,340.7 1245 | 1982-01-23,341.1 1246 | 1982-01-30,341.2 1247 | 1982-02-06,341.9 1248 | 1982-02-13,341.1 1249 | 1982-02-20,341.1 1250 | 1982-02-27,342.1 1251 | 1982-03-06,342.6 1252 | 1982-03-13,342.6 1253 | 1982-03-20,342.7 1254 | 1982-03-27,342.8 1255 | 1982-04-03,342.9 1256 | 1982-04-10,343.3 1257 | 1982-04-17,343.5 1258 | 1982-04-24,344.2 1259 | 1982-05-01,343.8 1260 | 1982-05-08,343.6 1261 | 1982-05-15,344.2 1262 | 1982-05-22,344.1 1263 | 1982-05-29,344.1 1264 | 1982-06-05,343.4 1265 | 1982-06-12,343.5 1266 | 1982-06-19,343.4 1267 | 1982-06-26,342.9 1268 | 1982-07-03,342.5 1269 | 1982-07-10,342.0 1270 | 1982-07-17,342.0 1271 | 1982-07-24,341.8 1272 | 1982-07-31,341.3 1273 | 1982-08-07,340.5 1274 | 1982-08-14,340.0 1275 | 1982-08-21,339.7 1276 | 1982-08-28,338.3 1277 | 1982-09-04,338.8 1278 | 1982-09-11,338.6 1279 | 1982-09-18,337.8 1280 | 1982-09-25,336.9 1281 | 1982-10-02,337.3 1282 | 1982-10-09,338.0 1283 | 1982-10-16,337.6 1284 | 1982-10-23,337.9 1285 | 1982-10-30,338.7 1286 | 1982-11-06,338.4 1287 | 1982-11-13,339.2 1288 | 1982-11-20,339.7 1289 | 1982-11-27,339.8 1290 | 1982-12-04,339.8 1291 | 1982-12-11,340.4 1292 | 1982-12-18,340.7 1293 | 1982-12-25,340.8 1294 | 1983-01-01,340.9 1295 | 1983-01-08,341.4 1296 | 1983-01-15,341.5 1297 | 1983-01-22,341.2 1298 | 1983-01-29,341.7 1299 | 1983-02-05,342.0 1300 | 1983-02-12,342.7 1301 | 1983-02-19,342.5 1302 | 1983-02-26,342.8 1303 | 1983-03-05,342.3 1304 | 1983-03-12,342.5 1305 | 1983-03-19,344.0 1306 | 1983-03-26,343.8 1307 | 1983-04-02,344.0 1308 | 1983-04-09,344.8 1309 | 1983-04-16,345.0 1310 | 1983-04-23,345.3 1311 | 1983-04-30,345.4 1312 | 1983-05-07,345.4 1313 | 1983-05-14,345.7 1314 | 1983-05-21,345.8 1315 | 1983-05-28,345.7 1316 | 1983-06-04,345.6 1317 | 1983-06-11,345.6 1318 | 1983-06-18,345.0 1319 | 1983-06-25,344.9 1320 | 1983-07-02,344.7 1321 | 1983-07-09,344.5 1322 | 1983-07-16,343.7 1323 | 1983-07-23,343.6 1324 | 1983-07-30,342.6 1325 | 1983-08-06,343.0 1326 | 1983-08-13,341.7 1327 | 1983-08-20,342.1 1328 | 1983-08-27,341.8 1329 | 1983-09-03,339.9 1330 | 1983-09-10,339.9 1331 | 1983-09-17,339.8 1332 | 1983-09-24,339.9 1333 | 1983-10-01,339.8 1334 | 1983-10-08,339.7 1335 | 1983-10-15,340.1 1336 | 1983-10-22,340.2 1337 | 1983-10-29,340.3 1338 | 1983-11-05,340.8 1339 | 1983-11-12,341.0 1340 | 1983-11-19,341.1 1341 | 1983-11-26,341.7 1342 | 1983-12-03,341.8 1343 | 1983-12-10,342.8 1344 | 1983-12-17,343.3 1345 | 1983-12-24,343.6 1346 | 1983-12-31,343.4 1347 | 1984-01-07,343.7 1348 | 1984-01-14,343.4 1349 | 1984-01-21,343.5 1350 | 1984-01-28,344.1 1351 | 1984-02-04,344.3 1352 | 1984-02-11,344.5 1353 | 1984-02-18,344.3 1354 | 1984-02-25,344.6 1355 | 1984-03-03,344.8 1356 | 1984-03-10,344.9 1357 | 1984-03-17,345.4 1358 | 1984-03-24,345.6 1359 | 1984-03-31, 1360 | 1984-04-07, 1361 | 1984-04-14, 1362 | 1984-04-21, 1363 | 1984-04-28,347.4 1364 | 1984-05-05,347.4 1365 | 1984-05-12,347.7 1366 | 1984-05-19,347.3 1367 | 1984-05-26,347.0 1368 | 1984-06-02,347.0 1369 | 1984-06-09,347.0 1370 | 1984-06-16,346.8 1371 | 1984-06-23,346.3 1372 | 1984-06-30,346.2 1373 | 1984-07-07,345.8 1374 | 1984-07-14,345.4 1375 | 1984-07-21,345.2 1376 | 1984-07-28,344.4 1377 | 1984-08-04,344.0 1378 | 1984-08-11,344.1 1379 | 1984-08-18,343.1 1380 | 1984-08-25,342.0 1381 | 1984-09-01,341.6 1382 | 1984-09-08,340.6 1383 | 1984-09-15,341.3 1384 | 1984-09-22,341.3 1385 | 1984-09-29,340.8 1386 | 1984-10-06,341.1 1387 | 1984-10-13,341.3 1388 | 1984-10-20,341.9 1389 | 1984-10-27,341.6 1390 | 1984-11-03,342.0 1391 | 1984-11-10,342.6 1392 | 1984-11-17,343.1 1393 | 1984-11-24,343.7 1394 | 1984-12-01,343.6 1395 | 1984-12-08,343.9 1396 | 1984-12-15,344.2 1397 | 1984-12-22,344.5 1398 | 1984-12-29,344.5 1399 | 1985-01-05,344.7 1400 | 1985-01-12,345.0 1401 | 1985-01-19,345.0 1402 | 1985-01-26,345.0 1403 | 1985-02-02,345.9 1404 | 1985-02-09,345.5 1405 | 1985-02-16,345.8 1406 | 1985-02-23,346.3 1407 | 1985-03-02,346.7 1408 | 1985-03-09,347.1 1409 | 1985-03-16,347.5 1410 | 1985-03-23,347.7 1411 | 1985-03-30,348.2 1412 | 1985-04-06,348.0 1413 | 1985-04-13,348.0 1414 | 1985-04-20,348.5 1415 | 1985-04-27,348.8 1416 | 1985-05-04,348.8 1417 | 1985-05-11,349.3 1418 | 1985-05-18,349.1 1419 | 1985-05-25,348.1 1420 | 1985-06-01,349.0 1421 | 1985-06-08,348.4 1422 | 1985-06-15,348.2 1423 | 1985-06-22,347.9 1424 | 1985-06-29,347.4 1425 | 1985-07-06,346.9 1426 | 1985-07-13,346.8 1427 | 1985-07-20,346.4 1428 | 1985-07-27,345.7 1429 | 1985-08-03, 1430 | 1985-08-10,344.7 1431 | 1985-08-17,344.5 1432 | 1985-08-24,344.3 1433 | 1985-08-31,343.7 1434 | 1985-09-07,344.2 1435 | 1985-09-14,343.3 1436 | 1985-09-21,342.4 1437 | 1985-09-28,342.1 1438 | 1985-10-05,342.4 1439 | 1985-10-12,342.5 1440 | 1985-10-19,343.1 1441 | 1985-10-26,343.2 1442 | 1985-11-02,343.3 1443 | 1985-11-09,343.7 1444 | 1985-11-16,344.2 1445 | 1985-11-23,344.6 1446 | 1985-11-30,345.3 1447 | 1985-12-07,345.3 1448 | 1985-12-14,345.6 1449 | 1985-12-21,345.1 1450 | 1985-12-28,346.3 1451 | 1986-01-04,346.4 1452 | 1986-01-11,346.0 1453 | 1986-01-18,346.2 1454 | 1986-01-25,346.4 1455 | 1986-02-01,346.2 1456 | 1986-02-08,346.8 1457 | 1986-02-15,347.1 1458 | 1986-02-22,347.2 1459 | 1986-03-01,347.0 1460 | 1986-03-08,346.6 1461 | 1986-03-15,347.2 1462 | 1986-03-22,349.1 1463 | 1986-03-29,348.8 1464 | 1986-04-05,349.2 1465 | 1986-04-12,349.4 1466 | 1986-04-19,349.3 1467 | 1986-04-26,350.2 1468 | 1986-05-03,349.9 1469 | 1986-05-10,350.1 1470 | 1986-05-17,350.2 1471 | 1986-05-24,350.1 1472 | 1986-05-31,350.1 1473 | 1986-06-07,349.7 1474 | 1986-06-14,349.5 1475 | 1986-06-21,349.4 1476 | 1986-06-28,348.9 1477 | 1986-07-05,348.6 1478 | 1986-07-12,347.7 1479 | 1986-07-19,347.6 1480 | 1986-07-26,347.4 1481 | 1986-08-02,346.6 1482 | 1986-08-09,346.2 1483 | 1986-08-16,345.5 1484 | 1986-08-23,345.6 1485 | 1986-08-30,345.2 1486 | 1986-09-06,345.0 1487 | 1986-09-13,345.3 1488 | 1986-09-20,344.4 1489 | 1986-09-27,344.5 1490 | 1986-10-04,343.9 1491 | 1986-10-11,344.1 1492 | 1986-10-18,343.9 1493 | 1986-10-25,344.5 1494 | 1986-11-01,345.1 1495 | 1986-11-08,345.3 1496 | 1986-11-15,345.6 1497 | 1986-11-22,345.7 1498 | 1986-11-29,346.4 1499 | 1986-12-06,346.9 1500 | 1986-12-13,346.7 1501 | 1986-12-20,346.9 1502 | 1986-12-27,347.0 1503 | 1987-01-03,347.6 1504 | 1987-01-10,348.3 1505 | 1987-01-17,348.2 1506 | 1987-01-24,347.9 1507 | 1987-01-31,348.0 1508 | 1987-02-07,347.9 1509 | 1987-02-14,348.2 1510 | 1987-02-21,348.5 1511 | 1987-02-28,349.4 1512 | 1987-03-07,348.8 1513 | 1987-03-14,349.2 1514 | 1987-03-21,349.7 1515 | 1987-03-28,350.2 1516 | 1987-04-04,350.8 1517 | 1987-04-11,350.2 1518 | 1987-04-18,351.1 1519 | 1987-04-25,351.3 1520 | 1987-05-02,351.4 1521 | 1987-05-09,352.0 1522 | 1987-05-16,351.7 1523 | 1987-05-23,351.9 1524 | 1987-05-30,351.7 1525 | 1987-06-06,351.6 1526 | 1987-06-13,351.1 1527 | 1987-06-20,351.0 1528 | 1987-06-27,350.9 1529 | 1987-07-04,349.7 1530 | 1987-07-11,349.8 1531 | 1987-07-18,348.8 1532 | 1987-07-25,349.5 1533 | 1987-08-01,349.0 1534 | 1987-08-08,348.1 1535 | 1987-08-15,348.6 1536 | 1987-08-22,348.0 1537 | 1987-08-29,346.7 1538 | 1987-09-05,347.0 1539 | 1987-09-12,346.6 1540 | 1987-09-19,346.2 1541 | 1987-09-26,345.8 1542 | 1987-10-03,345.7 1543 | 1987-10-10,346.3 1544 | 1987-10-17,346.5 1545 | 1987-10-24,346.8 1546 | 1987-10-31,346.9 1547 | 1987-11-07,347.3 1548 | 1987-11-14,347.6 1549 | 1987-11-21,348.1 1550 | 1987-11-28,348.7 1551 | 1987-12-05,348.6 1552 | 1987-12-12,348.8 1553 | 1987-12-19,349.1 1554 | 1987-12-26,349.2 1555 | 1988-01-02,349.7 1556 | 1988-01-09,350.2 1557 | 1988-01-16,350.2 1558 | 1988-01-23,350.7 1559 | 1988-01-30,351.2 1560 | 1988-02-06,351.8 1561 | 1988-02-13,351.3 1562 | 1988-02-20,351.5 1563 | 1988-02-27,352.5 1564 | 1988-03-05,352.8 1565 | 1988-03-12,351.8 1566 | 1988-03-19,351.7 1567 | 1988-03-26,352.2 1568 | 1988-04-02,353.1 1569 | 1988-04-09,353.5 1570 | 1988-04-16,353.1 1571 | 1988-04-23,354.0 1572 | 1988-04-30,354.2 1573 | 1988-05-07,353.7 1574 | 1988-05-14,354.3 1575 | 1988-05-21,354.5 1576 | 1988-05-28,354.2 1577 | 1988-06-04,354.1 1578 | 1988-06-11,354.2 1579 | 1988-06-18,353.6 1580 | 1988-06-25,353.1 1581 | 1988-07-02,353.0 1582 | 1988-07-09,352.5 1583 | 1988-07-16,352.6 1584 | 1988-07-23,351.9 1585 | 1988-07-30,351.1 1586 | 1988-08-06,350.9 1587 | 1988-08-13,350.3 1588 | 1988-08-20,350.4 1589 | 1988-08-27,349.6 1590 | 1988-09-03,349.3 1591 | 1988-09-10,348.7 1592 | 1988-09-17,348.9 1593 | 1988-09-24,348.1 1594 | 1988-10-01,348.8 1595 | 1988-10-08,348.8 1596 | 1988-10-15,348.6 1597 | 1988-10-22,349.4 1598 | 1988-10-29,349.2 1599 | 1988-11-05,349.7 1600 | 1988-11-12,349.8 1601 | 1988-11-19,350.1 1602 | 1988-11-26,350.4 1603 | 1988-12-03,350.5 1604 | 1988-12-10,351.0 1605 | 1988-12-17,351.6 1606 | 1988-12-24,351.3 1607 | 1988-12-31,352.4 1608 | 1989-01-07,352.7 1609 | 1989-01-14,352.9 1610 | 1989-01-21,352.5 1611 | 1989-01-28,353.0 1612 | 1989-02-04,352.8 1613 | 1989-02-11,352.6 1614 | 1989-02-18,353.2 1615 | 1989-02-25,353.4 1616 | 1989-03-04,353.1 1617 | 1989-03-11,353.4 1618 | 1989-03-18,353.5 1619 | 1989-03-25,354.4 1620 | 1989-04-01,354.5 1621 | 1989-04-08,355.0 1622 | 1989-04-15,355.4 1623 | 1989-04-22,356.0 1624 | 1989-04-29,355.9 1625 | 1989-05-06,355.3 1626 | 1989-05-13,355.8 1627 | 1989-05-20,355.6 1628 | 1989-05-27,355.7 1629 | 1989-06-03,355.8 1630 | 1989-06-10,355.0 1631 | 1989-06-17,354.8 1632 | 1989-06-24,354.9 1633 | 1989-07-01,354.5 1634 | 1989-07-08,354.7 1635 | 1989-07-15,353.8 1636 | 1989-07-22,353.1 1637 | 1989-07-29,353.2 1638 | 1989-08-05,352.6 1639 | 1989-08-12,352.2 1640 | 1989-08-19,351.1 1641 | 1989-08-26,350.4 1642 | 1989-09-02,350.7 1643 | 1989-09-09,350.2 1644 | 1989-09-16,349.4 1645 | 1989-09-23,349.3 1646 | 1989-09-30,349.7 1647 | 1989-10-07,349.9 1648 | 1989-10-14,349.7 1649 | 1989-10-21,350.2 1650 | 1989-10-28,350.4 1651 | 1989-11-04,350.6 1652 | 1989-11-11,351.2 1653 | 1989-11-18,351.6 1654 | 1989-11-25,351.4 1655 | 1989-12-02,352.0 1656 | 1989-12-09,352.1 1657 | 1989-12-16,352.4 1658 | 1989-12-23,352.5 1659 | 1989-12-30,353.4 1660 | 1990-01-06,353.4 1661 | 1990-01-13,353.5 1662 | 1990-01-20,353.8 1663 | 1990-01-27,353.9 1664 | 1990-02-03,354.1 1665 | 1990-02-10,355.0 1666 | 1990-02-17,354.8 1667 | 1990-02-24,354.7 1668 | 1990-03-03,355.7 1669 | 1990-03-10,354.9 1670 | 1990-03-17,355.8 1671 | 1990-03-24,355.1 1672 | 1990-03-31,355.9 1673 | 1990-04-07,356.1 1674 | 1990-04-14,355.9 1675 | 1990-04-21,356.6 1676 | 1990-04-28,356.1 1677 | 1990-05-05,357.3 1678 | 1990-05-12,357.0 1679 | 1990-05-19,356.9 1680 | 1990-05-26,357.1 1681 | 1990-06-02,357.0 1682 | 1990-06-09,356.6 1683 | 1990-06-16,355.6 1684 | 1990-06-23,355.5 1685 | 1990-06-30,355.7 1686 | 1990-07-07,355.5 1687 | 1990-07-14,354.0 1688 | 1990-07-21,354.5 1689 | 1990-07-28,354.7 1690 | 1990-08-04,353.5 1691 | 1990-08-11,353.2 1692 | 1990-08-18,352.9 1693 | 1990-08-25,352.0 1694 | 1990-09-01,350.9 1695 | 1990-09-08,350.7 1696 | 1990-09-15,351.3 1697 | 1990-09-22,350.9 1698 | 1990-09-29,350.9 1699 | 1990-10-06,351.1 1700 | 1990-10-13,351.0 1701 | 1990-10-20,351.4 1702 | 1990-10-27,351.4 1703 | 1990-11-03,352.1 1704 | 1990-11-10,352.6 1705 | 1990-11-17,353.0 1706 | 1990-11-24,353.1 1707 | 1990-12-01,353.6 1708 | 1990-12-08,354.0 1709 | 1990-12-15,353.8 1710 | 1990-12-22,354.5 1711 | 1990-12-29,354.8 1712 | 1991-01-05,354.2 1713 | 1991-01-12,354.7 1714 | 1991-01-19,354.8 1715 | 1991-01-26,355.0 1716 | 1991-02-02,355.2 1717 | 1991-02-09,355.2 1718 | 1991-02-16,356.4 1719 | 1991-02-23,355.8 1720 | 1991-03-02,356.4 1721 | 1991-03-09,357.2 1722 | 1991-03-16,357.6 1723 | 1991-03-23,356.9 1724 | 1991-03-30,357.9 1725 | 1991-04-06,358.3 1726 | 1991-04-13,357.8 1727 | 1991-04-20,359.1 1728 | 1991-04-27,359.2 1729 | 1991-05-04,359.1 1730 | 1991-05-11,358.9 1731 | 1991-05-18,360.0 1732 | 1991-05-25,359.0 1733 | 1991-06-01,358.5 1734 | 1991-06-08,358.4 1735 | 1991-06-15,358.2 1736 | 1991-06-22,358.1 1737 | 1991-06-29,357.7 1738 | 1991-07-06,357.2 1739 | 1991-07-13,356.5 1740 | 1991-07-20,355.2 1741 | 1991-07-27,355.3 1742 | 1991-08-03,354.8 1743 | 1991-08-10,354.6 1744 | 1991-08-17,353.7 1745 | 1991-08-24,353.0 1746 | 1991-08-31,353.2 1747 | 1991-09-07,353.0 1748 | 1991-09-14,352.1 1749 | 1991-09-21,351.8 1750 | 1991-09-28,351.6 1751 | 1991-10-05,351.7 1752 | 1991-10-12,352.1 1753 | 1991-10-19,352.5 1754 | 1991-10-26,352.7 1755 | 1991-11-02,353.4 1756 | 1991-11-09,353.7 1757 | 1991-11-16,353.5 1758 | 1991-11-23,353.8 1759 | 1991-11-30,354.3 1760 | 1991-12-07,354.5 1761 | 1991-12-14,354.9 1762 | 1991-12-21,355.2 1763 | 1991-12-28,355.5 1764 | 1992-01-04,355.6 1765 | 1992-01-11,356.0 1766 | 1992-01-18,356.1 1767 | 1992-01-25,355.9 1768 | 1992-02-01,356.0 1769 | 1992-02-08,356.7 1770 | 1992-02-15,357.3 1771 | 1992-02-22,356.9 1772 | 1992-02-29,356.5 1773 | 1992-03-07,357.3 1774 | 1992-03-14,357.8 1775 | 1992-03-21,358.1 1776 | 1992-03-28,358.4 1777 | 1992-04-04,358.5 1778 | 1992-04-11,358.9 1779 | 1992-04-18,359.7 1780 | 1992-04-25,359.2 1781 | 1992-05-02,359.6 1782 | 1992-05-09,359.7 1783 | 1992-05-16,358.6 1784 | 1992-05-23,359.6 1785 | 1992-05-30,360.2 1786 | 1992-06-06,360.0 1787 | 1992-06-13,359.4 1788 | 1992-06-20,358.7 1789 | 1992-06-27,358.4 1790 | 1992-07-04,358.4 1791 | 1992-07-11,357.2 1792 | 1992-07-18,356.3 1793 | 1992-07-25,356.1 1794 | 1992-08-01,354.9 1795 | 1992-08-08,355.3 1796 | 1992-08-15,355.3 1797 | 1992-08-22,354.5 1798 | 1992-08-29,354.3 1799 | 1992-09-05,353.5 1800 | 1992-09-12,353.6 1801 | 1992-09-19,352.3 1802 | 1992-09-26,352.7 1803 | 1992-10-03,353.6 1804 | 1992-10-10,353.3 1805 | 1992-10-17,353.2 1806 | 1992-10-24,353.5 1807 | 1992-10-31,353.5 1808 | 1992-11-07,353.9 1809 | 1992-11-14,353.8 1810 | 1992-11-21,354.5 1811 | 1992-11-28,354.6 1812 | 1992-12-05,354.8 1813 | 1992-12-12,355.3 1814 | 1992-12-19,355.4 1815 | 1992-12-26,355.9 1816 | 1993-01-02,356.2 1817 | 1993-01-09,356.9 1818 | 1993-01-16,356.7 1819 | 1993-01-23,356.6 1820 | 1993-01-30,357.0 1821 | 1993-02-06,356.6 1822 | 1993-02-13,357.2 1823 | 1993-02-20,357.3 1824 | 1993-02-27,357.6 1825 | 1993-03-06,358.3 1826 | 1993-03-13,358.5 1827 | 1993-03-20,358.1 1828 | 1993-03-27,358.8 1829 | 1993-04-03,359.1 1830 | 1993-04-10,358.8 1831 | 1993-04-17,359.4 1832 | 1993-04-24,360.0 1833 | 1993-05-01,359.6 1834 | 1993-05-08,359.7 1835 | 1993-05-15,360.7 1836 | 1993-05-22,360.6 1837 | 1993-05-29,360.3 1838 | 1993-06-05,359.7 1839 | 1993-06-12,359.9 1840 | 1993-06-19,359.3 1841 | 1993-06-26,359.1 1842 | 1993-07-03,357.9 1843 | 1993-07-10,358.0 1844 | 1993-07-17,358.1 1845 | 1993-07-24,356.6 1846 | 1993-07-31,356.5 1847 | 1993-08-07,355.8 1848 | 1993-08-14,355.9 1849 | 1993-08-21,354.9 1850 | 1993-08-28,354.7 1851 | 1993-09-04,354.3 1852 | 1993-09-11,353.2 1853 | 1993-09-18,353.8 1854 | 1993-09-25,353.8 1855 | 1993-10-02,353.8 1856 | 1993-10-09,353.8 1857 | 1993-10-16,354.0 1858 | 1993-10-23,354.4 1859 | 1993-10-30,354.3 1860 | 1993-11-06,354.7 1861 | 1993-11-13,355.1 1862 | 1993-11-20,355.6 1863 | 1993-11-27,356.0 1864 | 1993-12-04,356.2 1865 | 1993-12-11,356.5 1866 | 1993-12-18,356.9 1867 | 1993-12-25,357.5 1868 | 1994-01-01,358.1 1869 | 1994-01-08,358.1 1870 | 1994-01-15,358.4 1871 | 1994-01-22,358.3 1872 | 1994-01-29,358.7 1873 | 1994-02-05,358.4 1874 | 1994-02-12,358.6 1875 | 1994-02-19,359.0 1876 | 1994-02-26,359.6 1877 | 1994-03-05,358.7 1878 | 1994-03-12,359.8 1879 | 1994-03-19,360.4 1880 | 1994-03-26,360.8 1881 | 1994-04-02,360.6 1882 | 1994-04-09,361.0 1883 | 1994-04-16,361.0 1884 | 1994-04-23,361.3 1885 | 1994-04-30,362.2 1886 | 1994-05-07,361.6 1887 | 1994-05-14,361.4 1888 | 1994-05-21,361.7 1889 | 1994-05-28,361.9 1890 | 1994-06-04,361.0 1891 | 1994-06-11,361.0 1892 | 1994-06-18,360.9 1893 | 1994-06-25,360.7 1894 | 1994-07-02,360.2 1895 | 1994-07-09,359.9 1896 | 1994-07-16,359.4 1897 | 1994-07-23,359.0 1898 | 1994-07-30,358.8 1899 | 1994-08-06,358.1 1900 | 1994-08-13,357.5 1901 | 1994-08-20,357.6 1902 | 1994-08-27,356.3 1903 | 1994-09-03,356.4 1904 | 1994-09-10,356.4 1905 | 1994-09-17,355.4 1906 | 1994-09-24,355.5 1907 | 1994-10-01,355.4 1908 | 1994-10-08,355.8 1909 | 1994-10-15,356.0 1910 | 1994-10-22,356.3 1911 | 1994-10-29,356.6 1912 | 1994-11-05,356.9 1913 | 1994-11-12,357.4 1914 | 1994-11-19,357.9 1915 | 1994-11-26,358.1 1916 | 1994-12-03,358.4 1917 | 1994-12-10,359.1 1918 | 1994-12-17,359.2 1919 | 1994-12-24,359.1 1920 | 1994-12-31,359.5 1921 | 1995-01-07,359.6 1922 | 1995-01-14,360.2 1923 | 1995-01-21,360.1 1924 | 1995-01-28,360.0 1925 | 1995-02-04,360.6 1926 | 1995-02-11,361.0 1927 | 1995-02-18,360.8 1928 | 1995-02-25,361.3 1929 | 1995-03-04,362.2 1930 | 1995-03-11,361.2 1931 | 1995-03-18,360.9 1932 | 1995-03-25,362.0 1933 | 1995-04-01,363.8 1934 | 1995-04-08,363.4 1935 | 1995-04-15,363.3 1936 | 1995-04-22,362.8 1937 | 1995-04-29,363.5 1938 | 1995-05-06,363.2 1939 | 1995-05-13,364.1 1940 | 1995-05-20,364.1 1941 | 1995-05-27,363.4 1942 | 1995-06-03,363.9 1943 | 1995-06-10,363.4 1944 | 1995-06-17,362.9 1945 | 1995-06-24,362.8 1946 | 1995-07-01,362.5 1947 | 1995-07-08,362.2 1948 | 1995-07-15,361.9 1949 | 1995-07-22,361.5 1950 | 1995-07-29,360.9 1951 | 1995-08-05,360.4 1952 | 1995-08-12,359.2 1953 | 1995-08-19,358.7 1954 | 1995-08-26,359.2 1955 | 1995-09-02,357.3 1956 | 1995-09-09,358.5 1957 | 1995-09-16,358.5 1958 | 1995-09-23,358.2 1959 | 1995-09-30,357.5 1960 | 1995-10-07,357.6 1961 | 1995-10-14,357.6 1962 | 1995-10-21,358.0 1963 | 1995-10-28,358.2 1964 | 1995-11-04,359.1 1965 | 1995-11-11,359.4 1966 | 1995-11-18,359.6 1967 | 1995-11-25,359.8 1968 | 1995-12-02,360.1 1969 | 1995-12-09,360.4 1970 | 1995-12-16,360.5 1971 | 1995-12-23,360.8 1972 | 1995-12-30,361.7 1973 | 1996-01-06,361.8 1974 | 1996-01-13,362.0 1975 | 1996-01-20,362.1 1976 | 1996-01-27,362.2 1977 | 1996-02-03,362.6 1978 | 1996-02-10,363.1 1979 | 1996-02-17,363.0 1980 | 1996-02-24,364.0 1981 | 1996-03-02,363.8 1982 | 1996-03-09,363.6 1983 | 1996-03-16,364.1 1984 | 1996-03-23,364.5 1985 | 1996-03-30,364.3 1986 | 1996-04-06,364.5 1987 | 1996-04-13,364.8 1988 | 1996-04-20,364.4 1989 | 1996-04-27,365.1 1990 | 1996-05-04,364.9 1991 | 1996-05-11,365.3 1992 | 1996-05-18,365.7 1993 | 1996-05-25,365.4 1994 | 1996-06-01,364.8 1995 | 1996-06-08,365.1 1996 | 1996-06-15,365.2 1997 | 1996-06-22,365.0 1998 | 1996-06-29,364.3 1999 | 1996-07-06,364.1 2000 | 1996-07-13,363.7 2001 | 1996-07-20,363.3 2002 | 1996-07-27,362.8 2003 | 1996-08-03,361.7 2004 | 1996-08-10,362.1 2005 | 1996-08-17,361.2 2006 | 1996-08-24,360.8 2007 | 1996-08-31,360.8 2008 | 1996-09-07,359.8 2009 | 1996-09-14,359.8 2010 | 1996-09-21,359.0 2011 | 1996-09-28,359.0 2012 | 1996-10-05,359.4 2013 | 1996-10-12,359.5 2014 | 1996-10-19,359.8 2015 | 1996-10-26,359.8 2016 | 1996-11-02,359.9 2017 | 1996-11-09,360.5 2018 | 1996-11-16,360.7 2019 | 1996-11-23,361.2 2020 | 1996-11-30,361.4 2021 | 1996-12-07,361.9 2022 | 1996-12-14,362.6 2023 | 1996-12-21,362.4 2024 | 1996-12-28,362.6 2025 | 1997-01-04,362.9 2026 | 1997-01-11,363.0 2027 | 1997-01-18,363.1 2028 | 1997-01-25,363.5 2029 | 1997-02-01,363.2 2030 | 1997-02-08,364.1 2031 | 1997-02-15,364.0 2032 | 1997-02-22,364.2 2033 | 1997-03-01,364.5 2034 | 1997-03-08,364.1 2035 | 1997-03-15,364.1 2036 | 1997-03-22,364.7 2037 | 1997-03-29,365.4 2038 | 1997-04-05,365.8 2039 | 1997-04-12,366.2 2040 | 1997-04-19,366.6 2041 | 1997-04-26,366.7 2042 | 1997-05-03,366.7 2043 | 1997-05-10,366.8 2044 | 1997-05-17,367.0 2045 | 1997-05-24,366.6 2046 | 1997-05-31,366.3 2047 | 1997-06-07,365.7 2048 | 1997-06-14,365.6 2049 | 1997-06-21,365.5 2050 | 1997-06-28,365.1 2051 | 1997-07-05,365.0 2052 | 1997-07-12,364.6 2053 | 1997-07-19,364.1 2054 | 1997-07-26,363.8 2055 | 1997-08-02,363.3 2056 | 1997-08-09,363.3 2057 | 1997-08-16,362.6 2058 | 1997-08-23,361.5 2059 | 1997-08-30,361.6 2060 | 1997-09-06,360.6 2061 | 1997-09-13,360.2 2062 | 1997-09-20,360.0 2063 | 1997-09-27,359.8 2064 | 1997-10-04,360.5 2065 | 1997-10-11,360.4 2066 | 1997-10-18,361.0 2067 | 1997-10-25,361.1 2068 | 1997-11-01,361.7 2069 | 1997-11-08,362.1 2070 | 1997-11-15,362.0 2071 | 1997-11-22,362.6 2072 | 1997-11-29,363.5 2073 | 1997-12-06,363.9 2074 | 1997-12-13,363.9 2075 | 1997-12-20,364.2 2076 | 1997-12-27,365.0 2077 | 1998-01-03,365.2 2078 | 1998-01-10,365.3 2079 | 1998-01-17,365.3 2080 | 1998-01-24,365.3 2081 | 1998-01-31,365.6 2082 | 1998-02-07,366.0 2083 | 1998-02-14,365.5 2084 | 1998-02-21,366.0 2085 | 1998-02-28,367.3 2086 | 1998-03-07,367.0 2087 | 1998-03-14,366.6 2088 | 1998-03-21,367.4 2089 | 1998-03-28,368.5 2090 | 1998-04-04,368.6 2091 | 1998-04-11,368.6 2092 | 1998-04-18,368.0 2093 | 1998-04-25,368.9 2094 | 1998-05-02,369.1 2095 | 1998-05-09,368.8 2096 | 1998-05-16,368.5 2097 | 1998-05-23,369.6 2098 | 1998-05-30,369.7 2099 | 1998-06-06,369.4 2100 | 1998-06-13,368.8 2101 | 1998-06-20,368.5 2102 | 1998-06-27,368.3 2103 | 1998-07-04,368.0 2104 | 1998-07-11,367.5 2105 | 1998-07-18,367.6 2106 | 1998-07-25,367.3 2107 | 1998-08-01,366.8 2108 | 1998-08-08,366.4 2109 | 1998-08-15,365.6 2110 | 1998-08-22,365.6 2111 | 1998-08-29,364.2 2112 | 1998-09-05,364.7 2113 | 1998-09-12,363.9 2114 | 1998-09-19,363.5 2115 | 1998-09-26,363.6 2116 | 1998-10-03,364.0 2117 | 1998-10-10,364.1 2118 | 1998-10-17,364.4 2119 | 1998-10-24,364.4 2120 | 1998-10-31,364.7 2121 | 1998-11-07,365.0 2122 | 1998-11-14,365.4 2123 | 1998-11-21,365.8 2124 | 1998-11-28,366.0 2125 | 1998-12-05,366.4 2126 | 1998-12-12,366.7 2127 | 1998-12-19,367.3 2128 | 1998-12-26,367.3 2129 | 1999-01-02,367.5 2130 | 1999-01-09,367.8 2131 | 1999-01-16,367.8 2132 | 1999-01-23,368.3 2133 | 1999-01-30,369.2 2134 | 1999-02-06,369.1 2135 | 1999-02-13,368.8 2136 | 1999-02-20,369.0 2137 | 1999-02-27,368.5 2138 | 1999-03-06,368.1 2139 | 1999-03-13,369.5 2140 | 1999-03-20,370.2 2141 | 1999-03-27,370.6 2142 | 1999-04-03,371.1 2143 | 1999-04-10,371.5 2144 | 1999-04-17,371.0 2145 | 1999-04-24,370.3 2146 | 1999-05-01,370.8 2147 | 1999-05-08,371.3 2148 | 1999-05-15,371.0 2149 | 1999-05-22,370.8 2150 | 1999-05-29,370.3 2151 | 1999-06-05,370.9 2152 | 1999-06-12,370.3 2153 | 1999-06-19,369.9 2154 | 1999-06-26,369.9 2155 | 1999-07-03,369.4 2156 | 1999-07-10,370.1 2157 | 1999-07-17,369.5 2158 | 1999-07-24,368.6 2159 | 1999-07-31,367.4 2160 | 1999-08-07,367.6 2161 | 1999-08-14,366.7 2162 | 1999-08-21,366.4 2163 | 1999-08-28,366.1 2164 | 1999-09-04,364.1 2165 | 1999-09-11,364.7 2166 | 1999-09-18,365.2 2167 | 1999-09-25,364.7 2168 | 1999-10-02,364.5 2169 | 1999-10-09,365.0 2170 | 1999-10-16,364.9 2171 | 1999-10-23,365.6 2172 | 1999-10-30,365.7 2173 | 1999-11-06,366.2 2174 | 1999-11-13,366.7 2175 | 1999-11-20,366.6 2176 | 1999-11-27,367.1 2177 | 1999-12-04,367.4 2178 | 1999-12-11,368.0 2179 | 1999-12-18,368.0 2180 | 1999-12-25,368.2 2181 | 2000-01-01,368.6 2182 | 2000-01-08,368.5 2183 | 2000-01-15,369.0 2184 | 2000-01-22,369.8 2185 | 2000-01-29,369.2 2186 | 2000-02-05,369.1 2187 | 2000-02-12,369.6 2188 | 2000-02-19,369.3 2189 | 2000-02-26,369.5 2190 | 2000-03-04,370.0 2191 | 2000-03-11,370.0 2192 | 2000-03-18,370.9 2193 | 2000-03-25,370.7 2194 | 2000-04-01,370.9 2195 | 2000-04-08,371.7 2196 | 2000-04-15,371.8 2197 | 2000-04-22,372.0 2198 | 2000-04-29,371.3 2199 | 2000-05-06,371.2 2200 | 2000-05-13,371.7 2201 | 2000-05-20,371.9 2202 | 2000-05-27,371.8 2203 | 2000-06-03,371.9 2204 | 2000-06-10,371.6 2205 | 2000-06-17,371.7 2206 | 2000-06-24,371.3 2207 | 2000-07-01,370.8 2208 | 2000-07-08,370.0 2209 | 2000-07-15,370.2 2210 | 2000-07-22,369.7 2211 | 2000-07-29,369.0 2212 | 2000-08-05,368.7 2213 | 2000-08-12,368.3 2214 | 2000-08-19,367.7 2215 | 2000-08-26,367.1 2216 | 2000-09-02,367.2 2217 | 2000-09-09,366.7 2218 | 2000-09-16,366.2 2219 | 2000-09-23,366.2 2220 | 2000-09-30,366.4 2221 | 2000-10-07,366.3 2222 | 2000-10-14,366.6 2223 | 2000-10-21,366.7 2224 | 2000-10-28,367.3 2225 | 2000-11-04,367.6 2226 | 2000-11-11,368.0 2227 | 2000-11-18,368.6 2228 | 2000-11-25,368.3 2229 | 2000-12-02,369.0 2230 | 2000-12-09,369.6 2231 | 2000-12-16,369.3 2232 | 2000-12-23,369.5 2233 | 2000-12-30,369.8 2234 | 2001-01-06,369.8 2235 | 2001-01-13,370.2 2236 | 2001-01-20,369.9 2237 | 2001-01-27,370.8 2238 | 2001-02-03,371.3 2239 | 2001-02-10,371.1 2240 | 2001-02-17,371.7 2241 | 2001-02-24,371.2 2242 | 2001-03-03,372.2 2243 | 2001-03-10,372.2 2244 | 2001-03-17,372.1 2245 | 2001-03-24,371.8 2246 | 2001-03-31,372.0 2247 | 2001-04-07,372.7 2248 | 2001-04-14,372.7 2249 | 2001-04-21,373.0 2250 | 2001-04-28,372.7 2251 | 2001-05-05,373.7 2252 | 2001-05-12,373.9 2253 | 2001-05-19,373.7 2254 | 2001-05-26,373.9 2255 | 2001-06-02,373.8 2256 | 2001-06-09,373.1 2257 | 2001-06-16,372.8 2258 | 2001-06-23,372.9 2259 | 2001-06-30,372.7 2260 | 2001-07-07,372.1 2261 | 2001-07-14,371.3 2262 | 2001-07-21,371.2 2263 | 2001-07-28,370.6 2264 | 2001-08-04,369.9 2265 | 2001-08-11,369.5 2266 | 2001-08-18,369.3 2267 | 2001-08-25,369.0 2268 | 2001-09-01,368.4 2269 | 2001-09-08,368.2 2270 | 2001-09-15,368.0 2271 | 2001-09-22,367.4 2272 | 2001-09-29,367.4 2273 | 2001-10-06,367.8 2274 | 2001-10-13,367.6 2275 | 2001-10-20,368.1 2276 | 2001-10-27,368.7 2277 | 2001-11-03,368.7 2278 | 2001-11-10,368.8 2279 | 2001-11-17,369.7 2280 | 2001-11-24,370.3 2281 | 2001-12-01,370.3 2282 | 2001-12-08,370.8 2283 | 2001-12-15,371.2 2284 | 2001-12-22,371.3 2285 | 2001-12-29,371.5 2286 | --------------------------------------------------------------------------------