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))
Exemple #2
0
 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))
Exemple #4
0
    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