code: def test_custom_pipeline():
      """Tests forecast_pipeline function with custom pipeline"""
      data = generate_df_for_tests(freq="D", periods=30 * 8)  # 8 months
      df = data["df"][[TIME_COL, VALUE_COL]]
      score_func = add_finite_filter_to_scorer(mean_squared_error)
      coverage = 0.1  # low value to make sure defaults are overridden
      hyperparameter_grid = {
          "estimator__seasonality_mode": ["additive"],
          "estimator__n_changepoints": [
              0
          ],  # to speed up test case, remove for better fit
          "estimator__uncertainty_samples": [
              10
          ],  # to speed up test case
      }
  
      # it's possible, but not recommended, to write your own pipeline for whatever reason
      pipeline = Pipeline(
          [
              # the final step in the pipeline must be called "estimator"
              (
                  "estimator",
                  ProphetEstimator(
                      score_func=score_func,
                      coverage=coverage,
                      null_model_params=None,
                  ),
              )
          ]
      )
  
      with pytest.warns(UserWarning) as record:
          result = forecast_pipeline(
              df,
              time_col=TIME_COL,
              value_col=VALUE_COL,
              date_format=None,
              tz=None,
              freq="D",
              pipeline=pipeline,
              estimator=ProphetEstimator(),  # IGNORED, uses pipeline's estimator instead
              hyperparameter_grid=hyperparameter_grid,
              hyperparameter_budget=1,
              n_jobs=-1,
              forecast_horizon=None,
              coverage=0.99,  # IGNORED, uses pipeline's coverage instead
              test_horizon=None,
              agg_periods=None,
              agg_func=None,
              score_func=EvaluationMetricEnum.MeanAbsoluteError.name,
              score_func_greater_is_better=False,
              null_model_params={
                  "strategy": "quantile",
                  "quantile": 0.5,
              },  # IGNORED, uses pipeline's null model instead
              cv_horizon=None,
              cv_expanding_window=False,
              cv_use_most_recent_splits=True,
              cv_min_train_periods=None,
              cv_periods_between_splits=200,
              cv_periods_between_train_test=0,
              cv_max_splits=3,
          )
          check_forecast_pipeline_result(
              result,
              coverage=coverage,
              expected_grid_size=1,
              lower_bound_cv=0.0,
              score_func=EvaluationMetricEnum.MeanAbsoluteError.name,
              greater_is_better=False,
          )
          assert (
              "There is only one CV split" in record[0].message.args[0]
          )
  
          # tests whether the pipeline properties were used
          estimator = result.model.steps[-1][-1]
          assert estimator.null_model_params is None
          assert estimator.coverage is coverage
          assert estimator.score_func([1.0], [3.0]) == 4.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 20 for calling a global function with example usage: test_custom_pipeline() without return types