diff --git a/.travis.yml b/.travis.yml index b8de584..16bd936 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,7 +25,7 @@ install: # We just set up a conda environment with the right Python version. This # should not need changing. - - conda create --yes -n test python=$TRAVIS_PYTHON_VERSION seaborn statsmodels numexpr openpyxl pyodbc nose mock + - conda create --yes -n test python=$TRAVIS_PYTHON_VERSION pandas=0.17 seaborn statsmodels numexpr openpyxl pyodbc nose mock - source activate test - conda install --yes --channel=phobson pybmpdb pynsqd - conda install --yes coverage docopt requests pyyaml @@ -33,7 +33,7 @@ install: - pip install . script: - - python tests.py --with-coverage --cover-package=pycvc --verbose + - python check_pycvc.py --verbose after_success: - if [ ${COVERAGE} = true ]; then coveralls; fi diff --git a/tests.py b/check_pycvc.py similarity index 100% rename from tests.py rename to check_pycvc.py diff --git a/conda.recipe/dev/meta.yaml b/conda.recipe/dev/meta.yaml index 73e425a..ca7c55a 100644 --- a/conda.recipe/dev/meta.yaml +++ b/conda.recipe/dev/meta.yaml @@ -15,7 +15,8 @@ requirements: build: - python - setuptools - - wqio + - pandas=0.17 + - wqio=0.3.2 - pybmpdb - pynsqd - pyodbc @@ -24,7 +25,8 @@ requirements: run: - python - - wqio + - pandas=0.17 + - wqio=0.3.2 - pybmpdb - pynsqd - pyodbc diff --git a/conda.recipe/release/meta.yaml b/conda.recipe/release/meta.yaml index 2b7ce20..1ab9cd4 100644 --- a/conda.recipe/release/meta.yaml +++ b/conda.recipe/release/meta.yaml @@ -16,7 +16,8 @@ requirements: build: - python - setuptools - - wqio + - pandas=0.17 + - wqio=0.3.2 - pybmpdb - pynsqd - pyodbc @@ -25,7 +26,8 @@ requirements: run: - python - - wqio + - pandas=0.17 + - wqio=0.3.2 - pybmpdb - pynsqd - pyodbc diff --git a/examples/1a - Prepare Tidy Data (simple method).ipynb b/examples/1a - Prepare Tidy Data (simple method).ipynb index 2978f6d..821b823 100644 --- a/examples/1a - Prepare Tidy Data (simple method).ipynb +++ b/examples/1a - Prepare Tidy Data (simple method).ipynb @@ -95,7 +95,7 @@ "outputs": [], "source": [ "cvcdbfile = \"C:/users/phobson/Desktop/scratch/cvc/cvc.accdb\"\n", - "cvcdb = pycvc.Database(cvcdbfile, nsqdata, bmpdb, testing=False)" + "cvcdb = pycvc.Database(cvcdbfile, nsqdata, bmpdb)" ] }, { @@ -380,6 +380,9 @@ "metadata": {}, "source": [ "## Export project-wide tidy datasets\n", + "No decisions are made about excluding exceptional storm events at thise point.\n", + "\n", + "That is deffered to when the data is loaded in other notebooks.\n", "\n", "### Hydrologic (storm) data" ] @@ -433,7 +436,8 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false + "collapsed": false, + "scrolled": true }, "outputs": [], "source": [ diff --git a/examples/1b - Prepare Tidy Data (SWMM models).ipynb b/examples/1b - Prepare Tidy Data (SWMM models).ipynb index 6a51e1e..8b18f62 100644 --- a/examples/1b - Prepare Tidy Data (SWMM models).ipynb +++ b/examples/1b - Prepare Tidy Data (SWMM models).ipynb @@ -95,7 +95,7 @@ "outputs": [], "source": [ "cvcdbfile = \"C:/users/phobson/Desktop/scratch/cvc/cvc.accdb\"\n", - "cvcdb = pycvc.Database(cvcdbfile, nsqdata, bmpdb, testing=False)" + "cvcdb = pycvc.Database(cvcdbfile, nsqdata, bmpdb)" ] }, { @@ -274,7 +274,7 @@ " return newcol.replace(' nsqd ', ' ').replace(' effluent ', ' ')\n", "\n", "LV_Influent = (\n", - " LV1.medians(\"concentration\", timegroup='season')\n", + " LV1.medians(\"concentration\", groupby_col='season')\n", " .rename(columns={'effluent stat': 'median'})\n", " .rename(columns=rename_influent_cols)\n", ")\n", diff --git a/examples/3 - Water Quality Summaries.ipynb b/examples/3 - Water Quality Summaries.ipynb index ce56f4f..1cac2d9 100644 --- a/examples/3 - Water Quality Summaries.ipynb +++ b/examples/3 - Water Quality Summaries.ipynb @@ -353,17 +353,6 @@ "### Boxplots with external sources" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "bmptidy.head()\n" - ] - }, { "cell_type": "code", "execution_count": null, diff --git a/examples/4 - Storm Depth Histograms Examples.ipynb b/examples/4 - Storm Depth Histograms Examples.ipynb index 8dc8c72..f4f8e4f 100644 --- a/examples/4 - Storm Depth Histograms Examples.ipynb +++ b/examples/4 - Storm Depth Histograms Examples.ipynb @@ -65,7 +65,8 @@ }, "outputs": [], "source": [ - "pycvc.viz.hydro_histogram(hydro, hue='site', row='has_outflow')" + "fg = pycvc.viz.hydro_histogram(hydro, hue='site', row='has_outflow', save=False)\n", + "pycvc.viz.savefig(fg.fig, 'Hist_Site_Outflow', extra='HydroHistogram')" ] }, { @@ -80,13 +81,15 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false + "collapsed": false, + "scrolled": true }, "outputs": [], "source": [ - "pycvc.viz.hydro_histogram(hydro, row='site', col='has_outflow', hue='season',\n", + "fg = pycvc.viz.hydro_histogram(hydro, row='site', col='has_outflow', hue='season',\n", " hue_order=['winter', 'spring', 'summer', 'autumn'],\n", - " margin_titles=True, palette='BrBG_r')\n" + " margin_titles=True, palette='BrBG_r', save=False)\n", + "pycvc.viz.savefig(fg.fig, 'Hist_Site_Outflow_Season', extra='HydroHistogram')" ] }, { @@ -104,7 +107,8 @@ }, "outputs": [], "source": [ - "pycvc.viz.hydro_histogram(hydro, col='site', hue='year', col_wrap=2)" + "fg = pycvc.viz.hydro_histogram(hydro, col='site', hue='year', col_wrap=2, save=False)\n", + "pycvc.viz.savefig(fg.fig, 'Hist_Site_Year', extra='HydroHistogram')" ] }, { @@ -122,7 +126,8 @@ }, "outputs": [], "source": [ - "pycvc.viz.hydro_histogram(hydro.query(\"site == 'ED-1'\"), palette='Blues')" + "fg = pycvc.viz.hydro_histogram(hydro.query(\"site == 'ED-1'\"), palette='Blues', save=False)\n", + "pycvc.viz.savefig(fg.fig, 'Hist_ED1only', extra='HydroHistogram')" ] } ], diff --git a/examples/medians/0 - Setup NSQD Median computation.ipynb b/examples/medians/0 - Setup NSQD Median computation.ipynb new file mode 100644 index 0000000..9793a12 --- /dev/null +++ b/examples/medians/0 - Setup NSQD Median computation.ipynb @@ -0,0 +1,282 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load, filter, export the NSQD Dataset\n", + "The cell below imports the libaries we need and defines some function that help up clean up the NSQD" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy \n", + "\n", + "import wqio\n", + "import pynsqd\n", + "import pycvc\n", + "\n", + "def get_cvc_parameter(nsqdparam):\n", + " try:\n", + " cvcparam = list(filter(\n", + " lambda p: p['nsqdname'] == nsqdparam, pycvc.info.POC_dicts\n", + " ))[0]['cvcname']\n", + " except IndexError:\n", + " cvcparam = numpy.nan\n", + " return cvcparam\n", + "\n", + "\n", + "def fix_nsqd_bacteria_units(df, unitscol='units'):\n", + " df[unitscol] = df[unitscol].replace(to_replace='MPN/100 mL', value='CFU/100 mL')\n", + " return df\n", + "\n", + "\n", + "nsqd_params = [\n", + " p['nsqdname'] \n", + " for p in pycvc.info.POC_dicts\n", + "]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create a raw data set, then compute season and apply *basic* filters\n", + "(also export to CSV file)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "raw_data = pynsqd.NSQData().data\n", + "\n", + "clean_data = (\n", + " raw_data\n", + " .query(\"primary_landuse != 'Unknown'\")\n", + " .query(\"parameter in @nsqd_params\")\n", + " .query(\"fraction == 'Total'\")\n", + " .query(\"epa_rain_zone == 1\")\n", + " .assign(station='outflow')\n", + " .assign(cvcparam=lambda df: df['parameter'].apply(get_cvc_parameter))\n", + " .assign(season=lambda df: df['start_date'].apply(wqio.utils.getSeason))\n", + " .drop('parameter', axis=1)\n", + " .rename(columns={'cvcparam': 'parameter'})\n", + " .pipe(fix_nsqd_bacteria_units)\n", + " .query(\"primary_landuse == 'Residential'\")\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Show the sample counts for each parameter" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
seasonautumnspringsummerwinter
parameter
Cadmium (Cd)35354922
Copper (Cu)6110510629
Dissolved Chloride (Cl)91216NaN
Escherichia coli4735
Lead (Pb)58858131
Nickel (Ni)119107
Nitrate + Nitrite9712315329
Orthophosphate (P)5855
Total Kjeldahl Nitrogen (TKN)9912415637
Total Oil & Grease51245
Total Phosphorus11517420341
Total Suspended Solids10415118535
Zinc (Zn)6410112529
\n", + "
" + ], + "text/plain": [ + "season autumn spring summer winter\n", + "parameter \n", + "Cadmium (Cd) 35 35 49 22\n", + "Copper (Cu) 61 105 106 29\n", + "Dissolved Chloride (Cl) 9 12 16 NaN\n", + "Escherichia coli 4 7 3 5\n", + "Lead (Pb) 58 85 81 31\n", + "Nickel (Ni) 11 9 10 7\n", + "Nitrate + Nitrite 97 123 153 29\n", + "Orthophosphate (P) 5 8 5 5\n", + "Total Kjeldahl Nitrogen (TKN) 99 124 156 37\n", + "Total Oil & Grease 5 12 4 5\n", + "Total Phosphorus 115 174 203 41\n", + "Total Suspended Solids 104 151 185 35\n", + "Zinc (Zn) 64 101 125 29" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "clean_data.groupby(by=['parameter', 'season']).size().unstack(level='season')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Export TSS to a CSV file" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "(\n", + " clean_data\n", + " .query(\"parameter == 'Total Suspended Solids'\")\n", + " .to_csv('NSQD_Res_TSS.csv', index=False)\n", + ")" + ] + } + ], + "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.4.4" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/examples/medians/1 - Compute Seasonal Medians with Raw Python.ipynb b/examples/medians/1 - Compute Seasonal Medians with Raw Python.ipynb new file mode 100644 index 0000000..173e423 --- /dev/null +++ b/examples/medians/1 - Compute Seasonal Medians with Raw Python.ipynb @@ -0,0 +1,222 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Compute Seasonal TSS Medians without fancy ROS or bootstrapping\n", + "### Load the data" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import pandas\n", + "\n", + "tss = pandas.read_csv(\"NSQD_Res_TSS.csv\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Compute the medians for each season *without* dropping duplicates" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
parameterunitsseasonres
0Total Suspended Solidsmg/Lautumn55
1Total Suspended Solidsmg/Lspring100
2Total Suspended Solidsmg/Lsummer93
3Total Suspended Solidsmg/Lwinter92
\n", + "
" + ], + "text/plain": [ + " parameter units season res\n", + "0 Total Suspended Solids mg/L autumn 55\n", + "1 Total Suspended Solids mg/L spring 100\n", + "2 Total Suspended Solids mg/L summer 93\n", + "3 Total Suspended Solids mg/L winter 92" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "medians = (\n", + " tss.groupby(by=['parameter', 'units', 'season'])\n", + " .median()['res']\n", + " .reset_index()\n", + ")\n", + "\n", + "medians" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Compute the medians for each season *after* dropping duplicate records" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
parameterunitsseasonres
0Total Suspended Solidsmg/Lautumn53.0
1Total Suspended Solidsmg/Lspring100.0
2Total Suspended Solidsmg/Lsummer94.2
3Total Suspended Solidsmg/Lwinter92.0
\n", + "
" + ], + "text/plain": [ + " parameter units season res\n", + "0 Total Suspended Solids mg/L autumn 53.0\n", + "1 Total Suspended Solids mg/L spring 100.0\n", + "2 Total Suspended Solids mg/L summer 94.2\n", + "3 Total Suspended Solids mg/L winter 92.0" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "index_cols = [\n", + " 'epa_rain_zone', 'location_code', 'station_name', 'primary_landuse',\n", + " 'start_date', 'season', 'station', 'parameter', 'units',\n", + "]\n", + "\n", + "medians = (\n", + " tss.groupby(by=index_cols)\n", + " .first()\n", + " .reset_index()\n", + " .groupby(by=['parameter', 'units', 'season'])\n", + " .median()['res']\n", + " .reset_index()\n", + ")\n", + "\n", + "medians\n" + ] + } + ], + "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.4.4" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/examples/medians/2 - Compute Seasonal Medians with R.ipynb b/examples/medians/2 - Compute Seasonal Medians with R.ipynb new file mode 100644 index 0000000..2b0cd90 --- /dev/null +++ b/examples/medians/2 - Compute Seasonal Medians with R.ipynb @@ -0,0 +1,122 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Compute Seasonal TSS Medians without fancy ROS or bootstrapping\n", + "### Load the data" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "Attaching package: 'dplyr'\n", + "\n", + "The following objects are masked from 'package:stats':\n", + "\n", + " filter, lag\n", + "\n", + "The following objects are masked from 'package:base':\n", + "\n", + " intersect, setdiff, setequal, union\n", + "\n" + ] + } + ], + "source": [ + "library(\"dplyr\")\n", + "library(\"readr\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Compute the medians for each season" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "
parameterunitsseasonmedian(res)
1Total Suspended Solidsmg/Lautumn55
2Total Suspended Solidsmg/Lspring100
3Total Suspended Solidsmg/Lsummer93
4Total Suspended Solidsmg/Lwinter92
\n" + ], + "text/latex": [ + "\\begin{tabular}{r|llll}\n", + " & parameter & units & season & median(res)\\\\\n", + "\\hline\n", + "\t1 & Total Suspended Solids & mg/L & autumn & 55\\\\\n", + "\t2 & Total Suspended Solids & mg/L & spring & 100\\\\\n", + "\t3 & Total Suspended Solids & mg/L & summer & 93\\\\\n", + "\t4 & Total Suspended Solids & mg/L & winter & 92\\\\\n", + "\\end{tabular}\n" + ], + "text/plain": [ + "Source: local data frame [4 x 4]\n", + "Groups: parameter, units [?]\n", + "\n", + " parameter units season median(res)\n", + " (chr) (chr) (chr) (dbl)\n", + "1 Total Suspended Solids mg/L autumn 55\n", + "2 Total Suspended Solids mg/L spring 100\n", + "3 Total Suspended Solids mg/L summer 93\n", + "4 Total Suspended Solids mg/L winter 92" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "medians <- readr::read_csv(\"NSQD_Res_TSS.csv\") %>% \n", + " dplyr::group_by(parameter, units, season) %>% \n", + " summarize(median(res))\n", + "\n", + "medians" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "R", + "language": "R", + "name": "ir" + }, + "language_info": { + "codemirror_mode": "r", + "file_extension": ".r", + "mimetype": "text/x-r-source", + "name": "R", + "pygments_lexer": "r", + "version": "3.1.3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/examples/medians/NSQD_Res_TSS.csv b/examples/medians/NSQD_Res_TSS.csv new file mode 100644 index 0000000..be36be5 --- /dev/null +++ b/examples/medians/NSQD_Res_TSS.csv @@ -0,0 +1,476 @@ +epa_rain_zone,state,location_code,station_name,jurisdiction_county,jurisdiction_city,primary_landuse,secondary_landuse,percent_impervious,start_date,days since last rain,precipitation_depth_(in),season,fraction,units,res,qual,drainage_area_acres,latitude,longitude,station,parameter +1,IL,ILDPLAE1,Lake_Ellyn_1_Inflow_Lake_Ellyn,Du_Page_County,Glen_Ellyn,Residential,Commercial,34.0,1980-04-03,,,spring,Total,mg/L,230.0,=,534.0,41.88388889,88.06055556,outflow,Total Suspended Solids +1,IL,ILDPLAE1,Lake_Ellyn_1_Inflow_Lake_Ellyn,Du_Page_County,Glen_Ellyn,Residential,Commercial,34.0,1980-05-17,,0.649999934,spring,Total,mg/L,250.0,=,534.0,41.88388889,88.06055556,outflow,Total Suspended Solids +1,IL,ILDPLAE1,Lake_Ellyn_1_Inflow_Lake_Ellyn,Du_Page_County,Glen_Ellyn,Residential,Commercial,34.0,1980-05-28,,0.40999998299999996,spring,Total,mg/L,190.0,=,534.0,41.88388889,88.06055556,outflow,Total Suspended Solids +1,IL,ILDPLAE1,Lake_Ellyn_1_Inflow_Lake_Ellyn,Du_Page_County,Glen_Ellyn,Residential,Commercial,34.0,1980-07-09,,0.28,summer,Total,mg/L,240.0,=,534.0,41.88388889,88.06055556,outflow,Total Suspended Solids +1,IL,ILDPLAE1,Lake_Ellyn_1_Inflow_Lake_Ellyn,Du_Page_County,Glen_Ellyn,Residential,Commercial,34.0,1980-07-20,,0.620000006,summer,Total,mg/L,100.0,=,534.0,41.88388889,88.06055556,outflow,Total Suspended Solids +1,IL,ILDPLAE1,Lake_Ellyn_1_Inflow_Lake_Ellyn,Du_Page_County,Glen_Ellyn,Residential,Commercial,34.0,1980-08-04,,1.459999986,summer,Total,mg/L,120.0,=,534.0,41.88388889,88.06055556,outflow,Total Suspended Solids +1,IL,ILDPLAE1,Lake_Ellyn_1_Inflow_Lake_Ellyn,Du_Page_County,Glen_Ellyn,Residential,Commercial,34.0,1980-08-19,,0.740000056,summer,Total,mg/L,92.0,=,534.0,41.88388889,88.06055556,outflow,Total Suspended Solids +1,IL,ILDPLAE1,Lake_Ellyn_1_Inflow_Lake_Ellyn,Du_Page_County,Glen_Ellyn,Residential,Commercial,34.0,1980-09-22,,0.7200000040000001,autumn,Total,mg/L,79.0,=,534.0,41.88388889,88.06055556,outflow,Total Suspended Solids +1,IL,ILDPLAE1,Lake_Ellyn_1_Inflow_Lake_Ellyn,Du_Page_County,Glen_Ellyn,Residential,Commercial,34.0,1980-10-24,,0.450000012,autumn,Total,mg/L,200.0,=,534.0,41.88388889,88.06055556,outflow,Total Suspended Solids +1,IL,ILDPLAE1,Lake_Ellyn_1_Inflow_Lake_Ellyn,Du_Page_County,Glen_Ellyn,Residential,Commercial,34.0,1980-12-07,,1.090000032,autumn,Total,mg/L,310.0,=,534.0,41.88388889,88.06055556,outflow,Total Suspended Solids +1,IL,ILDPLAE1,Lake_Ellyn_1_Inflow_Lake_Ellyn,Du_Page_County,Glen_Ellyn,Residential,Commercial,34.0,1981-02-16,,0.420000009,winter,Total,mg/L,1100.0,=,534.0,41.88388889,88.06055556,outflow,Total Suspended Solids +1,IL,ILDPLAE1,Lake_Ellyn_1_Inflow_Lake_Ellyn,Du_Page_County,Glen_Ellyn,Residential,Commercial,34.0,1981-02-22,,1.6900000990000001,winter,Total,mg/L,52.0,=,534.0,41.88388889,88.06055556,outflow,Total Suspended Solids +1,IL,ILDPLAE1,Lake_Ellyn_1_Inflow_Lake_Ellyn,Du_Page_County,Glen_Ellyn,Residential,Commercial,34.0,1981-04-03,,0.380000017,spring,Total,mg/L,220.0,=,534.0,41.88388889,88.06055556,outflow,Total Suspended Solids +1,IL,ILDPLAE1,Lake_Ellyn_1_Inflow_Lake_Ellyn,Du_Page_County,Glen_Ellyn,Residential,Commercial,34.0,1981-04-22,,0.7800000109999999,spring,Total,mg/L,450.0,=,534.0,41.88388889,88.06055556,outflow,Total Suspended Solids +1,IL,ILDPLAE1,Lake_Ellyn_1_Inflow_Lake_Ellyn,Du_Page_County,Glen_Ellyn,Residential,Commercial,34.0,1981-04-28,,,spring,Total,mg/L,170.0,=,534.0,41.88388889,88.06055556,outflow,Total Suspended Solids +1,IL,ILDPLAE1,Lake_Ellyn_1_Inflow_Lake_Ellyn,Du_Page_County,Glen_Ellyn,Residential,Commercial,34.0,1981-05-10,,0.460000001,spring,Total,mg/L,470.0,=,534.0,41.88388889,88.06055556,outflow,Total Suspended Solids +1,IL,ILDPLAE1,Lake_Ellyn_1_Inflow_Lake_Ellyn,Du_Page_County,Glen_Ellyn,Residential,Commercial,34.0,1981-05-29,,0.5400000220000001,spring,Total,mg/L,69.0,=,534.0,41.88388889,88.06055556,outflow,Total Suspended Solids +1,IL,ILDPLAE1,Lake_Ellyn_1_Inflow_Lake_Ellyn,Du_Page_County,Glen_Ellyn,Residential,Commercial,34.0,1981-06-08,,,spring,Total,mg/L,330.0,=,534.0,41.88388889,88.06055556,outflow,Total Suspended Solids +1,IN,ININBAR1,Basin_R1_control,Marion_County,Indianapolis,Residential,,,1999-10-08,,,autumn,Total,mg/L,25.0,=,8.36,39.75716944,85.97535278,outflow,Total Suspended Solids +1,IN,ININBAR1,Basin_R1_control,Marion_County,Indianapolis,Residential,,,2000-02-03,,,winter,Total,mg/L,18.5,=,8.36,39.75716944,85.97535278,outflow,Total Suspended Solids +1,IN,ININBAR1,Basin_R1_control,Marion_County,Indianapolis,Residential,,,2000-05-17,,,spring,Total,mg/L,31.2,=,8.36,39.75716944,85.97535278,outflow,Total Suspended Solids +1,IN,ININBAR1,Basin_R1_control,Marion_County,Indianapolis,Residential,,,2000-09-20,,,summer,Total,mg/L,53.8,=,8.36,39.75716944,85.97535278,outflow,Total Suspended Solids +1,IN,ININBAR1,Basin_R1_control,Marion_County,Indianapolis,Residential,,,2001-01-29,,,winter,Total,mg/L,33.0,=,8.36,39.75716944,85.97535278,outflow,Total Suspended Solids +1,IN,ININBAR1,Basin_R1_control,Marion_County,Indianapolis,Residential,,,2001-02-22,,,winter,Total,mg/L,33.0,=,8.36,39.75716944,85.97535278,outflow,Total Suspended Solids +1,IN,ININBAR1,Basin_R1_control,Marion_County,Indianapolis,Residential,,,2001-05-25,,,spring,Total,mg/L,14.3,=,8.36,39.75716944,85.97535278,outflow,Total Suspended Solids +1,IN,ININBAR1,Basin_R1_control,Marion_County,Indianapolis,Residential,,,2001-10-01,,,autumn,Total,mg/L,3.0,=,8.36,39.75716944,85.97535278,outflow,Total Suspended Solids +1,IN,ININBAR1,Basin_R1_control,Marion_County,Indianapolis,Residential,,,2003-10-14,,,autumn,Total,mg/L,11.0,=,8.36,39.75716944,85.97535278,outflow,Total Suspended Solids +1,IN,ININBAR2,Basin_R2_test,Marion_County,Indianapolis,Residential,,,1999-10-08,,,autumn,Total,mg/L,21.0,=,13.41,39.76257222,85.97841667,outflow,Total Suspended Solids +1,IN,ININBAR2,Basin_R2_test,Marion_County,Indianapolis,Residential,,,2000-02-03,,,winter,Total,mg/L,52.2,=,13.41,39.76257222,85.97841667,outflow,Total Suspended Solids +1,IN,ININBAR2,Basin_R2_test,Marion_County,Indianapolis,Residential,,,2000-05-17,,,spring,Total,mg/L,41.0,=,13.41,39.76257222,85.97841667,outflow,Total Suspended Solids +1,IN,ININBAR2,Basin_R2_test,Marion_County,Indianapolis,Residential,,,2000-09-20,,,summer,Total,mg/L,4.3,=,13.41,39.76257222,85.97841667,outflow,Total Suspended Solids +1,IN,ININBAR2,Basin_R2_test,Marion_County,Indianapolis,Residential,,,2001-01-29,,,winter,Total,mg/L,64.8,=,13.41,39.76257222,85.97841667,outflow,Total Suspended Solids +1,IN,ININBAR2,Basin_R2_test,Marion_County,Indianapolis,Residential,,,2001-02-22,,,winter,Total,mg/L,64.8,=,13.41,39.76257222,85.97841667,outflow,Total Suspended Solids +1,IN,ININBAR2,Basin_R2_test,Marion_County,Indianapolis,Residential,,,2001-05-25,,,spring,Total,mg/L,2.0,=,13.41,39.76257222,85.97841667,outflow,Total Suspended Solids +1,IN,ININBAR2,Basin_R2_test,Marion_County,Indianapolis,Residential,,,2001-10-01,,,autumn,Total,mg/L,3.0,=,13.41,39.76257222,85.97841667,outflow,Total Suspended Solids +1,IN,ININBAR2,Basin_R2_test,Marion_County,Indianapolis,Residential,,,2003-10-14,,,autumn,Total,mg/L,34.0,=,13.41,39.76257222,85.97841667,outflow,Total Suspended Solids +1,MA,MABOA001,Charlestown_29J212,Suffollk_County,City_of_Boston,Residential,Open Space,74.0,1992-04-11,10,0.24,spring,Total,mg/L,14.0,=,40.4,42.38388889,71.07241667,outflow,Total Suspended Solids +1,MA,MABOA001,Charlestown_29J212,Suffollk_County,City_of_Boston,Residential,Open Space,74.0,1992-07-23,,0.37,summer,Total,mg/L,28.0,=,40.4,42.38388889,71.07241667,outflow,Total Suspended Solids +1,MA,MABOA001,Charlestown_29J212,Suffollk_County,City_of_Boston,Residential,Open Space,74.0,1992-08-14,,0.31,summer,Total,mg/L,48.0,=,40.4,42.38388889,71.07241667,outflow,Total Suspended Solids +1,MA,MABOA002,West_Roxebury_13D077_078,Suffollk_County,City_of_Boston,Residential,,52.0,1992-04-17,3,0.77,spring,Total,mg/L,20.0,=,86.7,42.29588889,71.14858333,outflow,Total Suspended Solids +1,MA,MABOA002,West_Roxebury_13D077_078,Suffollk_County,City_of_Boston,Residential,,52.0,1992-06-01,6,1.77,spring,Total,mg/L,76.0,=,86.7,42.29588889,71.14858333,outflow,Total Suspended Solids +1,MA,MABOA002,West_Roxebury_13D077_078,Suffollk_County,City_of_Boston,Residential,,52.0,1992-06-24,3,0.38,summer,Total,mg/L,24.0,=,86.7,42.29588889,71.14858333,outflow,Total Suspended Solids +1,MA,MABOA002,West_Roxebury_13D077_078,Suffollk_County,City_of_Boston,Residential,,52.0,1997-04-17,,0.67,spring,Total,mg/L,41.0,=,86.7,42.29588889,71.14858333,outflow,Total Suspended Solids +1,MA,MABOA002,West_Roxebury_13D077_078,Suffollk_County,City_of_Boston,Residential,,52.0,1997-08-13,,0.71,summer,Total,mg/L,66.0,=,86.7,42.29588889,71.14858333,outflow,Total Suspended Solids +1,MA,MABOA002,West_Roxebury_13D077_078,Suffollk_County,City_of_Boston,Residential,,52.0,1997-08-20,,0.92,summer,Total,mg/L,12.0,=,86.7,42.29588889,71.14858333,outflow,Total Suspended Solids +1,MA,MABOA002,West_Roxebury_13D077_078,Suffollk_County,City_of_Boston,Residential,,52.0,1997-10-25,,0.84,autumn,Total,mg/L,28.0,=,86.7,42.29588889,71.14858333,outflow,Total Suspended Solids +1,MA,MABOA002,West_Roxebury_13D077_078,Suffollk_County,City_of_Boston,Residential,,52.0,1997-10-27,,0.68,autumn,Total,mg/L,11.0,=,86.7,42.29588889,71.14858333,outflow,Total Suspended Solids +1,MA,MABOA002,West_Roxebury_13D077_078,Suffollk_County,City_of_Boston,Residential,,52.0,1997-11-01,,1.55,autumn,Total,mg/L,37.0,=,86.7,42.29588889,71.14858333,outflow,Total Suspended Solids +1,MA,MABOA002,West_Roxebury_13D077_078,Suffollk_County,City_of_Boston,Residential,,52.0,1997-11-22,,0.84,autumn,Total,mg/L,40.0,=,86.7,42.29588889,71.14858333,outflow,Total Suspended Solids +1,MA,MABOA002,West_Roxebury_13D077_078,Suffollk_County,City_of_Boston,Residential,,52.0,1997-11-23,,0.84,autumn,Total,mg/L,10.0,=,86.7,42.29588889,71.14858333,outflow,Total Suspended Solids +1,MA,MABOA002,West_Roxebury_13D077_078,Suffollk_County,City_of_Boston,Residential,,52.0,1998-01-07,,2.13,winter,Total,mg/L,12.0,=,86.7,42.29588889,71.14858333,outflow,Total Suspended Solids +1,MA,MABOA002,West_Roxebury_13D077_078,Suffollk_County,City_of_Boston,Residential,,52.0,1998-01-23,,3.28,winter,Total,mg/L,25.0,=,86.7,42.29588889,71.14858333,outflow,Total Suspended Solids +1,MA,MABOA002,West_Roxebury_13D077_078,Suffollk_County,City_of_Boston,Residential,,52.0,1998-02-11,,0.94,winter,Total,mg/L,92.0,=,86.7,42.29588889,71.14858333,outflow,Total Suspended Solids +1,MA,MABOA002,West_Roxebury_13D077_078,Suffollk_County,City_of_Boston,Residential,,52.0,1998-03-18,,1.48,winter,Total,mg/L,18.0,=,86.7,42.29588889,71.14858333,outflow,Total Suspended Solids +1,MA,MABOA006,Mount_Vernon_26K099,Suffollk_County,City_of_Boston,Residential,,74.0,2001-06-02,,0.85,spring,Total,mg/L,20.0,=,3.3,42.37619444,71.05944444,outflow,Total Suspended Solids +1,MA,MABOA006,Mount_Vernon_26K099,Suffollk_County,City_of_Boston,Residential,,74.0,2001-06-11,,0.2,spring,Total,mg/L,35.0,=,3.3,42.37619444,71.05944444,outflow,Total Suspended Solids +1,MA,MABOA006,Mount_Vernon_26K099,Suffollk_County,City_of_Boston,Residential,,74.0,2001-07-17,,0.1,summer,Total,mg/L,6.0,=,3.3,42.37619444,71.05944444,outflow,Total Suspended Solids +1,MA,MABOF208,5F208_HydeParkAve_Hyde_Park,Suffollk_County,City_of_Boston,Residential,Institutional,,2003-04-11,,2.35,spring,Total,mg/L,125.0,=,19.0,42.23788889,71.12944444,outflow,Total Suspended Solids +1,MA,MABOF208,5F208_HydeParkAve_Hyde_Park,Suffollk_County,City_of_Boston,Residential,Institutional,,2003-04-22,,0.59,spring,Total,mg/L,86.0,=,19.0,42.23788889,71.12944444,outflow,Total Suspended Solids +1,MA,MABOF208,5F208_HydeParkAve_Hyde_Park,Suffollk_County,City_of_Boston,Residential,Institutional,,2003-04-26,,0.82,spring,Total,mg/L,50.0,=,19.0,42.23788889,71.12944444,outflow,Total Suspended Solids +1,MA,MABOF208,5F208_HydeParkAve_Hyde_Park,Suffollk_County,City_of_Boston,Residential,Institutional,,2004-04-25,,0.97,spring,Total,mg/L,37.0,=,19.0,42.23788889,71.12944444,outflow,Total Suspended Solids +1,MA,MABOF208,5F208_HydeParkAve_Hyde_Park,Suffollk_County,City_of_Boston,Residential,Institutional,,2004-05-03,,1.01,spring,Total,mg/L,15.0,=,19.0,42.23788889,71.12944444,outflow,Total Suspended Solids +1,MA,MABOF208,5F208_HydeParkAve_Hyde_Park,Suffollk_County,City_of_Boston,Residential,Institutional,,2004-07-24,,1.44,summer,Total,mg/L,75.0,=,19.0,42.23788889,71.12944444,outflow,Total Suspended Solids +1,MA,MABOK397,27K397_Mount_Vernon_St_Charlestown,Suffollk_County,City_of_Boston,Residential,,,2002-03-03,,0.56,winter,Total,mg/L,16.5,=,2.1,42.37619444,71.05944444,outflow,Total Suspended Solids +1,MA,MABOK397,27K397_Mount_Vernon_St_Charlestown,Suffollk_County,City_of_Boston,Residential,,,2002-04-25,,0.8,spring,Total,mg/L,38.0,=,2.1,42.37619444,71.05944444,outflow,Total Suspended Solids +1,MA,MABOK397,27K397_Mount_Vernon_St_Charlestown,Suffollk_County,City_of_Boston,Residential,,,2002-04-28,,0.21,spring,Total,mg/L,18.0,=,2.1,42.37619444,71.05944444,outflow,Total Suspended Solids +1,MA,MALQP1JO,P1_Jordan_Pond_Inlet,Worcester_County,Lake Quinsigamond,Residential,Commercial,21.0,1980-06-29,,,summer,Total,mg/L,32.0,=,110.0,42.26994444,71.74636111,outflow,Total Suspended Solids +1,MA,MALQP1JO,P1_Jordan_Pond_Inlet,Worcester_County,Lake Quinsigamond,Residential,Commercial,21.0,1980-07-08,,,summer,Total,mg/L,57.0,=,110.0,42.26994444,71.74636111,outflow,Total Suspended Solids +1,MA,MALQP1JO,P1_Jordan_Pond_Inlet,Worcester_County,Lake Quinsigamond,Residential,Commercial,21.0,1980-07-17,,,summer,Total,mg/L,122.0,=,110.0,42.26994444,71.74636111,outflow,Total Suspended Solids +1,MA,MALQP1JO,P1_Jordan_Pond_Inlet,Worcester_County,Lake Quinsigamond,Residential,Commercial,21.0,1980-07-29,,,summer,Total,mg/L,7.6,=,110.0,42.26994444,71.74636111,outflow,Total Suspended Solids +1,MA,MALQP1JO,P1_Jordan_Pond_Inlet,Worcester_County,Lake Quinsigamond,Residential,Commercial,21.0,1980-08-02,,,summer,Total,mg/L,26.0,=,110.0,42.26994444,71.74636111,outflow,Total Suspended Solids +1,MA,MALQP1JO,P1_Jordan_Pond_Inlet,Worcester_County,Lake Quinsigamond,Residential,Commercial,21.0,1980-08-03,,,summer,Total,mg/L,42.0,=,110.0,42.26994444,71.74636111,outflow,Total Suspended Solids +1,MA,MALQP1JO,P1_Jordan_Pond_Inlet,Worcester_County,Lake Quinsigamond,Residential,Commercial,21.0,1980-08-11,,,summer,Total,mg/L,8.4,=,110.0,42.26994444,71.74636111,outflow,Total Suspended Solids +1,MA,MALQP1JO,P1_Jordan_Pond_Inlet,Worcester_County,Lake Quinsigamond,Residential,Commercial,21.0,1980-09-10,,,summer,Total,mg/L,39.0,=,110.0,42.26994444,71.74636111,outflow,Total Suspended Solids +1,MA,MALQP1JO,P1_Jordan_Pond_Inlet,Worcester_County,Lake Quinsigamond,Residential,Commercial,21.0,1980-09-18,,,summer,Total,mg/L,324.0,=,110.0,42.26994444,71.74636111,outflow,Total Suspended Solids +1,MA,MALQP2R9,P2_Rt_9_Belmont_St,Worcester_County,Lake Quinsigamond,Residential,Commercial,23.0,1980-07-17,,,summer,Total,mg/L,600.0,=,338.0,42.27419444,71.75791667,outflow,Total Suspended Solids +1,MA,MALQP2R9,P2_Rt_9_Belmont_St,Worcester_County,Lake Quinsigamond,Residential,Commercial,23.0,1980-07-29,,,summer,Total,mg/L,118.0,=,338.0,42.27419444,71.75791667,outflow,Total Suspended Solids +1,MA,MALQP2R9,P2_Rt_9_Belmont_St,Worcester_County,Lake Quinsigamond,Residential,Commercial,23.0,1980-08-02,,,summer,Total,mg/L,80.0,=,338.0,42.27419444,71.75791667,outflow,Total Suspended Solids +1,MA,MALQP2R9,P2_Rt_9_Belmont_St,Worcester_County,Lake Quinsigamond,Residential,Commercial,23.0,1980-08-03,,,summer,Total,mg/L,231.0,=,338.0,42.27419444,71.75791667,outflow,Total Suspended Solids +1,MA,MALQP2R9,P2_Rt_9_Belmont_St,Worcester_County,Lake Quinsigamond,Residential,Commercial,23.0,1980-08-11,,,summer,Total,mg/L,18.0,=,338.0,42.27419444,71.75791667,outflow,Total Suspended Solids +1,MA,MALQP2R9,P2_Rt_9_Belmont_St,Worcester_County,Lake Quinsigamond,Residential,Commercial,23.0,1980-09-10,,,summer,Total,mg/L,110.0,=,338.0,42.27419444,71.75791667,outflow,Total Suspended Solids +1,MA,MALQP2R9,P2_Rt_9_Belmont_St,Worcester_County,Lake Quinsigamond,Residential,Commercial,23.0,1980-09-18,,,summer,Total,mg/L,790.0,=,338.0,42.27419444,71.75791667,outflow,Total Suspended Solids +1,MA,MALQP3LO,P3_Locust_St_Tributary_to_Belmont_St,Worcester_County,Lake Quinsigamond,Residential,,16.0,1980-07-17,,,summer,Total,mg/L,735.0,=,154.0,42.27283889,71.76228889,outflow,Total Suspended Solids +1,MA,MALQP3LO,P3_Locust_St_Tributary_to_Belmont_St,Worcester_County,Lake Quinsigamond,Residential,,16.0,1980-08-02,,,summer,Total,mg/L,69.0,=,154.0,42.27283889,71.76228889,outflow,Total Suspended Solids +1,MA,MALQP3LO,P3_Locust_St_Tributary_to_Belmont_St,Worcester_County,Lake Quinsigamond,Residential,,16.0,1980-08-11,,,summer,Total,mg/L,47.0,=,154.0,42.27283889,71.76228889,outflow,Total Suspended Solids +1,MA,MALQP3LO,P3_Locust_St_Tributary_to_Belmont_St,Worcester_County,Lake Quinsigamond,Residential,,16.0,1980-09-10,,,summer,Total,mg/L,78.0,=,154.0,42.27283889,71.76228889,outflow,Total Suspended Solids +1,MA,MALQP3LO,P3_Locust_St_Tributary_to_Belmont_St,Worcester_County,Lake Quinsigamond,Residential,,16.0,1980-09-18,,,summer,Total,mg/L,441.0,=,154.0,42.27283889,71.76228889,outflow,Total Suspended Solids +1,MA,MALQP3LO,P3_Locust_St_Tributary_to_Belmont_St,Worcester_County,Lake Quinsigamond,Residential,,16.0,1980-09-26,,,autumn,Total,mg/L,53.0,=,154.0,42.27283889,71.76228889,outflow,Total Suspended Solids +1,MA,MALQP4GS,P4_Anna_St_Fitzgerald_Brook,Worcester_County,Lake Quinsigamond,Residential,Open Space,12.0,1980-06-16,,,spring,Total,mg/L,168.0,=,601.0,42.26633889,71.75550833,outflow,Total Suspended Solids +1,MA,MALQP4GS,P4_Anna_St_Fitzgerald_Brook,Worcester_County,Lake Quinsigamond,Residential,Open Space,12.0,1980-06-29,,,summer,Total,mg/L,47.0,=,601.0,42.26633889,71.75550833,outflow,Total Suspended Solids +1,MA,MALQP4GS,P4_Anna_St_Fitzgerald_Brook,Worcester_County,Lake Quinsigamond,Residential,Open Space,12.0,1980-08-11,,,summer,Total,mg/L,12.0,=,601.0,42.26633889,71.75550833,outflow,Total Suspended Solids +1,MA,MALQP4GS,P4_Anna_St_Fitzgerald_Brook,Worcester_County,Lake Quinsigamond,Residential,Open Space,12.0,1980-09-10,,,summer,Total,mg/L,14.0,=,601.0,42.26633889,71.75550833,outflow,Total Suspended Solids +1,MA,MALQP4GS,P4_Anna_St_Fitzgerald_Brook,Worcester_County,Lake Quinsigamond,Residential,Open Space,12.0,1980-09-18,,,summer,Total,mg/L,500.0,=,601.0,42.26633889,71.75550833,outflow,Total Suspended Solids +1,MA,MALQP4GS,P4_Anna_St_Fitzgerald_Brook,Worcester_County,Lake Quinsigamond,Residential,Open Space,12.0,1980-09-26,,,autumn,Total,mg/L,19.0,=,601.0,42.26633889,71.75550833,outflow,Total Suspended Solids +1,MA,MAMRHERO,Hemlock_Road,Middlesex_County,Upper_Mystic_lake,Residential,,16.0,1981-04-14,,,spring,Total,mg/L,9.24,=,50.0,42.50751111,71.11407222,outflow,Total Suspended Solids +1,MA,MAMRHERO,Hemlock_Road,Middlesex_County,Upper_Mystic_lake,Residential,,16.0,1981-06-20,,,spring,Total,mg/L,209.7,=,50.0,42.50751111,71.11407222,outflow,Total Suspended Solids +1,MA,MAMRHERO,Hemlock_Road,Middlesex_County,Upper_Mystic_lake,Residential,,16.0,1981-06-22,,,summer,Total,mg/L,6.96,=,50.0,42.50751111,71.11407222,outflow,Total Suspended Solids +1,MA,MAMRHERO,Hemlock_Road,Middlesex_County,Upper_Mystic_lake,Residential,,16.0,1981-07-13,,,summer,Total,mg/L,62.5,=,50.0,42.50751111,71.11407222,outflow,Total Suspended Solids +1,MA,MAMRHERO,Hemlock_Road,Middlesex_County,Upper_Mystic_lake,Residential,,16.0,1981-08-05,,,summer,Total,mg/L,24.1,=,50.0,42.50751111,71.11407222,outflow,Total Suspended Solids +1,MA,MAWOBRST,Brookdale_Street,Worcester_County,Worcester,Residential,,,2000-03-28,,1.09,spring,Total,mg/L,346.0,=,,,,outflow,Total Suspended Solids +1,MA,MAWOBRST,Brookdale_Street,Worcester_County,Worcester,Residential,,,2000-07-27,,2.1,summer,Total,mg/L,17.0,=,,,,outflow,Total Suspended Solids +1,MA,MAWOBRST,Brookdale_Street,Worcester_County,Worcester,Residential,,,2001-09-20,,0.82,summer,Total,mg/L,52.0,=,,,,outflow,Total Suspended Solids +1,MA,MAWOBRST,Brookdale_Street,Worcester_County,Worcester,Residential,,,2001-09-25,,1.37,autumn,Total,mg/L,288.0,=,,,,outflow,Total Suspended Solids +1,MA,MAWOBRST,Brookdale_Street,Worcester_County,Worcester,Residential,,,2000-11-10,,1.52,autumn,Total,mg/L,42.0,=,,,,outflow,Total Suspended Solids +1,MA,MAWOBRST,Brookdale_Street,Worcester_County,Worcester,Residential,,,2002-03-26,,1.16,spring,Total,mg/L,69.0,=,,,,outflow,Total Suspended Solids +1,MA,MAWOBRST,Brookdale_Street,Worcester_County,Worcester,Residential,,,2002-07-23,,1.14,summer,Total,mg/L,29.0,=,,,,outflow,Total Suspended Solids +1,MA,MAWOBRST,Brookdale_Street,Worcester_County,Worcester,Residential,,,2002-07-23,,1.14,summer,Total,mg/L,31.0,=,,,,outflow,Total Suspended Solids +1,MA,MAWOBRST,Brookdale_Street,Worcester_County,Worcester,Residential,,,2002-11-06,,0.64,autumn,Total,mg/L,18.0,=,,,,outflow,Total Suspended Solids +1,MA,MAWOBRST,Brookdale_Street,Worcester_County,Worcester,Residential,,,2003-06-18,,0.36,spring,Total,mg/L,40.0,=,,,,outflow,Total Suspended Solids +1,MA,MAWOBRST,Brookdale_Street,Worcester_County,Worcester,Residential,,,2003-09-23,,1.03,autumn,Total,mg/L,40.0,=,,,,outflow,Total Suspended Solids +1,MA,MAWOBRST,Brookdale_Street,Worcester_County,Worcester,Residential,,,2003-09-28,,0.26,autumn,Total,mg/L,12.0,=,,,,outflow,Total Suspended Solids +1,MA,MAWOOLST,Olean_Street,Worcester_County,Worcester,Residential,,,2000-03-28,,1.09,spring,Total,mg/L,112.0,=,,42.28590278,71.86085556,outflow,Total Suspended Solids +1,MA,MAWOOLST,Olean_Street,Worcester_County,Worcester,Residential,,,2000-07-27,,2.1,summer,Total,mg/L,14.0,=,,42.28590278,71.86085556,outflow,Total Suspended Solids +1,MA,MAWOOLST,Olean_Street,Worcester_County,Worcester,Residential,,,2001-09-20,,0.82,summer,Total,mg/L,24.0,=,,42.28590278,71.86085556,outflow,Total Suspended Solids +1,MA,MAWOOLST,Olean_Street,Worcester_County,Worcester,Residential,,,2001-09-25,,1.37,autumn,Total,mg/L,1091.0,=,,42.28590278,71.86085556,outflow,Total Suspended Solids +1,MA,MAWOOLST,Olean_Street,Worcester_County,Worcester,Residential,,,2001-11-10,,1.52,autumn,Total,mg/L,10.0,=,,42.28590278,71.86085556,outflow,Total Suspended Solids +1,MA,MAWOOLST,Olean_Street,Worcester_County,Worcester,Residential,,,2002-03-26,,1.16,spring,Total,mg/L,50.0,=,,42.28590278,71.86085556,outflow,Total Suspended Solids +1,MA,MAWOOLST,Olean_Street,Worcester_County,Worcester,Residential,,,2002-07-23,,1.14,summer,Total,mg/L,57.0,=,,42.28590278,71.86085556,outflow,Total Suspended Solids +1,MA,MAWOOLST,Olean_Street,Worcester_County,Worcester,Residential,,,2002-07-23,,1.14,summer,Total,mg/L,30.0,=,,42.28590278,71.86085556,outflow,Total Suspended Solids +1,MA,MAWOOLST,Olean_Street,Worcester_County,Worcester,Residential,,,2002-11-06,,0.64,autumn,Total,mg/L,16.0,=,,42.28590278,71.86085556,outflow,Total Suspended Solids +1,MA,MAWOOLST,Olean_Street,Worcester_County,Worcester,Residential,,,2003-06-18,,0.36,spring,Total,mg/L,40.0,=,,42.28590278,71.86085556,outflow,Total Suspended Solids +1,MA,MAWOOLST,Olean_Street,Worcester_County,Worcester,Residential,,,2003-09-23,,1.03,autumn,Total,mg/L,50.0,=,,42.28590278,71.86085556,outflow,Total Suspended Solids +1,MA,MAWOOLST,Olean_Street,Worcester_County,Worcester,Residential,,,2003-09-28,,0.26,autumn,Total,mg/L,20.0,=,,42.28590278,71.86085556,outflow,Total Suspended Solids +1,MI,MIAAPNTA,PITAARETBNNINLT_Pitt_AA_RB_N_PNI,Washtenaw_County,Ann_Arbor,Residential,Open Space,26.23,1979-06-29,,,summer,Total,mg/L,136.0,=,2871.0,42.24079167,83.711425,outflow,Total Suspended Solids +1,MI,MIAAPNTA,PITAARETBNNINLT_Pitt_AA_RB_N_PNI,Washtenaw_County,Ann_Arbor,Residential,Open Space,26.23,1979-10-22,,,autumn,Total,mg/L,70.0,=,2871.0,42.24079167,83.711425,outflow,Total Suspended Solids +1,MI,MIAAPNTA,PITAARETBNNINLT_Pitt_AA_RB_N_PNI,Washtenaw_County,Ann_Arbor,Residential,Open Space,26.23,1980-08-10,,,summer,Total,mg/L,48.0,=,2871.0,42.24079167,83.711425,outflow,Total Suspended Solids +1,MI,MIAAPNTA,PITAARETBNNINLT_Pitt_AA_RB_N_PNI,Washtenaw_County,Ann_Arbor,Residential,Open Space,26.23,1980-09-09,,,summer,Total,mg/L,65.0,=,2871.0,42.24079167,83.711425,outflow,Total Suspended Solids +1,MI,MIAAPNTA,PITAARETBNNINLT_Pitt_AA_RB_N_PNI,Washtenaw_County,Ann_Arbor,Residential,Open Space,26.23,1980-09-17,,,summer,Total,mg/L,44.0,=,2871.0,42.24079167,83.711425,outflow,Total Suspended Solids +1,MI,MIAAPNTA,PITAARETBNNINLT_Pitt_AA_RB_N_PNI,Washtenaw_County,Ann_Arbor,Residential,Open Space,26.23,1980-10-24,,,autumn,Total,mg/L,41.0,=,2871.0,42.24079167,83.711425,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1980-04-03,,,spring,Total,mg/L,320.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1980-04-24,,,spring,Total,mg/L,81.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1980-05-30,,,spring,Total,mg/L,370.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1980-06-01,,,spring,Total,mg/L,100.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1980-06-05,,,spring,Total,mg/L,180.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1980-07-05,,,summer,Total,mg/L,400.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1980-07-16,,,summer,Total,mg/L,200.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1980-08-02,,,summer,Total,mg/L,67.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1980-08-10,,,summer,Total,mg/L,160.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1980-09-09,,,summer,Total,mg/L,180.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1980-09-22,,,autumn,Total,mg/L,90.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1980-10-14,,,autumn,Total,mg/L,160.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1980-10-17,,,autumn,Total,mg/L,5.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1980-10-24,,,autumn,Total,mg/L,74.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1981-05-10,,,spring,Total,mg/L,50.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1981-08-26,,,summer,Total,mg/L,110.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1981-08-27,,,summer,Total,mg/L,120.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1981-09-03,,,summer,Total,mg/L,30.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1981-09-16,,,summer,Total,mg/L,90.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1981-09-26,,,autumn,Total,mg/L,32.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1981-09-26,,,autumn,Total,mg/L,160.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1981-10-17,,,autumn,Total,mg/L,31.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI01,MI1001_Grand_River,Ingham_County,Lansing,Residential,Open Space,37.0,1981-11-19,,,autumn,Total,mg/L,160.0,=,452.6,42.74847222,84.58566111,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1980-04-03,,,spring,Total,mg/L,130.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1980-04-24,,,spring,Total,mg/L,36.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1980-04-27,,,spring,Total,mg/L,32.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1980-04-28,,,spring,Total,mg/L,21.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1980-05-30,,,spring,Total,mg/L,220.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1980-06-01,,,spring,Total,mg/L,19.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1980-06-05,,,spring,Total,mg/L,54.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1980-07-05,,,summer,Total,mg/L,100.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1980-07-16,,,summer,Total,mg/L,97.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1980-08-02,,,summer,Total,mg/L,29.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1980-08-10,,,summer,Total,mg/L,60.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1980-09-09,,,summer,Total,mg/L,70.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1980-09-22,,,autumn,Total,mg/L,6.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1980-10-14,,,autumn,Total,mg/L,74.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1980-10-16,,,autumn,Total,mg/L,9.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1980-10-17,,,autumn,Total,mg/L,32.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1980-10-24,,,autumn,Total,mg/L,11.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1981-03-30,,,spring,Total,mg/L,260.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1981-04-04,,,spring,Total,mg/L,510.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1981-04-08,,,spring,Total,mg/L,240.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1981-04-10,,,spring,Total,mg/L,80.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1981-04-11,,,spring,Total,mg/L,43.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1981-04-22,,,spring,Total,mg/L,53.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1981-04-28,,,spring,Total,mg/L,16.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1981-05-10,,,spring,Total,mg/L,23.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1981-06-07,,,spring,Total,mg/L,170.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1981-06-13,,,spring,Total,mg/L,40.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1981-06-21,,,spring,Total,mg/L,44.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1981-08-26,,,summer,Total,mg/L,52.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1981-08-27,,,summer,Total,mg/L,52.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1981-08-29,,,summer,Total,mg/L,72.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1981-09-03,,,summer,Total,mg/L,17.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1981-09-16,,,summer,Total,mg/L,49.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1981-09-26,,,autumn,Total,mg/L,130.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAMI06,GCO_MI006_Waverly_Hills,Ingham_County,Lansing,Residential,Commercial,67.66,1981-10-17,,,autumn,Total,mg/L,73.0,=,30.3,42.74059722,84.59915278,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1980-04-03,,,spring,Total,mg/L,330.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1980-06-01,,,spring,Total,mg/L,110.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1980-07-16,,,summer,Total,mg/L,230.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1980-08-02,,,summer,Total,mg/L,43.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1980-08-10,,,summer,Total,mg/L,210.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1980-09-22,,,autumn,Total,mg/L,68.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1980-10-14,,,autumn,Total,mg/L,150.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1980-10-17,,,autumn,Total,mg/L,130.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1980-10-24,,,autumn,Total,mg/L,60.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1981-04-11,,,spring,Total,mg/L,110.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1981-04-22,,,spring,Total,mg/L,270.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1981-06-07,,,spring,Total,mg/L,690.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1981-06-13,,,spring,Total,mg/L,200.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1981-06-21,,,spring,Total,mg/L,53.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1981-07-27,,,summer,Total,mg/L,120.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1981-08-26,,,summer,Total,mg/L,76.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1981-08-29,,,summer,Total,mg/L,260.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1981-09-03,,,summer,Total,mg/L,48.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1981-09-16,,,summer,Total,mg/L,120.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1981-09-26,,,autumn,Total,mg/L,47.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1981-09-26,,,autumn,Total,mg/L,340.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1981-10-17,,,autumn,Total,mg/L,92.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP08,Upsized_Pipe_1_Inlet_MI008_Grace_St_N_Inlet,Ingham_County,Lansing,Residential,Open Space,23.77,1981-11-19,,,autumn,Total,mg/L,180.0,=,163.9,42.74082222,84.58874167,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1980-05-30,,,spring,Total,mg/L,320.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1980-06-05,,,spring,Total,mg/L,170.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1980-08-02,,,summer,Total,mg/L,49.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1980-08-10,,,summer,Total,mg/L,300.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1980-09-09,,,summer,Total,mg/L,160.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1980-09-16,,,summer,Total,mg/L,230.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1980-10-14,,,autumn,Total,mg/L,120.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1980-10-17,,,autumn,Total,mg/L,120.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1980-10-24,,,autumn,Total,mg/L,46.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1981-03-26,,,spring,Total,mg/L,320.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1981-04-08,,,spring,Total,mg/L,665.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1981-04-28,,,spring,Total,mg/L,56.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1981-06-13,,,spring,Total,mg/L,100.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1981-07-27,,,summer,Total,mg/L,110.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1981-08-27,,,summer,Total,mg/L,290.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1981-08-29,,,summer,Total,mg/L,290.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1981-09-03,,,summer,Total,mg/L,35.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1981-09-16,,,summer,Total,mg/L,67.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1981-09-26,,,autumn,Total,mg/L,70.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MI,MILAUP10,Upsized_Pipe_2_Inlet_MI010_Grace_St_S_Inlet,Ingham_County,Lansing,Residential,Institutional,36.66,1981-11-19,,,autumn,Total,mg/L,150.0,=,74.9,42.73746389,84.58875278,outflow,Total Suspended Solids +1,MN,MNMIHAPK,Site1_Harriet_Pkwy_44th_St,Hennepin_County,Minneapolis,Residential,,,2001-01-30,>8hrs,,winter,Total,mg/L,256.0,=,143.0,44.92255833,93.29663889,outflow,Total Suspended Solids +1,MN,MNMIHAPK,Site1_Harriet_Pkwy_44th_St,Hennepin_County,Minneapolis,Residential,,,2001-03-09,>8hrs,,winter,Total,mg/L,370.0,=,143.0,44.92255833,93.29663889,outflow,Total Suspended Solids +1,MN,MNMIHAPK,Site1_Harriet_Pkwy_44th_St,Hennepin_County,Minneapolis,Residential,,,2001-03-15,>8hrs,,winter,Total,mg/L,129.0,=,143.0,44.92255833,93.29663889,outflow,Total Suspended Solids +1,MN,MNMIHAPK,Site1_Harriet_Pkwy_44th_St,Hennepin_County,Minneapolis,Residential,,,2001-04-10,>8hrs,1.72,spring,Total,mg/L,105.0,=,143.0,44.92255833,93.29663889,outflow,Total Suspended Solids +1,MN,MNMIHAPK,Site1_Harriet_Pkwy_44th_St,Hennepin_County,Minneapolis,Residential,,,2002-03-13,>8hrs,,winter,Total,mg/L,100.0,=,143.0,44.92255833,93.29663889,outflow,Total Suspended Solids +1,MN,MNMIHAPK,Site1_Harriet_Pkwy_44th_St,Hennepin_County,Minneapolis,Residential,,,2002-04-05,>8hrs,,spring,Total,mg/L,70.0,=,143.0,44.92255833,93.29663889,outflow,Total Suspended Solids +1,MN,MNMIHAPK,Site1_Harriet_Pkwy_44th_St,Hennepin_County,Minneapolis,Residential,,,2002-05-07,>8hrs,1.46,spring,Total,mg/L,93.0,=,143.0,44.92255833,93.29663889,outflow,Total Suspended Solids +1,MN,MNMIHAPK,Site1_Harriet_Pkwy_44th_St,Hennepin_County,Minneapolis,Residential,,,2002-05-08,>8hrs,1.46,spring,Total,mg/L,200.0,=,143.0,44.92255833,93.29663889,outflow,Total Suspended Solids +1,MN,MNMIHAPK,Site1_Harriet_Pkwy_44th_St,Hennepin_County,Minneapolis,Residential,,,2002-06-06,>8hrs,0.63,spring,Total,mg/L,44.0,=,143.0,44.92255833,93.29663889,outflow,Total Suspended Solids +1,MN,MNMIHAPK,Site1_Harriet_Pkwy_44th_St,Hennepin_County,Minneapolis,Residential,,,2002-07-24,>8hrs,1.06,summer,Total,mg/L,107.0,=,143.0,44.92255833,93.29663889,outflow,Total Suspended Solids +1,MN,MNMIHAPK,Site1_Harriet_Pkwy_44th_St,Hennepin_County,Minneapolis,Residential,,,2002-08-16,>8hrs,1.92,summer,Total,mg/L,88.0,=,143.0,44.92255833,93.29663889,outflow,Total Suspended Solids +1,MN,MNMIHAPK,Site1_Harriet_Pkwy_44th_St,Hennepin_County,Minneapolis,Residential,,,2002-08-20,>8hrs,2.52,summer,Total,mg/L,57.0,=,143.0,44.92255833,93.29663889,outflow,Total Suspended Solids +1,MN,MNMIHAPK,Site1_Harriet_Pkwy_44th_St,Hennepin_County,Minneapolis,Residential,,,2002-09-25,>8hrs,0.85,autumn,Total,mg/L,51.0,=,143.0,44.92255833,93.29663889,outflow,Total Suspended Solids +1,MN,MNMIHAPK,Site1_Harriet_Pkwy_44th_St,Hennepin_County,Minneapolis,Residential,,,2002-10-04,>8hrs,1.62,autumn,Total,mg/L,55.0,=,143.0,44.92255833,93.29663889,outflow,Total Suspended Solids +1,MN,MNMISD01,E_Harriet_Pkwy_W44_St,-,City_of_Minneapolis,Residential,,,2001-05-06,,0.92,spring,Total,mg/L,300.0,=,143.0,44.9231,93.2856,outflow,Total Suspended Solids +1,MN,MNMISD01,E_Harriet_Pkwy_W44_St,-,City_of_Minneapolis,Residential,,,2001-05-10,,0.23,spring,Total,mg/L,113.0,=,143.0,44.9231,93.2856,outflow,Total Suspended Solids +1,MN,MNMISD01,E_Harriet_Pkwy_W44_St,-,City_of_Minneapolis,Residential,,,2001-06-11,,0.69,spring,Total,mg/L,379.0,=,143.0,44.9231,93.2856,outflow,Total Suspended Solids +1,MN,MNMISD01,E_Harriet_Pkwy_W44_St,-,City_of_Minneapolis,Residential,,,2001-07-17,,0.46,summer,Total,mg/L,272.0,=,143.0,44.9231,93.2856,outflow,Total Suspended Solids +1,MN,MNMISD01,E_Harriet_Pkwy_W44_St,-,City_of_Minneapolis,Residential,,,2001-07-22,,0.69,summer,Total,mg/L,206.0,=,143.0,44.9231,93.2856,outflow,Total Suspended Solids +1,MN,MNMISD01,E_Harriet_Pkwy_W44_St,-,City_of_Minneapolis,Residential,,,2001-08-17,,1.4,summer,Total,mg/L,71.0,=,143.0,44.9231,93.2856,outflow,Total Suspended Solids +1,MN,MNMISD01,E_Harriet_Pkwy_W44_St,-,City_of_Minneapolis,Residential,,,2001-09-07,,1.61,summer,Total,mg/L,119.0,=,143.0,44.9231,93.2856,outflow,Total Suspended Solids +1,MN,MNMISD01,E_Harriet_Pkwy_W44_St,-,City_of_Minneapolis,Residential,,,2001-09-09,,0.31,summer,Total,mg/L,195.0,=,143.0,44.9231,93.2856,outflow,Total Suspended Solids +1,MN,MNMISD01,E_Harriet_Pkwy_W44_St,-,City_of_Minneapolis,Residential,,,2001-10-09,,0.19,autumn,Total,mg/L,44.0,=,143.0,44.9231,93.2856,outflow,Total Suspended Solids +1,MN,MNMISD01,E_Harriet_Pkwy_W44_St,-,City_of_Minneapolis,Residential,,,2001-10-13,,0.34,autumn,Total,mg/L,21.0,=,143.0,44.9231,93.2856,outflow,Total Suspended Solids +1,MN,MNMISD02,Luella_St_Orange_Ave,-,City_of_Minneapolis,Residential,,,2001-05-06,,0.92,spring,Total,mg/L,631.0,=,95.0,44.9794,93.0189,outflow,Total Suspended Solids +1,MN,MNMISD02,Luella_St_Orange_Ave,-,City_of_Minneapolis,Residential,,,2001-05-20,,1.18,spring,Total,mg/L,40.0,=,95.0,44.9794,93.0189,outflow,Total Suspended Solids +1,MN,MNMISD02,Luella_St_Orange_Ave,-,City_of_Minneapolis,Residential,,,2001-06-05,,0.49,spring,Total,mg/L,18.0,=,95.0,44.9794,93.0189,outflow,Total Suspended Solids +1,MN,MNMISD02,Luella_St_Orange_Ave,-,City_of_Minneapolis,Residential,,,2001-07-17,,0.46,summer,Total,mg/L,257.0,=,95.0,44.9794,93.0189,outflow,Total Suspended Solids +1,MN,MNMISD02,Luella_St_Orange_Ave,-,City_of_Minneapolis,Residential,,,2001-07-22,,0.69,summer,Total,mg/L,44.0,=,95.0,44.9794,93.0189,outflow,Total Suspended Solids +1,MN,MNMISD02,Luella_St_Orange_Ave,-,City_of_Minneapolis,Residential,,,2001-08-01,,0.22,summer,Total,mg/L,212.0,=,95.0,44.9794,93.0189,outflow,Total Suspended Solids +1,MN,MNMISD02,Luella_St_Orange_Ave,-,City_of_Minneapolis,Residential,,,2001-09-07,,1.61,summer,Total,mg/L,115.0,=,95.0,44.9794,93.0189,outflow,Total Suspended Solids +1,MN,MNMISD02,Luella_St_Orange_Ave,-,City_of_Minneapolis,Residential,,,2001-10-09,,0.19,autumn,Total,mg/L,55.0,=,95.0,44.9794,93.0189,outflow,Total Suspended Solids +1,MN,MNMISD02,Luella_St_Orange_Ave,-,City_of_Minneapolis,Residential,,,2001-10-13,,0.34,autumn,Total,mg/L,16.0,=,95.0,44.9794,93.0189,outflow,Total Suspended Solids +1,MN,MNMISD04,Charles_Ave,-,City_of_Minneapolis,Residential,Commercial,,2001-05-06,,0.92,spring,Total,mg/L,191.0,=,63.0,44.9594,93.1188,outflow,Total Suspended Solids +1,MN,MNMISD04,Charles_Ave,-,City_of_Minneapolis,Residential,Commercial,,2001-05-10,,0.23,spring,Total,mg/L,143.0,=,63.0,44.9594,93.1188,outflow,Total Suspended Solids +1,MN,MNMISD04,Charles_Ave,-,City_of_Minneapolis,Residential,Commercial,,2001-05-20,,1.18,spring,Total,mg/L,81.0,=,63.0,44.9594,93.1188,outflow,Total Suspended Solids +1,MN,MNMISD04,Charles_Ave,-,City_of_Minneapolis,Residential,Commercial,,2001-06-05,,0.49,spring,Total,mg/L,94.0,=,63.0,44.9594,93.1188,outflow,Total Suspended Solids +1,MN,MNMISD04,Charles_Ave,-,City_of_Minneapolis,Residential,Commercial,,2001-08-17,,1.4,summer,Total,mg/L,56.0,=,63.0,44.9594,93.1188,outflow,Total Suspended Solids +1,MN,MNMISD04,Charles_Ave,-,City_of_Minneapolis,Residential,Commercial,,2001-08-29,,0.31,summer,Total,mg/L,65.0,=,63.0,44.9594,93.1188,outflow,Total Suspended Solids +1,MN,MNMISD04,Charles_Ave,-,City_of_Minneapolis,Residential,Commercial,,2001-09-07,,1.61,summer,Total,mg/L,89.0,=,63.0,44.9594,93.1188,outflow,Total Suspended Solids +1,MN,MNMISD04,Charles_Ave,-,City_of_Minneapolis,Residential,Commercial,,2001-10-13,,0.34,autumn,Total,mg/L,20.0,=,63.0,44.9594,93.1188,outflow,Total Suspended Solids +1,MN,MNMISD04,Charles_Ave,-,City_of_Minneapolis,Residential,Commercial,,2001-11-12,,0.27,autumn,Total,mg/L,90.0,=,63.0,44.9594,93.1188,outflow,Total Suspended Solids +1,MN,MNMISD05,E_29_St_31_Ave_S,-,City_of_Minneapolis,Residential,Commercial,,2001-05-20,,1.18,spring,Total,mg/L,72.0,=,100.0,44.9501,93.227,outflow,Total Suspended Solids +1,MN,MNMISD05,E_29_St_31_Ave_S,-,City_of_Minneapolis,Residential,Commercial,,2001-05-21,,1.32,spring,Total,mg/L,38.0,=,100.0,44.9501,93.227,outflow,Total Suspended Solids +1,MN,MNMISD05,E_29_St_31_Ave_S,-,City_of_Minneapolis,Residential,Commercial,,2001-06-05,,0.49,spring,Total,mg/L,36.0,=,100.0,44.9501,93.227,outflow,Total Suspended Solids +1,MN,MNMISD05,E_29_St_31_Ave_S,-,City_of_Minneapolis,Residential,Commercial,,2001-07-17,,0.46,summer,Total,mg/L,174.0,=,100.0,44.9501,93.227,outflow,Total Suspended Solids +1,MN,MNMISD05,E_29_St_31_Ave_S,-,City_of_Minneapolis,Residential,Commercial,,2001-07-22,,0.69,summer,Total,mg/L,91.0,=,100.0,44.9501,93.227,outflow,Total Suspended Solids +1,MN,MNMISD05,E_29_St_31_Ave_S,-,City_of_Minneapolis,Residential,Commercial,,2001-08-17,,1.4,summer,Total,mg/L,36.0,=,100.0,44.9501,93.227,outflow,Total Suspended Solids +1,MN,MNMISD05,E_29_St_31_Ave_S,-,City_of_Minneapolis,Residential,Commercial,,2001-08-29,,0.49,summer,Total,mg/L,93.0,=,100.0,44.9501,93.227,outflow,Total Suspended Solids +1,MN,MNMISD05,E_29_St_31_Ave_S,-,City_of_Minneapolis,Residential,Commercial,,2001-10-09,,0.19,autumn,Total,mg/L,65.0,=,100.0,44.9501,93.227,outflow,Total Suspended Solids +1,MN,MNMISD05,E_29_St_31_Ave_S,-,City_of_Minneapolis,Residential,Commercial,,2001-10-13,,0.34,autumn,Total,mg/L,19.0,=,100.0,44.9501,93.227,outflow,Total Suspended Solids +1,MN,MNMISD05,E_29_St_31_Ave_S,-,City_of_Minneapolis,Residential,Commercial,,2001-11-12,,0.27,autumn,Total,mg/L,90.0,=,100.0,44.9501,93.227,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2001-03-09,>8hrs,,winter,Total,mg/L,406.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2001-03-15,>8hrs,,winter,Total,mg/L,197.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2001-04-10,>8hrs,1.72,spring,Total,mg/L,87.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2001-05-20,>8hrs,1.18,spring,Total,mg/L,72.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2001-05-21,>8hrs,1.32,spring,Total,mg/L,38.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2001-06-05,>8hrs,0.49,spring,Total,mg/L,36.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2001-07-17,>8hrs,0.46,summer,Total,mg/L,174.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2001-07-23,>8hrs,0.11,summer,Total,mg/L,91.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2001-08-17,>8hrs,1.4,summer,Total,mg/L,36.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2001-08-29,>8hrs,0.49,summer,Total,mg/L,93.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2001-10-09,>8hrs,0.19,autumn,Total,mg/L,65.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2001-10-13,>8hrs,0.34,autumn,Total,mg/L,19.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2001-11-12,>8hrs,0.27,autumn,Total,mg/L,90.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2002-03-19,>8hrs,,winter,Total,mg/L,16.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2002-04-04,>8hrs,,spring,Total,mg/L,68.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2002-06-02,>8hrs,0.38,spring,Total,mg/L,65.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2002-06-06,>8hrs,0.63,spring,Total,mg/L,94.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2002-06-19,>8hrs,0.6,spring,Total,mg/L,72.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2002-06-24,>8hrs,0.62,summer,Total,mg/L,85.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2002-07-10,>8hrs,1.86,summer,Total,mg/L,86.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2002-08-16,>8hrs,1.92,summer,Total,mg/L,69.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2002-08-20,>8hrs,2.52,summer,Total,mg/L,45.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2002-09-05,>8hrs,2.6,summer,Total,mg/L,106.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNMISNAV,Site5a_Snelling_ave_S_and_E_24th_St,Hennepin_County,City_of_Minneapolis,Residential,Industrial,,2002-10-08,>8hrs,0.49,autumn,Total,mg/L,38.0,=,113.0,44.95922222,93.24363889,outflow,Total Suspended Solids +1,MN,MNSPCHAV,Site4_Charles_ave_Mackubin_to_Arundel_St,Ramsey_County,St_Paul,Residential,Commercial,,2001-03-15,>8hrs,,winter,Total,mg/L,326.0,=,63.0,44.95758889,93.12003889,outflow,Total Suspended Solids +1,MN,MNSPCHAV,Site4_Charles_ave_Mackubin_to_Arundel_St,Ramsey_County,St_Paul,Residential,Commercial,,2001-04-10,>8hrs,1.72,spring,Total,mg/L,76.0,=,63.0,44.95758889,93.12003889,outflow,Total Suspended Solids +1,MN,MNSPCHAV,Site4_Charles_ave_Mackubin_to_Arundel_St,Ramsey_County,St_Paul,Residential,Commercial,,2002-03-12,>8hrs,,winter,Total,mg/L,182.0,=,63.0,44.95758889,93.12003889,outflow,Total Suspended Solids +1,MN,MNSPCHAV,Site4_Charles_ave_Mackubin_to_Arundel_St,Ramsey_County,St_Paul,Residential,Commercial,,2002-04-05,>8hrs,,spring,Total,mg/L,117.0,=,63.0,44.95758889,93.12003889,outflow,Total Suspended Solids +1,MN,MNSPCHAV,Site4_Charles_ave_Mackubin_to_Arundel_St,Ramsey_County,St_Paul,Residential,Commercial,,2002-05-05,>8hrs,0.62,spring,Total,mg/L,413.0,=,63.0,44.95758889,93.12003889,outflow,Total Suspended Solids +1,MN,MNSPCHAV,Site4_Charles_ave_Mackubin_to_Arundel_St,Ramsey_County,St_Paul,Residential,Commercial,,2002-05-07,>8hrs,1.46,spring,Total,mg/L,365.0,=,63.0,44.95758889,93.12003889,outflow,Total Suspended Solids +1,MN,MNSPCHAV,Site4_Charles_ave_Mackubin_to_Arundel_St,Ramsey_County,St_Paul,Residential,Commercial,,2002-06-03,>8hrs,0.7,spring,Total,mg/L,63.0,=,63.0,44.95758889,93.12003889,outflow,Total Suspended Solids +1,MN,MNSPCHAV,Site4_Charles_ave_Mackubin_to_Arundel_St,Ramsey_County,St_Paul,Residential,Commercial,,2002-07-10,>8hrs,1.86,summer,Total,mg/L,64.0,=,63.0,44.95758889,93.12003889,outflow,Total Suspended Solids +1,MN,MNSPCHAV,Site4_Charles_ave_Mackubin_to_Arundel_St,Ramsey_County,St_Paul,Residential,Commercial,,2002-08-16,>8hrs,1.92,summer,Total,mg/L,78.0,=,63.0,44.95758889,93.12003889,outflow,Total Suspended Solids +1,MN,MNSPCHAV,Site4_Charles_ave_Mackubin_to_Arundel_St,Ramsey_County,St_Paul,Residential,Commercial,,2002-09-05,>8hrs,2.6,summer,Total,mg/L,123.0,=,63.0,44.95758889,93.12003889,outflow,Total Suspended Solids +1,MN,MNSPCHAV,Site4_Charles_ave_Mackubin_to_Arundel_St,Ramsey_County,St_Paul,Residential,Commercial,,2002-10-07,>8hrs,0.18,autumn,Total,mg/L,51.0,=,63.0,44.95758889,93.12003889,outflow,Total Suspended Solids +1,MN,MNSPLUOR,Site2_Luella_St_at_Orange_ave,Ramsey_County,St_Paul,Residential,,,2001-03-15,>8hrs,,winter,Total,mg/L,110.0,=,95.0,44.97933056,93.017675,outflow,Total Suspended Solids +1,MN,MNSPLUOR,Site2_Luella_St_at_Orange_ave,Ramsey_County,St_Paul,Residential,,,2001-04-10,>8hrs,1.72,spring,Total,mg/L,30.0,=,95.0,44.97933056,93.017675,outflow,Total Suspended Solids +1,MN,MNSPLUOR,Site2_Luella_St_at_Orange_ave,Ramsey_County,St_Paul,Residential,,,2001-05-01,>8hrs,0.44,spring,Total,mg/L,639.0,=,95.0,44.97933056,93.017675,outflow,Total Suspended Solids +1,MN,MNSPLUOR,Site2_Luella_St_at_Orange_ave,Ramsey_County,St_Paul,Residential,,,2002-03-12,>8hrs,,winter,Total,mg/L,67.0,=,95.0,44.97933056,93.017675,outflow,Total Suspended Solids +1,MN,MNSPLUOR,Site2_Luella_St_at_Orange_ave,Ramsey_County,St_Paul,Residential,,,2002-04-05,>8hrs,,spring,Total,mg/L,43.0,=,95.0,44.97933056,93.017675,outflow,Total Suspended Solids +1,MN,MNSPLUOR,Site2_Luella_St_at_Orange_ave,Ramsey_County,St_Paul,Residential,,,2002-05-05,>8hrs,0.62,spring,Total,mg/L,725.0,=,95.0,44.97933056,93.017675,outflow,Total Suspended Solids +1,MN,MNSPLUOR,Site2_Luella_St_at_Orange_ave,Ramsey_County,St_Paul,Residential,,,2002-05-07,>8hrs,1.46,spring,Total,mg/L,285.0,=,95.0,44.97933056,93.017675,outflow,Total Suspended Solids +1,MN,MNSPLUOR,Site2_Luella_St_at_Orange_ave,Ramsey_County,St_Paul,Residential,,,2002-06-03,>8hrs,0.7,spring,Total,mg/L,48.0,=,95.0,44.97933056,93.017675,outflow,Total Suspended Solids +1,MN,MNSPLUOR,Site2_Luella_St_at_Orange_ave,Ramsey_County,St_Paul,Residential,,,2002-07-10,>8hrs,1.86,summer,Total,mg/L,43.0,=,95.0,44.97933056,93.017675,outflow,Total Suspended Solids +1,MN,MNSPLUOR,Site2_Luella_St_at_Orange_ave,Ramsey_County,St_Paul,Residential,,,2002-08-16,>8hrs,1.92,summer,Total,mg/L,98.0,=,95.0,44.97933056,93.017675,outflow,Total Suspended Solids +1,MN,MNSPLUOR,Site2_Luella_St_at_Orange_ave,Ramsey_County,St_Paul,Residential,,,2002-08-20,>8hrs,2.52,summer,Total,mg/L,64.0,=,95.0,44.97933056,93.017675,outflow,Total Suspended Solids +1,MN,MNSPLUOR,Site2_Luella_St_at_Orange_ave,Ramsey_County,St_Paul,Residential,,,2002-09-05,>8hrs,2.6,summer,Total,mg/L,110.0,=,95.0,44.97933056,93.017675,outflow,Total Suspended Solids +1,MN,MNSPLUOR,Site2_Luella_St_at_Orange_ave,Ramsey_County,St_Paul,Residential,,,2002-10-07,>8hrs,0.18,autumn,Total,mg/L,18.0,=,95.0,44.97933056,93.017675,outflow,Total Suspended Solids +1,NY,NYLI1021,NY_1021_Unqua_Influent,Nassau_County,Long_Island,Residential,Open Space,2.0,1980-09-18,,,summer,Total,mg/L,36.7,=,298.5,40.66979722,73.44337778,outflow,Total Suspended Solids +1,NY,NYLI1021,NY_1021_Unqua_Influent,Nassau_County,Long_Island,Residential,Open Space,2.0,1980-09-25,,,autumn,Total,mg/L,51.0,=,298.5,40.66979722,73.44337778,outflow,Total Suspended Solids +1,NY,NYLI1021,NY_1021_Unqua_Influent,Nassau_County,Long_Island,Residential,Open Space,2.0,1980-10-03,,,autumn,Total,mg/L,59.3,=,298.5,40.66979722,73.44337778,outflow,Total Suspended Solids +1,NY,NYLI1021,NY_1021_Unqua_Influent,Nassau_County,Long_Island,Residential,Open Space,2.0,1980-10-25,,,autumn,Total,mg/L,68.4,=,298.5,40.66979722,73.44337778,outflow,Total Suspended Solids +1,NY,NYLI1021,NY_1021_Unqua_Influent,Nassau_County,Long_Island,Residential,Open Space,2.0,1980-11-17,,,autumn,Total,mg/L,24.2,=,298.5,40.66979722,73.44337778,outflow,Total Suspended Solids +1,NY,NYLI1021,NY_1021_Unqua_Influent,Nassau_County,Long_Island,Residential,Open Space,2.0,1981-02-02,,,winter,Total,mg/L,98.9,=,298.5,40.66979722,73.44337778,outflow,Total Suspended Solids +1,NY,NYLI1021,NY_1021_Unqua_Influent,Nassau_County,Long_Island,Residential,Open Space,2.0,1981-07-01,,,summer,Total,mg/L,58.4,=,298.5,40.66979722,73.44337778,outflow,Total Suspended Solids +1,NY,NYLI1021,NY_1021_Unqua_Influent,Nassau_County,Long_Island,Residential,Open Space,2.0,1981-07-20,,,summer,Total,mg/L,111.0,=,298.5,40.66979722,73.44337778,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1981-02-02,,,winter,Total,mg/L,106.0,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1981-03-11,,,winter,Total,mg/L,11.7,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1981-03-30,,,spring,Total,mg/L,23.4,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1981-04-14,,,spring,Total,mg/L,47.2,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1981-05-11,,,spring,Total,mg/L,26.2,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1981-06-02,,,spring,Total,mg/L,15.8,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1981-06-25,,,summer,Total,mg/L,94.2,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1981-07-28,,,summer,Total,mg/L,76.5,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1981-12-01,,,autumn,Total,mg/L,9.3,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1981-12-14,,,autumn,Total,mg/L,21.3,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1982-02-02,,,winter,Total,mg/L,27.0,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1982-02-09,,,winter,Total,mg/L,19.4,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1982-03-16,,,winter,Total,mg/L,15.2,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1982-03-26,,,spring,Total,mg/L,27.3,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1982-03-31,,,spring,Total,mg/L,55.0,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1982-04-13,,,spring,Total,mg/L,22.4,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1982-04-26,,,spring,Total,mg/L,33.2,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1982-06-01,,,spring,Total,mg/L,15.6,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1982-06-16,,,spring,Total,mg/L,29.0,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1982-06-29,,,summer,Total,mg/L,45.7,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1982-08-09,,,summer,Total,mg/L,187.7,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1982-09-01,,,summer,Total,mg/L,31.8,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,NY,NYLI1031,NY1031_Carlls_River_Street_Sweeping,Suffolk_County,Long_Island,Residential,,2.0,1982-10-25,,,autumn,Total,mg/L,43.6,=,73.0,40.74841111,73.34728056,outflow,Total Suspended Solids +1,WI,WIMAHARO,Harper_Road,-,Madison,Residential,,,1993-06-17,,0.2,spring,Total,mg/L,110.0,=,41.1,,,outflow,Total Suspended Solids +1,WI,WIMAHARO,Harper_Road,-,Madison,Residential,,,1993-06-24,,0.52,summer,Total,mg/L,113.0,=,41.1,,,outflow,Total Suspended Solids +1,WI,WIMAHARO,Harper_Road,-,Madison,Residential,,,1993-07-24,,1.18,summer,Total,mg/L,83.0,=,41.1,,,outflow,Total Suspended Solids +1,WI,WIMAHARO,Harper_Road,-,Madison,Residential,,,1993-08-09,,0.62,summer,Total,mg/L,118.0,=,41.1,,,outflow,Total Suspended Solids +1,WI,WIMAHARO,Harper_Road,-,Madison,Residential,,,1993-10-08,,0.37,autumn,Total,mg/L,50.0,=,41.1,,,outflow,Total Suspended Solids +1,WI,WIMAHARO,Harper_Road,-,Madison,Residential,,,1993-10-20,,0.25,autumn,Total,mg/L,11.0,=,41.1,,,outflow,Total Suspended Solids +1,WI,WIMAHARO,Harper_Road,-,Madison,Residential,,,1993-11-12,,0.29,autumn,Total,mg/L,58.0,=,41.1,,,outflow,Total Suspended Solids +1,WI,WIMAHARO,Harper_Road,-,Madison,Residential,,,1994-08-30,,0.29,summer,Total,mg/L,27.0,=,41.1,,,outflow,Total Suspended Solids +1,WI,WIMAHARO,Harper_Road,-,Madison,Residential,,,1994-09-14,,0.8,summer,Total,mg/L,21.0,=,41.1,,,outflow,Total Suspended Solids +1,WI,WIMALAAV,Lakeland_Ave,-,Madison,Residential,,,1993-06-17,,0.57,spring,Total,mg/L,92.0,=,73.7,,,outflow,Total Suspended Solids +1,WI,WIMALAAV,Lakeland_Ave,-,Madison,Residential,,,1993-07-25,,1.27,summer,Total,mg/L,103.0,=,73.7,,,outflow,Total Suspended Solids +1,WI,WIMALAAV,Lakeland_Ave,-,Madison,Residential,,,1993-08-09,,0.39,summer,Total,mg/L,132.0,=,73.7,,,outflow,Total Suspended Solids +1,WI,WIMALAAV,Lakeland_Ave,-,Madison,Residential,,,1993-11-12,,0.27,autumn,Total,mg/L,62.0,=,73.7,,,outflow,Total Suspended Solids +1,WI,WIMALAAV,Lakeland_Ave,-,Madison,Residential,,,1994-03-20,,0.23,winter,Total,mg/L,165.0,=,73.7,,,outflow,Total Suspended Solids +1,WI,WIMALAAV,Lakeland_Ave,-,Madison,Residential,,,1994-04-12,,0.5,spring,Total,mg/L,252.0,=,73.7,,,outflow,Total Suspended Solids +1,WI,WIMATODR,Todd_Drive,-,Madison,Residential,Commercial,,1993-06-17,,0.39,spring,Total,mg/L,93.0,=,83.2,,,outflow,Total Suspended Solids +1,WI,WIMATODR,Todd_Drive,-,Madison,Residential,Commercial,,1993-06-24,,0.68,summer,Total,mg/L,113.0,=,83.2,,,outflow,Total Suspended Solids +1,WI,WIMATODR,Todd_Drive,-,Madison,Residential,Commercial,,1993-08-09,,0.73,summer,Total,mg/L,180.0,=,83.2,,,outflow,Total Suspended Solids +1,WI,WIMATODR,Todd_Drive,-,Madison,Residential,Commercial,,1993-10-08,,0.28,autumn,Total,mg/L,23.0,=,83.2,,,outflow,Total Suspended Solids +1,WI,WIMATODR,Todd_Drive,-,Madison,Residential,Commercial,,1993-10-20,,0.17,autumn,Total,mg/L,31.0,=,83.2,,,outflow,Total Suspended Solids +1,WI,WIMATODR,Todd_Drive,-,Madison,Residential,Commercial,,1994-08-12,,0.26,summer,Total,mg/L,217.0,=,83.2,,,outflow,Total Suspended Solids +1,WI,WIMATODR,Todd_Drive,-,Madison,Residential,Commercial,,1994-09-22,,0.23,autumn,Total,mg/L,23.0,=,83.2,,,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-04-04,,,spring,Total,mg/L,1174.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-04-08,,,spring,Total,mg/L,284.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-04-10,,,spring,Total,mg/L,282.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-04-13,,,spring,Total,mg/L,236.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-04-23,,,spring,Total,mg/L,238.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-05-10,,,spring,Total,mg/L,152.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-05-29,,,spring,Total,mg/L,370.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-06-08,,,spring,Total,mg/L,155.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-06-13,,,spring,Total,mg/L,135.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-06-20,,,spring,Total,mg/L,156.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-07-12,,,summer,Total,mg/L,225.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-07-13,,,summer,Total,mg/L,130.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-07-17,,,summer,Total,mg/L,625.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-07-20,,,summer,Total,mg/L,115.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-07-27,,,summer,Total,mg/L,90.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-08-14,,,summer,Total,mg/L,230.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-08-15,,,summer,Total,mg/L,245.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-08-29,,,summer,Total,mg/L,290.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-09-01,,,summer,Total,mg/L,230.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-09-07,,,summer,Total,mg/L,80.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-09-25,,,autumn,Total,mg/L,90.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-09-26,,,autumn,Total,mg/L,125.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMILICR,Lincoln_Creek,Milwaukee_County,Milwaukee,Residential,,57.0,1981-10-06,,,autumn,Total,mg/L,275.0,=,36.1,43.09991806,87.98057778,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1980-06-06,,,spring,Total,mg/L,362.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1980-06-07,,,spring,Total,mg/L,276.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1980-06-28,,,summer,Total,mg/L,348.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1980-07-05,,,summer,Total,mg/L,234.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1980-07-09,,,summer,Total,mg/L,186.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1980-07-16,,,summer,Total,mg/L,186.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1980-08-02,,,summer,Total,mg/L,570.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1980-08-04,,,summer,Total,mg/L,290.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1980-08-07,,,summer,Total,mg/L,388.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1980-08-11,,,summer,Total,mg/L,192.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1980-09-16,,,summer,Total,mg/L,128.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1980-09-20,,,summer,Total,mg/L,178.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1980-09-25,,,autumn,Total,mg/L,116.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1980-10-02,,,autumn,Total,mg/L,494.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1980-11-23,,,autumn,Total,mg/L,242.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1980-12-06,,,autumn,Total,mg/L,448.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1980-12-08,,,autumn,Total,mg/L,262.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-02-22,,,winter,Total,mg/L,514.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-04-04,,,spring,Total,mg/L,534.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-04-08,,,spring,Total,mg/L,246.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-04-10,,,spring,Total,mg/L,232.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-04-13,,,spring,Total,mg/L,194.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-04-22,,,spring,Total,mg/L,214.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-05-10,,,spring,Total,mg/L,162.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-06-08,,,spring,Total,mg/L,320.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-06-13,,,spring,Total,mg/L,150.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-06-20,,,spring,Total,mg/L,182.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-07-12,,,summer,Total,mg/L,250.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-07-13,,,summer,Total,mg/L,495.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-07-17,,,summer,Total,mg/L,365.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-07-20,,,summer,Total,mg/L,170.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-07-25,,,summer,Total,mg/L,190.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-07-27,,,summer,Total,mg/L,100.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-08-07,,,summer,Total,mg/L,320.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-08-14,,,summer,Total,mg/L,270.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-08-15,,,summer,Total,mg/L,250.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-08-28,,,summer,Total,mg/L,155.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-08-29,,,summer,Total,mg/L,280.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-08-31,,,summer,Total,mg/L,135.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-09-07,,,summer,Total,mg/L,315.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-09-25,,,autumn,Total,mg/L,155.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-09-25,,,autumn,Total,mg/L,260.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-10-01,,,autumn,Total,mg/L,190.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-10-14,,,autumn,Total,mg/L,185.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINBUR,N_Burbank_633,Milwaukee_County,Milwaukee,Residential,,5.0,1981-10-17,,,autumn,Total,mg/L,230.0,=,62.6,43.14019722,88.02106944,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1980-06-02,,,spring,Total,mg/L,98.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1980-06-06,,,spring,Total,mg/L,122.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1980-06-07,,,spring,Total,mg/L,130.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1980-06-28,,,summer,Total,mg/L,82.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1980-08-04,,,summer,Total,mg/L,104.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1980-08-08,,,summer,Total,mg/L,122.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1980-08-11,,,summer,Total,mg/L,108.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1980-08-16,,,summer,Total,mg/L,54.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1980-08-19,,,summer,Total,mg/L,64.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1980-09-12,,,summer,Total,mg/L,76.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1980-09-16,,,summer,Total,mg/L,76.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1980-09-20,,,summer,Total,mg/L,122.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1980-09-25,,,autumn,Total,mg/L,94.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1980-10-16,,,autumn,Total,mg/L,110.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1980-10-24,,,autumn,Total,mg/L,108.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1980-12-06,,,autumn,Total,mg/L,190.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1981-02-15,,,winter,Total,mg/L,488.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1981-02-16,,,winter,Total,mg/L,308.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1981-02-22,,,winter,Total,mg/L,270.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1981-04-22,,,spring,Total,mg/L,142.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1981-05-23,,,spring,Total,mg/L,175.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1981-06-15,,,spring,Total,mg/L,165.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1981-06-20,,,spring,Total,mg/L,70.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids +1,WI,WIMINHAS,N_Hastings,Milwaukee_County,Milwaukee,Residential,,51.3,1981-07-25,,,summer,Total,mg/L,85.0,=,32.84,43.13960278,88.02699167,outflow,Total Suspended Solids diff --git a/examples/medians/NSQD_Res_TSS.xlsx b/examples/medians/NSQD_Res_TSS.xlsx new file mode 100644 index 0000000..b5f2393 Binary files /dev/null and b/examples/medians/NSQD_Res_TSS.xlsx differ diff --git a/examples/output/img/HydroHistogram/.gitignore b/examples/output/img/HydroHistogram/.gitignore new file mode 100644 index 0000000..72e8ffc --- /dev/null +++ b/examples/output/img/HydroHistogram/.gitignore @@ -0,0 +1 @@ +* diff --git a/pycvc/dataAccess.py b/pycvc/dataAccess.py index 9dded0d..dc34ebf 100644 --- a/pycvc/dataAccess.py +++ b/pycvc/dataAccess.py @@ -19,6 +19,11 @@ # CVC-specific wqio.events subclasses from .samples import GrabSample, CompositeSample, Storm +try: + from tqdm import tqdm +except ImportError: # pragma: no cover + tqdm = lambda x: x + __all__ = ['Database', 'Site'] @@ -39,8 +44,6 @@ def _grouped_seasons(timestamp): return 'winter/spring' elif season.lower() in ['summer', 'autumn']: return 'summer/autumn' - else: - raise ValueError("{} is not a valid season".format(season)) def _remove_storms_from_df(df, dates, datecol): @@ -53,8 +56,8 @@ def _remove_storms_from_df(df, dates, datecol): # loop through all of the excluded dates for d in dates: - # # convert to a proper python date object - excl_date = wqio.utils.santizeTimestamp(d).date() + # convert to a proper python date object + excl_date = utils.santizeTimestamp(d).date() storm_rows = df.loc[df[datecol].dt.date == excl_date] excluded_storms.extend(storm_rows['storm_number'].values) @@ -75,17 +78,12 @@ class Database(object): bmpdb : cvc.external.nsqd object Data structure representing the Internation Stormwater BMP Database. - testing : bool (default = False) - When True, the data only go back to 2014 to speed up the - analysis. - """ - def __init__(self, dbfile, nsqdata=None, bmpdb=None, testing=False): + def __init__(self, dbfile, nsqdata=None, bmpdb=None): self.dbfile = dbfile self.nsqdata = nsqdata self.bmpdb = bmpdb - self.testing = testing self._sites = None self._wqstd = None @@ -109,8 +107,7 @@ def connect(self): @property def sites(self): if self._sites is None: - with self.connect() as cnn: - self._sites = pandas.read_sql("select * from sites", cnn) + self._sites = self._run_query("select * from sites") return self._sites def _check_site(self, site): @@ -187,9 +184,6 @@ def getWQData(self, site, onlyPOCs=True): if onlyPOCs: wq = wq[wq['parameter'].isin(info.getPOCs())] - if self.testing: - wq = wq[wq['samplestart'].dt.year == 2014] - return wq def getHydroData(self, site, resamplePeriodMinutes=10): @@ -235,9 +229,6 @@ def getHydroData(self, site, resamplePeriodMinutes=10): resampleOffset = pandas.offsets.Minute(resamplePeriodMinutes) hydro = hydro.resample(resampleOffset, how=resample_dict) - if self.testing: - hydro = hydro.loc['2014'] - return hydro def getDrainageArea(self, site): @@ -291,9 +282,6 @@ def getSamples(self, site): samples = self._run_query(qry) - if self.testing: - samples = samples[samples['samplestart'].dt.year == 2014] - return samples def getRatingCurve(self, site): @@ -325,10 +313,10 @@ def wqstd(self): if self._wqstd is None: self._wqstd = self._run_query("select * from wq_standards") joincols = ['parameter', 'units'] - if self.nsqdata is not None: + if self.nsqdata is not None: # pragma: no cover self._wqstd = self._wqstd.merge(self.nsqdata.medians, on=joincols) - if self.bmpdb is not None: + if self.bmpdb is not None: # pragma: no cover self._wqstd = self._wqstd.merge(self.bmpdb.medians, on=joincols) return self._wqstd @@ -1073,7 +1061,7 @@ def allISRs(self, sampletype, version='draft'): # XXX: hack to load up storm info _ = self.storms - for sample in self.samples[sampletype]: + for sample in tqdm(self.samples[sampletype]): if sample.storm is not None: sample.templateISR = self.templateISR tex = sample.compileISR(version=version, clean=True) diff --git a/pycvc/external.py b/pycvc/external.py index 31992be..7181c80 100644 --- a/pycvc/external.py +++ b/pycvc/external.py @@ -29,7 +29,7 @@ def _fix_nsqd_bacteria_units(df, unitscol='units'): class nsqd: - def __init__(self, color, marker): + def __init__(self, color, marker, datafile=None): self.color = color self.marker = marker self._data = None @@ -42,6 +42,8 @@ def __init__(self, color, marker): 'epa_rain_zone', 'location_code', 'station_name', 'primary_landuse', 'start_date', 'season', 'station', 'parameter', 'units', ] + self.datafile = datafile + self.db = pynsqd.NSQData(datapath=self.datafile) @property def landuses(self): @@ -56,69 +58,79 @@ def data(self): if self._data is None: params = [p['nsqdname'] for p in POC_dicts] self._data = ( - pynsqd.NSQData() - .data - .query("primary_landuse != 'Unknown'") - .query("parameter in @params") - .query("fraction == 'Total'") - .query("epa_rain_zone == 1") - .assign(station='outflow') - .assign(cvcparam=lambda df: df['parameter'].apply(self._get_cvc_parameter)) - .assign(season=lambda df: df['start_date'].apply(wqio.utils.getSeason)) - .drop('parameter', axis=1) - .rename(columns={'cvcparam': 'parameter'}) - .groupby(by=self.index_cols) - .first() - .reset_index() - .pipe(_fix_nsqd_bacteria_units) + self.db + .data + .query("primary_landuse != 'Unknown'") + .query("parameter in @params") + .query("fraction == 'Total'") + .query("epa_rain_zone == 1") + .assign(cvcparam=lambda df: df['parameter'].apply(self._get_cvc_parameter)) + .drop('parameter', axis=1) + .rename(columns={'cvcparam': 'parameter'}) + .groupby(by=self.index_cols) + .first() + .reset_index() + .pipe(_fix_nsqd_bacteria_units) ) return self._data + + def _make_dc(self, which): + _dc_map = { + 'overall': ['units', 'primary_landuse'], + 'seasonal': ['units', 'primary_landuse', 'season'], + } + + dc = wqio.DataCollection( + self.data.set_index(self.index_cols), + ndval='<', + othergroups=_dc_map[which], + paramcol='parameter' + ) + + return dc + + + def _get_medians(self, which): + _med_dict = { + 'overall': self.datacollection.medians, + 'seasonal': self.seasonal_datacollection.medians, + } + + medians = ( + _med_dict[which.lower()] + ['outflow'] + .xs('Residential', level='primary_landuse') + .pipe(np.round, 3) + .reset_index() + .rename(columns={'stat': 'NSQD Medians'}) + ) + + return medians + @property def datacollection(self): if self._datacollection is None: - groupcols = ['units', 'primary_landuse'] - dc = wqio.DataCollection(self.data.set_index(self.index_cols), ndval='<', - othergroups=groupcols, paramcol='parameter') - - self._datacollection = dc + self._datacollection = self._make_dc('overall') return self._datacollection @property def medians(self): if self._medians is None: - self._medians = ( - self.datacollection - .medians['outflow'] - .xs(['Residential'], level=['primary_landuse']) - .pipe(np.round, 3) - .reset_index() - .rename(columns={'stat': 'NSQD Medians'}) - ) + self._medians = self._get_medians('overall') return self._medians @property def seasonal_datacollection(self): if self._seasonal_datacollection is None: - groupcols = ['units', 'primary_landuse', 'season'] - dc = wqio.DataCollection(self.data.set_index(self.index_cols), ndval='<', - othergroups=groupcols, paramcol='parameter') - - self._seasonal_datacollection = dc + self._seasonal_datacollection = self._make_dc('seasonal') return self._seasonal_datacollection @property def seasonal_medians(self): if self._seasonal_medians is None: - self._seasonal_medians = ( - self.seasonal_datacollection - .medians['outflow'] - .xs(['Residential'], level=['primary_landuse']) - .pipe(np.round, 3) - .reset_index() - .rename(columns={'stat': 'NSQD Median'}) - ) + self._seasonal_medians = self._get_medians('seasonal') return self._seasonal_medians @@ -134,7 +146,7 @@ def _get_cvc_parameter(nsqdparam): class bmpdb: - def __init__(self, color, marker): + def __init__(self, color, marker, datafile=None): self.color = color self.marker = marker self.paramnames = [p['bmpname'] for p in POC_dicts] @@ -145,8 +157,11 @@ def __init__(self, color, marker): lambda x: x['conc_units']['plain'] == 'CFU/100 mL', POC_dicts )) + self.datafile = datafile self.table, self.db = pybmpdb.getSummaryData( - catanalysis=False, astable=True, + dbpath=self.datafile, + catanalysis=False, + astable=True, parameter=self.paramnames, category=bmpcats_to_use, epazone=1, diff --git a/pycvc/info.py b/pycvc/info.py index d97e68d..407025e 100644 --- a/pycvc/info.py +++ b/pycvc/info.py @@ -1,3 +1,30 @@ +import numpy as np +import pandas + + +def getPOCs(): + return [p['cvcname'] for p in POC_dicts] + + +def getPOCInfo(critcol, critval, valcol): + values = list(filter(lambda poc: poc[critcol] == critval, POC_dicts)) + if len(values) > 1: + raise ValueError('`getPOCInfo` found multiple records') + else: + return values[0][valcol] + +def wqstd_template(): + seasons = ['summer', 'autumn', 'winter', 'spring'] + _template = pandas.DataFrame({ + 'parameter': [p['cvcname'] for p in POC_dicts], + 'units': [p['conc_units']['plain'] for p in POC_dicts] + }) + + df = pandas.concat([_template.assign(season=s) for s in seasons]) + df['influent median'] = np.nan + return df + + LITERS_PER_CUBICMETER = 1.0e3 MICROGRAMS_PER_GRAM = 1.0e6 MILLIGRAMS_PER_GRAM = 1.0e3 @@ -10,7 +37,7 @@ 'conc_units': { 'plain': 'ug/L', 'tex': r'\si[per-mode=symbol]{\micro\gram\per\liter}' - }, + }, 'load_units': 'g', 'load_factor': LITERS_PER_CUBICMETER / MICROGRAMS_PER_GRAM, 'group': 'A', @@ -22,7 +49,7 @@ 'conc_units': { 'plain': 'ug/L', 'tex': r'\si[per-mode=symbol]{\micro\gram\per\liter}' - }, + }, 'load_units': 'g', 'load_factor': LITERS_PER_CUBICMETER / MICROGRAMS_PER_GRAM, 'group': 'A', @@ -34,7 +61,7 @@ 'conc_units': { 'plain': 'ug/L', 'tex': r'\si[per-mode=symbol]{\micro\gram\per\liter}' - }, + }, 'load_units': 'g', 'load_factor': LITERS_PER_CUBICMETER / MICROGRAMS_PER_GRAM, 'group': 'A', @@ -46,7 +73,7 @@ 'conc_units': { 'plain': 'ug/L', 'tex': r'\si[per-mode=symbol]{\micro\gram\per\liter}' - }, + }, 'load_units': 'g', 'load_factor': LITERS_PER_CUBICMETER / MICROGRAMS_PER_GRAM, 'group': 'A', @@ -58,7 +85,7 @@ 'conc_units': { 'plain': 'ug/L', 'tex': r'\si[per-mode=symbol]{\micro\gram\per\liter}' - }, + }, 'load_units': 'g', 'load_factor': LITERS_PER_CUBICMETER / MICROGRAMS_PER_GRAM, 'group': 'A', @@ -70,7 +97,7 @@ 'conc_units': { 'plain': 'ug/L', 'tex': r'\si[per-mode=symbol]{\micro\gram\per\liter}' - }, + }, 'load_units': 'g', 'load_factor': LITERS_PER_CUBICMETER / MICROGRAMS_PER_GRAM, 'group': 'A', @@ -82,7 +109,7 @@ 'conc_units': { 'plain': 'ug/L', 'tex': r'\si[per-mode=symbol]{\micro\gram\per\liter}' - }, + }, 'load_units': 'g', 'load_factor': LITERS_PER_CUBICMETER / MICROGRAMS_PER_GRAM, 'group': 'A', @@ -94,7 +121,7 @@ 'conc_units': { 'plain': 'mg/L', 'tex': r'\si[per-mode=symbol]{\micro\gram\per\liter}' - }, + }, 'load_units': 'g', 'load_factor': LITERS_PER_CUBICMETER / MILLIGRAMS_PER_GRAM, 'group': 'B', @@ -106,7 +133,7 @@ 'conc_units': { 'plain': 'mg/L', 'tex': r'\si[per-mode=symbol]{\milli\gram\per\liter}' - }, + }, 'load_units': 'g', 'load_factor': LITERS_PER_CUBICMETER / MILLIGRAMS_PER_GRAM, 'group': 'B', @@ -118,7 +145,7 @@ 'conc_units': { 'plain': 'mg/L', 'tex': r'\si[per-mode=symbol]{\micro\gram\per\liter}' - }, + }, 'load_units': 'g', 'load_factor': LITERS_PER_CUBICMETER / MILLIGRAMS_PER_GRAM, 'group': 'B', @@ -130,7 +157,7 @@ 'conc_units': { 'plain': 'mg/L', 'tex': r'\si[per-mode=symbol]{\milli\gram\per\liter}' - }, + }, 'load_units': 'g', 'load_factor': LITERS_PER_CUBICMETER / MILLIGRAMS_PER_GRAM, 'group': 'B', @@ -142,7 +169,7 @@ 'conc_units': { 'plain': 'mg/L', 'tex': r'\si[per-mode=symbol]{\milli\gram\per\liter}' - }, + }, 'load_units': 'g', 'load_factor': LITERS_PER_CUBICMETER / MILLIGRAMS_PER_GRAM, 'group': 'B', @@ -154,7 +181,7 @@ 'conc_units': { 'plain': 'mg/L', 'tex': r'\si[per-mode=symbol]{\milli\gram\per\liter}' - }, + }, 'load_units': 'g', 'load_factor': LITERS_PER_CUBICMETER / MILLIGRAMS_PER_GRAM, 'group': 'B', @@ -166,7 +193,7 @@ 'conc_units': { 'plain': 'CFU/100 mL', 'tex': r'CFU/100 mL' - }, + }, 'load_units': 'CFU', 'load_factor': 10 * LITERS_PER_CUBICMETER, 'group': 'B', @@ -178,7 +205,7 @@ 'conc_units': { 'plain': 'mg/L', 'tex': r'\si[per-mode=symbol]{\milli\gram\per\liter}' - }, + }, 'load_units': 'g', 'load_factor': LITERS_PER_CUBICMETER / MILLIGRAMS_PER_GRAM, 'group': 'B', @@ -190,36 +217,10 @@ 'conc_units': { 'plain': 'mg/L', 'tex': r'\si[per-mode=symbol]{\milli\gram\per\liter}' - }, + }, 'load_units': 'g', 'load_factor': LITERS_PER_CUBICMETER / MILLIGRAMS_PER_GRAM, 'group': 'A', 'include': True, }, ] - -import numpy as np -import pandas - -def getPOCs(): - return [p['cvcname'] for p in POC_dicts] - - -def getPOCInfo(critcol, critval, valcol): - - values = list(filter(lambda poc: poc[critcol] == critval, POC_dicts)) - if len(values) > 1: - raise ValueError('`getPOCInfo` found multiple records') - else: - return values[0][valcol] - -def wqstd_template(): - seasons = ['summer', 'autumn', 'winter', 'spring'] - _template = pandas.DataFrame({ - 'parameter': [p['cvcname'] for p in POC_dicts], - 'units': [p['conc_units']['plain'] for p in POC_dicts] - }) - - df = pandas.concat([_template.assign(season=s) for s in seasons]) - df['influent median'] = np.nan - return df diff --git a/pycvc/samples.py b/pycvc/samples.py index 8cc656e..23d0f7e 100644 --- a/pycvc/samples.py +++ b/pycvc/samples.py @@ -149,8 +149,7 @@ def wq_table(self, writeToFiles=True): ] wqtable = wqtable[cols_to_keep].drop_duplicates() - # pragma: no cover - if writeToFiles: + if writeToFiles: # pragma: no cover csvpath = os.path.join('output', 'csv', self.wq_tex_table + '.csv') texpath = os.path.join('output', 'tex', 'ISR', self.wq_tex_table + '.tex') @@ -303,7 +302,7 @@ def make_samplefig(self, **figkwargs): loc='lower right') leg.get_frame().set_zorder(25) - viz._savefig(fig, self.storm_figure, extra='Storm', asPDF=True) + viz.savefig(fig, self.storm_figure, extra='Storm', asPDF=True) return fig def compileISR(self, version='draft', clean=False): @@ -430,12 +429,6 @@ def total_outflow_volume(self): def total_outflow_volume(self, value): self._total_outflow_volume = value - @np.deprecate - def _general_table(self, name): - """ Creates a simple string of a table of the basic storm info - """ - - return None def _hydro_table(self, name): """ @@ -485,95 +478,3 @@ def _hydro_table(self, name): ).format(**storm_values) return table - - @np.deprecate - def wideTableHeaders(self): - wide_header = ( - '"Storm Date",' - '"Sample Date",' - '"Antecedent Dry Period (days)",' - '"Event Duration (hr)",' - '"Peak Precipitation Intensity (mm/hr)",' - '"Total Precipitation (mm)",' - '"Peak Effluent Flow (L/s)",' - '"Total Estimated Influent Volume (L)",' - '"Total Effluent Volume (L)",' - '"Centroid Lag Time (hr)",' - '"Estimated Runoff Volume Reduction (L)",' - '"Estimated Runoff Volume Reduction (%)"\n' - ) - return wide_header - - @np.deprecate - def wideTableLine(self): - """ Creates a line to the "wide" table summarizing all storms - for a site. - - Parameters - ---------- - None - - Writes - ------ - None - - Returns - ------- - txt : string - CSV string for a single row in the larger summary table - - """ - - txt = '"{0:%Y-%m-%d}","{1}",{2:0.1f},"{3:,.0f}",' \ - '{4:0.1f},{5:0.1f},{6:0.1f},'\ - '"{7:,.0f}","{8:,.0f}","{9:,.0f}",' \ - '"{10:,.0f}","{11}%"\n'.format( - self.storm_start, utils.stringify(self.sampledate, '%s'), - self.antecedent_duration, self.duration, - self.peak_intensity, self.total_precip, - self.peak_flow, self.influent_volume, - self.total_volume, self.lag, - self.volume_reduction_liters, - utils.stringify(self.volume_reduction_percent, '%d') - ) - return txt - - @np.deprecate - def thinTableHeaders(self): - thin_header = ( - '"Storm Date",' - '"Total Precipitation (mm)",' - '"Lag Time (min)",' - '"Total Estimated Influent Volume (L)",' - '"Total Effluent Volume (L)",' - '"Estimated Peak Runoff (L/s)",' - '"Peak Effluent Flow (L/s)"\n' - ) - return thin_header - - @np.deprecate - def thinTableLine(self): - """ Creates a line to the "thin" table summarizing all storms - for a site. - - Parameters - ---------- - None - - Writes - ------ - None - - Returns - ------- - txt : string - CSV string for a single row in the larger summary table - - """ - - txt = '%s,%0.1f,%0.0f,%0.0f,%0.0f,%0.1f,%0.1f' % ( - self.storm_start, self.total_precip, self.lag, - self.influent_volume, self.total_volume, self.peak_flow, - self.peak_influent - ) - return txt diff --git a/pycvc/summary.py b/pycvc/summary.py index e94b81b..30d719c 100644 --- a/pycvc/summary.py +++ b/pycvc/summary.py @@ -22,10 +22,62 @@ def collect_tidy_data(sites, fxn): + """ + Collects and compiles tidy data from site objects + + Parameters + ---------- + sites : list of pycvc.dataAccess.Site + fxn : callable + Function to extract tidy data from the site. + + Returns + ------- + tidy : pandas.DataFrame + + Examples + -------- + >>> # assume we have site objects called ED1, LV1, LV2, and LV4 + >>> from pycvc import summary + >>> sites = [ED1, LV1, LV2, LV4] + + >>> # compile the water quality data + >>> wq = summary.collect_tidy_data(sites, lambda s: s.tidy_wq) + + >>> # compile the hydrologic summaries + >>> hydro = summary.collect_tidy_data(sites, lambda s: s.tidy_hydro) + + """ + return pandas.concat([fxn(site) for site in sites], ignore_index=True) def labels_from_bins(bins, units=None): + """ + Computes labels from a quantized column based on the bin edges. + Note that if you have open intervals at the extremes, you should + include arbitrary bounds (e.g., `np.inf` for the upper bound, + zero for the lower bound). + + Parameters + ---------- + bins : sequence of floats + Edges of the quantization bins. + units : string, optional + Units of measure to be appended to the labels. + + Returns + ------- + labels : list of string + + Examples + -------- + >>> from pycvc import summary + >>> summary.labels_from_bins([0, 5, 10, 15, np.inf], units='feet') + ['<5 feet', '5 - 10 feet', '10 - 15 feet', '>15 feet'] + + """ + labels = [] for left, right in zip(bins[:-1], bins[1:]): if left == 0: @@ -41,48 +93,218 @@ def labels_from_bins(bins, units=None): return list(labels) -def classify_storms(df, valuecol, newcol='storm_bin', bins=None): +def classify_storms(hydro, valuecol, newcol='storm_bin', bins=None): + """ + Classifies storm depths into 5-mm bins (i.e., <5 mm, 10 - 15 mm). + + Parameters + ---------- + hydro : pandas.DataFrame + Tidy dataframe of the hydrologic quantities of each storm. + valuecol : string + The label of the column you are classifying. + newcol : string, optional (storm_bin) + The label of the column where the classifications will be + saved in `tidy` + bins : sequence of floats + Edges of the quantization bins. + inplace : bool, optional (False) + Toggles executing the operation in place. When False, a modified + copy of ``hydro`` is returned. Otherwise, ``None`` is returned + and the original dataframe is modified. + + Returns + ------- + binned : pandas.DataFrame + A modified *copy* of ``hydro`` with the new column. + + Examples + -------- + >>> import numpy + >>> import pandas + >>> from pycvc import summary + >>> hydro = pandas.DataFrame({'storm': [1, 2, 3, 4], 'depth': [2.5, 6, 10, 23]}) + >>> bins = [0, 5, 10, 20, numpy.inf] + >>> summary.classify_storms(hydro, 'Depth', newcol='depth_bin', bins=bins) + depth storm depth_bin + 0 2.5 1 <5 mm + 1 6.0 2 5 - 10 mm + 2 10.0 3 5 - 10 mm + 3 23.0 4 >20 mm + + """ + if bins is None: bins = [0, 5, 10, 15, 20, 25, np.inf] labels = labels_from_bins(bins=bins, units='mm') - df[newcol] = pandas.cut(df[valuecol], bins=bins, labels=labels) - return df + classes = pandas.cut(hydro[valuecol], bins=bins, labels=labels) + return hydro.assign(**{newcol: classes}) def prevalence_table(wq, rescol='concentration', groupby_col=None): - """ Returns a sample prevalence table for the given sample type. + """ + Returns a prevalence table for water quality data collected in + composite samples. At a minimum, the data are grouped by the + ``'site'`` and ``'parameter'`` columns. + + Parameters + ---------- + wq : pandas.DataFrame + Tidy dataframe of the CVC water quality dataset. + rescol : string, optional ('concentration') + The label of the column in ``tidy`` to be analyzed + groupby_col : string, optional + Optional string that defines how results should be grouped + temporally. Valid options are "season", "grouped_season", + and "year". Default behavior does no temporal grouping. + + Returns + ------- + prevalence : pandas.DataFrame + + Examples + -------- + >>> import pandas + >>> from pycvc import summary + >>> tidy_file = 'output/tidy/wq_simple.csv' + >>> wq = ( + ... pandas.read_csv(tidy_file, parse_dates=['start_date', 'end_date']) + ... .pipe(summary.classify_storms, 'total_precip_depth') + ... .pipe(summary.remove_load_data_from_storms, ['2013-07-08'], 'start_date') + ... ) + >>> prevalence = summary.prevalence_table(wq, 'concentration', 'Season') + """ by = ['site', 'parameter'] if groupby_col is not None: by.append(validate.groupby_col(groupby_col)) - pt = ( + prevalence = ( wq.query("sampletype == 'composite'") .groupby(by=by) .count()[rescol] .unstack(level='parameter') .reset_index() ) - return pt + return prevalence def remove_load_data_from_storms(wq, stormdates, datecol): + """ + Sets all columns prefixed with "load_" to null (NaN) values for + certain storm dates. + + Parameters + ---------- + wq : pandas.DataFrame + Tidy dataframe of the CVC water quality dataset. + stormdates : list of date strings (format = 'yyyy-mm-dd') + List of stings of dates whose load values should be set to + null/NaN. + datecol : string + The label of the column containing the dates. + + Returns + ------- + cleaned_wq : pandas.DataFrame + + Examples + -------- + >>> import pandas + >>> from pycvc import summary + >>> tidy_file = 'output/tidy/wq_simple.csv' + >>> wq = pandas.read_csv(tidy_file, parse_dates=['start_date', 'end_date']) + >>> wq = summary.remove_load_data_from_storms(wq, ['2013-07-08'], 'start_date') + """ + if np.isscalar(stormdates): stormdates = [stormdates] cols_to_clean = wq.select(lambda c: c.startswith('load_'), axis=1).columns row_to_clean = wq[datecol].dt.date.isin(stormdates) - wq = wq.copy() - wq.loc[row_to_clean, cols_to_clean] = np.nan - return wq + cleaned_wq = wq.copy() + cleaned_wq.loc[row_to_clean, cols_to_clean] = np.nan + return cleaned_wq def pct_reduction(wq, incol, outcol): + """ + Computes the percent pollutant load reduction from a dataframe. + + Parameters + ---------- + wq : pandas.DataFrame + Tidy dataframe of the CVC water quality dataset. + incol, outcol : strings + Labels of the columns representing the influent and effluent + loads, respectively. + + Returns + ------- + red : pandas.Series + A series of percent load reduction values. + + Examples + -------- + >>> import pandas + >>> from pycvc import summary + >>> wq = pandas.DataFrame({'load_in': [25, 50, 75], 'load_out': [0, 25, 75]}) + >>> wq['pct_red'] = summary.pct_reduction(wq, 'load_in', 'load_out') + >>> wq + load_in load_out pct_red + 0 25 0 100 + 1 50 25 50 + 2 75 75 0 + + """ + return 100 * (wq[incol] - wq[outcol]) / wq[incol] def load_reduction_pct(wq, groupby_col=None, **load_cols): + """ + Adds the percent load reduction (with upper and lower bounds) to + a dataframe. + + Parameters + ---------- + wq : pandas.DataFrame + Tidy dataframe of the CVC water quality dataset. + groupby_col : string, optional + Optional string that defines how results should be grouped + temporally. Valid options are "season", "grouped_season", + and "year". Default behavior does no temporal grouping. + + Other Parameters + ---------------- + load_inflow, load_outflow : str + Labels of columns with the influent and effluent load estimates. + load_inflow_lower, load_outflow_lower : str + Labels of columns with the lower bounds of the influent and + effluent load estimates. + load_inflow_upper, load_outflow_upper : str + Labels of columns with the upper bounds of the influent and + effluent load estimates. + + Returns + ------- + red : pandas.DataFrame + Summarized load reduction data. + + Examples + -------- + >>> import pandas + >>> from pycvc import summary + >>> tidy_file = 'output/tidy/wq_simple.csv' + >>> wq = ( + ... pandas.read_csv(tidy_file, parse_dates=['start_date', 'end_date']) + ... .pipe(summary.classify_storms, 'total_precip_depth') + ... .pipe(summary.remove_load_data_from_storms, ['2013-07-08'], 'start_date') + ... ) + >>> red = summary.load_reduction_pct(wq, groupby_col='season') + + """ load_in = load_cols.pop('load_inflow', 'load_inflow') load_out = load_cols.pop('load_outflow', 'load_outflow') load_in_lower = load_cols.pop('load_inflow_lower', 'load_inflow_lower') @@ -229,10 +451,13 @@ def pct_reduction(df, incol, outcol): def storm_stats(hydro, minprecip=0, excluded_dates=None, groupby_col=None): - """ Statistics summarizing all the storm events + """ + Statistics summarizing all the storm events. Parameters ---------- + hydro : pandas.DataFrame + Tidy dataframe of the hydrologic quantities of each storm. minprecip : float (default = 0) The minimum amount of precipitation required to for a storm to be included. Using 0 (the default) will likely include @@ -241,12 +466,9 @@ def storm_stats(hydro, minprecip=0, excluded_dates=None, groupby_col=None): This is a list of storm start dates that will be removed from the storms dataframe prior to computing statistics. groupby_col : string, optional - Optional string that defined how results should be group + Optional string that defines how results should be grouped temporally. Valid options are "season", "grouped_season", - and year. Default behavior does no temporal grouping. - **winsor_params : optional keyword arguments - Dictionary of column names (from `Site.storm_info`) and - percetiles at which those columns should be winsorized. + and "year". Default behavior does no temporal grouping. Returns ------- @@ -256,7 +478,14 @@ def storm_stats(hydro, minprecip=0, excluded_dates=None, groupby_col=None): -------- pycvc.Site.storm_info wqio.units.winsorize_dataframe - scipy.stats.mstats.winsorize + + Examples + -------- + >>> import pandas + >>> from pycvc import summary + >>> tidy_file = 'output/tidy/hydro_simple.csv' + >>> hydro = pandas.read_csv(tidy_file, parse_dates=['start_date', 'end_date']) + >>> summary.storm_stats(hydro, excluded_dates=['2013-07-08'], groupby_col='year') """ @@ -286,25 +515,46 @@ def storm_stats(hydro, minprecip=0, excluded_dates=None, groupby_col=None): def wq_summary(wq, rescol='concentration', sampletype='composite', groupby_col=None): - """ Basic water quality Statistics + """ + Basic water quality Statistics. Parameters ---------- + wq : pandas.DataFrame + Tidy dataframe of the CVC water quality dataset. rescol : string (default = 'concentration') - The result column to summaryize. Valid values are + The result column to summarized. Valid values are "concentration" and "load_outflow". sampletype : string (default = 'composite') The types of samples to be summarized. Valid values are - "composite" and "grab". + "composite" and "unsampled". groupby_col : string, optional - Optional string that defined how results should be group + Optional string that defines how results should be grouped temporally. Valid options are "season", "grouped_season", - and year. Default behavior does no temporal grouping. + and "year". Default behavior does no temporal grouping. Returns ------- summary : pandas.DataFrame + Examples + -------- + >>> # load data + >>> import pandas + >>> from pycvc import summary + >>> tidy_file = 'output/tidy/wq_simple.csv' + >>> wq = ( + ... pandas.read_csv(tidy_file, parse_dates=['start_date', 'end_date']) + ... .pipe(summary.classify_storms, 'total_precip_depth') + ... .pipe(summary.remove_load_data_from_storms, ['2013-07-08'], 'start_date') + ... ) + + >>> # summarize concentrations by season + >>> summary.wq_summary(wq, groupby_col='season') + + >>> # summarize effluent loads by year + >>> summary.wq_summary(wq, rescol='load_outflow', groupby_col='year') + """ rescol, unitscol = validate.rescol(rescol) @@ -367,28 +617,38 @@ def wq_summary(wq, rescol='concentration', sampletype='composite', def load_totals(wq, groupby_col=None, NAval=0): - """ Returns the total loads for sampled storms and the given - sampletype. + """ + Returns the total loads. Parameters ---------- - sampletype : string (default = 'composite') - The types of samples to be summarized. Valid values are - "composite" and "grab". + wq : pandas.DataFrame + Tidy dataframe of the CVC water quality dataset. groupby_col : string, optional - Optional string that defined how results should be group + Optional string that defines how results should be grouped temporally. Valid options are "season", "grouped_season", - and year. Default behavior does no temporal grouping. - excluded_dates : list of date-likes, optional - This is a list of storm start dates that will be removed - from the storms dataframe prior to computing statistics. + and "year". Default behavior does no temporal grouping. NAval : float, optional Default value with which NA (missing) loads will be filled. - If none, NAs will remain inplace. + If none, NAs will remain in place. Returns ------- - sampled_loads : pandas.DataFrame + total_loads : pandas.DataFrame + + Examples + -------- + >>> # load data + >>> import pandas + >>> from pycvc import summary + >>> tidy_file = 'output/tidy/wq_simple.csv' + >>> wq = ( + ... pandas.read_csv(tidy_file, parse_dates=['start_date', 'end_date']) + ... .pipe(summary.classify_storms, 'total_precip_depth') + ... .pipe(summary.remove_load_data_from_storms, ['2013-07-08'], 'start_date') + ... ) + >>> # summarize loads by year + >>> summary.load_totals(wq, groupby_col='year') """ diff --git a/pycvc/tests/dataaccess_tests.py b/pycvc/tests/dataaccess_tests.py index f38dbee..f4da090 100644 --- a/pycvc/tests/dataaccess_tests.py +++ b/pycvc/tests/dataaccess_tests.py @@ -2,12 +2,19 @@ import os from six import StringIO import datetime +from pkg_resources import resource_filename +import textwrap +from io import StringIO import nose.tools as nt -import numpy as np +from nose.plugins.attrib import attr +from unittest import mock import numpy.testing as nptest -import pandas import pandas.util.testing as pdtest + + +import numpy as np +import pandas import pyodbc import wqio @@ -16,6 +23,27 @@ from pycvc import dataAccess +ON_WINDOWS = sys.platform == 'win32' + + +@nt.nottest +def load_test_data(filename, **opts): + return pandas.read_csv(resource_filename('pycvc.tests.testdata', filename), **opts) + + +def test_fix_cvc_bacteria_units(): + df = pandas.DataFrame({ + 'UOM': ['mg/L', 'ft', 'CFU/100mL', 'CFU/100 mL'], + }) + + expected = pandas.DataFrame({ + 'UOM': ['mg/L', 'ft', 'CFU/100 mL', 'CFU/100 mL'], + }) + + result = dataAccess._fix_cvc_bacteria_units(df, unitscol='UOM') + pdtest.assert_frame_equal(result, expected) + + class test__grouped_season(object): def setup(self): self.winter = '2012-02-02' @@ -35,10 +63,6 @@ def test_summer(self): def test_autumn(self): nt.assert_equal(dataAccess._grouped_seasons(self.autumn), 'summer/autumn') - @nt.raises(ValueError) - def test_junk(self): - dataAccess._grouped_seasons("junk") - class test__remove_storms_from_df(object): def setup(self): @@ -66,3 +90,249 @@ def test_datecol2(self): df = dataAccess._remove_storms_from_df(self.df, self.exclude_dates, 'datecol2') nt.assert_tuple_equal(df.shape, self.known_datecol2_shape) + def test_with_scalar(self): + df = dataAccess._remove_storms_from_df(self.df, self.exclude_dates[0], 'datecol1') + known_shape = (18, 3) + nt.assert_tuple_equal(df.shape, known_shape) + + +class test_Database_no_externals(object): + def setup(self): + dbfile = resource_filename("pycvc.tests.testdata", "test.accdb") + self.db = dataAccess.Database(dbfile) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_connect(self): + with self.db.connect() as cnn: + nt.assert_true(isinstance(cnn, pyodbc.Connection)) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_sites(self): + cols = ['site', 'sitename', 'total_area', + 'impervious_area', 'bmp_area', + 'weir_height_mm'] + expected = pandas.DataFrame({ + 'bmp_area': {0: 675.0, 1: 0.0, 2: 541.0, 3: 336.0}, + 'impervious_area': {0: 2578.0, 1: 4632.0, 2: 5838.0, 3: 1148.0}, + 'site': {0: 'ED-1', 1: 'LV-1', 2: 'LV-2', 3: 'LV-4'}, + 'sitename': { + 0: 'Elm Drive', 1: 'Lakeview Curb and Gutter', + 2: 'Lakeview Grass Swales', + 3: 'Lakeview Bioswales and Permeable Pavement' + }, + 'total_area': {0: 5781.0, 1: 17799.0, 2: 16962.0, 3: 3785.0}, + 'weir_height_mm': {0: 155, 1: 165, 2: 152, 3: 490}, + })[cols] + + pdtest.assert_frame_equal(expected, self.db.sites) + + @nptest.dec.skipif(not ON_WINDOWS) + def test__check_site(self): + nt.assert_equal('ED-1', self.db._check_site('ED-1')) + nt.assert_raises(ValueError, self.db._check_site, 'junk') + + @nptest.dec.skipif(not ON_WINDOWS) + def test_getWQData(self): + ed1 = self.db.getWQData('ED-1') + nt.assert_true(isinstance(ed1, pandas.DataFrame)) + nt.assert_tuple_equal(ed1.shape, (12, 11)) + + lv1 = self.db.getWQData('LV-1') + nt.assert_true(isinstance(lv1, pandas.DataFrame)) + nt.assert_tuple_equal(lv1.shape, (0, 11)) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_getHydroData(self): + ed1 = self.db.getHydroData('ED-1') + nt.assert_true(isinstance(ed1, pandas.DataFrame)) + nt.assert_tuple_equal(ed1.shape, (39600, 2)) + nt.assert_true(isinstance(ed1.index, pandas.DatetimeIndex)) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_getDrainageArea(self): + da = self.db.getDrainageArea('ED-1') + nt.assert_true(isinstance(da, wqio.DrainageArea)) + nt.assert_equal(da.total_area, 5781) + nt.assert_equal(da.bmp_area, 675) + nt.assert_equal(da.imp_area, 2578) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_getSamples(self): + df = self.db.getSamples('ED-1') + nt.assert_true(isinstance(df, pandas.DataFrame)) + nt.assert_tuple_equal(df.shape, (6, 11)) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_getRatingCurve(self): + df = self.db.getRatingCurve('ED-1') + nt.assert_true(isinstance(df, pandas.DataFrame)) + nt.assert_tuple_equal(df.shape, (363, 2)) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_wqstd(self): + nt.assert_true(isinstance(self.db.wqstd, pandas.DataFrame)) + nt.assert_tuple_equal(self.db.wqstd.shape, (48, 4)) + nt.assert_list_equal( + ['parameter', 'units', 'lower_limit', 'upper_limit'], + self.db.wqstd.columns.tolist() + ) + + +class test_Site(object): + @nptest.dec.skipif(not ON_WINDOWS) + def setup(self): + dbfile = resource_filename("pycvc.tests.testdata", "test.accdb") + self.db = dataAccess.Database(dbfile) + + influentcsv = StringIO(textwrap.dedent("""\ + parameter,units,season,influent lower,influent median,influent upper + Cadmium (Cd),ug/L,autumn,0.117,0.361,0.55 + Cadmium (Cd),ug/L,spring,0.172,0.352,0.53 + Cadmium (Cd),ug/L,summer,0.301,0.411,0.46 + Cadmium (Cd),ug/L,winter,0.355,0.559,1.125 + Lead (Pb),ug/L,autumn,6.173,10.9,16.25 + Lead (Pb),ug/L,spring,8.6,19.9,28.0 + Lead (Pb),ug/L,summer,7.69,17.9,22.6 + Lead (Pb),ug/L,winter,9.0,27.0,47.5 + """)) + self.influent = pandas.read_csv(influentcsv) + + self.runoff_fxn = lambda r: 10**(1.58 + 0.02*r['total_precip_depth']) + self.bypass_fxn = lambda r: max(0, 1.22 * r['total_precip_depth']) + self.inflow_fxn = lambda r: max(0, self.runoff_fxn(r) - self.bypass_fxn(r)) + + self.site = dataAccess.Site( + db=self.db, siteid='ED-1', raingauge='ED-1', + influentmedians=self.influent, color='b', marker='s', + tocentry='Elm Drive', runoff_fxn=self.runoff_fxn, + bypass_fxn=self.bypass_fxn, inflow_fxn=self.inflow_fxn, + ) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_influent_medians(self): + pdtest.assert_frame_equal(self.site.influentmedians, self.influent) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_hydro_functions(self): + nt.assert_equal(self.site.runoff_fxn, self.runoff_fxn) + nt.assert_equal(self.site.bypass_fxn, self.bypass_fxn) + nt.assert_equal(self.site.inflow_fxn, self.inflow_fxn) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_wqstd(self): + pdtest.assert_frame_equal(self.site.wqstd, self.db.wqstd) + + @nptest.dec.skipif(not ON_WINDOWS) + def test__rating_curve_data(self): + nt.assert_true(isinstance(self.site._rating_curve_data, pandas.DataFrame)) + nt.assert_list_equal( + self.site._rating_curve_data.columns.tolist(), + ['head_mm', 'flow_lps'] + ) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_drainage_area(self): + nt.assert_equal(self.site.drainagearea.simple_method(10), 32842.5) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_wqdata(self): + expected_columns = ['site', 'sample', 'sampletype', 'samplestart', 'samplestop', + 'interval_minutes', 'parameter', 'units', 'detectionlimit', + 'qualifier', 'concentration', 'season', 'grouped_season', 'year'] + expected_shape = (12, 14) + + nt.assert_list_equal(self.site.wqdata.columns.tolist(), expected_columns) + nt.assert_tuple_equal(self.site.wqdata.shape, expected_shape) + self.site.wqdata.to_csv("pycvc/tests/testdata/baseline_wqdata.csv", index=False) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_hydrodata(self): + expected = load_test_data('baseline_hydrodata.csv') + pdtest.assert_frame_equal( + self.site.hydrodata.data.reset_index(drop=True), expected, + check_dtype=False + ) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_sample_info(self): + datecols = ['samplestart', 'samplestop', 'collectiondate'] + expected = load_test_data('baseline_sample_info.csv', parse_dates=datecols) + self.site.sample_info['samplestart'] + pdtest.assert_frame_equal(self.site.sample_info, expected) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_grabdates(self): + dates = pandas.Series(map( + pandas.Timestamp, + ['2012-07-31 12:20:00', '2012-08-10 03:20:00', '2012-08-11 11:37:00' + ]), index=[0, 2, 4], name='samplestart') + pdtest.assert_series_equal(self.site.grabdates, dates) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_compdates(self): + dates = pandas.Series(map( + pandas.Timestamp, + ['2012-07-31 12:24:00', '2012-08-10 03:24:00', '2012-08-11 11:41:00' + ]), index=[1, 3, 5], name='samplestart') + pdtest.assert_series_equal(self.site.compdates, dates) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_compendtimees(self): + dates = pandas.Series(map( + pandas.Timestamp, + ['2012-07-31 16:45:00', '2012-08-10 20:54:00', '2012-08-11 17:31:00' + ]), index=[1, 3, 5], name='samplestop') + pdtest.assert_series_equal(self.site.compendtimes, dates) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_max_flow(self): + nt.assert_equal(self.site.max_flow, 10.957) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_max_inflow(self): + nt.assert_true(np.isnan(self.site.max_inflow)) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_sampled_storms(self): + with mock.patch.object(self.site, '_get_storms_with_data') as _gsd: + _ = self.site.sampled_storms + _gsd.assert_called_once_with(sampletype='composite') + + @nptest.dec.skipif(not ON_WINDOWS) + def test_unsampled_storms(self): + with mock.patch.object(self.site, '_get_storms_without_data') as _gsd: + _ = self.site.unsampled_storms + _gsd.assert_called_once_with(sampletype='composite') + + @nptest.dec.skipif(not ON_WINDOWS) + def test_storms(self): + nt.assert_true(isinstance(self.site.storms, dict)) + nt.assert_equal(len(self.site.storms), 27) + for sn in self.site.storms: + nt.assert_true(isinstance(self.site.storms[sn], wqio.Storm)) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_all_samples(self): + nt.assert_true(isinstance(self.site.all_samples, list)) + nt.assert_equal(len(self.site.all_samples), 6) + for s in self.site.all_samples: + nt.assert_true(isinstance(s, wqio.GrabSample) or isinstance(s, wqio.CompositeSample)) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_sample(self): + nt.assert_list_equal( + sorted(list(self.site.samples.keys())), + ['composite', 'grab'] + ) + + for cs in self.site.samples['composite']: + nt.assert_true(isinstance(cs, wqio.CompositeSample)) + + for gs in self.site.samples['grab']: + nt.assert_true(isinstance(gs, wqio.GrabSample)) + + @nptest.dec.skipif(not ON_WINDOWS) + def test_storm_info(self): + expected = load_test_data('baseline_storm_info.csv', parse_dates=['start_date', 'end_date']) + expected = expected.assign(year=expected['year'].astype(str)) + pdtest.assert_frame_equal(self.site.storm_info, expected) diff --git a/pycvc/tests/external_tests.py b/pycvc/tests/external_tests.py new file mode 100644 index 0000000..794fc0b --- /dev/null +++ b/pycvc/tests/external_tests.py @@ -0,0 +1,41 @@ +import sys +import os +from six import StringIO +import datetime +from pkg_resources import resource_filename +import textwrap +from io import StringIO + +import nose.tools as nt +from nose.plugins.attrib import attr +from unittest import mock +import numpy.testing as nptest +import pandas.util.testing as pdtest + + +import numpy as np +import pandas +import pyodbc + +import wqio +from wqio import utils + +from pycvc import dataAccess, external + + +def test__fix_nsqd_bacteria_units(): + cols = ['param', 'conc_units', 'res'] + inputdf = pandas.DataFrame({ + 'conc_units': ['MPN/100 mL', 'MPN/100 mL', 'CFU/100 mL', 'ug/L'], + 'param': ['E Coli', 'E Coli', 'Fecal', 'Copper'], + 'res': [1, 2, 3, 4] + }) + + outputdf = external._fix_nsqd_bacteria_units(inputdf, unitscol='conc_units') + expected = pandas.DataFrame({ + 'conc_units': ['CFU/100 mL', 'CFU/100 mL', 'CFU/100 mL', 'ug/L'], + 'param': ['E Coli', 'E Coli', 'Fecal', 'Copper'], + 'res': [1, 2, 3, 4] + }) + + pdtest.assert_frame_equal(outputdf[cols], expected[cols]) diff --git a/pycvc/tests/info_tests.py b/pycvc/tests/info_tests.py new file mode 100644 index 0000000..1ea3b96 --- /dev/null +++ b/pycvc/tests/info_tests.py @@ -0,0 +1,52 @@ +import nose.tools as nt +import pandas.util.testing as pdtest + +import pandas + +from pycvc import info + + +def test_constants(): + nt.assert_equal(info.LITERS_PER_CUBICMETER, 1000) + nt.assert_equal(info.MICROGRAMS_PER_GRAM, 1000000) + nt.assert_equal(info.MILLIGRAMS_PER_GRAM, 1000) + + +def test_POC_dicts(): + for poc in info.POC_dicts: + expected_keys = sorted([ + 'cvcname', 'bmpname', 'nsqdname', + 'conc_units', 'load_units', 'load_factor', + 'group', 'include' + ]) + keys = sorted(list(poc.keys())) + nt.assert_list_equal(keys, expected_keys) + nt.assert_true(poc['group'] in ['A', 'B']) + nt.assert_true(poc['include'] in [True, False]) + nt.assert_true(poc['conc_units']['plain'] in ['ug/L', 'mg/L', 'CFU/100 mL']) + + +def test_getPOCs(): + nt.assert_true(isinstance(info.getPOCs(), list)) + + +def test_getPOCInfo(): + nt.assert_equal( + info.getPOCInfo('nsqdname', 'Copper', 'cvcname'), + 'Copper (Cu)' + ) + + +@nt.raises(ValueError) +def test_getPOCInfo_non_unique_result(): + info.getPOCInfo('group', 'A', 'cvcname') + + +def test_wqstd_template(): + std = info.wqstd_template() + nt.assert_list_equal(std.columns.tolist(), ['parameter', 'units', 'season', 'influent median']) + expected_shape = (16*4, 4) #(POCs x seasons, cols) + nt.assert_tuple_equal(std.shape, expected_shape) + + + diff --git a/pycvc/tests/testdata/baseline_hydrodata.csv b/pycvc/tests/testdata/baseline_hydrodata.csv new file mode 100644 index 0000000..040fb9d --- /dev/null +++ b/pycvc/tests/testdata/baseline_hydrodata.csv @@ -0,0 +1,1762 @@ +precip_mm,head_mm,flow_lps,inflow_lps,storm +3.6,0.0,0.0,,1 +9.4,0.0,0.0,,1 +0.4,0.0,0.0,,1 +0.0,0.0,0.0,,1 +0.0,0.0,0.0,,1 +0.0,0.0,0.0,,1 +0.0,0.0,0.0,,1 +0.2,0.0,0.0,,1 +2.2,0.0,0.0,,1 +10.6,0.0,0.0,,1 +3.0,93.0,6.688,,1 +2.2,128.0,10.957,,1 +3.4,110.0,8.555,,1 +0.0,100.0,7.4,,1 +0.0,87.0,6.091,,1 +0.0,72.999999999999,4.753999999999907,,1 +0.0,61.999999999999005,3.7649999999999135,,1 +0.0,54.0,3.086,,1 +0.0,48.0,2.603,,1 +0.0,45.0,2.37,,1 +0.0,42.0,2.144,,1 +0.0,40.0,1.997,,1 +0.0,38.0,1.853,,1 +0.0,37.0,1.782,,1 +0.0,35.0,1.643,,1 +0.0,33.0,1.507,,1 +0.0,32.0,1.441,,1 +0.0,30.0,1.31,,1 +0.0,29.0,1.247,,1 +0.0,27.0,1.122,,1 +0.0,26.0,1.062,,1 +0.0,24.0,0.943,,1 +0.0,23.0,0.886,,1 +0.0,22.0,0.83,,1 +0.0,22.0,0.83,,1 +0.0,21.0,0.775,,1 +0.0,19.0,0.668,,1 +0.0,19.0,0.668,,1 +0.0,18.0,0.617,,1 +0.0,17.0,0.567,,1 +0.0,17.0,0.567,,1 +0.0,15.999999999999005,0.5179999999999523,,1 +0.0,14.999999999999005,0.46999999999995523,,1 +0.0,14.999999999999005,0.46999999999995523,,1 +0.0,13.999999999999005,0.42499999999995525,,1 +0.0,12.999999999999005,0.3799999999999582,,1 +0.0,12.999999999999005,0.3799999999999582,,1 +0.0,11.999999999999005,0.3379999999999592,,1 +0.0,11.999999999999005,0.3379999999999592,,1 +0.0,10.999999999999005,0.2969999999999602,,1 +0.0,9.999999999999005,0.2569999999999632,,1 +0.0,9.999999999999005,0.2569999999999632,,1 +0.0,8.999999999999005,0.21999999999996517,,1 +0.0,7.999999999999005,0.1849999999999662,,1 +0.0,6.999999999999005,0.15099999999996916,,1 +0.0,6.999999999999005,0.15099999999996916,,1 +0.0,5.999999999999005,0.11999999999997114,,1 +0.0,5.999999999999005,0.11999999999997114,,1 +0.0,5.999999999999005,0.11999999999997114,,1 +0.0,4.999999999999005,0.09099999999997513,,1 +0.0,3.9999999999990052,0.06599999999997712,,1 +0.0,3.9999999999990052,0.06599999999997712,,1 +0.0,1.9999999999990052,0.022999999999985078,,1 +0.0,0.9999999999990052,0.007999999999992041,,1 +0.0,0.0,0.0,,1 +0.2,0.0,0.0,,2 +0.0,0.0,0.0,,2 +0.4,0.0,0.0,,3 +0.0,0.0,0.0,,3 +0.0,0.0,0.0,,3 +0.0,0.0,0.0,,3 +0.0,0.0,0.0,,3 +0.2,0.0,0.0,,3 +0.0,0.0,0.0,,3 +0.4,0.0,0.0,,4 +0.2,0.0,0.0,,4 +0.0,0.0,0.0,,4 +0.2,0.0,0.0,,4 +0.2,0.0,0.0,,4 +0.0,0.0,0.0,,4 +0.0,0.0,0.0,,4 +0.0,0.0,0.0,,4 +0.0,0.0,0.0,,4 +0.0,0.0,0.0,,4 +0.0,0.0,0.0,,4 +0.0,0.0,0.0,,4 +0.2,0.0,0.0,,4 +0.0,0.0,0.0,,4 +0.6,0.0,0.0,,5 +0.4,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.2,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.2,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.2,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.2,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.2,0.0,0.0,,5 +0.2,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.2,0.0,0.0,,5 +0.2,0.0,0.0,,5 +0.4,0.0,0.0,,5 +0.2,0.0,0.0,,5 +0.2,0.0,0.0,,5 +0.4,0.0,0.0,,5 +0.2,0.0,0.0,,5 +0.2,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.2,0.0,0.0,,5 +0.2,0.0,0.0,,5 +0.2,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.2,0.0,0.0,,5 +0.6,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.2,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +1.2,0.0,0.0,,5 +9.2,0.0,0.0,,5 +3.8,0.0,0.0,,5 +1.8,20.0,0.721,,5 +0.6,72.999999999999,4.753999999999907,,5 +0.4,66.999999999999,4.206999999999911,,5 +0.4,57.999999999999005,3.4209999999999163,,5 +0.8,50.0,2.762,,5 +0.0,45.0,2.37,,5 +0.2,41.0,2.07,,5 +0.0,38.0,1.853,,5 +0.0,35.0,1.643,,5 +0.0,33.0,1.507,,5 +0.2,31.0,1.375,,5 +0.0,29.0,1.247,,5 +0.0,28.0,1.184,,5 +0.0,27.0,1.122,,5 +0.0,26.0,1.062,,5 +0.0,25.0,1.002,,5 +0.0,24.0,0.943,,5 +0.0,23.0,0.886,,5 +0.0,22.0,0.83,,5 +0.0,22.0,0.83,,5 +0.8,21.0,0.775,,5 +2.4,21.0,0.775,,5 +1.4,21.0,0.775,,5 +1.2,25.0,1.002,,5 +0.0,30.0,1.31,,5 +0.0,32.0,1.441,,5 +1.0,33.0,1.507,,5 +0.2,32.0,1.441,,5 +0.0,31.0,1.375,,5 +0.0,30.0,1.31,,5 +0.0,29.0,1.247,,5 +0.0,28.0,1.184,,5 +0.0,27.0,1.122,,5 +0.0,26.0,1.062,,5 +0.0,25.0,1.002,,5 +0.0,24.0,0.943,,5 +0.0,23.0,0.886,,5 +0.0,22.0,0.83,,5 +0.0,21.0,0.775,,5 +0.0,20.0,0.721,,5 +0.0,19.0,0.668,,5 +0.0,18.0,0.617,,5 +0.0,18.0,0.617,,5 +0.0,17.0,0.567,,5 +0.0,17.0,0.567,,5 +0.0,15.999999999999005,0.5179999999999523,,5 +0.0,14.999999999999005,0.46999999999995523,,5 +0.0,14.999999999999005,0.46999999999995523,,5 +0.0,13.999999999999005,0.42499999999995525,,5 +0.6,13.999999999999005,0.42499999999995525,,5 +0.2,12.999999999999005,0.3799999999999582,,5 +0.4,17.0,0.567,,5 +0.0,22.0,0.83,,5 +0.0,24.0,0.943,,5 +0.0,24.0,0.943,,5 +0.0,23.0,0.886,,5 +0.0,22.0,0.83,,5 +0.2,21.0,0.775,,5 +0.2,19.0,0.668,,5 +0.2,18.0,0.617,,5 +0.0,17.0,0.567,,5 +0.4,15.999999999999005,0.5179999999999523,,5 +5.6,15.999999999999005,0.5179999999999523,,5 +1.2,18.0,0.617,,5 +3.4,44.0,2.294,,5 +1.0,69.999999999999,4.477999999999909,,5 +0.0,99.0,7.297,,5 +0.0,86.0,5.993,,5 +0.0,71.999999999999,4.660999999999909,,5 +0.0,62.999999999999005,3.8519999999999133,,5 +0.0,56.999999999999005,3.3369999999999167,,5 +0.0,52.0,2.923,,5 +0.0,49.0,2.682,,5 +0.0,46.0,2.447,,5 +0.0,44.0,2.294,,5 +0.0,42.0,2.144,,5 +0.0,40.0,1.997,,5 +0.0,38.0,1.853,,5 +0.0,37.0,1.782,,5 +0.0,35.0,1.643,,5 +0.0,33.0,1.507,,5 +0.0,31.0,1.375,,5 +0.0,30.0,1.31,,5 +0.0,28.0,1.184,,5 +0.0,27.0,1.122,,5 +0.0,26.0,1.062,,5 +0.2,25.0,1.002,,5 +0.0,24.0,0.943,,5 +0.0,23.0,0.886,,5 +0.0,22.0,0.83,,5 +0.0,21.0,0.775,,5 +0.0,20.0,0.721,,5 +0.0,19.0,0.668,,5 +0.0,19.0,0.668,,5 +0.0,18.0,0.617,,5 +0.0,17.0,0.567,,5 +0.0,17.0,0.567,,5 +0.0,15.999999999999005,0.5179999999999523,,5 +0.0,15.999999999999005,0.5179999999999523,,5 +0.0,14.999999999999005,0.46999999999995523,,5 +0.0,13.999999999999005,0.42499999999995525,,5 +0.0,13.999999999999005,0.42499999999995525,,5 +0.0,12.999999999999005,0.3799999999999582,,5 +0.0,12.999999999999005,0.3799999999999582,,5 +0.0,11.999999999999005,0.3379999999999592,,5 +0.0,11.999999999999005,0.3379999999999592,,5 +0.0,10.999999999999005,0.2969999999999602,,5 +0.0,10.999999999999005,0.2969999999999602,,5 +0.0,9.999999999999005,0.2569999999999632,,5 +0.0,9.999999999999005,0.2569999999999632,,5 +0.0,8.999999999999005,0.21999999999996517,,5 +0.0,8.999999999999005,0.21999999999996517,,5 +0.0,7.999999999999005,0.1849999999999662,,5 +0.0,7.999999999999005,0.1849999999999662,,5 +0.0,6.999999999999005,0.15099999999996916,,5 +0.0,6.999999999999005,0.15099999999996916,,5 +0.0,6.999999999999005,0.15099999999996916,,5 +0.0,5.999999999999005,0.11999999999997114,,5 +0.0,4.999999999999005,0.09099999999997513,,5 +0.0,3.9999999999990052,0.06599999999997712,,5 +0.0,2.9999999999990052,0.0429999999999801,,5 +0.0,0.9999999999990052,0.007999999999992041,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.0,0.0,0.0,,5 +0.2,0.0,0.0,,5 +4.0,0.0,0.0,,5 +0.8,0.0,0.0,,5 +0.0,21.0,0.775,,5 +0.0,48.0,2.603,,5 +0.0,45.0,2.37,,5 +0.0,40.0,1.997,,5 +0.0,34.0,1.575,,5 +0.0,30.0,1.31,,5 +0.0,26.0,1.062,,5 +0.0,23.0,0.886,,5 +0.0,21.0,0.775,,5 +0.0,18.0,0.617,,5 +0.0,15.999999999999005,0.5179999999999523,,5 +0.0,14.999999999999005,0.46999999999995523,,5 +0.0,12.999999999999005,0.3799999999999582,,5 +0.0,11.999999999999005,0.3379999999999592,,5 +0.0,10.999999999999005,0.2969999999999602,,5 +0.0,9.999999999999005,0.2569999999999632,,5 +0.0,8.999999999999005,0.21999999999996517,,5 +0.0,8.999999999999005,0.21999999999996517,,5 +0.0,7.999999999999005,0.1849999999999662,,5 +0.2,7.999999999999005,0.1849999999999662,,5 +0.0,3.9999999999990052,0.06599999999997712,,5 +0.0,3.9999999999990052,0.06599999999997712,,5 +0.0,3.9999999999990052,0.06599999999997712,,5 +0.0,2.9999999999990052,0.0429999999999801,,5 +0.0,2.9999999999990052,0.0429999999999801,,5 +0.0,1.9999999999990052,0.022999999999985078,,5 +0.0,2.9999999999990052,0.0429999999999801,,5 +1.0,2.9999999999990052,0.0429999999999801,,5 +0.8,1.9999999999990052,0.022999999999985078,,5 +1.6,0.9999999999990052,0.007999999999992041,,5 +0.2,4.999999999999005,0.09099999999997513,,5 +0.0,10.999999999999005,0.2969999999999602,,5 +0.0,13.999999999999005,0.42499999999995525,,5 +0.0,15.999999999999005,0.5179999999999523,,5 +0.2,15.999999999999005,0.5179999999999523,,5 +0.0,14.999999999999005,0.46999999999995523,,5 +0.0,14.999999999999005,0.46999999999995523,,5 +0.2,13.999999999999005,0.42499999999995525,,5 +0.2,12.999999999999005,0.3799999999999582,,5 +0.4,11.999999999999005,0.3379999999999592,,5 +0.2,11.999999999999005,0.3379999999999592,,5 +0.0,10.999999999999005,0.2969999999999602,,5 +0.0,10.999999999999005,0.2969999999999602,,5 +0.0,10.999999999999005,0.2969999999999602,,5 +0.0,11.999999999999005,0.3379999999999592,,5 +0.4,11.999999999999005,0.3379999999999592,,5 +0.0,11.999999999999005,0.3379999999999592,,5 +0.0,11.999999999999005,0.3379999999999592,,5 +0.0,10.999999999999005,0.2969999999999602,,5 +0.0,10.999999999999005,0.2969999999999602,,5 +0.0,10.999999999999005,0.2969999999999602,,5 +0.0,9.999999999999005,0.2569999999999632,,5 +0.0,8.999999999999005,0.21999999999996517,,5 +0.0,8.999999999999005,0.21999999999996517,,5 +0.0,7.999999999999005,0.1849999999999662,,5 +0.0,7.999999999999005,0.1849999999999662,,5 +0.0,6.999999999999005,0.15099999999996916,,5 +0.0,6.999999999999005,0.15099999999996916,,5 +0.0,6.999999999999005,0.15099999999996916,,5 +0.0,5.999999999999005,0.11999999999997114,,5 +0.0,4.999999999999005,0.09099999999997513,,5 +0.0,3.9999999999990052,0.06599999999997712,,5 +0.0,2.9999999999990052,0.0429999999999801,,5 +0.4,1.9999999999990052,0.022999999999985078,,5 +0.2,0.9999999999990052,0.007999999999992041,,5 +0.0,0.0,0.0,,5 +0.2,0.0,0.0,,6 +0.0,0.0,0.0,,6 +0.2,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.2,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.2,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.2,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.2,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.2,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.2,0.0,0.0,,7 +0.0,0.0,0.0,,7 +0.0,6.0,0.12,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,13.999999999999005,0.42499999999995525,,8 +0.0,14.999999999999005,0.46999999999995523,,8 +0.0,15.999999999999005,0.5179999999999523,,8 +0.0,15.999999999999005,0.5179999999999523,,8 +0.0,17.0,0.567,,8 +0.0,17.0,0.567,,8 +0.0,17.0,0.567,,8 +0.0,17.0,0.567,,8 +0.0,17.0,0.567,,8 +0.0,15.999999999999005,0.5179999999999523,,8 +0.0,15.999999999999005,0.5179999999999523,,8 +0.0,15.999999999999005,0.5179999999999523,,8 +0.0,14.999999999999005,0.46999999999995523,,8 +0.0,14.999999999999005,0.46999999999995523,,8 +0.0,14.999999999999005,0.46999999999995523,,8 +0.0,14.999999999999005,0.46999999999995523,,8 +0.0,13.999999999999005,0.42499999999995525,,8 +0.0,13.999999999999005,0.42499999999995525,,8 +0.0,13.999999999999005,0.42499999999995525,,8 +0.0,13.999999999999005,0.42499999999995525,,8 +0.0,12.999999999999005,0.3799999999999582,,8 +0.0,12.999999999999005,0.3799999999999582,,8 +0.0,12.999999999999005,0.3799999999999582,,8 +0.0,12.999999999999005,0.3799999999999582,,8 +0.0,12.999999999999005,0.3799999999999582,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,9.0,0.22,,8 +0.0,9.0,0.22,,8 +0.0,9.0,0.22,,8 +0.0,9.0,0.22,,8 +0.0,9.0,0.22,,8 +0.0,9.0,0.22,,8 +0.0,8.0,0.185,,8 +0.0,8.0,0.185,,8 +0.0,8.0,0.185,,8 +0.0,7.0,0.151,,8 +0.0,7.0,0.151,,8 +0.0,6.0,0.12,,8 +0.0,6.0,0.12,,8 +0.0,5.0,0.091,,8 +0.0,5.0,0.091,,8 +0.0,4.0,0.066,,8 +0.0,4.0,0.066,,8 +0.0,3.0,0.043,,8 +0.0,3.0,0.043,,8 +0.0,2.0,0.023,,8 +0.0,2.0,0.023,,8 +0.0,1.0,0.008,,8 +0.0,1.0,0.008,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.2,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.2,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.2,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.2,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.2,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.2,0.0,0.0,,8 +0.4,0.0,0.0,,8 +0.2,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.2,2.0,0.023,,8 +0.2,6.0,0.12,,8 +0.0,10.0,0.257,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,12.999999999999005,0.3799999999999582,,8 +0.0,12.999999999999005,0.3799999999999582,,8 +0.0,12.999999999999005,0.3799999999999582,,8 +0.0,12.999999999999005,0.3799999999999582,,8 +0.0,12.999999999999005,0.3799999999999582,,8 +0.0,12.999999999999005,0.3799999999999582,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.2,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.2,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.2,11.999999999999005,0.3379999999999592,,8 +0.2,11.999999999999005,0.3379999999999592,,8 +0.2,11.999999999999005,0.3379999999999592,,8 +0.2,12.999999999999005,0.3799999999999582,,8 +0.4,13.999999999999005,0.42499999999995525,,8 +0.2,15.999999999999005,0.5179999999999523,,8 +0.0,17.0,0.567,,8 +0.4,18.0,0.617,,8 +0.0,19.0,0.668,,8 +0.0,19.0,0.668,,8 +0.2,19.0,0.668,,8 +0.0,19.0,0.668,,8 +0.0,19.0,0.668,,8 +0.0,18.0,0.617,,8 +0.0,18.0,0.617,,8 +0.0,18.0,0.617,,8 +0.2,17.0,0.567,,8 +0.0,17.0,0.567,,8 +0.0,17.0,0.567,,8 +0.0,17.0,0.567,,8 +0.0,17.0,0.567,,8 +0.2,17.0,0.567,,8 +0.2,15.999999999999005,0.5179999999999523,,8 +0.0,17.0,0.567,,8 +0.2,17.0,0.567,,8 +0.2,17.0,0.567,,8 +0.4,18.0,0.617,,8 +0.2,19.0,0.668,,8 +0.2,20.0,0.721,,8 +0.2,21.0,0.775,,8 +0.0,22.0,0.83,,8 +0.2,22.0,0.83,,8 +0.2,22.0,0.83,,8 +0.0,23.0,0.886,,8 +0.0,23.0,0.886,,8 +0.0,23.0,0.886,,8 +0.0,22.0,0.83,,8 +0.0,22.0,0.83,,8 +0.0,21.0,0.775,,8 +0.2,20.0,0.721,,8 +0.4,20.0,0.721,,8 +0.2,20.0,0.721,,8 +0.4,20.0,0.721,,8 +0.2,22.0,0.83,,8 +0.4,23.0,0.886,,8 +0.4,24.0,0.943,,8 +0.4,26.0,1.062,,8 +0.0,27.0,1.122,,8 +0.2,28.0,1.184,,8 +0.0,28.0,1.184,,8 +0.0,28.0,1.184,,8 +0.0,27.0,1.122,,8 +0.0,26.0,1.062,,8 +0.0,26.0,1.062,,8 +0.0,25.0,1.002,,8 +0.0,25.0,1.002,,8 +0.0,24.0,0.943,,8 +0.0,24.0,0.943,,8 +0.0,24.0,0.943,,8 +0.0,23.0,0.886,,8 +0.0,23.0,0.886,,8 +0.0,23.0,0.886,,8 +0.0,22.0,0.83,,8 +0.0,22.0,0.83,,8 +0.0,22.0,0.83,,8 +0.0,21.0,0.775,,8 +0.0,21.0,0.775,,8 +0.0,20.0,0.721,,8 +0.0,20.0,0.721,,8 +0.0,20.0,0.721,,8 +0.0,20.0,0.721,,8 +0.0,20.0,0.721,,8 +0.0,19.0,0.668,,8 +0.0,19.0,0.668,,8 +0.0,19.0,0.668,,8 +0.0,19.0,0.668,,8 +0.0,18.0,0.617,,8 +0.0,18.0,0.617,,8 +0.0,18.0,0.617,,8 +0.0,18.0,0.617,,8 +0.0,18.0,0.617,,8 +0.0,18.0,0.617,,8 +0.0,17.0,0.567,,8 +0.0,17.0,0.567,,8 +0.0,17.0,0.567,,8 +0.0,17.0,0.567,,8 +0.0,17.0,0.567,,8 +0.0,15.999999999999005,0.5179999999999523,,8 +0.0,15.999999999999005,0.5179999999999523,,8 +0.0,15.999999999999005,0.5179999999999523,,8 +0.0,15.999999999999005,0.5179999999999523,,8 +0.0,15.999999999999005,0.5179999999999523,,8 +0.0,14.999999999999005,0.46999999999995523,,8 +0.0,14.999999999999005,0.46999999999995523,,8 +0.0,14.999999999999005,0.46999999999995523,,8 +0.0,14.999999999999005,0.46999999999995523,,8 +0.0,14.999999999999005,0.46999999999995523,,8 +0.0,13.999999999999005,0.42499999999995525,,8 +0.0,13.999999999999005,0.42499999999995525,,8 +0.0,13.999999999999005,0.42499999999995525,,8 +0.0,13.999999999999005,0.42499999999995525,,8 +0.0,13.999999999999005,0.42499999999995525,,8 +0.0,13.999999999999005,0.42499999999995525,,8 +0.0,12.999999999999005,0.3799999999999582,,8 +0.0,12.999999999999005,0.3799999999999582,,8 +0.0,12.999999999999005,0.3799999999999582,,8 +0.0,12.999999999999005,0.3799999999999582,,8 +0.0,12.999999999999005,0.3799999999999582,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,11.999999999999005,0.3379999999999592,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.999999999999005,0.2969999999999602,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,10.0,0.257,,8 +0.0,9.0,0.22,,8 +0.0,9.0,0.22,,8 +0.0,9.0,0.22,,8 +0.0,9.0,0.22,,8 +0.0,9.0,0.22,,8 +0.0,8.0,0.185,,8 +0.0,8.0,0.185,,8 +0.0,7.0,0.151,,8 +0.0,7.0,0.151,,8 +0.0,6.0,0.12,,8 +0.0,6.0,0.12,,8 +0.0,5.0,0.091,,8 +0.0,4.0,0.066,,8 +0.0,4.0,0.066,,8 +0.0,3.0,0.043,,8 +0.0,2.0,0.023,,8 +0.0,1.0,0.008,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.2,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.2,0.0,0.0,,8 +0.0,0.0,0.0,,8 +0.2,0.0,0.0,,9 +0.0,0.0,0.0,,9 +0.0,0.0,0.0,,9 +0.0,0.0,0.0,,9 +0.0,0.0,0.0,,9 +0.0,0.0,0.0,,9 +0.0,0.0,0.0,,9 +0.0,0.0,0.0,,9 +0.0,0.0,0.0,,9 +0.0,0.0,0.0,,9 +0.2,0.0,0.0,,9 +0.0,0.0,0.0,,9 +1.4,0.0,0.0,,10 +0.4,0.0,0.0,,10 +0.0,0.0,0.0,,10 +0.4,0.0,0.0,,10 +0.0,0.0,0.0,,10 +0.0,0.0,0.0,,10 +0.2,0.0,0.0,,10 +0.2,0.0,0.0,,10 +0.0,0.0,0.0,,10 +0.2,0.0,0.0,,10 +0.0,0.0,0.0,,10 +0.0,0.0,0.0,,10 +0.0,0.0,0.0,,10 +0.2,0.0,0.0,,10 +0.0,0.0,0.0,,10 +0.2,0.0,0.0,,10 +0.2,0.0,0.0,,10 +0.0,0.0,0.0,,10 +0.0,0.0,0.0,,10 +0.0,0.0,0.0,,10 +0.0,0.0,0.0,,10 +0.0,0.0,0.0,,10 +0.2,0.0,0.0,,10 +0.0,0.0,0.0,,10 +0.2,0.0,0.0,,11 +0.0,0.0,0.0,,11 +0.0,0.0,0.0,,11 +0.0,0.0,0.0,,11 +0.0,0.0,0.0,,11 +0.2,0.0,0.0,,11 +0.0,0.0,0.0,,11 +0.2,0.0,0.0,,12 +1.0,0.0,0.0,,12 +0.2,0.0,0.0,,12 +0.0,0.0,0.0,,12 +0.0,0.0,0.0,,12 +0.2,0.0,0.0,,12 +0.0,0.0,0.0,,12 +0.2,0.0,0.0,,13 +0.0,0.0,0.0,,13 +0.2,0.0,0.0,,14 +0.0,0.0,0.0,,14 +0.4,0.0,0.0,,15 +0.2,0.0,0.0,,15 +0.0,0.0,0.0,,15 +0.0,0.0,0.0,,15 +0.2,0.0,0.0,,15 +0.2,0.0,0.0,,15 +0.6,0.0,0.0,,15 +0.6,0.0,0.0,,15 +0.4,0.0,0.0,,15 +0.4,0.0,0.0,,15 +0.0,0.0,0.0,,15 +0.0,0.0,0.0,,15 +0.2,0.0,0.0,,15 +0.2,0.0,0.0,,15 +0.2,0.0,0.0,,15 +0.2,0.0,0.0,,15 +0.8,0.0,0.0,,15 +0.6,0.0,0.0,,15 +0.0,0.0,0.0,,15 +0.0,0.0,0.0,,15 +0.0,0.0,0.0,,15 +0.0,0.0,0.0,,15 +0.0,0.0,0.0,,15 +0.0,0.0,0.0,,15 +0.0,0.0,0.0,,15 +0.0,0.0,0.0,,15 +0.0,0.0,0.0,,15 +0.0,0.0,0.0,,15 +0.8,0.0,0.0,,15 +1.4,0.0,0.0,,15 +0.2,0.0,0.0,,15 +2.2,0.0,0.0,,15 +0.8,0.0,0.0,,15 +0.0,0.0,0.0,,15 +0.2,0.0,0.0,,15 +0.0,0.0,0.0,,15 +0.2,0.0,0.0,,16 +0.4,0.0,0.0,,16 +0.2,0.0,0.0,,16 +0.2,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.2,0.0,0.0,,16 +0.2,0.0,0.0,,16 +0.4,0.0,0.0,,16 +0.6,0.0,0.0,,16 +0.4,0.0,0.0,,16 +0.8,0.0,0.0,,16 +1.0,0.0,0.0,,16 +0.4,0.0,0.0,,16 +1.0,0.0,0.0,,16 +1.0,0.0,0.0,,16 +0.6,0.0,0.0,,16 +1.0,0.0,0.0,,16 +1.2,0.0,0.0,,16 +0.8,0.0,0.0,,16 +0.4,0.0,0.0,,16 +0.6,0.0,0.0,,16 +0.8,0.0,0.0,,16 +0.2,0.0,0.0,,16 +0.2,0.0,0.0,,16 +0.4,3.0,0.043,,16 +0.4,4.0,0.066,,16 +0.4,5.0,0.091,,16 +0.4,5.0,0.091,,16 +0.6,5.0,0.091,,16 +0.2,5.0,0.091,,16 +0.0,6.0,0.12,,16 +0.2,6.0,0.12,,16 +0.0,6.0,0.12,,16 +1.0,5.0,0.091,,16 +0.0,4.0,0.066,,16 +0.2,5.0,0.091,,16 +0.0,5.0,0.091,,16 +0.2,5.0,0.091,,16 +0.0,5.0,0.091,,16 +0.4,4.0,0.066,,16 +0.2,4.0,0.066,,16 +0.0,4.0,0.066,,16 +0.2,4.0,0.066,,16 +0.0,4.0,0.066,,16 +0.0,4.0,0.066,,16 +0.4,4.0,0.066,,16 +0.6,3.0,0.043,,16 +0.2,3.0,0.043,,16 +0.4,4.0,0.066,,16 +0.4,5.0,0.091,,16 +0.6,6.0,0.12,,16 +0.2,7.0,0.151,,16 +0.0,8.0,0.185,,16 +0.0,9.0,0.22,,16 +0.0,9.0,0.22,,16 +0.0,9.0,0.22,,16 +0.2,8.0,0.185,,16 +0.0,7.0,0.151,,16 +0.0,6.0,0.12,,16 +0.0,5.0,0.091,,16 +0.2,5.0,0.091,,16 +0.0,4.0,0.066,,16 +0.0,4.0,0.066,,16 +0.0,3.0,0.043,,16 +0.0,3.0,0.043,,16 +0.0,2.0,0.023,,16 +0.4,2.0,0.023,,16 +0.0,2.0,0.023,,16 +0.0,1.0,0.008,,16 +0.0,1.0,0.008,,16 +0.0,1.0,0.008,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.2,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.2,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.6,0.0,0.0,,16 +0.4,0.0,0.0,,16 +0.6,0.0,0.0,,16 +0.4,0.0,0.0,,16 +0.2,0.0,0.0,,16 +0.2,0.0,0.0,,16 +0.6,0.0,0.0,,16 +0.4,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.4,0.0,0.0,,16 +0.0,0.0,0.0,,16 +3.4,0.0,0.0,,16 +0.8,0.0,0.0,,16 +0.2,4.0,0.066,,16 +0.0,9.0,0.22,,16 +0.0,10.0,0.257,,16 +0.0,8.0,0.185,,16 +0.0,7.0,0.151,,16 +0.0,6.0,0.12,,16 +0.0,5.0,0.091,,16 +0.0,3.0,0.043,,16 +0.0,2.0,0.023,,16 +0.0,2.0,0.023,,16 +0.0,1.0,0.008,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.2,0.0,0.0,,16 +0.0,0.0,0.0,,16 +0.2,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.4,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.6,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.4,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.4,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.4,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.6,0.0,0.0,,17 +0.6,0.0,0.0,,17 +0.8,0.0,0.0,,17 +1.0,0.0,0.0,,17 +1.4,0.0,0.0,,17 +1.2,1.0,0.008,,17 +1.2,9.0,0.22,,17 +0.6,17.0,0.567,,17 +0.2,25.0,1.002,,17 +0.2,29.0,1.247,,17 +0.4,28.0,1.184,,17 +0.4,24.0,0.943,,17 +0.6,22.0,0.83,,17 +0.4,22.0,0.83,,17 +0.2,22.0,0.83,,17 +0.4,22.0,0.83,,17 +0.4,22.0,0.83,,17 +0.4,21.0,0.775,,17 +0.6,22.0,0.83,,17 +0.2,22.0,0.83,,17 +0.0,24.0,0.943,,17 +0.4,23.0,0.886,,17 +0.0,23.0,0.886,,17 +0.0,22.0,0.83,,17 +0.4,21.0,0.775,,17 +0.0,20.0,0.721,,17 +0.0,19.0,0.668,,17 +0.0,18.0,0.617,,17 +0.0,17.0,0.567,,17 +0.4,16.0,0.518,,17 +0.2,15.0,0.47,,17 +0.2,14.0,0.425,,17 +0.2,13.0,0.38,,17 +0.2,13.0,0.38,,17 +0.2,13.0,0.38,,17 +0.2,13.0,0.38,,17 +0.4,13.0,0.38,,17 +0.4,12.0,0.338,,17 +0.2,12.0,0.338,,17 +0.4,12.0,0.338,,17 +0.4,12.0,0.338,,17 +0.6,13.0,0.38,,17 +0.6,15.0,0.47,,17 +0.2,16.0,0.518,,17 +0.2,19.0,0.668,,17 +0.4,20.0,0.721,,17 +0.2,20.0,0.721,,17 +0.2,21.0,0.775,,17 +0.6,21.0,0.775,,17 +0.4,20.0,0.721,,17 +0.6,21.0,0.775,,17 +0.2,22.0,0.83,,17 +0.2,24.0,0.943,,17 +0.2,25.0,1.002,,17 +0.2,25.0,1.002,,17 +0.0,25.0,1.002,,17 +0.2,24.0,0.943,,17 +0.0,22.0,0.83,,17 +0.0,21.0,0.775,,17 +0.0,20.0,0.721,,17 +0.0,19.0,0.668,,17 +0.0,17.0,0.567,,17 +0.0,16.0,0.518,,17 +0.0,15.0,0.47,,17 +0.0,14.0,0.425,,17 +0.2,13.0,0.38,,17 +0.0,12.0,0.338,,17 +0.4,11.0,0.297,,17 +0.0,10.0,0.257,,17 +0.0,9.0,0.22,,17 +0.0,8.0,0.185,,17 +0.0,8.0,0.185,,17 +0.0,8.0,0.185,,17 +0.0,6.0,0.12,,17 +0.0,6.0,0.12,,17 +0.0,24.0,0.943,,17 +0.0,22.0,0.83,,17 +0.0,22.0,0.83,,17 +0.0,21.0,0.775,,17 +0.0,21.0,0.775,,17 +0.0,20.0,0.721,,17 +0.0,20.0,0.721,,17 +0.0,19.0,0.668,,17 +0.0,19.0,0.668,,17 +0.0,18.0,0.617,,17 +0.0,18.0,0.617,,17 +0.0,17.0,0.567,,17 +0.0,17.0,0.567,,17 +0.0,17.0,0.567,,17 +0.0,17.0,0.567,,17 +0.0,16.0,0.518,,17 +0.0,16.0,0.518,,17 +0.0,16.0,0.518,,17 +0.0,15.0,0.47,,17 +0.0,15.0,0.47,,17 +0.0,15.0,0.47,,17 +0.0,15.0,0.47,,17 +0.0,14.0,0.425,,17 +0.0,14.0,0.425,,17 +0.0,14.0,0.425,,17 +0.0,14.0,0.425,,17 +0.0,13.0,0.38,,17 +0.0,13.0,0.38,,17 +0.0,13.0,0.38,,17 +0.0,13.0,0.38,,17 +0.0,12.0,0.338,,17 +0.0,12.0,0.338,,17 +0.0,12.0,0.338,,17 +0.0,12.0,0.338,,17 +0.0,12.0,0.338,,17 +0.0,11.0,0.297,,17 +0.2,11.0,0.297,,17 +0.0,11.0,0.297,,17 +0.2,11.0,0.297,,17 +0.0,10.0,0.257,,17 +0.0,10.0,0.257,,17 +0.0,10.0,0.257,,17 +0.0,10.0,0.257,,17 +0.0,10.0,0.257,,17 +0.0,9.0,0.22,,17 +0.0,9.0,0.22,,17 +0.0,9.0,0.22,,17 +0.0,9.0,0.22,,17 +0.0,9.0,0.22,,17 +0.0,8.0,0.185,,17 +0.0,8.0,0.185,,17 +0.0,8.0,0.185,,17 +0.0,8.0,0.185,,17 +0.0,8.0,0.185,,17 +0.0,7.0,0.151,,17 +0.0,7.0,0.151,,17 +0.0,7.0,0.151,,17 +0.0,7.0,0.151,,17 +0.0,6.0,0.12,,17 +0.0,6.0,0.12,,17 +0.0,6.0,0.12,,17 +0.0,6.0,0.12,,17 +0.0,6.0,0.12,,17 +0.0,5.0,0.091,,17 +0.0,5.0,0.091,,17 +0.0,5.0,0.091,,17 +0.0,5.0,0.091,,17 +0.0,5.0,0.091,,17 +0.0,5.0,0.091,,17 +0.0,5.0,0.091,,17 +0.0,4.0,0.066,,17 +0.0,4.0,0.066,,17 +0.0,4.0,0.066,,17 +0.0,4.0,0.066,,17 +0.0,4.0,0.066,,17 +0.0,4.0,0.066,,17 +0.0,4.0,0.066,,17 +0.0,4.0,0.066,,17 +0.0,4.0,0.066,,17 +0.0,4.0,0.066,,17 +0.0,3.0,0.043,,17 +0.0,3.0,0.043,,17 +0.0,3.0,0.043,,17 +0.0,3.0,0.043,,17 +0.0,3.0,0.043,,17 +0.0,2.0,0.023,,17 +0.0,2.0,0.023,,17 +0.0,2.0,0.023,,17 +0.0,1.0,0.008,,17 +0.0,1.0,0.008,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.4,0.0,0.0,,17 +0.6,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.4,0.0,0.0,,17 +0.4,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.4,0.0,0.0,,17 +0.6,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.2,0.0,0.0,,17 +0.0,0.0,0.0,,17 +0.2,0.0,0.0,,18 +0.0,0.0,0.0,,18 +0.2,0.0,0.0,,19 +0.2,0.0,0.0,,19 +0.2,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.2,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.2,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.2,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.4,0.0,0.0,,19 +0.2,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.2,0.0,0.0,,19 +0.2,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.8,0.0,0.0,,19 +1.2,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.2,0.0,0.0,,19 +0.0,0.0,0.0,,19 +0.4,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.2,0.0,0.0,,20 +0.2,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.2,0.0,0.0,,20 +0.0,0.0,0.0,,20 +0.6,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.2,0.0,0.0,,21 +0.2,0.0,0.0,,21 +0.2,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.2,0.0,0.0,,21 +0.4,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.2,0.0,0.0,,21 +0.0,0.0,0.0,,21 +0.2,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.2,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.2,0.0,0.0,,22 +0.0,0.0,0.0,,22 +0.2,0.0,0.0,,23 +0.2,0.0,0.0,,23 +0.0,0.0,0.0,,23 +0.2,0.0,0.0,,23 +0.4,0.0,0.0,,23 +0.4,0.0,0.0,,23 +0.2,0.0,0.0,,23 +0.4,0.0,0.0,,23 +0.4,0.0,0.0,,23 +0.8,0.0,0.0,,23 +0.8,0.0,0.0,,23 +1.2,0.0,0.0,,23 +0.4,0.0,0.0,,23 +0.8,0.0,0.0,,23 +0.6,0.0,0.0,,23 +0.8,0.0,0.0,,23 +0.0,0.0,0.0,,23 +0.2,0.0,0.0,,23 +0.0,0.0,0.0,,23 +0.4,0.0,0.0,,23 +0.6,0.0,0.0,,23 +0.4,0.0,0.0,,23 +0.4,0.0,0.0,,23 +0.6,0.0,0.0,,23 +0.4,0.0,0.0,,23 +0.4,0.0,0.0,,23 +0.0,0.0,0.0,,23 +0.2,0.0,0.0,,23 +0.6,0.0,0.0,,23 +0.4,0.0,0.0,,23 +0.6,0.0,0.0,,23 +0.4,0.0,0.0,,23 +0.2,0.0,0.0,,23 +0.0,0.0,0.0,,23 +0.0,0.0,0.0,,23 +0.0,0.0,0.0,,23 +0.0,0.0,0.0,,23 +0.2,0.0,0.0,,23 +0.0,0.0,0.0,,23 +0.2,0.0,0.0,,24 +0.0,0.0,0.0,,24 +0.0,0.0,0.0,,24 +0.0,0.0,0.0,,24 +0.0,0.0,0.0,,24 +0.0,0.0,0.0,,24 +0.0,0.0,0.0,,24 +0.0,0.0,0.0,,24 +0.0,0.0,0.0,,24 +0.0,0.0,0.0,,24 +0.0,0.0,0.0,,24 +0.0,0.0,0.0,,24 +1.0,0.0,0.0,,24 +0.2,0.0,0.0,,24 +0.0,0.0,0.0,,24 +0.2,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.4,0.0,0.0,,25 +0.4,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.4,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.6,0.0,0.0,,25 +0.4,0.0,0.0,,25 +0.6,0.0,0.0,,25 +0.8,0.0,0.0,,25 +0.6,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.6,0.0,0.0,,25 +0.4,0.0,0.0,,25 +0.4,0.0,0.0,,25 +0.6,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.6,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.2,0.0,0.0,,25 +0.0,0.0,0.0,,25 +0.2,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.2,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.2,0.0,0.0,,26 +0.2,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.2,0.0,0.0,,26 +0.0,0.0,0.0,,26 +0.2,0.0,0.0,,27 +0.0,0.0,0.0,,27 diff --git a/pycvc/tests/testdata/baseline_sample_info.csv b/pycvc/tests/testdata/baseline_sample_info.csv new file mode 100644 index 0000000..cf0ce26 --- /dev/null +++ b/pycvc/tests/testdata/baseline_sample_info.csv @@ -0,0 +1,7 @@ +sample,site,samplestart,samplestop,interval_minutes,sampletype,labtype,labworkorder,collectiondate,samplingnotes,ignore +ED-1-001,ED-1,2012-07-31 12:20:00,2012-07-31 12:24:00,10,grab,regular,B2B6446,2012-08-01 00:00:00,No errors in sampling program,False +ED-1-002,ED-1,2012-07-31 12:24:00,2012-07-31 16:45:00,10,composite,regular,B2B6446,2012-08-01 00:00:00,Sampling program ended at bottle 19 due to power failure; program completed at 16:45 on 31 July 2012,False +ED-1-003,ED-1,2012-08-10 03:20:00,2012-08-10 03:24:00,30,grab,regular,B2C1969,2012-08-11 00:00:00,No errors in sampling program,False +ED-1-005,ED-1,2012-08-10 03:24:00,2012-08-10 20:54:00,30,composite,regular,B2C1969,2012-08-11 00:00:00,No errors in sampling program; program completed at 20:54 on 10 August 2012,False +ED-1-007,ED-1,2012-08-11 11:37:00,2012-08-11 11:41:00,10,grab,regular,B2C2366,2012-08-13 00:00:00,No errors in sampling program,False +ED-1-009,ED-1,2012-08-11 11:41:00,2012-08-11 17:31:00,10,composite,regular,B2C2366,2012-08-13 00:00:00,No errors in sampling program; program completed at 17:31on 11 August 2012,False diff --git a/pycvc/tests/testdata/baseline_storm_info.csv b/pycvc/tests/testdata/baseline_storm_info.csv new file mode 100644 index 0000000..83dd949 --- /dev/null +++ b/pycvc/tests/testdata/baseline_storm_info.csv @@ -0,0 +1,28 @@ +site,storm_number,year,season,grouped_season,antecedent_days,start_date,end_date,duration_hours,peak_precip_intensity,total_precip_depth,runoff_m3,bypass_m3,inflow_m3,outflow_m3,outflow_mm,peak_outflow,centroid_lag_hours,peak_lag_hours,has_outflow,sm_est_peak_inflow +ED-1,1,2012,summer,summer/autumn,,2012-07-31 11:50:00,2012-07-31 22:30:00,10.666666666666666,63.6,35.0,190.54607179632484,42.699999999999996,147.84607179632485,51.70739999999944,8.009200743494336,10.957,2.2056249811111113,0.3333333333333333,Yes,58.02175 +ED-1,2,2012,summer,summer/autumn,3.8819444444444446,2012-08-04 19:40:00,2012-08-04 19:50:00,0.16666666666666666,1.2,0.2,38.37072454922788,0.244,38.12672454922788,0.0,0.0,,,,No,1.09475 +ED-1,3,2012,summer,summer/autumn,0.2986111111111111,2012-08-05 03:00:00,2012-08-05 04:00:00,1.0,2.4,0.6000000000000001,39.084089579240214,0.7320000000000001,38.352089579240214,0.0,0.0,,,,No,2.1895 +ED-1,4,2012,summer,summer/autumn,0.34722222222222227,2012-08-05 12:20:00,2012-08-05 14:30:00,2.166666666666667,2.4,1.2,40.179081084894,1.464,38.715081084894,0.0,0.0,,,,No,2.1895 +ED-1,5,2012,summer,summer/autumn,3.7708333333333335,2012-08-09 09:00:00,2012-08-11 16:50:00,55.833333333333336,55.2,55.99999999999999,501.18723362727246,68.32,432.86723362727247,103.79159999999779,16.07676579925616,7.297,4.202368975555555,11.333333333333334,Yes,50.3585 +ED-1,6,2013,winter,winter/spring,207.86111111111111,2013-03-07 13:30:00,2013-03-07 13:40:00,0.16666666666666666,1.2,0.2,38.37072454922788,0.244,38.12672454922788,0.0,0.0,,,,No,1.09475 +ED-1,7,2013,winter,winter/spring,0.34722222222222227,2013-03-07 22:00:00,2013-03-08 05:10:00,7.166666666666667,1.2,1.4000000000000001,40.55085354483839,1.7080000000000002,38.84285354483839,0.0,0.0,,,,No,1.09475 +ED-1,8,2013,winter,winter/spring,2.3819444444444446,2013-03-10 14:20:00,2013-03-13 01:30:00,59.166666666666664,2.4,10.200000000000001,60.81350012787179,12.444,48.36950012787179,71.82479999999707,11.125278810408469,1.184,0.3942518569444444,13.0,Yes,2.1895 +ED-1,9,2013,winter,winter/spring,0.3055555555555556,2013-03-13 08:50:00,2013-03-13 10:40:00,1.8333333333333333,1.2,0.4,38.72576449216173,0.488,38.23776449216173,0.0,0.0,,,,No,1.09475 +ED-1,10,2013,winter,winter/spring,5.388888888888889,2013-03-18 20:00:00,2013-03-18 23:50:00,3.8333333333333335,8.4,3.6,44.87453899331323,4.392,40.48253899331323,0.0,0.0,,,,No,7.663250000000001 +ED-1,11,2013,winter,winter/spring,1.3958333333333335,2013-03-20 09:20:00,2013-03-20 10:20:00,1.0,1.2,0.4,38.72576449216173,0.488,38.23776449216173,0.0,0.0,,,,No,1.09475 +ED-1,12,2013,spring,winter/spring,11.500000000000002,2013-03-31 22:20:00,2013-03-31 23:20:00,1.0,6.0,1.5999999999999999,40.926065973001094,1.9519999999999997,38.974065973001096,0.0,0.0,,,,No,5.473750000000001 +ED-1,13,2013,spring,winter/spring,0.4166666666666667,2013-04-01 09:20:00,2013-04-01 09:30:00,0.16666666666666666,1.2,0.2,38.37072454922788,0.244,38.12672454922788,0.0,0.0,,,,No,1.09475 +ED-1,14,2013,spring,winter/spring,5.902777777777779,2013-04-07 07:10:00,2013-04-07 07:20:00,0.16666666666666666,1.2,0.2,38.37072454922788,0.244,38.12672454922788,0.0,0.0,,,,No,1.09475 +ED-1,15,2013,spring,winter/spring,1.3333333333333333,2013-04-08 15:20:00,2013-04-08 21:10:00,5.833333333333333,13.2,10.8,62.51726927756859,13.176,49.341269277568585,0.0,0.0,,,,No,12.04225 +ED-1,16,2013,spring,winter/spring,0.7500000000000001,2013-04-09 15:10:00,2013-04-10 17:10:00,26.0,20.4,30.000000000000004,151.35612484362088,36.6,114.75612484362088,3.1866,0.4935873605947955,0.257,2.319193080277778,0.6666666666666666,Yes,18.61075 +ED-1,17,2013,spring,winter/spring,0.5347222222222222,2013-04-11 06:00:00,2013-04-13 19:00:00,61.0,8.4,31.800000000000004,164.43717232149325,38.79600000000001,125.64117232149324,41.3382,6.403066914498141,1.247,6.237539573333334,0.8333333333333334,Yes,7.663250000000001 +ED-1,18,2013,spring,winter/spring,2.5,2013-04-16 07:00:00,2013-04-16 07:10:00,0.16666666666666666,1.2,0.2,38.37072454922788,0.244,38.12672454922788,0.0,0.0,,,,No,1.09475 +ED-1,19,2013,spring,winter/spring,1.6319444444444444,2013-04-17 22:20:00,2013-04-18 04:50:00,6.5,7.2,4.4,46.55860935229591,5.368,41.19060935229591,0.0,0.0,,,,No,6.5685 +ED-1,20,2013,spring,winter/spring,0.5833333333333334,2013-04-18 18:50:00,2013-04-18 23:50:00,5.0,2.4,1.0,39.810717055349734,1.22,38.590717055349735,0.0,0.0,,,,No,2.1895 +ED-1,21,2013,spring,winter/spring,0.3333333333333333,2013-04-19 07:50:00,2013-04-19 13:20:00,5.5,3.6,2.0,41.68693834703355,2.44,39.246938347033556,0.0,0.0,,,,No,3.28425 +ED-1,22,2013,spring,winter/spring,0.5555555555555556,2013-04-20 02:40:00,2013-04-20 08:20:00,5.666666666666667,1.2,0.6000000000000001,39.084089579240214,0.7320000000000001,38.352089579240214,0.0,0.0,,,,No,1.09475 +ED-1,23,2013,spring,winter/spring,4.090277777777778,2013-04-24 10:30:00,2013-04-24 16:50:00,6.333333333333333,7.2,13.799999999999999,71.77942912713618,16.836,54.943429127136184,0.0,0.0,,,,No,6.5685 +ED-1,24,2013,spring,winter/spring,0.9652777777777778,2013-04-25 16:00:00,2013-04-25 18:20:00,2.3333333333333335,6.0,1.4,40.55085354483839,1.708,38.84285354483839,0.0,0.0,,,,No,5.473750000000001 +ED-1,25,2013,spring,winter/spring,2.9583333333333335,2013-04-28 17:20:00,2013-04-29 08:20:00,15.0,4.8,11.2,63.67955209079159,13.664,50.01555209079159,0.0,0.0,,,,No,4.379 +ED-1,26,2013,spring,winter/spring,0.3194444444444444,2013-04-29 16:00:00,2013-04-29 21:10:00,5.166666666666667,1.2,1.0,39.810717055349734,1.22,38.590717055349735,0.0,0.0,,,,No,1.09475 +ED-1,27,2013,spring,winter/spring,0.7083333333333334,2013-04-30 14:10:00,2013-04-30 14:20:00,0.16666666666666666,1.2,0.2,38.37072454922788,0.244,38.12672454922788,0.0,0.0,,,,No,1.09475 diff --git a/pycvc/tests/testdata/baseline_wqdata.csv b/pycvc/tests/testdata/baseline_wqdata.csv new file mode 100644 index 0000000..8d730d8 --- /dev/null +++ b/pycvc/tests/testdata/baseline_wqdata.csv @@ -0,0 +1,13 @@ +site,sample,sampletype,samplestart,samplestop,interval_minutes,parameter,units,detectionlimit,qualifier,concentration,season,grouped_season,year +ED-1,ED-1-001,grab,2012-07-31 12:20:00,2012-07-31 12:24:00,10,Cadmium (Cd),ug/L,0.05,=,0.18,summer,summer/autumn,2012 +ED-1,ED-1-001,grab,2012-07-31 12:20:00,2012-07-31 12:24:00,10,Lead (Pb),ug/L,0.25,=,3.84,summer,summer/autumn,2012 +ED-1,ED-1-002,composite,2012-07-31 12:24:00,2012-07-31 16:45:00,10,Cadmium (Cd),ug/L,0.01,=,0.16,summer,summer/autumn,2012 +ED-1,ED-1-002,composite,2012-07-31 12:24:00,2012-07-31 16:45:00,10,Lead (Pb),ug/L,0.05,=,6.13,summer,summer/autumn,2012 +ED-1,ED-1-003,grab,2012-08-10 03:20:00,2012-08-10 03:24:00,30,Cadmium (Cd),ug/L,0.02,=,0.37,summer,summer/autumn,2012 +ED-1,ED-1-003,grab,2012-08-10 03:20:00,2012-08-10 03:24:00,30,Lead (Pb),ug/L,0.1,=,5.1,summer,summer/autumn,2012 +ED-1,ED-1-005,composite,2012-08-10 03:24:00,2012-08-10 20:54:00,30,Cadmium (Cd),ug/L,0.02,=,0.09,summer,summer/autumn,2012 +ED-1,ED-1-005,composite,2012-08-10 03:24:00,2012-08-10 20:54:00,30,Lead (Pb),ug/L,0.1,=,1.9,summer,summer/autumn,2012 +ED-1,ED-1-007,grab,2012-08-11 11:37:00,2012-08-11 11:41:00,10,Cadmium (Cd),ug/L,0.01,=,0.09,summer,summer/autumn,2012 +ED-1,ED-1-007,grab,2012-08-11 11:37:00,2012-08-11 11:41:00,10,Lead (Pb),ug/L,0.05,=,3.7,summer,summer/autumn,2012 +ED-1,ED-1-009,composite,2012-08-11 11:41:00,2012-08-11 17:31:00,10,Cadmium (Cd),ug/L,0.01,=,0.05,summer,summer/autumn,2012 +ED-1,ED-1-009,composite,2012-08-11 11:41:00,2012-08-11 17:31:00,10,Lead (Pb),ug/L,0.05,=,1.24,summer,summer/autumn,2012 diff --git a/pycvc/tests/testdata/test.accdb b/pycvc/tests/testdata/test.accdb index 1c1886c..d285624 100644 Binary files a/pycvc/tests/testdata/test.accdb and b/pycvc/tests/testdata/test.accdb differ diff --git a/pycvc/viz.py b/pycvc/viz.py index b7c8764..80559ba 100644 --- a/pycvc/viz.py +++ b/pycvc/viz.py @@ -22,7 +22,7 @@ def savefig(fig, figname, extra=None, asPNG=True, asPDF=False, load=False): extra : string or None (default) Relative path to subdirectories below './output/img' where the figure will be saved. - as[PNG|PDF] : bool, optional (default = True) + asPNG, asPDF : bool, optional (defaults: True, False, respectively) Toggles if the figure will be saved as a .png and/or .pdf file. If both are False, the figure is not saved in any form. load : bool, optional (default = False) @@ -82,7 +82,8 @@ def _reduction_range_bars(y, ylow, yhigh, sitecol, data=None, **kwargs): def reduction_plot(df, params, paramcol, sitecol, xvaluecol, leg_loc, **load_cols): - """ Draws the percent reduction bar plots with the upper and lower + """ + Draws the percent reduction bar plots with the upper and lower estimates. Parameters @@ -114,9 +115,13 @@ def reduction_plot(df, params, paramcol, sitecol, xvaluecol, leg_loc, **load_col The FaceGrid on which the data have been drawn. """ + + # pull out columns from the kwargs lower = load_cols.pop('lower', 'load_reduction_lower') reduction = load_cols.pop('reduction', 'load_reduction') upper = load_cols.pop('upper', 'load_reduction_upper') + + # draw the plot fg = seaborn.factorplot( x=xvaluecol, y=reduction, aspect=1.6, size=2, hue=sitecol, col=paramcol, col_order=params, col_wrap=2, @@ -124,27 +129,42 @@ def reduction_plot(df, params, paramcol, sitecol, xvaluecol, leg_loc, **load_col margin_titles=True, legend=False ) + # add a legend fg.add_legend(ncol=2) fg._legend.set_bbox_to_anchor(leg_loc) + + # draw the error bars fg.map_dataframe(_reduction_range_bars, reduction, lower, upper, sitecol) return fg -def hydro_pairplot(hydro, site, sitecol='site', by='season', palette=None, save=True): - """ Creates a pairplot of hydrologic quantities. +def hydro_pairplot(hydro, site, sitecol='site', by='season', + palette=None, save=True): + """ + Creates a pairplot of hydrologic quantities. Parameters ---------- + hydro : pandas.DataFrame + A tidy dataframe of the hydrologic info of storms. + site : string + The ID string of the site to be plotted (e.g., 'ED-1' for Elm + Drive) + sitecol : string + The label of the column in ``hydro`` that contains ``site``. by : string, optional (default = 'season') The column in Site.storm_info that defines how the data should be grouped. - palette : seaborn.color_palette or None (default) - Color scheme for the plot. + palette : seaborn.color_palette, optional + Color scheme for the plot. Defaults to the current palette. + save : bool, optional (False) + If True, the figure is automatically saved via :func:savefig + in the default locations ('output/img/HydroPairPlot') Returns ------- - None + pg : seaborn.PairGrid See Also -------- @@ -152,6 +172,7 @@ def hydro_pairplot(hydro, site, sitecol='site', by='season', palette=None, save= """ + # full list of columns for the dataframe cols = [ 'site', 'antecedent_days', @@ -165,6 +186,7 @@ def hydro_pairplot(hydro, site, sitecol='site', by='season', palette=None, save= 'Has outflow?' ] + # just the numeric columns to be plotted var_cols = [ 'antecedent days', 'duration hours', @@ -172,6 +194,8 @@ def hydro_pairplot(hydro, site, sitecol='site', by='season', palette=None, save= 'total precip depth', 'outflow mm', ] + + # clean up column names, drop irrelevant columns sinfo = ( hydro[hydro[sitecol] == site] .rename(columns={'has_outflow': 'Has outflow?', 'grouped_season': 'Seasons'}) @@ -220,19 +244,27 @@ def hydro_pairplot(hydro, site, sitecol='site', by='season', palette=None, save= if save: figname = '{}-HydroPairPlot_by_{}'.format(site, by) - _savefig(pg.fig, figname, extra='HydroPairPlot') + savefig(pg.fig, figname, extra='HydroPairPlot') return pg def hydro_histogram(hydro, valuecol='total_precip_depth', bins=None, save=True, **factoropts): - """ Plot a faceted, categorical histogram of storms. + """ + Plot a faceted, categorical histogram of storms. - valuecol : str, optional + Parameters + ---------- + hydro : pandas.DataFrame + A tidy dataframe of the hydrologic info of storms. + valuecol : str, optional ('total_precip_depth') The name of the column that should be categorized and plotted. bins : array-like, optional - The right-edges of the histogram bins. + The edges of the histogram bins. + save : bool, optional (False) + If True, the figure is automatically saved via :func:savefig + in the default locations ('output/img/HydroHistogram') factoropts : keyword arguments, optional Options passed directly to seaborn.factorplot @@ -250,36 +282,45 @@ def hydro_histogram(hydro, valuecol='total_precip_depth', bins=None, if bins is None: bins = np.arange(5, 30, 5) - fig = utils.figutils.categorical_histogram( + fg = utils.figutils.categorical_histogram( hydro, valuecol, bins, **factoropts ) if save: figname = 'HydroHistogram_{}'.format(valuecol) - _savefig(fig, figname, extra='HydroHistogram') + savefig(fg.fig, figname, extra='HydroHistogram') - return fig + return fg def hydro_jointplot(hydro, site, xcol, ycol, sitecol='site', color=None, conditions=None, one2one=True, save=True): - """ Creates a joint distribution plot of two hydrologic - quantities. + """ + Creates a joint distribution plot of two hydrologic quantities. Parameters ---------- - xcol, ycol : string - Column names found in Site.storm_info + hydro : pandas.DataFrame + A tidy dataframe of the hydrologic info of storms. + site : string + The ID string of the site to be plotted (e.g., 'ED-1' for Elm + Drive) + sitecol, xcol, ycol : string + Column names found in ``hydro`` that specify the columns + containing the site IDs, x-values, and y-values, respectively. conditions : string or None (default) - Query strings to be passed to Site.storm_info.query(...) + Query strings to be passed to ``hydro.query(...)`` one2one : bool, optional (default = True) Shows the 1:1 line on the scatter portion of the joint distribution plot. + save : bool, optional (False) + If True, the figure is automatically saved via :func:savefig + in the default locations ('output/img/HydroJoint') Returns ------- - None + jg : seaborn.JointGrid See Also -------- @@ -306,18 +347,71 @@ def hydro_jointplot(hydro, site, xcol, ycol, sitecol='site', ) if save: - figname = '{}-HydroJoinPlot_{}_vs_{}'.format(site, xcol, ycol) - _savefig(jg.fig, figname, extra='HydroJointPlot') + figname = '{}-HydroJointPlot_{}_vs_{}'.format(site, xcol, ycol) + savefig(jg.fig, figname, extra='HydroJointPlot') -def external_boxplot(tidy, sites=None, categories=None, params=None, +def external_boxplot(combined, sites=None, categories=None, params=None, units=None, palette=None): + """ + Faceted box and whisker plots of site data with external (i.e., + NSQD or BMPDB data). Since we're comparing CVC with external data, + only concentrations can be plotted (i.e., loads from BMPDB and NSQD + are not available). + + Parameters + ---------- + combined : pandas.DataFrame + A single tidy dataframe of both the CVC and external data. + + .. note :: + BMP categories or NSQD landuses should be stored in the + `'site'` column of the dataframe. + + sites : list of string + The CVC sites to include in the plot. + categories : list of string + The NSQD landuses or BMPDB categories to include in the plot. + params : list of string + The parameters to include in the plots. + units : string + The units of measure of the quantity being plotted. + palette : seaborn.color_palette, optional + Color scheme for the plot. Defaults to the current palette. + + Returns + ------- + fg : seaborn.FacetGrid + + Examples + -------- + >>> import pandas + >>> import pycvc + >>> bmpdb = pycvc.external.bmpdb('black', 'D') + >>> tidy_file = 'output/tidy/wq_simple.csv' + >>> datecols = ['start_date', 'end_date', 'samplestart', 'samplestop'] + >>> wq = ( + ... pandas.read_csv(tidy_file, parse_dates=datecols) + ... .pipe(pycvc.summary.classify_storms, 'total_precip_depth') + ... .pipe(pycvc.summary.remove_load_data_from_storms, ['2013-07-08'], 'start_date') + ... ) + >>> combined = pycvc.external.combine_wq(wq, bmpdb, 'category') + >>> pycvc.viz.external_boxplot( + ... tidy=combined, + ... sites=['ED-1', 'LV-2', 'LV-4'], + ... categories=['Bioretention', 'Detention Basin', 'Wetland Channel'], + ... palette='Blues', + ... params=['Cadmium (Cd)', 'Copper (Cu)', 'Lead (Pb)', 'Zinc (Zn)'], + ... units='μg/L' + ... ) + + """ x_vals = np.hstack([sites, categories]) subset = ( - tidy.query("site in @x_vals") - .query("parameter in @params") + combined.query("site in @x_vals") + .query("parameter in @params") ) fg = seaborn.factorplot( data=subset, x='site', y='concentration', @@ -331,18 +425,106 @@ def external_boxplot(tidy, sites=None, categories=None, params=None, return fg -def seasonal_boxplot(wq, ycol, params, units): +def seasonal_boxplot(wq, ycol, params, units, palette=None): + """ + Faceted box and whisker plots of site data grouped by the season + during which the sample was collected. + + Parameters + ---------- + wq : pandas.DataFrame + A single tidy dataframe of the CVC water quality data. + ycol : string + The label of the column you wish to plot in the boxplots (e.g., + `'concentration'` or `'load_outflow'`). + params : list of string + The parameters to include in the plots. + units : string + The units of measure of the quantity being plotted. + palette : seaborn.color_palette, optional + Color scheme for the plot. Defaults to 'BrBG_r' (minty-green for + winter/spring to brown for summer/autumn). + + Returns + ------- + fg : seaborn.FacetGrid + + Examples + -------- + >>> import pycvc + >>> tidy_file = 'output/tidy/wq_simple.csv' + >>> wq = ( + ... pandas.read_csv(tidy_file, parse_dates=['start_date', 'end_date']) + ... .pipe(pycvc.summary.classify_storms, 'total_precip_depth') + ... .pipe(pycvc.summary.remove_load_data_from_storms, ['2013-07-08'], 'start_date') + ... ) + >>> params = ['Cadmium (Cd)', 'Copper (Cu)', 'Lead (Pb)', 'Zinc (Zn)'] + >>> bp = pycvc.viz.seasonal_boxplot(wq, 'concentration', params, 'μg/L') + + """ + + if palette is None: + palette = 'BrBG_r' + fg = seaborn.factorplot( data=wq.query('parameter in @params'), x='site', y='concentration', col='parameter', col_wrap=2, col_order=params, hue='season', hue_order=['winter', 'spring', 'summer', 'autumn'], - kind='box', palette='BrBG_r', aspect=2, size=3, sharey=False + kind='box', palette=palette, aspect=2, size=3, sharey=False ) + _format_facetgrid(fg, units) + return fg -def ts_plot(wq, datecol, ycol, sites, params, units, palette, markers): +def ts_plot(wq, datecol, ycol, sites, params, units, + palette=None, markers=None): + """ + Faceted time series plots of CVC water quality data. + + Parameters + ---------- + wq : pandas.DataFrame + A single tidy dataframe of the CVC water quality data. + datecol, ycol : string + The label of the column with the dates and the column you wish + to plot as the y-values (e.g., `'concentration'` or + `'load_outflow'`). + sites : list of string + The CVC sites to include in the plot. + params : list of string + The parameters to include in the plots. + units : string + The units of measure of the quantity being plotted. + palette : seaborn.color_palette, optional + Color scheme for the plot. Defaults to 'BrBG_r' (minty-green for + winter/spring to brown for summer/autumn). + markers : list of string, optional + List of valid matplotlib markers. This should have the same + number of elements as ``sites``. + + Returns + ------- + fg : seaborn.FacetGrid + + Examples + -------- + >>> import pycvc + >>> tidy_file = 'output/tidy/wq_simple.csv' + >>> wq = ( + ... pandas.read_csv(tidy_file, parse_dates=['start_date', 'end_date']) + ... .pipe(pycvc.summary.classify_storms, 'total_precip_depth') + ... .pipe(pycvc.summary.remove_load_data_from_storms, ['2013-07-08'], 'start_date') + ... ) + >>> params = ['Cadmium (Cd)', 'Copper (Cu)', 'Lead (Pb)', 'Zinc (Zn)'] + >>> sites = ['ED-1', 'LV-2', 'LV-4'] + >>> ts = pycvc.viz.ts_plot(wq, 'samplestart', 'concentration', + ... sites, params, 'μg/L', + ... markers=['o', 's', '^']) + + """ + subset = wq.query("site in @sites and parameter in @params").dropna(subset=[ycol]) fg = seaborn.FacetGrid( subset, aspect=2, size=3, sharey=False, @@ -354,7 +536,50 @@ def ts_plot(wq, datecol, ycol, sites, params, units, palette, markers): return fg -def prob_plot(wq, ycol, sites, params, units, palette, markers): +def prob_plot(wq, ycol, sites, params, units, palette=None, markers=None): + """ + Faceted probability plots of CVC water quality data. + + Parameters + ---------- + wq : pandas.DataFrame + A single tidy dataframe of the CVC water quality data. + ycol : string + The label of the column you wish to plot as the y-values (e.g., + `'concentration'` or `'load_outflow'`). + sites : list of string + The CVC sites to include in the plot. + params : list of string + The parameters to include in the plots. + units : string + The units of measure of the quantity being plotted. + palette : seaborn.color_palette, optional + Color scheme for the plot. Defaults to 'BrBG_r' (minty-green for + winter/spring to brown for summer/autumn). + markers : list of string, optional + List of valid matplotlib markers. This should have the same + number of elements as ``sites``. + + Returns + ------- + fg : seaborn.FacetGrid + + Examples + -------- + >>> import pycvc + >>> tidy_file = 'output/tidy/wq_simple.csv' + >>> wq = ( + ... pandas.read_csv(tidy_file, parse_dates=['start_date', 'end_date']) + ... .pipe(pycvc.summary.classify_storms, 'total_precip_depth') + ... .pipe(pycvc.summary.remove_load_data_from_storms, ['2013-07-08'], 'start_date') + ... ) + >>> params = ['Cadmium (Cd)', 'Copper (Cu)', 'Lead (Pb)', 'Zinc (Zn)'] + >>> sites = ['ED-1', 'LV-2', 'LV-4'] + >>> pp = pycvc.viz.prob_plot(wq, concentration', sites, params, + ... 'μg/L', markers=['o', 's', '^']) + + """ + def _pp(x, **kwargs): ax = plt.gca() qntls, xr = stats.probplot(x, fit=False) @@ -375,7 +600,10 @@ def _pp(x, **kwargs): return fg -def _format_facetgrid(fg, units, xlabels=None): +def _format_facetgrid(fg, units, yval='Concentration', xlabels=None): + """ + Rotates the ticklabels, sets the yscale='log', etc + """ fg.set_xticklabels( labels=xlabels, rotation=30, @@ -384,5 +612,5 @@ def _format_facetgrid(fg, units, xlabels=None): ) fg.set(yscale='log') fg.set_xlabels('') - fg.set_axis_labels(x_var='', y_var='Concentration ({})'.format(units)) + fg.set_axis_labels(x_var='', y_var='{} ({})'.format(yval, units)) return fg