Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,13 @@ dependencies = [
"resfo-utilities>=0.5.0",
"natsort>=8.4.0",
"shapely>=2.1.2",
"probabilit>=0.4.2",
"openpyxl>=3.1.5",
]

[project.scripts]
ert = "ert.__main__:main"
fmudesign = "ert.config.fmudesign.fmudesignrunner:main"
"fm_dispatch.py" = "_ert.forward_model_runner.fm_dispatch:main"
everest = "everest.bin.main:start_everest"
everserver = "everest.detached.everserver:main"
Expand Down
10 changes: 10 additions & 0 deletions src/ert/config/fmudesign/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from ._designsummary import summarize_design
from ._excel_to_dict import excel_to_dict, inputdict_to_yaml
from .create_design import DesignMatrix

__all__ = [
"DesignMatrix",
"excel_to_dict",
"inputdict_to_yaml",
"summarize_design",
]
116 changes: 116 additions & 0 deletions src/ert/config/fmudesign/_designsummary.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
"""Module for summarizing design set up for one by one sensitivities"""

import pandas as pd


def _get_sensitivity_type(senscase: str) -> str:
"""Determine sensitivity type based on the case name"""
sensitivity_types = {"p10_p90": "mc", "ref": "ref"}
return sensitivity_types.get(senscase.lower(), "scalar")


def summarize_design(filename: str, sheetname: str = "DesignSheet01") -> pd.DataFrame:
"""
Summarizes the design set up for one by one sensitivities
specified in a design matrix on standard fmu format.

Args:
filename (str): Name of excel or csv file containing designmatrix
for one by one sensitivities on standard FMU format.
sheetname (str): Name of sheet in excel workbook which
contains the designmatrix (only for excel input). Defaults to
'DesignSheet01'.

Returns:
pd.DataFrame: Summary of sensitivities,
corresponding realisation numbers,
senstype('mc' or 'scalar')
and senscase (name of high and low cases).
Each row represents one sensitivity
with 1-2 cases (low/high).
Column names are ['sensno', 'sensname',
'senstype', 'casename1', 'startreal1', 'endreal1',
'casename2', 'startreal2', 'endreal2']

Example:
>> from semeio.fmudesign import summarize_design
>> designname = 'design_filename.xlsx'
>> designsheet = 'DesignSheet01'
>> designtable = summarize_design(designname, designsheet)

"""

# Read design matrix
if str(filename).endswith(".xlsx"):
# Drop empty rows or columns that have been read in
# due to having background colour/formatting
dgn = (
pd.read_excel(filename, sheetname, engine="openpyxl")
.dropna(axis=0, how="all")
.loc[:, lambda df: ~df.columns.str.contains("^Unnamed")]
)
elif str(filename).endswith(".csv"):
dgn = pd.read_csv(filename)
else:
raise ValueError(
"Design matrix must be on Excel or csv format"
" and filename must end with .xlsx or .csv"
)

# Initialize results DataFrame with same columns
designsummary = pd.DataFrame(
columns=[
"sensno",
"sensname",
"senstype",
"casename1",
"startreal1",
"endreal1",
"casename2",
"startreal2",
"endreal2",
]
)

# Get unique sensitivity names in order of appearance
sensnames = dgn["SENSNAME"].unique()

for sensno, sensname in enumerate(sensnames):
sens_group = dgn[dgn["SENSNAME"] == sensname].copy()
# Get cases in order of appearance
cases = (
sens_group.drop_duplicates("SENSCASE")[["SENSCASE"]].to_numpy().flatten()
)

# First case
case1_data = sens_group[sens_group["SENSCASE"] == cases[0]]
casename1 = cases[0]
startreal1 = case1_data["REAL"].min()
endreal1 = case1_data["REAL"].max()

# Handle second case if it exists
if len(cases) > 1:
case2_data = sens_group[sens_group["SENSCASE"] == cases[1]]
casename2 = cases[1]
startreal2 = case2_data["REAL"].min()
endreal2 = case2_data["REAL"].max()
else:
casename2 = None
startreal2 = None
endreal2 = None

senstype = _get_sensitivity_type(cases[0])
# Add row to results
designsummary.loc[sensno] = [
sensno,
sensname,
senstype,
casename1,
startreal1,
endreal1,
casename2,
startreal2,
endreal2,
]

return designsummary
Loading
Loading