Skip to content

Commit c810e3a

Browse files
authored
Merge branch 'main' into remove_defined_tag_update_ft
2 parents cf4f28b + 35cccdd commit c810e3a

File tree

23 files changed

+885
-354
lines changed

23 files changed

+885
-354
lines changed

ads/opctl/operator/lowcode/anomaly/model/base_model.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def generate_report(self):
7171
try:
7272
anomaly_output = self._build_model()
7373
except Exception as e:
74-
logger.warn(f"Found exception: {e}")
74+
logger.warning(f"Found exception: {e}")
7575
if self.spec.datetime_column:
7676
anomaly_output = self._fallback_build_model()
7777
raise e
@@ -347,7 +347,7 @@ def _save_report(
347347
storage_options=storage_options,
348348
)
349349

350-
logger.warn(
350+
logger.warning(
351351
f"The report has been successfully "
352352
f"generated and placed to the: {unique_output_dir}."
353353
)
@@ -356,7 +356,7 @@ def _fallback_build_model(self):
356356
"""
357357
Fallback method for the sub model _build_model method.
358358
"""
359-
logger.warn(
359+
logger.warning(
360360
f"The build_model method has failed for the model: {self.spec.model}. "
361361
"A fallback model will be built."
362362
)

ads/opctl/operator/lowcode/anomaly/model/randomcutforest.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def _build_model(self) -> AnomalyOutput:
9595

9696
anomaly_output.add_output(target, anomaly, score)
9797
except Exception as e:
98-
logger.warn(f"Encountered Error: {e}. Skipping series {target}.")
98+
logger.warning(f"Encountered Error: {e}. Skipping series {target}.")
9999

100100
return anomaly_output
101101

ads/opctl/operator/lowcode/anomaly/utils.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def _build_metrics_df(y_true, y_pred, column_name):
4444
# Throws exception if y_true has only one class
4545
metrics[SupportedMetrics.ROC_AUC] = roc_auc_score(y_true, y_pred)
4646
except Exception as e:
47-
logger.warn(f"An exception occurred: {e}")
47+
logger.warning(f"An exception occurred: {e}")
4848
metrics[SupportedMetrics.ROC_AUC] = None
4949
precision, recall, thresholds = precision_recall_curve(y_true, y_pred)
5050
metrics[SupportedMetrics.PRC_AUC] = auc(recall, precision)

ads/opctl/operator/lowcode/common/transformations.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,11 @@ def run(self, data):
9898
return clean_df
9999

100100
def _remove_trailing_whitespace(self, df):
101-
return df.apply(lambda x: x.str.strip() if x.dtype == "object" else x)
101+
return df.apply(
102+
lambda x: x.str.strip()
103+
if hasattr(x, "dtype") and x.dtype == "object"
104+
else x
105+
)
102106

103107
def _clean_column_names(self, df):
104108
"""

ads/opctl/operator/lowcode/common/utils.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# 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

6+
import json
67
import logging
78
import os
89
import shutil
@@ -12,7 +13,6 @@
1213

1314
import fsspec
1415
import oracledb
15-
import json
1616
import pandas as pd
1717

1818
from ads.common.object_storage_details import ObjectStorageDetails
@@ -142,6 +142,11 @@ def write_data(data, filename, format, storage_options=None, index=False, **kwar
142142
)
143143

144144

145+
def write_json(json_dict, filename, storage_options=None):
146+
with fsspec.open(filename, mode="w", **storage_options) as f:
147+
f.write(json.dumps(json_dict))
148+
149+
145150
def write_simple_json(data, path):
146151
if ObjectStorageDetails.is_oci_path(path):
147152
storage_options = default_signer()
@@ -265,7 +270,7 @@ def find_output_dirname(output_dir: OutputDirectory):
265270
while os.path.exists(unique_output_dir):
266271
unique_output_dir = f"{output_dir}_{counter}"
267272
counter += 1
268-
logger.warn(
273+
logger.warning(
269274
f"Since the output directory was not specified, the output will be saved to {unique_output_dir} directory."
270275
)
271276
return unique_output_dir

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

+15-10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/usr/bin/env python
22

3-
# Copyright (c) 2023, 2024 Oracle and/or its affiliates.
3+
# Copyright (c) 2023, 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
@@ -132,13 +132,14 @@ def _train_model(self, i, s_id, df, model_kwargs):
132132

133133
logger.debug("===========Done===========")
134134
except Exception as e:
135-
self.errors_dict[s_id] = {
135+
new_error = {
136136
"model_name": self.spec.model,
137137
"error": str(e),
138138
"error_trace": traceback.format_exc(),
139139
}
140-
logger.warn(f"Encountered Error: {e}. Skipping.")
141-
logger.warn(traceback.format_exc())
140+
self.errors_dict[s_id] = new_error
141+
logger.warning(f"Encountered Error: {e}. Skipping.")
142+
logger.warning(traceback.format_exc())
142143

143144
def _build_model(self) -> pd.DataFrame:
144145
full_data_dict = self.datasets.get_data_by_series()
@@ -166,7 +167,7 @@ def _generate_report(self):
166167
sec5_text = rc.Heading("ARIMA Model Parameters", level=2)
167168
blocks = [
168169
rc.Html(
169-
m['model'].summary().as_html(),
170+
m["model"].summary().as_html(),
170171
label=s_id if self.target_cat_col else None,
171172
)
172173
for i, (s_id, m) in enumerate(self.models.items())
@@ -201,11 +202,15 @@ def _generate_report(self):
201202
self.formatted_local_explanation = aggregate_local_explanations
202203

203204
if not self.target_cat_col:
204-
self.formatted_global_explanation = self.formatted_global_explanation.rename(
205-
{"Series 1": self.original_target_column},
206-
axis=1,
205+
self.formatted_global_explanation = (
206+
self.formatted_global_explanation.rename(
207+
{"Series 1": self.original_target_column},
208+
axis=1,
209+
)
210+
)
211+
self.formatted_local_explanation.drop(
212+
"Series", axis=1, inplace=True
207213
)
208-
self.formatted_local_explanation.drop("Series", axis=1, inplace=True)
209214

210215
# Create a markdown section for the global explainability
211216
global_explanation_section = rc.Block(
@@ -235,7 +240,7 @@ def _generate_report(self):
235240
local_explanation_section,
236241
]
237242
except Exception as e:
238-
logger.warn(f"Failed to generate Explanations with error: {e}.")
243+
logger.warning(f"Failed to generate Explanations with error: {e}.")
239244
logger.debug(f"Full Traceback: {traceback.format_exc()}")
240245

241246
model_description = rc.Text(

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

+31-9
Original file line numberDiff line numberDiff line change
@@ -184,13 +184,18 @@ def _build_model(self) -> pd.DataFrame:
184184
"selected_model_params": model.selected_model_params_,
185185
}
186186
except Exception as e:
187-
self.errors_dict[s_id] = {
187+
new_error = {
188188
"model_name": self.spec.model,
189189
"error": str(e),
190190
"error_trace": traceback.format_exc(),
191191
}
192-
logger.warn(f"Encountered Error: {e}. Skipping.")
193-
logger.warn(traceback.format_exc())
192+
if s_id in self.errors_dict:
193+
self.errors_dict[s_id]["model_fitting"] = new_error
194+
else:
195+
self.errors_dict[s_id] = {"model_fitting": new_error}
196+
logger.warning(f"Encountered Error: {e}. Skipping.")
197+
logger.warning(f"self.errors_dict[s_id]: {self.errors_dict[s_id]}")
198+
logger.warning(traceback.format_exc())
194199

195200
logger.debug("===========Forecast Generated===========")
196201

@@ -257,7 +262,9 @@ def _generate_report(self):
257262
)
258263

259264
self.formatted_global_explanation.rename(
260-
columns={self.spec.datetime_column.name: ForecastOutputColumns.DATE},
265+
columns={
266+
self.spec.datetime_column.name: ForecastOutputColumns.DATE
267+
},
261268
inplace=True,
262269
)
263270

@@ -312,7 +319,7 @@ def _generate_report(self):
312319
local_explanation_section,
313320
]
314321
except Exception as e:
315-
logger.warn(f"Failed to generate Explanations with error: {e}.")
322+
logger.warning(f"Failed to generate Explanations with error: {e}.")
316323
logger.debug(f"Full Traceback: {traceback.format_exc()}")
317324

318325
model_description = rc.Text(
@@ -462,14 +469,27 @@ def explain_model(self):
462469
index="row", columns="Feature", values="Attribution"
463470
)
464471
explanations_df = explanations_df.reset_index(drop=True)
465-
472+
explanations_df[ForecastOutputColumns.DATE] = (
473+
self.datasets.get_horizon_at_series(
474+
s_id=s_id
475+
)[self.spec.datetime_column.name].reset_index(drop=True)
476+
)
466477
# Store the explanations in the local_explanation dictionary
467478
self.local_explanation[s_id] = explanations_df
468479

469480
self.global_explanation[s_id] = dict(
470481
zip(
471-
self.local_explanation[s_id].columns,
472-
np.nanmean(np.abs(self.local_explanation[s_id]), axis=0),
482+
self.local_explanation[s_id]
483+
.drop(ForecastOutputColumns.DATE, axis=1)
484+
.columns,
485+
np.nanmean(
486+
np.abs(
487+
self.local_explanation[s_id].drop(
488+
ForecastOutputColumns.DATE, axis=1
489+
)
490+
),
491+
axis=0,
492+
),
473493
)
474494
)
475495
else:
@@ -478,7 +498,9 @@ def explain_model(self):
478498
except Exception as e:
479499
if s_id in self.errors_dict:
480500
self.errors_dict[s_id]["explainer_error"] = str(e)
481-
self.errors_dict[s_id]["explainer_error_trace"] = traceback.format_exc()
501+
self.errors_dict[s_id]["explainer_error_trace"] = (
502+
traceback.format_exc()
503+
)
482504
else:
483505
self.errors_dict[s_id] = {
484506
"model_name": self.spec.model,

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

+7-5
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,8 @@ def _build_model(self) -> pd.DataFrame:
211211
"error": str(e),
212212
"error_trace": traceback.format_exc(),
213213
}
214-
logger.warn(f"Encountered Error: {e}. Skipping.")
215-
logger.warn(traceback.format_exc())
214+
logger.warning(f"Encountered Error: {e}. Skipping.")
215+
logger.warning(traceback.format_exc())
216216

217217
logger.debug("===========Done===========")
218218

@@ -242,7 +242,7 @@ def _generate_report(self) -> tuple:
242242
self.models.df_wide_numeric, series=s_id
243243
),
244244
self.datasets.list_series_ids(),
245-
target_category_column=self.target_cat_col
245+
target_category_column=self.target_cat_col,
246246
)
247247
section_1 = rc.Block(
248248
rc.Heading("Forecast Overview", level=2),
@@ -260,15 +260,17 @@ def _generate_report(self) -> tuple:
260260
)
261261

262262
except KeyError:
263-
logger.warn("Issue generating Model Parameters Table Section. Skipping")
263+
logger.warning(
264+
"Issue generating Model Parameters Table Section. Skipping"
265+
)
264266
sec2 = rc.Text("Error generating model parameters.")
265267

266268
section_2 = rc.Block(sec2_text, sec2)
267269

268270
all_sections = [section_1, section_2]
269271

270272
if self.spec.generate_explanations:
271-
logger.warn("Explanations not yet supported for the AutoTS Module")
273+
logger.warning("Explanations not yet supported for the AutoTS Module")
272274

273275
# Model Description
274276
model_description = rc.Text(

0 commit comments

Comments
 (0)