def _find_sections_with_no_target(self): """Finds the intersections of the mains good sections with the gaps between target appliance activations. """ self.sections_with_no_target = {} seq_length_secs = self.seq_length * self.sample_period for fold, sects_per_building in self.mains_good_sections.items(): for building, good_sections in sects_per_building.items(): activations = ( self.activations[fold][self.target_appliance][building]) mains = self.mains[fold][building] mains_good_sections = self.mains_good_sections[fold][building] gaps_between_activations = TimeFrameGroup() prev_end = mains.index[0] for activation in activations: gap = TimeFrame(prev_end, activation.index[0]) gaps_between_activations.append(gap) prev_end = activation.index[-1] gap = TimeFrame(prev_end, mains.index[-1]) gaps_between_activations.append(gap) intersection = ( gaps_between_activations.intersection(mains_good_sections)) intersection = intersection.remove_shorter_than( seq_length_secs) self.sections_with_no_target.setdefault( fold, {})[building] = (intersection) logger.info( "Found {} sections without target for {} {}.".format( len(intersection), fold, building))
def _find_sections_with_no_target(self): """Finds the intersections of the mains good sections with the gaps between target appliance activations. """ self.sections_with_no_target = {} seq_length_secs = self.seq_length * self.sample_period for fold, sects_per_building in self.data_good_sections.items(): for building, good_sections in sects_per_building.items(): if building not in self.all_activations[fold][self.target_appliance]: continue activations = ( self.all_activations[fold][self.target_appliance][building]) data = self.data[fold][building] data_good_sections = good_sections gaps_between_activations = TimeFrameGroup() prev_end = data.index[0] for activation in activations: activation_start = activation.start if prev_end < activation_start: gap = TimeFrame(prev_end, activation_start) gaps_between_activations.append(gap) prev_end = activation.end data_end = data.index[-1] if prev_end < data_end: gap = TimeFrame(prev_end, data_end) gaps_between_activations.append(gap) intersection = ( gaps_between_activations.intersection(data_good_sections)) intersection = intersection.remove_shorter_than( seq_length_secs) self.sections_with_no_target.setdefault(fold, {})[building] = ( intersection) logger.info("Found {} sections without target for {} {}." .format(len(intersection), fold, building))
def _find_sections_with_no_target(self): """Finds the intersections of the mains good sections with the gaps between target appliance activations. """ self.sections_with_no_target = {} seq_length_secs = self.seq_length * self.sample_period for fold, sects_per_building in self.mains_good_sections.iteritems(): for building, good_sections in sects_per_building.iteritems(): activations = ( self.activations[fold][self.target_appliance][building]) mains = self.mains[fold][building] mains_good_sections = self.mains_good_sections[fold][building] gaps_between_activations = TimeFrameGroup() prev_end = mains.index[0] for activation in activations: gap = TimeFrame(prev_end, activation.index[0]) gaps_between_activations.append(gap) prev_end = activation.index[-1] gap = TimeFrame(prev_end, mains.index[-1]) gaps_between_activations.append(gap) intersection = ( gaps_between_activations.intersection(mains_good_sections)) intersection = intersection.remove_shorter_than( seq_length_secs) self.sections_with_no_target.setdefault(fold, {})[building] = ( intersection) logger.info("Found {} sections without target for {} {}." .format(len(intersection), fold, building))
def __init__(self, **config): if 'filename' not in config.keys(): self.dataSet = nilmtk.DataSet("ukdale.h5") else: self.dataSet = nilmtk.DataSet(config['fileName']) if 'startTime' not in config.keys() or 'endTime' not in config.keys(): self.dataSet.set_window("2012-11-01", "2015-01-31") else: self.dataSet.set_window(config['startTime'], config['endTime']) if 'trainBuildings' not in config.keys(): self.trainBuildings = [1, 3, 4, 5] else: self.trainBuildings = config['trainBuildings'] if 'testBuildings' not in config.keys(): self.testBuildings = [2] else: self.testBuildings = config['testBuildings'] if 'applications' not in config.keys(): raise KeyError("please input applications") self.applications = config['applications'] if 'targetapplication' not in config.keys(): raise KeyError("please input targetapplication") self.targetApplication = config['targetapplication'] if 'randSeed' not in config.keys(): randSeed = 0 else: randSeed = config['randSeed'] self.otherApplications = [ i for i in self.applications if i not in [self.targetApplication] ] self.allBuildings = set(self.trainBuildings + self.testBuildings) self.window = 599 self.inputSeqs = [] self.targetSeqs = [] self.rng = np.random.RandomState(randSeed) activationConfig = { 'fridge': { 'min_off_duration': 18, # 12 in paper here 'min_on_duration': 60, 'on_power_threshold': 50, 'sample_period': 6, }, 'kettle': { 'min_off_duration': 18, # 0 in paper here 'min_on_duration': 12, 'on_power_threshold': 2000, 'sample_period': 6, }, 'washing machine': { 'min_off_duration': 160, 'min_on_duration': 1800, 'on_power_threshold': 20, 'sample_period': 6, }, 'microwave': { 'min_off_duration': 30, 'min_on_duration': 12, 'on_power_threshold': 200, 'sample_period': 6, }, 'dish washer': { 'min_off_duration': 1800, 'min_on_duration': 1800, 'on_power_threshold': 10, 'sample_period': 6, } } self.elecMains = {} self.goodSections = {} for building in self.allBuildings: self.goodSections[building] = self.dataSet.buildings[ building].elec.mains().good_sections() self.elecMains[building] = self.dataSet.buildings[ building].elec.mains().power_series_all_data( sample_period=6, sections=self.goodSections[building]).dropna() self.numApp = {} self.elecApp = {} self.activationsApp = {} self.activationAppSections = {} for app in self.applications: self.elecApp[app] = {} self.activationsApp[app] = {} self.numApp[app] = 0 self.activationAppSections[app] = {} for building in self.allBuildings: try: self.elecApp[app][building] = self.dataSet.buildings[ building].elec[app].power_series_all_data( sample_period=6).dropna() self.activationsApp[app][ building] = self.dataSet.buildings[building].elec[ app].get_activations(**activationConfig[app]) self.activationsApp[app][building] = [ activation.astype(np.float32) for activation in self.activationsApp[app][building] ] self.numApp[app] += len(self.activationsApp[app][building]) self.activationAppSections[app][building] = TimeFrameGroup( ) for activation in self.activationsApp[app][building]: self.activationAppSections[app][building].append( TimeFrame(activation.index[0], activation.index[-1])) except KeyError as exception: logger.info( str(building) + " has no " + app + ". Full exception: {}".format(exception)) continue logger.info("Done loading NILMTK data.") for building in self.allBuildings: activationsToRemove = [] try: activations = self.activationsApp[ self.targetApplication][building] mains = self.elecMains[building] for i, activation in enumerate(activations): activationDuration = (activation.index[-1] - activation.index[0]) start = (activation.index[0] - activationDuration) end = (activation.index[-1] + activationDuration) if start < mains.index[0] or end > mains.index[-1]: activationsToRemove.append(i) else: mainsForAct = mains[start:end] if not self._hasSufficientSamples( start, end, mainsForAct): activationsToRemove.append(i) activationsToRemove.reverse() for i in activationsToRemove: activations.pop(i) self.activationsApp[ self.targetApplication][building] = activations except KeyError as exception: continue self.sectionsWithNoTarget = {} for building in self.allBuildings: try: activationsTarget = self.activationsApp[ self.targetApplication][building] mainGoodSections = self.goodSections[building] mains = self.elecMains[building] gapsBetweenActivations = TimeFrameGroup() prev = mains.index[0] for activation in activationsTarget: try: p2 = prev gapsBetweenActivations.append( TimeFrame(prev, activation.index[0])) prev = activation.index[-1] p1 = activation.index[0] except ValueError: logger.debug("----------------------") logger.debug(p1) logger.debug(p2) logger.debug(activation.index[0]) logger.debug(activation.index[-1]) gapsBetweenActivations.append(TimeFrame(prev, mains.index[-1])) intersection = gapsBetweenActivations.intersection( mainGoodSections) intersection = intersection.remove_shorter_than(6 * self.window) self.sectionsWithNoTarget[building] = intersection except KeyError: continue