def test_basic_usage(project, mock_tmy3_weather_source):
    meter = EnergyEfficiencyMeter()
    results = meter.evaluate(project,
                             weather_normal_source=mock_tmy3_weather_source)

    assert isinstance(results['modeling_period_set'], ModelingPeriodSet)

    assert isinstance(results['modeled_energy_traces']['0'],
                      SplitModeledEnergyTrace)

    assert 'modeled_energy_trace_derivatives' in results

    project_derivatives = \
        results['project_derivatives'][('baseline', 'reporting')]
    assert project_derivatives['ELECTRICITY_ON_SITE_GENERATION_UNCONSUMED'] \
        is None
    assert project_derivatives['NATURAL_GAS_CONSUMPTION_SUPPLIED'] is None
    all_fuels = project_derivatives['ALL_FUELS_CONSUMPTION_SUPPLIED']
    elec = project_derivatives['ELECTRICITY_CONSUMPTION_SUPPLIED']

    assert len(all_fuels['BASELINE']['annualized_weather_normal']) == 4
    assert len(all_fuels['REPORTING']['annualized_weather_normal']) == 4
    assert len(elec['BASELINE']['annualized_weather_normal']) == 4
    assert len(elec['REPORTING']['annualized_weather_normal']) == 4

    assert len(all_fuels['BASELINE']['gross_predicted']) == 4
    assert len(all_fuels['REPORTING']['gross_predicted']) == 4
    assert len(elec['BASELINE']['gross_predicted']) == 4
    assert len(elec['REPORTING']['gross_predicted']) == 4

    assert results['weather_source'].station == '994971'
    assert results['weather_normal_source'].station == '724838'
예제 #2
0
def test_bad_meter_input(mock_isd_weather_source, mock_tmy3_weather_source):

    meter = EnergyEfficiencyMeter()

    results = meter.evaluate({},
                             weather_source=mock_isd_weather_source,
                             weather_normal_source=mock_tmy3_weather_source)

    assert results['status'] == 'FAILURE'
    assert results['failure_message'].startswith("Meter input")
예제 #3
0
def test_basic_usage_empty(meter_input_empty, monkeypatch_temperature_data):

    meter = EnergyEfficiencyMeter()

    results = meter.evaluate(meter_input_empty)

    assert results['status'] == 'SUCCESS'
    assert results['failure_message'] is None
    assert results['modeled_energy_trace'] is not None
    assert len(results['derivatives']) == 0
예제 #4
0
def test_bad_zipcode(meter_input_bad_zipcode):

    meter = EnergyEfficiencyMeter()

    results = meter.evaluate(meter_input_bad_zipcode)

    assert results['project_id'] is None
    assert results['trace_id'] is None
    assert results['interval'] is None

    derivatives = results['derivatives']
    assert len(derivatives) == 8

    source_series = set([d['series'] for d in derivatives])
    assert source_series == set([
        # 'Cumulative baseline model minus reporting model, normal year',
        # 'Cumulative baseline model, normal year',
        # 'Cumulative reporting model, normal year',
        # 'Baseline model minus reporting model, normal year',
        # 'Baseline model, normal year',
        # 'Reporting model, normal year',

        # 'Cumulative baseline model minus observed, reporting period',
        # 'Cumulative baseline model, reporting period',
        'Cumulative observed, reporting period',
        # 'Baseline model minus observed, reporting period',
        # 'Baseline model, reporting period',
        'Observed, reporting period',
        # 'Masked baseline model minus observed, reporting period',
        # 'Masked baseline model, reporting period',
        'Masked observed, reporting period',

        #'Baseline model, baseline period',
        #'Reporting model, reporting period',
        'Cumulative observed, baseline period',
        'Observed, baseline period',
        'Observed, project period',
        'Inclusion mask, baseline period',
        'Inclusion mask, reporting period',

        # 'Temperature, baseline period',
        # 'Temperature, reporting period',
        # 'Temperature, normal year',

        # 'Masked temperature, reporting period',
    ])

    for d in derivatives:
        assert isinstance(d['orderable'], list)
        assert isinstance(d['value'], list)
        assert isinstance(d['variance'], list)
        assert len(d['orderable']) == len(d['value']) == len(d['variance'])

    json.dumps(results)
예제 #5
0
def test_strange_interpretation(meter_input_strange_interpretation,
                                mock_isd_weather_source,
                                mock_tmy3_weather_source):

    meter = EnergyEfficiencyMeter()

    results = meter.evaluate(meter_input_strange_interpretation,
                             weather_source=mock_isd_weather_source,
                             weather_normal_source=mock_tmy3_weather_source)

    assert results['status'] == 'FAILURE'
    assert results['failure_message'].startswith("Default formatter")
