-
Notifications
You must be signed in to change notification settings - Fork 11
catchstats
The catchstats
tool calculates catchment statistics given a set of input NetCDF files and a set of mask NetCDF files.
The structure of the output depends on whether the input files include a temporal dimension or not:
- If the input files DO NOT have a time dimension, the output has a single dimension: the catchment ID. It contains as many variables as the combinations of input variables and statistics. For instance, if the input variables are "elevation" and "gradient" and three statistics are required ("mean", "max", "min"), the output will contain 6 variables: "elevation_mean", "elevation_max", "elevation_min", "gradient_mean", "gradient_max" and "gradient_min".
- If the input files DO have a time dimension, the output has two dimensions: the catchment ID and time. The number of variables follows the same structure explained in the previous point. For instance, if the input files are daily maps of precipitation (variable name "pr") and we calculate the mean and total precipitation over the catchment, the output will contain two dimensions ("ID", "time") and two variables ("pr_mean", "pr_sum").
The tool takes as input a directory containing the NetCDF files from which the statistics will be computed, and another directory containing the NetCDF files that define the catchment boundaries, which can be any of the outputs of cutmaps
(not necessarily the file my_mask.nc). The input files can be the LISFLOOD static maps (no temporal dimension) or stacks of maps with a temporal dimension. The mask NetCDF files must be named after the catchment ID, as this name will be used to identify the catchment in the output NetCDF. For instance, 0142.nc would correspond to the mask of catchment 142. Optionally, an extra NetCDF file can be passed to the tool to account for different pixel area; in this case, the statistics will be weighted by this pixel area map.
Only some statistics are currently available: mean, sum, std (standard deviation), var (variance), min, max, median and count. The weighing based on pixel area does not affect the statistics min, max, median nor count.
The output are NetCDF files (as many as catchments in the mask directory) containing the resulting statistics.
usage: catchstats.py [-h] -i INPUT -m MASK -s STATISTIC -o OUTPUT -a AREA [-W]
Utility to compute catchment statistics from (multiple) NetCDF files.
The mask map is a NetCDF file with values in the area of interest and NaN elsewhere.
The area map is optional and accounts for varying pixel area with latitude.
options:
-h, --help
show this help message and exit
-i INPUT, --input INPUT
directory containing the input NetCDF files
-m MASK, --mask MASK
directory containing the mask NetCDF files
-s STATISTIC, --statistic STATISTIC
list of statistics to be computed. Possible values: mean, sum, std, var, min, max, median, count
-o OUTPUT, --output OUTPUT
directory where the output NetCDF files will be saved
-a AREA, --area AREA
NetCDF file of pixel area used to weigh the statistics
-W, --overwrite
overwrite existing output files
Example
The following command calculates the average and total precipitation for a set of catchemtns from the dataset EMO-1. The static map pixarea.nc is used to account for varying pixel area.
catchstats -i ./EMO1/pr/ -m ./masks/ -s mean sum -o ./areal_precipitation/ -a ./EFAS5/static_maps/pixarea.nc
The tool can be imported in a Python script to be able to save in memory the output. This function takes in a xarray.Dataset
with the input maps from which statistics will be computed, a dictionary of xarray.DataArray
with the catchment masks, and optionally the weighing map. By default, the result is a xarray.Dataset
, but NetCDF files could be written, instead, if a directory is provided in the output
attribute.
# import function
from lisfloodutilities.catchstats import catchment_statistics
# load desired input maps and catchment masks
# maps: xarray.Dataset
# masks: Dict[int, xarray.DataArray]
# compute statistics and save in a xarray.Dataset
ds = catchment_statistics(maps, masks, statistic=['mean', 'sum'], weight=None, output=None)