Skip to content

Commit 48ff95e

Browse files
committed
Fix ruff errors
1 parent 3f96ef9 commit 48ff95e

22 files changed

+138
-135
lines changed

Diff for: .vscode/settings.json

+1-4
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
"files.trimTrailingWhitespace": true,
2727
"jupyter.notebookFileRoot": "${workspaceFolder}",
2828
"jupyter.interactiveWindow.textEditor.executeSelection": true,
29-
"jupyter.generateSVGPlots": true,
3029
"autoDocstring.docstringFormat": "numpy",
3130
"python.testing.pytestArgs": [
3231
"tests"
@@ -39,7 +38,5 @@
3938
"ruff.organizeImports": true,
4039
"ruff.fixAll": true,
4140
"ruff.importStrategy": "fromEnvironment",
42-
"ruff.lint.run": "onSave",
43-
"python.linting.enabled": false,
44-
"python.linting.pylintEnabled": false
41+
"ruff.lint.run": "onSave"
4542
}

Diff for: ml_garden/core/data_container.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -721,7 +721,7 @@ def predict_proba(self) -> pd.DataFrame:
721721
return self["predict_proba"]
722722

723723
@predict_proba.setter
724-
def predict_proba(self, value: pd.DataFrame):
724+
def predict_proba(self, value: pd.DataFrame) -> None:
725725
"""
726726
Set the prediction probabilities in the DataContainer.
727727

Diff for: ml_garden/core/model.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from abc import ABC, abstractmethod
2-
from typing import List, Optional, Tuple
2+
from typing import Optional
33

44
import pandas as pd
55

@@ -11,14 +11,14 @@
1111
class Model(ABC):
1212
"""Base class for models."""
1313

14-
TASKS: List[Task] = []
14+
TASKS: list[Task] = []
1515

1616
@abstractmethod
1717
def fit(
1818
self,
1919
X: pd.DataFrame,
2020
y: pd.Series,
21-
eval_set: Optional[List[Tuple[pd.DataFrame, pd.Series]]] = None,
21+
eval_set: Optional[list[tuple[pd.DataFrame, pd.Series]]] = None,
2222
*,
2323
verbose: Optional[bool] = True,
2424
) -> None:
@@ -28,6 +28,7 @@ def fit(
2828
def predict(self, X: pd.DataFrame) -> pd.Series:
2929
"""Abstract method for making predictions."""
3030

31+
@abstractmethod
3132
def predict_proba(self, X: pd.DataFrame) -> pd.DataFrame:
3233
"""
3334
Predict class probabilities with the trained model.
@@ -42,4 +43,3 @@ def predict_proba(self, X: pd.DataFrame) -> pd.DataFrame:
4243
pd.DataFrame
4344
Predicted class probabilities for the input features.
4445
"""
45-
pass

Diff for: ml_garden/core/model_registry.py

+8-9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import importlib
22
import logging
33
import pkgutil
4-
from typing import Dict, Type
54

65
from ml_garden.core.model import Model
76

@@ -13,7 +12,7 @@ class ModelClassNotFoundError(Exception):
1312

1413

1514
class ModelRegistry:
16-
def __init__(self):
15+
def __init__(self) -> None:
1716
"""
1817
Initialize a new ModelRegistry instance.
1918
@@ -24,16 +23,16 @@ def __init__(self):
2423
logger : logging.Logger
2524
Logger for the class.
2625
"""
27-
self._model_registry: Dict[str, Type[Model]] = {}
26+
self._model_registry: dict[str, type[Model]] = {}
2827
self.logger = logging.getLogger(__name__)
2928

30-
def register_model(self, model_class: Type[Model]) -> None:
29+
def register_model(self, model_class: type[Model]) -> None:
3130
"""
3231
Register a model class in the registry.
3332
3433
Parameters
3534
----------
36-
model_class : Type[Model]
35+
model_class : type[Model]
3736
The model class to be registered.
3837
3938
Raises
@@ -48,7 +47,7 @@ def register_model(self, model_class: Type[Model]) -> None:
4847
raise TypeError(error_message)
4948
self._model_registry[model_name] = model_class
5049