예제 #6
0
def test_basic_usage_empty(meter_input_empty, mock_isd_weather_source,
                           mock_tmy3_weather_source):

    meter = EnergyEfficiencyMeter()

    results = meter.evaluate(meter_input_empty,
                             weather_source=mock_isd_weather_source,
                             weather_normal_source=mock_tmy3_weather_source)

    assert results['status'] == 'SUCCESS'
    assert results['failure_message'] is None
    assert results['modeled_energy_trace'] is not None
    assert len(results['derivatives']) == 0
예제 #7
0
def test_ignore_extra_args_monthly(
        meter_input_monthly,
        mock_isd_weather_source,
        mock_tmy3_weather_source):

    meter = EnergyEfficiencyMeter()

    results = meter.evaluate(meter_input_monthly,
                             model=(None, {'grid_search': True, 'extra_arg': 'value'}),
                             formatter=None,
                             weather_source=mock_isd_weather_source,
                             weather_normal_source=mock_tmy3_weather_source)

    assert results['model_class'] == 'CaltrackMonthlyModel'
    assert results['model_kwargs'] == {'fit_cdd': True, 'grid_search': True, 'extra_arg': 'value'}
예제 #8
0
def test_meter_settings_cz2010(meter_input_daily):
    meter = EnergyEfficiencyMeter(
        weather_station_mapping='CZ2010',
        weather_normal_station_mapping='CZ2010'
    )
    assert meter.weather_station_mapping == 'CZ2010'
    assert meter.weather_normal_station_mapping == 'CZ2010'

    results = meter.evaluate(meter_input_daily)
    assert results['logs'][0] == 'Using weather_source ISDWeatherSource("722874")'
    assert results['logs'][1] == 'Using weather_normal_source CZ2010WeatherSource("722874")'
    assert results['status'] == 'SUCCESS'
    assert results['meter_kwargs'] == {
        'weather_station_mapping': 'CZ2010',
        'weather_normal_station_mapping': 'CZ2010'
    }
예제 #9
0
def test_ignore_extra_args_monthly(meter_input_monthly,
                                   monkeypatch_temperature_data):

    meter = EnergyEfficiencyMeter()

    results = meter.evaluate(meter_input_monthly,
                             model=(None, {
                                 'grid_search': True,
                                 'extra_arg': 'value'
                             }),
                             formatter=None)

    assert results['meter_kwargs'] == {}
    assert results['model_class'] == 'CaltrackMonthlyModel'
    assert results['model_kwargs'] == {
        'fit_cdd': True,
        'grid_search': True,
        'extra_arg': 'value'
    }
예제 #10
0
def run_meter(project, trace_object):
    print("\n\nRunning a meter for %s %s" %
          (trace_object.trace_id, trace_object.interpretation))
    meter_input = serialize_meter_input(trace_object, project['zipcode'],
                                        project['project_start'],
                                        project['project_end'])
    ee = EnergyEfficiencyMeter()
    meter_output = ee.evaluate(meter_input)

    # Compute and output the annualized weather normal
    series_name = \
        'Cumulative baseline model minus reporting model, normal year'
    awn = [
        i['value'][0] for i in meter_output['derivatives']
        if i['series'] == series_name
    ][0]
    awn_var = [
        i['variance'][0] for i in meter_output['derivatives']
        if i['series'] == series_name
    ][0]
    awn_confint = stats.norm.interval(0.68, loc=awn, scale=np.sqrt(awn_var))
    print("Normal year savings estimate:")
    print("  {:f}\n  68% confidence interval: ({:f}, {:f})".format(
        awn, awn_confint[0], awn_confint[1]))

    # Compute and output the weather normalized reporting period savings
    series_name = \
        'Cumulative baseline model minus observed, reporting period'
    rep = [
        i['value'][0] for i in meter_output['derivatives']
        if i['series'] == series_name
    ][0]
    rep_var = [
        i['variance'][0] for i in meter_output['derivatives']
        if i['series'] == series_name
    ][0]
    rep_confint = stats.norm.interval(0.68, loc=rep, scale=np.sqrt(rep_var))
    print("Reporting period savings estimate:")
    print("  {:f}\n  68% confidence interval: ({:f}, {:f})".format(
        rep, rep_confint[0], rep_confint[1]))
