Package: bmi-nwis
bmi_nwisbmi_nwis package is an implementation of the Basic Model Interface (BMI)
for theUSGS NWIS dataset.
This package uses thedataretrievalpackage
to download the NWIS dataset and wraps the dataset with BMI for data control and query.This package is not implemented for people to use but is the key element to convert the NWIS dataset
into a data component (pymt_nwis) for
thePyMTmodeling framework developed by
Community Surface Dynamics Modeling System (CSDMS).Please note that the current bmi_nwis implementation only supports to download time series data
for instantaneous values and daily mean values ('iv' or 'dv' service option in the dataretrieval package).
If you have any suggestion to improve the current function, please create a github issuehere.Get StartedInstall packageStable ReleaseThe bmi_nwis package and its dependencies can be installed with pip.$ pip install bmi_nwisFrom SourceAfter downloading the source code, run the following command from top-level folder
(the one that contains setup.py) to install bmi_nwis.$ pip install -e .Download NWIS DataYou can learn more details from thetutorial notebookand launch binder to run the notebook.Example 1: use the dataretrieval package to download dataimportdataretrieval.nwisasnwis# get data from NWISdataset=nwis.get_record(sites='03339000',service='iv',start='2022-01-01',end='2022-01-03')# plot dataax=dataset.plot(y=['00060','00065'],subplots=True,figsize=(10,8),xlabel='Time',title='Time Series Data at USGS Gage 03339000')ax[0].set_ylabel('Stream flow (ft3/s)')ax[1].set_ylabel('Gage height (ft)')Example 2: use BmiNwis class to download data (Demonstration of how to use BMI)importnumpyasnpimportcftimeimportpandasaspdfrombmi_nwisimportBmiNwis# initiate a data componentdata_comp=BmiNwis()data_comp.initialize('config_file.yaml')# get variable infoforvar_nameindata_comp.get_output_var_names():var_unit=data_comp.get_var_units(var_name)var_location=data_comp.get_var_location(var_name)var_type=data_comp.get_var_type(var_name)var_grid=data_comp.get_var_grid(var_name)var_itemsize=data_comp.get_var_itemsize(var_name)var_nbytes=data_comp.get_var_nbytes(var_name)print('variable_name:{}\nvar_unit:{}\nvar_location:{}\nvar_type:{}\nvar_grid:{}\nvar_itemsize:{}''\nvar_nbytes:{}\n'.format(var_name,var_unit,var_location,var_type,var_grid,var_itemsize,var_nbytes))# get time infostart_time=data_comp.get_start_time()end_time=data_comp.get_end_time()time_step=data_comp.get_time_step()time_unit=data_comp.get_time_units()time_steps=int((end_time-start_time)/time_step)+1print('start_time:{}\nend_time:{}\ntime_step:{}\ntime_unit:{}\ntime_steps:{}\n'.format(start_time,end_time,time_step,time_unit,time_steps))# get variable grid infogrid_type=data_comp.get_grid_type(var_grid)grid_rank=data_comp.get_grid_rank(var_grid)grid_node_count=data_comp.get_grid_node_count(var_grid)site_lon=np.empty(grid_node_count)data_comp.get_grid_x(var_grid,site_lon)site_lat=np.empty(grid_node_count)data_comp.get_grid_y(var_grid,site_lat)print('grid_type:{}\ngrid_rank:{}\ngrid_node_count:{}\nsite_lon:{}\nsite_lat:{}\n'.format(grid_type,grid_rank,grid_node_count,site_lon[0],site_lat[0]))# initiate dataframe to store datadataset=pd.DataFrame(columns=['00060','00065','time'])foriinrange(0,time_steps):# get stream flow datastream_flow=np.empty(1)data_comp.get_value('Stream flow',stream_flow)# get gage height datagage_height=np.empty(1)data_comp.get_value('Height',gage_height)# get time datacftime_value=data_comp.get_current_time()time=cftime.num2pydate(cftime_value,time_unit)# add new row to dataframedataset.loc[len(dataset)]=[stream_flow[0],gage_height[0],time]# update to next time stepdata_comp.update()# convert time to local timedataset=dataset.set_index('time').tz_localize(tz='UTC').tz_convert(tz='US/Central')# plot dataax=dataset.plot(y=['00060','00065'],subplots=True,figsize=(10,8),xlabel='Time',title='Time Series Data at USGS Gage 03339000')ax[0].set_ylabel('Stream flow (ft3/s)')ax[1].set_ylabel('Gage height (ft)')