hspf 2.1.1__py3-none-any.whl → 2.1.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
hspf/uci.py CHANGED
@@ -221,7 +221,7 @@ class UCI():
221
221
  for line in self.lines:
222
222
  the_file.write(line+'\n')
223
223
 
224
- def add_parameter_template(self,block,table_name,table_id,parameter,tpl_char = '~'):
224
+ def add_parameter_template(self,block,table_name,table_id,parameter,tpl_char = '~',opnids = None,single_template = True, group_id = ''):
225
225
 
226
226
  table = self.table(block,table_name,0,False).reset_index()
227
227
  column_names,dtypes,starts,stops = self.uci[(block,table_name,table_id)]._delimiters()
@@ -229,20 +229,31 @@ class UCI():
229
229
  width = stops[column_names.index(parameter)] - starts[column_names.index(parameter)]
230
230
 
231
231
  ids = ~table[parameter].isna() # Handle comment lines in uci
232
+ parameter = parameter.lower()
233
+ if opnids is not None:
234
+ ids = ids & (table['OPNID'].isin(opnids))
232
235
 
233
236
  # Replace paramter name with PEST/PEST++ specification. Note this does not use the HSPF supplemental file so parameters are limited to width of uci file column
234
- pest_param = tpl_char + parameter.lower() + table.loc[ids,'OPNID'].astype(str)
235
- pest_param = pest_param.apply(lambda name: name + ' '*(width-len(name)-1)+ tpl_char)
237
+ if single_template:
238
+ pest_param = group_id + parameter
239
+ template = tpl_char + pest_param + ' '*(width-len(pest_param)-2)+ tpl_char
240
+ pest_param = [pest_param]
241
+ else:
242
+ pest_param = group_id + parameter + table.loc[ids,'OPNID'].astype(str)
243
+ pest_param = pest_param.tolist()
244
+ template = [tpl_char + pest_param + ' '*(width-len(pest_param)-2)+ tpl_char for pest_param in pest_param]
245
+ #template = pest_param.apply(lambda name: tpl_char + name + ' '*(width-len(name)-1)+ tpl_char)
236
246
 
237
- table.loc[ids,parameter] = pest_param
247
+ table.loc[ids,parameter.upper()] = template
238
248
  table = table.set_index('OPNID')
239
249
  self.replace_table(table,block,table_name,table_id)
250
+ return list(set(pest_param))
240
251
 
241
252
  def write_tpl(self,tpl_char = '~',new_tpl_path = None):
242
253
  if new_tpl_path is None:
243
254
  new_tpl_path = self.filepath.parent.joinpath(self.filepath.stem + '.tpl')
244
255
  self.merge_lines()
245
- self.lines.insert(0,tpl_char)
256
+ self.lines.insert(0,'ptf ' + tpl_char)
246
257
  self._write(new_tpl_path)
247
258
 
248
259
  def write(self,new_uci_path):
hspf/warehouse.py CHANGED
@@ -46,41 +46,48 @@ def create_hspf_model_hierarchy_tables(con: duckdb.DuckDBPyConnection):
46
46
  -- Level 1: The overall Model (e.g., for a specific basin)
