diff --git a/soda/athena/setup.py b/soda/athena/setup.py index 8f9e31341..74a8aff91 100644 --- a/soda/athena/setup.py +++ b/soda/athena/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-athena" -package_version = "3.1.3" +package_version = "3.1.4" description = "Soda Core Athena Package" requires = [ diff --git a/soda/bigquery/setup.py b/soda/bigquery/setup.py index b7ab1128b..5e5286e75 100644 --- a/soda/bigquery/setup.py +++ b/soda/bigquery/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-bigquery" -package_version = "3.1.3" +package_version = "3.1.4" description = "Soda Core Bigquery Package" requires = [ diff --git a/soda/contracts/setup.py b/soda/contracts/setup.py index 29d96ec99..149cadc21 100644 --- a/soda/contracts/setup.py +++ b/soda/contracts/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-contracts" -package_version = "3.1.3" +package_version = "3.1.4" description = "Soda Core Contracts Package" requires = [ diff --git a/soda/core/setup.py b/soda/core/setup.py index d4a0559b2..1d85ba076 100644 --- a/soda/core/setup.py +++ b/soda/core/setup.py @@ -4,7 +4,7 @@ package_name = "soda-core" # Managed by tbump - do not change manually -package_version = "3.1.3" +package_version = "3.1.4" description = "Soda Core" requires = [ diff --git a/soda/core/soda/__version__.py b/soda/core/soda/__version__.py index 1ac98544e..5643b82c5 100644 --- a/soda/core/soda/__version__.py +++ b/soda/core/soda/__version__.py @@ -1 +1 @@ -SODA_CORE_VERSION = "3.1.3" +SODA_CORE_VERSION = "3.1.4" diff --git a/soda/core/soda/sodacl/anomaly_detection_metric_check_cfg.py b/soda/core/soda/sodacl/anomaly_detection_metric_check_cfg.py index 02b019fc6..21378e093 100644 --- a/soda/core/soda/sodacl/anomaly_detection_metric_check_cfg.py +++ b/soda/core/soda/sodacl/anomaly_detection_metric_check_cfg.py @@ -150,6 +150,7 @@ class HyperparameterConfigs(ADBaseModel): class ModelConfigs(ADBaseModel): type: str = "prophet" + holidays_country_code: Optional[str] = None hyperparameters: HyperparameterConfigs = HyperparameterConfigs() diff --git a/soda/core/tests/data_source/test_anomaly_detection_check.py b/soda/core/tests/data_source/test_anomaly_detection_check.py index dcd7923eb..d79224382 100644 --- a/soda/core/tests/data_source/test_anomaly_detection_check.py +++ b/soda/core/tests/data_source/test_anomaly_detection_check.py @@ -503,6 +503,64 @@ def test_anomaly_detection_static_hyperparameters(data_source_fixture: DataSourc scan.assert_all_checks_pass() +@pytest.mark.skipif( + condition=os.getenv("SCIENTIFIC_TESTS") == "SKIP", + reason="Environment variable SCIENTIFIC_TESTS is set to SKIP which skips tests depending on the scientific package", +) +def test_anomaly_detection_static_hyperparameters_built_in_holidays(data_source_fixture: DataSourceFixture) -> None: + table_name = data_source_fixture.ensure_test_table(customers_test_table) + + scan = data_source_fixture.create_test_scan() + + scan.add_sodacl_yaml_str( + f""" + checks for {table_name}: + - anomaly detection for row_count: + model: + type: prophet + holidays_country_code: TR + """ + ) + metric_values = [10, 10, 10, 9, 8, 0, 0, 0, 0] + scan.mock_historic_values( + metric_identity=f"metric-{scan._scan_definition_name}-{scan._data_source_name}-{table_name}-row_count", + metric_values=metric_values, + time_generator=TimeGenerator(), + ) + scan.execute() + scan.assert_all_checks_pass() + + +@pytest.mark.skipif( + condition=os.getenv("SCIENTIFIC_TESTS") == "SKIP", + reason="Environment variable SCIENTIFIC_TESTS is set to SKIP which skips tests depending on the scientific package", +) +def test_anomaly_detection_static_hyperparameters_wrong_built_in_holidays( + data_source_fixture: DataSourceFixture, +) -> None: + table_name = data_source_fixture.ensure_test_table(customers_test_table) + + scan = data_source_fixture.create_test_scan() + + scan.add_sodacl_yaml_str( + f""" + checks for {table_name}: + - anomaly detection for row_count: + model: + type: prophet + holidays_country_code: invalid_country_code + """ + ) + metric_values = [10, 10, 10, 9, 8, 0, 0, 0, 0] + scan.mock_historic_values( + metric_identity=f"metric-{scan._scan_definition_name}-{scan._data_source_name}-{table_name}-row_count", + metric_values=metric_values, + time_generator=TimeGenerator(), + ) + scan.execute(allow_error_warning=True) + scan.assert_all_checks_skipped() + + @pytest.mark.skipif( condition=os.getenv("SCIENTIFIC_TESTS") == "SKIP", reason="Environment variable SCIENTIFIC_TESTS is set to SKIP which skips tests depending on the scientific package", diff --git a/soda/dask/setup.py b/soda/dask/setup.py index 8f371fd43..cec02d247 100644 --- a/soda/dask/setup.py +++ b/soda/dask/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-pandas-dask" -package_version = "3.1.3" +package_version = "3.1.4" description = "Soda Core Dask Package" requires = [f"soda-core=={package_version}", "dask>=2022.10.0", "dask-sql>=2022.12.0,<2023.6.0"] diff --git a/soda/db2/setup.py b/soda/db2/setup.py index 968f5914c..6d0e77292 100644 --- a/soda/db2/setup.py +++ b/soda/db2/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-db2" -package_version = "3.1.3" +package_version = "3.1.4" # TODO Add proper description description = "Soda Core IBM DB2 Package" diff --git a/soda/dbt/setup.py b/soda/dbt/setup.py index 811d01184..58662c81f 100644 --- a/soda/dbt/setup.py +++ b/soda/dbt/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-dbt" -package_version = "3.1.3" +package_version = "3.1.4" description = "Soda Core dbt Package" requires = [ diff --git a/soda/denodo/setup.py b/soda/denodo/setup.py index b52b0eaa1..266483902 100644 --- a/soda/denodo/setup.py +++ b/soda/denodo/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-denodo" -package_version = "3.1.3" +package_version = "3.1.4" # TODO Add proper description description = "Soda Core Denodo Package" diff --git a/soda/dremio/setup.py b/soda/dremio/setup.py index fea365463..a7ee82750 100644 --- a/soda/dremio/setup.py +++ b/soda/dremio/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-dremio" -package_version = "3.1.3" +package_version = "3.1.4" description = "Soda Core Dremio Package" requires = [f"soda-core=={package_version}", "pyodbc", "pyarrow"] diff --git a/soda/duckdb/setup.py b/soda/duckdb/setup.py index 4bcd85f7a..90b61898c 100644 --- a/soda/duckdb/setup.py +++ b/soda/duckdb/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-duckdb" -package_version = "3.1.3" +package_version = "3.1.4" description = "Soda Core Duckdb Package" requires = [f"soda-core=={package_version}", "duckdb"] diff --git a/soda/mysql/setup.py b/soda/mysql/setup.py index ce968375d..67e4d6c37 100644 --- a/soda/mysql/setup.py +++ b/soda/mysql/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-mysql" -package_version = "3.1.3" +package_version = "3.1.4" description = "Soda Core MySQL Package" requires = [ diff --git a/soda/oracle/setup.py b/soda/oracle/setup.py index f85cc19c7..2d70739fd 100644 --- a/soda/oracle/setup.py +++ b/soda/oracle/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-oracle" -package_version = "3.1.3" +package_version = "3.1.4" # TODO Add proper description description = "Soda Core Oracle Package" diff --git a/soda/postgres/setup.py b/soda/postgres/setup.py index e3b3e97c8..2edb10909 100644 --- a/soda/postgres/setup.py +++ b/soda/postgres/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-postgres" -package_version = "3.1.3" +package_version = "3.1.4" # TODO Add proper description description = "Soda Core Postgres Package" diff --git a/soda/redshift/setup.py b/soda/redshift/setup.py index 2e7b04a10..0f83a83a2 100644 --- a/soda/redshift/setup.py +++ b/soda/redshift/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-redshift" -package_version = "3.1.3" +package_version = "3.1.4" description = "Soda Core Redshift Package" requires = [f"soda-core=={package_version}", "boto3", "psycopg2-binary>=2.8.5, <3.0"] diff --git a/soda/scientific/setup.py b/soda/scientific/setup.py index 996626d71..093032e0a 100644 --- a/soda/scientific/setup.py +++ b/soda/scientific/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-scientific" -package_version = "3.1.3" +package_version = "3.1.4" description = "Soda Core Scientific Package" requires = [ f"soda-core=={package_version}", diff --git a/soda/scientific/soda/scientific/anomaly_detection_v2/anomaly_detector.py b/soda/scientific/soda/scientific/anomaly_detection_v2/anomaly_detector.py index 113b8b1f8..bcc488a61 100644 --- a/soda/scientific/soda/scientific/anomaly_detection_v2/anomaly_detector.py +++ b/soda/scientific/soda/scientific/anomaly_detection_v2/anomaly_detector.py @@ -46,7 +46,7 @@ def evaluate(self) -> Tuple[str, Dict[str, Any]]: logs=self._logs, params=self.params, time_series_df=feedback_processed_df, - hyperparamaters_cfg=self.model_cfg.hyperparameters, + model_cfg=self.model_cfg, training_dataset_params=self.training_dataset_params, has_exogenous_regressor=has_exogenous_regressor, ) diff --git a/soda/scientific/soda/scientific/anomaly_detection_v2/exceptions.py b/soda/scientific/soda/scientific/anomaly_detection_v2/exceptions.py index 4151724f1..6956a26f9 100644 --- a/soda/scientific/soda/scientific/anomaly_detection_v2/exceptions.py +++ b/soda/scientific/soda/scientific/anomaly_detection_v2/exceptions.py @@ -17,3 +17,10 @@ class FreqDetectionResultError(Exception): To be raised and passed as a result error message down the line. """ + + +class NotSupportedHolidayCountryError(Exception): + """Thrown in case of wrong holiday country. + + To be raised and passed as a result error message down the line. + """ diff --git a/soda/scientific/soda/scientific/anomaly_detection_v2/models/prophet_model.py b/soda/scientific/soda/scientific/anomaly_detection_v2/models/prophet_model.py index 14fc9827c..32b71d29c 100644 --- a/soda/scientific/soda/scientific/anomaly_detection_v2/models/prophet_model.py +++ b/soda/scientific/soda/scientific/anomaly_detection_v2/models/prophet_model.py @@ -14,6 +14,7 @@ from soda.common.logs import Logs from soda.sodacl.anomaly_detection_metric_check_cfg import ( HyperparameterConfigs, + ModelConfigs, ProphetDefaultHyperparameters, TrainingDatasetParameters, ) @@ -22,6 +23,7 @@ from soda.scientific.anomaly_detection_v2.exceptions import ( AggregationValueError, FreqDetectionResultError, + NotSupportedHolidayCountryError, ) from soda.scientific.anomaly_detection_v2.frequency_detector import FrequencyDetector from soda.scientific.anomaly_detection_v2.globals import ( @@ -47,7 +49,7 @@ def __init__( logs: Logs, params: Dict[str, Any], time_series_df: pd.DataFrame, - hyperparamaters_cfg: HyperparameterConfigs, + model_cfg: ModelConfigs, training_dataset_params: TrainingDatasetParameters, has_exogenous_regressor: bool = False, ) -> None: @@ -57,7 +59,7 @@ def __init__( params (Dict[str, Any]): config class parsed from detector_config.yml. time_series_df (pd.DataFrame): time series data to be used for training and prediction. logs (Logs): logging object. - hyperparamaters_cfg (HyperparameterConfigs): hyperparameter configs. + model_cfg (ModelConfigs): hyperparameter configs. training_dataset_params (TrainingDatasetParameters): training dataset configs. has_exogenous_regressor (bool, optional): whether the time series data has an exogenous regressor. Defaults to False. @@ -77,7 +79,8 @@ def __init__( self.logs = logs self.params = params self.raw_time_series_df = time_series_df - self.hyperparamaters_cfg = hyperparamaters_cfg + self.model_cfg = model_cfg + self.hyperparamaters_cfg = model_cfg.hyperparameters self.training_dataset_params = training_dataset_params self.has_exogenous_regressor = has_exogenous_regressor @@ -265,6 +268,17 @@ def setup_fit_predict( f"Anomaly Detection: Fitting prophet model with the following parameters:\n{model_hyperparameters.model_dump_json(indent=4)}" ) model = Prophet(**model_hyperparameters.model_dump()) + holidays_country_code = self.model_cfg.holidays_country_code + # Add country specific holidays + if holidays_country_code is not None: + try: + model = model.add_country_holidays(country_name=holidays_country_code) + except AttributeError: + raise NotSupportedHolidayCountryError( + f"Anomaly Detection Error: Country '{holidays_country_code}' is not supported. " + "The list of supported countries can be found here: " + "https://github.com/vacanza/python-holidays/" + ) if "external_regressor" in time_series_df: self.logs.info( "Anomaly Detection: Found a custom external_regressor derived from user feedback and adding it to Prophet model" diff --git a/soda/scientific/tests/anomaly_detection/anomaly_detector_test.py b/soda/scientific/tests/anomaly_detection/anomaly_detector_test.py index b108541ba..be054484f 100644 --- a/soda/scientific/tests/anomaly_detection/anomaly_detector_test.py +++ b/soda/scientific/tests/anomaly_detection/anomaly_detector_test.py @@ -10,10 +10,6 @@ test_feedback_processor_prophet_model_skip_measurements_expectation, test_feedback_processor_seasonality_skip_measurements, test_feedback_processor_seasonality_skip_measurements_expectation, - test_prophet_model_skip_measurements_previousAndThis, - test_prophet_model_skip_measurements_previousAndThis_expectation, - test_prophet_model_skip_measurements_this_exclusive_previous, - test_prophet_model_skip_measurements_this_exclusive_previous_expectation, ) from soda.common.logs import Logs diff --git a/soda/scientific/tests/anomaly_detection_v2/base_model_test.py b/soda/scientific/tests/anomaly_detection_v2/base_model_test.py index ddc8dddd2..a7c7a5811 100644 --- a/soda/scientific/tests/anomaly_detection_v2/base_model_test.py +++ b/soda/scientific/tests/anomaly_detection_v2/base_model_test.py @@ -14,7 +14,6 @@ ) from soda.common.logs import Logs from soda.sodacl.anomaly_detection_metric_check_cfg import ( - HyperparameterConfigs, ModelConfigs, TrainingDatasetParameters, ) @@ -67,7 +66,7 @@ def test_base_model_preprocess(time_series_df: pd.DataFrame, expected_time_serie logs=LOGS, params=PARAMS, time_series_df=time_series_df, - hyperparamaters_cfg=HyperparameterConfigs(), + model_cfg=ModelConfigs(), training_dataset_params=TrainingDatasetParameters(), ) df_preprocessed = detector.preprocess(time_series_df=time_series_df) @@ -121,7 +120,7 @@ def test_base_model_remove_big_gaps(size: int, n_rows_to_convert_none: int, expe logs=LOGS, params=PARAMS, time_series_df=time_series_df, - hyperparamaters_cfg=HyperparameterConfigs(), + model_cfg=ModelConfigs(), training_dataset_params=TrainingDatasetParameters(), ) df_preprocessed = detector.remove_big_gaps_from_time_series( diff --git a/soda/scientific/tests/anomaly_detection_v2/prophet_model_test.py b/soda/scientific/tests/anomaly_detection_v2/prophet_model_test.py index 7e6656ab6..161042c86 100644 --- a/soda/scientific/tests/anomaly_detection_v2/prophet_model_test.py +++ b/soda/scientific/tests/anomaly_detection_v2/prophet_model_test.py @@ -17,10 +17,12 @@ ) from assets.anomaly_detection_assets import ( df_prophet_model_setup_fit_predict, + df_prophet_model_setup_fit_predict_holidays, test_feedback_processor_seasonality_skip_measurements, ) from soda.sodacl.anomaly_detection_metric_check_cfg import ( HyperparameterConfigs, + ModelConfigs, ProphetDefaultHyperparameters, ProphetDynamicHyperparameters, ProphetHyperparameterProfiles, @@ -31,6 +33,7 @@ from soda.scientific.anomaly_detection_v2.exceptions import ( AggregationValueError, FreqDetectionResultError, + NotSupportedHolidayCountryError, ) from soda.scientific.anomaly_detection_v2.feedback_processor import FeedbackProcessor from soda.scientific.anomaly_detection_v2.models.prophet_model import ProphetDetector @@ -42,7 +45,7 @@ def test_with_exit() -> None: logs=LOGS, params=PARAMS, time_series_df=time_series_df, - hyperparamaters_cfg=HyperparameterConfigs(), + model_cfg=ModelConfigs(), training_dataset_params=TrainingDatasetParameters(), ) df_anomalies, frequency_result = detector.run() @@ -76,7 +79,7 @@ def test_with_weekly_seasonality_feedback(check_results: dict) -> None: logs=LOGS, params=PARAMS, time_series_df=df_feedback_processed, - hyperparamaters_cfg=HyperparameterConfigs(), + model_cfg=ModelConfigs(), training_dataset_params=TrainingDatasetParameters(), has_exogenous_regressor=has_exogenous_regressor, ) @@ -118,7 +121,7 @@ def test_apply_training_dataset_configs_with_aggregation_error() -> None: logs=LOGS, params=PARAMS, time_series_df=DAILY_AND_HOURLY_TIME_SERIES_DF, - hyperparamaters_cfg=HyperparameterConfigs(), + model_cfg=ModelConfigs(), training_dataset_params=training_dataset_configs, ) prophet_detector.apply_training_dataset_configs( @@ -135,7 +138,7 @@ def test_apply_training_dataset_configs_with_frequency_error() -> None: logs=LOGS, params=PARAMS, time_series_df=DAILY_AND_HOURLY_TIME_SERIES_DF, - hyperparamaters_cfg=HyperparameterConfigs(), + model_cfg=ModelConfigs(), training_dataset_params=TrainingDatasetParameters(), ) prophet_detector.apply_training_dataset_configs( @@ -150,7 +153,7 @@ def test_not_enough_data() -> None: logs=LOGS, params=PARAMS, time_series_df=time_series_df, - hyperparamaters_cfg=HyperparameterConfigs(), + model_cfg=ModelConfigs(), training_dataset_params=TrainingDatasetParameters(), ) df_anomalies, frequency_result = prophet_detector.run() @@ -175,14 +178,16 @@ def test_get_prophet_hyperparameters_invalid_obhective_metric() -> None: def test_get_prophet_hyperparameters_with_not_enough_data() -> None: - hyperparameter_configs = HyperparameterConfigs( - static=ProphetHyperparameterProfiles(), dynamic=ProphetDynamicHyperparameters(objective_metric="smape") + model_cfg = ModelConfigs( + hyperparameters=HyperparameterConfigs( + static=ProphetHyperparameterProfiles(), dynamic=ProphetDynamicHyperparameters(objective_metric="smape") + ) ) prophet_detector = ProphetDetector( logs=LOGS, params=PARAMS, time_series_df=DAILY_TIME_SERIES_DF, - hyperparamaters_cfg=hyperparameter_configs, + model_cfg=model_cfg, training_dataset_params=TrainingDatasetParameters(), ) best_hyperparameters = prophet_detector.get_prophet_hyperparameters( @@ -215,22 +220,25 @@ def test_get_prophet_hyperparameters_with_tuning( expected_seasonality_prior_scale: float, ) -> None: time_series_df = generate_random_dataframe(size=20, n_rows_to_convert_none=0, frequency="D") - hyperparameter_configs = HyperparameterConfigs( - static=ProphetHyperparameterProfiles(), - dynamic=ProphetDynamicHyperparameters( - objective_metric=objective_metric, - parallelize_cross_validation=False, - parameter_grid=ProphetParameterGrid( - changepoint_prior_scale=[0.05, 0.1], - seasonality_prior_scale=[0.05, 0.1], + model_cfg = ModelConfigs( + hyperparameters=HyperparameterConfigs( + static=ProphetHyperparameterProfiles(), + dynamic=ProphetDynamicHyperparameters( + objective_metric=objective_metric, + parallelize_cross_validation=False, + parameter_grid=ProphetParameterGrid( + changepoint_prior_scale=[0.05, 0.1], + seasonality_prior_scale=[0.05, 0.1], + ), ), - ), + ) ) + prophet_detector = ProphetDetector( logs=LOGS, params=PARAMS, time_series_df=time_series_df, - hyperparamaters_cfg=hyperparameter_configs, + model_cfg=model_cfg, training_dataset_params=TrainingDatasetParameters(), ) best_hyperparameters = prophet_detector.get_prophet_hyperparameters( @@ -255,6 +263,36 @@ def test_setup_fit_predict() -> None: pd.testing.assert_frame_equal(predictions_df, df_prophet_model_setup_fit_predict, check_dtype=False) +def test_setup_fit_predict_holidays() -> None: + prophet_detector = ProphetDetector( + logs=LOGS, + params=PARAMS, + time_series_df=DAILY_AND_HOURLY_TIME_SERIES_DF, + model_cfg=ModelConfigs(holidays_country_code="TR"), + training_dataset_params=TrainingDatasetParameters(), + ) + predictions_df = prophet_detector.setup_fit_predict( + time_series_df=DAILY_TIME_SERIES_DF, model_hyperparameters=ProphetDefaultHyperparameters() + ) + predictions_df = predictions_df[["ds", "yhat", "yhat_lower", "yhat_upper"]] + pd.testing.assert_frame_equal(predictions_df, df_prophet_model_setup_fit_predict_holidays, check_dtype=False) + + +def test_setup_fit_predic_holidays_invalid_country() -> None: + with pytest.raises(NotSupportedHolidayCountryError): + prophet_detector = ProphetDetector( + logs=LOGS, + params=PARAMS, + time_series_df=DAILY_AND_HOURLY_TIME_SERIES_DF, + model_cfg=ModelConfigs(holidays_country_code="invalid_country_code"), + training_dataset_params=TrainingDatasetParameters(), + ) + prophet_detector.setup_fit_predict( + time_series_df=DAILY_TIME_SERIES_DF, + model_hyperparameters=ProphetDefaultHyperparameters(), + ) + + def test_detect_anomalies() -> None: predictions_df = PROPHET_DETECTOR.setup_fit_predict( time_series_df=DAILY_TIME_SERIES_DF, diff --git a/soda/scientific/tests/anomaly_detection_v2/utils.py b/soda/scientific/tests/anomaly_detection_v2/utils.py index cb72cc256..6522e4922 100644 --- a/soda/scientific/tests/anomaly_detection_v2/utils.py +++ b/soda/scientific/tests/anomaly_detection_v2/utils.py @@ -4,7 +4,6 @@ import pandas as pd from soda.common.logs import Logs from soda.sodacl.anomaly_detection_metric_check_cfg import ( - HyperparameterConfigs, ModelConfigs, ProphetDefaultHyperparameters, TrainingDatasetParameters, @@ -68,7 +67,7 @@ def generate_random_dataframe(size: int, n_rows_to_convert_none: int, frequency: logs=LOGS, params=PARAMS, time_series_df=DAILY_AND_HOURLY_TIME_SERIES_DF, - hyperparamaters_cfg=HyperparameterConfigs(), + model_cfg=ModelConfigs(), training_dataset_params=TrainingDatasetParameters(), ) diff --git a/soda/scientific/tests/assets/anomaly_detection_assets.py b/soda/scientific/tests/assets/anomaly_detection_assets.py index 8f5fbe391..b75d98890 100644 --- a/soda/scientific/tests/assets/anomaly_detection_assets.py +++ b/soda/scientific/tests/assets/anomaly_detection_assets.py @@ -712,3 +712,39 @@ }, ] ) + + +df_prophet_model_setup_fit_predict_holidays = pd.DataFrame( + [ + { + "ds": pd.Timestamp("2024-01-01 00:00:00"), + "yhat": 15.5022680244046, + "yhat_lower": 15.241236144533858, + "yhat_upper": 15.765476833866124, + }, + { + "ds": pd.Timestamp("2024-01-02 00:00:00"), + "yhat": 17.06516797206252, + "yhat_lower": 16.74005361195014, + "yhat_upper": 17.389651163715, + }, + { + "ds": pd.Timestamp("2024-01-03 00:00:00"), + "yhat": 16.208493773913087, + "yhat_lower": 15.925356988811041, + "yhat_upper": 16.53266629113661, + }, + { + "ds": pd.Timestamp("2024-01-04 00:00:00"), + "yhat": 15.351819575561906, + "yhat_lower": 15.043435269895564, + "yhat_upper": 15.631571851230651, + }, + { + "ds": pd.Timestamp("2024-01-05 00:00:00"), + "yhat": 14.495145377210724, + "yhat_lower": 14.228666023542353, + "yhat_upper": 14.77512428825481, + }, + ] +) diff --git a/soda/snowflake/setup.py b/soda/snowflake/setup.py index 24c86e343..1fe2c5d60 100644 --- a/soda/snowflake/setup.py +++ b/soda/snowflake/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-snowflake" -package_version = "3.1.3" +package_version = "3.1.4" description = "Soda Core Snowflake Package" requires = [f"soda-core=={package_version}", "snowflake-connector-python~=3.0"] diff --git a/soda/spark/setup.py b/soda/spark/setup.py index 3d78e2de4..3700900a7 100644 --- a/soda/spark/setup.py +++ b/soda/spark/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-spark" -package_version = "3.1.3" +package_version = "3.1.4" description = "Soda Core Spark Package" requires = [f"soda-core=={package_version}"] diff --git a/soda/spark_df/setup.py b/soda/spark_df/setup.py index c8545c32b..de5d2265e 100644 --- a/soda/spark_df/setup.py +++ b/soda/spark_df/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-spark-df" -package_version = "3.1.3" +package_version = "3.1.4" description = "Soda Core Spark Dataframe Package" requires = [ diff --git a/soda/sqlserver/setup.py b/soda/sqlserver/setup.py index 859675177..f9c393ecf 100644 --- a/soda/sqlserver/setup.py +++ b/soda/sqlserver/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-sqlserver" -package_version = "3.1.3" +package_version = "3.1.4" description = "Soda Core SQL Server Package" requires = [ diff --git a/soda/teradata/setup.py b/soda/teradata/setup.py index 6f0ec75e9..c6ab1cc6a 100644 --- a/soda/teradata/setup.py +++ b/soda/teradata/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-teradata" -package_version = "3.1.3" +package_version = "3.1.4" description = "Soda Core Teradata Package" requires = [ diff --git a/soda/trino/setup.py b/soda/trino/setup.py index 282a469ea..8c4a1cf60 100644 --- a/soda/trino/setup.py +++ b/soda/trino/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-trino" -package_version = "3.1.3" +package_version = "3.1.4" description = "Soda Core Trino Package" requires = [f"soda-core=={package_version}", "trino>=0.315.0"] diff --git a/soda/vertica/setup.py b/soda/vertica/setup.py index 11217d38c..8c7ce4d57 100644 --- a/soda/vertica/setup.py +++ b/soda/vertica/setup.py @@ -3,7 +3,7 @@ from setuptools import find_namespace_packages, setup package_name = "soda-core-vertica" -package_version = "3.1.3" +package_version = "3.1.4" description = "Soda Core Vertica Package" requires = [f"soda-core=={package_version}", "vertica-python>=1.0.3, <2.0"] diff --git a/tbump.toml b/tbump.toml index b22ba54bc..e5b100875 100644 --- a/tbump.toml +++ b/tbump.toml @@ -1,5 +1,5 @@ [version] -current = "3.1.3" +current = "3.1.4" regex = ''' (?P\d+)\.(?P\d+)\.(?P\d+)((?P[a-z]+)(?P\d+))?