예제 #11
0
파일: cli.py 프로젝트: zimmemit/eemeter
def run_meter(project, trace_object, options=None):
    print("\n\nRunning a meter for %s %s" %
          (trace_object.trace_id, trace_object.interpretation))
    meter_input = serialize_meter_input(trace_object, project['zipcode'],
                                        project['project_start'],
                                        project['project_end'])

    ee = EnergyEfficiencyMeter()

    if options is not None and \
            'ignore_data_sufficiency' in options.keys() and \
            options['ignore_data_sufficiency'] is True:
        trace_frequency = get_approximate_frequency(trace_object)
        if trace_frequency not in ['H', 'D', '15T', '30T']:
            trace_frequency = None
        selector = (trace_object.interpretation, trace_frequency)
        model = ee._get_model(None, selector)

        model_class, model_kwargs = model

        if model_class == CaltrackMonthlyModel:
            model_kwargs['min_contiguous_baseline_months'] = 0
            model_kwargs['min_contiguous_reporting_months'] = 0
        else:
            model_kwargs['min_contiguous_months'] = 0

    meter_output = ee.evaluate(meter_input)
    basic_output(meter_output)

    if options is not None and \
       'full_output' in options.keys() and \
       options['full_output']:
        trace_output_dir = trace_object.trace_id + '.' + \
                           trace_object.interpretation
        full_output(meter_output, options['output_dir'], trace_output_dir)
    return meter_output
예제 #12
0
def test_custom_evaluate_args_monthly(
        meter_input_monthly,
        mock_isd_weather_source,
        mock_tmy3_weather_source):

    meter = EnergyEfficiencyMeter()

    results = meter.evaluate(meter_input_monthly,
                             model=None,
                             formatter=None,
                             weather_source=mock_isd_weather_source,
                             weather_normal_source=mock_tmy3_weather_source)

    assert results['model_class'] == 'CaltrackMonthlyModel'
    assert results['model_kwargs'] == {'fit_cdd': True, 'grid_search': True}
    assert results['formatter_class'] == 'ModelDataBillingFormatter'
    assert results['formatter_kwargs'] == {}

    results = meter.evaluate(meter_input_monthly,
                             model=(None, None),
                             formatter=(None, None),
                             weather_source=mock_isd_weather_source,
                             weather_normal_source=mock_tmy3_weather_source)

    assert results['model_class'] == 'CaltrackMonthlyModel'
    assert results['model_kwargs'] == {'fit_cdd': True, 'grid_search': True}
    assert results['formatter_class'] == 'ModelDataBillingFormatter'
    assert results['formatter_kwargs'] == {}

    results = meter.evaluate(meter_input_monthly,
                             model=('CaltrackMonthlyModel', None),
                             formatter=('ModelDataBillingFormatter', None),
                             weather_source=mock_isd_weather_source,
                             weather_normal_source=mock_tmy3_weather_source)

    assert results['model_class'] == 'CaltrackMonthlyModel'
    assert results['model_kwargs'] == {}
    assert results['formatter_class'] == 'ModelDataBillingFormatter'
    assert results['formatter_kwargs'] == {}

    results = meter.evaluate(meter_input_monthly,
                             model=(None, {"fit_cdd": False}),
                             weather_source=mock_isd_weather_source,
                             weather_normal_source=mock_tmy3_weather_source)

    assert results['model_class'] == 'CaltrackMonthlyModel'
    assert results['model_kwargs'] == {'fit_cdd': False, 'grid_search': True}
    assert results['formatter_class'] == 'ModelDataBillingFormatter'
    assert results['formatter_kwargs'] == {}

    results = meter.evaluate(meter_input_monthly,
                             model=(None, {"fit_cdd": False}),
                             formatter=(None, {}),
                             weather_source=mock_isd_weather_source,
                             weather_normal_source=mock_tmy3_weather_source)

    assert results['model_class'] == 'CaltrackMonthlyModel'
    assert results['model_kwargs'] == {'fit_cdd': False, 'grid_search': True}
    assert results['formatter_class'] == 'ModelDataBillingFormatter'
    assert results['formatter_kwargs'] == {}

    results = meter.evaluate(meter_input_monthly,
                             model=(CaltrackMonthlyModel, {"fit_cdd": False}),
                             formatter=(ModelDataBillingFormatter, {}),
                             weather_source=mock_isd_weather_source,
                             weather_normal_source=mock_tmy3_weather_source)

    assert results['model_class'] == 'CaltrackMonthlyModel'
    assert results['model_kwargs'] == {'fit_cdd': False}
    assert results['formatter_class'] == 'ModelDataBillingFormatter'
    assert results['formatter_kwargs'] == {}
