snowflake-ml-python 1.1.0__py3-none-any.whl → 1.1.2__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/cortex/_complete.py +1 -1
- snowflake/cortex/_extract_answer.py +1 -1
- snowflake/cortex/_sentiment.py +1 -1
- snowflake/cortex/_summarize.py +1 -1
- snowflake/cortex/_translate.py +1 -1
- snowflake/ml/_internal/env_utils.py +68 -6
- snowflake/ml/_internal/file_utils.py +34 -4
- snowflake/ml/_internal/telemetry.py +79 -91
- snowflake/ml/_internal/utils/identifier.py +78 -72
- snowflake/ml/_internal/utils/retryable_http.py +16 -4
- snowflake/ml/_internal/utils/spcs_attribution_utils.py +122 -0
- snowflake/ml/dataset/dataset.py +1 -1
- snowflake/ml/model/_api.py +21 -14
- snowflake/ml/model/_client/model/model_impl.py +176 -0
- snowflake/ml/model/_client/model/model_method_info.py +19 -0
- snowflake/ml/model/_client/model/model_version_impl.py +291 -0
- snowflake/ml/model/_client/ops/metadata_ops.py +107 -0
- snowflake/ml/model/_client/ops/model_ops.py +308 -0
- snowflake/ml/model/_client/sql/model.py +75 -0
- snowflake/ml/model/_client/sql/model_version.py +213 -0
- snowflake/ml/model/_client/sql/stage.py +40 -0
- snowflake/ml/model/_deploy_client/image_builds/server_image_builder.py +3 -4
- snowflake/ml/model/_deploy_client/image_builds/templates/image_build_job_spec_template +24 -8
- snowflake/ml/model/_deploy_client/image_builds/templates/kaniko_shell_script_template +23 -0
- snowflake/ml/model/_deploy_client/snowservice/deploy.py +14 -2
- snowflake/ml/model/_deploy_client/utils/constants.py +1 -0
- snowflake/ml/model/_deploy_client/warehouse/deploy.py +2 -2
- snowflake/ml/model/_model_composer/model_composer.py +31 -9
- snowflake/ml/model/_model_composer/model_manifest/model_manifest.py +25 -10
- snowflake/ml/model/_model_composer/model_manifest/model_manifest_schema.py +2 -2
- snowflake/ml/model/_model_composer/model_method/infer_function.py_template +2 -1
- snowflake/ml/model/_model_composer/model_method/model_method.py +34 -3
- snowflake/ml/model/_model_composer/model_runtime/model_runtime.py +1 -1
- snowflake/ml/model/_packager/model_handlers/huggingface_pipeline.py +3 -1
- snowflake/ml/model/_packager/model_handlers/snowmlmodel.py +10 -28
- snowflake/ml/model/_packager/model_meta/model_meta.py +18 -16
- snowflake/ml/model/_signatures/snowpark_handler.py +1 -1
- snowflake/ml/model/model_signature.py +108 -53
- snowflake/ml/model/type_hints.py +1 -0
- snowflake/ml/modeling/_internal/distributed_hpo_trainer.py +554 -0
- snowflake/ml/modeling/_internal/estimator_protocols.py +1 -60
- snowflake/ml/modeling/_internal/model_specifications.py +146 -0
- snowflake/ml/modeling/_internal/model_trainer.py +13 -0
- snowflake/ml/modeling/_internal/model_trainer_builder.py +78 -0
- snowflake/ml/modeling/_internal/pandas_trainer.py +54 -0
- snowflake/ml/modeling/_internal/snowpark_handlers.py +6 -760
- snowflake/ml/modeling/_internal/snowpark_trainer.py +331 -0
- snowflake/ml/modeling/calibration/calibrated_classifier_cv.py +108 -135
- snowflake/ml/modeling/cluster/affinity_propagation.py +106 -135
- snowflake/ml/modeling/cluster/agglomerative_clustering.py +106 -135
- snowflake/ml/modeling/cluster/birch.py +106 -135
- snowflake/ml/modeling/cluster/bisecting_k_means.py +106 -135
- snowflake/ml/modeling/cluster/dbscan.py +106 -135
- snowflake/ml/modeling/cluster/feature_agglomeration.py +106 -135
- snowflake/ml/modeling/cluster/k_means.py +105 -135
- snowflake/ml/modeling/cluster/mean_shift.py +106 -135
- snowflake/ml/modeling/cluster/mini_batch_k_means.py +105 -135
- snowflake/ml/modeling/cluster/optics.py +106 -135
- snowflake/ml/modeling/cluster/spectral_biclustering.py +106 -135
- snowflake/ml/modeling/cluster/spectral_clustering.py +106 -135
- snowflake/ml/modeling/cluster/spectral_coclustering.py +106 -135
- snowflake/ml/modeling/compose/column_transformer.py +106 -135
- snowflake/ml/modeling/compose/transformed_target_regressor.py +108 -135
- snowflake/ml/modeling/covariance/elliptic_envelope.py +106 -135
- snowflake/ml/modeling/covariance/empirical_covariance.py +99 -128
- snowflake/ml/modeling/covariance/graphical_lasso.py +106 -135
- snowflake/ml/modeling/covariance/graphical_lasso_cv.py +106 -135
- snowflake/ml/modeling/covariance/ledoit_wolf.py +104 -133
- snowflake/ml/modeling/covariance/min_cov_det.py +106 -135
- snowflake/ml/modeling/covariance/oas.py +99 -128
- snowflake/ml/modeling/covariance/shrunk_covariance.py +103 -132
- snowflake/ml/modeling/decomposition/dictionary_learning.py +106 -135
- snowflake/ml/modeling/decomposition/factor_analysis.py +106 -135
- snowflake/ml/modeling/decomposition/fast_ica.py +106 -135
- snowflake/ml/modeling/decomposition/incremental_pca.py +106 -135
- snowflake/ml/modeling/decomposition/kernel_pca.py +106 -135
- snowflake/ml/modeling/decomposition/mini_batch_dictionary_learning.py +106 -135
- snowflake/ml/modeling/decomposition/mini_batch_sparse_pca.py +106 -135
- snowflake/ml/modeling/decomposition/pca.py +106 -135
- snowflake/ml/modeling/decomposition/sparse_pca.py +106 -135
- snowflake/ml/modeling/decomposition/truncated_svd.py +106 -135
- snowflake/ml/modeling/discriminant_analysis/linear_discriminant_analysis.py +108 -135
- snowflake/ml/modeling/discriminant_analysis/quadratic_discriminant_analysis.py +108 -135
- snowflake/ml/modeling/ensemble/ada_boost_classifier.py +108 -135
- snowflake/ml/modeling/ensemble/ada_boost_regressor.py +108 -135
- snowflake/ml/modeling/ensemble/bagging_classifier.py +108 -135
- snowflake/ml/modeling/ensemble/bagging_regressor.py +108 -135
- snowflake/ml/modeling/ensemble/extra_trees_classifier.py +108 -135
- snowflake/ml/modeling/ensemble/extra_trees_regressor.py +108 -135
- snowflake/ml/modeling/ensemble/gradient_boosting_classifier.py +108 -135
- snowflake/ml/modeling/ensemble/gradient_boosting_regressor.py +108 -135
- snowflake/ml/modeling/ensemble/hist_gradient_boosting_classifier.py +108 -135
- snowflake/ml/modeling/ensemble/hist_gradient_boosting_regressor.py +108 -135
- snowflake/ml/modeling/ensemble/isolation_forest.py +106 -135
- snowflake/ml/modeling/ensemble/random_forest_classifier.py +108 -135
- snowflake/ml/modeling/ensemble/random_forest_regressor.py +108 -135
- snowflake/ml/modeling/ensemble/stacking_regressor.py +108 -135
- snowflake/ml/modeling/ensemble/voting_classifier.py +108 -135
- snowflake/ml/modeling/ensemble/voting_regressor.py +108 -135
- snowflake/ml/modeling/feature_selection/generic_univariate_select.py +101 -128
- snowflake/ml/modeling/feature_selection/select_fdr.py +99 -126
- snowflake/ml/modeling/feature_selection/select_fpr.py +99 -126
- snowflake/ml/modeling/feature_selection/select_fwe.py +99 -126
- snowflake/ml/modeling/feature_selection/select_k_best.py +100 -127
- snowflake/ml/modeling/feature_selection/select_percentile.py +99 -126
- snowflake/ml/modeling/feature_selection/sequential_feature_selector.py +106 -135
- snowflake/ml/modeling/feature_selection/variance_threshold.py +95 -124
- snowflake/ml/modeling/framework/base.py +83 -1
- snowflake/ml/modeling/gaussian_process/gaussian_process_classifier.py +108 -135
- snowflake/ml/modeling/gaussian_process/gaussian_process_regressor.py +108 -135
- snowflake/ml/modeling/impute/iterative_imputer.py +106 -135
- snowflake/ml/modeling/impute/knn_imputer.py +106 -135
- snowflake/ml/modeling/impute/missing_indicator.py +106 -135
- snowflake/ml/modeling/impute/simple_imputer.py +9 -1
- snowflake/ml/modeling/kernel_approximation/additive_chi2_sampler.py +96 -125
- snowflake/ml/modeling/kernel_approximation/nystroem.py +106 -135
- snowflake/ml/modeling/kernel_approximation/polynomial_count_sketch.py +106 -135
- snowflake/ml/modeling/kernel_approximation/rbf_sampler.py +105 -134
- snowflake/ml/modeling/kernel_approximation/skewed_chi2_sampler.py +103 -132
- snowflake/ml/modeling/kernel_ridge/kernel_ridge.py +108 -135
- snowflake/ml/modeling/lightgbm/lgbm_classifier.py +90 -118
- snowflake/ml/modeling/lightgbm/lgbm_regressor.py +90 -118
- snowflake/ml/modeling/linear_model/ard_regression.py +108 -135
- snowflake/ml/modeling/linear_model/bayesian_ridge.py +108 -135
- snowflake/ml/modeling/linear_model/elastic_net.py +108 -135
- snowflake/ml/modeling/linear_model/elastic_net_cv.py +108 -135
- snowflake/ml/modeling/linear_model/gamma_regressor.py +108 -135
- snowflake/ml/modeling/linear_model/huber_regressor.py +108 -135
- snowflake/ml/modeling/linear_model/lars.py +108 -135
- snowflake/ml/modeling/linear_model/lars_cv.py +108 -135
- snowflake/ml/modeling/linear_model/lasso.py +108 -135
- snowflake/ml/modeling/linear_model/lasso_cv.py +108 -135
- snowflake/ml/modeling/linear_model/lasso_lars.py +108 -135
- snowflake/ml/modeling/linear_model/lasso_lars_cv.py +108 -135
- snowflake/ml/modeling/linear_model/lasso_lars_ic.py +108 -135
- snowflake/ml/modeling/linear_model/linear_regression.py +108 -135
- snowflake/ml/modeling/linear_model/logistic_regression.py +108 -135
- snowflake/ml/modeling/linear_model/logistic_regression_cv.py +108 -135
- snowflake/ml/modeling/linear_model/multi_task_elastic_net.py +108 -135
- snowflake/ml/modeling/linear_model/multi_task_elastic_net_cv.py +108 -135
- snowflake/ml/modeling/linear_model/multi_task_lasso.py +108 -135
- snowflake/ml/modeling/linear_model/multi_task_lasso_cv.py +108 -135
- snowflake/ml/modeling/linear_model/orthogonal_matching_pursuit.py +108 -135
- snowflake/ml/modeling/linear_model/passive_aggressive_classifier.py +108 -135
- snowflake/ml/modeling/linear_model/passive_aggressive_regressor.py +107 -135
- snowflake/ml/modeling/linear_model/perceptron.py +107 -135
- snowflake/ml/modeling/linear_model/poisson_regressor.py +108 -135
- snowflake/ml/modeling/linear_model/ransac_regressor.py +108 -135
- snowflake/ml/modeling/linear_model/ridge.py +108 -135
- snowflake/ml/modeling/linear_model/ridge_classifier.py +108 -135
- snowflake/ml/modeling/linear_model/ridge_classifier_cv.py +108 -135
- snowflake/ml/modeling/linear_model/ridge_cv.py +108 -135
- snowflake/ml/modeling/linear_model/sgd_classifier.py +108 -135
- snowflake/ml/modeling/linear_model/sgd_one_class_svm.py +106 -135
- snowflake/ml/modeling/linear_model/sgd_regressor.py +108 -135
- snowflake/ml/modeling/linear_model/theil_sen_regressor.py +108 -135
- snowflake/ml/modeling/linear_model/tweedie_regressor.py +108 -135
- snowflake/ml/modeling/manifold/isomap.py +106 -135
- snowflake/ml/modeling/manifold/mds.py +106 -135
- snowflake/ml/modeling/manifold/spectral_embedding.py +106 -135
- snowflake/ml/modeling/manifold/tsne.py +106 -135
- snowflake/ml/modeling/metrics/classification.py +196 -55
- snowflake/ml/modeling/metrics/correlation.py +4 -2
- snowflake/ml/modeling/metrics/covariance.py +7 -4
- snowflake/ml/modeling/metrics/ranking.py +32 -16
- snowflake/ml/modeling/metrics/regression.py +60 -32
- snowflake/ml/modeling/mixture/bayesian_gaussian_mixture.py +106 -135
- snowflake/ml/modeling/mixture/gaussian_mixture.py +106 -135
- snowflake/ml/modeling/model_selection/grid_search_cv.py +91 -148
- snowflake/ml/modeling/model_selection/randomized_search_cv.py +93 -154
- snowflake/ml/modeling/multiclass/one_vs_one_classifier.py +105 -132
- snowflake/ml/modeling/multiclass/one_vs_rest_classifier.py +108 -135
- snowflake/ml/modeling/multiclass/output_code_classifier.py +108 -135
- snowflake/ml/modeling/naive_bayes/bernoulli_nb.py +108 -135
- snowflake/ml/modeling/naive_bayes/categorical_nb.py +108 -135
- snowflake/ml/modeling/naive_bayes/complement_nb.py +108 -135
- snowflake/ml/modeling/naive_bayes/gaussian_nb.py +98 -125
- snowflake/ml/modeling/naive_bayes/multinomial_nb.py +107 -134
- snowflake/ml/modeling/neighbors/k_neighbors_classifier.py +108 -135
- snowflake/ml/modeling/neighbors/k_neighbors_regressor.py +108 -135
- snowflake/ml/modeling/neighbors/kernel_density.py +106 -135
- snowflake/ml/modeling/neighbors/local_outlier_factor.py +106 -135
- snowflake/ml/modeling/neighbors/nearest_centroid.py +108 -135
- snowflake/ml/modeling/neighbors/nearest_neighbors.py +106 -135
- snowflake/ml/modeling/neighbors/neighborhood_components_analysis.py +108 -135
- snowflake/ml/modeling/neighbors/radius_neighbors_classifier.py +108 -135
- snowflake/ml/modeling/neighbors/radius_neighbors_regressor.py +108 -135
- snowflake/ml/modeling/neural_network/bernoulli_rbm.py +106 -135
- snowflake/ml/modeling/neural_network/mlp_classifier.py +108 -135
- snowflake/ml/modeling/neural_network/mlp_regressor.py +108 -135
- snowflake/ml/modeling/parameters/disable_distributed_hpo.py +2 -6
- snowflake/ml/modeling/preprocessing/binarizer.py +25 -8
- snowflake/ml/modeling/preprocessing/k_bins_discretizer.py +9 -4
- snowflake/ml/modeling/preprocessing/label_encoder.py +31 -11
- snowflake/ml/modeling/preprocessing/max_abs_scaler.py +27 -9
- snowflake/ml/modeling/preprocessing/min_max_scaler.py +42 -14
- snowflake/ml/modeling/preprocessing/normalizer.py +9 -4
- snowflake/ml/modeling/preprocessing/one_hot_encoder.py +26 -10
- snowflake/ml/modeling/preprocessing/ordinal_encoder.py +37 -13
- snowflake/ml/modeling/preprocessing/polynomial_features.py +106 -135
- snowflake/ml/modeling/preprocessing/robust_scaler.py +39 -13
- snowflake/ml/modeling/preprocessing/standard_scaler.py +36 -12
- snowflake/ml/modeling/semi_supervised/label_propagation.py +108 -135
- snowflake/ml/modeling/semi_supervised/label_spreading.py +108 -135
- snowflake/ml/modeling/svm/linear_svc.py +108 -135
- snowflake/ml/modeling/svm/linear_svr.py +108 -135
- snowflake/ml/modeling/svm/nu_svc.py +108 -135
- snowflake/ml/modeling/svm/nu_svr.py +108 -135
- snowflake/ml/modeling/svm/svc.py +108 -135
- snowflake/ml/modeling/svm/svr.py +108 -135
- snowflake/ml/modeling/tree/decision_tree_classifier.py +108 -135
- snowflake/ml/modeling/tree/decision_tree_regressor.py +108 -135
- snowflake/ml/modeling/tree/extra_tree_classifier.py +108 -135
- snowflake/ml/modeling/tree/extra_tree_regressor.py +108 -135
- snowflake/ml/modeling/xgboost/xgb_classifier.py +108 -136
- snowflake/ml/modeling/xgboost/xgb_regressor.py +108 -136
- snowflake/ml/modeling/xgboost/xgbrf_classifier.py +108 -136
- snowflake/ml/modeling/xgboost/xgbrf_regressor.py +108 -136
- snowflake/ml/registry/model_registry.py +2 -0
- snowflake/ml/registry/registry.py +215 -0
- snowflake/ml/version.py +1 -1
- {snowflake_ml_python-1.1.0.dist-info → snowflake_ml_python-1.1.2.dist-info}/METADATA +34 -1
- snowflake_ml_python-1.1.2.dist-info/RECORD +347 -0
- snowflake_ml_python-1.1.0.dist-info/RECORD +0 -331
- {snowflake_ml_python-1.1.0.dist-info → snowflake_ml_python-1.1.2.dist-info}/WHEEL +0 -0
@@ -1,8 +1,10 @@
|
|
1
|
+
import enum
|
1
2
|
import warnings
|
2
|
-
from typing import Any, List, Literal, Optional, Sequence, Tuple, Type
|
3
|
+
from typing import Any, Dict, List, Literal, Optional, Sequence, Tuple, Type
|
3
4
|
|
4
5
|
import numpy as np
|
5
6
|
import pandas as pd
|
7
|
+
from typing_extensions import Never
|
6
8
|
|
7
9
|
import snowflake.snowpark
|
8
10
|
import snowflake.snowpark.functions as F
|
@@ -11,7 +13,7 @@ from snowflake.ml._internal.exceptions import (
|
|
11
13
|
error_codes,
|
12
14
|
exceptions as snowml_exceptions,
|
13
15
|
)
|
14
|
-
from snowflake.ml._internal.utils import formatting, identifier
|
16
|
+
from snowflake.ml._internal.utils import formatting, identifier, sql_identifier
|
15
17
|
from snowflake.ml.model import type_hints as model_types
|
16
18
|
from snowflake.ml.model._signatures import (
|
17
19
|
base_handler,
|
@@ -310,8 +312,35 @@ def _validate_pandas_df(data: pd.DataFrame, features: Sequence[core.BaseFeatureS
|
|
310
312
|
)
|
311
313
|
|
312
314
|
|
313
|
-
def
|
314
|
-
"
|
315
|
+
def assert_never(arg: Never) -> Never:
|
316
|
+
raise AssertionError("Expected code to be unreachable")
|
317
|
+
|
318
|
+
|
319
|
+
class SnowparkIdentifierRule(enum.Enum):
|
320
|
+
INFERRED = "inferred"
|
321
|
+
NORMALIZED = "normalized"
|
322
|
+
|
323
|
+
def get_identifier_from_feature(self, ft_name: str) -> str:
|
324
|
+
if self == SnowparkIdentifierRule.INFERRED:
|
325
|
+
return identifier.get_inferred_name(ft_name)
|
326
|
+
elif self == SnowparkIdentifierRule.NORMALIZED:
|
327
|
+
return identifier.resolve_identifier(ft_name)
|
328
|
+
else:
|
329
|
+
assert_never(self)
|
330
|
+
|
331
|
+
def get_sql_identifier_from_feature(self, ft_name: str) -> sql_identifier.SqlIdentifier:
|
332
|
+
if self == SnowparkIdentifierRule.INFERRED:
|
333
|
+
return sql_identifier.SqlIdentifier(ft_name, case_sensitive=True)
|
334
|
+
elif self == SnowparkIdentifierRule.NORMALIZED:
|
335
|
+
return sql_identifier.SqlIdentifier(ft_name, case_sensitive=False)
|
336
|
+
else:
|
337
|
+
assert_never(self)
|
338
|
+
|
339
|
+
|
340
|
+
def _validate_snowpark_data(
|
341
|
+
data: snowflake.snowpark.DataFrame, features: Sequence[core.BaseFeatureSpec]
|
342
|
+
) -> SnowparkIdentifierRule:
|
343
|
+
"""Validate Snowpark DataFrame as input. It will try to map both normalized name or inferred name.
|
315
344
|
|
316
345
|
Args:
|
317
346
|
data: A snowpark dataframe to be validated.
|
@@ -321,60 +350,86 @@ def _validate_snowpark_data(data: snowflake.snowpark.DataFrame, features: Sequen
|
|
321
350
|
SnowflakeMLException: NotImplementedError: FeatureGroupSpec is not supported.
|
322
351
|
SnowflakeMLException: ValueError: Raised when confronting invalid feature.
|
323
352
|
SnowflakeMLException: ValueError: Raised when a feature cannot be found.
|
324
|
-
"""
|
325
353
|
|
354
|
+
Returns:
|
355
|
+
Identifier rule to use.
|
356
|
+
- inferred: signature `a` - Snowpark DF `"a"`, use `get_inferred_name`
|
357
|
+
- normalized: signature `a` - Snowpark DF `A`, use `resolve_identifier`
|
358
|
+
"""
|
359
|
+
errors: Dict[SnowparkIdentifierRule, List[Exception]] = {
|
360
|
+
SnowparkIdentifierRule.INFERRED: [],
|
361
|
+
SnowparkIdentifierRule.NORMALIZED: [],
|
362
|
+
}
|
326
363
|
schema = data.schema
|
327
|
-
for
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
stacklevel=1,
|
340
|
-
)
|
341
|
-
if isinstance(feature, core.FeatureGroupSpec):
|
342
|
-
raise snowml_exceptions.SnowflakeMLException(
|
343
|
-
error_code=error_codes.NOT_IMPLEMENTED,
|
344
|
-
original_exception=NotImplementedError("FeatureGroupSpec is not supported."),
|
345
|
-
)
|
346
|
-
assert isinstance(feature, core.FeatureSpec) # mypy
|
347
|
-
ft_type = feature._dtype
|
348
|
-
field_data_type = field.datatype
|
349
|
-
if isinstance(field_data_type, spt.ArrayType):
|
350
|
-
if feature._shape is None:
|
364
|
+
for identifier_rule in errors.keys():
|
365
|
+
for feature in features:
|
366
|
+
try:
|
367
|
+
ft_name = identifier_rule.get_identifier_from_feature(feature.name)
|
368
|
+
except ValueError as e:
|
369
|
+
errors[identifier_rule].append(e)
|
370
|
+
continue
|
371
|
+
found = False
|
372
|
+
for field in schema.fields:
|
373
|
+
if field.name == ft_name:
|
374
|
+
found = True
|
375
|
+
if isinstance(feature, core.FeatureGroupSpec):
|
351
376
|
raise snowml_exceptions.SnowflakeMLException(
|
352
|
-
error_code=error_codes.
|
353
|
-
original_exception=
|
354
|
-
f"Data Validation Error in feature {ft_name}: "
|
355
|
-
+ f"Feature is a array feature, while {field.name} is not."
|
356
|
-
),
|
377
|
+
error_code=error_codes.NOT_IMPLEMENTED,
|
378
|
+
original_exception=NotImplementedError("FeatureGroupSpec is not supported."),
|
357
379
|
)
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
),
|
380
|
+
assert isinstance(feature, core.FeatureSpec) # mypy
|
381
|
+
ft_type = feature._dtype
|
382
|
+
field_data_type = field.datatype
|
383
|
+
if isinstance(field_data_type, spt.ArrayType):
|
384
|
+
if feature._shape is None:
|
385
|
+
errors[identifier_rule].append(
|
386
|
+
ValueError(
|
387
|
+
f"Data Validation Error in feature {feature.name}: "
|
388
|
+
+ f"Feature is an array feature, while {field.name} is not."
|
389
|
+
),
|
390
|
+
)
|
391
|
+
warnings.warn(
|
392
|
+
(f"Feature {feature.name} type cannot be validated: feature is an array feature."),
|
393
|
+
category=RuntimeWarning,
|
394
|
+
stacklevel=2,
|
371
395
|
)
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
396
|
+
else:
|
397
|
+
if feature._shape:
|
398
|
+
errors[identifier_rule].append(
|
399
|
+
ValueError(
|
400
|
+
f"Data Validation Error in feature {feature.name}: "
|
401
|
+
+ f"Feature is a scalar feature, while {field.name} is not."
|
402
|
+
),
|
403
|
+
)
|
404
|
+
try:
|
405
|
+
_validate_snowpark_type_feature(data, field, ft_type, feature.name)
|
406
|
+
except snowml_exceptions.SnowflakeMLException as e:
|
407
|
+
errors[identifier_rule].append(e.original_exception)
|
408
|
+
break
|
409
|
+
if not found:
|
410
|
+
errors[identifier_rule].append(
|
411
|
+
ValueError(f"Data Validation Error: feature {feature.name} does not exist in data."),
|
412
|
+
)
|
413
|
+
if all(len(error_list) != 0 for error_list in errors.values()):
|
414
|
+
raise snowml_exceptions.SnowflakeMLException(
|
415
|
+
error_code=error_codes.INVALID_DATA,
|
416
|
+
original_exception=ValueError(
|
417
|
+
f"""
|
418
|
+
Data Validation Error when validating your Snowpark DataFrame.
|
419
|
+
If using the normalized names from model signatures, there are the following errors:
|
420
|
+
{errors[SnowparkIdentifierRule.NORMALIZED]}
|
421
|
+
|
422
|
+
If using the inferred names from model signatures, there are the following errors:
|
423
|
+
{errors[SnowparkIdentifierRule.INFERRED]}
|
424
|
+
"""
|
425
|
+
),
|
426
|
+
)
|
427
|
+
else:
|
428
|
+
return (
|
429
|
+
SnowparkIdentifierRule.INFERRED
|
430
|
+
if len(errors[SnowparkIdentifierRule.INFERRED]) == 0
|
431
|
+
else SnowparkIdentifierRule.NORMALIZED
|
432
|
+
)
|
378
433
|
|
379
434
|
|
380
435
|
def _validate_snowpark_type_feature(
|