upgini 1.2.117a1__py3-none-any.whl → 1.2.119__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.
- upgini/__about__.py +1 -1
- upgini/features_enricher.py +103 -40
- upgini/metrics.py +3 -2
- upgini/resource_bundle/strings.properties +1 -0
- upgini/utils/display_utils.py +12 -9
- upgini/utils/psi.py +0 -3
- {upgini-1.2.117a1.dist-info → upgini-1.2.119.dist-info}/METADATA +1 -1
- {upgini-1.2.117a1.dist-info → upgini-1.2.119.dist-info}/RECORD +10 -10
- {upgini-1.2.117a1.dist-info → upgini-1.2.119.dist-info}/WHEEL +0 -0
- {upgini-1.2.117a1.dist-info → upgini-1.2.119.dist-info}/licenses/LICENSE +0 -0
upgini/__about__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "1.2.
|
1
|
+
__version__ = "1.2.119"
|
upgini/features_enricher.py
CHANGED
@@ -854,7 +854,7 @@ class FeaturesEnricher(TransformerMixin):
|
|
854
854
|
raise e
|
855
855
|
finally:
|
856
856
|
self.logger.info(f"Transform elapsed time: {time.time() - start_time}")
|
857
|
-
|
857
|
+
|
858
858
|
return result
|
859
859
|
|
860
860
|
def calculate_metrics(
|
@@ -1423,8 +1423,15 @@ class FeaturesEnricher(TransformerMixin):
|
|
1423
1423
|
# Find latest eval set or earliest if all eval sets are before train set
|
1424
1424
|
date_column = self._get_date_column(search_keys)
|
1425
1425
|
|
1426
|
-
|
1427
|
-
|
1426
|
+
x_date = X[date_column].dropna()
|
1427
|
+
if not is_numeric_dtype(x_date):
|
1428
|
+
x_date = pd.to_datetime(x_date).dt.floor("D").astype(np.int64) / 10**6
|
1429
|
+
main_min_date = x_date.min()
|
1430
|
+
|
1431
|
+
for eval_x, _ in eval_set:
|
1432
|
+
eval_x_date = eval_x[date_column].dropna()
|
1433
|
+
if not is_numeric_dtype(eval_x_date):
|
1434
|
+
eval_x[date_column] = pd.to_datetime(eval_x_date).dt.floor("D").astype(np.int64) / 10**6
|
1428
1435
|
|
1429
1436
|
# Find minimum date for each eval_set and compare with main dataset
|
1430
1437
|
eval_dates = []
|
@@ -1433,8 +1440,11 @@ class FeaturesEnricher(TransformerMixin):
|
|
1433
1440
|
if len(eval_x) < 1000:
|
1434
1441
|
self.logger.warning(f"Eval_set {i} has less than 1000 rows. It will be ignored for stability check")
|
1435
1442
|
continue
|
1436
|
-
|
1437
|
-
|
1443
|
+
eval_x_date = eval_x[date_column].dropna()
|
1444
|
+
if not is_numeric_dtype(eval_x_date):
|
1445
|
+
eval_x_date = pd.to_datetime(eval_x_date).dt.floor("D").astype(np.int64) / 10**6
|
1446
|
+
eval_min_date = eval_x_date.min()
|
1447
|
+
eval_max_date = eval_x_date.max()
|
1438
1448
|
eval_dates.append((i, eval_min_date, eval_max_date))
|
1439
1449
|
|
1440
1450
|
if not eval_dates:
|
@@ -1460,6 +1470,10 @@ class FeaturesEnricher(TransformerMixin):
|
|
1460
1470
|
checking_eval_set_df = checking_eval_set_df.copy()
|
1461
1471
|
|
1462
1472
|
checking_eval_set_df[date_column] = eval_set_dates[selected_eval_set_idx]
|
1473
|
+
if not is_numeric_dtype(checking_eval_set_df[date_column]):
|
1474
|
+
checking_eval_set_df[date_column] = (
|
1475
|
+
pd.to_datetime(checking_eval_set_df[date_column]).dt.floor("D").astype(np.int64) / 10**6
|
1476
|
+
)
|
1463
1477
|
|
1464
1478
|
psi_values_sparse = calculate_sparsity_psi(
|
1465
1479
|
checking_eval_set_df, cat_features, date_column, self.logger, model_task_type
|
@@ -1727,7 +1741,8 @@ class FeaturesEnricher(TransformerMixin):
|
|
1727
1741
|
c
|
1728
1742
|
for c in (validated_X.columns.to_list() + generated_features)
|
1729
1743
|
if (not self.fit_select_features or c in set(self.feature_names_).union(self.id_columns or []))
|
1730
|
-
and c
|
1744
|
+
and c
|
1745
|
+
not in (
|
1731
1746
|
excluding_search_keys
|
1732
1747
|
+ list(self.fit_dropped_features)
|
1733
1748
|
+ [DateTimeSearchKeyConverter.DATETIME_COL, SYSTEM_RECORD_ID, ENTITY_SYSTEM_RECORD_ID]
|
@@ -2201,7 +2216,8 @@ class FeaturesEnricher(TransformerMixin):
|
|
2201
2216
|
progress_callback=progress_callback,
|
2202
2217
|
add_fit_system_record_id=True,
|
2203
2218
|
)
|
2204
|
-
if enriched_df is None:
|
2219
|
+
if enriched_df is None or len(enriched_df) == 0 or len(enriched_df.columns) == 0:
|
2220
|
+
self.logger.warning(f"Empty enriched dataframe returned: {enriched_df}, returning None")
|
2205
2221
|
return None
|
2206
2222
|
|
2207
2223
|
x_columns = [
|
@@ -2505,7 +2521,7 @@ if response.status_code == 200:
|
|
2505
2521
|
if len(self.feature_names_) == 0:
|
2506
2522
|
msg = self.bundle.get("no_important_features_for_transform")
|
2507
2523
|
self.__log_warning(msg, show_support_link=True)
|
2508
|
-
return
|
2524
|
+
return None, {}, [], self.search_keys
|
2509
2525
|
|
2510
2526
|
self.__validate_search_keys(self.search_keys, self.search_id)
|
2511
2527
|
|
@@ -2513,7 +2529,7 @@ if response.status_code == 200:
|
|
2513
2529
|
msg = self.bundle.get("transform_with_paid_features")
|
2514
2530
|
self.logger.warning(msg)
|
2515
2531
|
self.__display_support_link(msg)
|
2516
|
-
return None, {
|
2532
|
+
return None, {}, [], self.search_keys
|
2517
2533
|
|
2518
2534
|
features_meta = self._search_task.get_all_features_metadata_v2()
|
2519
2535
|
online_api_features = [fm.name for fm in features_meta if fm.from_online_api and fm.shap_value > 0]
|
@@ -2536,7 +2552,7 @@ if response.status_code == 200:
|
|
2536
2552
|
self.logger.warning(msg)
|
2537
2553
|
print(msg)
|
2538
2554
|
show_request_quote_button()
|
2539
|
-
return None, {
|
2555
|
+
return None, {}, [], {}
|
2540
2556
|
else:
|
2541
2557
|
msg = self.bundle.get("transform_usage_info").format(
|
2542
2558
|
transform_usage.limit, transform_usage.transformed_rows
|
@@ -2606,14 +2622,33 @@ if response.status_code == 200:
|
|
2606
2622
|
|
2607
2623
|
# If there are no external features, we don't call backend on transform
|
2608
2624
|
external_features = [fm for fm in features_meta if fm.shap_value > 0 and fm.source != "etalon"]
|
2609
|
-
if
|
2625
|
+
if len(external_features) == 0:
|
2610
2626
|
self.logger.warning(
|
2611
2627
|
"No external features found, returning original dataframe"
|
2612
2628
|
f" with generated important features: {self.feature_names_}"
|
2613
2629
|
)
|
2614
|
-
|
2615
|
-
|
2616
|
-
|
2630
|
+
df = df.rename(columns=columns_renaming)
|
2631
|
+
generated_features = [columns_renaming.get(c, c) for c in generated_features]
|
2632
|
+
search_keys = {columns_renaming.get(c, c): t for c, t in search_keys.items()}
|
2633
|
+
selecting_columns = self._selecting_input_and_generated_columns(
|
2634
|
+
validated_Xy, generated_features, keep_input, trace_id
|
2635
|
+
)
|
2636
|
+
self.logger.warning(f"Filtered columns by existance in dataframe: {selecting_columns}")
|
2637
|
+
if add_fit_system_record_id:
|
2638
|
+
df = self._add_fit_system_record_id(
|
2639
|
+
df,
|
2640
|
+
search_keys,
|
2641
|
+
SYSTEM_RECORD_ID,
|
2642
|
+
TARGET,
|
2643
|
+
columns_renaming,
|
2644
|
+
self.id_columns,
|
2645
|
+
self.cv,
|
2646
|
+
self.model_task_type,
|
2647
|
+
self.logger,
|
2648
|
+
self.bundle,
|
2649
|
+
)
|
2650
|
+
selecting_columns.append(SYSTEM_RECORD_ID)
|
2651
|
+
return df[selecting_columns], columns_renaming, generated_features, search_keys
|
2617
2652
|
|
2618
2653
|
# Don't pass all features in backend on transform
|
2619
2654
|
runtime_parameters = self._get_copy_of_runtime_parameters()
|
@@ -2831,29 +2866,12 @@ if response.status_code == 200:
|
|
2831
2866
|
how="left",
|
2832
2867
|
)
|
2833
2868
|
|
2834
|
-
|
2835
|
-
|
2836
|
-
|
2837
|
-
selected_generated_features = [
|
2838
|
-
c for c in generated_features if not self.fit_select_features or c in self.feature_names_
|
2839
|
-
]
|
2840
|
-
if keep_input is True:
|
2841
|
-
selected_input_columns = [
|
2842
|
-
c
|
2843
|
-
for c in validated_Xy.columns
|
2844
|
-
if not self.fit_select_features
|
2845
|
-
or c in self.feature_names_
|
2846
|
-
or c in new_columns_on_transform
|
2847
|
-
or c in self.search_keys
|
2848
|
-
or c in (self.id_columns or [])
|
2849
|
-
or c in [EVAL_SET_INDEX, TARGET] # transform for metrics calculation
|
2850
|
-
]
|
2851
|
-
else:
|
2852
|
-
selected_input_columns = []
|
2853
|
-
|
2854
|
-
selecting_columns = selected_input_columns + selected_generated_features
|
2869
|
+
selecting_columns = self._selecting_input_and_generated_columns(
|
2870
|
+
validated_Xy, generated_features, keep_input, trace_id
|
2871
|
+
)
|
2855
2872
|
selecting_columns.extend(
|
2856
|
-
c
|
2873
|
+
c
|
2874
|
+
for c in result.columns
|
2857
2875
|
if c in self.feature_names_ and c not in selecting_columns and c not in validated_Xy.columns
|
2858
2876
|
)
|
2859
2877
|
if add_fit_system_record_id:
|
@@ -2881,6 +2899,35 @@ if response.status_code == 200:
|
|
2881
2899
|
|
2882
2900
|
return result, columns_renaming, generated_features, search_keys
|
2883
2901
|
|
2902
|
+
def _selecting_input_and_generated_columns(
|
2903
|
+
self,
|
2904
|
+
validated_Xy: pd.DataFrame,
|
2905
|
+
generated_features: list[str],
|
2906
|
+
keep_input: bool,
|
2907
|
+
trace_id: str,
|
2908
|
+
):
|
2909
|
+
fit_input_columns = [c.originalName for c in self._search_task.get_file_metadata(trace_id).columns]
|
2910
|
+
new_columns_on_transform = [c for c in validated_Xy.columns if c not in fit_input_columns]
|
2911
|
+
|
2912
|
+
selected_generated_features = [
|
2913
|
+
c for c in generated_features if not self.fit_select_features or c in self.feature_names_
|
2914
|
+
]
|
2915
|
+
if keep_input is True:
|
2916
|
+
selected_input_columns = [
|
2917
|
+
c
|
2918
|
+
for c in validated_Xy.columns
|
2919
|
+
if not self.fit_select_features
|
2920
|
+
or c in self.feature_names_
|
2921
|
+
or c in new_columns_on_transform
|
2922
|
+
or c in self.search_keys
|
2923
|
+
or c in (self.id_columns or [])
|
2924
|
+
or c in [EVAL_SET_INDEX, TARGET] # transform for metrics calculation
|
2925
|
+
]
|
2926
|
+
else:
|
2927
|
+
selected_input_columns = []
|
2928
|
+
|
2929
|
+
return selected_input_columns + selected_generated_features
|
2930
|
+
|
2884
2931
|
def __validate_search_keys(self, search_keys: dict[str, SearchKey], search_id: str | None = None):
|
2885
2932
|
if (search_keys is None or len(search_keys) == 0) and self.country_code is None:
|
2886
2933
|
if search_id:
|
@@ -3708,6 +3755,23 @@ if response.status_code == 200:
|
|
3708
3755
|
else:
|
3709
3756
|
raise ValidationError(self.bundle.get("eval_x_and_x_diff_shape"))
|
3710
3757
|
|
3758
|
+
if any(validated_eval_X.dtypes != X.dtypes):
|
3759
|
+
x_types = X.dtypes
|
3760
|
+
eval_types = validated_eval_X.dtypes
|
3761
|
+
# Find columns with different types
|
3762
|
+
diff_cols = [
|
3763
|
+
(col, x_types[col], eval_types[col]) for col in x_types.index if x_types[col] != eval_types[col]
|
3764
|
+
]
|
3765
|
+
diff_col_names = [col for col, _, _ in diff_cols]
|
3766
|
+
# print columns with different types
|
3767
|
+
print("Columns with different types:")
|
3768
|
+
for col, x_type, eval_type in diff_cols:
|
3769
|
+
print("-" * 50)
|
3770
|
+
print(f"Column: {col}")
|
3771
|
+
print(f"X type: {x_type}")
|
3772
|
+
print(f"Eval_set type: {eval_type}")
|
3773
|
+
raise ValidationError(self.bundle.get("eval_x_and_x_diff_dtypes").format(diff_col_names))
|
3774
|
+
|
3711
3775
|
if _num_samples(validated_eval_X) != _num_samples(eval_y):
|
3712
3776
|
raise ValidationError(
|
3713
3777
|
self.bundle.get("x_and_y_diff_size_eval_set").format(
|
@@ -3782,9 +3846,7 @@ if response.status_code == 200:
|
|
3782
3846
|
return Xy[X.columns].copy(), Xy[TARGET].copy()
|
3783
3847
|
|
3784
3848
|
@staticmethod
|
3785
|
-
def _sort_by_system_record_id(
|
3786
|
-
X: pd.DataFrame, y: pd.Series, cv: CVType | None
|
3787
|
-
) -> tuple[pd.DataFrame, pd.Series]:
|
3849
|
+
def _sort_by_system_record_id(X: pd.DataFrame, y: pd.Series, cv: CVType | None) -> tuple[pd.DataFrame, pd.Series]:
|
3788
3850
|
if cv not in [CVType.time_series, CVType.blocked_time_series]:
|
3789
3851
|
record_id_column = ENTITY_SYSTEM_RECORD_ID if ENTITY_SYSTEM_RECORD_ID in X else SYSTEM_RECORD_ID
|
3790
3852
|
Xy = X.copy()
|
@@ -4420,7 +4482,8 @@ if response.status_code == 200:
|
|
4420
4482
|
|
4421
4483
|
if len(features_info) > 0:
|
4422
4484
|
self.features_info = pd.DataFrame(features_info)
|
4423
|
-
|
4485
|
+
# If all psi values are 0 or null, drop psi column
|
4486
|
+
if self.features_info[self.bundle.get("features_info_psi")].fillna(0.0).eq(0.0).all():
|
4424
4487
|
self.features_info.drop(columns=[self.bundle.get("features_info_psi")], inplace=True)
|
4425
4488
|
self._features_info_without_links = pd.DataFrame(features_info_without_links)
|
4426
4489
|
self._internal_features_info = pd.DataFrame(internal_features_info)
|
upgini/metrics.py
CHANGED
@@ -847,7 +847,7 @@ class CatBoostWrapper(EstimatorWrapper):
|
|
847
847
|
|
848
848
|
feature_importance = {}
|
849
849
|
for i, col in enumerate(x.columns):
|
850
|
-
feature_importance[col] = np.mean(np.abs(shap_values[:, i]))
|
850
|
+
feature_importance[col] = float(np.mean(np.abs(shap_values[:, i])))
|
851
851
|
|
852
852
|
return feature_importance
|
853
853
|
|
@@ -922,6 +922,7 @@ class LightGBMWrapper(EstimatorWrapper):
|
|
922
922
|
encoded = cat_encoder.transform(x_copy[self.cat_features]).astype(int)
|
923
923
|
else:
|
924
924
|
encoded = cat_encoder.transform(x_copy[self.cat_features]).astype("category")
|
925
|
+
x_copy = x_copy.drop(columns=self.cat_features, errors="ignore")
|
925
926
|
x_copy[self.cat_features] = encoded
|
926
927
|
|
927
928
|
shap_matrix = estimator.predict(
|
@@ -943,7 +944,7 @@ class LightGBMWrapper(EstimatorWrapper):
|
|
943
944
|
|
944
945
|
feature_importance = {}
|
945
946
|
for i, col in enumerate(x.columns):
|
946
|
-
feature_importance[col] = np.mean(np.abs(shap_matrix[:, i]))
|
947
|
+
feature_importance[col] = float(np.mean(np.abs(shap_matrix[:, i])))
|
947
948
|
|
948
949
|
return feature_importance
|
949
950
|
|
@@ -123,6 +123,7 @@ unsupported_type_eval_set=Unsupported type of eval_set: {}. It should be list of
|
|
123
123
|
eval_set_invalid_tuple_size=eval_set contains a tuple of size {}. It should contain only pairs of X and y or X only
|
124
124
|
unsupported_x_type_eval_set=Unsupported type of X in eval_set: {}. Use pandas.DataFrame, pandas.Series or numpy.ndarray or list.
|
125
125
|
eval_x_and_x_diff_shape=The column set in eval_set are differ from the column set in X
|
126
|
+
eval_x_and_x_diff_dtypes=The column types in eval_set are different from the column types in X: {}
|
126
127
|
unsupported_y_type_eval_set=Unsupported type of y in eval_set: {}. Use pandas.Series, numpy.ndarray or list
|
127
128
|
y_is_constant_eval_set=y in eval_set is a constant. Relevant feature search requires a non-constant y
|
128
129
|
x_and_y_diff_size_eval_set=X and y in eval_set contain different number of rows: {}, {}
|
upgini/utils/display_utils.py
CHANGED
@@ -269,19 +269,22 @@ def make_html_report(
|
|
269
269
|
if search_keys is not None
|
270
270
|
else ""
|
271
271
|
}
|
272
|
-
{
|
273
|
-
|
274
|
-
|
272
|
+
{
|
273
|
+
"<h3>All relevant features. Accuracy after enrichment</h3>" + make_table(metrics_df)
|
274
|
+
if metrics_df is not None
|
275
|
+
else ""
|
275
276
|
}
|
276
|
-
{
|
277
|
-
|
278
|
-
|
277
|
+
{
|
278
|
+
"<h3>Relevant data sources</h3>" + make_table(relevant_datasources_df)
|
279
|
+
if len(relevant_datasources_df) > 0
|
280
|
+
else ""
|
279
281
|
}
|
280
282
|
<h3>All relevant features. Listing ({len(relevant_features_df)} items)</h3>
|
281
283
|
{make_table(relevant_features_df, wrap_long_string=25)}
|
282
|
-
{
|
283
|
-
|
284
|
-
|
284
|
+
{
|
285
|
+
"<h3>Description of AutoFE feature names</h3>" + make_table(autofe_descriptions_df, wrap_long_string=25)
|
286
|
+
if autofe_descriptions_df is not None and len(autofe_descriptions_df) > 0
|
287
|
+
else ""
|
285
288
|
}
|
286
289
|
<p>To buy found data sources, please contact: <a href='mailto:sales@upgini.com'>sales@upgini.com</a></p>
|
287
290
|
<p>Best regards, </br><b>Upgini Team</b></p>
|
upgini/utils/psi.py
CHANGED
@@ -82,9 +82,6 @@ def calculate_features_psi(
|
|
82
82
|
) -> dict[str, float]:
|
83
83
|
empty_res = {col: 0.0 for col in df.columns if col not in [TARGET, date_column]}
|
84
84
|
|
85
|
-
if not is_numeric_dtype(df[date_column]):
|
86
|
-
df[date_column] = pd.to_datetime(df[date_column]).dt.floor("D").astype(np.int64) / 10**6
|
87
|
-
|
88
85
|
# Filter out rows with missing dates
|
89
86
|
df = df[df[date_column].notna()].copy()
|
90
87
|
|
@@ -1,12 +1,12 @@
|
|
1
|
-
upgini/__about__.py,sha256=
|
1
|
+
upgini/__about__.py,sha256=dGQsiLpbGOBMNMjbBQebmAujqSJwdzWvwm3Nkl_FFhk,24
|
2
2
|
upgini/__init__.py,sha256=LXSfTNU0HnlOkE69VCxkgIKDhWP-JFo_eBQ71OxTr5Y,261
|
3
3
|
upgini/ads.py,sha256=nvuRxRx5MHDMgPr9SiU-fsqRdFaBv8p4_v1oqiysKpc,2714
|
4
4
|
upgini/dataset.py,sha256=pQ8JQe0cdygD-W9GefJmfE6bnj4EYzXsjlgWdIS9nS8,31578
|
5
5
|
upgini/errors.py,sha256=2b_Wbo0OYhLUbrZqdLIx5jBnAsiD1Mcenh-VjR4HCTw,950
|
6
|
-
upgini/features_enricher.py,sha256=
|
6
|
+
upgini/features_enricher.py,sha256=C9pZKusj_QnG9coPVAa1a_88VC-lLR4Tre4uC10yt04,231852
|
7
7
|
upgini/http.py,sha256=-J_wOpnwVnT0ebPC6sOs6fN3AWtCD0LJLu6nlYmxaqk,44348
|
8
8
|
upgini/metadata.py,sha256=VzgtgEbPPtNxTrj9LM5qSDP3DujHwAXqbUSKBjPcb9c,12477
|
9
|
-
upgini/metrics.py,sha256=
|
9
|
+
upgini/metrics.py,sha256=KCPE_apPN-9BIdv6GqASbJVaB_gBcy8wzNApAcyaGo4,46020
|
10
10
|
upgini/search_task.py,sha256=SAiUd1AytbA2Q6PSnnztr7oTRKpud1wQZ5YtKjsmQHU,18256
|
11
11
|
upgini/spinner.py,sha256=4iMd-eIe_BnkqFEMIliULTbj6rNI2HkN_VJ4qYe0cUc,1118
|
12
12
|
upgini/version_validator.py,sha256=DvbaAvuYFoJqYt0fitpsk6Xcv-H1BYDJYHUMxaKSH_Y,1509
|
@@ -38,7 +38,7 @@ upgini/normalizer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
|
|
38
38
|
upgini/normalizer/normalize_utils.py,sha256=mDh2mBW3aQMB4EFP2aHbf2dGMVkOcWnp4sKKvKDBh8w,8511
|
39
39
|
upgini/resource_bundle/__init__.py,sha256=S5F2G47pnJd2LDpmFsjDqEwiKkP8Hm-hcseDbMka6Ko,8345
|
40
40
|
upgini/resource_bundle/exceptions.py,sha256=5fRvx0_vWdE1-7HcSgF0tckB4A9AKyf5RiinZkInTsI,621
|
41
|
-
upgini/resource_bundle/strings.properties,sha256=
|
41
|
+
upgini/resource_bundle/strings.properties,sha256=cNeVkWZMyjGCYGqmOOeJqisqPSEBtmfIw_U1rmgQw4w,29285
|
42
42
|
upgini/resource_bundle/strings_widget.properties,sha256=gOdqvZWntP2LCza_tyVk1_yRYcG4c04K9sQOAVhF_gw,1577
|
43
43
|
upgini/sampler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
44
44
|
upgini/sampler/base.py,sha256=Fva2FEhLiNRPZ9Q6uOtJRtRzwsayjv7aphalAZO_4lc,6452
|
@@ -54,7 +54,7 @@ upgini/utils/custom_loss_utils.py,sha256=kieNZYBYZm5ZGBltF1F_jOSF4ea6C29rYuCyiDc
|
|
54
54
|
upgini/utils/cv_utils.py,sha256=w6FQb9nO8BWDx88EF83NpjPLarK4eR4ia0Wg0kLBJC4,3525
|
55
55
|
upgini/utils/datetime_utils.py,sha256=UL1ernnawW0LV9mPDpCIc6sFy0HUhFscWVNwfH4V7rI,14366
|
56
56
|
upgini/utils/deduplicate_utils.py,sha256=oZEiZeN-A92zwAPysV4OP9hO-niC2RLt-Dhc_hynBTU,11273
|
57
|
-
upgini/utils/display_utils.py,sha256=
|
57
|
+
upgini/utils/display_utils.py,sha256=uSG3JwpwCIgRJXsp-8ktuJ0Dh-WFti7IrRLMUfHfoDc,11973
|
58
58
|
upgini/utils/email_utils.py,sha256=pZ2vCfNxLIPUhxr0-OlABNXm12jjU44isBk8kGmqQzA,5277
|
59
59
|
upgini/utils/fallback_progress_bar.py,sha256=PDaKb8dYpVZaWMroNcOHsTc3pSjgi9mOm0--cOFTwJ0,1074
|
60
60
|
upgini/utils/feature_info.py,sha256=6vihytwKma_TlXtTn4l6Aj4kqlOj0ouLy-yWVV6VUw8,7551
|
@@ -66,7 +66,7 @@ upgini/utils/mstats.py,sha256=u3gQVUtDRbyrOQK6V1UJ2Rx1QbkSNYGjXa6m3Z_dPVs,6286
|
|
66
66
|
upgini/utils/phone_utils.py,sha256=IrbztLuOJBiePqqxllfABWfYlfAjYevPhXKipl95wUI,10432
|
67
67
|
upgini/utils/postal_code_utils.py,sha256=5M0sUqH2DAr33kARWCTXR-ACyzWbjDq_-0mmEml6ZcU,1716
|
68
68
|
upgini/utils/progress_bar.py,sha256=N-Sfdah2Hg8lXP_fV9EfUTXz_PyRt4lo9fAHoUDOoLc,1550
|
69
|
-
upgini/utils/psi.py,sha256=
|
69
|
+
upgini/utils/psi.py,sha256=vw8QEktXSx29IiMJMxmDeFU_4lJInJBXt_XL5Muekzo,11114
|
70
70
|
upgini/utils/sample_utils.py,sha256=xpfYaZ2cYP7I2JrcooVc13QNBFawB81cJRuh38451Q4,15123
|
71
71
|
upgini/utils/sklearn_ext.py,sha256=jLJWAKkqQinV15Z4y1ZnsN3c-fKFwXTsprs00COnyVU,49315
|
72
72
|
upgini/utils/sort.py,sha256=8uuHs2nfSMVnz8GgvbOmgMB1PgEIZP1uhmeRFxcwnYw,7039
|
@@ -74,7 +74,7 @@ upgini/utils/target_utils.py,sha256=GCPn4QeJ83JJ_vyBJ3IhY5fyIRkLC9q9BE59S2FRO1I,
|
|
74
74
|
upgini/utils/track_info.py,sha256=G5Lu1xxakg2_TQjKZk4b5SvrHsATTXNVV3NbvWtT8k8,5663
|
75
75
|
upgini/utils/ts_utils.py,sha256=26vhC0pN7vLXK6R09EEkMK3Lwb9IVPH7LRdqFIQ3kPs,1383
|
76
76
|
upgini/utils/warning_counter.py,sha256=-GRY8EUggEBKODPSuXAkHn9KnEQwAORC0mmz_tim-PM,254
|
77
|
-
upgini-1.2.
|
78
|
-
upgini-1.2.
|
79
|
-
upgini-1.2.
|
80
|
-
upgini-1.2.
|
77
|
+
upgini-1.2.119.dist-info/METADATA,sha256=kYExWpX2yb4opF3KCsG2H0LdMS_mkSzspOgEhO6Jgtg,50743
|
78
|
+
upgini-1.2.119.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
|
79
|
+
upgini-1.2.119.dist-info/licenses/LICENSE,sha256=5RRzgvdJUu3BUDfv4bzVU6FqKgwHlIay63pPCSmSgzw,1514
|
80
|
+
upgini-1.2.119.dist-info/RECORD,,
|
File without changes
|
File without changes
|