diff --git a/00_Introduction.ipynb b/00_Introduction.ipynb index 2fd6442..7393a3b 100644 --- a/00_Introduction.ipynb +++ b/00_Introduction.ipynb @@ -1,6 +1,51 @@ { - "cells": [], - "metadata": {}, + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Computation for Environmental Scientists\n", + "====================\n", + "\n", + "Introduction\n", + "-------------\n", + "\n", + "Reasons to take a computational approach:\n", + "1. You can analyze a lot of data quickly. This is useful for large sets of data - long data sets comprising the same measurement for lots of samples, or \"wide\" data sets with lots of different pieces of information about for each sample. \"Big Data\" involves data sets that are often both long and wide, and typically requires a computational approach to analyze. Computational approaches also allow you to try out lots of different analyses on the same dataset with relatively little effort. \n", + "3. You can visualize data in many different ways, from simple to sophisticated, and can customize graphics to fit your needs. You can typically make publication-quality visualizations directly within the programming environment. Even more importantly, you can make interactive graphics ready for distribution on the Web, or reponsive visualizations that change with data feeds in real time. \n", + "4. You can share data and code so that others can reproduce and verify your analyses. Not only is this helpful in teaching and learning, but it is the foundation of the open data and reproducible science movements.\n", + "5. You can build models of real-world phenomena based on simple ideas. If those models aren't useful, you can change them without much effort.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.3" + } + }, "nbformat": 4, "nbformat_minor": 2 } diff --git a/02_Working_with_Data.ipynb b/02_Working_with_Data.ipynb index ee90808..f6a1eb6 100644 --- a/02_Working_with_Data.ipynb +++ b/02_Working_with_Data.ipynb @@ -34,20 +34,11 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n", - "cat\n", - "-4\n", - "My List: [1, 2, -3, 'dog']\n" - ] - } - ], + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], "source": [ "a = 1\n", "b = 0\n", @@ -68,7 +59,938 @@ { "cell_type": "markdown", "metadata": {}, + "source": [ + "Packages\n", + "---------\n", + "We often want to do things with data that are difficult or complicated to do with standard Python. Other clever programmers have often accomplished these tasks, and made the tools to do them available as _packages_. Packages are somewhat like plug-ins in, say, MS Word: they are extra features that you install after you've set up the main application. \n", + "\n", + "There are two steps to using a Python package. First, you need to download the package and put it in the right place on your computer. There are two ways to install packages, both from the command line. Suppose you wanted to install the [_Pandas_](https://pandas.pydata.org/) data analysis and management package. (Note that this was likely installed already when you first set up Anaconda.) It's better to use Anaconda's installer, `conda`. To do that, type:\n", + "```bash\n", + "% conda install pandas\n", + "```\n", + "Alternatively, you could use the `pip` installer:\n", + "```bash\n", + "% pip install pandas\n", + "```\n", + "This might put packages in a different location on your comupter than `conda` does, so it's better to use `conda` when you can.\n", + "\n", + "The second step is to tell the Python interpreter to use the package. We do this in the next block of code using the `import` command.\n", + "\n", + "#### Now Try This\n", + "1. Run the next block of code. Make sure there are no error messages.\n", + "2. Every command from the Pandas package now starts with the prefix \"pd.\" So `pd.DataFrame` refers to the `DataFrame` command in Pandas.\n", + "3. You'll also want to use the [_NumPy_](http://www.numpy.org/) scientific computing package. Add a line to the code block below to import `numpy` as `np`." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "INSTALLED VERSIONS\n", + "------------------\n", + "commit: None\n", + "python: 3.6.3.final.0\n", + "python-bits: 64\n", + "OS: Windows\n", + "OS-release: 10\n", + "machine: AMD64\n", + "processor: Intel64 Family 6 Model 61 Stepping 4, GenuineIntel\n", + "byteorder: little\n", + "LC_ALL: None\n", + "LANG: None\n", + "LOCALE: None.None\n", + "\n", + "pandas: 0.22.0\n", + "pytest: 3.2.1\n", + "pip: 9.0.1\n", + "setuptools: 38.4.0\n", + "Cython: 0.26.1\n", + "numpy: 1.13.3\n", + "scipy: 1.0.0\n", + "pyarrow: None\n", + "xarray: None\n", + "IPython: 6.1.0\n", + "sphinx: 1.6.3\n", + "patsy: 0.4.1\n", + "dateutil: 2.6.1\n", + "pytz: 2018.3\n", + "blosc: None\n", + "bottleneck: 1.2.1\n", + "tables: 3.4.2\n", + "numexpr: 2.6.2\n", + "feather: None\n", + "matplotlib: 2.1.2\n", + "openpyxl: 2.4.8\n", + "xlrd: 1.1.0\n", + "xlwt: 1.3.0\n", + "xlsxwriter: 1.0.2\n", + "lxml: 4.1.0\n", + "bs4: 4.6.0\n", + "html5lib: 0.999999999\n", + "sqlalchemy: 1.1.13\n", + "pymysql: None\n", + "psycopg2: None\n", + "jinja2: 2.9.6\n", + "s3fs: None\n", + "fastparquet: None\n", + "pandas_gbq: None\n", + "pandas_datareader: None\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "pd.show_versions()\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "NumPy Arrays\n", + "-------------\n", + "NumPy is an improvement over many of the mathematical and data-processing tools available in standard Python. One of the main improvements is in NumPy's ability to handle _arrays_ quickly and easily. Arrays, like lists, are sequences. Unlike lists, each array only holds one data type, usually numbers. Arrays can be multi-dimensional, meaning that they can hold 2-D grids of numbers, 3-D blocks, or even more complex structures with multiple dimensions if you need them. The command `np.array()` converts a list to an array.\n", + "\n", + "#### Now Try This\n", + "1. Run the code block below. How do you know that B is an array of decimal numbers, whereas A contains integers? What happens when one element of an array is a decimal number?\n", + "2. What happens when you add A and B? What happens when you multiply A and B?\n", + "\n", + "\n", + "You can access a particular element of a list or an array using _indexing_. In indexing, you tell Python which item in a list or an array you want to print, change, or otherwise use. To access the first element of array A, you would type `A[0]`, because the numbering of elements starts at 0. So `A` has items numbered from 0 to 2. In multidimensional arrays, you specify elements using two or more \"coordinates\": for example `B[1,1]`.\n", + "\n", + "#### Now Try This\n", + "1. What do you guess element [2,1] of array B will be? Print out element [2,1] of array B.\n", + "2. What error message do you see when you ask Python for A[3]?\n", + "3. You can access part of an array by *slicing*, or designating a range of elements. For example, A[0:2] will give an array with the first two elements of A (A[0] and A[1], where the elements are *below 2*). How would you access the bottom right 2x2 grid from array B? \n", + "\n", + "Array Attributes\n", + "-----------------\n", + "\n", + "In addition to their contents, arrays have a set of useful _attributes_, pieces of information about them that you might want to know. Attributes are accessed by a dot and the name of the attribute. Here's a list of some of the useful attributes [here](https://docs.scipy.org/doc/numpy-dev/user/quickstart.html). \n", + "\n", + "#### Now Try This\n", + "1. Find the `shape` (number of rows and columns), `size` (number of elements), and `dtype` (data type) of both arrays B and A. For example, for the shape, type 'A.shape()'. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1 2 3]\n", + "[[ 1. 2. 3.]\n", + " [ 4. 5. 6.]\n", + " [ 7. 8. 9.]]\n" + ] + } + ], + "source": [ + "A = np.array([1, 2, 3])\n", + "print (A)\n", + "\n", + "B = np.array([[1, 2, 3],[4, 5, 6],[7,8,9.0]])\n", + "print (B)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Pandas Data Frames\n", + "-------------------\n", + "Pandas is a step above Numpy when it comes to analyzing large datasets with multiple columns of different kinds of information. This is great for Excel files with sample IDs, measurements, times, dates, etc. Data frames are kind of like data tables in publications. Each column has one kind of data in it.\n", + "\n", + "To create a data frame from an array, you just use the `pd.DataFrame()` command:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 0 1 2\n", + "0 1.0 2.0 3.0\n", + "1 4.0 5.0 6.0\n", + "2 7.0 8.0 9.0\n" + ] + } + ], + "source": [ + "df_B=pd.DataFrame(B)\n", + "print(df_B)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It's more helpful if the columns in your data frame have meaningful names. Let's name them using the `columns` attribute:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " first second third\n", + "0 1.0 2.0 3.0\n", + "1 4.0 5.0 6.0\n", + "2 7.0 8.0 9.0\n" + ] + } + ], + "source": [ + "df_B.columns=['first','second','third']\n", + "print(df_B)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To access a column, you specify its name in the same way you specify an element in an array: using the `[]` brackets." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 3.0\n", + "1 6.0\n", + "2 9.0\n", + "Name: third, dtype: float64\n" + ] + } + ], + "source": [ + "print(df_B['third'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Technically, each column is called a pandas `Series`. We'll just call them columns.\n", + "\n", + "If you want to access a particular element in a data frame, use `.loc[]` or `.iloc[]` as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5.0\n" + ] + } + ], + "source": [ + "print(df_B.loc[1,'second'])" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.0\n" + ] + } + ], + "source": [ + "print(df_B.iloc[0,2])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What's the difference? The `.loc[]` attribute lets you use the names of rows and columns, whereas `.iloc[]` uses indexes (like Numpy does with arrays).\n", + "\n", + "You can use slices with `.loc[]` and `.iloc[]` as well. Note that they work differently with the two attributes!" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 6.0\n", + "2 9.0\n", + "Name: third, dtype: float64\n" + ] + } + ], + "source": [ + "print(df_B.iloc[1:3,2])" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " first second\n", + "0 1.0 2.0\n", + "1 4.0 5.0\n" + ] + } + ], + "source": [ + "print(df_B.loc[0:1,'first':'second'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Reading Data Files in Pandas\n", + "------------------------------\n", + "One of the great things about pandas is its ability to read files and manipulate them as data frames. This allows you to do the kinds of tasks you do in Excel, but faster. Let's read the Lake Elgygytgyn data file into memory as a data frame. We do this using the `read_csv()` command. This command takes several *parameters* - aspects of the command you need to specify (designated in parentheses):\n", + "1. The file name (`'elgygytgyn2013_reconstruction.csv'`). This is the first parameter you specify.\n", + "2. The number of rows to skip. This is a *named* parameter: you need to specify \"`skiprows=`\" to tell pandas to skip this many lines at the beginning of the file. Other useful named parameters include `sep` (column separator; useful if you have something other than commas between the columns in a file), `comment` (set this if you want to skip lines starting with a certain character) and `skipfooter` (skip this many lines at the end)." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Age [ka BP] Mean Temperature, warmest month [deg C] \\\n", + "0 2150.300 5.640586 \n", + "1 2152.460 9.207488 \n", + "2 2155.000 10.511760 \n", + "3 2156.820 7.843209 \n", + "4 2157.310 10.720896 \n", + "5 2159.330 11.119363 \n", + "6 2160.320 10.217688 \n", + "7 2162.620 11.517836 \n", + "8 2165.180 11.804156 \n", + "9 2167.740 12.404994 \n", + "10 2169.170 12.837006 \n", + "11 2175.220 12.327336 \n", + "12 2177.140 12.168423 \n", + "13 2179.050 12.470264 \n", + "14 2182.240 12.741446 \n", + "15 2183.930 12.650268 \n", + "16 2185.620 12.806875 \n", + "17 2187.310 12.816709 \n", + "18 2189.080 12.270645 \n", + "19 2192.000 12.218701 \n", + "20 2193.020 11.717243 \n", + "21 2196.910 9.050066 \n", + "22 2199.190 11.477641 \n", + "23 2201.020 10.536647 \n", + "24 2202.680 11.665339 \n", + "25 2205.345 12.038355 \n", + "26 2207.120 12.039148 \n", + "27 2209.780 12.676553 \n", + "28 2211.550 12.504494 \n", + "29 2213.350 11.888255 \n", + ".. ... ... \n", + "347 3404.410 16.737540 \n", + "348 3405.480 16.454261 \n", + "349 3411.530 16.697976 \n", + "350 3416.000 16.614803 \n", + "351 3417.840 16.581522 \n", + "352 3420.630 12.914661 \n", + "353 3425.150 13.851219 \n", + "354 3428.350 13.195106 \n", + "355 3430.800 15.133177 \n", + "356 3437.400 15.891887 \n", + "357 3445.210 12.531218 \n", + "358 3454.770 15.473760 \n", + "359 3463.210 13.016791 \n", + "360 3467.770 9.920290 \n", + "361 3472.440 13.216081 \n", + "362 3478.340 15.678593 \n", + "363 3483.330 13.282589 \n", + "364 3484.570 15.684615 \n", + "365 3492.430 16.122378 \n", + "366 3496.790 15.430420 \n", + "367 3508.040 15.753448 \n", + "368 3510.780 15.428219 \n", + "369 3515.710 16.439388 \n", + "370 3518.430 15.251257 \n", + "371 3523.360 13.011299 \n", + "372 3526.400 15.322983 \n", + "373 3535.550 16.300991 \n", + "374 3541.450 15.169896 \n", + "375 3552.770 12.049301 \n", + "376 3561.480 15.689877 \n", + "\n", + " Minimum Mean Temperature, warmest month [deg C] \\\n", + "0 2.678636 \n", + "1 1.885963 \n", + "2 7.962232 \n", + "3 1.301907 \n", + "4 8.203799 \n", + "5 8.736924 \n", + "6 6.723368 \n", + "7 8.404997 \n", + "8 9.372140 \n", + "9 9.817912 \n", + "10 10.706406 \n", + "11 9.330589 \n", + "12 9.975091 \n", + "13 9.930171 \n", + "14 10.878933 \n", + "15 10.265249 \n", + "16 11.202442 \n", + "17 10.974084 \n", + "18 10.828023 \n", + "19 11.582788 \n", + "20 11.421192 \n", + "21 2.329098 \n", + "22 7.385733 \n", + "23 7.539287 \n", + "24 10.799299 \n", + "25 11.418984 \n", + "26 10.618542 \n", + "27 11.685299 \n", + "28 10.517353 \n", + "29 10.092746 \n", + ".. ... \n", + "347 15.358932 \n", + "348 15.140938 \n", + "349 15.573217 \n", + "350 15.260324 \n", + "351 15.261901 \n", + "352 10.818804 \n", + "353 10.164776 \n", + "354 9.814812 \n", + "355 12.069606 \n", + "356 14.034197 \n", + "357 5.500000 \n", + "358 12.778169 \n", + "359 10.213754 \n", + "360 7.740428 \n", + "361 10.640471 \n", + "362 8.698485 \n", + "363 10.630669 \n", + "364 15.505810 \n", + "365 15.734821 \n", + "366 12.754212 \n", + "367 15.578930 \n", + "368 12.607821 \n", + "369 15.262727 \n", + "370 11.500000 \n", + "371 10.300000 \n", + "372 12.162873 \n", + "373 13.919873 \n", + "374 12.708565 \n", + "375 10.300000 \n", + "376 10.969776 \n", + "\n", + " Maximum Mean Temperature, warmest month [deg C] \\\n", + "0 12.178636 \n", + "1 14.785963 \n", + "2 15.062232 \n", + "3 14.201907 \n", + "4 14.503799 \n", + "5 12.136924 \n", + "6 13.823368 \n", + "7 14.704997 \n", + "8 13.472140 \n", + "9 16.017912 \n", + "10 14.806406 \n", + "11 16.130589 \n", + "12 13.375091 \n", + "13 13.330171 \n", + "14 16.778933 \n", + "15 17.065249 \n", + "16 16.802442 \n", + "17 17.074084 \n", + "18 13.328023 \n", + "19 14.082788 \n", + "20 12.221192 \n", + "21 15.229098 \n", + "22 13.685733 \n", + "23 14.639287 \n", + "24 13.999299 \n", + "25 14.618984 \n", + "26 14.018542 \n", + "27 13.385299 \n", + "28 13.917353 \n", + "29 13.892746 \n", + ".. ... \n", + "347 17.858932 \n", + "348 17.640938 \n", + "349 17.373217 \n", + "350 17.560324 \n", + "351 17.561901 \n", + "352 15.618804 \n", + "353 16.664776 \n", + "354 15.614812 \n", + "355 16.569606 \n", + "356 16.134197 \n", + "357 16.800000 \n", + "358 16.578169 \n", + "359 15.513754 \n", + "360 14.640428 \n", + "361 16.440471 \n", + "362 18.198485 \n", + "363 16.530669 \n", + "364 15.705810 \n", + "365 17.734821 \n", + "366 17.954212 \n", + "367 15.778930 \n", + "368 17.807821 \n", + "369 17.562727 \n", + "370 15.800000 \n", + "371 15.400000 \n", + "372 17.362873 \n", + "373 17.519873 \n", + "374 17.508565 \n", + "375 15.100000 \n", + "376 17.669776 \n", + "\n", + " Precipitation, annual mean [mm] Minimum Precipitation, annual mean [mm] \\\n", + "0 238.477111 150.609472 \n", + "1 262.107504 156.246880 \n", + "2 260.865459 208.977058 \n", + "3 260.351720 180.263587 \n", + "4 259.293757 210.501706 \n", + "5 269.803083 226.075946 \n", + "6 260.734227 219.461385 \n", + "7 277.003559 224.170555 \n", + "8 270.993506 230.852064 \n", + "9 259.030959 190.876054 \n", + "10 251.668945 229.521375 \n", + "11 275.362289 208.297980 \n", + "12 269.767584 200.343232 \n", + "13 283.300683 201.359029 \n", + "14 292.786410 199.800605 \n", + "15 288.392084 226.115184 \n", + "16 288.284782 205.534841 \n", + "17 291.521727 192.049625 \n", + "18 284.374415 235.441259 \n", + "19 286.736846 246.381958 \n", + "20 285.581447 256.880359 \n", + "21 243.930166 156.628958 \n", + "22 252.852330 220.528538 \n", + "23 281.811852 219.834566 \n", + "24 266.795139 221.080770 \n", + "25 278.660801 217.206103 \n", + "26 284.655727 227.418374 \n", + "27 283.345848 193.436237 \n", + "28 271.756416 198.591867 \n", + "29 278.496421 240.056330 \n", + ".. ... ... \n", + "347 674.827273 581.037697 \n", + "348 671.563817 585.396889 \n", + "349 659.737168 609.408848 \n", + "350 666.845675 602.858346 \n", + "351 700.696439 616.047690 \n", + "352 344.469443 238.239392 \n", + "353 421.733203 165.352977 \n", + "354 427.558867 228.287773 \n", + "355 600.254271 432.297915 \n", + "356 649.420450 421.842493 \n", + "357 556.350876 327.927000 \n", + "358 617.493121 449.358219 \n", + "359 467.579815 248.419357 \n", + "360 338.312292 171.152123 \n", + "361 331.165239 183.945322 \n", + "362 601.282518 331.048270 \n", + "363 391.305892 254.296385 \n", + "364 677.093946 667.058109 \n", + "365 662.049581 592.320535 \n", + "366 592.199596 312.782961 \n", + "367 666.472788 656.798532 \n", + "368 597.415749 462.727236 \n", + "369 638.395850 582.907484 \n", + "370 620.830728 290.686000 \n", + "371 317.766176 212.119000 \n", + "372 621.771942 497.668850 \n", + "373 630.333045 362.692443 \n", + "374 516.306328 197.615571 \n", + "375 372.617990 212.119000 \n", + "376 649.845366 327.349627 \n", + "\n", + " Maximum Precipitation, annual mean [mm] Trees & Shrubs [%] Picea [%] \n", + "0 347.795471 8.058608 0.000000 \n", + "1 353.432880 20.425532 0.000000 \n", + "2 320.479059 23.484848 0.000000 \n", + "3 329.738587 24.045802 0.000000 \n", + "4 309.687706 43.231441 0.000000 \n", + "5 313.259946 54.183267 0.000000 \n", + "6 293.722385 31.418919 0.000000 \n", + "7 323.356555 54.618474 0.000000 \n", + "8 323.018064 64.960630 0.787402 \n", + "9 460.749054 82.175227 4.229607 \n", + "10 269.965375 80.851064 0.000000 \n", + "11 342.887980 87.632509 0.000000 \n", + "12 317.201232 80.633803 0.000000 \n", + "13 332.812029 85.551331 0.380228 \n", + "14 319.795605 87.500000 0.000000 \n", + "15 320.261184 85.833333 0.416667 \n", + "16 322.392841 85.815603 0.000000 \n", + "17 320.407625 91.266376 0.000000 \n", + "18 305.990259 81.218274 0.000000 \n", + "19 316.930958 82.061069 0.000000 \n", + "20 327.429360 67.399267 0.000000 \n", + "21 316.573958 26.943005 0.000000 \n", + "22 312.694538 41.365462 0.000000 \n", + "23 331.336566 40.000000 0.000000 \n", + "24 295.341770 57.142857 0.000000 \n", + "25 328.452103 71.008403 0.000000 \n", + "26 318.427374 81.632653 0.000000 \n", + "27 324.889237 86.554622 0.000000 \n", + "28 330.044867 86.666667 0.350877 \n", + "29 331.065330 77.573529 0.000000 \n", + ".. ... ... ... \n", + "347 793.484697 90.612245 19.591837 \n", + "348 780.339889 94.964029 25.539568 \n", + "349 804.351848 95.275591 14.566929 \n", + "350 797.801346 95.261845 22.693267 \n", + "351 810.486690 83.653846 16.346154 \n", + "352 718.180392 67.222222 2.777778 \n", + "353 734.509977 72.180451 6.766917 \n", + "354 708.228773 71.428571 6.122449 \n", + "355 710.895915 75.418994 11.173184 \n", + "356 684.296493 83.766234 13.636364 \n", + "357 781.276000 69.642857 16.071429 \n", + "358 673.924219 95.454545 47.933884 \n", + "359 740.190357 75.000000 20.312500 \n", + "360 639.532123 64.673913 5.434783 \n", + "361 663.886322 76.884422 5.527638 \n", + "362 784.397270 90.322581 35.483871 \n", + "363 734.237385 84.883721 9.302326 \n", + "364 682.441109 93.562232 20.600858 \n", + "365 677.437535 88.127854 25.570776 \n", + "366 737.903961 93.527508 38.511327 \n", + "367 672.181532 93.721973 20.179372 \n", + "368 698.817236 92.086331 34.532374 \n", + "369 700.553483 93.277311 24.369748 \n", + "370 671.954000 87.203791 15.639810 \n", + "371 638.561000 89.552239 11.044776 \n", + "372 743.901850 83.471074 41.735537 \n", + "373 771.021443 93.506494 10.389610 \n", + "374 649.443571 84.905660 28.301887 \n", + "375 692.060000 77.272727 4.545455 \n", + "376 788.435627 75.862069 17.241379 \n", + "\n", + "[377 rows x 9 columns]\n" + ] + } + ], + "source": [ + "elgy=pd.read_csv('elgygytgyn2013_reconstruction.csv',skiprows=12)\n", + "print(elgy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "...that's a big file. We can just see the first few lines of the data frame using `.head()`:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Age [ka BP] Mean Temperature, warmest month [deg C] \\\n", + "0 2150.30 5.640586 \n", + "1 2152.46 9.207488 \n", + "2 2155.00 10.511760 \n", + "3 2156.82 7.843209 \n", + "4 2157.31 10.720896 \n", + "\n", + " Minimum Mean Temperature, warmest month [deg C] \\\n", + "0 2.678636 \n", + "1 1.885963 \n", + "2 7.962232 \n", + "3 1.301907 \n", + "4 8.203799 \n", + "\n", + " Maximum Mean Temperature, warmest month [deg C] \\\n", + "0 12.178636 \n", + "1 14.785963 \n", + "2 15.062232 \n", + "3 14.201907 \n", + "4 14.503799 \n", + "\n", + " Precipitation, annual mean [mm] Minimum Precipitation, annual mean [mm] \\\n", + "0 238.477111 150.609472 \n", + "1 262.107504 156.246880 \n", + "2 260.865459 208.977058 \n", + "3 260.351720 180.263587 \n", + "4 259.293757 210.501706 \n", + "\n", + " Maximum Precipitation, annual mean [mm] Trees & Shrubs [%] Picea [%] \n", + "0 347.795471 8.058608 0.0 \n", + "1 353.432880 20.425532 0.0 \n", + "2 320.479059 23.484848 0.0 \n", + "3 329.738587 24.045802 0.0 \n", + "4 309.687706 43.231441 0.0 \n" + ] + } + ], + "source": [ + "print(elgy.head())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's say we wanted to know the range in precipitation between the minimum and maximum, year by year. All you have to do is:" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 197.186\n", + "1 197.186\n", + "2 111.502\n", + "3 149.475\n", + "4 99.186\n", + "5 87.184\n", + "6 74.261\n", + "7 99.186\n", + "8 92.166\n", + "9 269.873\n", + "10 40.444\n", + "11 134.590\n", + "12 116.858\n", + "13 131.453\n", + "14 119.995\n", + "15 94.146\n", + "16 116.858\n", + "17 128.358\n", + "18 70.549\n", + "19 70.549\n", + "20 70.549\n", + "21 159.945\n", + "22 92.166\n", + "23 111.502\n", + "24 74.261\n", + "25 111.246\n", + "26 91.009\n", + "27 131.453\n", + "28 131.453\n", + "29 91.009\n", + " ... \n", + "347 212.447\n", + "348 194.943\n", + "349 194.943\n", + "350 194.943\n", + "351 194.439\n", + "352 479.941\n", + "353 569.157\n", + "354 479.941\n", + "355 278.598\n", + "356 262.454\n", + "357 453.349\n", + "358 224.566\n", + "359 491.771\n", + "360 468.380\n", + "361 479.941\n", + "362 453.349\n", + "363 479.941\n", + "364 15.383\n", + "365 85.117\n", + "366 425.121\n", + "367 15.383\n", + "368 236.090\n", + "369 117.646\n", + "370 381.268\n", + "371 426.442\n", + "372 246.233\n", + "373 408.329\n", + "374 451.828\n", + "375 479.941\n", + "376 461.086\n", + "Length: 377, dtype: float64" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "elgy['Maximum Precipitation, annual mean [mm]']-elgy['Minimum Precipitation, annual mean [mm]']" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 197.186\n", + "1 197.186\n", + "2 111.502\n", + "3 149.475\n", + "4 99.186\n", + "Name: Precipitation Range (mm), dtype: float64\n" + ] + } + ], + "source": [ + "elgy['Precipitation Range (mm)']=elgy['Maximum Precipitation, annual mean [mm]']-elgy['Minimum Precipitation, annual mean [mm]']\n", + "print(elgy['Precipitation Range (mm)'].head())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "...and if we wanted the average, standard deviation, min, and max of all the precipitation ranges?" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average: 205.96519628647218\n", + "Std Dev: 166.0245460289239\n", + "Min: 15.383\n", + "Max: 582.756\n" + ] + } + ], + "source": [ + "print('Average: ',elgy['Precipitation Range (mm)'].mean())\n", + "print('Std Dev: ',elgy['Precipitation Range (mm)'].std())\n", + "print('Min: ',elgy['Precipitation Range (mm)'].min())\n", + "print('Max: ',elgy['Precipitation Range (mm)'].max())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What if we wanted the average amount of tree and shrub pollen in this reconstruction, starting 2.5 million years ago? We'd have to find the slice of the data frame where `Age [ka BP]` is less than 2500:" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "56.8791720872578\n" + ] + } + ], + "source": [ + "print(elgy.loc[elgy['Age [ka BP]']<2500.,'Trees & Shrubs [%]'].mean())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can make our request even more ridiculous. What if we wanted to average only the years when the warmest month was over 10$^\\circ$ C?" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "62.35154920481818\n" + ] + } + ], + "source": [ + "print(elgy.loc[(elgy['Age [ka BP]']<2500.)&(elgy['Mean Temperature, warmest month [deg C]']>10.),'Trees & Shrubs [%]'].mean())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Now Try This\n", + "1. Find the average tree/shrub pollen content between 2.5 and 3.0 million years ago.\n", + "2. What's *Picea* (look it up)? What are the maximum and minimum values in that column?\n", + "3. What years have had over 1% *Picea* content?\n", + "4. When did *Picea* reach its maximum?" + ] } ], "metadata": { diff --git a/04_Excel_Workbooks.ipynb b/04_Excel_Workbooks.ipynb new file mode 100644 index 0000000..a004ad3 --- /dev/null +++ b/04_Excel_Workbooks.ipynb @@ -0,0 +1,472 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lesson 03: Working with Excel Files\n", + "==================\n", + "\n", + "In this lesson, we will explore ways to import, process, and visualize data from an Excel file of the type that you get from the Bartington susceptometer.\n", + "\n", + "Goals of this Notebook\n", + "-----------------------\n", + "1. Read and access data from multi-page Excel workbooks using Python, Numpy, and Pandas\n", + "2. Clean and pre-process common data types for more advanced use\n", + "3. Use regular expressions\n", + "4. Join fields from different data frames\n", + "5. Process magnetic susceptibility data measured using the UW Tacoma environmental geophysics lab's standard protocol\n", + "6. Understand the value of a consistent, machine-readable format for data in Excel\n", + "\n", + "Packages\n", + "--------\n", + "\n", + "For this tutorial, we'll be using the `numpy` package for math, the `pandas` package for data storage and manipulation, and the `matplotlib` and `seaborn` packages for making graphs. Here we load the required packages and set matplotlib up so that it makes nice figures that you can save in the `.png` format. You can change this so matplotlib saves in the `.svg` format if you'd like to edit your figures in Illustrator or Inkscape. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import matplotlib\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import pandas as pd\n", + "\n", + "%matplotlib inline\n", + "%config InlineBackend.figure_format = 'png' " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Reading Excel Files\n", + "--------------------\n", + "Excel workbooks often have multiple tabs. Our soils data has tabs for the mass measurements as well as for each set of measurements from the Bartington susceptometer. Let's read in the mass data from the sheet called *Sample info*, and store it as a pandas data frame. This only works if the first row of the sheet has titles that apply to each column. That is, if everything in the first column is the cube number, everything in the second column is the sample's ID, etc. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Cube # Sample ID Mass (g) Mass (g) Trial 2 average mass\n", + "0 1 AGW105R-17 14.8752 14.8735 14.87435\n", + "1 2 AGW105R-28.5 14.9195 14.9170 14.91825\n", + "2 3 AGW105R-37.5 14.3339 14.3325 14.33320\n", + "3 4 AGW105R-47 11.6211 11.6182 11.61965\n", + "4 5 AGW278-23 15.2508 15.2486 15.24970\n", + "5 6 AGW278-36 16.3975 16.3918 16.39465\n", + "6 7 AGW278-55 14.9451 14.9411 14.94310\n", + "7 8 AGW278-72 16.8415 16.8406 16.84105\n", + "8 9 AGW278-84 15.1586 15.1567 15.15765\n", + "9 10 AGW278-108 18.3291 18.3259 18.32750\n", + "10 11 AGW279-12 15.4179 15.4163 15.41710\n", + "11 12 AGW279-17 17.4440 17.4385 17.44125\n", + "12 13 AGW279-20 15.5385 15.5350 15.53675\n", + "13 14 AGW280-23 15.4667 15.4644 15.46555\n", + "14 NaN NaN NaN NaN NaN\n", + "15 x standard 18.5584 NaN NaN\n" + ] + } + ], + "source": [ + "mass=pd.read_excel(\"Landau Associates Soil Jan 2018.xlsx\",sheet_name=\"Sample info\")\n", + "print (mass)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that there are a couple of problems here. First of all, row 14 of the table (row 16 of the spreadsheet) is blank, resulting in a row of `NaN` (\"Not a number\") values. Second, notice that the standard's mass was only measured once, so there is no average mass. That's going to be a problem if we use the average mass column for sample mass in our calculations!\n", + "\n", + "We need a way to fix those problems. These fixes go under the category of \"data cleaning,\" a necessary but not very fun step of data analysis. First, we need to get rid of the blank row. We'll do that with the pandas drop *method*. A method is like an \"action\" that a pandas variable can do. The drop method takes two parameters: \n", + "1. The *index* of the line you need to drop. Here, we use the index *attribute* of mass. An attribute is what it sounds like - a characteristic of that variable. Just using `mass.index` would give you the indices (row numbers) of each row. We want row 14, so we take the 14th index.\n", + "2. The `inplace=True` parameter. This tells Python to remove the 14th row from `mass` itself, not from a copy of `mass`. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "mass.drop(14,inplace=True)\n", + "print(mass)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that row 14 is now missing. Good. Let's take care of the problem with the average mass of the standard. We want to set the average mass equal to the first measurement of the standard's mass. While we're at it, let's rename the standard to *cal_std* because that's the name we use everywhere else." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Cube # Sample ID Mass (g) Mass (g) Trial 2 average mass\n", + "0 1 AGW105R-17 14.8752 14.8735 14.87435\n", + "1 2 AGW105R-28.5 14.9195 14.9170 14.91825\n", + "2 3 AGW105R-37.5 14.3339 14.3325 14.33320\n", + "3 4 AGW105R-47 11.6211 11.6182 11.61965\n", + "4 5 AGW278-23 15.2508 15.2486 15.24970\n", + "5 6 AGW278-36 16.3975 16.3918 16.39465\n", + "6 7 AGW278-55 14.9451 14.9411 14.94310\n", + "7 8 AGW278-72 16.8415 16.8406 16.84105\n", + "8 9 AGW278-84 15.1586 15.1567 15.15765\n", + "9 10 AGW278-108 18.3291 18.3259 18.32750\n", + "10 11 AGW279-12 15.4179 15.4163 15.41710\n", + "11 12 AGW279-17 17.4440 17.4385 17.44125\n", + "12 13 AGW279-20 15.5385 15.5350 15.53675\n", + "13 14 AGW280-23 15.4667 15.4644 15.46555\n", + "15 x cal_std 18.5584 NaN 18.55840\n" + ] + } + ], + "source": [ + "mass.loc[mass.index[14],'average mass'] = mass.loc[mass.index[14],'Mass (g)']\n", + "mass.loc[mass.index[14],'Sample ID'] = 'cal_std'\n", + "print(mass)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Now Try This\n", + "1. A few things to consider when you are saving data in Excel that you'll use with Python: First, empty lines are bad. Second, use the same names for the same samples (yes, capital letters and spaces are significant - make all of your letters either capital or lowercase, and don't use spaces!). And third, make sure that the columns in your data file are consistent. Everything in a column should be the same kind of data. *Now, as you work through this notebook, keep an Evernote note about how you are going to organize data files so you don't have these problems in the future!* \n", + "\n", + "Loading Susceptibility Data\n", + "-----------------------------\n", + "\n", + "Now let's put the \"Pre-Test\" 10-second susceptibility data into a data frame. We're only going to print the first couple of rows of that data frame using the `head()` method. The term \"head\" cames from a shell command that does the same thing for text files. It's convenient for learning what kinds of data are in your data frame. " + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Sample ID Time (h:min:s) Date (D/M/Y) Mass Susc.Raw Meas. in SI \\\n", + "0 cal_std(LF) 20:18:09.226000 2018-12-03 0.030237 \n", + "1 cal_std(HF) 20:19:21.286000 2018-12-03 0.030102 \n", + "2 cal_std FD % 20:19:21.288000 2018-12-03 0.448185 \n", + "3 AGW278-55(LF) 20:22:17.623000 2018-12-03 0.001721 \n", + "4 AGW278-55(HF) 20:23:36.134000 2018-12-03 0.001674 \n", + "\n", + " Mass Susc.Meas. in SI Sample Weight in g Correct. Factor \\\n", + "0 0.000016 18.5529 0.000539 \n", + "1 0.000016 18.5529 0.000539 \n", + "2 0.448185 0.0000 1.000000 \n", + "3 0.000001 14.9431 0.000669 \n", + "4 0.000001 14.9431 0.000669 \n", + "\n", + " Correct. Offset Comment \n", + "0 -2.632000e-07 NaN \n", + "1 -9.191000e-07 NaN \n", + "2 0.000000e+00 NaN \n", + "3 4.871000e-07 NaN \n", + "4 -1.106600e-06 NaN \n" + ] + } + ], + "source": [ + "susc_pre_10s=pd.read_excel(\"Landau Associates Soil Jan 2018.xlsx\",sheet_name=\"Pre-tests (10s)\")\n", + "print(susc_pre_10s.head())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Now Try This\n", + "1. What happens if you try printing the `tail()` instead of the head?\n", + "2. What happens if you try printing the `susc_pre_10s.columns` attribute?\n", + "\n", + "Splitting up the Sample IDs\n", + "-----------------------------\n", + "\n", + "If you look closely at the Sample ID column, you'll notice that it contains information about the measurement type as well as the sample's actual ID. For example, there are three rows for the standard at the beginning, corresponding to low frequency (LF), high frequency (HF), and frequency dependence (FD%) measurements. We want to separate these pieces of information. This is a bit complicated, so bear with me.\n", + "\n", + "Before we start, notice that all of the information in the Sample ID column follows a certain pattern: there's the sample name, then a parenthesis or space, a two-letter code, and then some other stuff we don't care about. We want to separate the sample name and the two-letter code, and put those in two separate columns. We'll do that by first putting the info we want into a new data frame, then pasting that data frame onto our old friend `susc_pre_10s` line by line.\n", + "\n", + "So, here we go. First, we'll use pandas' `str.extract()` method to extract two columns of information from the Sample ID column. The `str.extract()` method takes two parameters:\n", + "1. A *regular expression*: this is a Python-y way of specifying the text pattern we described above: \n", + " - The \"`\\S`\" means \"any character that isn't a blank\". (If you used \"`\\s`\", it would mean \"any space, tab, or other blank character\".) \n", + " - The \"`+`\" means \"one or more of the character I just described\". \n", + " - The \"`[( ]`\" means \"either ( or a space\". \n", + " - The \"`.`\" means \"any ol' character\".\n", + " - The \"`()`\" mean \"put these things in a column\".\n", + "2. The `expand=True` parameter, which I'm still unsure about...\n", + "\n", + "Second step: we rename the columns to something useful." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ID Measurement Type\n", + "0 cal_std LF\n", + "1 cal_std HF\n", + "2 cal_std FD\n", + "3 AGW278-55 LF\n", + "4 AGW278-55 HF\n" + ] + } + ], + "source": [ + "IDs=susc_pre_10s['Sample ID'].str.extract('(\\S+)[( ](..).+',expand=True)\n", + "IDs.columns=['ID','Measurement Type']\n", + "print(IDs.head())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OK - looks good. Now we have to paste this onto our favorite data frame. We'll use pandas' `concat()` method, which is short for \"concatenate\", meaning \"squish these two data frames together so the rows (or columns) line up\". The first parameter is an array of data frames to be squished. The second parameter tells pandas how to do the squishing. In this case, we use `axis=1` to say \"the rows need to line up\". If we said `axis=0`, the columns would need to line up. " + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ID Measurement Type Sample ID Time (h:min:s) Date (D/M/Y) \\\n", + "0 cal_std LF cal_std(LF) 20:18:09.226000 2018-12-03 \n", + "1 cal_std HF cal_std(HF) 20:19:21.286000 2018-12-03 \n", + "2 cal_std FD cal_std FD % 20:19:21.288000 2018-12-03 \n", + "3 AGW278-55 LF AGW278-55(LF) 20:22:17.623000 2018-12-03 \n", + "4 AGW278-55 HF AGW278-55(HF) 20:23:36.134000 2018-12-03 \n", + "\n", + " Mass Susc.Raw Meas. in SI Mass Susc.Meas. in SI Sample Weight in g \\\n", + "0 0.030237 0.000016 18.5529 \n", + "1 0.030102 0.000016 18.5529 \n", + "2 0.448185 0.448185 0.0000 \n", + "3 0.001721 0.000001 14.9431 \n", + "4 0.001674 0.000001 14.9431 \n", + "\n", + " Correct. Factor Correct. Offset Comment \n", + "0 0.000539 -2.632000e-07 NaN \n", + "1 0.000539 -9.191000e-07 NaN \n", + "2 1.000000 0.000000e+00 NaN \n", + "3 0.000669 4.871000e-07 NaN \n", + "4 0.000669 -1.106600e-06 NaN \n" + ] + } + ], + "source": [ + "susc_pre_10s=pd.concat([IDs,susc_pre_10s],axis=1)\n", + "print(susc_pre_10s.head())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Now Try This\n", + "1. Change `axis=1` to `axis=0` and see what happens. Then change it back!\n", + "\n", + "Merging Data\n", + "-------------\n", + "Now we have two data frames which tell us different information about each sample - the mass and the susceptibility measurements. We need to attach the masses somehow to the susceptibility data. We do this using a *database merge*. This essentially says, \"take the mass for each sample, and attach it to the susceptibility data frame, for all the rows where the sample IDs are the same\". The pandas method for this is called, oddly enough, `merge()`. It takes the following parameters:\n", + "1. The \"left data frame\" (in this case `susc_pre_10s`), which is usually the one with more measurements. \n", + "2. The \"right data frame\" (in this case `mass`).\n", + "3. The column in the left data frame with the information that matches something in the right data frame.\n", + "4. The column in the right data frame with the information that matches something in the left data frame. Right on! Note that if there's a column with the same label in both data frames and you don't specify `left_on` and `right_on`, pandas will use whatever columns have (*exactly*) matching names." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ID Measurement Type Sample ID_x Time (h:min:s) Date (D/M/Y) \\\n", + "0 cal_std LF cal_std(LF) 20:18:09.226000 2018-12-03 \n", + "1 cal_std HF cal_std(HF) 20:19:21.286000 2018-12-03 \n", + "2 cal_std FD cal_std FD % 20:19:21.288000 2018-12-03 \n", + "3 cal_std LF cal_std(LF) 20:38:14.994000 2018-12-03 \n", + "4 cal_std HF cal_std(HF) 20:39:10.834000 2018-12-03 \n", + "\n", + " Mass Susc.Raw Meas. in SI Mass Susc.Meas. in SI Sample Weight in g \\\n", + "0 0.030237 0.000016 18.5529 \n", + "1 0.030102 0.000016 18.5529 \n", + "2 0.448185 0.448185 0.0000 \n", + "3 0.030237 0.000016 18.5529 \n", + "4 0.030218 0.000016 18.5529 \n", + "\n", + " Correct. Factor Correct. Offset Comment Cube # Sample ID_y Mass (g) \\\n", + "0 0.000539 -2.632000e-07 NaN x cal_std 18.5584 \n", + "1 0.000539 -9.191000e-07 NaN x cal_std 18.5584 \n", + "2 1.000000 0.000000e+00 NaN x cal_std 18.5584 \n", + "3 0.000539 -8.200000e-09 NaN x cal_std 18.5584 \n", + "4 0.000539 -9.549000e-07 NaN x cal_std 18.5584 \n", + "\n", + " Mass (g) Trial 2 average mass \n", + "0 NaN 18.5584 \n", + "1 NaN 18.5584 \n", + "2 NaN 18.5584 \n", + "3 NaN 18.5584 \n", + "4 NaN 18.5584 \n" + ] + } + ], + "source": [ + "susc_pre_10s=pd.merge(susc_pre_10s,mass,left_on='ID',right_on='Sample ID')\n", + "print(susc_pre_10s.head())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "susc_pre_10s.loc[susc_pre_10s['ID']!='cal_std','volume']=7.E-6\n", + "susc_pre_10s.loc[susc_pre_10s['ID']=='cal_std','volume']=10.E-6\n", + "susc_pre_10s['density']=(susc_pre_10s['Mass (g)']/1000.)/(susc_pre_10s['volume'])\n", + "susc_pre_10s.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "susc_pre_10s.drop(susc_pre_10s[susc_pre_10s['Measurement Type']=='FD'].index,inplace=True)\n", + "susc_pre_10s['K (SI)']=susc_pre_10s['Mass Susc.Raw Meas. in SI']*(10.E-6)/susc_pre_10s['volume']\n", + "susc_pre_10s['Chi (m3/kg)']=susc_pre_10s['K (SI)']/susc_pre_10s['density']\n", + "susc_pre_10s" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "susc_pre_10s.groupby(['ID','Measurement Type'])['K (SI)'].agg({'mean':np.mean, 'stdev':np.std})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "susc_10s=pd.read_excel(\"Landau Associates Soil Jan 2018.xlsx\",sheet_name=\"Tests for All Samples (10s)\")\n", + "IDs=susc_10s['Sample ID'].str.extract('(\\S+)[( ](..).+',expand=True)\n", + "IDs.columns=['ID','Measurement Type']\n", + "susc_10s=pd.concat([IDs,susc_10s],axis=1)\n", + "susc_10s=pd.merge(susc_10s,mass,left_on='ID',right_on='Sample ID')\n", + "susc_10s.loc[susc_10s['ID']!='cal_std','volume']=7.E-6\n", + "susc_10s.loc[susc_10s['ID']=='cal_std','volume']=10.E-6\n", + "susc_10s['density']=(susc_10s['Mass (g)']/1000.)/(susc_10s['volume'])\n", + "susc_10s.drop(susc_10s[susc_10s['Measurement Type']=='FD'].index,inplace=True)\n", + "susc_10s['K (SI)']=susc_10s['Mass Susc.Raw Meas. in SI']*(10.E-6)/susc_10s['volume']\n", + "susc_10s['Chi (m3/kg)']=susc_10s['K (SI)']/susc_10s['density']\n", + "susc_10s_avg=susc_10s.groupby(['ID','Measurement Type'])['K (SI)'].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "susc_10s_avg=susc_10s_avg.unstack()\n", + "susc_10s_avg['FD']=susc_10s_avg.LF-susc_10s_avg.HF\n", + "susc_10s_avg['FDpercent']=100.*(susc_10s_avg.LF-susc_10s_avg.HF)/susc_10s_avg.LF\n", + "susc_10s_avg=susc_10s_avg.reset_index(level=0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig=plt.figure(figsize=(10, 5), dpi= 80, facecolor='w', edgecolor='k')\n", + "sns.set_style(\"whitegrid\")\n", + "grid=plt.GridSpec(2,3, hspace=0.3)\n", + "plt.subplot(grid[0,0:1])\n", + "sns.barplot(x=\"K (SI)\", y=\"ID\", hue=\"Measurement Type\", data=susc_10s.sort_values('ID'))\n", + "plt.subplot(grid[0,2])\n", + "sns.barplot(x=\"FDpercent\", y=\"ID\", color='k', data=susc_10s_avg.sort_values('ID'))\n", + "plt.subplot(grid[1,:])\n", + "sns.jointplot(x='LF',y='FDpercent', data=susc_10s_avg[susc_10s_avg.l'ID'].sort_values('ID'));" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Landau Associates Soil Jan 2018.xlsx b/Landau Associates Soil Jan 2018.xlsx new file mode 100644 index 0000000..043a630 Binary files /dev/null and b/Landau Associates Soil Jan 2018.xlsx differ diff --git a/elgygytgyn2013_reconstruction.csv b/elgygytgyn2013_reconstruction.csv new file mode 100644 index 0000000..5e66e76 --- /dev/null +++ b/elgygytgyn2013_reconstruction.csv @@ -0,0 +1,390 @@ +"Brigham-Grette (2013): Pollen-derived climate reconstructions of ICDP site 5011-1 in Lake Elgygytgyn, NE Russia.",,,,,,,, +,,,,,,,, +Parameter(s):,Age [ka BP] * Geocode,,,,,,, +,"Mean Temperature, warmest month [deg C]",,,,,,, +,"Minimum Mean Temperature, warmest month [deg C] ",,,,,,, +,"Maximum Mean Temperature, warmest month [deg C] ",,,,,,, +,"Precipitation, annual mean [mm] ",,,,,,, +,"Minimum Precipitation, annual mean [mm] ",,,,,,, +,"Maximum Precipitation, annual mean [mm] ",,,,,,, +,Trees & Shrubs [%],,,,,,, +,Picea [%] ,,,,,,, +,,,,,,,, +Age [ka BP],"Mean Temperature, warmest month [deg C]","Minimum Mean Temperature, warmest month [deg C]","Maximum Mean Temperature, warmest month [deg C]","Precipitation, annual mean [mm]","Minimum Precipitation, annual mean [mm]","Maximum Precipitation, annual mean [mm]",Trees & Shrubs [%],Picea [%] +2150.3,5.640586425,2.678635973,12.17863597,238.4771111,150.6094715,347.7954715,8.058608059,0 +2152.46,9.207488344,1.885963335,14.78596334,262.1075035,156.2468795,353.4328795,20.42553191,0 +2155,10.51175965,7.962232372,15.06223237,260.8654586,208.9770585,320.4790585,23.48484848,0 +2156.82,7.843208763,1.301907425,14.20190742,260.3517198,180.2635871,329.7385871,24.04580153,0 +2157.31,10.72089556,8.203798928,14.50379893,259.2937568,210.501706,309.687706,43.23144105,0 +2159.33,11.11936284,8.736923852,12.13692385,269.8030829,226.0759455,313.2599455,54.18326693,0 +2160.32,10.21768812,6.723367825,13.82336782,260.7342266,219.4613852,293.7223852,31.41891892,0 +2162.62,11.5178364,8.404997092,14.70499709,277.0035594,224.1705553,323.3565553,54.6184739,0 +2165.18,11.80415616,9.372140252,13.47214025,270.9935065,230.8520641,323.0180641,64.96062992,0.787401575 +2167.74,12.40499403,9.81791219,16.01791219,259.0309586,190.8760545,460.7490545,82.17522659,4.229607251 +2169.17,12.83700629,10.70640564,14.80640564,251.6689453,229.5213747,269.9653747,80.85106383,0 +2175.22,12.32733593,9.330589379,16.13058938,275.3622895,208.2979802,342.8879802,87.63250883,0 +2177.14,12.16842347,9.975091046,13.37509105,269.7675843,200.3432317,317.2012317,80.63380282,0 +2179.05,12.47026438,9.930170551,13.33017055,283.3006829,201.3590295,332.8120295,85.5513308,0.380228137 +2182.24,12.74144605,10.87893291,16.77893291,292.7864105,199.800605,319.795605,87.5,0 +2183.93,12.65026822,10.26524936,17.06524936,288.3920844,226.1151842,320.2611842,85.83333333,0.416666667 +2185.62,12.8068749,11.20244159,16.80244159,288.2847821,205.5348411,322.3928411,85.81560284,0 +2187.31,12.8167087,10.97408388,17.07408388,291.5217273,192.0496252,320.4076252,91.26637555,0 +2189.08,12.27064534,10.82802255,13.32802255,284.3744151,235.4412589,305.9902589,81.21827411,0 +2192,12.21870077,11.5827883,14.0827883,286.7368464,246.3819579,316.9309579,82.0610687,0 +2193.02,11.71724283,11.42119184,12.22119184,285.5814466,256.8803595,327.4293595,67.3992674,0 +2196.91,9.050066214,2.329098479,15.22909848,243.9301664,156.6289578,316.5739578,26.94300518,0 +2199.19,11.47764124,7.385732997,13.685733,252.8523301,220.528538,312.694538,41.36546185,0 +2201.02,10.53664694,7.539287267,14.63928727,281.8118524,219.834566,331.336566,40,0 +2202.68,11.66533858,10.79929913,13.99929913,266.795139,221.08077,295.34177,57.14285714,0 +2205.345,12.03835537,11.41898418,14.61898418,278.660801,217.2061031,328.4521031,71.00840336,0 +2207.12,12.03914823,10.61854225,14.01854225,284.655727,227.4183738,318.4273738,81.63265306,0 +2209.78,12.67655344,11.68529867,13.38529867,283.3458476,193.4362371,324.8892371,86.55462185,0 +2211.55,12.50449379,10.51735349,13.91735349,271.7564162,198.5918665,330.0448665,86.66666667,0.350877193 +2213.35,11.88825487,10.09274558,13.89274558,278.4964215,240.0563302,331.0653302,77.57352941,0 +2216.77,9.35051688,1.485031785,14.38503179,255.2065994,150.4681978,299.9431978,31.88405797,0 +2219.03,10.74165111,7.874185285,14.97418529,260.1518801,202.4010842,317.0590842,37.15846995,0 +2221.29,11.34961368,8.540359808,11.94035981,277.8622251,258.4834309,316.9724309,56.35738832,0 +2223.755,12.12143335,10.96823847,13.46823847,286.9375487,240.5064186,311.0554186,83.79310345,0 +2225.87,12.13801947,11.11972245,13.31972245,284.6482,196.1276081,312.9856081,89.70099668,0.332225914 +2226.62,11.2559886,11.17121911,11.47121911,272.5507064,263.0666962,296.6306962,48.03921569,0 +2229,11.96029007,10.3324065,14.1324065,281.2994513,243.8905815,334.8995815,81.65467626,0 +2231.515,10.57571631,7.680161898,11.3801619,261.6892609,190.4041304,304.6641304,40.95238095,0 +2233.32,10.03677386,7.838508445,11.73850844,273.5340353,222.7475225,322.2475225,36.29343629,0 +2235.47,10.10994875,8.447633468,12.34763347,272.7226743,222.7341215,322.2341215,33.62445415,0 +2237.94,10.33686134,8.530282112,15.63028211,259.4285673,198.8988872,310.4008872,26.07003891,0 +2240.36,9.722428928,3.034692976,15.93469298,255.1172809,135.9916423,333.1776423,23.90572391,0 +2243.21,9.461397879,1.682161926,14.58216193,239.6210711,136.4768094,333.6628094,34.27230047,0 +2245.83,11.31245826,7.166522964,14.26652296,256.1135688,219.5564566,311.7224566,40.28776978,0.71942446 +2247.73,9.535484018,1.729141061,14.62914106,236.6958598,128.5437407,325.7297407,26.03773585,0 +2249.635,11.30366414,8.352948888,14.65294889,255.2248662,221.3733145,295.6343145,39.70037453,0 +2251.06,11.12894562,8.824314882,12.22431488,275.7264004,232.1031444,319.2871444,47.19626168,0 +2252.54,11.69837933,10.89818384,14.39818384,274.6955241,210.0259018,336.3459018,47.32510288,0 +2254.54,11.67829736,10.10020041,14.20020041,272.3185306,222.8634942,318.8084942,56.44599303,0 +2256.49,11.86550465,10.19823967,13.59823967,289.9856969,231.517417,322.526417,73.85057471,0 +2260.5,12.44157175,10.82623451,16.72623451,297.8378219,241.5848635,315.2708635,83.3976834,0 +2263.48,12.16746105,11.63300759,14.13300759,280.9320967,249.6971741,320.2461741,85.01872659,0 +2265.32,12.32082626,10.17149061,13.57149061,291.5520574,223.9748776,314.9838776,81.58844765,0 +2269.45,11.6973432,10.74732691,15.04732691,248.3325917,217.8975318,256.0395318,75.28957529,0 +2271.29,11.69710761,10.11799787,14.31799787,266.3855006,233.5086449,333.8116449,84.67741935,0 +2273.12,12.1653315,10.17705008,14.47705008,245.5256342,212.7666587,326.6166587,83.40807175,0 +2274.965,11.69705414,10.16368994,14.06368994,259.7128636,208.8669049,322.7169049,73.01587302,0.396825397 +2276.68,11.55669717,10.03341857,14.13341857,281.9082287,234.843078,323.533078,59.24170616,0 +2278.77,11.99476817,10.67655889,14.57655889,263.2431969,205.6515389,319.5015389,62.39067055,0.874635569 +2280.68,11.46074702,11.01572377,13.71572377,279.6357905,256.1022686,311.3502686,53.38345865,0 +2284.43,12.51311363,10.37910947,14.47910947,248.7364785,223.0688247,271.4638247,57.57575758,0.378787879 +2287.65,11.31901378,10.72557621,12.62557621,269.997302,199.7674551,289.1024551,44,0 +2292.87,12.12369714,8.708695324,13.60869532,293.0156224,215.7355858,367.5725858,70.94594595,0 +2296.75,11.42237053,8.227753451,13.82775345,282.5921714,250.2877127,320.8367127,62.97468354,0 +2299.53,10.98380712,8.643397534,12.04339753,267.2163328,224.4225824,311.6065824,55.38461538,0 +2301.38,10.52340797,7.907595167,11.30759517,273.4406956,242.7984762,305.0574762,37.69230769,0 +2303.24,9.54686056,7.963239468,11.36323947,255.9551717,176.8910146,303.8650146,27.69230769,0 +2305.035,10.72833318,7.754355808,14.05435581,266.4250022,230.1111418,304.3721418,39.55555556,0 +2308.86,8.735877834,2.560067758,15.46006776,242.6033667,138.989863,336.175863,17.1875,0 +2310.62,9.57703179,1.669016725,14.56901673,249.4199864,144.1945282,341.3805282,26.37795276,0 +2312.925,10.21946192,7.436574939,14.53657494,272.0356812,205.374855,316.876855,31.77966102,0 +2315.23,10.65406462,7.769585548,14.86958555,270.4166465,200.2116719,311.7136719,39.41605839,0 +2319.68,12.49437163,10.84693174,14.94693174,235.5228227,208.3746373,246.5166373,66.7896679,0 +2321.54,12.07286768,9.762733483,16.66273348,252.4383951,213.2613306,302.5553306,50,0 +2323.73,12.62972257,10.34133885,14.44133885,218.5399307,197.0454654,237.4894654,68.11594203,0 +2325.91,12.08529344,10.15239686,14.25239686,247.0805523,222.0384213,260.1804213,64.41176471,0 +2328.1,11.96383271,10.39409901,14.49409901,259.8796187,219.3426549,320.8996549,64.86486486,1.930501931 +2330.28,12.5165342,10.72942816,14.82942816,265.2548345,232.9036629,325.0696629,69.75088968,4.982206406 +2333.56,13.8016966,9.475291662,15.17529166,460.5622986,180.1890937,661.6030937,85.86572438,0 +2335.84,13.77630998,8.747519308,16.24751931,468.9684865,193.3107356,674.7247356,91.34199134,1.731601732 +2338.63,14.04692967,9.567215154,15.46721515,387.9488396,109.1496501,590.5636501,96.5408805,1.886792453 +2340.08,14.3849972,9.826367456,15.72636746,422.7973513,140.3330659,621.7470659,94.98069498,4.633204633 +2342.47,14.10399893,8.672167824,16.77216782,483.5971722,194.5857427,724.0467427,96.04743083,0.790513834 +2344.86,12.01528338,9.992021584,13.79202158,267.1160936,223.7082393,340.5662393,79.62962963,0 +2347.25,11.95573804,10.23628836,14.03628836,270.4033864,213.7978349,317.7888349,75,0 +2349.64,12.28506145,10.60864079,14.00864079,259.6442698,214.3377032,315.8947032,69.73180077,0 +2352.4,11.81272698,10.60768209,14.40768209,252.265042,214.6627243,331.5207243,84.40366972,0 +2356.05,7.86091223,1.267716991,14.16771699,241.3996165,154.1275648,303.6025648,26.63316583,0 +2358.265,10.67699626,7.022864028,14.12286403,256.9409135,223.4647738,297.7257738,40.89219331,0 +2363,9.824262716,7.288872441,14.38887244,257.7260336,216.5524792,315.7384792,28.04878049,0.406504065 +2366.35,10.46220078,7.881501071,14.98150107,271.9949187,222.8150098,334.3170098,41.76245211,0.383141762 +2368.29,10.7627007,8.176366163,14.37636616,265.3865178,196.7554319,326.1624319,50.37878788,0 +2370.3,9.269314486,1.235803888,14.13580389,244.672972,135.6741732,332.8601732,29.59183673,0 +2372.03,11.94916537,9.980458515,14.48045852,244.5159854,211.3858539,303.5518539,56.36363636,0 +2374.25,11.70723478,9.636246908,14.13624691,249.1350898,225.1804361,263.3224361,60,0 +2377.06,12.91657677,10.09267951,16.29267951,260.9360007,222.5294144,321.9834144,88.19444444,0 +2379.87,12.55733004,10.83642464,14.63642464,260.6309676,204.6681341,336.1211341,93.66666667,0.333333333 +2382.225,14.64143769,10.12526444,16.42526444,458.617878,176.0454215,705.5064215,98.03921569,2.745098039 +2386.34,11.6255518,10.53650564,13.03650564,289.8442206,254.6364924,325.1854924,65.0862069,0 +2391.64,10.28494581,8.342053362,12.54205336,283.2620448,221.945096,321.445096,44.08602151,1.792114695 +2394.11,11.2924274,6.872635577,13.97263558,260.0882356,209.9237862,327.0147862,46.91780822,2.397260274 +2396.05,10.65430675,7.447305376,14.84730538,261.1263716,235.8140486,299.6050486,36.23188406,0 +2397.97,11.18252833,10.07235459,12.57235459,266.7189463,232.7744704,286.7984704,52.94117647,0 +2402.045,10.60383276,7.731994522,14.83199452,261.9512282,206.1204774,320.7784774,33.75,0 +2406.78,10.22443031,7.870406574,11.77040657,256.9403304,199.959096,314.617096,34.63414634,0 +2410.72,10.92716229,7.458233053,14.85823305,253.3722389,222.1503008,310.0323008,34.25925926,0.462962963 +2413.54,11.15774989,10.87954835,11.77954835,278.5761443,236.0192052,307.9562052,48.64864865,0 +2419.28,12.16253245,9.172909208,13.67290921,303.6921501,258.3939825,366.6769825,81.70347003,0 +2426.68,11.45201847,11.15860226,11.95860226,282.5171599,253.8113889,324.3603889,63.59649123,0 +2430.59,11.68735175,10.76355147,14.16355147,280.7387991,227.112722,323.057722,56.41025641,0 +2432.385,5.688757712,3.096572159,12.59657216,239.9854153,138.4829452,287.9579452,0,0 +2444.67,9.807973384,3.23015123,16.13015123,282.8585063,145.6631826,342.8491826,22.84263959,0 +2450.58,10.84208722,8.268565063,12.16856506,267.5277982,228.2276847,315.4116847,38.42975207,0 +2452.9,11.90668519,11.41512102,13.91512102,286.3681704,258.8700688,329.4190688,66.95652174,0 +2456.94,12.41067207,9.473949455,13.97394945,301.8170583,257.9513531,366.2343531,85.88235294,0.392156863 +2467.96,13.18824756,10.79643507,14.69643507,244.2823519,215.2318944,312.3838944,78.43137255,0 +2473.88,10.99655395,10.56038132,11.76038132,258.5474303,222.0785371,301.3415371,40,0 +2475.67,11.59513159,8.75062218,14.35062218,252.4351954,198.9401582,312.1011582,48.57142857,0 +2477.46,10.38599067,7.828094277,12.12809428,249.1453755,194.8964571,308.0574571,36.84210526,0 +2479.25,9.394015771,7.10082854,11.10082854,263.7895344,225.7690872,313.6510872,18.75,0 +2481,10.18787527,7.783094857,14.88309486,254.7963049,192.9788517,322.3858517,35.5704698,1.342281879 +2482.33,11.827524,8.526435559,18.22643556,270.706236,228.312144,345.403144,38.88888889,0 +2485.86,10.64211545,2.092360357,18.39236036,249.5237676,148.8050374,333.6750374,35.01805054,0 +2488.44,9.845243723,2.983551068,12.98355107,259.5263055,135.4950304,332.6810304,29.16666667,0 +2488.98,11.91084558,10.0288607,13.4288607,290.1748753,231.3790619,322.3880619,77.48091603,0 +2494.22,11.2357707,8.191131434,15.29113143,254.4553729,199.8005267,316.8915267,45.23809524,0 +2496.59,10.86891161,7.374245629,11.97424563,264.0565222,220.0541168,281.5211168,45.09803922,0 +2499.38,12.35436584,11.17638844,16.97638844,275.5246297,205.4162529,330.6372529,70.25862069,0 +2501.75,12.98627421,11.23000258,18.03000258,283.8184235,214.0521412,339.2731412,82.12560386,0 +2504.75,13.67057839,11.41613417,18.21613417,274.1803863,223.3681575,307.9371575,79.01234568,0 +2506.655,12.03553096,8.737331963,17.63733196,275.206121,185.4562141,371.5052141,68.67924528,0 +2508.59,12.57450967,11.40271286,17.40271286,270.4010755,211.8176752,321.7376752,71.49122807,0 +2509.98,11.42827777,8.807242702,12.3072427,247.9967815,204.0017014,317.1627014,61.82572614,0 +2511.34,10.63000492,7.742759557,11.64275956,272.5795388,255.6425788,320.2285788,43.16239316,0 +2513.36,10.32116527,7.934273826,12.23427383,270.8535072,222.4115393,318.5755393,47.42268041,0 +2515.33,10.35465698,8.972230923,12.67223092,277.3022367,215.5342146,315.0342146,34.04255319,0 +2519.41,4.855715065,1.922649056,11.42264906,234.6712452,129.0589008,326.2449008,6.692913386,0 +2522.05,8.799578067,2.757146011,11.55714601,272.582832,142.149181,339.335181,16.16766467,0 +2524.98,10.39298817,7.995949547,11.89594955,273.2872732,244.4967766,331.6807766,32.67326733,0 +2527.33,10.48523265,8.064350841,18.56435084,274.3642944,210.1184707,321.6204707,32.65306122,0 +2530.05,11.65686908,8.128577985,17.82857799,264.9097736,192.9970571,322.4040571,44.68085106,0 +2532.91,12.50393994,10.339585,14.439585,230.2329052,209.4008964,247.5428964,69.16666667,0.833333333 +2535.39,12.21970545,8.918738049,13.81873805,275.0955314,207.6777769,384.0577769,80.72289157,0 +2536.93,12.67047127,10.77939427,14.87939427,229.3094637,210.5210564,243.2610564,72.68722467,0 +2540.78,12.8897356,10.527681,14.627681,224.3912496,201.6239908,239.7659908,67.39130435,0.869565217 +2542.16,12.58060591,10.61182893,14.71182893,228.8607251,203.8499957,241.9919957,58.86792453,0.377358491 +2543.24,12.64681229,10.72297544,14.62297544,221.9289149,199.1677455,237.3097455,63.76146789,0.458715596 +2543.82,12.16411152,10.78835792,14.18835792,262.8419425,195.746641,312.604641,58.52713178,3.488372093 +2547.31,12.57243703,10.14739482,13.94739482,275.3220242,228.4170123,328.6680123,91.54929577,0 +2550.03,12.31251437,9.186729176,14.08672918,290.7679001,206.3139534,382.6939534,83.33333333,0 +2553.66,12.05920866,10.09324469,12.89324469,289.901568,228.0840492,397.8340492,70.3196347,0 +2557.11,12.32186632,8.934011951,17.83401195,288.3517379,259.3695776,367.6525776,65.917603,0 +2560.44,11.0049153,8.470189069,12.87018907,254.1876108,205.5210185,298.1850185,46.03960396,0 +2564.56,11.42018535,8.168513945,15.86851395,274.6204558,184.6796991,561.7256991,32.23684211,0 +2566.4,10.8601659,7.535873541,18.03587354,277.8471208,240.523465,327.707465,44.29824561,0 +2566.86,10.97623427,8.155973789,11.55597379,275.0106443,238.2597197,300.5187197,46.77966102,0.677966102 +2567.87,11.20708023,8.416515849,11.81651585,279.494393,247.977456,306.466456,56.88311688,0 +2569.34,11.32158073,8.394475441,13.99447544,277.0365374,254.1662313,312.6552313,62.33333333,0 +2573.33,10.79232683,8.432323066,12.63232307,273.3176716,220.4286182,307.6126182,44.02173913,0 +2575.46,11.49179485,8.768652465,12.66865247,276.9028473,262.731866,310.186866,50.98039216,0 +2577.96,11.6023246,9.106197555,12.70619756,272.4117877,213.9644308,306.6284308,50.34013605,0 +2581.47,12.87023021,10.8053126,17.1053126,284.3079881,201.1171203,326.3381203,85.77586207,0 +2588.67,12.2720927,8.730153045,17.43015305,269.3868925,205.9955546,319.1565546,77.65957447,0 +2591.98,10.97296125,7.937497023,12.23749702,255.1391333,192.5781678,305.7391678,52.5862069,0 +2598.1,10.75649279,6.831515964,13.93151596,263.4453049,213.2570544,342.6640544,40.96774194,0 +2604.58,12.30192967,8.182923389,14.48292339,264.0384704,224.1316856,341.2226856,49.61538462,0.384615385 +2606.21,11.97411115,9.247425953,13.74742595,290.7555292,204.1670041,373.9170041,73.15175097,0.389105058 +2609.02,11.92841232,10.01517734,13.41517734,271.0259489,201.8577777,318.7157777,66.66666667,0 +2610.01,9.954921897,8.014088284,11.41408828,271.905023,221.2382857,320.7382857,39.9339934,0.660066007 +2611.15,11.83420331,10.74912859,14.14912859,272.6832646,215.5720326,311.5170326,57.37704918,0 +2612.63,12.53787499,9.167094124,15.46709412,255.5681054,210.9662016,321.6562016,53.7254902,0 +2613.65,11.47235748,9.280603465,13.38060347,239.8160795,201.931524,283.627524,40.45801527,0 +2614.09,12.44037243,10.43749317,14.53749317,246.3953363,206.730747,298.896747,53.08641975,0.411522634 +2615.4,12.30500878,10.25591121,14.35591121,247.3967131,230.1567231,289.6557231,58.46153846,0 +2616.68,11.11770614,10.39982004,13.79982004,263.6551759,222.3458985,282.2048985,44.02985075,0 +2618.03,11.71720017,10.13043435,14.63043435,247.6085068,223.0293394,324.5863394,62.54180602,0 +2618.97,12.26852932,10.0654026,15.8654026,275.6811441,204.9392725,474.8122725,81.81818182,5.594405594 +2621.4,12.81266066,10.579696,16.379696,238.1053006,207.1320888,315.5800888,82.60869565,1.086956522 +2623.685,12.27935754,10.96708696,13.46708696,277.3093784,198.8392922,315.6972922,78.93175074,0.296735905 +2625.73,12.46498132,10.50598915,14.70598915,246.0252344,221.8747699,314.0347699,83.80566802,0.809716599 +2627.41,12.25965434,11.00203986,13.50203986,284.82589,205.8712025,322.7292025,82.59259259,1.111111111 +2630.64,12.72599444,9.991044162,14.49104416,288.648191,188.8029502,374.8519502,84.02777778,0 +2632.85,11.01845261,8.231717317,14.63171732,275.5754467,222.0375656,309.2215656,55.81395349,0 +2634.28,11.56835489,8.601047916,14.90104792,262.7068605,214.6864341,313.8724341,55.09259259,0 +2635.35,10.78324233,7.241240715,14.34124072,267.6549862,216.0574912,333.1484912,41.26213592,0 +2637.49,11.55410862,8.113635881,17.81363588,264.7385685,208.7955119,325.8865119,55.55555556,0 +2641.93,10.16047845,7.661041756,14.76104176,256.9814556,195.0888419,324.4958419,29.77099237,0.381679389 +2646.94,12.86297786,10.03865808,15.93865808,382.2525523,232.725002,701.105002,80.05780347,12.71676301 +2649.11,14.15673418,10.72895016,16.32895016,347.5613659,279.5908569,551.7658569,85.47008547,2.991452991 +2651.18,12.29813097,10.53482245,14.63482245,247.1771457,213.0804194,305.2464194,58.94308943,1.62601626 +2652.8,12.82568952,10.2518097,14.7518097,231.364463,211.6753894,251.3383894,77.68924303,0.398406375 +2654.85,12.72328261,10.84644586,15.14644586,246.9750934,224.2983391,262.4403391,81.73913043,5.652173913 +2656.6,13.85829835,12.84149876,15.24149876,369.3394015,162.4633413,532.1433413,93.10344828,9.310344828 +2658,15.66109823,14.41905714,16.71905714,597.6587414,552.1690286,669.8150286,97.59615385,37.01923077 +2661.32,14.66341591,9.958410217,16.25841022,468.1109921,159.0878907,688.5488907,92,6.545454545 +2662.78,12.33500184,9.792213973,15.69221397,297.8060954,227.952485,331.943485,87.5502008,4.417670683 +2663.42,12.65145284,9.691713805,15.4917138,278.5954089,242.4419527,342.6929527,92.10526316,7.142857143 +2666.1,10.83447501,7.801755655,12.40175565,269.2643525,217.0999085,313.9619085,46.59090909,0 +2669.06,12.01735742,8.702075742,13.60207574,300.0347758,276.1343932,361.6603932,71.54150198,0 +2672.44,10.30342919,8.084467875,11.58446787,248.1755789,213.950788,328.608788,37.5,0 +2676.1,8.986217628,2.400619053,11.90061905,255.0646352,119.0921139,316.2781139,16.81034483,0 +2678.79,10.21118557,7.406748077,14.50674808,266.708629,219.7110235,331.2130235,29.05405405,0 +2681.08,13.11368459,9.572866187,17.47286619,296.9211171,226.3391169,502.8811169,78.98550725,0.362318841 +2681.79,12.4272568,10.02143905,13.92143905,260.2907202,192.5398873,306.3898873,76.78571429,2.142857143 +2685.35,10.20213281,6.906460432,14.00646043,276.6929876,225.4438985,336.9458985,45.703125,0 +2689.44,10.02047453,7.570666278,14.67066628,263.8682243,200.515138,329.922138,31.53846154,0 +2691.59,10.23000105,7.398457765,14.49845776,291.5192624,244.9107315,342.0107315,37.80918728,0.35335689 +2692.58,13.2112442,10.04761154,15.84761154,311.9061189,212.0557698,705.5957698,68.4981685,5.128205128 +2698.78,11.9601209,10.64802357,13.34802357,296.0611738,270.4297576,317.8847576,70.37037037,0 +2704.93,11.25559645,7.92727913,15.02727913,266.5750571,214.2885078,313.4745078,54.16666667,0 +2715.33,10.15587668,9.106185039,12.80618504,273.697973,205.6297282,305.1297282,26.63551402,0 +2721.98,11.381999,7.381996656,13.68199666,242.5927481,211.3570029,284.4550029,35.95166163,0 +2726.83,11.05964337,7.307947578,14.40794758,256.7482289,211.6793164,328.7703164,46.91358025,0.823045267 +2731.92,12.5411094,10.4232533,14.5232533,232.3184862,201.3168031,283.0128031,51.77304965,0.354609929 +2736.675,13.26405926,9.949787563,15.74978756,339.685491,163.8108735,657.3508735,77.16535433,3.543307087 +2740.15,13.68433429,9.970513269,15.77051327,343.534038,176.7650725,653.8120725,95.27272727,6.545454545 +2761.015,11.70230238,7.436666019,15.23666602,302.871442,204.2728378,697.8128378,52.8189911,2.670623145 +2772.18,14.4073944,10.56903349,17.06903349,455.7766953,155.4370624,713.0330624,77.81954887,3.383458647 +2780.75,14.65428248,10.31667129,16.11667129,425.3578944,186.8461188,647.9921188,95.5465587,8.906882591 +2787.4,14.91341651,10.28105104,16.78105104,539.0680529,288.6936468,846.2896468,88.56304985,5.865102639 +2792.98,12.81285925,9.262523887,16.46252389,311.8698238,235.4799397,716.8939397,68.12080537,0.33557047 +2794.85,12.02194175,11.04380752,13.54380752,274.9514155,214.7336059,460.0236059,57.22891566,5.120481928 +2796.26,13.17147666,9.416644754,17.11664475,337.3978917,215.8423194,697.2563194,79.92424242,0 +2804.31,12.23893028,9.530309644,17.13030964,271.4575789,217.2868623,337.8058623,67.08860759,0 +2815.27,10.93662061,6.465047011,13.56504701,263.3906957,212.0349525,341.4419525,42.52491694,0 +2821.445,12.85832965,9.916993313,14.71699331,275.2066444,192.3680321,688.2100321,56.20437956,3.284671533 +2825.16,13.53546639,10.00183976,15.80183976,374.7822766,206.2917338,683.3387338,77.65957447,4.609929078 +2830.85,13.14257236,9.809737446,15.70973745,305.9806097,155.1212583,531.4702583,88.07017544,0.701754386 +2834.79,11.87543814,10.2489501,14.1489501,264.9860293,218.5771832,332.4271832,63.79310345,0 +2838.87,11.05045654,9.121138077,13.22113808,256.8382735,219.4380529,301.1340529,40.38461538,0.384615385 +2842.72,12.55299694,9.994065403,14.0940654,223.7599851,197.3705283,281.3685283,60.59322034,0 +2843.6,12.88681911,9.83592445,16.33592445,350.8148978,173.6601438,750.5231438,76.76767677,6.060606061 +2846.525,13.6762769,9.02342289,16.22342289,381.1641693,133.2710748,633.4800748,67.68558952,2.183406114 +2850.45,10.43755867,7.543351642,14.64335164,257.7716084,209.2070592,306.3070592,35.79766537,0.389105058 +2852.77,12.56801293,10.46441014,14.56441014,276.8337757,222.3272025,351.4782025,70.16129032,5.64516129 +2854.46,12.7902918,10.8167409,14.9167409,228.3902469,201.896996,240.038996,54.01459854,0 +2856.3,13.48817959,9.92106322,15.02106322,378.0873172,162.577817,650.224817,72.42524917,3.986710963 +2858.14,12.657722,10.01550909,15.11550909,293.8656742,231.1226249,708.1696249,59.62962963,1.111111111 +2860.56,12.43445496,8.825802897,15.7258029,292.5818976,205.0162039,684.9572039,59.92217899,1.945525292 +2860.97,10.56966278,7.463677046,11.66367705,280.9654332,252.9124666,329.8144666,#N/A,#N/A +2885.89,12.90296032,10.82837128,15.62837128,308.8672114,188.1857376,681.7257376,65.56776557,7.692307692 +2886.46,10.5810124,7.379520005,14.47952,271.9991943,227.192182,331.439182,43.77358491,0 +2892.65,12.51651777,8.099157475,14.99915748,279.6254779,193.3996909,689.2416909,62.85714286,0.408163265 +2898.58,13.67828674,10.45669283,16.35669283,364.3367178,248.2531449,729.6671449,90,5.806451613 +2900.89,11.99617269,10.82952098,14.22952098,268.635587,213.7851371,322.7071371,60.50420168,0 +2902.84,14.07779184,10.24744325,16.14744325,429.5679422,131.4122625,631.6212625,76.39751553,6.832298137 +2905.085,11.56700662,10.23141259,14.33141259,239.6419445,220.0993877,277.3683877,45.96491228,0 +2907.46,12.40428956,11.15227231,14.85227231,280.5938262,225.0655092,410.1015092,72.17391304,0.434782609 +2910.04,12.20688849,10.03206942,14.13206942,256.4660025,235.128524,273.270524,66.10878661,0 +2912.75,11.87587941,11.08861799,13.78861799,296.0149669,255.9251454,326.4741454,72.58064516,0 +2916.92,11.30991598,8.35930836,13.95930836,280.3776848,256.0395193,314.5285193,55.26315789,0 +2931,11.93280187,9.861095242,13.96109524,267.2898365,215.7934014,329.6434014,59.76331361,0 +2934.76,11.89508673,10.67138642,14.57138642,281.2531747,198.1612812,468.6112812,66.52173913,3.47826087 +2936.17,12.46630358,9.525225833,13.32522583,274.8807186,192.9351184,324.3881184,88.42975207,0 +2942.1,12.9877283,10.1587013,16.3587013,263.3684298,226.2735115,320.7415115,80.34934498,6.550218341 +2944.26,14.85813775,11.1804088,16.3804088,513.8175224,282.1262253,656.5682253,96.41577061,14.33691756 +2969.08,15.92220421,14.07169978,17.17169978,612.2902363,292.9951419,784.7661419,85.26912181,16.71388102 +2976.84,12.39775785,9.993525151,15.79352515,299.2022559,214.1249467,483.9979467,78.70722433,7.224334601 +2999.33,9.666850248,8.723770704,11.5237707,296.3744302,216.2951044,320.5421044,50.98039216,0.980392157 +3007,10.11119143,7.812863375,11.51286338,277.4676384,226.771418,326.271418,35,0 +3012.87,14.55720498,10.0248636,16.5248636,517.6479836,167.2492532,724.8452532,78.14814815,6.296296296 +3018.09,15.74697245,13.85110662,16.95110662,611.4925851,274.8387783,766.6097783,84.65909091,13.63636364 +3032.62,11.67812973,11.12824103,13.62824103,286.8920677,254.7134115,325.2624115,67,0 +3036.23,11.66171778,10.56418278,13.46418278,272.6595232,213.7934661,309.7384661,53.84615385,0 +3039.226,10.69195982,8.031881386,11.43188139,276.2246887,254.6205721,313.1095721,45,0 +3041.46,12.36530266,10.82459376,13.82459376,276.8234217,194.6017892,323.7527892,67.30769231,0.769230769 +3043.01,12.13825477,10.36670347,14.16670347,275.3925674,232.7013732,334.2583732,77.18631179,1.901140684 +3045.5,13.57058672,9.536469703,15.9364697,328.4894906,186.2757183,610.0087183,95.03311258,10.92715232 +3049.62,12.3040879,9.574388585,13.87438858,226.3248378,205.9359822,244.0779822,67.15867159,1.10701107 +3053.54,12.30970668,10.56981307,14.46981307,271.0126678,208.9935109,338.1445109,66.37931034,0 +3059.16,12.943032,10.28257959,16.08257959,276.8656304,208.2136698,478.0866698,71.97231834,4.844290657 +3062.11,15.74784284,13.77180879,16.87180879,594.0715306,306.988177,732.109177,97.71863118,26.23574144 +3083.5,12.21386231,7.400431909,16.00043191,327.5545978,155.1463382,737.9023382,60.20761246,5.190311419 +3084.16,14.01814692,8.660280569,16.26028057,435.3211815,133.2196634,601.5996634,73.71134021,5.154639175 +3086.26,14.92698594,13.10083005,16.40083005,530.9980324,216.8111831,785.9681831,93.95973154,9.395973154 +3086.91,15.16807869,13.6543302,16.0543302,535.0995094,333.4888949,717.2488949,93.46153846,8.461538462 +3096.5,15.64614862,13.6101934,17.6101934,553.912204,289.9782584,721.7852584,97.76951673,15.98513011 +3105.95,15.83763666,13.84017671,17.84017671,597.1871807,314.4379203,746.2449203,98.94736842,13.68421053 +3114.22,14.40474543,10.41970636,16.21970636,423.9771389,227.4654017,696.3174017,83.56164384,3.196347032 +3128.14,14.11087172,9.675455032,17.17545503,426.5227259,234.9386294,696.0846294,92.54237288,5.084745763 +3134.845,12.97236058,9.707509516,19.40750952,309.8868776,228.0601277,504.6021277,74.35897436,0 +3134.85,13.88774076,8.377708921,16.27770892,474.2035036,228.2814052,696.6614052,75.65789474,5.592105263 +3137.16,11.62854455,9.463908694,17.16390869,280.8495687,222.5496298,461.8496298,68.96551724,0 +3144.66,12.66469468,10,14.4,212.9375654,196.218,229.67,74.28571429,5.714285714 +3158.16,15.56854179,13.80894381,17.80894381,536.45383,303.6154514,718.5934514,94.01993355,14.6179402 +3163.44,13.67570319,8.127359942,16.02735994,402.7134246,168.5463491,636.9263491,81.16438356,4.794520548 +3167.41,13.8514232,10.14785853,15.94785853,384.0654289,196.3350756,673.3820756,82.42424242,6.666666667 +3170.38,14.10070769,10.57608498,15.67608498,366.7552655,196.1131159,673.1601159,85.97785978,2.21402214 +3172.43,16.06129523,13.93191667,17.93191667,616.7442274,358.6889917,767.0179917,93.22709163,12.35059761 +3174.65,12.36021668,9.708159285,14.50815929,259.4344974,170.5315782,664.0715782,50.42016807,0.420168067 +3179.61,14.66293167,12.98042328,16.28042328,506.5424356,145.3593049,714.5163049,79.48717949,7.179487179 +3182.39,16.01693764,13.5606978,17.5606978,602.9306986,278.212753,769.983753,95.11400651,21.17263844 +3185.44,14.73317266,9.233078727,17.83307873,505.722155,237.5365346,795.1325346,80.56537102,7.77385159 +3191.63,12.57549897,10.16526214,16.36526214,256.3356144,226.0469259,319.3339259,73.80952381,3.571428571 +3199.25,14.11637666,9.926758088,15.72675809,433.9692212,142.1797503,610.5597503,86.99186992,14.22764228 +3209.28,12.93627814,10.14432775,15.94432775,327.0353323,240.014602,717.061602,74.22222222,7.555555556 +3218.1,12.71808306,9.987664012,14.48766401,234.8736749,215.9775266,255.6405266,71.1627907,0.465116279 +3220.86,12.27673574,10.18774634,14.68774634,223.0946894,199.6852146,240.1292146,58.69565217,0.434782609 +3227.36,12.22826425,10.64571147,14.74571147,238.9377585,205.5349985,297.7009985,53.84615385,0.480769231 +3237.89,13.5363081,10.23682717,16.03682717,335.6973178,228.6438924,705.6908924,76.8627451,4.31372549 +3241.77,13.65508259,10.29875723,16.09875723,375.0763788,187.1872939,683.0292939,70.73170732,4.87804878 +3246.05,16.04041016,14.11660766,17.51660766,585.8215772,312.3263916,744.1333916,94.91525424,6.101694915 +3247.46,13.06107431,9.84620649,15.64620649,323.7187552,203.4546605,680.5016605,84.9137931,2.586206897 +3248.22,14.29860762,13.01562186,16.11562186,503.8028015,357.8086919,670.6916919,68.22916667,10.41666667 +3253.7,11.93761888,10.39267118,14.49267118,245.1284594,210.1653205,302.3313205,53.24232082,1.365187713 +3255.45,13.86784371,10.0874558,15.9874558,393.9579578,145.6938992,645.9028992,83.20895522,2.23880597 +3256.525,11.97054429,8.3234958,16.2234958,263.5344627,193.6253784,463.4983784,75,0.704225352 +3262.88,12.19162666,8.552815233,15.45281523,300.4614191,196.8399137,690.3799137,61.05610561,2.640264026 +3273.04,11.63244507,9.696815091,13.79681509,298.8664916,227.4650529,685.3310529,43.34763948,0 +3274.56,12.79698358,10.29407631,16.49407631,302.2151527,217.9915303,713.8335303,72.76422764,2.43902439 +3279.63,12.06189725,10.10088146,16.00088146,272.3845232,226.6657871,315.3557871,74.41860465,5.426356589 +3287.16,8.748022535,2.603569276,12.20356928,270.818535,134.3633214,308.6483214,48,2.285714286 +3289.15,10.77987761,7.224082402,14.3240824,260.4353861,209.9971502,339.4041502,39.28571429,0 +3289.97,8.980355165,-0.270349231,14.92965077,277.4134559,197.7604202,324.3344202,42.94117647,1.764705882 +3292.34,10.16267786,7.32942415,11.82942415,279.3653233,244.8646955,332.7466955,46.57534247,1.369863014 +3294.455,10.25073231,6.447826977,13.54782698,280.9246571,222.5396231,351.9466231,42.07920792,0.99009901 +3295,9.157938269,6.148649307,10.34864931,255.7177361,217.5205338,279.7795338,39.49275362,2.173913043 +3296.41,9.568383236,7.665292907,11.86529291,264.1365967,206.1980151,305.6980151,23.65591398,0.537634409 +3297.3,12.00543687,10.61972571,15.11972571,231.8056244,203.5644061,241.7064061,55.93220339,0 +3298.1,6.342944524,0.65035142,10.15035142,264.4312584,138.0765714,335.2625714,21.6374269,0 +3299.6,7.271543222,-0.277863284,11.52213672,274.1582606,159.6663974,356.8523974,20.46511628,0 +3301,10.60115098,8.333767235,11.63376724,276.6614839,244.4482999,315.2532999,49.59349593,0.81300813 +3303.36,7.751102879,1.784838556,11.28483856,252.8852324,147.6585658,344.8445658,23.19587629,0.515463918 +3303.76,8.374719276,0.679307842,12.97930784,282.3056943,166.9241407,341.2091407,37.44680851,7.659574468 +3304.84,8.593303458,1.068397327,12.86839733,277.4195818,156.0014902,353.1874902,33.07086614,4.724409449 +3315.56,12.59419567,9.903499732,16.50349973,336.1786454,161.412241,719.008241,67.39130435,8.695652174 +3322.5,10.35753222,8.223635746,12.42363575,271.3170378,209.3084619,313.5554619,45.90909091,0.454545455 +3336.18,10.66731935,8.268458903,15.1684589,323.2932954,161.9148088,630.2948088,53.21100917,6.422018349 +3342.93,11.77702212,10.27725629,15.37725629,315.3882798,222.0120868,703.2220868,57.04225352,2.112676056 +3352.95,10.78092653,8.599728194,15.49972819,311.6806178,197.2062041,665.5862041,48.10606061,1.893939394 +3353.94,13.41328352,8.582804664,16.08280466,477.6495118,257.8997372,719.0457372,91.30434783,0 +3354.7,15.40987011,12.69866354,17.89866354,601.6301417,459.2490189,705.4820189,94.24657534,35.34246575 +3354.96,13.90497826,9.646217012,16.14621701,454.3681087,155.5463929,713.1423929,82.91457286,10.55276382 +3356.03,13.89432009,12.44293662,15.34293662,330.2535402,210.2351654,582.2171654,94.26229508,5.737704918 +3357.16,11.948322,9.188587065,14.68858707,332.6690618,272.2540335,376.5010335,66.42335766,5.109489051 +3360.38,10.10667603,8.299203229,12.49920323,272.2996509,201.6339796,328.6079796,47.77777778,0 +3366.83,11.81119922,9.87305463,14.97305463,296.393345,146.2338656,639.7738656,55.46218487,8.403361345 +3372,11.17899038,7.835383124,14.73538312,313.2282788,205.3548629,685.2958629,67.36111111,6.25 +3372.69,10.50908154,7.862800625,14.96280062,282.1485911,231.5867844,343.0887844,48.52941176,0.735294118 +3377.365,12.02851764,3.743145871,17.34314587,467.5478002,225.3943058,741.2343058,66.66666667,1.960784314 +3378.12,9.156183595,1.835601762,14.13560176,254.6401156,163.1418754,323.0868754,46.11872146,9.589041096 +3378.855,11.95658483,9.723968226,13.82396823,262.2479117,223.456203,315.622203,55,2.5 +3380.08,15.20000748,14.19345118,16.59345118,465.7812072,321.014076,599.709076,95.65217391,8.695652174 +3382.99,12.32519295,3.5,15.3,440.6009132,134.832,692.06,36,2 +3392.5,15.05636551,13.74242481,16.84242481,539.7624648,275.4990613,767.2700613,78.8,15.2 +3395.02,16.03443705,15.55678517,16.45678517,667.4123008,643.2931242,690.9661242,93.87755102,33.06122449 +3396.64,16.21954342,13.64472359,17.64472359,652.2300672,476.7845448,789.6675448,86.7816092,26.14942529 +3404.41,16.73754049,15.35893158,17.85893158,674.8272728,581.0376974,793.4846974,90.6122449,19.59183673 +3405.48,16.45426079,15.14093774,17.64093774,671.5638171,585.3968889,780.3398889,94.96402878,25.53956835 +3411.53,16.69797641,15.57321733,17.37321733,659.7371676,609.4088481,804.3518481,95.27559055,14.56692913 +3416,16.61480294,15.26032358,17.56032358,666.8456748,602.8583457,797.8013457,95.26184539,22.69326683 +3417.84,16.58152168,15.26190075,17.56190075,700.696439,616.0476897,810.4866897,83.65384615,16.34615385 +3420.63,12.91466109,10.81880397,15.61880397,344.4694433,238.2393916,718.1803916,67.22222222,2.777777778 +3425.15,13.8512192,10.164776,16.664776,421.7332034,165.3529774,734.5099774,72.18045113,6.766917293 +3428.35,13.19510579,9.814811694,15.61481169,427.5588668,228.2877731,708.2287731,71.42857143,6.12244898 +3430.8,15.13317704,12.06960648,16.56960648,600.2542714,432.2979151,710.8959151,75.41899441,11.17318436 +3437.4,15.89188738,14.0341969,16.1341969,649.4204495,421.8424927,684.2964927,83.76623377,13.63636364 +3445.21,12.531218,5.5,16.8,556.3508755,327.927,781.276,69.64285714,16.07142857 +3454.77,15.47375971,12.77816896,16.57816896,617.493121,449.358219,673.924219,95.45454545,47.9338843 +3463.21,13.01679122,10.2137544,15.5137544,467.5798147,248.4193567,740.1903567,75,20.3125 +3467.77,9.920290457,7.74042774,14.64042774,338.3122917,171.1521226,639.5321226,64.67391304,5.434782609 +3472.44,13.21608138,10.64047053,16.44047053,331.1652393,183.9453219,663.8863219,76.88442211,5.527638191 +3478.34,15.67859271,8.69848494,18.19848494,601.2825177,331.0482704,784.3972704,90.32258065,35.48387097 +3483.33,13.28258906,10.63066912,16.53066912,391.3058924,254.2963852,734.2373852,84.88372093,9.302325581 +3484.57,15.68461511,15.50580971,15.70580971,677.0939455,667.0581094,682.4411094,93.56223176,20.60085837 +3492.43,16.12237842,15.73482095,17.73482095,662.0495806,592.320535,677.437535,88.12785388,25.57077626 +3496.79,15.43042027,12.75421167,17.95421167,592.1995963,312.7829609,737.9039609,93.52750809,38.51132686 +3508.04,15.75344803,15.57893008,15.77893008,666.4727882,656.7985317,672.1815317,93.72197309,20.1793722 +3510.78,15.42821946,12.60782086,17.80782086,597.415749,462.7272357,698.8172357,92.08633094,34.5323741 +3515.71,16.43938787,15.26272745,17.56272745,638.39585,582.9074835,700.5534835,93.27731092,24.3697479 +3518.43,15.25125723,11.5,15.8,620.8307279,290.686,671.954,87.20379147,15.63981043 +3523.36,13.01129893,10.3,15.4,317.7661757,212.119,638.561,89.55223881,11.04477612 +3526.4,15.32298322,12.16287256,17.36287256,621.7719422,497.6688496,743.9018496,83.47107438,41.73553719 +3535.55,16.30099144,13.91987261,17.51987261,630.333045,362.6924432,771.0214432,93.50649351,10.38961039 +3541.45,15.16989631,12.70856534,17.50856534,516.3063282,197.6155708,649.4435708,84.90566038,28.30188679 +3552.77,12.04930127,10.3,15.1,372.6179905,212.119,692.06,77.27272727,4.545454545 +3561.48,15.68987675,10.96977619,17.66977619,649.845366,327.3496273,788.4356273,75.86206897,17.24137931