From 28c1cd29491362042934162011e35c5e43eec539 Mon Sep 17 00:00:00 2001 From: Vikas Pandey Date: Wed, 13 Aug 2025 16:39:02 +0000 Subject: [PATCH 1/3] add troubleshooting.md and make errors/exceptions to point user to troubleshooting --- ads/opctl/operator/lowcode/forecast/errors.py | 2 ++ .../lowcode/forecast/model/base_model.py | 1 + .../lowcode/forecast/model/factory.py | 1 + .../lowcode/forecast/model/troubleshooting.MD | 24 +++++++++++++++++++ .../lowcode/forecast/model_evaluator.py | 1 + 5 files changed, 29 insertions(+) create mode 100644 ads/opctl/operator/lowcode/forecast/model/troubleshooting.MD diff --git a/ads/opctl/operator/lowcode/forecast/errors.py b/ads/opctl/operator/lowcode/forecast/errors.py index c71580864..f2477b26d 100644 --- a/ads/opctl/operator/lowcode/forecast/errors.py +++ b/ads/opctl/operator/lowcode/forecast/errors.py @@ -12,6 +12,7 @@ def __init__(self, error: str): "Invalid forecast operator specification. Check the YAML structure and ensure it " "complies with the required schema for forecast operator. \n" f"{error}" + "\nPlease refer to the troubleshooting guide at https://github.com/oracle/accelerated-data-science/blob/main/ads/opctl/operator/lowcode/forecast/model/troubleshooting.MD for resolution steps." ) @@ -23,4 +24,5 @@ def __init__(self, error: str): "Invalid input data. Check the input data and ensure it " "complies with the validation criteria. \n" f"{error}" + "\nPlease refer to the troubleshooting guide at https://github.com/oracle/accelerated-data-science/blob/main/ads/opctl/operator/lowcode/forecast/model/troubleshooting.MD for resolution steps." ) diff --git a/ads/opctl/operator/lowcode/forecast/model/base_model.py b/ads/opctl/operator/lowcode/forecast/model/base_model.py index d5b225519..24913a031 100644 --- a/ads/opctl/operator/lowcode/forecast/model/base_model.py +++ b/ads/opctl/operator/lowcode/forecast/model/base_model.py @@ -719,6 +719,7 @@ def _validate_automlx_explanation_mode(self): raise ValueError( "AUTOMLX explanation accuracy mode is only supported for AutoMLX models. " "Please select mode other than AUTOMLX from the available explanations_accuracy_mode options" + "\nPlease refer to the troubleshooting guide at https://github.com/oracle/accelerated-data-science/blob/main/ads/opctl/operator/lowcode/forecast/model/troubleshooting.MD for resolution steps." ) @runtime_dependency( diff --git a/ads/opctl/operator/lowcode/forecast/model/factory.py b/ads/opctl/operator/lowcode/forecast/model/factory.py index 09583c58b..07e9677d6 100644 --- a/ads/opctl/operator/lowcode/forecast/model/factory.py +++ b/ads/opctl/operator/lowcode/forecast/model/factory.py @@ -21,6 +21,7 @@ def __init__(self, model_type: str): super().__init__( f"Model: `{model_type}` " f"is not supported. Supported models: {SupportedModels.values()}" + "\nPlease refer to the troubleshooting guide at https://github.com/oracle/accelerated-data-science/blob/main/ads/opctl/operator/lowcode/forecast/model/troubleshooting.MD for resolution steps." ) diff --git a/ads/opctl/operator/lowcode/forecast/model/troubleshooting.MD b/ads/opctl/operator/lowcode/forecast/model/troubleshooting.MD new file mode 100644 index 000000000..345c461fd --- /dev/null +++ b/ads/opctl/operator/lowcode/forecast/model/troubleshooting.MD @@ -0,0 +1,24 @@ +# ADS Forecast Operator Troubleshooting + +Below is a consolidated catalogue of every error class that can be raised by the ADS Forecast Operator, why it occurs, and how to fix or prevent it. + +| Error / Exception | When & Why it is Raised | How to Resolve / Prevent | +| :--- | :--- | :--- | +| **ForecastSchemaYamlError** | Your `forecast.yaml` is syntactically valid YAML but violates the schema (missing required keys, wrong data-types, invalid enum values, etc.). | • Run `adgits operator verify -f forecast.yaml` to see the exact field that is wrong.
• Cross-check against `ads/opctl/operator/lowcode/forecast/schema.yaml` and correct the offending key or value. | +| **ForecastInputDataError** | A required dataset cannot be read or fails validation (e.g. empty file, wrong delimiter, corrupt parquet). | • Ensure the URL / path is correct and accessible (OCI auth for Object Storage, local path otherwise).
• Confirm the file format matches the `format:` field. | +| **DataMismatchError** | 1. Historical dataset’s columns do not equal the set of expected columns (`Transformations._check_historical_dataset()`).
2. Additional data are not aligned with the historical index or horizon (`ForecastDatasets.AdditionalData`). | • Verify the CSV or DB table has exactly: `target_column`, `datetime_column`, and optional `target_category_columns`.
• For additional data, make sure every (Date, Series) that exists in historical data is present, and that it also extends at least `horizon` rows into the future. | +| **InvalidParameterError** | A generic guard around many configuration & ingestion problems. Typical triggers:
• `datetime_column.format` does not match the literal dates.
• Unsupported `format:` value in an InputData section.
• Neither `url` nor `connect_args` provided. | • Supply the correct `strftime` format (`%Y-%m-%d`, `%d/%m/%Y`, …).
• Use one of the allowed formats (`csv`, `excel`, `parquet`, etc.).
• Provide at least one of `url`, `sql`, or `table_name` when using a database connection. | +| **InsufficientDataError** | The auto-select path cannot create the requested number of back-tests (k-fold) because each fold must have at least `2 × horizon` observations (`ModelEvaluator.generate_cutoffs`). | • Decrease `num_backtests`.
• Provide a longer history for the smallest series.
• Switch off auto-select and choose a model explicitly. | +| **UnSupportedModelError** | `spec.model` (or the best candidate from auto-select) is not in the factory’s `_MAP`. | • Choose one of the supported values: `prophet`, `arima`, `neuralprophet`, `automlx`, `autots`, or `auto-select`. | +| **ValueError – AUTOMLX explanation mode** | `explanations_accuracy_mode == AUTOMLX` but the selected model is not AutoMLX. | • Set `explanations_accuracy_mode` to `HIGH_ACCURACY`, `BALANCED` or `FAST_APPROXIMATE`, or force the model to `automlx`. | +| **Exception – “Could not determine datetime type … specify format explicitly”** | Datetime parsing failed because the operator could not infer the format. | • Add `datetime_column.format:` in YAML with an explicit strftime string matching the file. | +| **Generic training / prediction exceptions** | Any framework-specific failure that bubbles up during `_build_model()` (e.g. fitting fails due to constant series, convergence failures, memory errors). The operator catches many of these and either:
• Records the message in `errors.json` and continues with the remaining series. | • Inspect `errors.json` inside `output_directory` for the real stack trace. | + +--- + +### Quick Triage Checklist + +- Run `ads operator verify -f forecast.yaml` – fixes most schema issues before execution. +- Preview the first few rows of every CSV you reference; check column names. +- Validate your datetime column with `pd.to_datetime(..., format='…')` in a notebook. +- For Forecasting with additional data, make sure every (Date, Series) that exists in historical data is present, and that it also extends at least `horizon` rows into the future. diff --git a/ads/opctl/operator/lowcode/forecast/model_evaluator.py b/ads/opctl/operator/lowcode/forecast/model_evaluator.py index ad11f19bd..2681498e1 100644 --- a/ads/opctl/operator/lowcode/forecast/model_evaluator.py +++ b/ads/opctl/operator/lowcode/forecast/model_evaluator.py @@ -79,6 +79,7 @@ def generate_k_fold_data( raise InsufficientDataError( "Insufficient data to evaluate multiple models. Please specify a model " "instead of using auto-select." + "\nPlease refer to the troubleshooting guide at https://github.com/oracle/accelerated-data-science/blob/main/ads/opctl/operator/lowcode/forecast/model/troubleshooting.MD for resolution steps." ) training_datasets = [ sampled_historical_data[sampled_historical_data[date_col] <= cut_off_date] From 2400e11a9a3614cbede58f77b8ef4b2a75bb4985 Mon Sep 17 00:00:00 2001 From: Vikas Pandey Date: Thu, 21 Aug 2025 14:27:17 +0000 Subject: [PATCH 2/3] Add troubleshooting guide link to error messages and moved troubleshooting.md to ai-samples repo --- ads/opctl/operator/lowcode/forecast/const.py | 1 + ads/opctl/operator/lowcode/forecast/errors.py | 7 ++++-- .../lowcode/forecast/model/base_model.py | 3 ++- .../lowcode/forecast/model/factory.py | 9 +++++-- .../forecast/model/forecast_datasets.py | 13 ++++++++-- .../lowcode/forecast/model/troubleshooting.MD | 24 ------------------- .../lowcode/forecast/model_evaluator.py | 8 +++++-- 7 files changed, 32 insertions(+), 33 deletions(-) delete mode 100644 ads/opctl/operator/lowcode/forecast/model/troubleshooting.MD diff --git a/ads/opctl/operator/lowcode/forecast/const.py b/ads/opctl/operator/lowcode/forecast/const.py index 88eb05b22..ec44dffcc 100644 --- a/ads/opctl/operator/lowcode/forecast/const.py +++ b/ads/opctl/operator/lowcode/forecast/const.py @@ -90,3 +90,4 @@ class ForecastOutputColumns(ExtendedEnum): RENDER_LIMIT = 5000 AUTO_SELECT = "auto-select" BACKTEST_REPORT_NAME = "back_test.csv" +TROUBLESHOOTING_GUIDE = "https://github.com/oracle-samples/oci-data-science-ai-samples/blob/main/ai-operators/troubleshooting.md" diff --git a/ads/opctl/operator/lowcode/forecast/errors.py b/ads/opctl/operator/lowcode/forecast/errors.py index f2477b26d..87afc2d8e 100644 --- a/ads/opctl/operator/lowcode/forecast/errors.py +++ b/ads/opctl/operator/lowcode/forecast/errors.py @@ -4,6 +4,9 @@ # Copyright (c) 2023 Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ +from ads.opctl.operator.lowcode.forecast.const import TROUBLESHOOTING_GUIDE + + class ForecastSchemaYamlError(Exception): """Exception raised when there is an issue with the schema.""" @@ -12,7 +15,7 @@ def __init__(self, error: str): "Invalid forecast operator specification. Check the YAML structure and ensure it " "complies with the required schema for forecast operator. \n" f"{error}" - "\nPlease refer to the troubleshooting guide at https://github.com/oracle/accelerated-data-science/blob/main/ads/opctl/operator/lowcode/forecast/model/troubleshooting.MD for resolution steps." + f"\nPlease refer to the troubleshooting guide at {TROUBLESHOOTING_GUIDE} for resolution steps." ) @@ -24,5 +27,5 @@ def __init__(self, error: str): "Invalid input data. Check the input data and ensure it " "complies with the validation criteria. \n" f"{error}" - "\nPlease refer to the troubleshooting guide at https://github.com/oracle/accelerated-data-science/blob/main/ads/opctl/operator/lowcode/forecast/model/troubleshooting.MD for resolution steps." + f"\nPlease refer to the troubleshooting guide at {TROUBLESHOOTING_GUIDE} for resolution steps." ) diff --git a/ads/opctl/operator/lowcode/forecast/model/base_model.py b/ads/opctl/operator/lowcode/forecast/model/base_model.py index 24913a031..47929dda0 100644 --- a/ads/opctl/operator/lowcode/forecast/model/base_model.py +++ b/ads/opctl/operator/lowcode/forecast/model/base_model.py @@ -50,6 +50,7 @@ SpeedAccuracyMode, SupportedMetrics, SupportedModels, + TROUBLESHOOTING_GUIDE, ) from ..operator_config import ForecastOperatorConfig, ForecastOperatorSpec from .forecast_datasets import ForecastDatasets, ForecastResults @@ -719,7 +720,7 @@ def _validate_automlx_explanation_mode(self): raise ValueError( "AUTOMLX explanation accuracy mode is only supported for AutoMLX models. " "Please select mode other than AUTOMLX from the available explanations_accuracy_mode options" - "\nPlease refer to the troubleshooting guide at https://github.com/oracle/accelerated-data-science/blob/main/ads/opctl/operator/lowcode/forecast/model/troubleshooting.MD for resolution steps." + f"\nPlease refer to the troubleshooting guide at {TROUBLESHOOTING_GUIDE} for resolution steps." ) @runtime_dependency( diff --git a/ads/opctl/operator/lowcode/forecast/model/factory.py b/ads/opctl/operator/lowcode/forecast/model/factory.py index 07e9677d6..854d15a05 100644 --- a/ads/opctl/operator/lowcode/forecast/model/factory.py +++ b/ads/opctl/operator/lowcode/forecast/model/factory.py @@ -3,7 +3,12 @@ # Copyright (c) 2023, 2024 Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ -from ..const import AUTO_SELECT, SpeedAccuracyMode, SupportedModels +from ..const import ( + AUTO_SELECT, + TROUBLESHOOTING_GUIDE, + SpeedAccuracyMode, + SupportedModels, +) from ..model_evaluator import ModelEvaluator from ..operator_config import ForecastOperatorConfig from .arima import ArimaOperatorModel @@ -21,7 +26,7 @@ def __init__(self, model_type: str): super().__init__( f"Model: `{model_type}` " f"is not supported. Supported models: {SupportedModels.values()}" - "\nPlease refer to the troubleshooting guide at https://github.com/oracle/accelerated-data-science/blob/main/ads/opctl/operator/lowcode/forecast/model/troubleshooting.MD for resolution steps." + f"\nPlease refer to the troubleshooting guide at {TROUBLESHOOTING_GUIDE} for resolution steps." ) diff --git a/ads/opctl/operator/lowcode/forecast/model/forecast_datasets.py b/ads/opctl/operator/lowcode/forecast/model/forecast_datasets.py index 342721c83..5aafa0888 100644 --- a/ads/opctl/operator/lowcode/forecast/model/forecast_datasets.py +++ b/ads/opctl/operator/lowcode/forecast/model/forecast_datasets.py @@ -18,7 +18,7 @@ get_frequency_of_datetime, ) -from ..const import ForecastOutputColumns, SupportedModels +from ..const import ForecastOutputColumns, SupportedModels, TROUBLESHOOTING_GUIDE from ..operator_config import ForecastOperatorConfig @@ -48,7 +48,8 @@ def _verify_dt_col(self, spec): f"{SupportedModels.AutoMLX} requires data with a frequency of at least one hour. Please try using a different model," " or select the 'auto' option." ) - raise InvalidParameterError(message) + raise InvalidParameterError(f"{message}" + f"\nPlease refer to the troubleshooting guide at {TROUBLESHOOTING_GUIDE} for resolution steps.") class AdditionalData(AbstractData): @@ -63,10 +64,12 @@ def __init__(self, spec, historical_data, additional_data=None): if historical_data.get_max_time() > add_dates[-spec.horizon]: raise DataMismatchError( f"The Historical Data ends on {historical_data.get_max_time()}. The additional data horizon starts on {add_dates[-spec.horizon]}. The horizon should have exactly {spec.horizon} dates after the Historical at a frequency of {historical_data.freq}" + f"\nPlease refer to the troubleshooting guide at {TROUBLESHOOTING_GUIDE} for resolution steps." ) elif historical_data.get_max_time() != add_dates[-(spec.horizon + 1)]: raise DataMismatchError( f"The Additional Data must be present for all historical data and the entire horizon. The Historical Data ends on {historical_data.get_max_time()}. The additonal data horizon starts after {add_dates[-(spec.horizon+1)]}. These should be the same date." + f"\nPlease refer to the troubleshooting guide at {TROUBLESHOOTING_GUIDE} for resolution steps." ) else: self.name = "additional_data" @@ -210,6 +213,7 @@ def get_data_at_series(self, s_id, include_horizon=True): except Exception as e: raise InvalidParameterError( f"Unable to retrieve series id: {s_id} from data. Available series ids are: {self.list_series_ids()}" + f"\nPlease refer to the troubleshooting guide at {TROUBLESHOOTING_GUIDE} for resolution steps." ) from e def get_horizon_at_series(self, s_id): @@ -291,6 +295,7 @@ def add_series_id( if not overwrite and series_id in self.series_id_map: raise ValueError( f"Attempting to update ForecastOutput for series_id {series_id} when this already exists. Set overwrite to True." + f"\nPlease refer to the troubleshooting guide at {TROUBLESHOOTING_GUIDE} for resolution steps." ) forecast = self._check_forecast_format(forecast) self.series_id_map[series_id] = forecast @@ -331,6 +336,7 @@ def populate_series_output( except KeyError as e: raise ValueError( f"Attempting to update output for series: {series_id}, however no series output has been initialized." + f"\nPlease refer to the troubleshooting guide at {TROUBLESHOOTING_GUIDE} for resolution steps." ) from e if (output_i.shape[0] - self.horizon) == len(fit_val): @@ -351,18 +357,21 @@ def populate_series_output( if len(forecast_val) != self.horizon: raise ValueError( f"Attempting to set forecast along horizon ({self.horizon}) for series: {series_id}, however forecast is only length {len(forecast_val)}" + f"\nPlease refer to the troubleshooting guide at {TROUBLESHOOTING_GUIDE} for resolution steps." ) output_i["forecast_value"].iloc[-self.horizon :] = forecast_val if len(upper_bound) != self.horizon: raise ValueError( f"Attempting to set upper_bound along horizon ({self.horizon}) for series: {series_id}, however upper_bound is only length {len(upper_bound)}" + f"\nPlease refer to the troubleshooting guide at {TROUBLESHOOTING_GUIDE} for resolution steps." ) output_i[self.upper_bound_name].iloc[-self.horizon :] = upper_bound if len(lower_bound) != self.horizon: raise ValueError( f"Attempting to set lower_bound along horizon ({self.horizon}) for series: {series_id}, however lower_bound is only length {len(lower_bound)}" + f"\nPlease refer to the troubleshooting guide at {TROUBLESHOOTING_GUIDE} for resolution steps." ) output_i[self.lower_bound_name].iloc[-self.horizon :] = lower_bound diff --git a/ads/opctl/operator/lowcode/forecast/model/troubleshooting.MD b/ads/opctl/operator/lowcode/forecast/model/troubleshooting.MD deleted file mode 100644 index 345c461fd..000000000 --- a/ads/opctl/operator/lowcode/forecast/model/troubleshooting.MD +++ /dev/null @@ -1,24 +0,0 @@ -# ADS Forecast Operator Troubleshooting - -Below is a consolidated catalogue of every error class that can be raised by the ADS Forecast Operator, why it occurs, and how to fix or prevent it. - -| Error / Exception | When & Why it is Raised | How to Resolve / Prevent | -| :--- | :--- | :--- | -| **ForecastSchemaYamlError** | Your `forecast.yaml` is syntactically valid YAML but violates the schema (missing required keys, wrong data-types, invalid enum values, etc.). | • Run `adgits operator verify -f forecast.yaml` to see the exact field that is wrong.
• Cross-check against `ads/opctl/operator/lowcode/forecast/schema.yaml` and correct the offending key or value. | -| **ForecastInputDataError** | A required dataset cannot be read or fails validation (e.g. empty file, wrong delimiter, corrupt parquet). | • Ensure the URL / path is correct and accessible (OCI auth for Object Storage, local path otherwise).
• Confirm the file format matches the `format:` field. | -| **DataMismatchError** | 1. Historical dataset’s columns do not equal the set of expected columns (`Transformations._check_historical_dataset()`).
2. Additional data are not aligned with the historical index or horizon (`ForecastDatasets.AdditionalData`). | • Verify the CSV or DB table has exactly: `target_column`, `datetime_column`, and optional `target_category_columns`.
• For additional data, make sure every (Date, Series) that exists in historical data is present, and that it also extends at least `horizon` rows into the future. | -| **InvalidParameterError** | A generic guard around many configuration & ingestion problems. Typical triggers:
• `datetime_column.format` does not match the literal dates.
• Unsupported `format:` value in an InputData section.
• Neither `url` nor `connect_args` provided. | • Supply the correct `strftime` format (`%Y-%m-%d`, `%d/%m/%Y`, …).
• Use one of the allowed formats (`csv`, `excel`, `parquet`, etc.).
• Provide at least one of `url`, `sql`, or `table_name` when using a database connection. | -| **InsufficientDataError** | The auto-select path cannot create the requested number of back-tests (k-fold) because each fold must have at least `2 × horizon` observations (`ModelEvaluator.generate_cutoffs`). | • Decrease `num_backtests`.
• Provide a longer history for the smallest series.
• Switch off auto-select and choose a model explicitly. | -| **UnSupportedModelError** | `spec.model` (or the best candidate from auto-select) is not in the factory’s `_MAP`. | • Choose one of the supported values: `prophet`, `arima`, `neuralprophet`, `automlx`, `autots`, or `auto-select`. | -| **ValueError – AUTOMLX explanation mode** | `explanations_accuracy_mode == AUTOMLX` but the selected model is not AutoMLX. | • Set `explanations_accuracy_mode` to `HIGH_ACCURACY`, `BALANCED` or `FAST_APPROXIMATE`, or force the model to `automlx`. | -| **Exception – “Could not determine datetime type … specify format explicitly”** | Datetime parsing failed because the operator could not infer the format. | • Add `datetime_column.format:` in YAML with an explicit strftime string matching the file. | -| **Generic training / prediction exceptions** | Any framework-specific failure that bubbles up during `_build_model()` (e.g. fitting fails due to constant series, convergence failures, memory errors). The operator catches many of these and either:
• Records the message in `errors.json` and continues with the remaining series. | • Inspect `errors.json` inside `output_directory` for the real stack trace. | - ---- - -### Quick Triage Checklist - -- Run `ads operator verify -f forecast.yaml` – fixes most schema issues before execution. -- Preview the first few rows of every CSV you reference; check column names. -- Validate your datetime column with `pd.to_datetime(..., format='…')` in a notebook. -- For Forecasting with additional data, make sure every (Date, Series) that exists in historical data is present, and that it also extends at least `horizon` rows into the future. diff --git a/ads/opctl/operator/lowcode/forecast/model_evaluator.py b/ads/opctl/operator/lowcode/forecast/model_evaluator.py index 2681498e1..d5986703e 100644 --- a/ads/opctl/operator/lowcode/forecast/model_evaluator.py +++ b/ads/opctl/operator/lowcode/forecast/model_evaluator.py @@ -10,7 +10,10 @@ from ads.opctl import logger from ads.opctl.operator.lowcode.common.const import DataColumns from ads.opctl.operator.lowcode.common.errors import InsufficientDataError -from ads.opctl.operator.lowcode.forecast.const import BACKTEST_REPORT_NAME +from ads.opctl.operator.lowcode.forecast.const import ( + BACKTEST_REPORT_NAME, + TROUBLESHOOTING_GUIDE, +) from ads.opctl.operator.lowcode.forecast.model.factory import SupportedModels from .model.forecast_datasets import ForecastDatasets @@ -79,7 +82,7 @@ def generate_k_fold_data( raise InsufficientDataError( "Insufficient data to evaluate multiple models. Please specify a model " "instead of using auto-select." - "\nPlease refer to the troubleshooting guide at https://github.com/oracle/accelerated-data-science/blob/main/ads/opctl/operator/lowcode/forecast/model/troubleshooting.MD for resolution steps." + f"\nPlease refer to the troubleshooting guide at {TROUBLESHOOTING_GUIDE} for resolution steps." ) training_datasets = [ sampled_historical_data[sampled_historical_data[date_col] <= cut_off_date] @@ -224,6 +227,7 @@ def find_best_model( model = SupportedModels.Prophet logger.error( f"Running {model} model as auto-select failed with the following error: {e.message}" + f"\nPlease refer to the troubleshooting guide at {TROUBLESHOOTING_GUIDE} for resolution steps." ) return model nonempty_metrics = { From b9bd1660cf26c879eff37c3b5db0735b1b2e16ef Mon Sep 17 00:00:00 2001 From: Vikas Pandey Date: Thu, 21 Aug 2025 14:39:26 +0000 Subject: [PATCH 3/3] import fix --- ads/opctl/operator/lowcode/forecast/model/factory.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ads/opctl/operator/lowcode/forecast/model/factory.py b/ads/opctl/operator/lowcode/forecast/model/factory.py index 57fe9e5b9..262fe5bbc 100644 --- a/ads/opctl/operator/lowcode/forecast/model/factory.py +++ b/ads/opctl/operator/lowcode/forecast/model/factory.py @@ -3,14 +3,15 @@ # Copyright (c) 2023, 2024 Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ +from ads.opctl.operator.lowcode.common.transformations import Transformations + from ..const import ( AUTO_SELECT, - AUTO_SELECT_SERIES + AUTO_SELECT_SERIES, TROUBLESHOOTING_GUIDE, SpeedAccuracyMode, SupportedModels, ) -from ads.opctl.operator.lowcode.common.transformations import Transformations from ..meta_selector import MetaSelector from ..model_evaluator import ModelEvaluator from ..operator_config import ForecastOperatorConfig