def generate_traces(self, device, instance_id, date): ''' Returns trace: series: indexed by time with column name 'time', series is series of average power value ''' filename = self.path + device + '/dev_' + instance_id + '_' + date + '.csv' df = pd.read_csv(filename,sep=';',\ header=None,names=['time','1s_W','8s_W']) df['time'] = pd.to_datetime(df['time'], format='%d/%m/%Y %H:%M:%S') df.set_index('time', inplace=True) try: series = df['1s_W'].resample(self.sample_rate, how='mean') series = series.map(decimal.Decimal) / decimal.Decimal(1000.0) series.name = device except ValueError: raise SampleError(self.sample_rate) series_mult = self.split_on_NANs(series) return [ app.ApplianceTrace( single_series, { 'source': self.source, 'device_name': device, 'instance_name': instance_id, 'date': date, 'trace_num': i }) for i, single_series in enumerate(series_mult) ]
def get_trace_in_time_of_day(device_trace,start_time,end_time): ''' Given a trace and a start and end datetime.time, it returns a trace within that time period. ''' print "WARNING: deprecated, "\ "use trace.get_time_of_day(start_time,end_time) instead" new_series=device_trace.series.ix[start_time:end_time] return appliance.ApplianceTrace(new_series,device_trace.metadata)
def aggregate_traces(traces, metadata, how="strict"): ''' Given a list of temporally aligned traces, aggregate them into a single signal. ''' if how == "strict": if not traces_aligned(traces): raise appliance.AlignmentError summed_series = traces[0].series for trace in traces[1:]: summed_series += trace.series return appliance.ApplianceTrace(summed_series, metadata) else: return NotImplementedError
def resample_trace(trace,sample_rate): ''' Takes a trace and resamples it to a given sample rate, defined by the offset aliases described in panda time series. http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases ''' print "WARNING: deprecated, "\ "use appliance_trace.resample(sample_rate) instead" try: new_series=trace.series.astype(float) new_series=new_series.resample(sample_rate,how='mean') new_series=new_series.map(decimal.Decimal) new_series.name=trace.series.name return appliance.ApplianceTrace(new_series,trace.metadata) except ValueError: raise SampleError(self.sample_rate)
def concatenate_traces(traces, metadata=None, how="strict"): ''' Given a list of appliance traces, returns a single concatenated trace. With how="strict" option, must be sampled at the same rate and consecutive, without overlapping datapoints. ''' if not metadata: metadata = traces[0].metadata if how == "strict": # require ordered list of consecutive, similarly sampled traces with no # missing data. return appliance.ApplianceTrace(pd.concat([t.series for t in traces]), metadata) else: raise NotImplementedError
def split_trace_into_rate(trace,rate): ''' Given a single trace, a list of traces are returned that are each from a unique date. ''' print "WARNING: deprecated, "\ "use appliance trace.split_into_rate(rate) instead" # set rate to group by if rate == 'D' or rate == '1D': groupby_rate = trace.series.index.date elif rate == 'W' or rate == '1W': groupby_rate = trace.series.index.week else: raise NotImplementedError('Looking for "week" or "day"') traces=[] for i, group in enumerate(trace.series.groupby(groupby_rate)): metadata = dict.copy(trace.metadata) metadata['trace_num'] = i traces.append(appliance.ApplianceTrace(group[1],metadata)) return traces