pywatershed.Output#
- class pywatershed.Output(control, model, monthly_accum_var_list=None, noi_var_list=None, noi_ids=None, noi_stats=None, hoi_var_list=None, hoi_ids=None, hoi_stats=None, netcdf_output_action='error', chunked_var_list=None, chunked_output_file=None, chunk_sizes=None, chunk_size_auto_warn=True)[source]#
Output collection and statistical analysis for models.
Collects data during execution, computes statistics after finalization. Supports PRMS processes and FlowGraph.
- Parameters:
control (
Control) – Model control with timing informationmodel (
Model) – Pywatershed model instancemonthly_accum_var_list (
list[str], optional) – Variables to accumulate monthly (all spatial units)noi_var_list (
list[str], optional) – Variables to collect at nodes of interest. Required if noi_ids is a list. Must NOT be provided if dict (use dict keys).noi_ids (
list[int]ordict[str,list[int]]orlist[tuple]or dict[str,list[tuple]], optional) –Node IDs for NOIs. Supports two ID types and two modes.
ID types:
Simple IDs: Integer nhm_seg values (e.g., [12345, 67890])
FlowGraph tuples: (node_maker_name, node_maker_id) for FlowGraph nodes (e.g., [(“prms_channel”, 12345), (“starfit”, 0)])
Modes:
List mode: Same IDs for all vars (requires noi_var_list)
Dict mode: {var_name: [ids]} per-variable IDs (don’t provide noi_var_list)
noi_stats (
dict[Callable,list[str]], optional) – Statistics for NOIs: {function: [var1, var2, …]}hoi_var_list (
list[str], optional) – Variables to collect for HRUs of interest. Required if hoi_ids is a list. Must NOT be provided if hoi_ids is dict (use dict keys).hoi_ids (
list[int]ordict[str,list[int]], optional) –HRU IDs (nhm_id values). Two modes:
List mode: Same IDs for all vars (requires hoi_var_list)
Dict mode: {var_name: [ids]} per-variable IDs (don’t provide hoi_var_list)
hoi_stats (
dict[Callable,list[str]], optional) – Statistics for HOIs: {function: [var1, var2, …]}chunked_var_list (
list[str], optional) – Variables to write in chunks to zarr format. These variables will be buffered in memory for chunk_sizes[‘time’] timesteps and written to zarr file when buffer is full.chunked_output_file (
strorpathlib.Path, optional) – Path to zarr output file. Required if chunked_var_list is provided.chunk_sizes (
dict[str,int], optional) – Chunk sizes for zarr output. Keys: ‘time’, ‘nhru’, ‘nsegment’, ‘nnode’. If not provided, sensible defaults will be used based on spatial dimensions. Defaults target ~10-100 MB chunks.chunk_size_auto_warn (
bool, optional) – If True (default), warn when chunk_sizes are auto-determined.
- Variables:
time (
np.ndarray) – Daily time coordinatetime_months (
np.ndarray) – Monthly time coordinaten_days_per_month (
xr.DataArray) – Days per month (for converting accumulations to means)monthly_accumulations (
dict[str,xr.DataArray]) – Monthly values, available after finalizationnoi_arrays (
dict[str,xr.DataArray]) – NOI time series, available after finalizationhoi_arrays (
dict[str,xr.DataArray]) – HOI time series, available after finalizationnoi_stats (
dict[str,dict[str,xr.DataArray]]) – NOI statistics: noi_stats[variable][statistic]hoi_stats (
dict[str,dict[str,xr.DataArray]]) – HOI statistics: hoi_stats[variable][statistic]
Examples
>>> from pywatershed.analysis.time_stats import mean >>> def max_flow(da): ... return da.max(dim="time") ... >>> >>> # List mode: same IDs for all variables >>> output = pws.base.Output( ... control=control, ... model=model, ... noi_var_list=["seg_outflow"], # Required with list mode ... noi_ids=[12345, 67890], ... noi_stats={mean: ["seg_outflow"]}, ... hoi_var_list=["hru_actet"], # Required with list mode ... hoi_ids=[1, 2, 3], ... hoi_stats={mean: ["hru_actet"]}, ... ) >>> >>> # Dict mode: per-variable IDs >>> output = pws.base.Output( ... control=control, ... model=model, ... noi_ids={ # Dict keys define variables ... "seg_outflow": [12345, 67890], ... "seg_upstream_inflow": [12345], ... }, ... noi_stats={mean: ["seg_outflow"]}, # Not all vars need stats ... hoi_ids={ # Dict keys define variables ... "hru_actet": [1, 2], ... "pkwater_equiv": [3, 4, 5], ... }, ... hoi_stats={mean: ["hru_actet"]}, ... ) >>> >>> # FlowGraph mode: tuple IDs for nodes >>> output = pws.base.Output( ... control=control, ... model=flowgraph_model, ... noi_ids={ ... "node_outflows": [("prms_channel", 12345), ("starfit", 0)], ... "node_storages": [("starfit", 0)], ... }, ... noi_stats={mean: ["node_outflows"]}, ... ) >>> model.run(finalize=True, output=output) >>> >>> # Access hierarchically >>> output.noi_stats["seg_outflow"]["mean"] >>> output.hoi_stats["hru_actet"]["mean"]
- __init__(control, model, monthly_accum_var_list=None, noi_var_list=None, noi_ids=None, noi_stats=None, hoi_var_list=None, hoi_ids=None, hoi_stats=None, netcdf_output_action='error', chunked_var_list=None, chunked_output_file=None, chunk_sizes=None, chunk_size_auto_warn=True)[source]#
Initialize Output and set up data collection.
Methods
__init__(control, model[, ...])Initialize Output and set up data collection.
Collect data for current timestep (called by model.run()).
finalize()Finalize and calculate statistics (called by model.run()).
to_netcdf(output_dir)Write output to netCDF files (not yet implemented).
Attributes
HOI time series (available after finalization).
hoi_stats[variable][statistic] (after finalization).
Monthly accumulations (available after finalization).
Number of days in each month for stats.
NOI time series (available after finalization).
noi_stats[variable][statistic] (after finalization).
Daily time coordinate for NOI/HOI data.
Monthly time coordinate for accumulations.
- property hoi_stats: dict[str, dict[str, DataArray]] | None#
hoi_stats[variable][statistic] (after finalization).
- Type:
HOI statistics
- property monthly_accumulations: dict[str, DataArray] | None#
Monthly accumulations (available after finalization).
- property n_days_per_month: DataArray | None#
Number of days in each month for stats.
- Returns:
xr.DataArrayorNone– DataArray of day counts per month with month dimension, useful for converting accumulations to means. Only available after finalization.