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
|
@@ -265,12 +264,7 @@ class LinearSVR(BaseTransformer):
|
|
265
264
|
)
|
266
265
|
return selected_cols
|
267
266
|
|
268
|
-
|
269
|
-
project=_PROJECT,
|
270
|
-
subproject=_SUBPROJECT,
|
271
|
-
custom_tags=dict([("autogen", True)]),
|
272
|
-
)
|
273
|
-
def fit(self, dataset: Union[DataFrame, pd.DataFrame]) -> "LinearSVR":
|
267
|
+
def _fit(self, dataset: Union[DataFrame, pd.DataFrame]) -> "LinearSVR":
|
274
268
|
"""Fit the model according to the given training data
|
275
269
|
For more details on this function, see [sklearn.svm.LinearSVR.fit]
|
276
270
|
(https://scikit-learn.org/stable/modules/generated/sklearn.svm.LinearSVR.html#sklearn.svm.LinearSVR.fit)
|
@@ -297,12 +291,14 @@ class LinearSVR(BaseTransformer):
|
|
297
291
|
|
298
292
|
self._snowpark_cols = dataset.select(self.input_cols).columns
|
299
293
|
|
300
|
-
|
294
|
+
# If we are already in a stored procedure, no need to kick off another one.
|
301
295
|
if SNOWML_SPROC_ENV in os.environ:
|
302
296
|
statement_params = telemetry.get_function_usage_statement_params(
|
303
297
|
project=_PROJECT,
|
304
298
|
subproject=_SUBPROJECT,
|
305
|
-
function_name=telemetry.get_statement_params_full_func_name(
|
299
|
+
function_name=telemetry.get_statement_params_full_func_name(
|
300
|
+
inspect.currentframe(), LinearSVR.__class__.__name__
|
301
|
+
),
|
306
302
|
api_calls=[Session.call],
|
307
303
|
custom_tags=dict([("autogen", True)]) if self._autogenerated else None,
|
308
304
|
)
|
@@ -323,7 +319,7 @@ class LinearSVR(BaseTransformer):
|
|
323
319
|
)
|
324
320
|
self._sklearn_object = model_trainer.train()
|
325
321
|
self._is_fitted = True
|
326
|
-
self.
|
322
|
+
self._generate_model_signatures(dataset)
|
327
323
|
return self
|
328
324
|
|
329
325
|
def _batch_inference_validate_snowpark(
|
@@ -399,7 +395,9 @@ class LinearSVR(BaseTransformer):
|
|
399
395
|
# when it is classifier, infer the datatype from label columns
|
400
396
|
if expected_type_inferred == "" and 'predict' in self.model_signatures:
|
401
397
|
# Batch inference takes a single expected output column type. Use the first columns type for now.
|
402
|
-
label_cols_signatures = [
|
398
|
+
label_cols_signatures = [
|
399
|
+
row for row in self.model_signatures['predict'].outputs if row.name in self.output_cols
|
400
|
+
]
|
403
401
|
if len(label_cols_signatures) == 0:
|
404
402
|
error_str = f"Output columns {self.output_cols} do not match model signatures {self.model_signatures['predict'].outputs}."
|
405
403
|
raise exceptions.SnowflakeMLException(
|
@@ -407,25 +405,22 @@ class LinearSVR(BaseTransformer):
|
|
407
405
|
original_exception=ValueError(error_str),
|
408
406
|
)
|
409
407
|
|
410
|
-
expected_type_inferred = convert_sp_to_sf_type(
|
411
|
-
label_cols_signatures[0].as_snowpark_type()
|
412
|
-
)
|
408
|
+
expected_type_inferred = convert_sp_to_sf_type(label_cols_signatures[0].as_snowpark_type())
|
413
409
|
|
414
410
|
self._deps = self._batch_inference_validate_snowpark(dataset=dataset, inference_method=inference_method)
|
415
|
-
assert isinstance(
|
411
|
+
assert isinstance(
|
412
|
+
dataset._session, Session
|
413
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
416
414
|
|
417
415
|
transform_kwargs = dict(
|
418
|
-
session
|
419
|
-
dependencies
|
420
|
-
drop_input_cols
|
421
|
-
expected_output_cols_type
|
416
|
+
session=dataset._session,
|
417
|
+
dependencies=self._deps,
|
418
|
+
drop_input_cols=self._drop_input_cols,
|
419
|
+
expected_output_cols_type=expected_type_inferred,
|
422
420
|
)
|
423
421
|
|
424
422
|
elif isinstance(dataset, pd.DataFrame):
|
425
|
-
transform_kwargs = dict(
|
426
|
-
snowpark_input_cols = self._snowpark_cols,
|
427
|
-
drop_input_cols = self._drop_input_cols
|
428
|
-
)
|
423
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
429
424
|
|
430
425
|
transform_handlers = ModelTransformerBuilder.build(
|
431
426
|
dataset=dataset,
|
@@ -465,7 +460,7 @@ class LinearSVR(BaseTransformer):
|
|
465
460
|
Transformed dataset.
|
466
461
|
"""
|
467
462
|
super()._check_dataset_type(dataset)
|
468
|
-
inference_method="transform"
|
463
|
+
inference_method = "transform"
|
469
464
|
|
470
465
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
471
466
|
# are specific to the type of dataset used.
|
@@ -502,17 +497,14 @@ class LinearSVR(BaseTransformer):
|
|
502
497
|
assert isinstance(dataset._session, Session) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
503
498
|
|
504
499
|
transform_kwargs = dict(
|
505
|
-
session
|
506
|
-
dependencies
|
507
|
-
drop_input_cols
|
508
|
-
expected_output_cols_type
|
500
|
+
session=dataset._session,
|
501
|
+
dependencies=self._deps,
|
502
|
+
drop_input_cols=self._drop_input_cols,
|
503
|
+
expected_output_cols_type=expected_dtype,
|
509
504
|
)
|
510
505
|
|
511
506
|
elif isinstance(dataset, pd.DataFrame):
|
512
|
-
transform_kwargs = dict(
|
513
|
-
snowpark_input_cols = self._snowpark_cols,
|
514
|
-
drop_input_cols = self._drop_input_cols
|
515
|
-
)
|
507
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
516
508
|
|
517
509
|
transform_handlers = ModelTransformerBuilder.build(
|
518
510
|
dataset=dataset,
|
@@ -531,7 +523,11 @@ class LinearSVR(BaseTransformer):
|
|
531
523
|
return output_df
|
532
524
|
|
533
525
|
@available_if(original_estimator_has_callable("fit_predict")) # type: ignore[misc]
|
534
|
-
def fit_predict(
|
526
|
+
def fit_predict(
|
527
|
+
self,
|
528
|
+
dataset: Union[DataFrame, pd.DataFrame],
|
529
|
+
output_cols_prefix: str = "fit_predict_",
|
530
|
+
) -> Union[DataFrame, pd.DataFrame]:
|
535
531
|
""" Method not supported for this class.
|
536
532
|
|
537
533
|
|
@@ -556,7 +552,9 @@ class LinearSVR(BaseTransformer):
|
|
556
552
|
)
|
557
553
|
output_result, fitted_estimator = model_trainer.train_fit_predict(
|
558
554
|
drop_input_cols=self._drop_input_cols,
|
559
|
-
expected_output_cols_list=
|
555
|
+
expected_output_cols_list=(
|
556
|
+
self.output_cols if self.output_cols else self._get_output_column_names(output_cols_prefix)
|
557
|
+
),
|
560
558
|
)
|
561
559
|
self._sklearn_object = fitted_estimator
|
562
560
|
self._is_fitted = True
|
@@ -573,6 +571,62 @@ class LinearSVR(BaseTransformer):
|
|
573
571
|
assert self._sklearn_object is not None
|
574
572
|
return self._sklearn_object.embedding_
|
575
573
|
|
574
|
+
|
575
|
+
def _get_output_column_names(self, output_cols_prefix: str, output_cols: Optional[List[str]] = None) -> List[str]:
|
576
|
+
""" Returns the list of output columns for predict_proba(), decision_function(), etc.. functions.
|
577
|
+
Returns a list with output_cols_prefix as the only element if the estimator is not a classifier.
|
578
|
+
"""
|
579
|
+
output_cols_prefix = identifier.resolve_identifier(output_cols_prefix)
|
580
|
+
# The following condition is introduced for kneighbors methods, and not used in other methods
|
581
|
+
if output_cols:
|
582
|
+
output_cols = [
|
583
|
+
identifier.concat_names([output_cols_prefix, identifier.resolve_identifier(c)])
|
584
|
+
for c in output_cols
|
585
|
+
]
|
586
|
+
elif getattr(self._sklearn_object, "classes_", None) is None:
|
587
|
+
output_cols = [output_cols_prefix]
|
588
|
+
elif self._sklearn_object is not None:
|
589
|
+
classes = self._sklearn_object.classes_
|
590
|
+
if isinstance(classes, numpy.ndarray):
|
591
|
+
output_cols = [f'{output_cols_prefix}{str(c)}' for c in classes.tolist()]
|
592
|
+
elif isinstance(classes, list) and len(classes) > 0 and isinstance(classes[0], numpy.ndarray):
|
593
|
+
# If the estimator is a multioutput estimator, classes_ will be a list of ndarrays.
|
594
|
+
output_cols = []
|
595
|
+
for i, cl in enumerate(classes):
|
596
|
+
# For binary classification, there is only one output column for each class
|
597
|
+
# ndarray as the two classes are complementary.
|
598
|
+
if len(cl) == 2:
|
599
|
+
output_cols.append(f'{output_cols_prefix}{i}_{cl[0]}')
|
600
|
+
else:
|
601
|
+
output_cols.extend([
|
602
|
+
f'{output_cols_prefix}{i}_{c}' for c in cl.tolist()
|
603
|
+
])
|
604
|
+
else:
|
605
|
+
output_cols = []
|
606
|
+
|
607
|
+
# Make sure column names are valid snowflake identifiers.
|
608
|
+
assert output_cols is not None # Make MyPy happy
|
609
|
+
rv = [identifier.rename_to_valid_snowflake_identifier(c) for c in output_cols]
|
610
|
+
|
611
|
+
return rv
|
612
|
+
|
613
|
+
def _align_expected_output_names(
|
614
|
+
self, method: str, dataset: DataFrame, expected_output_cols_list: List[str], output_cols_prefix: str
|
615
|
+
) -> List[str]:
|
616
|
+
# in case the inferred output column names dimension is different
|
617
|
+
# we use one line of snowpark dataframe and put it into sklearn estimator using pandas
|
618
|
+
output_df_pd = getattr(self, method)(dataset.limit(1).to_pandas(), output_cols_prefix)
|
619
|
+
output_df_columns = list(output_df_pd.columns)
|
620
|
+
output_df_columns_set: Set[str] = set(output_df_columns) - set(dataset.columns)
|
621
|
+
if self.sample_weight_col:
|
622
|
+
output_df_columns_set -= set(self.sample_weight_col)
|
623
|
+
# if the dimension of inferred output column names is correct; use it
|
624
|
+
if len(expected_output_cols_list) == len(output_df_columns_set):
|
625
|
+
return expected_output_cols_list
|
626
|
+
# otherwise, use the sklearn estimator's output
|
627
|
+
else:
|
628
|
+
return sorted(list(output_df_columns_set), key=lambda x: output_df_columns.index(x))
|
629
|
+
|
576
630
|
@available_if(original_estimator_has_callable("predict_proba")) # type: ignore[misc]
|
577
631
|
@telemetry.send_api_usage_telemetry(
|
578
632
|
project=_PROJECT,
|
@@ -603,24 +657,28 @@ class LinearSVR(BaseTransformer):
|
|
603
657
|
# are specific to the type of dataset used.
|
604
658
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
605
659
|
|
660
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
661
|
+
|
606
662
|
if isinstance(dataset, DataFrame):
|
607
663
|
self._deps = self._batch_inference_validate_snowpark(
|
608
664
|
dataset=dataset,
|
609
665
|
inference_method=inference_method,
|
610
666
|
)
|
611
|
-
assert isinstance(
|
667
|
+
assert isinstance(
|
668
|
+
dataset._session, Session
|
669
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
612
670
|
transform_kwargs = dict(
|
613
671
|
session=dataset._session,
|
614
672
|
dependencies=self._deps,
|
615
|
-
drop_input_cols
|
673
|
+
drop_input_cols=self._drop_input_cols,
|
616
674
|
expected_output_cols_type="float",
|
617
675
|
)
|
676
|
+
expected_output_cols = self._align_expected_output_names(
|
677
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
678
|
+
)
|
618
679
|
|
619
680
|
elif isinstance(dataset, pd.DataFrame):
|
620
|
-
transform_kwargs = dict(
|
621
|
-
snowpark_input_cols = self._snowpark_cols,
|
622
|
-
drop_input_cols = self._drop_input_cols
|
623
|
-
)
|
681
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
624
682
|
|
625
683
|
transform_handlers = ModelTransformerBuilder.build(
|
626
684
|
dataset=dataset,
|
@@ -632,7 +690,7 @@ class LinearSVR(BaseTransformer):
|
|
632
690
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
633
691
|
inference_method=inference_method,
|
634
692
|
input_cols=self.input_cols,
|
635
|
-
expected_output_cols=
|
693
|
+
expected_output_cols=expected_output_cols,
|
636
694
|
**transform_kwargs
|
637
695
|
)
|
638
696
|
return output_df
|
@@ -662,7 +720,8 @@ class LinearSVR(BaseTransformer):
|
|
662
720
|
Output dataset with log probability of the sample for each class in the model.
|
663
721
|
"""
|
664
722
|
super()._check_dataset_type(dataset)
|
665
|
-
inference_method="predict_log_proba"
|
723
|
+
inference_method = "predict_log_proba"
|
724
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
666
725
|
|
667
726
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
668
727
|
# are specific to the type of dataset used.
|
@@ -673,18 +732,20 @@ class LinearSVR(BaseTransformer):
|
|
673
732
|
dataset=dataset,
|
674
733
|
inference_method=inference_method,
|
675
734
|
)
|
676
|
-
assert isinstance(
|
735
|
+
assert isinstance(
|
736
|
+
dataset._session, Session
|
737
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
677
738
|
transform_kwargs = dict(
|
678
739
|
session=dataset._session,
|
679
740
|
dependencies=self._deps,
|
680
|
-
drop_input_cols
|
741
|
+
drop_input_cols=self._drop_input_cols,
|
681
742
|
expected_output_cols_type="float",
|
682
743
|
)
|
744
|
+
expected_output_cols = self._align_expected_output_names(
|
745
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
746
|
+
)
|
683
747
|
elif isinstance(dataset, pd.DataFrame):
|
684
|
-
transform_kwargs = dict(
|
685
|
-
snowpark_input_cols = self._snowpark_cols,
|
686
|
-
drop_input_cols = self._drop_input_cols
|
687
|
-
)
|
748
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
688
749
|
|
689
750
|
transform_handlers = ModelTransformerBuilder.build(
|
690
751
|
dataset=dataset,
|
@@ -697,7 +758,7 @@ class LinearSVR(BaseTransformer):
|
|
697
758
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
698
759
|
inference_method=inference_method,
|
699
760
|
input_cols=self.input_cols,
|
700
|
-
expected_output_cols=
|
761
|
+
expected_output_cols=expected_output_cols,
|
701
762
|
**transform_kwargs
|
702
763
|
)
|
703
764
|
return output_df
|
@@ -723,30 +784,34 @@ class LinearSVR(BaseTransformer):
|
|
723
784
|
Output dataset with results of the decision function for the samples in input dataset.
|
724
785
|
"""
|
725
786
|
super()._check_dataset_type(dataset)
|
726
|
-
inference_method="decision_function"
|
787
|
+
inference_method = "decision_function"
|
727
788
|
|
728
789
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
729
790
|
# are specific to the type of dataset used.
|
730
791
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
731
792
|
|
793
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
794
|
+
|
732
795
|
if isinstance(dataset, DataFrame):
|
733
796
|
self._deps = self._batch_inference_validate_snowpark(
|
734
797
|
dataset=dataset,
|
735
798
|
inference_method=inference_method,
|
736
799
|
)
|
737
|
-
assert isinstance(
|
800
|
+
assert isinstance(
|
801
|
+
dataset._session, Session
|
802
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
738
803
|
transform_kwargs = dict(
|
739
804
|
session=dataset._session,
|
740
805
|
dependencies=self._deps,
|
741
|
-
drop_input_cols
|
806
|
+
drop_input_cols=self._drop_input_cols,
|
742
807
|
expected_output_cols_type="float",
|
743
808
|
)
|
809
|
+
expected_output_cols = self._align_expected_output_names(
|
810
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
811
|
+
)
|
744
812
|
|
745
813
|
elif isinstance(dataset, pd.DataFrame):
|
746
|
-
transform_kwargs = dict(
|
747
|
-
snowpark_input_cols = self._snowpark_cols,
|
748
|
-
drop_input_cols = self._drop_input_cols
|
749
|
-
)
|
814
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
750
815
|
|
751
816
|
transform_handlers = ModelTransformerBuilder.build(
|
752
817
|
dataset=dataset,
|
@@ -759,7 +824,7 @@ class LinearSVR(BaseTransformer):
|
|
759
824
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
760
825
|
inference_method=inference_method,
|
761
826
|
input_cols=self.input_cols,
|
762
|
-
expected_output_cols=
|
827
|
+
expected_output_cols=expected_output_cols,
|
763
828
|
**transform_kwargs
|
764
829
|
)
|
765
830
|
return output_df
|
@@ -788,12 +853,14 @@ class LinearSVR(BaseTransformer):
|
|
788
853
|
Output dataset with probability of the sample for each class in the model.
|
789
854
|
"""
|
790
855
|
super()._check_dataset_type(dataset)
|
791
|
-
inference_method="score_samples"
|
856
|
+
inference_method = "score_samples"
|
792
857
|
|
793
858
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
794
859
|
# are specific to the type of dataset used.
|
795
860
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
796
861
|
|
862
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
863
|
+
|
797
864
|
if isinstance(dataset, DataFrame):
|
798
865
|
self._deps = self._batch_inference_validate_snowpark(
|
799
866
|
dataset=dataset,
|
@@ -806,6 +873,9 @@ class LinearSVR(BaseTransformer):
|
|
806
873
|
drop_input_cols = self._drop_input_cols,
|
807
874
|
expected_output_cols_type="float",
|
808
875
|
)
|
876
|
+
expected_output_cols = self._align_expected_output_names(
|
877
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
878
|
+
)
|
809
879
|
|
810
880
|
elif isinstance(dataset, pd.DataFrame):
|
811
881
|
transform_kwargs = dict(
|
@@ -824,7 +894,7 @@ class LinearSVR(BaseTransformer):
|
|
824
894
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
825
895
|
inference_method=inference_method,
|
826
896
|
input_cols=self.input_cols,
|
827
|
-
expected_output_cols=
|
897
|
+
expected_output_cols=expected_output_cols,
|
828
898
|
**transform_kwargs
|
829
899
|
)
|
830
900
|
return output_df
|
@@ -971,50 +1041,84 @@ class LinearSVR(BaseTransformer):
|
|
971
1041
|
)
|
972
1042
|
return output_df
|
973
1043
|
|
1044
|
+
|
1045
|
+
|
1046
|
+
def to_sklearn(self) -> Any:
|
1047
|
+
"""Get sklearn.svm.LinearSVR object.
|
1048
|
+
"""
|
1049
|
+
if self._sklearn_object is None:
|
1050
|
+
self._sklearn_object = self._create_sklearn_object()
|
1051
|
+
return self._sklearn_object
|
1052
|
+
|
1053
|
+
def to_xgboost(self) -> Any:
|
1054
|
+
raise exceptions.SnowflakeMLException(
|
1055
|
+
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1056
|
+
original_exception=AttributeError(
|
1057
|
+
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1058
|
+
"to_xgboost()",
|
1059
|
+
"to_sklearn()"
|
1060
|
+
)
|
1061
|
+
),
|
1062
|
+
)
|
1063
|
+
|
1064
|
+
def to_lightgbm(self) -> Any:
|
1065
|
+
raise exceptions.SnowflakeMLException(
|
1066
|
+
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1067
|
+
original_exception=AttributeError(
|
1068
|
+
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1069
|
+
"to_lightgbm()",
|
1070
|
+
"to_sklearn()"
|
1071
|
+
)
|
1072
|
+
),
|
1073
|
+
)
|
974
1074
|
|
975
|
-
def
|
1075
|
+
def _get_dependencies(self) -> List[str]:
|
1076
|
+
return self._deps
|
1077
|
+
|
1078
|
+
|
1079
|
+
def _generate_model_signatures(self, dataset: Union[DataFrame, pd.DataFrame]) -> None:
|
976
1080
|
self._model_signature_dict = dict()
|
977
1081
|
|
978
1082
|
PROB_FUNCTIONS = ["predict_log_proba", "predict_proba", "decision_function"]
|
979
1083
|
|
980
|
-
inputs = list(_infer_signature(dataset[self.input_cols], "input"))
|
1084
|
+
inputs = list(_infer_signature(dataset[self.input_cols], "input", use_snowflake_identifiers=True))
|
981
1085
|
outputs: List[BaseFeatureSpec] = []
|
982
1086
|
if hasattr(self, "predict"):
|
983
1087
|
# keep mypy happy
|
984
|
-
assert self._sklearn_object is not None and hasattr(self._sklearn_object, "_estimator_type")
|
1088
|
+
assert self._sklearn_object is not None and hasattr(self._sklearn_object, "_estimator_type")
|
985
1089
|
# For classifier, the type of predict is the same as the type of label
|
986
|
-
if self._sklearn_object._estimator_type ==
|
987
|
-
|
1090
|
+
if self._sklearn_object._estimator_type == "classifier":
|
1091
|
+
# label columns is the desired type for output
|
988
1092
|
outputs = list(_infer_signature(dataset[self.label_cols], "output", use_snowflake_identifiers=True))
|
989
1093
|
# rename the output columns
|
990
1094
|
outputs = list(model_signature_utils.rename_features(outputs, self.output_cols))
|
991
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
992
|
-
|
993
|
-
|
1095
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1096
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1097
|
+
)
|
994
1098
|
# For mixture models that use the density mixin, `predict` returns the argmax of the log prob.
|
995
1099
|
# For outlier models, returns -1 for outliers and 1 for inliers.
|
996
|
-
# Clusterer returns int64 cluster labels.
|
1100
|
+
# Clusterer returns int64 cluster labels.
|
997
1101
|
elif self._sklearn_object._estimator_type in ["DensityEstimator", "clusterer", "outlier_detector"]:
|
998
1102
|
outputs = [FeatureSpec(dtype=DataType.INT64, name=c) for c in self.output_cols]
|
999
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
1000
|
-
|
1001
|
-
|
1002
|
-
|
1103
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1104
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1105
|
+
)
|
1106
|
+
|
1003
1107
|
# For regressor, the type of predict is float64
|
1004
|
-
elif self._sklearn_object._estimator_type ==
|
1108
|
+
elif self._sklearn_object._estimator_type == "regressor":
|
1005
1109
|
outputs = [FeatureSpec(dtype=DataType.DOUBLE, name=c) for c in self.output_cols]
|
1006
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
1007
|
-
|
1008
|
-
|
1009
|
-
|
1110
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1111
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1112
|
+
)
|
1113
|
+
|
1010
1114
|
for prob_func in PROB_FUNCTIONS:
|
1011
1115
|
if hasattr(self, prob_func):
|
1012
1116
|
output_cols_prefix: str = f"{prob_func}_"
|
1013
1117
|
output_column_names = self._get_output_column_names(output_cols_prefix)
|
1014
1118
|
outputs = [FeatureSpec(dtype=DataType.DOUBLE, name=c) for c in output_column_names]
|
1015
|
-
self._model_signature_dict[prob_func] = ModelSignature(
|
1016
|
-
|
1017
|
-
|
1119
|
+
self._model_signature_dict[prob_func] = ModelSignature(
|
1120
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1121
|
+
)
|
1018
1122
|
|
1019
1123
|
# Output signature names may still need to be renamed, since they were not created with `_infer_signature`.
|
1020
1124
|
items = list(self._model_signature_dict.items())
|
@@ -1027,10 +1131,10 @@ class LinearSVR(BaseTransformer):
|
|
1027
1131
|
"""Returns model signature of current class.
|
1028
1132
|
|
1029
1133
|
Raises:
|
1030
|
-
|
1134
|
+
SnowflakeMLException: If estimator is not fitted, then model signature cannot be inferred
|
1031
1135
|
|
1032
1136
|
Returns:
|
1033
|
-
Dict
|
1137
|
+
Dict with each method and its input output signature
|
1034
1138
|
"""
|
1035
1139
|
if self._model_signature_dict is None:
|
1036
1140
|
raise exceptions.SnowflakeMLException(
|
@@ -1038,35 +1142,3 @@ class LinearSVR(BaseTransformer):
|
|
1038
1142
|
original_exception=RuntimeError("Estimator not fitted before accessing property model_signatures!"),
|
1039
1143
|
)
|
1040
1144
|
return self._model_signature_dict
|
1041
|
-
|
1042
|
-
def to_sklearn(self) -> Any:
|
1043
|
-
"""Get sklearn.svm.LinearSVR object.
|
1044
|
-
"""
|
1045
|
-
if self._sklearn_object is None:
|
1046
|
-
self._sklearn_object = self._create_sklearn_object()
|
1047
|
-
return self._sklearn_object
|
1048
|
-
|
1049
|
-
def to_xgboost(self) -> Any:
|
1050
|
-
raise exceptions.SnowflakeMLException(
|
1051
|
-
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1052
|
-
original_exception=AttributeError(
|
1053
|
-
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1054
|
-
"to_xgboost()",
|
1055
|
-
"to_sklearn()"
|
1056
|
-
)
|
1057
|
-
),
|
1058
|
-
)
|
1059
|
-
|
1060
|
-
def to_lightgbm(self) -> Any:
|
1061
|
-
raise exceptions.SnowflakeMLException(
|
1062
|
-
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1063
|
-
original_exception=AttributeError(
|
1064
|
-
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1065
|
-
"to_lightgbm()",
|
1066
|
-
"to_sklearn()"
|
1067
|
-
)
|
1068
|
-
),
|
1069
|
-
)
|
1070
|
-
|
1071
|
-
def _get_dependencies(self) -> List[str]:
|
1072
|
-
return self._deps
|