예제 #13
0
def test_basic_usage_reporting_only(
        meter_input_daily_reporting_only,
        mock_isd_weather_source,
        mock_tmy3_weather_source):

    meter = EnergyEfficiencyMeter()

    results = meter.evaluate(meter_input_daily_reporting_only,
                             weather_source=mock_isd_weather_source,
                             weather_normal_source=mock_tmy3_weather_source)

    assert results['status'] == 'SUCCESS'
    assert results['failure_message'] is None
    assert len(results['logs']) == 2

    assert results['eemeter_version'] is not None
    assert results['model_class'] == 'CaltrackDailyModel'
    assert results['model_kwargs'] is not None
    assert results['formatter_class'] == 'ModelDataFormatter'
    assert results['formatter_kwargs'] is not None

    assert results['modeled_energy_trace'] is not None

    derivatives = results['derivatives']
    assert len(derivatives) == 18
    assert derivatives[0]['modeling_period_group'] == \
        ('baseline', 'reporting')
    assert derivatives[0]['orderable'] == [None]
    assert derivatives[0]['value'] is not None
    assert derivatives[0]['variance'] is not None

    source_series = set([d['series'] for d in derivatives])
    assert source_series == set([
        # 'Cumulative baseline model minus reporting model, normal year',
        # 'Cumulative baseline model, normal year',
        'Cumulative reporting model, normal year',
        # 'Baseline model minus reporting model, normal year',
        # 'Baseline model, normal year',
        'Reporting model, normal year',

        # 'Cumulative baseline model minus observed, reporting period',
        # 'Cumulative baseline model, reporting period',
        'Cumulative observed, reporting period',
        # 'Baseline model minus observed, reporting period',
        # 'Baseline model, reporting period',
        'Observed, reporting period',
        # 'Masked baseline model minus observed, reporting period',
        # 'Masked baseline model, reporting period',
        'Masked observed, reporting period',

        #'Baseline model, baseline period',
        'Reporting model, reporting period',

        'Cumulative observed, baseline period',
        'Observed, baseline period',

        'Observed, project period',

        'Inclusion mask, baseline period',
        'Inclusion mask, reporting period',

        'Temperature, baseline period',
        'Temperature, reporting period',
        'Temperature, normal year',
        'Masked temperature, reporting period',

        #'Heating degree day balance point, baseline period',
        #'Cooling degree day balance point, baseline period',
        'Heating degree day balance point, reporting period',
        'Cooling degree day balance point, reporting period',
        #'Best-fit intercept, baseline period',
        'Best-fit intercept, reporting period',
    ])

    for d in derivatives:
        assert isinstance(d['orderable'], list)
        assert isinstance(d['value'], list)
        assert isinstance(d['variance'], list)
        assert len(d['orderable']) == len(d['value']) == len(d['variance'])

    json.dumps(results)
예제 #14
0
def test_basic_usage_daily_period_start_end(
        meter_input_daily_with_period_start_end,
        mock_isd_weather_source,
        mock_tmy3_weather_source):

    meter = EnergyEfficiencyMeter()

    results = meter.evaluate(meter_input_daily_with_period_start_end,
                             weather_source=mock_isd_weather_source,
                             weather_normal_source=mock_tmy3_weather_source)

    assert results['status'] == 'SUCCESS'
    assert results['failure_message'] is None
    assert len(results['logs']) == 2

    assert results['eemeter_version'] is not None

    assert results['project_id'] == 'PROJECT_1'
    assert results['trace_id'] == 'TRACE_1'
    assert results['interval'] == 'daily'

    assert results['meter_kwargs'] == {}
    assert results['model_class'] == 'CaltrackDailyModel'
    assert results['model_kwargs'] is not None
    assert results['formatter_class'] == 'ModelDataFormatter'
    assert results['formatter_kwargs'] is not None

    assert results['modeled_energy_trace'] is not None

    derivatives = results['derivatives']
    assert len(derivatives) == 32

    baseline_observed = {d['series']:d for d in derivatives}['Observed, baseline period']
    reporting_observed = {d['series']:d for d in derivatives}['Observed, reporting period']

    assert (baseline_observed['orderable'][0], baseline_observed['orderable'][-1]) == ('2013-01-01T00:00:00+00:00', '2014-01-01T00:00:00+00:00')
    assert (reporting_observed['orderable'][0], reporting_observed['orderable'][-1]) == ('2014-02-01T00:00:00+00:00', '2015-02-01T00:00:00+00:00')

    assert derivatives[0]['modeling_period_group'] == ('baseline', 'reporting')
    assert derivatives[0]['orderable'] == [None]

    source_series = set([d['series'] for d in derivatives])
    assert source_series == set([
        'Cumulative baseline model minus reporting model, normal year',
        'Cumulative baseline model, normal year',
        'Baseline model, normal year',
        'Cumulative reporting model, normal year',
        'Baseline model minus reporting model, normal year',
        'Baseline model, normal year',
        'Reporting model, normal year',
        'Baseline model, baseline period',

        'Cumulative baseline model minus observed, reporting period',
        'Cumulative baseline model, reporting period',
        'Cumulative observed, reporting period',
        'Baseline model minus observed, reporting period',
        'Baseline model, reporting period',
        'Observed, reporting period',
        'Masked baseline model minus observed, reporting period',
        'Masked baseline model, reporting period',
        'Masked observed, reporting period',

        'Baseline model, baseline period',
        'Reporting model, reporting period',

        'Cumulative observed, baseline period',
        'Observed, baseline period',

        'Observed, project period',

        'Inclusion mask, baseline period',
        'Inclusion mask, reporting period',

        'Temperature, baseline period',
        'Temperature, reporting period',
        'Temperature, normal year',
        'Masked temperature, reporting period',

        'Heating degree day balance point, baseline period',
        'Cooling degree day balance point, baseline period',
        'Heating degree day balance point, reporting period',
        'Cooling degree day balance point, reporting period',
        'Best-fit intercept, baseline period',
        'Best-fit intercept, reporting period',
    ])

    for d in derivatives:
        assert isinstance(d['orderable'], list)
        assert isinstance(d['value'], list)
        assert isinstance(d['variance'], list)
        assert len(d['orderable']) == len(d['value']) == len(d['variance'])

    json.dumps(results)
