Skip to content

Commit 1e0061e

Browse files
committed
adding monthly seasonality
1 parent e58e2cd commit 1e0061e

File tree

2 files changed

+46
-9
lines changed

2 files changed

+46
-9
lines changed

ads/opctl/operator/lowcode/forecast/model/prophet.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/usr/bin/env python
22

3-
# Copyright (c) 2024 Oracle and/or its affiliates.
3+
# Copyright (c) 2024, 2025 Oracle and/or its affiliates.
44
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
55

66
import logging
@@ -43,7 +43,11 @@ def _add_unit(num, unit):
4343
def _fit_model(data, params, additional_regressors):
4444
from prophet import Prophet
4545

46+
monthly_seasonality = params.pop("monthly_seasonality", False)
4647
model = Prophet(**params)
48+
if monthly_seasonality:
49+
model.add_seasonality(name="monthly", period=30.5, fourier_order=5)
50+
params["monthly_seasonality"] = monthly_seasonality
4751
for add_reg in additional_regressors:
4852
model.add_regressor(add_reg)
4953
model.fit(data)
@@ -256,7 +260,7 @@ def _generate_report(self):
256260
self.outputs[s_id], include_legend=True
257261
),
258262
series_ids=series_ids,
259-
target_category_column=self.target_cat_col
263+
target_category_column=self.target_cat_col,
260264
)
261265
section_1 = rc.Block(
262266
rc.Heading("Forecast Overview", level=2),
@@ -269,7 +273,7 @@ def _generate_report(self):
269273
sec2 = _select_plot_list(
270274
lambda s_id: self.models[s_id].plot_components(self.outputs[s_id]),
271275
series_ids=series_ids,
272-
target_category_column=self.target_cat_col
276+
target_category_column=self.target_cat_col,
273277
)
274278
section_2 = rc.Block(
275279
rc.Heading("Forecast Broken Down by Trend Component", level=2), sec2
@@ -285,7 +289,7 @@ def _generate_report(self):
285289
sec3 = _select_plot_list(
286290
lambda s_id: sec3_figs[s_id],
287291
series_ids=series_ids,
288-
target_category_column=self.target_cat_col
292+
target_category_column=self.target_cat_col,
289293
)
290294
section_3 = rc.Block(rc.Heading("Forecast Changepoints", level=2), sec3)
291295

@@ -299,7 +303,9 @@ def _generate_report(self):
299303
pd.Series(
300304
m.seasonalities,
301305
index=pd.Index(m.seasonalities.keys(), dtype="object"),
302-
name=s_id if self.target_cat_col else self.original_target_column,
306+
name=s_id
307+
if self.target_cat_col
308+
else self.original_target_column,
303309
dtype="object",
304310
)
305311
)
@@ -330,11 +336,15 @@ def _generate_report(self):
330336
self.formatted_local_explanation = aggregate_local_explanations
331337

332338
if not self.target_cat_col:
333-
self.formatted_global_explanation = self.formatted_global_explanation.rename(
334-
{"Series 1": self.original_target_column},
335-
axis=1,
339+
self.formatted_global_explanation = (
340+
self.formatted_global_explanation.rename(
341+
{"Series 1": self.original_target_column},
342+
axis=1,
343+
)
344+
)
345+
self.formatted_local_explanation.drop(
346+
"Series", axis=1, inplace=True
336347
)
337-
self.formatted_local_explanation.drop("Series", axis=1, inplace=True)
338348

339349
# Create a markdown section for the global explainability
340350
global_explanation_section = rc.Block(

tests/operators/forecast/test_datasets.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,33 @@ def test_pandas_to_historical_test(model):
212212
print(test_metrics)
213213

214214

215+
# CostAD
216+
@pytest.mark.parametrize("model", ["prophet", "neuralprophet"])
217+
def test_pandas_to_historical_test(model):
218+
df = pd.read_csv(f"{DATASET_PREFIX}dataset5.csv")
219+
df_train = df[:-1]
220+
df_test = df[-1:]
221+
222+
with tempfile.TemporaryDirectory() as tmpdirname:
223+
output_data_path = f"{tmpdirname}/results"
224+
yaml_i = deepcopy(TEMPLATE_YAML)
225+
yaml_i["spec"]["model"] = model
226+
yaml_i["spec"]["historical_data"].pop("url")
227+
yaml_i["spec"]["historical_data"]["data"] = df_train
228+
yaml_i["spec"]["test_data"] = {"data": df_test}
229+
yaml_i["spec"]["target_column"] = "Y"
230+
yaml_i["spec"]["datetime_column"]["name"] = DATETIME_COL
231+
yaml_i["spec"]["horizon"] = 1
232+
yaml_i["spec"]["output_directory"]["url"] = output_data_path
233+
if model == "automlx":
234+
yaml_i["spec"]["model_kwargs"] = {"time_budget": 2}
235+
operator_config = ForecastOperatorConfig.from_dict(yaml_i)
236+
forecast_operate(operator_config)
237+
check_output_for_errors(output_data_path)
238+
test_metrics = pd.read_csv(f"{output_data_path}/metrics.csv")
239+
print(test_metrics)
240+
241+
215242
def check_output_for_errors(output_data_path):
216243
# try:
217244
# List files in the directory

0 commit comments

Comments
 (0)