Example #1
0
def test_load_sample_hourly():
    meter_data, temperature_data, metadata = load_sample(
        "il-electricity-cdd-hdd-hourly"
    )

    assert meter_data.shape == (19417, 1)
    assert meter_data.index.freq == "H"
    assert temperature_data.shape == (19417,)
    assert temperature_data.index.freq == "H"
    assert metadata == {
        "annual_baseline_base_load": 2000.0,
        "annual_baseline_cooling_load": 4000.0,
        "annual_baseline_heating_load": 4000.0,
        "annual_baseline_total_load": 10000,
        "annual_reporting_base_load": 1800.0,
        "annual_reporting_cooling_load": 3600.0,
        "annual_reporting_heating_load": 3600.0,
        "annual_reporting_total_load": 9000.0,
        "baseline_cooling_balance_point": 65,
        "baseline_heating_balance_point": 60,
        "blackout_end_date": datetime.datetime(2017, 1, 4, 0, 0, tzinfo=pytz.UTC),
        "blackout_start_date": datetime.datetime(2016, 12, 26, 0, 0, tzinfo=pytz.UTC),
        "freq": "hourly",
        "id": "il-electricity-cdd-hdd-hourly",
        "interpretation": "electricity",
        "meter_data_filename": "il-electricity-cdd-hdd-hourly.csv.gz",
        "reporting_cooling_balance_point": 65,
        "reporting_heating_balance_point": 60,
        "temperature_filename": "il-tempF.csv.gz",
        "unit": "kWh",
        "usaf_id": "724390",
    }
Example #2
0
def test_load_sample_daily():
    meter_data, temperature_data, metadata = load_sample("il-electricity-cdd-hdd-daily")

    assert meter_data.shape == (810, 1)
    assert meter_data.index.freq == "D"
    assert temperature_data.shape == (19417,)
    assert temperature_data.index.freq == "H"
    assert metadata is not None
Example #3
0
def _from_sample(sample):
    meter_data, temperature_data, metadata = load_sample(sample)
    return {
        "meter_data": meter_data,
        "temperature_data": temperature_data,
        "blackout_start_date": metadata["blackout_start_date"],
        "blackout_end_date": metadata["blackout_end_date"],
    }
Example #4
0
def test_load_sample_billing_monthly():
    meter_data, temperature_data, metadata = load_sample(
        "il-electricity-cdd-hdd-billing_monthly")

    assert meter_data.shape == (27, 1)
    assert meter_data.index.freq is None
    assert temperature_data.shape == (19417, )
    assert temperature_data.index.freq == "H"
    assert metadata is not None
def test_json_daily():
    meter_data, temperature_data, sample_metadata = (
        eemeter.load_sample("il-electricity-cdd-hdd-daily"))

    blackout_start_date = sample_metadata["blackout_start_date"]
    blackout_end_date = sample_metadata["blackout_end_date"]

    # get meter data suitable for fitting a baseline model
    baseline_meter_data, warnings = eemeter.get_baseline_data(
        meter_data, end=blackout_start_date, max_days=365)

    # create a design matrix (the input to the model fitting step)
    baseline_design_matrix = eemeter.create_caltrack_daily_design_matrix(
        baseline_meter_data,
        temperature_data,
    )

    # build a CalTRACK model
    baseline_model = eemeter.fit_caltrack_usage_per_day_model(
        baseline_design_matrix, )

    # get a year of reporting period data
    reporting_meter_data, warnings = eemeter.get_reporting_data(
        meter_data, start=blackout_end_date, max_days=365)

    # compute metered savings
    metered_savings_dataframe, error_bands = eemeter.metered_savings(
        baseline_model,
        reporting_meter_data,
        temperature_data,
        with_disaggregated=True)

    # total metered savings
    total_metered_savings = metered_savings_dataframe.metered_savings.sum()

    # test JSON
    json_str = json.dumps(baseline_model.json())

    m = eemeter.CalTRACKUsagePerDayModelResults.from_json(json.loads(json_str))

    # compute metered savings from the loaded model
    metered_savings_dataframe, error_bands = eemeter.metered_savings(
        m, reporting_meter_data, temperature_data, with_disaggregated=True)

    # total metered savings
    total_metered_savings_2 = metered_savings_dataframe.metered_savings.sum()

    assert total_metered_savings == total_metered_savings_2
