Skip to content

Commit c50625a

Browse files
tommyodtommyod
authored andcommitted
Use dict instead of OrderedDict
1 parent 945c591 commit c50625a

2 files changed

Lines changed: 51 additions & 54 deletions

File tree

src/semeio/fmudesign/_excel2dict.py

Lines changed: 41 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
"""Module for reading excel file with input for generation of
2-
a design matrix and converting to an OrderedDict that can be
2+
a design matrix and converting to a dict that can be
33
read by semeio.fmudesign.DesignMatrix.generate
44
"""
55

6-
from collections import Counter, OrderedDict
6+
from collections import Counter
77
from collections.abc import Hashable, Mapping, Sequence
88
from pathlib import Path
99
from typing import Any, cast
@@ -20,7 +20,7 @@ def excel2dict_design(
2020
gen_input_sheet: str = "general_input",
2121
design_input_sheet: str = "designinput",
2222
default_val_sheet: str = "defaultvalues",
23-
) -> OrderedDict[str, Any]:
23+
) -> dict[str, Any]:
2424
"""Read excel file with input to design setup
2525
Currently only specification of
2626
onebyone design is implemented
@@ -32,7 +32,7 @@ def excel2dict_design(
3232
default_val_sheet (str): Sheet name for default input
3333
3434
Returns:
35-
OrderedDict on format for DesignMatrix.generate
35+
dict on format for DesignMatrix.generate
3636
"""
3737

3838
# Find sheets
@@ -74,7 +74,7 @@ def inputdict_to_yaml(inputdict: Mapping[str, Any], filename: str) -> None:
7474
"""Write inputdict to yaml format
7575
7676
Args:
77-
inputdict (OrderedDict)
77+
inputdict (dict)
7878
filename (str): path for where to write file
7979
"""
8080
with open(filename, "w", encoding="utf-8") as stream:
@@ -171,7 +171,7 @@ def _excel2dict_onebyone(
171171
gen_input_sheet: str,
172172
design_input_sheet: str,
173173
default_val_sheet: str,
174-
) -> OrderedDict[str, Any]:
174+
) -> dict[str, Any]:
175175
"""Reads specification for onebyone design
176176
177177
Args:
@@ -184,11 +184,11 @@ def _excel2dict_onebyone(
184184
and designinput.
185185
186186
Returns:
187-
OrderedDict on format for DesignMatrix.generate
187+
dict on format for DesignMatrix.generate
188188
"""
189189
input_filename = str(input_filename)
190190
seedname = "RMS_SEED"
191-
inputdict: OrderedDict[str, Any] = OrderedDict()
191+
inputdict: dict[str, Any] = {}
192192