47
47
  CREATE TABLE IF NOT EXISTS hspf.models (
48
48
  model_pk BIGINT PRIMARY KEY DEFAULT nextval('hspf.model_seq'),
49
- model_name VARCHAR NOT NULL UNIQUE, -- e.g., 'Nemadji River Basin Model'
50
- description VARCHAR
51
- );
52
-
53
- -- Level 2: A specific Version of a Model
54
- CREATE TABLE IF NOT EXISTS hspf.model_versions (
55
- model_version_pk BIGINT PRIMARY KEY DEFAULT nextval('hspf.model_version_seq'),
56
- model_pk BIGINT NOT NULL REFERENCES hspf.models(model_pk),
49
+ model_name VARCHAR NOT NULL, -- e.g., 'Nemadji River Basin Model'
57
50
  version_name VARCHAR NOT NULL, -- e.g., 'v2.1', '2025_Update'
58
- release_date DATE,
59
- description VARCHAR,
60
- UNIQUE (model_pk, version_name)
61
- );
62
-
63
- -- Level 3: A Scenario within a Model Version
64
- CREATE TABLE IF NOT EXISTS hspf.scenarios (
65
- scenario_pk BIGINT PRIMARY KEY DEFAULT nextval('hspf.scenario_seq'),
66
- model_version_pk BIGINT NOT NULL REFERENCES hspf.model_versions(model_version_pk),
67
- scenario_name VARCHAR NOT NULL, -- e.g., 'Baseline_2020', 'Future_Climate_BMPs'
68
- description VARCHAR,
69
- UNIQUE (model_version_pk, scenario_name)
70
- );
71
-
72
- -- Level 4: A single execution (Run) of a Scenario
73
- CREATE TABLE IF NOT EXISTS hspf.model_runs (
74
- model_run_pk BIGINT PRIMARY KEY DEFAULT nextval('hspf.model_run_seq'),
75
- scenario_pk BIGINT NOT NULL REFERENCES hspf.scenarios(scenario_pk),
76
- run_id BIGINT,
77
- run_name VARCHAR, -- e.g., 'Run_1995-2015', 'Calibration_Run_A'
78
- start_year INTEGER,
79
- end_year INTEGER,
80
- run_timestamp TIMESTAMP DEFAULT current_timestamp,
81
- notes VARCHAR
82
- );
83
- ''')
51
+ --last_extension DATE,
52
+ --last_update DATE,
53
+ --last_calibration DATE,
54
+ description VARCHAR
55
+ -- release_date DATE,
56
+ UNIQUE (model_name, version_name)
57
+ );
58
+ ''')
59
+
60
+ # -- Level 2: A specific Version of a Model
61
+ # CREATE TABLE IF NOT EXISTS hspf.model_versions (
62
+ # model_version_pk BIGINT PRIMARY KEY DEFAULT nextval('hspf.model_version_seq'),
63
+ # model_pk BIGINT NOT NULL REFERENCES hspf.models(model_pk),
64
+ # version_name VARCHAR NOT NULL, -- e.g., 'v2.1', '2025_Update'
65
+ # release_date DATE,
66
+ # description VARCHAR,
67
+ # UNIQUE (model_pk, version_name)
68
+ # );
69
+
70
+ # -- Level 3: A Scenario within a Model Version
71
+ # CREATE TABLE IF NOT EXISTS hspf.scenarios (
72
+ # scenario_pk BIGINT PRIMARY KEY DEFAULT nextval('hspf.scenario_seq'),
73
+ # model_version_pk BIGINT NOT NULL REFERENCES hspf.model_versions(model_version_pk),
74
+ # scenario_name VARCHAR NOT NULL, -- e.g., 'Baseline_2020', 'Future_Climate_BMPs'
75
+ # description VARCHAR,
76
+ # UNIQUE (model_version_pk, scenario_name)
77
+ # );
78
+
79
+ # -- Level 4: A single execution (Run) of a Scenario
80
+ # CREATE TABLE IF NOT EXISTS hspf.model_runs (
81
+ # model_run_pk BIGINT PRIMARY KEY DEFAULT nextval('hspf.model_run_seq'),
82
+ # scenario_pk BIGINT NOT NULL REFERENCES hspf.scenarios(scenario_pk),
83
+ # run_id BIGINT,
84
+ # run_name VARCHAR, -- e.g., 'Run_1995-2015', 'Calibration_Run_A'
85
+ # start_year INTEGER,
86
+ # end_year INTEGER,
87
+ # run_timestamp TIMESTAMP DEFAULT current_timestamp,
88
+ # notes VARCHAR
89
+ # );
90
+ # ''')
84
91
 
85
92
  def create_model_run_table(con: duckdb.DuckDBPyConnection):
86
93
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hspf
3
- Version: 2.1.1
3
+ Version: 2.1.3
4
4
  Summary: Python package for downloading and running HSPF models
5
5
  Project-URL: Homepage, https://github.com/mfratkin1/pyHSPF
6
6
  Author-email: Mulu Fratkin <michael.fratkin@state.mn.us>