51-
def get_model_class(self, model_name: str) -> Type[Model]:
50+
def get_model_class(self, model_name: str) -> type[Model]:
5251
"""
5352
Retrieve a model class from the registry.
5453
@@ -59,7 +58,7 @@ def get_model_class(self, model_name: str) -> Type[Model]:
5958
6059
Returns
6160
-------
62-
Type[Model]
61+
type[Model]
6362
The model class.
6463
6564
Raises
@@ -78,7 +77,7 @@ def get_model_class(self, model_name: str) -> Type[Model]:
7877
self.logger.exception(error_message)
7978
raise ModelClassNotFoundError(error_message)
8079

81-
def get_all_model_classes(self) -> Dict[str, Type[Model]]:
80+
def get_all_model_classes(self) -> dict[str, type[Model]]:
8281
"""
8382
Get all registered model classes.
8483
@@ -106,7 +105,7 @@ def auto_register_models_from_package(self, package_name: str) -> None:
106105
try:
107106
package = importlib.import_module(package_name)
108107
prefix = package.__name__ + "."
109-
for importer, modname, ispkg in pkgutil.walk_packages(package.__path__, prefix):
108+
for _importer, modname, _ispkg in pkgutil.walk_packages(package.__path__, prefix):
110109
module = importlib.import_module(modname)
111110
for name in dir(module):
112111
attribute = getattr(module, name)

Diff for: ml_garden/core/steps/calculate_features.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Calculate datetime-related features from specified columns."""
22

3-
from typing import List, Optional, Union
3+
from typing import Optional, Union
44

55
import pandas as pd
66
from pandas.api.types import is_datetime64_any_dtype
@@ -21,8 +21,8 @@ class CalculateFeaturesStep(PipelineStep):
2121

2222
def __init__(
2323
self,
24-
datetime_columns: Optional[Union[List[str], str]] = None,
25-
features: Optional[List[str]] = None,
24+
datetime_columns: Optional[Union[list[str], str]] = None,
25+
features: Optional[list[str]] = None,
2626
) -> None:
2727
"""Initialize CalculateFeaturesStep.
2828
@@ -93,10 +93,10 @@ def _convert_column_to_datetime(self, df: pd.DataFrame, column: str, log: bool)
9393
)
9494
if log:
9595
self.logger.info(f"Column '{column}' automatically converted to datetime.")
96-
except ValueError as e:
97-
self.logger.error(f"Error converting column '{column}' to datetime: {e}")
98-
except Exception as e:
99-
self.logger.error(f"Unexpected error converting column '{column}' to datetime: {e}")
96+
except ValueError:
97+
self.logger.exception(f"Error converting column '{column}' to datetime")
98+
except Exception:
99+
self.logger.exception(f"Unexpected error converting column '{column}' to datetime")
100100
elif log:
101101
self.logger.debug(f"Column '{column}' is already a datetime type.")
102102
return df
@@ -162,9 +162,9 @@ def execute(self, data: DataContainer) -> DataContainer:
162162

163163
for attr_name, dataset, should_log in datasets:
164164
if dataset is not None:
165-
dataset = self._create_datetime_features(dataset, log=should_log)
166-
dataset = self._drop_datetime_columns(dataset, log=should_log)
167-
setattr(data, attr_name, dataset)
165+
ds = self._create_datetime_features(dataset, log=should_log)
166+
ds = self._drop_datetime_columns(ds, log=should_log)
167+
setattr(data, attr_name, ds)
168168

169169
return data
170170

Diff for: ml_garden/core/steps/calculate_metrics.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""Calculate metrics for regression and classification tasks."""
22

33
import json
4-
from typing import Dict, List, TypedDict, Union
4+
from typing import TypedDict, Union
55

66
import numpy as np
77
import pandas as pd
@@ -55,16 +55,16 @@ class ClassificationMetrics(TypedDict):
5555
"""Classification metrics."""
5656

5757
Overall: ClassificationOverallMetrics
58-
Per_Class: Dict[str, ClassMetrics]
59-
Confusion_Matrix: List[List[int]]
58+
Per_Class: dict[str, ClassMetrics]
59+
Confusion_Matrix: list[list[int]]
6060

6161

6262
class DatasetMetrics(TypedDict):
6363
"""Dataset metrics."""
6464

65-
train: Dict[str, Union[RegressionMetrics, ClassificationMetrics]]
66-
validation: Dict[str, Union[RegressionMetrics, ClassificationMetrics]]
67-
test: Dict[str, Union[RegressionMetrics, ClassificationMetrics]]
65+
train: dict[str, Union[RegressionMetrics, ClassificationMetrics]]
66+
validation: dict[str, Union[RegressionMetrics, ClassificationMetrics]]
67+
test: dict[str, Union[RegressionMetrics, ClassificationMetrics]]
6868

6969

7070
class CalculateMetricsStep(PipelineStep):
@@ -213,7 +213,7 @@ def execute(self, data: DataContainer) -> DataContainer:
213213
"""
214214
self.logger.debug("Starting metric calculation")
215215