193193
generalinput = pd.read_excel(
194194
input_filename, gen_input_sheet, header=None, index_col=0, engine="openpyxl"
@@ -223,7 +223,7 @@ def _excel2dict_onebyone(
223223

224224
if "background" in generalinput.index:
225225
background = str(generalinput.loc["background"].iloc[0])
226-
inputdict["background"] = OrderedDict()
226+
inputdict["background"] = {}
227227
if background.endswith(("csv", "xlsx")):
228228
inputdict["background"]["extern"] = resolve_path(input_filename, background)
229229
elif background == "None":
@@ -235,7 +235,7 @@ def _excel2dict_onebyone(
235235

236236
inputdict["defaultvalues"] = _read_defaultvalues(input_filename, default_val_sheet)
237237

238-
inputdict["sensitivities"] = OrderedDict()
238+
inputdict["sensitivities"] = {}
239239
designinput = pd.read_excel(input_filename, design_input_sheet, engine="openpyxl")
240240
designinput.dropna(axis=0, how="all", inplace=True)
241241
designinput = designinput.loc[
@@ -259,12 +259,10 @@ def _excel2dict_onebyone(
259259
mask = numeric_decimals.notna() & (numeric_decimals % 1 == 0)
260260

261261
valid_decimals = designinput[mask]
262-
inputdict["decimals"] = OrderedDict(
263-
{
264-
row.param_name: int(cast(float, row.decimals))
265-
for row in valid_decimals.itertuples()
266-
}
267-
)
262+
inputdict["decimals"] = {
263+
row.param_name: int(cast(float, row.decimals))
264+
for row in valid_decimals.itertuples()
265+
}
268266

269267
grouped = designinput.groupby("sensname", sort=False)
270268

@@ -275,7 +273,7 @@ def _excel2dict_onebyone(
275273
group,
276274
)
277275

278-
sensdict: OrderedDict[str, Any] = OrderedDict()
276+
sensdict: dict[str, Any] = {}
279277

280278
sens_type = group["type"].iloc[0]
281279
if sens_type in {"ref", "background"}:
@@ -318,11 +316,11 @@ def _excel2dict_onebyone(
318316
sensdict["numreal"] = int(group["numreal"].iloc[0])
319317

320318
# If this sensitivity has dependencies, then get them from sheet
321-
sensdict["dependencies"] = OrderedDict()
319+
sensdict["dependencies"] = {}
322320
if "dependencies" in group:
323321
# Get all dependencies in this sensitivity
324322
valid_deps = group[group["dependencies"].notna()]
325-
dependencies_dict = OrderedDict()
323+
dependencies_dict = {}
326324

327325
# For each dependency, get the mapping
328326
for row in valid_deps.itertuples():
@@ -339,7 +337,7 @@ def _excel2dict_onebyone(
339337
return inputdict
340338

341339

342-
def _read_defaultvalues(filename: str, sheetname: str) -> OrderedDict[str, Any]:
340+
def _read_defaultvalues(filename: str, sheetname: str) -> dict[str, Any]:
343341
"""Reads defaultvalues, also used as values for
344342
reference/base case
345343
@@ -348,7 +346,7 @@ def _read_defaultvalues(filename: str, sheetname: str) -> OrderedDict[str, Any]:
348346
sheetname (string): name of defaultsheet
349347
350348
Returns:
351-
OrderedDict with defaultvalues (parameter, value)
349+
dict with defaultvalues (parameter, value)
352350
"""
353351
default_df = pd.read_excel(
354352
filename, sheetname, header=0, index_col=0, engine="openpyxl"
@@ -360,7 +358,7 @@ def _read_defaultvalues(filename: str, sheetname: str) -> OrderedDict[str, Any]:
360358
]
361359

362360
if default_df.empty:
363-
return OrderedDict()
361+
return {}
364362

365363
# Strip leading/trailing spaces from parameter names such that
366364
# for example " PARAM" and "PARAM" are treated as duplicates.
@@ -374,12 +372,12 @@ def _read_defaultvalues(filename: str, sheetname: str) -> OrderedDict[str, Any]:
374372
f"Duplicate parameter names found in sheet '{sheetname}': "
375373
f"{', '.join(duplicate_names)}. All parameter names must be unique."
376374
)
377-
return OrderedDict(default_df.iloc[:, 0].to_dict())
375+
return dict(default_df.iloc[:, 0].to_dict())
378376

379377

380378
def _read_dependencies(
381379
*, filename: str, sheetname: str, from_parameter: str
382-
) -> OrderedDict[str, Any]:
380+
) -> dict[str, Any]:
383381
"""Reads parameters that are set from other parameters
384382
385383
Args:
@@ -388,10 +386,10 @@ def _read_dependencies(
388386
from_parameter (string): parameter name to map from
389387
390388
Returns:
391-
OrderedDict with design parameter, dependent parameters
389+
dict with design parameter, dependent parameters
392390
and values
393391
"""
394-
depend_dict: OrderedDict[str, Any] = OrderedDict()
392+
depend_dict: dict[str, Any] = {}
395393
depend_df = pd.read_excel(
396394
filename, sheetname, dtype=str, na_values="", engine="openpyxl"
397395
)
@@ -402,7 +400,7 @@ def _read_dependencies(
402400

403401
if from_parameter in depend_df:
404402
depend_dict["from_values"] = depend_df[from_parameter].tolist()
405-
depend_dict["to_params"] = OrderedDict()
403+
depend_dict["to_params"] = {}
406404
for key in depend_df:
407405
if key != from_parameter:
408406
depend_dict["to_params"][key] = depend_df[key].tolist()
@@ -415,18 +413,18 @@ def _read_dependencies(
415413
return depend_dict
416414

417415

418-
def _read_background(inp_filename: str, bck_sheet: str) -> OrderedDict[str, Any]:
416+
def _read_background(inp_filename: str, bck_sheet: str) -> dict[str, Any]:
419417
"""Reads excel sheet with background parameters and distributions
420418
421419
Args:
422420
inp_filename (path): path to Excel workbook
423421
bck_sheet (str): name of sheet with background parameters
424422
425423
Returns:
426-
OrderedDict with parameter names and distributions
424+
dict with parameter names and distributions
427425
"""
428-
backdict: OrderedDict[str, Any] = OrderedDict()
429-
paramdict: OrderedDict[str, Any] = OrderedDict()
426+
backdict: dict[str, Any] = {}
427+
paramdict: dict[str, Any] = {}
430428
bck_input = pd.read_excel(inp_filename, bck_sheet, engine="openpyxl")
431429
bck_input.dropna(axis=0, how="all", inplace=True)
432430
bck_input = bck_input.loc[
@@ -493,7 +491,7 @@ def _read_background(inp_filename: str, bck_sheet: str) -> OrderedDict[str, Any]
493491
backdict["parameters"] = paramdict
494492

495493
if "decimals" in bck_input:
496-
decimals: OrderedDict[str, Any] = OrderedDict()
494+
decimals: dict[str, Any] = {}
497495
for row in bck_input.itertuples():
498496
if _has_value(row.decimals) and _is_int(row.decimals): # type: ignore[arg-type]
499497
decimals[row.param_name] = int(row.decimals) # type: ignore[arg-type, index]
@@ -502,14 +500,14 @@ def _read_background(inp_filename: str, bck_sheet: str) -> OrderedDict[str, Any]
502500
return backdict
503501

504502

505-
def _read_scenario_sensitivity(sensgroup: pd.DataFrame) -> OrderedDict[str, Any]:
503+
def _read_scenario_sensitivity(sensgroup: pd.DataFrame) -> dict[str, Any]:
506504
"""Reads parameters and values
507505
for scenario sensitivities
508506
"""
509-
sdict: OrderedDict[str, Any] = OrderedDict()
510-
sdict["cases"] = OrderedDict()
511-
casedict1: OrderedDict[str, Any] = OrderedDict()
512-
casedict2: OrderedDict[str, Any] = OrderedDict()
507+
sdict: dict[str, Any] = {}
508+
sdict["cases"] = {}
509+
casedict1: dict[str, Any] = {}
510+
casedict2: dict[str, Any] = {}
513511

514512
if not _has_value(sensgroup["senscase1"].iloc[0]):
515513
raise ValueError(
@@ -563,12 +561,12 @@ def _read_scenario_sensitivity(sensgroup: pd.DataFrame) -> OrderedDict[str, Any]
563561
return sdict
564562

565563

566-
def _read_constants(sensgroup: pd.DataFrame) -> OrderedDict[str, Any]:
564+
def _read_constants(sensgroup: pd.DataFrame) -> dict[str, Any]:
567565
"""Reads constants to be used together with
568566
seed sensitivity"""
569567
if "dist_param1" not in sensgroup.columns.values:
570568
sensgroup["dist_param1"] = float("NaN")
571-
paramdict: OrderedDict[str, Any] = OrderedDict()
569+
paramdict: dict[str, Any] = {}
572570
for row in sensgroup.itertuples():
573571
if not _has_value(row.dist_param1):
574572
raise ValueError(
@@ -589,7 +587,7 @@ def _read_constants(sensgroup: pd.DataFrame) -> OrderedDict[str, Any]:
589587
return paramdict
590588

591589

592-
def _read_dist_sensitivity(sensgroup: pd.DataFrame) -> OrderedDict[str, Any]:
590+
def _read_dist_sensitivity(sensgroup: pd.DataFrame) -> dict[str, Any]:
593591
"""Reads parameters and distributions
594592
for monte carlo sensitivities
595593
"""
@@ -601,7 +599,7 @@ def _read_dist_sensitivity(sensgroup: pd.DataFrame) -> OrderedDict[str, Any]:
601599
sensgroup["dist_param3"] = float("NaN")
602600
if "dist_param4" not in sensgroup.columns.values:
603601
sensgroup["dist_param4"] = float("NaN")
604-
paramdict: OrderedDict[str, Any] = OrderedDict()
602+
paramdict: dict[str, Any] = {}
605603
for row in sensgroup.itertuples():
606604
if not _has_value(row.param_name):
607605
raise ValueError(
@@ -650,10 +648,10 @@ def _read_dist_sensitivity(sensgroup: pd.DataFrame) -> OrderedDict[str, Any]:
650648

651649
def _read_correlations(
652650
sensgroup: pd.DataFrame, inputfile: str
653-
) -> OrderedDict[str, Any] | None:
651+
) -> dict[str, Any] | None:
654652
if "corr_sheet" in sensgroup:
655653
if not sensgroup["corr_sheet"].dropna().empty:
656-
correlations: OrderedDict[str, Any] = OrderedDict()
654+
correlations: dict[str, Any] = {}
657655
correlations["inputfile"] = inputfile
658656
correlations["sheetnames"] = []
659657
for _index, row in sensgroup.iterrows():

src/semeio/fmudesign/create_design.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import contextlib
66
import os
7-
from collections import OrderedDict
87
from collections.abc import Hashable, Mapping, Sequence
98
from datetime import datetime
109
from pathlib import Path
@@ -186,7 +185,7 @@ class DesignMatrix:
186185
designvalues (pd.DataFrame): design matrix on standard fmu format
187186
contains columns 'REAL' (realization number), and if a onebyone
188187
design, also columns 'SENSNAME' and 'SENSCASE'
189-
defaultvalues (OrderedDict): default values for design
188+
defaultvalues (dict): default values for design
190189
backgroundvalues (pd.DataFrame): Used when background parameters are
191190
not constant. Either a set is sampled from specified distributions
192191
or they are read from a file.
@@ -204,7 +203,7 @@ def __init__(self, verbosity: int = 0, output_dir: Path | None = None) -> None:
204203
205204
"""
206205
self.designvalues: pd.DataFrame = pd.DataFrame(columns=["REAL"])
207-
self.defaultvalues: OrderedDict[Hashable, Any] = OrderedDict()
206+
self.defaultvalues: dict[Hashable, Any] = {}
208207
self.backgroundvalues: pd.DataFrame | None = None
209208
self.seedvalues: list[int] | None = None
210209
self.verbosity: int = verbosity
@@ -214,7 +213,7 @@ def reset(self) -> None:
214213
"""Resets DesignMatrix to empty. Necessary iin case method generate
215214
is used several times for same instance of DesignMatrix"""
216215
self.designvalues = pd.DataFrame(columns=["REAL"])
217-
self.defaultvalues = OrderedDict()
216+
self.defaultvalues = {}
218217
self.backgroundvalues = None
219218
self.seedvalues = None
220219

@@ -224,7 +223,7 @@ def generate(self, inputdict: Mapping[str, Any]) -> None:
224223
Looping through sensitivities and adding them to designvalues.
225224
226225
Args:
227-
inputdict (OrderedDict): input parameters for design
226+
inputdict (dict): input parameters for design
228227
"""
229228

230229
if inputdict["designtype"] != "onebyone":
@@ -478,7 +477,7 @@ def add_background(
478477
dictionary
479478
480479
Args:
481-
back_dict (OrderedDict): how to generate background values
480+
back_dict (dict): how to generate background values
482481
max_values (int): number of background values to generate
483482
rng (numpy.random.Generator): Random number generator instance
484483
"""
@@ -572,7 +571,7 @@ def _add_dist_background(
572571
specified in dictionary
573572
574573
Args:
575-
back_dict (OrderedDict): parameters and distributions
574+
back_dict (dict): parameters and distributions
576575
numreal (int): Number of samples to generate
577576
rng (numpy.random.Generator): Random number generator instance
578577
"""
@@ -669,7 +668,7 @@ def generate(
669668
realnums (list): list of integers with realization numbers
670669
seedname (str): name of seed parameter to add
671670
seedvalues (list): list of integer seedvalues
672-
parameters (OrderedDict): parameter names and
671+
parameters (dict): parameter names and
673672
distributions or values.
674673
"""
675674
assert isinstance(seedvalues, list), (
@@ -865,7 +864,7 @@ def generate(
865864
866865
Args:
867866
realnums (list): list of realizaton numbers for the case
868-
parameters (OrderedDict):
867+
parameters (dict):
869868
dictionary with parameter names and values
870869
seeds (str): default or None
871870
"""
@@ -935,9 +934,9 @@ def generate(
935934
936935
Args:
937936
realnums (range): range object containing realization numbers
938-
parameters (OrderedDict): dictionary of parameters and distributions
937+
parameters (dict): dictionary of parameters and distributions
939938
seeds (str): default or None
940-
corrdict (OrderedDict): Configuration for correlated parameters. Contains:
939+
corrdict (dict): Configuration for correlated parameters. Contains:
941940
- 'inputfile': Path to Excel file with correlation matrices
942941
- 'sheetnames': List of sheet names, where each sheet contains a correlation matrix
943942
If None, parameters are treated as uncorrelated.

0 commit comments

Comments
 (0)