code: def test_prophet_complex():
      """Tests forecast_pipeline function with Prophet,
      custom parameters, missing data, and holidays
      """
      num_periods = 17 * 7 - 2  # not a whole number of weeks
      data = generate_df_for_tests(freq="D", periods=num_periods)
      df = data["df"][[TIME_COL, VALUE_COL]].rename(
          {
              TIME_COL: "custom_time_col",  # non-standard column names
              VALUE_COL: "custom_value_col",
          },
          axis=1,
      )
      df["custom_time_col"] = [
          x._date_repr for x in df["custom_time_col"]
      ]  # change date to string representation
  
      # drops some rows to create gaps in input data
      drop_indices = [
          10,
          20,
          40,
          41,
          42,
          43,
          48,
          49,
          50,
          55,
          60,
          65,
          70,
          75,
          80,
          85,
          90,
          95,
          100,
          101,
          110,
          111,
          112,
      ]
      df.drop(drop_indices, axis=0, inplace=True)
      assert df.shape == (num_periods - len(drop_indices), 2)
  
      # Without catching the following code produces about 30 warnings.
      # For brevity, check a few warnings
      with pytest.warns(Warning) as record:
          # creates holiday features
          holidays = ProphetTemplate().get_prophet_holidays(
              year_list=[2018, 2019],
              countries=["UnitedStates", "India"],
              lower_window=0,
              upper_window=1,
          )
          coverage = (
              0.1  # low value to make sure defaults are overridden
          )
          hyperparameter_grid = {
              "estimator__seasonality_mode": ["multiplicative"],
              "estimator__holidays": [holidays],
              "estimator__n_changepoints": [
                  0
              ],  # to speed up test case, remove for better fit
              "estimator__uncertainty_samples": [
                  10
              ],  # to speed up test case
          }
  
          # runs pipeline with 1 CV fold, 1 parameter set
          result = forecast_pipeline(
              df,
              time_col="custom_time_col",
              value_col="custom_value_col",
              date_format="%Y-%m-%d",  # possible to specify, not recommended
              tz=None,
              freq="D",  # recommended to specify when there are missing data
              pipeline=None,
              estimator=ProphetEstimator(),
              hyperparameter_grid=hyperparameter_grid,
              hyperparameter_budget=1,
              n_jobs=-1,
              forecast_horizon=3 * 7,
              coverage=coverage,
              test_horizon=2 * 7,
              agg_periods=7,
              agg_func=np.max,
              score_func=EvaluationMetricEnum.MeanSquaredError.name,
              null_model_params={
                  "strategy": "quantile",
                  "quantile": 0.5,
              },  # uses null model
              cv_horizon=3 * 7,
              cv_expanding_window=True,
              cv_min_train_periods=8 * 7,
              cv_periods_between_splits=7,
              cv_periods_between_train_test=3 * 7,
          )
          check_forecast_pipeline_result(
              result,
              coverage=coverage,
              strategy="quantile",
              expected_grid_size=1,
              lower_bound_cv=0.0,
              score_func=EvaluationMetricEnum.MeanSquaredError.name,
              greater_is_better=False,
          )
          assert (
              "There is only one CV split" in record[0].message.args[0]
          )
  
imports: import datetime
  import math
  import sys
  import warnings
  import numpy
  import pandas
  import pytest
  from scipy.stats import randint
  from sklearn.metrics import explained_variance_score
  from sklearn.metrics import mean_absolute_error
  from sklearn.metrics import mean_squared_error
  from sklearn.pipeline import Pipeline
  from greykite.common.constants import ACTUAL_COL
  from greykite.common.constants import ADJUSTMENT_DELTA_COL
  from greykite.common.constants import END_TIME_COL
  from greykite.common.constants import FRACTION_OUTSIDE_TOLERANCE
  from greykite.common.constants import METRIC_COL
  from greykite.common.constants import PREDICTED_COL
  from greykite.common.constants import QUANTILE_SUMMARY_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.constants import R2_null_model_score
  from greykite.common.evaluation import EvaluationMetricEnum
  from greykite.common.evaluation import add_finite_filter_to_scorer
  from greykite.common.evaluation import add_preaggregation_to_scorer
  from greykite.common.python_utils import assert_equal
  from greykite.common.python_utils import unique_elements_in_list
  from greykite.common.testing_utils import generate_df_for_tests
  from greykite.common.testing_utils import generate_df_with_reg_for_tests
  from greykite.framework.constants import CV_REPORT_METRICS_ALL
  from greykite.framework.constants import FRACTION_OUTSIDE_TOLERANCE_NAME
  from greykite.framework.input.univariate_time_series import UnivariateTimeSeries
  from greykite.framework.pipeline.pipeline import forecast_pipeline
  from greykite.framework.templates.prophet_template import ProphetTemplate
  from greykite.framework.utils.framework_testing_utils import check_forecast_pipeline_result
  from greykite.framework.utils.framework_testing_utils import mock_pipeline
  from greykite.sklearn.estimator.null_model import DummyEstimator
  from greykite.sklearn.estimator.prophet_estimator import ProphetEstimator
  from greykite.sklearn.estimator.silverkite_estimator import SilverkiteEstimator
  from greykite.sklearn.estimator.simple_silverkite_estimator import SimpleSilverkiteEstimator
  from greykite.sklearn.transform.column_selector import ColumnSelector
  from greykite.sklearn.transform.drop_degenerate_transformer import DropDegenerateTransformer
  from greykite.sklearn.transform.dtype_column_selector import DtypeColumnSelector
  from greykite.sklearn.transform.normalize_transformer import NormalizeTransformer
  from greykite.sklearn.transform.null_transformer import NullTransformer
  from greykite.sklearn.transform.pandas_feature_union import PandasFeatureUnion
  from greykite.sklearn.transform.zscore_outlier_transformer import ZscoreOutlierTransformer
label_desc: Use image node_id 16 for calling a global function with example usage: test_prophet_complex() without return types