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",
+ " season | \n",
+ " autumn | \n",
+ " spring | \n",
+ " summer | \n",
+ " winter | \n",
+ "
\n",
+ " \n",
+ " parameter | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Cadmium (Cd) | \n",
+ " 35 | \n",
+ " 35 | \n",
+ " 49 | \n",
+ " 22 | \n",
+ "
\n",
+ " \n",
+ " Copper (Cu) | \n",
+ " 61 | \n",
+ " 105 | \n",
+ " 106 | \n",
+ " 29 | \n",
+ "
\n",
+ " \n",
+ " Dissolved Chloride (Cl) | \n",
+ " 9 | \n",
+ " 12 | \n",
+ " 16 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " Escherichia coli | \n",
+ " 4 | \n",
+ " 7 | \n",
+ " 3 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " Lead (Pb) | \n",
+ " 58 | \n",
+ " 85 | \n",
+ " 81 | \n",
+ " 31 | \n",
+ "
\n",
+ " \n",
+ " Nickel (Ni) | \n",
+ " 11 | \n",
+ " 9 | \n",
+ " 10 | \n",
+ " 7 | \n",
+ "
\n",
+ " \n",
+ " Nitrate + Nitrite | \n",
+ " 97 | \n",
+ " 123 | \n",
+ " 153 | \n",
+ " 29 | \n",
+ "
\n",
+ " \n",
+ " Orthophosphate (P) | \n",
+ " 5 | \n",
+ " 8 | \n",
+ " 5 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " Total Kjeldahl Nitrogen (TKN) | \n",
+ " 99 | \n",
+ " 124 | \n",
+ " 156 | \n",
+ " 37 | \n",
+ "
\n",
+ " \n",
+ " Total Oil & Grease | \n",
+ " 5 | \n",
+ " 12 | \n",
+ " 4 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " Total Phosphorus | \n",
+ " 115 | \n",
+ " 174 | \n",
+ " 203 | \n",
+ " 41 | \n",
+ "
\n",
+ " \n",
+ " Total Suspended Solids | \n",
+ " 104 | \n",
+ " 151 | \n",
+ " 185 | \n",
+ " 35 | \n",
+ "
\n",
+ " \n",
+ " Zinc (Zn) | \n",
+ " 64 | \n",
+ " 101 | \n",
+ " 125 | \n",
+ " 29 | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " parameter | \n",
+ " units | \n",
+ " season | \n",
+ " res | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " Total Suspended Solids | \n",
+ " mg/L | \n",
+ " autumn | \n",
+ " 55 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " Total Suspended Solids | \n",
+ " mg/L | \n",
+ " spring | \n",
+ " 100 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " Total Suspended Solids | \n",
+ " mg/L | \n",
+ " summer | \n",
+ " 93 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " Total Suspended Solids | \n",
+ " mg/L | \n",
+ " winter | \n",
+ " 92 | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " parameter | \n",
+ " units | \n",
+ " season | \n",
+ " res | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " Total Suspended Solids | \n",
+ " mg/L | \n",
+ " autumn | \n",
+ " 53.0 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " Total Suspended Solids | \n",
+ " mg/L | \n",
+ " spring | \n",
+ " 100.0 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " Total Suspended Solids | \n",
+ " mg/L | \n",
+ " summer | \n",
+ " 94.2 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " Total Suspended Solids | \n",
+ " mg/L | \n",
+ " winter | \n",
+ " 92.0 | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " | parameter | units | season | median(res) |
\n",
+ "\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",
+ "\n",
+ "
\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