@@ -69,27 +69,30 @@ def add_all_slopes_to_df_sess(df_sess, df_slope, slope_type,
6969 new_col_name = f'{ channel .split ("dff" )[0 ]} { slope_col_names [slope_col ]} ' )
7070 return df_sess_slope
7171
72- def enrich_df_sess_from_nwbs (nwb_list , df_sess , extractor_func , new_col_name ):
72+ def enrich_df_sess_from_nwbs (nwb_list , df_sess , extractor_dict : dict [ str , callable ] ):
7373 """
7474 Call extractor_func for each nwb in nwb_list and merge results into df_sess.
75- extractor_func may return:
76- - (session_date, value)
77- - dict {session_date: value}
78- - pandas.Series indexed by session_date
79- - scalar (in which case the function will try to obtain session_date from the nwb)
75+ extractor_func returns a scalar value.
8076 The merged column will be named new_col_name.
8177 Returns a new dataframe (does not modify inputs).
8278 """
8379 rows = []
8480 for nwb in nwb_list :
85- res = extractor_func (nwb )
81+ extracted_res = {}
82+ for new_col_name , extractor_func in extractor_dict .items ():
83+ res = extractor_func (nwb )
84+ extracted_res [new_col_name ] = res
85+
8686 session_date = nwb .session_id .split ('_' )[1 ]
87- rows .append ({'session_date' : str (session_date ) if session_date is not None else None , new_col_name : res })
87+ subject_id = nwb .session_id .split ('_' )[0 ]
88+ rows .append ({'session_date' : str (session_date ) if session_date is not None else None ,
89+ 'subject_id' : int (subject_id ) if subject_id is not None else None ,
90+ ** extracted_res })
8891
8992 df_new = pd .DataFrame (rows ).dropna (subset = ['session_date' ])
9093
9194 # align column name for merge
92- merged = df_sess .merge (df_new , on = ' session_date' , how = 'left' )
95+ merged = df_sess .merge (df_new , on = [ 'subject_id' , ' session_date'] , how = 'left' )
9396 return merged
9497
9598# a bunch of extractor functions
@@ -149,18 +152,18 @@ def enrich_df_sess_with_all_getters(nwb_list, df_sess):
149152
150153 This function does not modify the inputs; it returns an enriched copy.
151154 """
152- enrichments = [
153- ( 'max_side_bias' , get_max_side_bias ) ,
154- ( 'mean_side_bias' , get_mean_side_bias ) ,
155- ( 'baited_rate' , get_baited_rate ) ,
156- ( 'left_choice_rate' , get_left_choice_rate ) ,
157- ( 'ignore_choice_rate' , get_ignore_choice_rate ) ,
158- ( 'left_right_diff' , get_left_right_diff ) ,
159- ( 'left_right_abs_diff' , get_left_right_abs_diff ) ,
160- ]
155+ enrichments = {
156+ 'max_side_bias' : get_max_side_bias ,
157+ 'mean_side_bias' : get_mean_side_bias ,
158+ 'baited_rate' : get_baited_rate ,
159+ 'left_choice_rate' : get_left_choice_rate ,
160+ 'ignore_choice_rate' : get_ignore_choice_rate ,
161+ 'left_right_diff' : get_left_right_diff ,
162+ 'left_right_abs_diff' : get_left_right_abs_diff ,
163+ }
161164
162165 df_out = df_sess .copy ()
163- for col_name , extractor in enrichments :
164- df_out = enrich_df_sess_from_nwbs (nwb_list , df_out , extractor , col_name )
166+
167+ df_out = enrich_df_sess_from_nwbs (nwb_list , df_out , enrichments )
165168
166169 return df_out
0 commit comments