66__all__ = [
77 'combine_ensemble_predictions' ,
88 'en_pred_to_pred_data' ,
9- 'melt_adjoint_to_sensitivity' ,
10- 'combine_ensemble_dataframes' ,
11- 'combine_adjoint_ensemble' ,
9+ 'merge_dataframes' ,
10+ 'multilevel_to_singlelevel_columns' ,
1211 'dataframe_to_series' ,
1312 'series_to_dataframe' ,
1413 'series_to_matrix' ,
15- 'dataframe_to_matrix' ,
16- 'multilevel_to_singlelevel_columns'
14+ 'dataframe_to_matrix'
1715]
1816
1917
@@ -140,42 +138,7 @@ def en_pred_to_pred_data(en_pred):
140138 return pred_data
141139
142140
143- def melt_adjoint_to_sensitivity (adjoint : pd .DataFrame , datatype : list , idX : dict ):
144-
145- adj_datatype = adjoint .columns .levels [0 ]
146- adj_params = adjoint .columns .levels [1 ]
147-
148- adj_datatype = sorted (adj_datatype , key = lambda x : datatype .index (x ))
149- adj_params = sorted (adj_params , key = lambda x : list (idX .keys ()).index (x ))
150-
151- sens = pd .DataFrame (columns = adj_datatype , index = adjoint .index )
152- for idx in sens .index :
153- for dkey in adj_datatype :
154- arr = np .array ([])
155- for param in adj_params :
156-
157- if not isinstance (adjoint .at [idx , (dkey , param )], np .ndarray ):
158- if np .isnan (adjoint .at [idx , (dkey , param )]):
159- dim = idX [param ]
160- dim = dim [1 ] - dim [0 ]
161- arr = np .append (arr , np .zeros (dim ))
162- else :
163- arr = np .append (arr , np .array ([adjoint .at [idx , (dkey , param )]]))
164-
165- else :
166- a = adjoint .at [idx , (dkey , param )]
167- a = np .where (np .isnan (a ), 0 , a )
168- arr = np .append (arr , a )
169-
170- sens .at [idx , dkey ] = arr
171-
172- # Melt
173- sens = sens .melt (ignore_index = False )
174- sens .rename (columns = {'variable' : 'datatype' , 'value' : 'adjoint' }, inplace = True )
175- return sens
176-
177-
178- def combine_ensemble_dataframes (en_dfs : list ):
141+ def merge_dataframes (en_dfs : list [pd .DataFrame ]) -> pd .DataFrame :
179142 '''
180143 Combine a list of DataFrames (one per ensemble member) into a single DataFrame
181144 where each cell contains an array of ensemble values.
@@ -193,32 +156,36 @@ def combine_ensemble_dataframes(en_dfs: list):
193156 values = []
194157 for dfn in en_dfs :
195158 values .append (dfn .at [idx , col ])
196- df .at [idx , col ] = np .array (values ).squeeze ()
197-
159+ df .at [idx , col ] = np .array (values ).squeeze ().T
198160 return df
199161
200- def combine_adjoint_ensemble (en_adj , datatype : list , idX : dict ):
201-
202- adjoints = [melt_adjoint_to_sensitivity (adj , datatype , idX ) for adj in en_adj ]
162+ def multilevel_to_singlelevel_columns (df : pd .DataFrame ) -> pd .DataFrame :
163+ """
164+ Convert a MultiIndex-column DataFrame with structure (key, param)
165+ into a DataFrame with one column per key, where the value is
166+ the concatenation of all param-arrays for that key.
167+ """
168+ result = {}
203169
204- index = adjoints [0 ].index
205- index_name = adjoints [0 ].index .name
206- keys = adjoints [0 ]['datatype' ].values
207- keys = sorted (keys , key = lambda x : datatype .index (x ))
170+ # Top-level keys (level 0 of MultiIndex), preserving first appearance order
171+ keys = pd .Index (df .columns .get_level_values (0 )).unique ()
208172
209- #df = pd.DataFrame(columns=['datatype', 'adjoint'], index=index, dtype=object)
173+ for key in keys :
174+ # Extract all columns for this key → list of arrays per row
175+ param_arrays = df [key ] # this is a sub-dataframe for this key
210176
211- data = {'datatype' : [], 'adjoint' : []}
212- for i , idx in enumerate (index ):
213- data ['datatype' ].append (keys [i ])
214- matrix = []
215- for adj in adjoints :
216- matrix .append (adj .iloc [i ]['adjoint' ])
217- data ['adjoint' ].append (np .array (matrix ).T ) # Transpose to get correct shape (n_param, n_ensembles)
177+ # For each row, concatenate arrays from all params
178+ concatenated = [
179+ np .concatenate (param_arrays .iloc [i ].values )
180+ for i in range (len (df ))
181+ ]
218182
219- df = pd .DataFrame (data , index = index )
220- df .index .name = index_name
221- return df
183+ result [key ] = concatenated
184+
185+ df_new = pd .DataFrame (result , index = df .index )
186+ df_new .index .name = df .index .name
187+ return df_new
188+
222189
223190def dataframe_to_series (df ):
224191 mult_index = []
@@ -250,16 +217,10 @@ def dataframe_to_matrix(df):
250217 series = dataframe_to_series (df )
251218 return series_to_matrix (series )
252219
253- def multilevel_to_singlelevel_columns (df ):
254- cols = df .columns .get_level_values (0 ).unique ()
255- parms = df .columns .get_level_values (1 ).unique ()
256-
257- df_new = pd .DataFrame (index = df .index )
258- for col in cols :
259- df_new [col ] = np .concatenate ([df [(col , param )].values for param in parms ])
260-
261- return df_new
262220
221+
222+
223+
263224
264225
265226
0 commit comments