tstoolbox: Statistics¶
I will use the water level record for USGS site ‘02240000 OCKLAWAHA RIVER NEAR CONNER, FL’. Use tsgettoolbox to download the data we will be using.
[1]:
from tsgettoolbox import tsgettoolbox
from tstoolbox import tstoolbox
from tstoolbox.toolbox_utils.src.toolbox_utils import tsutils
[2]:
ock_flow = tsgettoolbox.nwis_dv(
sites="02240000", startDT="2008-01-01", endDT="2016-01-01", parameterCd="00060"
)
[3]:
ock_flow.head()
[3]:
| USGS_02240000_22614_00060_00003 | |
|---|---|
| Datetime | |
| 2008-01-01 | 541 |
| 2008-01-02 | 533 |
| 2008-01-03 | 520 |
| 2008-01-04 | 508 |
| 2008-01-05 | 516 |
[4]:
ock_stage = tsgettoolbox.nwis_dv(
sites="02240000", startDT="2008-01-01", endDT="2016-01-01", parameterCd="00065"
)
[5]:
ock_stage.head()
[5]:
| USGS_02240000_22615_00065_00003 | |
|---|---|
| Datetime | |
| 2008-01-01 | 3.67 |
| 2008-01-02 | 3.64 |
| 2008-01-03 | 3.60 |
| 2008-01-04 | 3.58 |
| 2008-01-05 | 3.57 |
The tstoolbox.rolling_window calculates the average stage over the spans listed in the ‘span’ argument.
[6]:
r_ock_stage = tstoolbox.rolling_window(
input_ts=ock_stage, span="1,14,30,60,90,120,180,274,365", statistic="mean"
)
a_ock_stage = tstoolbox.aggregate(
input_ts=r_ock_stage, agg_interval=tsutils.pandas_offset_by_version("YE"), statistic="max"
)
[7]:
a_ock_stage
[7]:
| USGS_02240000_22615_00065_00003::rolling.1.mean_max | USGS_02240000_22615_00065_00003.001::rolling.14.mean_max | USGS_02240000_22615_00065_00003.002::rolling.30.mean_max | USGS_02240000_22615_00065_00003.003::rolling.60.mean_max | USGS_02240000_22615_00065_00003.004::rolling.90.mean_max | USGS_02240000_22615_00065_00003.005::rolling.120.mean_max | USGS_02240000_22615_00065_00003.006::rolling.180.mean_max | USGS_02240000_22615_00065_00003.007::rolling.274.mean_max | USGS_02240000_22615_00065_00003.008::rolling.365.mean_max | |
|---|---|---|---|---|---|---|---|---|---|
| Datetime | |||||||||
| 2008-12-31 | 7.73 | 6.055714 | 5.638667 | 4.383333 | 4.049444 | 3.958 | 3.985167 | <NA> | <NA> |
| 2009-12-31 | 5.29 | 4.949286 | 4.257667 | 4.179333 | 4.272222 | 4.154833 | 3.953389 | <NA> | <NA> |
| 2010-12-31 | 7.49 | 6.492857 | 5.919667 | 5.079167 | 4.78 | 4.788167 | <NA> | <NA> | <NA> |
| 2011-12-31 | 6.22 | 5.357143 | 5.227 | 5.189333 | 5.175444 | 5.147917 | 4.967722 | 4.632664 | 4.345315 |
| 2012-12-31 | 6.12 | 5.473571 | 5.334667 | 5.308 | 5.233444 | 5.122083 | 4.809944 | 4.554051 | 4.559014 |
| 2013-12-31 | 5.39 | 5.248571 | 5.083 | 4.775333 | 4.458444 | 4.19275 | 3.812833 | 3.41062 | <NA> |
| 2014-12-31 | 5.86 | 5.762857 | 5.704667 | 5.614333 | 5.510222 | 5.437917 | 5.213722 | 3.709526 | 3.379041 |
| 2015-12-31 | 6.85 | 5.256429 | 5.001333 | 4.884167 | 4.792333 | 4.882583 | 5.126222 | 5.06073 | 4.767342 |
| 2016-12-31 | 3.41 | 3.485 | 3.549667 | 3.667167 | 3.866889 | <NA> | <NA> | <NA> | <NA> |
[9]:
q_max_avg_obs = tstoolbox.calculate_fdc(input_ts=a_ock_stage, sort_values="descending")
[10]:
q_max_avg_obs
[10]:
| USGS_02240000_22615_00065_00003::rolling.1.mean_max | USGS_02240000_22615_00065_00003.001::rolling.14.mean_max | USGS_02240000_22615_00065_00003.002::rolling.30.mean_max | USGS_02240000_22615_00065_00003.003::rolling.60.mean_max | USGS_02240000_22615_00065_00003.004::rolling.90.mean_max | USGS_02240000_22615_00065_00003.005::rolling.120.mean_max | USGS_02240000_22615_00065_00003.006::rolling.180.mean_max | USGS_02240000_22615_00065_00003.007::rolling.274.mean_max | USGS_02240000_22615_00065_00003.008::rolling.365.mean_max | |
|---|---|---|---|---|---|---|---|---|---|
| Plotting_position | |||||||||
| 10.000000 | 7.73 | 6.492857 | 5.919667 | 5.614333 | 5.510222 | <NA> | <NA> | <NA> | <NA> |
| 11.111111 | <NA> | <NA> | <NA> | <NA> | <NA> | 5.437917 | <NA> | <NA> | <NA> |
| 12.500000 | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | 5.213722 | <NA> | <NA> |
| 16.666667 | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | 5.06073 | <NA> |
| 20.000000 | 7.49 | 6.055714 | 5.704667 | 5.308 | 5.233444 | <NA> | <NA> | <NA> | 4.767342 |
| 22.222222 | <NA> | <NA> | <NA> | <NA> | <NA> | 5.147917 | <NA> | <NA> | <NA> |
| 25.000000 | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | 5.126222 | <NA> | <NA> |
| 30.000000 | 6.85 | 5.762857 | 5.638667 | 5.189333 | 5.175444 | <NA> | <NA> | <NA> | <NA> |
| 33.333333 | <NA> | <NA> | <NA> | <NA> | <NA> | 5.122083 | <NA> | 4.632664 | <NA> |
| 37.500000 | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | 4.967722 | <NA> | <NA> |
| 40.000000 | 6.22 | 5.473571 | 5.334667 | 5.079167 | 4.792333 | <NA> | <NA> | <NA> | 4.559014 |
| 44.444444 | <NA> | <NA> | <NA> | <NA> | <NA> | 4.882583 | <NA> | <NA> | <NA> |
| 50.000000 | 6.12 | 5.357143 | 5.227 | 4.884167 | 4.78 | <NA> | 4.809944 | 4.554051 | <NA> |
| 55.555556 | <NA> | <NA> | <NA> | <NA> | <NA> | 4.788167 | <NA> | <NA> | <NA> |
| 60.000000 | 5.86 | 5.256429 | 5.083 | 4.775333 | 4.458444 | <NA> | <NA> | <NA> | 4.345315 |
| 62.500000 | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | 3.985167 | <NA> | <NA> |
| 66.666667 | <NA> | <NA> | <NA> | <NA> | <NA> | 4.19275 | <NA> | 3.709526 | <NA> |
| 70.000000 | 5.39 | 5.248571 | 5.001333 | 4.383333 | 4.272222 | <NA> | <NA> | <NA> | <NA> |
| 75.000000 | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | 3.953389 | <NA> | <NA> |
| 77.777778 | <NA> | <NA> | <NA> | <NA> | <NA> | 4.154833 | <NA> | <NA> | <NA> |
| 80.000000 | 5.29 | 4.949286 | 4.257667 | 4.179333 | 4.049444 | <NA> | <NA> | <NA> | 3.379041 |
| 83.333333 | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | 3.41062 | <NA> |
| 87.500000 | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | 3.812833 | <NA> | <NA> |
| 88.888889 | <NA> | <NA> | <NA> | <NA> | <NA> | 3.958 | <NA> | <NA> | <NA> |
| 90.000000 | 3.41 | 3.485 | 3.549667 | 3.667167 | 3.866889 | <NA> | <NA> | <NA> | <NA> |
[13]:
tstoolbox.plot(
input_ts=q_max_avg_obs,
ofilename="q_max_avg.png",
type="norm_xaxis",
xtitle="Annual Exceedence Probability (%)",
ytitle="Stage (feet)",
title="N-day Maximum Rolling Window Average Stage for 0224000",
legend_names=["1","14","30","60","90","120","180","274","365"],
)
[13]:
<module 'matplotlib.pyplot' from '/var/home/timcera/miniconda3/envs/default314/lib/python3.14/site-packages/matplotlib/pyplot.py'>

[14]:
combined = ock_flow.join(ock_stage)
tstoolbox.plot(
input_ts=combined,
type="xy",
ofilename="stage_flow.png",
legend=False,
title="Plot of Daily Stage vs Flow for 02240000",
xtitle="Flow (cfs)",
ytitle="Stage (ft)",
)
[14]:
<module 'matplotlib.pyplot' from '/var/home/timcera/miniconda3/envs/default314/lib/python3.14/site-packages/matplotlib/pyplot.py'>

Note the signficant effect of tail-water elevation.
[ ]: