def test_probabilistic_units_data_object_matching(
        prob_forecasts, single_observation):
    params = prob_forecasts.to_dict()
    assert 'constant_value_units' not in params
    params['variable'] = 'ghi'
    params['axis'] = 'x'

    pfx = datamodel.ProbabilisticForecast.from_dict(params)
    datamodel.ForecastObservation(pfx, single_observation)
    def process_report_dict(self, rep_dict):
        """
        Load parameters from rep_dict into a Report object, getting forecasts
        and observations as necessary

        Parameters
        ----------
        rep_dict : dict
            Report dictionary as posted to the the API. See the API schema for
            details

        Returns
        -------
        datamodel.Report
        """
        rep_params = rep_dict['report_parameters'].copy()
        req_dict = {}
        for key in ('report_id', 'status', 'provider'):
            req_dict[key] = rep_dict.get(key, '')
        pairs = []
        for o in rep_params['object_pairs']:
            fx_type = o.get('forecast_type', 'forecast')
            fx_method = self._forecast_get_by_type(fx_type)
            fx = fx_method(o['forecast'])
            norm = o.get('normalization')
            unc = o.get('uncertainty')
            cost = o.get('cost')
            ref_fx = o.get('reference_forecast')
            if ref_fx is not None:
                ref_fx = fx_method(ref_fx)
            if 'observation' in o:
                obs = self.get_observation(o['observation'])
                pair = datamodel.ForecastObservation(fx,
                                                     obs,
                                                     normalization=norm,
                                                     uncertainty=unc,
                                                     reference_forecast=ref_fx,
                                                     cost=cost)
            elif 'aggregate' in o:
                agg = self.get_aggregate(o['aggregate'])
                pair = datamodel.ForecastAggregate(fx,
                                                   agg,
                                                   normalization=norm,
                                                   uncertainty=unc,
                                                   reference_forecast=ref_fx,
                                                   cost=cost)
            else:
                raise ValueError('must provide observation or aggregate in all'
                                 'object_pairs')
            pairs.append(pair)
        rep_params['object_pairs'] = tuple(pairs)
        req_dict['report_parameters'] = rep_params
        return datamodel.Report.from_dict(req_dict)
def test_ForecastObservation_uncertainty_invalid(
        single_forecast, single_observation):
    with pytest.raises(ValueError):
        datamodel.ForecastObservation(
            single_forecast, single_observation, uncertainty='nope')
def test_ForecastObservation_uncertainty(
        single_forecast, single_observation, uncertainty, expected):
    fxobs = datamodel.ForecastObservation(
        single_forecast, single_observation, uncertainty=uncertainty)
    assert fxobs.uncertainty == expected
def pdid_params(request, many_sites, many_sites_text,
                single_observation, single_observation_text,
                single_site, single_forecast_text, single_forecast,
                single_event_observation_text, single_event_observation,
                single_event_forecast_text, single_event_forecast,
                prob_forecast_constant_value,
                prob_forecast_constant_value_text, prob_forecasts,
                prob_forecast_text, aggregate, aggregate_observations,
                aggregate_text, aggregate_forecast_text,
                aggregateforecast, aggregate_prob_forecast,
                aggregate_prob_forecast_text,
                agg_prob_forecast_constant_value,
                single_aggregate_observation,
                single_aggregate_observation_text, report_objects,
                report_dict, quality_filter, quality_filter_dict,
                timeofdayfilter, timeofdayfilter_dict, valuefilter,
                valuefilter_dict, metric_value_dict, metric_value,
                metric_result_dict, metric_result,
                validation_result_dict, validation_result,
                preprocessing_result_dict, preprocessing_result,
                plotly_report_figure_dict, plotly_report_figure,
                bokeh_report_figure_dict, bokeh_report_figure,
                report_message_dict, report_message,
                report_params_dict, report_params,
                constant_cost, timeofday_cost, datetime_cost,
                errorband_cost, banded_cost_params, cost_dicts):
    if request.param == 'site':
        return (many_sites[0], json.loads(many_sites_text)[0],
                datamodel.Site)
    elif request.param == 'fixed':
        return (many_sites[1].modeling_parameters,
                json.loads(many_sites_text)[1]['modeling_parameters'],
                datamodel.FixedTiltModelingParameters)
    elif request.param == 'single':
        return (many_sites[2].modeling_parameters,
                json.loads(many_sites_text)[2]['modeling_parameters'],
                datamodel.SingleAxisModelingParameters)
    elif request.param == 'observation':
        obs_dict = json.loads(single_observation_text)
        obs_dict['site'] = single_site
        return (single_observation, obs_dict,
                datamodel.Observation)
    elif request.param == 'forecast':
        fx_dict = json.loads(single_forecast_text)
        fx_dict['site'] = single_site
        return (single_forecast, fx_dict, datamodel.Forecast)
    elif request.param == 'eventobservation':
        obs_dict = json.loads(single_event_observation_text)
        obs_dict['site'] = single_site
        return (single_event_observation, obs_dict, datamodel.Observation)
    elif request.param == 'eventforecast':
        fx_dict = json.loads(single_event_forecast_text)
        fx_dict['site'] = single_site
        return (single_event_forecast, fx_dict, datamodel.EventForecast)
    elif request.param == 'probabilisticforecastconstantvalue':
        fx_dict = json.loads(prob_forecast_constant_value_text)
        fx_dict['site'] = single_site
        return (prob_forecast_constant_value, fx_dict,
                datamodel.ProbabilisticForecastConstantValue)
    elif request.param == 'probabilisticforecast':
        fx_dict = json.loads(prob_forecast_text)
        fx_dict['site'] = single_site
        fx_dict['constant_values'] = (prob_forecast_constant_value, )
        return (prob_forecasts, fx_dict, datamodel.ProbabilisticForecast)
    elif request.param == 'forecastobservation':
        fx_dict = json.loads(single_forecast_text)
        fx_dict['site'] = single_site
        obs_dict = json.loads(single_observation_text)
        obs_dict['site'] = single_site
        fxobs_dict = {'forecast': fx_dict, 'observation': obs_dict}
        fxobs = datamodel.ForecastObservation(
            single_forecast, single_observation)
        return (fxobs, fxobs_dict, datamodel.ForecastObservation)
    elif request.param == 'aggregate':
        agg_dict = json.loads(aggregate_text)
        agg_dict['observations'] = aggregate_observations
        return (aggregate, agg_dict, datamodel.Aggregate)
    elif request.param == 'aggregateforecast':
        aggfx_dict = json.loads(aggregate_forecast_text)
        aggfx_dict['aggregate'] = aggregate.to_dict()
        return (aggregateforecast, aggfx_dict, datamodel.Forecast)
    elif request.param == 'aggregateprobforecast':
        fx_dict = json.loads(aggregate_prob_forecast_text)
        fx_dict['aggregate'] = aggregate.to_dict()
        fx_dict['constant_values'] = (agg_prob_forecast_constant_value, )
        return (aggregate_prob_forecast, fx_dict,
                datamodel.ProbabilisticForecast)
    elif request.param == 'forecastaggregate':
        aggfx_dict = json.loads(aggregate_forecast_text)
        aggfx_dict['aggregate'] = aggregate.to_dict()
        agg_dict = json.loads(aggregate_text)
        agg_dict['observations'] = aggregate_observations
        fxobs_dict = {'forecast': aggfx_dict, 'aggregate': agg_dict}
        fxobs = datamodel.ForecastAggregate(aggregateforecast, aggregate)
        return (fxobs, fxobs_dict, datamodel.ForecastAggregate)
    elif request.param == 'aggregateobservation':
        aggobs_dict = json.loads(single_aggregate_observation_text)
        return (single_aggregate_observation, aggobs_dict,
                datamodel.AggregateObservation)
    elif request.param == 'report':
        report, *_ = report_objects
        return (report, report_dict.copy(), datamodel.Report)
    elif request.param == 'quality_filter':
        return (quality_filter, quality_filter_dict,
                datamodel.QualityFlagFilter)
    elif request.param == 'timeofdayfilter':
        return (timeofdayfilter, timeofdayfilter_dict,
                datamodel.TimeOfDayFilter)
    elif request.param == 'valuefilter':
        return (valuefilter, valuefilter_dict,
                datamodel.ValueFilter)
    elif request.param == 'metricvalue':
        return (metric_value, metric_value_dict, datamodel.MetricValue)
    elif request.param == 'metricresult':
        return (metric_result, metric_result_dict, datamodel.MetricResult)
    elif request.param == 'validationresult':
        return (validation_result, validation_result_dict,
                datamodel.ValidationResult)
    elif request.param == 'preprocessing_result':
        return (preprocessing_result, preprocessing_result_dict,
                datamodel.PreprocessingResult)
    elif request.param == 'reportparameters':
        return (report_params, report_params_dict,
                datamodel.ReportParameters)
    elif request.param == 'plotlyreportfigure':
        return (plotly_report_figure, plotly_report_figure_dict,
                datamodel.PlotlyReportFigure)
    elif request.param == 'bokehreportfigure':
        return (bokeh_report_figure, bokeh_report_figure_dict,
                datamodel.BokehReportFigure)
    elif request.param == 'reportmessage':
        return (report_message, report_message_dict, datamodel.ReportMessage)
    elif request.param == 'constantcost':
        return (constant_cost, cost_dicts['constant'], datamodel.ConstantCost)
    elif request.param == 'timeofdaycost':
        return (timeofday_cost, cost_dicts['timeofday'],
                datamodel.TimeOfDayCost)
    elif request.param == 'datetimecost':
        return (datetime_cost, cost_dicts['datetime'], datamodel.DatetimeCost)
    elif request.param == 'errorbandcost':
        return (errorband_cost, cost_dicts['errorband'],
                datamodel.ErrorBandCost)
    elif request.param == 'cost':
        return (banded_cost_params, cost_dicts['fullcost'], datamodel.Cost)
