Skip to content

Commit 45b08bc

Browse files
2 parents 1361336 + 113e3ea commit 45b08bc

2 files changed

Lines changed: 29 additions & 27 deletions

File tree

src/rachel_analysis_utils/enrich_df_sess.py

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

src/rachel_analysis_utils/nwb_utils.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ def save(self, plot_loc, df_sess = None):
143143
return session_folder
144144

145145
@classmethod
146-
def load(cls, session_folder):
146+
def load(cls, session_folder, load_fip = False):
147147
"""
148148
Load object from a saved session folder.
149149
"""
@@ -155,6 +155,8 @@ def load(cls, session_folder):
155155
obj.nwb_file_loc = None
156156

157157
for file in session_folder.glob("*.parquet"):
158+
if "df_fip" in file.name and load_fip == False:
159+
continue
158160
setattr(obj, file.stem, pd.read_parquet(file, engine="fastparquet"))
159161

160162
return obj
@@ -202,7 +204,7 @@ def save_nwb_list(nwb_list, plot_loc, df_sess=None):
202204
)
203205

204206

205-
def load_nwb_list(plot_loc):
207+
def load_nwb_list(plot_loc, add_fip = False):
206208
"""
207209
Load dummy_nwb objects from:
208210

0 commit comments

Comments
 (0)