def energy_per_dataframe(electricity, sample_period_multiplier=20, unit="kwh"): """pre-processes electricity and then gets total energy per channel, after masking out all gaps in mains. Returns ------- mains_total_energy, totals_per_appliance total_mains_energy : float totals_per_appliance : pd.Series each key is an ApplianceName each value is total energy """ # TODO: this might be an ugly hack to resolve circular dependencies. from nilmtk.preprocessing.electricity.building import mask_appliances_with_mains from nilmtk.preprocessing.electricity.single import insert_zeros # remove 'unmetered' and 'subpanels' from appliances electricity.appliances = electricity.remove_channels_from_appliances() # Sum split mains and DualSupply appliances electricity = electricity.sum_split_supplies() # TODO: Select common measurements. Maybe use electricity.select_common_measurements? # MEASUREMENT_PREFERENCES = [Measurement('power', 'active'), # Measurement('power', 'apparent')] # # Check if all channels share at least one Measurement (e.g. ('power', 'active')) # common_measurements = find_common_measurements(electricity) # common_measurement = None # for measurement_preference in MEASUREMENT_PREFERENCES: # if measurement_preference in common_measurements: # common_measurement = measurement_preference # print("Using common_measurement:", common_measurement) # break # if common_measurements is None and require_common_measurements: # raise NoCommonMeasurementError # Find large gaps in mains data and ignore those gaps for all appliance channels electricity = mask_appliances_with_mains(electricity, sample_period_multiplier) # Drop NaNs on all channels electricity = apply_func_to_values_of_dicts(electricity, lambda df: df.dropna(), ["appliances", "mains"]) # Insert_zeros on appliance data. print("Inserting zeros... may take a little while...", end="") sys.stdout.flush() single_insert_zeros = lambda df: insert_zeros(df, sample_period_multiplier=sample_period_multiplier) electricity = apply_func_to_values_of_dicts(electricity, single_insert_zeros, ["appliances", "mains"]) print("done inserting zeros") # Total energy used for mains total_mains_energy = get_total_energy_per_dict(electricity, "mains", unit) totals_per_appliance = {} for name, df in electricity.appliances.iteritems(): totals_per_appliance[name] = single.energy(df, unit=unit) return total_mains_energy, pd.Series(totals_per_appliance)
def get_total_energy_per_dict(electricity, dict_="mains", unit="kwh"): total_energy = 0.0 for df in electricity.__dict__[dict_].values(): energy_for_df = single.energy(df, unit) total_energy += energy_for_df return total_energy