Example #6
0
def test_render_pdf_special_chars(
        ac_power_observation_metadata, ac_power_forecast_metadata, dash_url,
        fail_pdf, preprocessing_result_types, report_metrics):
    if shutil.which('pdflatex') is None:  # pragma: no cover
        pytest.skip('pdflatex must be on PATH to generate PDF reports')
    quality_flag_filter = datamodel.QualityFlagFilter(
        (
            "USER FLAGGED",
        )
    )
    forecast = ac_power_forecast_metadata.replace(
        name="ac_power forecast (why,)  ()'-_,")
    observation = ac_power_observation_metadata.replace(
        name="ac_power observations  ()'-_,")
    fxobs = datamodel.ForecastObservation(forecast,
                                          observation)
    tz = 'America/Phoenix'
    start = pd.Timestamp('20190401 0000', tz=tz)
    end = pd.Timestamp('20190404 2359', tz=tz)
    report_params = datamodel.ReportParameters(
        name="NREL MIDC OASIS GHI Forecast Analysis  ()'-_,",
        start=start,
        end=end,
        object_pairs=(fxobs,),
        metrics=("mae", "rmse", "mbe", "s"),
        categories=("total", "date", "hour"),
        filters=(quality_flag_filter,)
    )
    report = datamodel.Report(
        report_id="56c67770-9832-11e9-a535-f4939feddd83",
        report_parameters=report_params
    )
    qflags = list(
        f.quality_flags for f in report.report_parameters.filters if
        isinstance(f, datamodel.QualityFlagFilter)
    )
    qflags = list(qflags[0])
    ser_index = pd.date_range(
        start, end,
        freq=to_offset(forecast.interval_length),
        name='timestamp')
    ser = pd.Series(
        np.repeat(100, len(ser_index)), name='value',
        index=ser_index)
    pfxobs = datamodel.ProcessedForecastObservation(
        forecast.name,
        fxobs,
        forecast.interval_value_type,
        forecast.interval_length,
        forecast.interval_label,
        valid_point_count=len(ser),
        validation_results=tuple(datamodel.ValidationResult(
            flag=f, count=0) for f in qflags),
        preprocessing_results=tuple(datamodel.PreprocessingResult(
            name=t, count=0) for t in preprocessing_result_types),
        forecast_values=ser,
        observation_values=ser
    )

    figs = datamodel.RawReportPlots(
        (
            datamodel.PlotlyReportFigure.from_dict(
                {
                    'name': 'mae tucson ac_power',
                    'spec': '{"data":[{"x":[1],"y":[1],"type":"bar"}]}',
                    'pdf': fail_pdf,
                    'figure_type': 'bar',
                    'category': 'total',
                    'metric': 'mae',
                    'figure_class': 'plotly',
                }
            ),), '4.5.3',
    )
    raw = datamodel.RawReport(
        generated_at=report.report_parameters.end,
        timezone=tz,
        plots=figs,
        metrics=report_metrics(report),
        processed_forecasts_observations=(pfxobs,),
        versions=(('test',  'test_with_underscore?'),),
        messages=(datamodel.ReportMessage(
            message="Failed to make metrics for ac_power forecast ()'-_,",
            step='', level='', function=''),))
    rr = report.replace(raw_report=raw)
    rendered = template.render_pdf(rr, dash_url)
    assert rendered.startswith(b'%PDF')