@@ -1,20 +1,30 @@
1
1
  hspf/Masslink_Timeseries.csv,sha256=TOV6PpR0SBI0FaAU1T-qyD2DyGsBFjUWZenvWXiS3wA,4985
2
2
  hspf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- hspf/build_warehouse.py,sha256=J3fgycY9xkZdY3C9u0wDaEX1n6satr1t0mQmfg4Fh6E,20205
4
- hspf/hbn.py,sha256=xUvovcAXXLLLE_ID9kejjiyaAqnh-vwmDLdPLjsGQ8A,19401
3
+ hspf/build_warehouse.py,sha256=y91vNmdt918H5_jx9nxMUVmRG9ORdChYWEqQbbi3YKs,22861
4
+ hspf/hbn.py,sha256=-db1mC8m7MetQGQ8T_UZZW6KkbVwrVkKE4ub9Ji6i9M,24133
5
5
  hspf/hbn2.py,sha256=OmuTVDxd0Boyd3GvBgzEfqvP7CTeYIJYPC7EXPgYu30,13190
6
6
  hspf/hbn_cy.c,sha256=ZIJwWxyGx8fE5nM1HBd8-zNotmStGZscqXijl3KSRdI,593464
7
7
  hspf/hbn_cy.html,sha256=o8wMdvEE547DRXcUHFPgAkkyJ665b6rloGL-qKClaTo,137735
8
8
  hspf/hbn_cy.pyx,sha256=T-itpkvHlxHzQHKtJBS-M8_ToLBa1U_ajpV53hh_oI8,4323
9
- hspf/helpers.py,sha256=cd8J3XfCFmpER475Mk5aFL29612rgop75GRGxlofXQo,3242
10
- hspf/hspfModel.py,sha256=K_xF7HtuMpDMod56Z3IXDCeGsnUi8KGhly_9tm-mxoY,9070
11
- hspf/reports.py,sha256=bU9rU9qaffXosxyA3H5OWi4SqQVPiQh6709tTCMYeeU,46286
12
- hspf/uci.py,sha256=rsi_KJqdfBFp0rlKCHyhmQGdB_rgNE8k6abTjH26UqE,33982
9
+ hspf/helpers.py,sha256=Jv5lSUKVqML8iJOFfBPcA3bgHn9MbFZC4OO-9YHHP_w,3277
10
+ hspf/hspfModel.py,sha256=Dpf0VHWAdQ7N932u6aYzXDzZCPrJbObW38tP0WRkG0E,10682
11
+ hspf/reports.py,sha256=cDhjMFrUAzU7zzoX4VPyCJvgVLObtApEWTkK1vFsKfQ,57304
12
+ hspf/uci.py,sha256=mi5lkt2bZlO0Lq4S7j3uZsLpHhS6dtdOIaO2Vi0ZNn8,34607
13
13
  hspf/validations.py,sha256=BcNT0h5QDZW9lHpXk8KuHQvycl8a_4jQ91srwWFodRo,6666
14
- hspf/warehouse.py,sha256=1zm1uu_QvevIuAMNPOkzspnFhNpLQrvkq3x3HXSypGg,11898
14
+ hspf/warehouse.py,sha256=12Scro1a_hK5IvE9FENAMQv9jKWgtMYtAftJZ4p3nTQ,12239
15
15
  hspf/wdm.py,sha256=q0hNqsMNrTkxHtKEX0q0wWlIZabXv6UX2HjNCF9WEW4,12734
16
16
  hspf/wdmReader.py,sha256=-akKWB9SpUzXvXoQMeHLZNi_u584KaeEOyHB-YolTWM,22848