Example #6
0
def test_load_sample_unknown():
    with pytest.raises(ValueError):
        load_sample("unknown")
Example #7
0
def setup_demo_sample_models(site_id,
                             meter_id=None,
                             description=None,
                             calc_savings=False):
    # this create a test sample meter with both hourly and daily model
    # using sample meter and temperature data for the given site id

    # use the hourly sample data
    meter_data, temperature_data, sample_metadata = (
        eemeter.load_sample("il-electricity-cdd-hdd-hourly"))

    source = 'eemeter_sample'
    # throw an exception is Site is not found
    try:
        site = SiteView.objects.get(object_id=site_id)
    except SiteView.DoesNotExist:
        site = SiteView.objects.get(entity_id=site_id)

    min_datetime = None
    max_datetime = None
    yesterday = date.today() - timedelta(days=1)
    # create a dummy weather station for the sample data if it did not alredy exist
    try:
        ws = WeatherStation.objects.get(weather_station_id='eemeter_ws')
    except WeatherStation.DoesNotExist:
        logger.info(
            'setup_demo_sample_models: creating Sample WeatherStation eemeter_ws ...'
        )
        ws = WeatherStation.objects.create(weather_station_id='eemeter_ws',
                                           station_name='Sample Station',
                                           source=source,
                                           elevation_uom_id='length_m')
        # associate it to the site
        SiteWeatherStations.objects.create(weather_station=ws,
                                           site_id=site.entity_id,
                                           source=source)

    WeatherHistory.objects.filter(weather_station=ws).delete()
    logger.info(
        'setup_demo_sample_models: adding Sample WeatherStation data ...')
    temp_items = []
    for d, t in temperature_data.iteritems():
        item = {"d": d, "t": t}
        temp_items.append(item)

    ts = datetime(year=yesterday.year,
                  month=yesterday.month,
                  day=yesterday.day,
                  hour=23,
                  minute=0,
                  second=0,
                  microsecond=0,
                  tzinfo=pytz.UTC)
    for item in reversed(temp_items):
        item["d"] = ts
        ts = ts - timedelta(minutes=60)

    # load the temperature data, this is given in F
    for item in temp_items:
        tc = (item["t"] - 32.0) * 5 / 9
        WeatherHistory.objects.create(weather_station=ws,
                                      as_of_datetime=item["d"],
                                      temp_f=item["t"],
                                      temp_c=tc,
                                      source=source)
        if not min_datetime or item["d"] < min_datetime:
            min_datetime = item["d"]
        if not max_datetime or item["d"] > max_datetime:
            max_datetime = item["d"]

    if not meter_id:
        meter_id = '{}-sample_meter'.format(site_id)
    if not description:
        description = 'Sample Meter'

    # cleanup previous entries as needed
    MeterHistory.objects.filter(meter_id=meter_id).delete()
    MeterFinancialValue.objects.filter(meter_id=meter_id).delete()
    FinancialTransaction.objects.filter(meter_id=meter_id).delete()
    Meter.objects.filter(meter_id=meter_id).delete()
    # create the meter
    logger.info('setup_demo_sample_models: creating Sample Meter %s ...',
                meter_id)
    meter = Meter.objects.create(meter_id=meter_id,
                                 site_id=site.entity_id,
                                 description=description,
                                 account_number='123456789',
                                 utility_id='USA_EIA_11208',
                                 weather_station_id='eemeter_ws')
    # setup the meter data (note this is slightly different format than temps)
    logger.info('setup_demo_sample_models: adding Sample Meter %s data ...',
                meter_id)
    meter_items = []
    for d, v in meter_data.iterrows():
        item = {"d": d, "v": v}
        meter_items.append(item)

    ts = datetime(year=yesterday.year,
                  month=yesterday.month,
                  day=yesterday.day,
                  hour=23,
                  minute=0,
                  second=0,
                  microsecond=0,
                  tzinfo=pytz.UTC)
    for item in reversed(meter_items):
        item["d"] = ts
        ts = ts - timedelta(minutes=60)

    for item in meter_items:
        MeterHistory.objects.create(meter=meter,
                                    as_of_datetime=item["d"],
                                    value=item["v"].value,
                                    uom_id='energy_kWh',
                                    source=source)
        if not min_datetime or item["d"] < min_datetime:
            min_datetime = item["d"]
        if not max_datetime or item["d"] > max_datetime:
            max_datetime = item["d"]

    baseline_end_date = min_datetime + timedelta(days=365)
    if baseline_end_date > max_datetime:
        baseline_end_date = max_datetime
    # create both models
    frequency = 'hourly'
    data = read_meter_data(meter, freq=frequency, end=baseline_end_date)
    model = get_model_for_freq(data, frequency)
    baseline_model = save_model(model,
                                meter_id=meter.meter_id,
                                description='CalTrack Hourly Model',
                                data=data,
                                frequency=frequency,
                                from_datetime=data['start'],
                                thru_datetime=data['end'])

    if calc_savings:
        calc_meter_savings(meter_id, baseline_model.id, baseline_end_date,
                           max_datetime)
    frequency = 'daily'
    data = read_meter_data(meter, freq=frequency, end=baseline_end_date)
    model = get_model_for_freq(data, frequency)

    baseline_model = save_model(model,
                                meter_id=meter.meter_id,
                                description='CalTrack Daily Model',
                                data=data,
                                frequency=frequency,
                                from_datetime=data['start'],
                                thru_datetime=data['end'])

    if calc_savings:
        calc_meter_savings(meter_id, baseline_model.id, baseline_end_date,
                           max_datetime)

    return site, meter, baseline_model
