snowflake-ml-python 1.3.1__py3-none-any.whl → 1.4.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- snowflake/ml/_internal/env_utils.py +11 -1
- snowflake/ml/_internal/human_readable_id/adjectives.txt +128 -0
- snowflake/ml/_internal/human_readable_id/animals.txt +128 -0
- snowflake/ml/_internal/human_readable_id/hrid_generator.py +40 -0
- snowflake/ml/_internal/human_readable_id/hrid_generator_base.py +135 -0
- snowflake/ml/_internal/utils/formatting.py +1 -1
- snowflake/ml/_internal/utils/identifier.py +3 -1
- snowflake/ml/_internal/utils/sql_identifier.py +2 -6
- snowflake/ml/feature_store/feature_store.py +166 -184
- snowflake/ml/feature_store/feature_view.py +12 -24
- snowflake/ml/fileset/sfcfs.py +56 -50
- snowflake/ml/fileset/stage_fs.py +48 -13
- snowflake/ml/model/_client/model/model_version_impl.py +6 -49
- snowflake/ml/model/_client/ops/model_ops.py +78 -29
- snowflake/ml/model/_client/sql/model.py +23 -2
- snowflake/ml/model/_client/sql/model_version.py +22 -1
- snowflake/ml/model/_deploy_client/image_builds/server_image_builder.py +1 -3
- snowflake/ml/model/_deploy_client/snowservice/deploy.py +5 -2
- snowflake/ml/model/_model_composer/model_composer.py +7 -5
- snowflake/ml/model/_model_composer/model_manifest/model_manifest.py +19 -54
- snowflake/ml/model/_model_composer/model_manifest/model_manifest_schema.py +8 -1
- snowflake/ml/model/_model_composer/model_method/infer_table_function.py_template +1 -1
- snowflake/ml/model/_model_composer/model_method/model_method.py +6 -10
- snowflake/ml/model/_packager/model_handlers/catboost.py +206 -0
- snowflake/ml/model/_packager/model_handlers/lightgbm.py +218 -0
- snowflake/ml/model/_packager/model_handlers/sklearn.py +3 -0
- snowflake/ml/model/_packager/model_handlers/snowmlmodel.py +13 -1
- snowflake/ml/model/_packager/model_handlers/xgboost.py +1 -1
- snowflake/ml/model/_packager/model_meta/_core_requirements.py +1 -1
- snowflake/ml/model/_packager/model_meta/model_meta.py +36 -6
- snowflake/ml/model/_packager/model_meta/model_meta_schema.py +20 -1
- snowflake/ml/model/_packager/model_meta_migrator/migrator_plans.py +3 -1
- snowflake/ml/model/_packager/model_packager.py +2 -2
- snowflake/ml/model/{_model_composer/model_runtime/_runtime_requirements.py → _packager/model_runtime/_snowml_inference_alternative_requirements.py} +1 -1
- snowflake/ml/model/_packager/model_runtime/model_runtime.py +137 -0
- snowflake/ml/model/custom_model.py +3 -1
- snowflake/ml/model/type_hints.py +21 -2
- snowflake/ml/modeling/_internal/estimator_utils.py +16 -11
- snowflake/ml/modeling/_internal/local_implementations/pandas_handlers.py +4 -1
- snowflake/ml/modeling/_internal/model_specifications.py +3 -1
- snowflake/ml/modeling/_internal/snowpark_implementations/distributed_hpo_trainer.py +545 -0
- snowflake/ml/modeling/_internal/snowpark_implementations/snowpark_handlers.py +8 -5
- snowflake/ml/modeling/calibration/calibrated_classifier_cv.py +195 -123
- snowflake/ml/modeling/cluster/affinity_propagation.py +195 -123
- snowflake/ml/modeling/cluster/agglomerative_clustering.py +195 -123
- snowflake/ml/modeling/cluster/birch.py +195 -123
- snowflake/ml/modeling/cluster/bisecting_k_means.py +195 -123
- snowflake/ml/modeling/cluster/dbscan.py +195 -123
- snowflake/ml/modeling/cluster/feature_agglomeration.py +195 -123
- snowflake/ml/modeling/cluster/k_means.py +195 -123
- snowflake/ml/modeling/cluster/mean_shift.py +195 -123
- snowflake/ml/modeling/cluster/mini_batch_k_means.py +195 -123
- snowflake/ml/modeling/cluster/optics.py +195 -123
- snowflake/ml/modeling/cluster/spectral_biclustering.py +195 -123
- snowflake/ml/modeling/cluster/spectral_clustering.py +195 -123
- snowflake/ml/modeling/cluster/spectral_coclustering.py +195 -123
- snowflake/ml/modeling/compose/column_transformer.py +195 -123
- snowflake/ml/modeling/compose/transformed_target_regressor.py +195 -123
- snowflake/ml/modeling/covariance/elliptic_envelope.py +195 -123
- snowflake/ml/modeling/covariance/empirical_covariance.py +195 -123
- snowflake/ml/modeling/covariance/graphical_lasso.py +195 -123
- snowflake/ml/modeling/covariance/graphical_lasso_cv.py +195 -123
- snowflake/ml/modeling/covariance/ledoit_wolf.py +195 -123
- snowflake/ml/modeling/covariance/min_cov_det.py +195 -123
- snowflake/ml/modeling/covariance/oas.py +195 -123
- snowflake/ml/modeling/covariance/shrunk_covariance.py +195 -123
- snowflake/ml/modeling/decomposition/dictionary_learning.py +195 -123
- snowflake/ml/modeling/decomposition/factor_analysis.py +195 -123
- snowflake/ml/modeling/decomposition/fast_ica.py +195 -123
- snowflake/ml/modeling/decomposition/incremental_pca.py +195 -123
- snowflake/ml/modeling/decomposition/kernel_pca.py +195 -123
- snowflake/ml/modeling/decomposition/mini_batch_dictionary_learning.py +195 -123
- snowflake/ml/modeling/decomposition/mini_batch_sparse_pca.py +195 -123
- snowflake/ml/modeling/decomposition/pca.py +195 -123
- snowflake/ml/modeling/decomposition/sparse_pca.py +195 -123
- snowflake/ml/modeling/decomposition/truncated_svd.py +195 -123
- snowflake/ml/modeling/discriminant_analysis/linear_discriminant_analysis.py +195 -123
- snowflake/ml/modeling/discriminant_analysis/quadratic_discriminant_analysis.py +195 -123
- snowflake/ml/modeling/ensemble/ada_boost_classifier.py +195 -123
- snowflake/ml/modeling/ensemble/ada_boost_regressor.py +195 -123
- snowflake/ml/modeling/ensemble/bagging_classifier.py +195 -123
- snowflake/ml/modeling/ensemble/bagging_regressor.py +195 -123
- snowflake/ml/modeling/ensemble/extra_trees_classifier.py +195 -123
- snowflake/ml/modeling/ensemble/extra_trees_regressor.py +195 -123
- snowflake/ml/modeling/ensemble/gradient_boosting_classifier.py +195 -123
- snowflake/ml/modeling/ensemble/gradient_boosting_regressor.py +195 -123
- snowflake/ml/modeling/ensemble/hist_gradient_boosting_classifier.py +195 -123
- snowflake/ml/modeling/ensemble/hist_gradient_boosting_regressor.py +195 -123
- snowflake/ml/modeling/ensemble/isolation_forest.py +195 -123
- snowflake/ml/modeling/ensemble/random_forest_classifier.py +195 -123
- snowflake/ml/modeling/ensemble/random_forest_regressor.py +195 -123
- snowflake/ml/modeling/ensemble/stacking_regressor.py +195 -123
- snowflake/ml/modeling/ensemble/voting_classifier.py +195 -123
- snowflake/ml/modeling/ensemble/voting_regressor.py +195 -123
- snowflake/ml/modeling/feature_selection/generic_univariate_select.py +195 -123
- snowflake/ml/modeling/feature_selection/select_fdr.py +195 -123
- snowflake/ml/modeling/feature_selection/select_fpr.py +195 -123
- snowflake/ml/modeling/feature_selection/select_fwe.py +195 -123
- snowflake/ml/modeling/feature_selection/select_k_best.py +195 -123
- snowflake/ml/modeling/feature_selection/select_percentile.py +195 -123
- snowflake/ml/modeling/feature_selection/sequential_feature_selector.py +195 -123
- snowflake/ml/modeling/feature_selection/variance_threshold.py +195 -123
- snowflake/ml/modeling/framework/_utils.py +8 -1
- snowflake/ml/modeling/framework/base.py +24 -6
- snowflake/ml/modeling/gaussian_process/gaussian_process_classifier.py +195 -123
- snowflake/ml/modeling/gaussian_process/gaussian_process_regressor.py +195 -123
- snowflake/ml/modeling/impute/iterative_imputer.py +195 -123
- snowflake/ml/modeling/impute/knn_imputer.py +195 -123
- snowflake/ml/modeling/impute/missing_indicator.py +195 -123
- snowflake/ml/modeling/impute/simple_imputer.py +4 -15
- snowflake/ml/modeling/kernel_approximation/additive_chi2_sampler.py +195 -123
- snowflake/ml/modeling/kernel_approximation/nystroem.py +195 -123
- snowflake/ml/modeling/kernel_approximation/polynomial_count_sketch.py +195 -123
- snowflake/ml/modeling/kernel_approximation/rbf_sampler.py +195 -123
- snowflake/ml/modeling/kernel_approximation/skewed_chi2_sampler.py +195 -123
- snowflake/ml/modeling/kernel_ridge/kernel_ridge.py +195 -123
- snowflake/ml/modeling/lightgbm/lgbm_classifier.py +198 -125
- snowflake/ml/modeling/lightgbm/lgbm_regressor.py +198 -125
- snowflake/ml/modeling/linear_model/ard_regression.py +195 -123
- snowflake/ml/modeling/linear_model/bayesian_ridge.py +195 -123
- snowflake/ml/modeling/linear_model/elastic_net.py +195 -123
- snowflake/ml/modeling/linear_model/elastic_net_cv.py +195 -123
- snowflake/ml/modeling/linear_model/gamma_regressor.py +195 -123
- snowflake/ml/modeling/linear_model/huber_regressor.py +195 -123
- snowflake/ml/modeling/linear_model/lars.py +195 -123
- snowflake/ml/modeling/linear_model/lars_cv.py +195 -123
- snowflake/ml/modeling/linear_model/lasso.py +195 -123
- snowflake/ml/modeling/linear_model/lasso_cv.py +195 -123
- snowflake/ml/modeling/linear_model/lasso_lars.py +195 -123
- snowflake/ml/modeling/linear_model/lasso_lars_cv.py +195 -123
- snowflake/ml/modeling/linear_model/lasso_lars_ic.py +195 -123
- snowflake/ml/modeling/linear_model/linear_regression.py +195 -123
- snowflake/ml/modeling/linear_model/logistic_regression.py +195 -123
- snowflake/ml/modeling/linear_model/logistic_regression_cv.py +195 -123
- snowflake/ml/modeling/linear_model/multi_task_elastic_net.py +195 -123
- snowflake/ml/modeling/linear_model/multi_task_elastic_net_cv.py +195 -123
- snowflake/ml/modeling/linear_model/multi_task_lasso.py +195 -123
- snowflake/ml/modeling/linear_model/multi_task_lasso_cv.py +195 -123
- snowflake/ml/modeling/linear_model/orthogonal_matching_pursuit.py +195 -123
- snowflake/ml/modeling/linear_model/passive_aggressive_classifier.py +195 -123
- snowflake/ml/modeling/linear_model/passive_aggressive_regressor.py +195 -123
- snowflake/ml/modeling/linear_model/perceptron.py +195 -123
- snowflake/ml/modeling/linear_model/poisson_regressor.py +195 -123
- snowflake/ml/modeling/linear_model/ransac_regressor.py +195 -123
- snowflake/ml/modeling/linear_model/ridge.py +195 -123
- snowflake/ml/modeling/linear_model/ridge_classifier.py +195 -123
- snowflake/ml/modeling/linear_model/ridge_classifier_cv.py +195 -123
- snowflake/ml/modeling/linear_model/ridge_cv.py +195 -123
- snowflake/ml/modeling/linear_model/sgd_classifier.py +195 -123
- snowflake/ml/modeling/linear_model/sgd_one_class_svm.py +195 -123
- snowflake/ml/modeling/linear_model/sgd_regressor.py +195 -123
- snowflake/ml/modeling/linear_model/theil_sen_regressor.py +195 -123
- snowflake/ml/modeling/linear_model/tweedie_regressor.py +195 -123
- snowflake/ml/modeling/manifold/isomap.py +195 -123
- snowflake/ml/modeling/manifold/mds.py +195 -123
- snowflake/ml/modeling/manifold/spectral_embedding.py +195 -123
- snowflake/ml/modeling/manifold/tsne.py +195 -123
- snowflake/ml/modeling/mixture/bayesian_gaussian_mixture.py +195 -123
- snowflake/ml/modeling/mixture/gaussian_mixture.py +195 -123
- snowflake/ml/modeling/model_selection/grid_search_cv.py +42 -18
- snowflake/ml/modeling/model_selection/randomized_search_cv.py +42 -18
- snowflake/ml/modeling/multiclass/one_vs_one_classifier.py +195 -123
- snowflake/ml/modeling/multiclass/one_vs_rest_classifier.py +195 -123
- snowflake/ml/modeling/multiclass/output_code_classifier.py +195 -123
- snowflake/ml/modeling/naive_bayes/bernoulli_nb.py +195 -123
- snowflake/ml/modeling/naive_bayes/categorical_nb.py +195 -123
- snowflake/ml/modeling/naive_bayes/complement_nb.py +195 -123
- snowflake/ml/modeling/naive_bayes/gaussian_nb.py +195 -123
- snowflake/ml/modeling/naive_bayes/multinomial_nb.py +195 -123
- snowflake/ml/modeling/neighbors/k_neighbors_classifier.py +195 -123
- snowflake/ml/modeling/neighbors/k_neighbors_regressor.py +195 -123
- snowflake/ml/modeling/neighbors/kernel_density.py +195 -123
- snowflake/ml/modeling/neighbors/local_outlier_factor.py +195 -123
- snowflake/ml/modeling/neighbors/nearest_centroid.py +195 -123
- snowflake/ml/modeling/neighbors/nearest_neighbors.py +195 -123
- snowflake/ml/modeling/neighbors/neighborhood_components_analysis.py +195 -123
- snowflake/ml/modeling/neighbors/radius_neighbors_classifier.py +195 -123
- snowflake/ml/modeling/neighbors/radius_neighbors_regressor.py +195 -123
- snowflake/ml/modeling/neural_network/bernoulli_rbm.py +195 -123
- snowflake/ml/modeling/neural_network/mlp_classifier.py +195 -123
- snowflake/ml/modeling/neural_network/mlp_regressor.py +195 -123
- snowflake/ml/modeling/pipeline/pipeline.py +4 -4
- snowflake/ml/modeling/preprocessing/binarizer.py +1 -5
- snowflake/ml/modeling/preprocessing/k_bins_discretizer.py +1 -5
- snowflake/ml/modeling/preprocessing/label_encoder.py +1 -5
- snowflake/ml/modeling/preprocessing/max_abs_scaler.py +1 -5
- snowflake/ml/modeling/preprocessing/min_max_scaler.py +10 -12
- snowflake/ml/modeling/preprocessing/normalizer.py +1 -5
- snowflake/ml/modeling/preprocessing/one_hot_encoder.py +1 -5
- snowflake/ml/modeling/preprocessing/ordinal_encoder.py +1 -5
- snowflake/ml/modeling/preprocessing/polynomial_features.py +195 -123
- snowflake/ml/modeling/preprocessing/robust_scaler.py +1 -5
- snowflake/ml/modeling/preprocessing/standard_scaler.py +11 -11
- snowflake/ml/modeling/semi_supervised/label_propagation.py +195 -123
- snowflake/ml/modeling/semi_supervised/label_spreading.py +195 -123
- snowflake/ml/modeling/svm/linear_svc.py +195 -123
- snowflake/ml/modeling/svm/linear_svr.py +195 -123
- snowflake/ml/modeling/svm/nu_svc.py +195 -123
- snowflake/ml/modeling/svm/nu_svr.py +195 -123
- snowflake/ml/modeling/svm/svc.py +195 -123
- snowflake/ml/modeling/svm/svr.py +195 -123
- snowflake/ml/modeling/tree/decision_tree_classifier.py +195 -123
- snowflake/ml/modeling/tree/decision_tree_regressor.py +195 -123
- snowflake/ml/modeling/tree/extra_tree_classifier.py +195 -123
- snowflake/ml/modeling/tree/extra_tree_regressor.py +195 -123
- snowflake/ml/modeling/xgboost/xgb_classifier.py +195 -123
- snowflake/ml/modeling/xgboost/xgb_regressor.py +195 -123
- snowflake/ml/modeling/xgboost/xgbrf_classifier.py +195 -123
- snowflake/ml/modeling/xgboost/xgbrf_regressor.py +195 -123
- snowflake/ml/registry/_manager/model_manager.py +5 -1
- snowflake/ml/registry/model_registry.py +99 -26
- snowflake/ml/registry/registry.py +3 -2
- snowflake/ml/version.py +1 -1
- {snowflake_ml_python-1.3.1.dist-info → snowflake_ml_python-1.4.1.dist-info}/METADATA +94 -55
- {snowflake_ml_python-1.3.1.dist-info → snowflake_ml_python-1.4.1.dist-info}/RECORD +218 -212
- snowflake/ml/model/_model_composer/model_runtime/model_runtime.py +0 -97
- {snowflake_ml_python-1.3.1.dist-info → snowflake_ml_python-1.4.1.dist-info}/LICENSE.txt +0 -0
- {snowflake_ml_python-1.3.1.dist-info → snowflake_ml_python-1.4.1.dist-info}/WHEEL +0 -0
- {snowflake_ml_python-1.3.1.dist-info → snowflake_ml_python-1.4.1.dist-info}/top_level.txt +0 -0
@@ -33,6 +33,15 @@ from snowflake.ml.modeling._internal.transformer_protocols import (
|
|
33
33
|
BatchInferenceKwargsTypedDict,
|
34
34
|
ScoreKwargsTypedDict
|
35
35
|
)
|
36
|
+
from snowflake.ml.model._signatures import utils as model_signature_utils
|
37
|
+
from snowflake.ml.model.model_signature import (
|
38
|
+
BaseFeatureSpec,
|
39
|
+
DataType,
|
40
|
+
FeatureSpec,
|
41
|
+
ModelSignature,
|
42
|
+
_infer_signature,
|
43
|
+
_rename_signature_with_snowflake_identifiers,
|
44
|
+
)
|
36
45
|
|
37
46
|
from snowflake.ml.modeling._internal.model_transformer_builder import ModelTransformerBuilder
|
38
47
|
|
@@ -43,16 +52,6 @@ from snowflake.ml.modeling._internal.estimator_utils import (
|
|
43
52
|
validate_sklearn_args,
|
44
53
|
)
|
45
54
|
|
46
|
-
from snowflake.ml.model.model_signature import (
|
47
|
-
DataType,
|
48
|
-
FeatureSpec,
|
49
|
-
ModelSignature,
|
50
|
-
_infer_signature,
|
51
|
-
_rename_signature_with_snowflake_identifiers,
|
52
|
-
BaseFeatureSpec,
|
53
|
-
)
|
54
|
-
from snowflake.ml.model._signatures import utils as model_signature_utils
|
55
|
-
|
56
55
|
_PROJECT = "ModelDevelopment"
|
57
56
|
# Derive subproject from module name by removing "sklearn"
|
58
57
|
# and converting module name from underscore to CamelCase
|
@@ -216,12 +215,7 @@ class MultinomialNB(BaseTransformer):
|
|
216
215
|
)
|
217
216
|
return selected_cols
|
218
217
|
|
219
|
-
|
220
|
-
project=_PROJECT,
|
221
|
-
subproject=_SUBPROJECT,
|
222
|
-
custom_tags=dict([("autogen", True)]),
|
223
|
-
)
|
224
|
-
def fit(self, dataset: Union[DataFrame, pd.DataFrame]) -> "MultinomialNB":
|
218
|
+
def _fit(self, dataset: Union[DataFrame, pd.DataFrame]) -> "MultinomialNB":
|
225
219
|
"""Fit Naive Bayes classifier according to X, y
|
226
220
|
For more details on this function, see [sklearn.naive_bayes.MultinomialNB.fit]
|
227
221
|
(https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.MultinomialNB.html#sklearn.naive_bayes.MultinomialNB.fit)
|
@@ -248,12 +242,14 @@ class MultinomialNB(BaseTransformer):
|
|
248
242
|
|
249
243
|
self._snowpark_cols = dataset.select(self.input_cols).columns
|
250
244
|
|
251
|
-
|
245
|
+
# If we are already in a stored procedure, no need to kick off another one.
|
252
246
|
if SNOWML_SPROC_ENV in os.environ:
|
253
247
|
statement_params = telemetry.get_function_usage_statement_params(
|
254
248
|
project=_PROJECT,
|
255
249
|
subproject=_SUBPROJECT,
|
256
|
-
function_name=telemetry.get_statement_params_full_func_name(
|
250
|
+
function_name=telemetry.get_statement_params_full_func_name(
|
251
|
+
inspect.currentframe(), MultinomialNB.__class__.__name__
|
252
|
+
),
|
257
253
|
api_calls=[Session.call],
|
258
254
|
custom_tags=dict([("autogen", True)]) if self._autogenerated else None,
|
259
255
|
)
|
@@ -274,7 +270,7 @@ class MultinomialNB(BaseTransformer):
|
|
274
270
|
)
|
275
271
|
self._sklearn_object = model_trainer.train()
|
276
272
|
self._is_fitted = True
|
277
|
-
self.
|
273
|
+
self._generate_model_signatures(dataset)
|
278
274
|
return self
|
279
275
|
|
280
276
|
def _batch_inference_validate_snowpark(
|
@@ -350,7 +346,9 @@ class MultinomialNB(BaseTransformer):
|
|
350
346
|
# when it is classifier, infer the datatype from label columns
|
351
347
|
if expected_type_inferred == "" and 'predict' in self.model_signatures:
|
352
348
|
# Batch inference takes a single expected output column type. Use the first columns type for now.
|
353
|
-
label_cols_signatures = [
|
349
|
+
label_cols_signatures = [
|
350
|
+
row for row in self.model_signatures['predict'].outputs if row.name in self.output_cols
|
351
|
+
]
|
354
352
|
if len(label_cols_signatures) == 0:
|
355
353
|
error_str = f"Output columns {self.output_cols} do not match model signatures {self.model_signatures['predict'].outputs}."
|
356
354
|
raise exceptions.SnowflakeMLException(
|
@@ -358,25 +356,22 @@ class MultinomialNB(BaseTransformer):
|
|
358
356
|
original_exception=ValueError(error_str),
|
359
357
|
)
|
360
358
|
|
361
|
-
expected_type_inferred = convert_sp_to_sf_type(
|
362
|
-
label_cols_signatures[0].as_snowpark_type()
|
363
|
-
)
|
359
|
+
expected_type_inferred = convert_sp_to_sf_type(label_cols_signatures[0].as_snowpark_type())
|
364
360
|
|
365
361
|
self._deps = self._batch_inference_validate_snowpark(dataset=dataset, inference_method=inference_method)
|
366
|
-
assert isinstance(
|
362
|
+
assert isinstance(
|
363
|
+
dataset._session, Session
|
364
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
367
365
|
|
368
366
|
transform_kwargs = dict(
|
369
|
-
session
|
370
|
-
dependencies
|
371
|
-
drop_input_cols
|
372
|
-
expected_output_cols_type
|
367
|
+
session=dataset._session,
|
368
|
+
dependencies=self._deps,
|
369
|
+
drop_input_cols=self._drop_input_cols,
|
370
|
+
expected_output_cols_type=expected_type_inferred,
|
373
371
|
)
|
374
372
|
|
375
373
|
elif isinstance(dataset, pd.DataFrame):
|
376
|
-
transform_kwargs = dict(
|
377
|
-
snowpark_input_cols = self._snowpark_cols,
|
378
|
-
drop_input_cols = self._drop_input_cols
|
379
|
-
)
|
374
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
380
375
|
|
381
376
|
transform_handlers = ModelTransformerBuilder.build(
|
382
377
|
dataset=dataset,
|
@@ -416,7 +411,7 @@ class MultinomialNB(BaseTransformer):
|
|
416
411
|
Transformed dataset.
|
417
412
|
"""
|
418
413
|
super()._check_dataset_type(dataset)
|
419
|
-
inference_method="transform"
|
414
|
+
inference_method = "transform"
|
420
415
|
|
421
416
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
422
417
|
# are specific to the type of dataset used.
|
@@ -453,17 +448,14 @@ class MultinomialNB(BaseTransformer):
|
|
453
448
|
assert isinstance(dataset._session, Session) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
454
449
|
|
455
450
|
transform_kwargs = dict(
|
456
|
-
session
|
457
|
-
dependencies
|
458
|
-
drop_input_cols
|
459
|
-
expected_output_cols_type
|
451
|
+
session=dataset._session,
|
452
|
+
dependencies=self._deps,
|
453
|
+
drop_input_cols=self._drop_input_cols,
|
454
|
+
expected_output_cols_type=expected_dtype,
|
460
455
|
)
|
461
456
|
|
462
457
|
elif isinstance(dataset, pd.DataFrame):
|
463
|
-
transform_kwargs = dict(
|
464
|
-
snowpark_input_cols = self._snowpark_cols,
|
465
|
-
drop_input_cols = self._drop_input_cols
|
466
|
-
)
|
458
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
467
459
|
|
468
460
|
transform_handlers = ModelTransformerBuilder.build(
|
469
461
|
dataset=dataset,
|
@@ -482,7 +474,11 @@ class MultinomialNB(BaseTransformer):
|
|
482
474
|
return output_df
|
483
475
|
|
484
476
|
@available_if(original_estimator_has_callable("fit_predict")) # type: ignore[misc]
|
485
|
-
def fit_predict(
|
477
|
+
def fit_predict(
|
478
|
+
self,
|
479
|
+
dataset: Union[DataFrame, pd.DataFrame],
|
480
|
+
output_cols_prefix: str = "fit_predict_",
|
481
|
+
) -> Union[DataFrame, pd.DataFrame]:
|
486
482
|
""" Method not supported for this class.
|
487
483
|
|
488
484
|
|
@@ -507,7 +503,9 @@ class MultinomialNB(BaseTransformer):
|
|
507
503
|
)
|
508
504
|
output_result, fitted_estimator = model_trainer.train_fit_predict(
|
509
505
|
drop_input_cols=self._drop_input_cols,
|
510
|
-
expected_output_cols_list=
|
506
|
+
expected_output_cols_list=(
|
507
|
+
self.output_cols if self.output_cols else self._get_output_column_names(output_cols_prefix)
|
508
|
+
),
|
511
509
|
)
|
512
510
|
self._sklearn_object = fitted_estimator
|
513
511
|
self._is_fitted = True
|
@@ -524,6 +522,62 @@ class MultinomialNB(BaseTransformer):
|
|
524
522
|
assert self._sklearn_object is not None
|
525
523
|
return self._sklearn_object.embedding_
|
526
524
|
|
525
|
+
|
526
|
+
def _get_output_column_names(self, output_cols_prefix: str, output_cols: Optional[List[str]] = None) -> List[str]:
|
527
|
+
""" Returns the list of output columns for predict_proba(), decision_function(), etc.. functions.
|
528
|
+
Returns a list with output_cols_prefix as the only element if the estimator is not a classifier.
|
529
|
+
"""
|
530
|
+
output_cols_prefix = identifier.resolve_identifier(output_cols_prefix)
|
531
|
+
# The following condition is introduced for kneighbors methods, and not used in other methods
|
532
|
+
if output_cols:
|
533
|
+
output_cols = [
|
534
|
+
identifier.concat_names([output_cols_prefix, identifier.resolve_identifier(c)])
|
535
|
+
for c in output_cols
|
536
|
+
]
|
537
|
+
elif getattr(self._sklearn_object, "classes_", None) is None:
|
538
|
+
output_cols = [output_cols_prefix]
|
539
|
+
elif self._sklearn_object is not None:
|
540
|
+
classes = self._sklearn_object.classes_
|
541
|
+
if isinstance(classes, numpy.ndarray):
|
542
|
+
output_cols = [f'{output_cols_prefix}{str(c)}' for c in classes.tolist()]
|
543
|
+
elif isinstance(classes, list) and len(classes) > 0 and isinstance(classes[0], numpy.ndarray):
|
544
|
+
# If the estimator is a multioutput estimator, classes_ will be a list of ndarrays.
|
545
|
+
output_cols = []
|
546
|
+
for i, cl in enumerate(classes):
|
547
|
+
# For binary classification, there is only one output column for each class
|
548
|
+
# ndarray as the two classes are complementary.
|
549
|
+
if len(cl) == 2:
|
550
|
+
output_cols.append(f'{output_cols_prefix}{i}_{cl[0]}')
|
551
|
+
else:
|
552
|
+
output_cols.extend([
|
553
|
+
f'{output_cols_prefix}{i}_{c}' for c in cl.tolist()
|
554
|
+
])
|
555
|
+
else:
|
556
|
+
output_cols = []
|
557
|
+
|
558
|
+
# Make sure column names are valid snowflake identifiers.
|
559
|
+
assert output_cols is not None # Make MyPy happy
|
560
|
+
rv = [identifier.rename_to_valid_snowflake_identifier(c) for c in output_cols]
|
561
|
+
|
562
|
+
return rv
|
563
|
+
|
564
|
+
def _align_expected_output_names(
|
565
|
+
self, method: str, dataset: DataFrame, expected_output_cols_list: List[str], output_cols_prefix: str
|
566
|
+
) -> List[str]:
|
567
|
+
# in case the inferred output column names dimension is different
|
568
|
+
# we use one line of snowpark dataframe and put it into sklearn estimator using pandas
|
569
|
+
output_df_pd = getattr(self, method)(dataset.limit(1).to_pandas(), output_cols_prefix)
|
570
|
+
output_df_columns = list(output_df_pd.columns)
|
571
|
+
output_df_columns_set: Set[str] = set(output_df_columns) - set(dataset.columns)
|
572
|
+
if self.sample_weight_col:
|
573
|
+
output_df_columns_set -= set(self.sample_weight_col)
|
574
|
+
# if the dimension of inferred output column names is correct; use it
|
575
|
+
if len(expected_output_cols_list) == len(output_df_columns_set):
|
576
|
+
return expected_output_cols_list
|
577
|
+
# otherwise, use the sklearn estimator's output
|
578
|
+
else:
|
579
|
+
return sorted(list(output_df_columns_set), key=lambda x: output_df_columns.index(x))
|
580
|
+
|
527
581
|
@available_if(original_estimator_has_callable("predict_proba")) # type: ignore[misc]
|
528
582
|
@telemetry.send_api_usage_telemetry(
|
529
583
|
project=_PROJECT,
|
@@ -556,24 +610,28 @@ class MultinomialNB(BaseTransformer):
|
|
556
610
|
# are specific to the type of dataset used.
|
557
611
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
558
612
|
|
613
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
614
|
+
|
559
615
|
if isinstance(dataset, DataFrame):
|
560
616
|
self._deps = self._batch_inference_validate_snowpark(
|
561
617
|
dataset=dataset,
|
562
618
|
inference_method=inference_method,
|
563
619
|
)
|
564
|
-
assert isinstance(
|
620
|
+
assert isinstance(
|
621
|
+
dataset._session, Session
|
622
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
565
623
|
transform_kwargs = dict(
|
566
624
|
session=dataset._session,
|
567
625
|
dependencies=self._deps,
|
568
|
-
drop_input_cols
|
626
|
+
drop_input_cols=self._drop_input_cols,
|
569
627
|
expected_output_cols_type="float",
|
570
628
|
)
|
629
|
+
expected_output_cols = self._align_expected_output_names(
|
630
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
631
|
+
)
|
571
632
|
|
572
633
|
elif isinstance(dataset, pd.DataFrame):
|
573
|
-
transform_kwargs = dict(
|
574
|
-
snowpark_input_cols = self._snowpark_cols,
|
575
|
-
drop_input_cols = self._drop_input_cols
|
576
|
-
)
|
634
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
577
635
|
|
578
636
|
transform_handlers = ModelTransformerBuilder.build(
|
579
637
|
dataset=dataset,
|
@@ -585,7 +643,7 @@ class MultinomialNB(BaseTransformer):
|
|
585
643
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
586
644
|
inference_method=inference_method,
|
587
645
|
input_cols=self.input_cols,
|
588
|
-
expected_output_cols=
|
646
|
+
expected_output_cols=expected_output_cols,
|
589
647
|
**transform_kwargs
|
590
648
|
)
|
591
649
|
return output_df
|
@@ -617,7 +675,8 @@ class MultinomialNB(BaseTransformer):
|
|
617
675
|
Output dataset with log probability of the sample for each class in the model.
|
618
676
|
"""
|
619
677
|
super()._check_dataset_type(dataset)
|
620
|
-
inference_method="predict_log_proba"
|
678
|
+
inference_method = "predict_log_proba"
|
679
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
621
680
|
|
622
681
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
623
682
|
# are specific to the type of dataset used.
|
@@ -628,18 +687,20 @@ class MultinomialNB(BaseTransformer):
|
|
628
687
|
dataset=dataset,
|
629
688
|
inference_method=inference_method,
|
630
689
|
)
|
631
|
-
assert isinstance(
|
690
|
+
assert isinstance(
|
691
|
+
dataset._session, Session
|
692
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
632
693
|
transform_kwargs = dict(
|
633
694
|
session=dataset._session,
|
634
695
|
dependencies=self._deps,
|
635
|
-
drop_input_cols
|
696
|
+
drop_input_cols=self._drop_input_cols,
|
636
697
|
expected_output_cols_type="float",
|
637
698
|
)
|
699
|
+
expected_output_cols = self._align_expected_output_names(
|
700
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
701
|
+
)
|
638
702
|
elif isinstance(dataset, pd.DataFrame):
|
639
|
-
transform_kwargs = dict(
|
640
|
-
snowpark_input_cols = self._snowpark_cols,
|
641
|
-
drop_input_cols = self._drop_input_cols
|
642
|
-
)
|
703
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
643
704
|
|
644
705
|
transform_handlers = ModelTransformerBuilder.build(
|
645
706
|
dataset=dataset,
|
@@ -652,7 +713,7 @@ class MultinomialNB(BaseTransformer):
|
|
652
713
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
653
714
|
inference_method=inference_method,
|
654
715
|
input_cols=self.input_cols,
|
655
|
-
expected_output_cols=
|
716
|
+
expected_output_cols=expected_output_cols,
|
656
717
|
**transform_kwargs
|
657
718
|
)
|
658
719
|
return output_df
|
@@ -678,30 +739,34 @@ class MultinomialNB(BaseTransformer):
|
|
678
739
|
Output dataset with results of the decision function for the samples in input dataset.
|
679
740
|
"""
|
680
741
|
super()._check_dataset_type(dataset)
|
681
|
-
inference_method="decision_function"
|
742
|
+
inference_method = "decision_function"
|
682
743
|
|
683
744
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
684
745
|
# are specific to the type of dataset used.
|
685
746
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
686
747
|
|
748
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
749
|
+
|
687
750
|
if isinstance(dataset, DataFrame):
|
688
751
|
self._deps = self._batch_inference_validate_snowpark(
|
689
752
|
dataset=dataset,
|
690
753
|
inference_method=inference_method,
|
691
754
|
)
|
692
|
-
assert isinstance(
|
755
|
+
assert isinstance(
|
756
|
+
dataset._session, Session
|
757
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
693
758
|
transform_kwargs = dict(
|
694
759
|
session=dataset._session,
|
695
760
|
dependencies=self._deps,
|
696
|
-
drop_input_cols
|
761
|
+
drop_input_cols=self._drop_input_cols,
|
697
762
|
expected_output_cols_type="float",
|
698
763
|
)
|
764
|
+
expected_output_cols = self._align_expected_output_names(
|
765
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
766
|
+
)
|
699
767
|
|
700
768
|
elif isinstance(dataset, pd.DataFrame):
|
701
|
-
transform_kwargs = dict(
|
702
|
-
snowpark_input_cols = self._snowpark_cols,
|
703
|
-
drop_input_cols = self._drop_input_cols
|
704
|
-
)
|
769
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
705
770
|
|
706
771
|
transform_handlers = ModelTransformerBuilder.build(
|
707
772
|
dataset=dataset,
|
@@ -714,7 +779,7 @@ class MultinomialNB(BaseTransformer):
|
|
714
779
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
715
780
|
inference_method=inference_method,
|
716
781
|
input_cols=self.input_cols,
|
717
|
-
expected_output_cols=
|
782
|
+
expected_output_cols=expected_output_cols,
|
718
783
|
**transform_kwargs
|
719
784
|
)
|
720
785
|
return output_df
|
@@ -743,12 +808,14 @@ class MultinomialNB(BaseTransformer):
|
|
743
808
|
Output dataset with probability of the sample for each class in the model.
|
744
809
|
"""
|
745
810
|
super()._check_dataset_type(dataset)
|
746
|
-
inference_method="score_samples"
|
811
|
+
inference_method = "score_samples"
|
747
812
|
|
748
813
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
749
814
|
# are specific to the type of dataset used.
|
750
815
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
751
816
|
|
817
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
818
|
+
|
752
819
|
if isinstance(dataset, DataFrame):
|
753
820
|
self._deps = self._batch_inference_validate_snowpark(
|
754
821
|
dataset=dataset,
|
@@ -761,6 +828,9 @@ class MultinomialNB(BaseTransformer):
|
|
761
828
|
drop_input_cols = self._drop_input_cols,
|
762
829
|
expected_output_cols_type="float",
|
763
830
|
)
|
831
|
+
expected_output_cols = self._align_expected_output_names(
|
832
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
833
|
+
)
|
764
834
|
|
765
835
|
elif isinstance(dataset, pd.DataFrame):
|
766
836
|
transform_kwargs = dict(
|
@@ -779,7 +849,7 @@ class MultinomialNB(BaseTransformer):
|
|
779
849
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
780
850
|
inference_method=inference_method,
|
781
851
|
input_cols=self.input_cols,
|
782
|
-
expected_output_cols=
|
852
|
+
expected_output_cols=expected_output_cols,
|
783
853
|
**transform_kwargs
|
784
854
|
)
|
785
855
|
return output_df
|
@@ -926,50 +996,84 @@ class MultinomialNB(BaseTransformer):
|
|
926
996
|
)
|
927
997
|
return output_df
|
928
998
|
|
999
|
+
|
1000
|
+
|
1001
|
+
def to_sklearn(self) -> Any:
|
1002
|
+
"""Get sklearn.naive_bayes.MultinomialNB object.
|
1003
|
+
"""
|
1004
|
+
if self._sklearn_object is None:
|
1005
|
+
self._sklearn_object = self._create_sklearn_object()
|
1006
|
+
return self._sklearn_object
|
1007
|
+
|
1008
|
+
def to_xgboost(self) -> Any:
|
1009
|
+
raise exceptions.SnowflakeMLException(
|
1010
|
+
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1011
|
+
original_exception=AttributeError(
|
1012
|
+
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1013
|
+
"to_xgboost()",
|
1014
|
+
"to_sklearn()"
|
1015
|
+
)
|
1016
|
+
),
|
1017
|
+
)
|
1018
|
+
|
1019
|
+
def to_lightgbm(self) -> Any:
|
1020
|
+
raise exceptions.SnowflakeMLException(
|
1021
|
+
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1022
|
+
original_exception=AttributeError(
|
1023
|
+
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1024
|
+
"to_lightgbm()",
|
1025
|
+
"to_sklearn()"
|
1026
|
+
)
|
1027
|
+
),
|
1028
|
+
)
|
929
1029
|
|
930
|
-
def
|
1030
|
+
def _get_dependencies(self) -> List[str]:
|
1031
|
+
return self._deps
|
1032
|
+
|
1033
|
+
|
1034
|
+
def _generate_model_signatures(self, dataset: Union[DataFrame, pd.DataFrame]) -> None:
|
931
1035
|
self._model_signature_dict = dict()
|
932
1036
|
|
933
1037
|
PROB_FUNCTIONS = ["predict_log_proba", "predict_proba", "decision_function"]
|
934
1038
|
|
935
|
-
inputs = list(_infer_signature(dataset[self.input_cols], "input"))
|
1039
|
+
inputs = list(_infer_signature(dataset[self.input_cols], "input", use_snowflake_identifiers=True))
|
936
1040
|
outputs: List[BaseFeatureSpec] = []
|
937
1041
|
if hasattr(self, "predict"):
|
938
1042
|
# keep mypy happy
|
939
|
-
assert self._sklearn_object is not None and hasattr(self._sklearn_object, "_estimator_type")
|
1043
|
+
assert self._sklearn_object is not None and hasattr(self._sklearn_object, "_estimator_type")
|
940
1044
|
# For classifier, the type of predict is the same as the type of label
|
941
|
-
if self._sklearn_object._estimator_type ==
|
942
|
-
|
1045
|
+
if self._sklearn_object._estimator_type == "classifier":
|
1046
|
+
# label columns is the desired type for output
|
943
1047
|
outputs = list(_infer_signature(dataset[self.label_cols], "output", use_snowflake_identifiers=True))
|
944
1048
|
# rename the output columns
|
945
1049
|
outputs = list(model_signature_utils.rename_features(outputs, self.output_cols))
|
946
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
947
|
-
|
948
|
-
|
1050
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1051
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1052
|
+
)
|
949
1053
|
# For mixture models that use the density mixin, `predict` returns the argmax of the log prob.
|
950
1054
|
# For outlier models, returns -1 for outliers and 1 for inliers.
|
951
|
-
# Clusterer returns int64 cluster labels.
|
1055
|
+
# Clusterer returns int64 cluster labels.
|
952
1056
|
elif self._sklearn_object._estimator_type in ["DensityEstimator", "clusterer", "outlier_detector"]:
|
953
1057
|
outputs = [FeatureSpec(dtype=DataType.INT64, name=c) for c in self.output_cols]
|
954
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
955
|
-
|
956
|
-
|
957
|
-
|
1058
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1059
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1060
|
+
)
|
1061
|
+
|
958
1062
|
# For regressor, the type of predict is float64
|
959
|
-
elif self._sklearn_object._estimator_type ==
|
1063
|
+
elif self._sklearn_object._estimator_type == "regressor":
|
960
1064
|
outputs = [FeatureSpec(dtype=DataType.DOUBLE, name=c) for c in self.output_cols]
|
961
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
962
|
-
|
963
|
-
|
964
|
-
|
1065
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1066
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1067
|
+
)
|
1068
|
+
|
965
1069
|
for prob_func in PROB_FUNCTIONS:
|
966
1070
|
if hasattr(self, prob_func):
|
967
1071
|
output_cols_prefix: str = f"{prob_func}_"
|
968
1072
|
output_column_names = self._get_output_column_names(output_cols_prefix)
|
969
1073
|
outputs = [FeatureSpec(dtype=DataType.DOUBLE, name=c) for c in output_column_names]
|
970
|
-
self._model_signature_dict[prob_func] = ModelSignature(
|
971
|
-
|
972
|
-
|
1074
|
+
self._model_signature_dict[prob_func] = ModelSignature(
|
1075
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1076
|
+
)
|
973
1077
|
|
974
1078
|
# Output signature names may still need to be renamed, since they were not created with `_infer_signature`.
|
975
1079
|
items = list(self._model_signature_dict.items())
|
@@ -982,10 +1086,10 @@ class MultinomialNB(BaseTransformer):
|
|
982
1086
|
"""Returns model signature of current class.
|
983
1087
|
|
984
1088
|
Raises:
|
985
|
-
|
1089
|
+
SnowflakeMLException: If estimator is not fitted, then model signature cannot be inferred
|
986
1090
|
|
987
1091
|
Returns:
|
988
|
-
Dict
|
1092
|
+
Dict with each method and its input output signature
|
989
1093
|
"""
|
990
1094
|
if self._model_signature_dict is None:
|
991
1095
|
raise exceptions.SnowflakeMLException(
|
@@ -993,35 +1097,3 @@ class MultinomialNB(BaseTransformer):
|
|
993
1097
|
original_exception=RuntimeError("Estimator not fitted before accessing property model_signatures!"),
|
994
1098
|
)
|
995
1099
|
return self._model_signature_dict
|
996
|
-
|
997
|
-
def to_sklearn(self) -> Any:
|
998
|
-
"""Get sklearn.naive_bayes.MultinomialNB object.
|
999
|
-
"""
|
1000
|
-
if self._sklearn_object is None:
|
1001
|
-
self._sklearn_object = self._create_sklearn_object()
|
1002
|
-
return self._sklearn_object
|
1003
|
-
|
1004
|
-
def to_xgboost(self) -> Any:
|
1005
|
-
raise exceptions.SnowflakeMLException(
|
1006
|
-
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1007
|
-
original_exception=AttributeError(
|
1008
|
-
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1009
|
-
"to_xgboost()",
|
1010
|
-
"to_sklearn()"
|
1011
|
-
)
|
1012
|
-
),
|
1013
|
-
)
|
1014
|
-
|
1015
|
-
def to_lightgbm(self) -> Any:
|
1016
|
-
raise exceptions.SnowflakeMLException(
|
1017
|
-
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1018
|
-
original_exception=AttributeError(
|
1019
|
-
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1020
|
-
"to_lightgbm()",
|
1021
|
-
"to_sklearn()"
|
1022
|
-
)
|
1023
|
-
),
|
1024
|
-
)
|
1025
|
-
|
1026
|
-
def _get_dependencies(self) -> List[str]:
|
1027
|
-
return self._deps
|