예제 #15
0
def test_custom_evaluate_args_monthly(meter_input_monthly,
                                      monkeypatch_temperature_data):

    meter = EnergyEfficiencyMeter()

    results = meter.evaluate(meter_input_monthly, model=None, formatter=None)

    assert results['meter_kwargs'] == {}
    assert results['model_class'] == 'CaltrackMonthlyModel'
    assert results['model_kwargs'] == {'fit_cdd': True, 'grid_search': True}
    assert results['formatter_class'] == 'ModelDataBillingFormatter'
    assert results['formatter_kwargs'] == {}

    results = meter.evaluate(meter_input_monthly,
                             model=(None, None),
                             formatter=(None, None))

    assert results['meter_kwargs'] == {}
    assert results['model_class'] == 'CaltrackMonthlyModel'
    assert results['model_kwargs'] == {'fit_cdd': True, 'grid_search': True}
    assert results['formatter_class'] == 'ModelDataBillingFormatter'
    assert results['formatter_kwargs'] == {}

    results = meter.evaluate(meter_input_monthly,
                             model=('CaltrackMonthlyModel', None),
                             formatter=('ModelDataBillingFormatter', None))

    assert results['meter_kwargs'] == {}
    assert results['model_class'] == 'CaltrackMonthlyModel'
    assert results['model_kwargs'] == {}
    assert results['formatter_class'] == 'ModelDataBillingFormatter'
    assert results['formatter_kwargs'] == {}

    results = meter.evaluate(meter_input_monthly,
                             model=(None, {
                                 "fit_cdd": False
                             }))

    assert results['meter_kwargs'] == {}
    assert results['model_class'] == 'CaltrackMonthlyModel'
    assert results['model_kwargs'] == {'fit_cdd': False, 'grid_search': True}
    assert results['formatter_class'] == 'ModelDataBillingFormatter'
    assert results['formatter_kwargs'] == {}

    results = meter.evaluate(meter_input_monthly,
                             model=(None, {
                                 "fit_cdd": False
                             }),
                             formatter=(None, {}))

    assert results['meter_kwargs'] == {}
    assert results['model_class'] == 'CaltrackMonthlyModel'
    assert results['model_kwargs'] == {'fit_cdd': False, 'grid_search': True}
    assert results['formatter_class'] == 'ModelDataBillingFormatter'
    assert results['formatter_kwargs'] == {}

    results = meter.evaluate(meter_input_monthly,
                             model=(CaltrackMonthlyModel, {
                                 "fit_cdd": False
                             }),
                             formatter=(ModelDataBillingFormatter, {}))

    assert results['meter_kwargs'] == {}
    assert results['model_class'] == 'CaltrackMonthlyModel'
    assert results['model_kwargs'] == {'fit_cdd': False}
    assert results['formatter_class'] == 'ModelDataBillingFormatter'
    assert results['formatter_kwargs'] == {}