def test_raw_report_plots_invalid_versions(plotly_report_figure, plotly_version, bokeh_version, script): with pytest.raises(KeyError): datamodel.RawReportPlots(figures=(plotly_report_figure, ), plotly_version=plotly_version, bokeh_version=bokeh_version, script=script)
def test_raw_report_plots(plotly_report_figure, plotly_version, bokeh_version, script): dm_obj = datamodel.RawReportPlots(figures=(plotly_report_figure, ), plotly_version=plotly_version, bokeh_version=bokeh_version, script=script) assert dm_obj.figures == (plotly_report_figure, ) assert dm_obj.plotly_version == plotly_version assert dm_obj.bokeh_version == bokeh_version assert dm_obj.script == script
def raw_report_plots(report, metrics): """Create a RawReportPlots object from the metrics of a report. Parameters ---------- report: :py:class:`solarforecastarbiter.datamodel.Report` metrics: tuple of :py:class:`solarforecastarbiter.datamodel.MetricResult` Returns ------- :py:class:`solarforecastarbiter.datamodel.RawReportPlots` """ cds = construct_metrics_cds(metrics, rename=abbreviate) # Create initial bar figures figure_dict = {} # Components for other metrics for category in report.report_parameters.categories: for metric in report.report_parameters.metrics: if category == 'total': fig = bar(cds, metric) figure_dict[f'total::{metric}::all'] = fig else: figs = bar_subdivisions(cds, category, metric) for name, fig in figs.items(): figure_dict[f'{category}::{metric}::{name}'] = fig script, divs = components(figure_dict) mplots = [] with _make_webdriver() as driver: for k, v in divs.items(): cat, met, name = k.split('::', 2) fig = figure_dict[k] svg = output_svg(fig, driver=driver) mplots.append( datamodel.BokehReportFigure(name=name, category=cat, metric=met, div=v, svg=svg, figure_type='bar')) out = datamodel.RawReportPlots(bokeh_version=bokeh_version, script=script, figures=tuple(mplots)) return out
def raw_report_plots(report, metrics): """Create a RawReportPlots object from the metrics of a report. Parameters ---------- report: :py:class:`solarforecastarbiter.datamodel.Report` metrics: tuple of :py:class:`solarforecastarbiter.datamodel.MetricResult` Returns ------- :py:class:`solarforecastarbiter.datamodel.RawReportPlots` """ metrics_df = construct_metrics_dataframe(metrics, rename=abbreviate) # Create initial bar figures figure_dict = {} # Components for other metrics for category in report.report_parameters.categories: for metric in report.report_parameters.metrics: if category == 'total': fig = bar(metrics_df, metric) figure_dict[f'total::{metric}::all'] = fig else: figs = bar_subdivisions(metrics_df, category, metric) for name, fig in figs.items(): figure_dict[f'{category}::{metric}::{name}'] = fig mplots = [] for k, v in figure_dict.items(): cat, met, name = k.split('::', 2) figure_spec = v.to_json() pdf = output_pdf(v) mplots.append( datamodel.PlotlyReportFigure(name=name, category=cat, metric=met, spec=figure_spec, pdf=pdf, figure_type='bar')) out = datamodel.RawReportPlots(tuple(mplots), plotly_version) return out
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')