code: def test_greykite_detector_daily_anomaly_at_df_end(
      daily_data, forecast_config_info_daily
  ):
      """Tests ``GreykiteDetector`` when anomaly is at the end of the training data."""
      df_train = daily_data["df_train"].copy()
      # Adds anomalies at the end of the training data.
      df_train["y"][-4:] = np.NaN
      fig = plot_lines_markers(
          df=df_train, x_col=TIME_COL, line_cols=["y"]
      )
      if FIG_SHOW:
          fig.show()
  
      forecast_config = forecast_config_info_daily
      ad_config = ADConfig(
          volatility_features_list=[["dow"], ["is_weekend"]],
          coverage_grid=[
              0.5,
              0.55,
              0.6,
              0.65,
              0.7,
              0.75,
              0.9,
              0.95,
              0.99,
              0.999,
          ],
          target_anomaly_percent=None,
          variance_scaling=True,
      )
  
      train_data = DetectorData(df=df_train)
  
      def reward_func(data):
          return calc_f1(y_true=data.y_true, y_pred=data.y_pred)
  
      reward = Reward(reward_func)
  
      detector = GreykiteDetector(
          forecast_config=forecast_config,
          ad_config=ad_config,
          reward=reward,
      )
  
      detector.fit(data=train_data)
      # Checks optimal parameter.
      assert detector.fit_info["param"] == {
          "coverage": 0.99,
          "volatility_features": ["is_weekend"],
      }
  
      # Checks parameter grid.
      param_obj_list = detector.fit_info["param_obj_list"]
      param_eval_df = pd.DataFrame.from_records(param_obj_list)
  
      assert list(param_eval_df.columns) == [
          "coverage",
          "volatility_features",
          "obj_value",
      ]
  
      param_eval_df["volatility_features"] = param_eval_df[
          "volatility_features"
      ].map(str)
      fig = px.line(
          param_eval_df,
          x="coverage",
          y="obj_value",
          color="volatility_features",
          title="'GreykiteDetector' result of parameter search: reward=f1, daily data",
      )
      assert fig is not None
      if FIG_SHOW:
          fig.show()
  
imports: import datetime
  import numpy
  import pandas
  import plotly.express
  import pytest
  from greykite.common.constants import ACTUAL_COL
  from greykite.common.constants import ANOMALY_COL
  from greykite.common.constants import END_TIME_COL
  from greykite.common.constants import PREDICTED_ANOMALY_COL
  from greykite.common.constants import PREDICTED_COL
  from greykite.common.constants import PREDICTED_LOWER_COL
  from greykite.common.constants import PREDICTED_UPPER_COL
  from greykite.common.constants import START_TIME_COL
  from greykite.common.constants import TIME_COL
  from greykite.common.constants import VALUE_COL
  from greykite.common.testing_utils import generate_df_for_tests
  from greykite.common.testing_utils_anomalies import contaminate_df_with_anomalies
  from greykite.common.viz.timeseries_annotate import plot_anomalies_over_forecast_vs_actual
  from greykite.common.viz.timeseries_annotate import plot_lines_markers
  from greykite.common.viz.timeseries_annotate import plt_compare_series_annotations
  from greykite.detection.common.ad_evaluation import f1_score
  from greykite.detection.common.ad_evaluation import precision_score
  from greykite.detection.common.ad_evaluation import recall_score
  from greykite.detection.detector.ad_utils import partial_return
  from greykite.detection.detector.config import F1
  from greykite.detection.detector.config import ADConfig
  from greykite.detection.detector.data import DetectorData
  from greykite.detection.detector.greykite import DETECTOR_PREDICT_COLS
  from greykite.detection.detector.greykite import GreykiteDetector
  from greykite.detection.detector.reward import Reward
  from greykite.framework.templates.autogen.forecast_config import EvaluationPeriodParam
  from greykite.framework.templates.autogen.forecast_config import ForecastConfig
  from greykite.framework.templates.autogen.forecast_config import MetadataParam
  from greykite.framework.templates.autogen.forecast_config import ModelComponentsParam
label_desc: Use image node_id 11 for calling a global function with example usage: test_greykite_detector_daily_anomaly_at_df_end(daily_data, forecast_config_info_daily) and returns: calc_f1