def sleep_ranges(day): # FIXME: if DatetimeIndex gets vectorized strftime, use it day = util.contiguous_apply( day, day['awake'], lambda v, blk: pd.DataFrame({'t': [blk.index[0].strftime(util.dtfmt)], 'awake': [v]}, index=blk.index[[0]])) return '[%s]' % '; '.join( map('...'.join, zip(day.ix[~day['awake'].astype(bool),'t'], day.ix[~day['awake'].shift().astype(bool),'t'])))
soj = util.SojournsData.from_file(soj_path, awake_ranges) # XXX HACK if 'steps' not in soj.raw_data.columns: ag = util.ActiGraphDataTable.from_file(ag_path, awake_ranges) soj.raw_data['steps'] = ag.raw_data['Steps'] soj.process() # FIXME integrate this better if args.soj_intermediate_path: soj.data.iloc[:-1].to_csv(str(args.soj_intermediate_path)) util.contiguous_apply( soj.data, soj.data['awake'], lambda val, block: pd.DataFrame( {'counts': block['counts'].sum(), 'Dur': block['Dur'].sum(), 'METs': (block['Dur'] / block['Dur'].sum() * block['METs']).sum(), 'ActivityLevel': ','.join(block['ActivityLevel'].dropna() .unique())}, index=[block.index[0]]) if val and not np.isnan(val) else pd.DataFrame( {'counts': [], 'Dur': [], 'METs': [], 'ActivityLevel':[]} )).to_csv( str(args.soj_intermediate_path.with_name( args.soj_intermediate_path.name.replace( args.soj_intermediate_path.suffix, '_squashed'+args.soj_intermediate_path.suffix)))) if awake_path and not awake_path.exists(): soj.awake_ranges.to_file(awake_path) summary = ActivitySummary.from_sojourns(soj, subj) outpath = soj_path.with_name(soj_path.stem + '_processed.csv') summary.to_file(outpath)