12
12
13
13
import numpy as np
14
14
import pandas as pd
15
- import polars as pl
16
15
17
16
if TYPE_CHECKING :
18
17
from ert .storage import Ensemble
@@ -83,83 +82,51 @@ def is_empty(self) -> bool:
83
82
@staticmethod
84
83
def _get_data (
85
84
ensemble : Ensemble ,
86
- observation_keys : list [str ],
85
+ observed_response_keys : list [str ],
87
86
) -> pd .DataFrame :
88
87
"""
89
88
Adds simulated and observed data and returns a dataframe where ensemble
90
89
members will have a data key, observed data will be named OBS and
91
90
observed standard deviation will be named STD.
92
91
"""
93
92
94
- observations_by_type = ensemble .experiment .observations
93
+ resp_key_to_resp_type = ensemble .experiment .response_key_to_response_type
94
+ selected_response_types = {
95
+ response_type
96
+ for response_key , response_type in resp_key_to_resp_type .items ()
97
+ if response_key in observed_response_keys
98
+ }
95
99
96
- dfs = []
100
+ active_realizations = ensemble . get_realization_list_with_responses ()
97
101
98
- for key in observation_keys :
99
- if key not in ensemble .experiment .observation_keys :
100
- raise ObservationError (
101
- f"No observation: { key } in ensemble: { ensemble .name } "
102
- )
103
-
104
- for (
105
- response_type ,
106
- response_cls ,
107
- ) in ensemble .experiment .response_configuration .items ():
108
- observations_for_type = observations_by_type [response_type ].filter (
109
- pl .col ("observation_key" ).is_in (observation_keys )
110
- )
111
- responses_for_type = ensemble .load_responses (
112
- response_type ,
113
- realizations = tuple (ensemble .get_realization_list_with_responses ()),
114
- )
115
-
116
- if responses_for_type .is_empty ():
102
+ # Check if responses exist for all selected response types
103
+ for response_type in selected_response_types :
104
+ df = ensemble .load_responses (response_type , tuple (active_realizations ))
105
+ if df .is_empty ():
117
106
raise ResponseError (
118
107
f"No response loaded for observation type: { response_type } "
119
108
)
120
109
121
- # Note that if there are duplicate entries for one
122
- # response at one index, they are aggregated together
123
- # with "mean" by default
124
- pivoted = responses_for_type .pivot (
125
- on = "realization" ,
126
- index = ["response_key" , * response_cls .primary_key ],
127
- aggregate_function = "mean" ,
110
+ df = (
111
+ ensemble .get_observations_and_responses (
112
+ observed_response_keys , np .array (active_realizations )
128
113
)
129
-
130
- if "time" in pivoted :
131
- joined = observations_for_type .join_asof (
132
- pivoted ,
133
- by = ["response_key" , * response_cls .primary_key ],
134
- on = "time" ,
135
- tolerance = "1s" ,
136
- )
137
- else :
138
- joined = observations_for_type .join (
139
- pivoted ,
140
- how = "left" ,
141
- on = ["response_key" , * response_cls .primary_key ],
142
- )
143
-
144
- joined = joined .sort (by = "observation_key" ).with_columns (
145
- pl .concat_str (response_cls .primary_key , separator = ", " ).alias (
146
- "key_index"
147
- )
114
+ .rename (
115
+ {
116
+ "index" : "key_index" ,
117
+ "observations" : "OBS" ,
118
+ "std" : "STD" ,
119
+ }
148
120
)
149
-
150
- # Put key_index column 1st
151
- joined = joined [["key_index" , * joined .columns [:- 1 ]]]
152
- joined = joined .drop (* response_cls .primary_key )
153
-
154
- if not joined .is_empty ():
155
- dfs .append (joined )
156
-
157
- df = pl .concat (dfs )
158
- df = df .rename (
159
- {
160
- "observations" : "OBS" ,
161
- "std" : "STD" ,
162
- }
121
+ .select (
122
+ "key_index" ,
123
+ "response_key" ,
124
+ "observation_key" ,
125
+ "OBS" ,
126
+ "STD" ,
127
+ * map (str , active_realizations ),
128
+ )
129
+ .sort (by = "observation_key" )
163
130
)
164
131
165
132
pddf = df .to_pandas ()[
@@ -175,7 +142,7 @@ def _get_data(
175
142
# Pandas differentiates vs int and str keys.
176
143
# Legacy-wise we use int keys for realizations
177
144
pddf .rename (
178
- columns = {str (k ): int (k ) for k in range ( ensemble . ensemble_size ) },
145
+ columns = {str (k ): int (k ) for k in active_realizations },
179
146
inplace = True ,
180
147
)
181
148
0 commit comments