Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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