Example #8
0
def get_hourly_sample_data():
    meter_data, temperature_data, sample_metadata = (
        eemeter.load_sample("il-electricity-cdd-hdd-hourly"))
    return read_sample_data(meter_data, temperature_data, sample_metadata)
def test_json_hourly():
    meter_data, temperature_data, sample_metadata = (
        eemeter.load_sample("il-electricity-cdd-hdd-hourly"))

    blackout_start_date = sample_metadata["blackout_start_date"]
    blackout_end_date = sample_metadata["blackout_end_date"]

    # get meter data suitable for fitting a baseline model
    baseline_meter_data, warnings = eemeter.get_baseline_data(
        meter_data, end=blackout_start_date, max_days=365)

    # create a design matrix for occupancy and segmentation
    preliminary_design_matrix = (
        eemeter.create_caltrack_hourly_preliminary_design_matrix(
            baseline_meter_data,
            temperature_data,
        ))

    # build 12 monthly models - each step from now on operates on each segment
    segmentation = eemeter.segment_time_series(preliminary_design_matrix.index,
                                               'three_month_weighted')

    # assign an occupancy status to each hour of the week (0-167)
    occupancy_lookup = eemeter.estimate_hour_of_week_occupancy(
        preliminary_design_matrix,
        segmentation=segmentation,
    )

    # assign temperatures to bins
    temperature_bins = eemeter.fit_temperature_bins(
        preliminary_design_matrix,
        segmentation=segmentation,
    )

    # build a design matrix for each monthly segment
    segmented_design_matrices = (
        eemeter.create_caltrack_hourly_segmented_design_matrices(
            preliminary_design_matrix,
            segmentation,
            occupancy_lookup,
            temperature_bins,
        ))

    # build a CalTRACK hourly model
    baseline_model = eemeter.fit_caltrack_hourly_model(
        segmented_design_matrices,
        occupancy_lookup,
        temperature_bins,
    )

    # get a year of reporting period data
    reporting_meter_data, warnings = eemeter.get_reporting_data(
        meter_data, start=blackout_end_date, max_days=365)

    # compute metered savings
    metered_savings_dataframe, error_bands = eemeter.metered_savings(
        baseline_model,
        reporting_meter_data,
        temperature_data,
        with_disaggregated=True)

    # total metered savings
    total_metered_savings = metered_savings_dataframe.metered_savings.sum()

    # test JSON
    json_str = json.dumps(baseline_model.json())

    m = eemeter.CalTRACKHourlyModelResults.from_json(json.loads(json_str))

    # compute metered savings from the loaded model
    metered_savings_dataframe, error_bands = eemeter.metered_savings(
        m, reporting_meter_data, temperature_data, with_disaggregated=True)

    # total metered savings
    total_metered_savings_2 = metered_savings_dataframe.metered_savings.sum()

    assert total_metered_savings == total_metered_savings_2