17
+ hspf/bin/WinHSPFLt/ATCoRend.dbf,sha256=3bHSDSpL__z1syz6nXlhPrPLnmcsaKDSG1xaiESHwpQ,17743
18
+ hspf/bin/WinHSPFLt/ATCoUnits.mdb,sha256=vJMovhTfyY_2hzzeqLdh-UjId1GV_pVPfesp29J2N18,114688
19
+ hspf/bin/WinHSPFLt/ERROR.FIL,sha256=XKxOp21R0aCEd-ofy3UEQ91XH0V8cxgiURp4Z7J8E6M,1523002
20
+ hspf/bin/WinHSPFLt/LF90.EER,sha256=VpQ92SHdRvIm-OxGMKawKn56ij3-6owFXsYHoZN9mVM,41040
21
+ hspf/bin/WinHSPFLt/LF90WIOD.DLL,sha256=loIi_u234J-fbXq_s_ajMEjalyX3cdnFFtsH6Hm48C4,90112
22
+ hspf/bin/WinHSPFLt/MapWinUtility.dll,sha256=oEcJfvQS7zIGHg5HcRHFv105pySy_V1g2LHwC3zy29o,83456
23
+ hspf/bin/WinHSPFLt/StatusMonitor.exe,sha256=euLR4tKiMYoc7by6Rmem4CAk41Jjecsy4sgUOrRZHFA,39424
17
24
  hspf/bin/WinHSPFLt/WinHspfLt.exe,sha256=Afs_nJ62r1VnTL2P4XfiRJ1sH2If5DeGTbcCzoqlanE,74752
25
+ hspf/bin/WinHSPFLt/hass_ent.dll,sha256=jvm_xLGSci4Sm1VSIVy8dS2-wgNn1dqkcth3vkm9IG0,4904448
26
+ hspf/bin/WinHSPFLt/hspfmsg.wdm,sha256=cfUDyfYKX7Lsrlnu9kDylQNhD1X5lFWVqmLyXMLD5m0,1392640
27
+ hspf/bin/WinHSPFLt/hspfmsg.wdu,sha256=Zl04zGkVN_1ifjsHmDyHFYUC3q6bojWm-vzXoXgJOv0,63
18
28
  hspf/data/HSPFParameterRanges.csv,sha256=PKz1DRIgpsgTEDrVaSHB9SAGMa5yUBRpyZDc9-CKJJo,28357
19
29
  hspf/data/LandUseNames_Mappings.csv,sha256=Bb2toZn6FkPfZ6_8SnzIQvXJ03ycwCuc8uyv4cUowNY,75899
20
30
  hspf/data/ParseTable.csv,sha256=ExqUaZg_uUPF5XHGLJEk5_jadnDenKjbwqC4d-iNX_M,193609
@@ -38,8 +48,8 @@ hspf/data/Timeseries Catalog/RCHRES/OXRX.txt,sha256=NWdRFpJ60LsYzCGHjt8Llay3OI8j
38
48
  hspf/data/Timeseries Catalog/RCHRES/PLANK.txt,sha256=0MAehIrF8leYQt0Po-9h6IiujzoWOlw-ADCV-bPiqs0,3508
39
49
  hspf/data/Timeseries Catalog/RCHRES/SEDTRN.txt,sha256=SiTgD4_YWctTgEfhoMymZfv8ay74xzCRdnI005dXjyE,659
40
50
  hspf/parser/__init__.py,sha256=2HvprGVCaJ9L-egvTj1MI-bekq5CNjtSBZfrCtQi3fs,92
41
- hspf/parser/graph.py,sha256=jvkjz9eNtBFEmxUeQosuQE7XgsIRlrNH-rSny5KBDoE,33046
51
+ hspf/parser/graph.py,sha256=un5B7PiiaG9aWQHFeD1gHZtlWIIUnx4GG_-IER-4SmU,33119
42
52
  hspf/parser/parsers.py,sha256=x3othxQogUmGNe_ctCU20atDrRM_B4lEbVJb3EMbwto,20850
43
- hspf-2.1.1.dist-info/METADATA,sha256=KtAPnc8v-bT8ow30iHdN1lCm2asH22rvOyKgDGS_kL0,605
44
- hspf-2.1.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
45
- hspf-2.1.1.dist-info/RECORD,,
53
+ hspf-2.1.3.dist-info/METADATA,sha256=U-tcOOkBzPIgs2oMbnSdXznyT4oTU2lxvnneVSC5vvk,605
54
+ hspf-2.1.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
55
+ hspf-2.1.3.dist-info/RECORD,,
File without changes