Output.node_series

Output.node_series(node, attribute=('invert_depth', 'flooding_losses', 'total_inflow'), start=None, end=None, columns='attr', asframe=True)[source]

Get one or more time series for one or more node attributes. Specify series start index and end index to get desired time range.

Parameters:
node: Union[int, str, Sequence[Union[int, str]], None]

The node index or name.

attribute: int | str | EnumMeta | Sequence[int | str | EnumMeta] | None,

The attribute index or name.

On of:

invert_depth, hydraulic_head, ponded_volume, lateral_inflow, total_inflow, flooding_losses.

defaults to: (‘invert_depth’,’flooding_losses’,’total_inflow’)

Can also input the integer index of the attribute you would like to pull or the actual enum from Output.node_attributes.

Setting to None indicates all attributes.

start: Union[str, int, datetime, None], optional

The start datetime or index of from which to return series, defaults to None.

Setting to None indicates simulation start.

end: Union[str, int, datetime, None], optional

The end datetime or index of from which to return series, defaults to None.

Setting to None indicates simulation end.

columns: Optional[str], optional

Decide whether or not to break out elements or attributes as columns. May be one of:

None: Return long-form data with one column for each data point

‘elem’: Return data with a column for each element. If more than one attribute are given, attribute names are added to the index.

‘attr’: Return data with a column for each attribute. If more than one element are given, element names are added to the index.

defaults to ‘attr’.

asframe: bool

A switch to return an indexed DataFrame. Set to False to get an array of values only, defaults to True.

Returns:
Union[pd.DataFrame,np.ndarray]

A DataFrame or ndarray of attribute values in each column for requested date range and nodes.

Examples

Pull single time series for a single node

>>> from swmm.pandas import Output,example_out_path
>>> out = Output(example_out_path)
>>> out.node_series('JUNC2', 'invert_depth')
                     invert_depth
datetime
1900-01-01 00:05:00      0.334742
1900-01-01 00:10:00      0.509440
1900-01-01 00:15:00      0.562722
1900-01-01 00:20:00      0.602668
1900-01-01 00:25:00      0.631424
...                           ...
1900-01-01 23:40:00      0.766949
1900-01-01 23:45:00      0.766949
1900-01-01 23:50:00      0.766949
1900-01-01 23:55:00      0.766949
1900-01-02 00:00:00      0.766949
[288 rows x 1 columns]

Pull a wide-form dataframe for all parameters for a node

>>> out.node_series('JUNC2', out.node_attributes)
                   invert_depth  hydraulic_head  ponded_volume  lateral_inflow  total_inflow  flooding_losses  groundwater  pol_rainfall     sewage
datetime
1900-01-01 00:05:00      0.334742       -0.705258            0.0        0.185754      0.185785              0.0     3.935642      0.000000  95.884094
1900-01-01 00:10:00      0.509440       -0.530560            0.0        0.196764      0.197044              0.0     8.902034      0.000000  90.335831
1900-01-01 00:15:00      0.562722       -0.477278            0.0        0.198615      0.199436              0.0     9.038609      0.000000  89.253334
1900-01-01 00:20:00      0.602668       -0.437332            0.0        0.200802      0.202462              0.0     9.259741      0.000000  87.919571
1900-01-01 00:25:00      0.631424       -0.408576            0.0        0.203108      0.205802              0.0     9.523322      0.000000  86.492836
...                           ...             ...            ...             ...           ...              ...          ...           ...        ...
1900-01-01 23:40:00      0.766949       -0.273052            0.0        0.314470      0.352183              0.0    15.293419     39.303375  45.430920
1900-01-01 23:45:00      0.766949       -0.273052            0.0        0.314499      0.352183              0.0    15.313400     39.292118  45.430920
1900-01-01 23:50:00      0.766949       -0.273052            0.0        0.314530      0.352183              0.0    15.333243     39.281300  45.430920
1900-01-01 23:55:00      0.766949       -0.273052            0.0        0.314559      0.352183              0.0    15.352408     39.271194  45.430920
1900-01-02 00:00:00      0.766949       -0.273052            0.0        0.314590      0.352183              0.0    15.371475     39.261478  45.430920
[288 rows x 9 columns]

Pull a long-form dataframe of all nodes and attributes

>>> out.node_series('JUNC2', out.node_attributes, columns=None)
                                            result
datetime            element attribute
1900-01-01 00:05:00 JUNC1   invert_depth   0.002143
1900-01-01 00:10:00 JUNC1   invert_depth   0.010006
1900-01-01 00:15:00 JUNC1   invert_depth   0.017985
1900-01-01 00:20:00 JUNC1   invert_depth   0.025063
1900-01-01 00:25:00 JUNC1   invert_depth   0.031329
...                                             ...
1900-01-01 23:40:00 STOR1   sewage        51.502193
1900-01-01 23:45:00 STOR1   sewage        51.164684
1900-01-01 23:50:00 STOR1   sewage        50.905445
1900-01-01 23:55:00 STOR1   sewage        50.715385
1900-01-02 00:00:00 STOR1   sewage        50.574486
[23328 rows x 1 columns]

Pull flow timeseries and calculate the total flow volume for all nodes

>>> from swmm.pandas.constants import gal_per_cf
>>> df = out.node_series(out.nodes, ['lateral_inflow','total_inflow','flooding_losses'])
                             lateral_inflow  total_inflow  flooding_losses
datetime            element
1900-01-01 00:05:00 JUNC1          0.002362      0.002362              0.0
1900-01-01 00:10:00 JUNC1          0.005792      0.005792              0.0
1900-01-01 00:15:00 JUNC1          0.006524      0.006524              0.0
1900-01-01 00:20:00 JUNC1          0.007306      0.007306              0.0
1900-01-01 00:25:00 JUNC1          0.008039      0.008039              0.0
...                                     ...           ...              ...
1900-01-01 23:40:00 STOR1          0.000000      1.455056              0.0
1900-01-01 23:45:00 STOR1          0.000000      1.455056              0.0
1900-01-01 23:50:00 STOR1          0.000000      1.455056              0.0
1900-01-01 23:55:00 STOR1          0.000000      1.455056              0.0
1900-01-02 00:00:00 STOR1          0.000000      1.455056              0.0
[2592 rows x 3 columns]
#----------------------------------------------------------------------------
# group by element name and sum,
# then multiply by reporting timestep in seconds
# then convert to millions of gallons
>>> df.groupby('element').sum() * out.report * gal_per_cf / 1e6
        lateral_inflow  total_inflow  flooding_losses
element
JUNC1          0.101562      0.101898         0.000053
JUNC2          0.544891      0.857012         0.000000
JUNC3          0.000000      0.502078         0.080634
JUNC4          1.813826      2.096243         0.317929
JUNC5          0.000000      1.870291         0.073878
JUNC6          0.000000      1.701455         0.000000
OUT1           0.000000      1.698081         0.000000
OUT2           0.000000      0.575617         0.000000
STOR1          0.000000      1.862843         0.172482