216-
metrics: Dict[str, Union[RegressionMetrics, ClassificationMetrics]] = {}
216+
metrics: dict[str, Union[RegressionMetrics, ClassificationMetrics]] = {}
217217

218218
if data.is_train:
219219
for dataset_name in ["train", "validation", "test"]:

Diff for: ml_garden/core/steps/encode.py

+26-26
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import json
2-
from typing import Any, Dict, List, Optional, Tuple, Type, Union
2+
from typing import Any, Optional, Union
33

44
import numpy as np
55
import pandas as pd
@@ -102,13 +102,13 @@ def _apply_encoding(
102102
self,
103103
X: pd.DataFrame,
104104
y: Optional[pd.Series],
105-
categorical_features: List[str],
106-
numeric_features: List[str],
105+
categorical_features: list[str],
106+
numeric_features: list[str],
107107
saved_encoder: Optional[ColumnTransformer] = None,
108108
*,
109109
fit_encoders: bool = False,
110110
log: Optional[bool] = False,
111-
) -> Tuple[pd.DataFrame, Optional[pd.Series], Optional[ColumnTransformer]]:
111+
) -> tuple[pd.DataFrame, Optional[pd.Series], Optional[ColumnTransformer]]:
112112
"""Apply the encoding to the data.
113113
114114
Parameters
@@ -117,9 +117,9 @@ def _apply_encoding(
117117
The DataFrame with features to encode
118118
y : pd.Series, optional
119119
The target series. If provided, the target column will be encoded, by default None
120-
categorical_features : List[str]
120+
categorical_features : list[str]
121121
Categorical features
122-
numeric_features : List[str]
122+
numeric_features : list[str]
123123
Numeric features
124124
fit_encoders : bool, optional
125125
Whether to fit the encoders, by default False
@@ -130,7 +130,7 @@ def _apply_encoding(
130130
131131
Returns
132132
-------
133-
Tuple[pd.DataFrame, Optional[pd.Series], Optional[ColumnTransformer]]
133+
tuple[pd.DataFrame, Optional[pd.Series], Optional[ColumnTransformer]]
134134
The encoded data, the target column, and the encoder
135135
"""
136136
if not fit_encoders and not saved_encoder:
@@ -182,7 +182,7 @@ def _apply_encoding(
182182

183183
return encoded_data, targets, encoder
184184

185-
def _get_feature_types(self, X: pd.DataFrame) -> Tuple[List[str], List[str]]:
185+
def _get_feature_types(self, X: pd.DataFrame) -> tuple[list[str], list[str]]:
186186
"""Get categorical and numeric feature lists.
187187
188188
Parameters
@@ -192,7 +192,7 @@ def _get_feature_types(self, X: pd.DataFrame) -> Tuple[List[str], List[str]]:
192192
193193
Returns
194194
-------
195-
Tuple[List[str], List[str]]
195+
tuple[list[str], list[str]]
196196
Categorical and numeric features
197197
"""
198198
categorical_features = [col for col in X.columns if X[col].dtype in ["object", "category"]]
@@ -201,8 +201,8 @@ def _get_feature_types(self, X: pd.DataFrame) -> Tuple[List[str], List[str]]:
201201
return categorical_features, numeric_features
202202

203203
def _split_categorical_features(
204-
self, df: pd.DataFrame, categorical_features: List[str]
205-
) -> Tuple[List[str], List[str]]:
204+
self, df: pd.DataFrame, categorical_features: list[str]
205+
) -> tuple[list[str], list[str]]:
206206
"""Split categorical features into low and high cardinality features."""
207207
low_cardinality_features = [
208208
col for col in categorical_features if df[col].nunique() <= self.cardinality_threshold
@@ -214,7 +214,7 @@ def _split_categorical_features(
214214

215215
def _get_encoder_class_and_params(
216216
self, encoder_name: str
217-
) -> Tuple[Union[Type[OrdinalEncoder], Type[TargetEncoder]], dict[str, Any]]:
217+
) -> tuple[Union[type[OrdinalEncoder], type[TargetEncoder]], dict[str, Any]]:
218218
"""Map encoder name to the corresponding encoder class."""
219219
encoder = self.ENCODER_MAP.get(encoder_name)
220220
encoder_params = self.ENCODER_MAP_PARAMS.get(encoder_name)
@@ -230,9 +230,9 @@ def _get_encoder_class_and_params(
230230
def _log_encoder_override(
231231
self,
232232
feature: str,
233-
encoder_class: Type[Union[OrdinalEncoder, TargetEncoder]],
234-
high_cardinality_features: List[str],
235-
low_cardinality_features: List[str],
233+
encoder_class: type[Union[OrdinalEncoder, TargetEncoder]],
234+
high_cardinality_features: list[str],
235+
low_cardinality_features: list[str],
236236
) -> None:
237237
if feature in high_cardinality_features:
238238
self.logger.info(
@@ -257,9 +257,9 @@ def _log_encoder_override(
257257

258258
def _create_column_transformer(
259259
self,
260-
high_cardinality_features: List[str],
261-
low_cardinality_features: List[str],
262-
numeric_features: List[str],
260+
high_cardinality_features: list[str],
261+
low_cardinality_features: list[str],
262+
numeric_features: list[str],
263263
) -> ColumnTransformer:
264264
"""Create a ColumnTransformer for encoding."""
265265
transformers = []
@@ -345,7 +345,7 @@ def _restore_column_order(self, df: pd.DataFrame, encoded_data: pd.DataFrame) ->
345345
return encoded_data[new_column_order]
346346

347347
def _convert_ordinal_encoded_columns_to_int(
348-
self, encoded_data: pd.DataFrame, encoded_feature_map: Dict[str, str]
348+
self, encoded_data: pd.DataFrame, encoded_feature_map: dict[str, str]
349349
) -> pd.DataFrame:
350350
"""Convert ordinal encoded columns to the smallest possible integer dtype."""
351351
ordinal_encoded_features = [
@@ -361,7 +361,7 @@ def _convert_ordinal_encoded_columns_to_int(
361361
# since instead of raising the error and being converted to "integer" in the
362362
# except, it will remain as a float64 silenty.
363363
if (encoded_data[col] <= 0).any():
364-
raise ValueError("Column contains negative values.")
364+
raise ValueError("Column contains negative values.") # noqa: TRY301, EM101
365365
encoded_data[col] = pd.to_numeric(encoded_data[col].values, downcast="unsigned")
366366
except ValueError:
367367
try:
@@ -401,7 +401,7 @@ def _convert_float64_to_float32(self, encoded_data: pd.DataFrame) -> pd.DataFram
401401
encoded_data[col] = encoded_data[col].astype(np.float32)
402402
return encoded_data
403403

404-
def _create_feature_encoder_map(self, column_transformer: ColumnTransformer) -> Dict[str, str]:
404+
def _create_feature_encoder_map(self, column_transformer: ColumnTransformer) -> dict[str, str]:
405405
"""Create a dictionary to store the encoder used for each feature."""
406406
feature_encoder_map = {}
407407
transformed_features = column_transformer.get_feature_names_out()
@@ -419,11 +419,11 @@ def _create_feature_encoder_map(self, column_transformer: ColumnTransformer) ->
419419

420420
def _log_feature_info(
421421
self,
422-
categorical_features: List[str],
423-
numeric_features: List[str],
424-
low_cardinality_features: List[str],
425-
high_cardinality_features: List[str],
426-
feature_encoder_map: Dict[str, str],
422+
categorical_features: list[str],
423+
numeric_features: list[str],
424+
low_cardinality_features: list[str],
425+
high_cardinality_features: list[str],
426+
feature_encoder_map: dict[str, str],
427427
) -> None:
428428
"""Log information about the features."""
429429
self.logger.info(

0 commit comments

Comments
 (0)