@@ -28,14 +28,11 @@ def add_slope_to_df_sess(df_sess, df_slope, slope_col_name, channel_name,
2828 df_slope = df_slope .rename (columns = {'date' : session_date_col })
2929 # filter slope table to the requested channel and keep only date + slope column
3030 slope_filtered = (df_slope
31- .loc [df_slope [channel_col ] == channel_name , [session_date_col , slope_col_name ]]
31+ .loc [df_slope [channel_col ] == channel_name , [session_date_col , 'subject_id' , slope_col_name ]]
3232 .copy ())
3333
34- # if there are duplicate session_date rows for the same channel take the mean (simple resolution)
35- slope_filtered = slope_filtered .groupby (session_date_col , as_index = False ).mean ()
36-
3734 # merge into sessions on session date
38- merged = df_sess .merge (slope_filtered , on = session_date_col , how = 'left' )
35+ merged = df_sess .merge (slope_filtered , on = [ session_date_col , 'subject_id' ] , how = 'left' )
3936
4037 # if original slope column name collides with other columns, rename to new_col_name
4138 if slope_col_name != new_col_name and slope_col_name in merged .columns :
@@ -69,27 +66,30 @@ def add_all_slopes_to_df_sess(df_sess, df_slope, slope_type,
6966 new_col_name = f'{ channel .split ("dff" )[0 ]} { slope_col_names [slope_col ]} ' )
7067 return df_sess_slope
7168
72- def enrich_df_sess_from_nwbs (nwb_list , df_sess , extractor_func , new_col_name ):
69+ def enrich_df_sess_from_nwbs (nwb_list , df_sess , extractor_dict : dict [ str , callable ] ):
7370 """
7471 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)
72+ extractor_func returns a scalar value.
8073 The merged column will be named new_col_name.
8174 Returns a new dataframe (does not modify inputs).
8275 """
8376 rows = []
8477 for nwb in nwb_list :
85- res = extractor_func (nwb )
78+ extracted_res = {}
79+ for new_col_name , extractor_func in extractor_dict .items ():
80+ res = extractor_func (nwb )
81+ extracted_res [new_col_name ] = res
82+
8683 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 })
84+ subject_id = nwb .session_id .split ('_' )[0 ]
85+ rows .append ({'session_date' : str (session_date ) if session_date is not None else None ,
86+ 'subject_id' : int (subject_id ) if subject_id is not None else None ,
87+ ** extracted_res })
8888
8989 df_new = pd .DataFrame (rows ).dropna (subset = ['session_date' ])
9090
9191 # align column name for merge
92- merged = df_sess .merge (df_new , on = ' session_date' , how = 'left' )
92+ merged = df_sess .merge (df_new , on = [ 'subject_id' , ' session_date'] , how = 'left' )
9393 return merged
9494
9595# a bunch of extractor functions
@@ -149,18 +149,18 @@ def enrich_df_sess_with_all_getters(nwb_list, df_sess):
149149
150150 This function does not modify the inputs; it returns an enriched copy.
151151 """
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- ]
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+ }
161161
162162 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 )
163+
164+ df_out = enrich_df_sess_from_nwbs (nwb_list , df_out , enrichments )
165165
166166 return df_out
0 commit comments