upgini 1.1.249a2__tar.gz → 1.1.250__tar.gz

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.

Potentially problematic release.


This version of upgini might be problematic. Click here for more details.

Files changed (83) hide show
  1. {upgini-1.1.249a2/src/upgini.egg-info → upgini-1.1.250}/PKG-INFO +1 -1
  2. {upgini-1.1.249a2 → upgini-1.1.250}/setup.py +1 -1
  3. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/data_source/data_source_publisher.py +18 -0
  4. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/dataset.py +4 -4
  5. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/features_enricher.py +53 -44
  6. upgini-1.1.250/src/upgini/fingerprint.js +8 -0
  7. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/metadata.py +1 -0
  8. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/resource_bundle/strings.properties +2 -0
  9. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/cv_utils.py +0 -2
  10. {upgini-1.1.249a2 → upgini-1.1.250/src/upgini.egg-info}/PKG-INFO +1 -1
  11. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini.egg-info/SOURCES.txt +1 -0
  12. {upgini-1.1.249a2 → upgini-1.1.250}/tests/test_widget.py +5 -1
  13. {upgini-1.1.249a2 → upgini-1.1.250}/LICENSE +0 -0
  14. {upgini-1.1.249a2 → upgini-1.1.250}/README.md +0 -0
  15. {upgini-1.1.249a2 → upgini-1.1.250}/pyproject.toml +0 -0
  16. {upgini-1.1.249a2 → upgini-1.1.250}/setup.cfg +0 -0
  17. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/__init__.py +0 -0
  18. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/ads.py +0 -0
  19. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/ads_management/__init__.py +0 -0
  20. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/ads_management/ads_manager.py +0 -0
  21. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/autofe/__init__.py +0 -0
  22. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/autofe/all_operands.py +0 -0
  23. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/autofe/binary.py +0 -0
  24. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/autofe/feature.py +0 -0
  25. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/autofe/groupby.py +0 -0
  26. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/autofe/operand.py +0 -0
  27. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/autofe/unary.py +0 -0
  28. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/autofe/vector.py +0 -0
  29. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/data_source/__init__.py +0 -0
  30. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/errors.py +0 -0
  31. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/http.py +0 -0
  32. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/mdc/__init__.py +0 -0
  33. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/mdc/context.py +0 -0
  34. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/metrics.py +0 -0
  35. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/normalizer/__init__.py +0 -0
  36. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/normalizer/phone_normalizer.py +0 -0
  37. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/resource_bundle/__init__.py +0 -0
  38. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/resource_bundle/exceptions.py +0 -0
  39. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/resource_bundle/strings_widget.properties +0 -0
  40. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/sampler/__init__.py +0 -0
  41. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/sampler/base.py +0 -0
  42. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/sampler/random_under_sampler.py +0 -0
  43. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/sampler/utils.py +0 -0
  44. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/search_task.py +0 -0
  45. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/spinner.py +0 -0
  46. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/__init__.py +0 -0
  47. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/base_search_key_detector.py +0 -0
  48. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/blocked_time_series.py +0 -0
  49. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/country_utils.py +0 -0
  50. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/custom_loss_utils.py +0 -0
  51. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/datetime_utils.py +0 -0
  52. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/deduplicate_utils.py +0 -0
  53. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/display_utils.py +0 -0
  54. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/email_utils.py +0 -0
  55. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/fallback_progress_bar.py +0 -0
  56. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/features_validator.py +0 -0
  57. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/format.py +0 -0
  58. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/ip_utils.py +0 -0
  59. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/phone_utils.py +0 -0
  60. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/postal_code_utils.py +0 -0
  61. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/progress_bar.py +0 -0
  62. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/sklearn_ext.py +0 -0
  63. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/target_utils.py +0 -0
  64. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/track_info.py +0 -0
  65. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/utils/warning_counter.py +0 -0
  66. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini/version_validator.py +0 -0
  67. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini.egg-info/dependency_links.txt +0 -0
  68. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini.egg-info/requires.txt +0 -0
  69. {upgini-1.1.249a2 → upgini-1.1.250}/src/upgini.egg-info/top_level.txt +0 -0
  70. {upgini-1.1.249a2 → upgini-1.1.250}/tests/test_binary_dataset.py +0 -0
  71. {upgini-1.1.249a2 → upgini-1.1.250}/tests/test_blocked_time_series.py +0 -0
  72. {upgini-1.1.249a2 → upgini-1.1.250}/tests/test_categorical_dataset.py +0 -0
  73. {upgini-1.1.249a2 → upgini-1.1.250}/tests/test_continuous_dataset.py +0 -0
  74. {upgini-1.1.249a2 → upgini-1.1.250}/tests/test_country_utils.py +0 -0
  75. {upgini-1.1.249a2 → upgini-1.1.250}/tests/test_custom_loss_utils.py +0 -0
  76. {upgini-1.1.249a2 → upgini-1.1.250}/tests/test_datetime_utils.py +0 -0
  77. {upgini-1.1.249a2 → upgini-1.1.250}/tests/test_email_utils.py +0 -0
  78. {upgini-1.1.249a2 → upgini-1.1.250}/tests/test_etalon_validation.py +0 -0
  79. {upgini-1.1.249a2 → upgini-1.1.250}/tests/test_features_enricher.py +0 -0
  80. {upgini-1.1.249a2 → upgini-1.1.250}/tests/test_metrics.py +0 -0
  81. {upgini-1.1.249a2 → upgini-1.1.250}/tests/test_phone_utils.py +0 -0
  82. {upgini-1.1.249a2 → upgini-1.1.250}/tests/test_postal_code_utils.py +0 -0
  83. {upgini-1.1.249a2 → upgini-1.1.250}/tests/test_target_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: upgini
3
- Version: 1.1.249a2
3
+ Version: 1.1.250
4
4
  Summary: Intelligent data search & enrichment for Machine Learning
5
5
  Home-page: https://upgini.com/
6
6
  Author: Upgini Developers
@@ -40,7 +40,7 @@ def send_log(msg: str):
40
40
 
41
41
 
42
42
  here = Path(__file__).parent.resolve()
43
- version = "1.1.249a2"
43
+ version = "1.1.250"
44
44
  try:
45
45
  send_log(f"Start setup PyLib version {version}")
46
46
  setup(
@@ -32,6 +32,7 @@ class OnlineUploadingType(Enum):
32
32
 
33
33
  class DataSourcePublisher:
34
34
  FINAL_STATUSES = ["COMPLETED", "FAILED", "TIMED_OUT"]
35
+ ACCEPTABLE_UPDATE_FREQUENCIES = ["Daily", "Weekly", "Monthly", "Quarterly", "Annually"]
35
36
  DEFAULT_GENERATE_EMBEDDINGS = []
36
37
 
37
38
  def __init__(self, api_key: Optional[str] = None, endpoint: Optional[str] = None, logs_enabled=True):
@@ -46,12 +47,14 @@ class DataSourcePublisher:
46
47
  self,
47
48
  data_table_uri: str,
48
49
  search_keys: Dict[str, SearchKey],
50
+ update_frequency: str,
49
51
  secondary_search_keys: Optional[Dict[str, SearchKey]] = None,
50
52
  sort_column: Optional[str] = None,
51
53
  date_format: Optional[str] = None,
52
54
  exclude_columns: Optional[List[str]] = None,
53
55
  hash_feature_names=False,
54
56
  snapshot_frequency_days: Optional[int] = None,
57
+ join_date_abs_limit_days: Optional[int] = None,
55
58
  features_for_embeddings: Optional[List[str]] = DEFAULT_GENERATE_EMBEDDINGS,
56
59
  data_table_id_to_replace: Optional[str] = None,
57
60
  exclude_from_autofe_generation: Optional[List[str]] = None,
@@ -71,6 +74,11 @@ class DataSourcePublisher:
71
74
  raise ValidationError("Empty search keys")
72
75
  if SearchKey.DATE in search_keys.values() and date_format is None:
73
76
  raise ValidationError("date_format is required for DATE search key")
77
+ if update_frequency not in self.ACCEPTABLE_UPDATE_FREQUENCIES:
78
+ raise ValidationError(
79
+ f"Invalid update frequency: {update_frequency}. "
80
+ f"Available values: {self.ACCEPTABLE_UPDATE_FREQUENCIES}"
81
+ )
74
82
 
75
83
  request = {
76
84
  "dataTableUri": data_table_uri,
@@ -79,6 +87,8 @@ class DataSourcePublisher:
79
87
  "excludeColumns": exclude_columns,
80
88
  "hashFeatureNames": str(hash_feature_names).lower(),
81
89
  "snapshotFrequencyDays": snapshot_frequency_days,
90
+ "joinDateAbsLimitDays": join_date_abs_limit_days,
91
+ "updateFrequency": update_frequency,
82
92
  "featuresForEmbeddings": features_for_embeddings,
83
93
  "forceGeneration": str(_force_generation).lower(),
84
94
  }
@@ -189,6 +199,7 @@ class DataSourcePublisher:
189
199
  provider_link: Optional[str] = None,
190
200
  source: Optional[str] = None,
191
201
  source_link: Optional[str] = None,
202
+ update_frequency: Optional[str] = None,
192
203
  client_emails: Optional[List[str]] = None,
193
204
  ):
194
205
  trace_id = str(uuid.uuid4())
@@ -200,6 +211,11 @@ class DataSourcePublisher:
200
211
  data_table_ids = [data_table_ids]
201
212
  if not isinstance(data_table_ids, list):
202
213
  raise ValidationError("data_table_ids should be string or list of strings")
214
+ if update_frequency is not None and update_frequency not in self.ACCEPTABLE_UPDATE_FREQUENCIES:
215
+ raise ValidationError(
216
+ f"Invalid update frequency: {update_frequency}. "
217
+ f"Available values: {self.ACCEPTABLE_UPDATE_FREQUENCIES}"
218
+ )
203
219
  # if listing_type == ListingType.PRIVATE and (client_emails is None or len(client_emails) == 0):
204
220
  # raise ValidationError("Empty client emails for private data tables")
205
221
  # if listing_type not in [ListingType.PRIVATE, ListingType.TRIAL] and client_emails is not None:
@@ -226,6 +242,8 @@ class DataSourcePublisher:
226
242
  request["source"] = source
227
243
  if source_link is not None:
228
244
  request["sourceLink"] = source_link
245
+ if update_frequency is not None:
246
+ request["updateFrequency"] = update_frequency
229
247
  if client_emails is not None:
230
248
  request["clientEmails"] = client_emails
231
249
  self.logger.info(f"Activating data tables with request {request}")
@@ -662,15 +662,15 @@ class Dataset: # (pd.DataFrame):
662
662
  # if self.task_type != ModelTaskType.MULTICLASS:
663
663
  # self.data[target] = self.data[target].apply(pd.to_numeric, errors="coerce")
664
664
 
665
- keys_to_validate = [
665
+ keys_to_validate = {
666
666
  key
667
667
  for search_group in self.search_keys_checked
668
668
  for key in search_group
669
669
  if self.columns_renaming.get(key) != EmailSearchKeyConverter.EMAIL_ONE_DOMAIN_COLUMN_NAME
670
- ]
671
- ipv4_column = self.etalon_def_checked.get(FileColumnMeaningType.IP_ADDRESS)
670
+ }
671
+ ipv4_column = self.etalon_def_checked.get(FileColumnMeaningType.IP_ADDRESS.value)
672
672
  if (
673
- FileColumnMeaningType.IPV6_ADDRESS in self.etalon_def_checked
673
+ FileColumnMeaningType.IPV6_ADDRESS.value in self.etalon_def_checked
674
674
  and ipv4_column is not None
675
675
  and ipv4_column in keys_to_validate
676
676
  ):
@@ -145,6 +145,18 @@ class FeaturesEnricher(TransformerMixin):
145
145
  CALCULATE_METRICS_MIN_THRESHOLD = 500
146
146
  GENERATE_FEATURES_LIMIT = 10
147
147
  EMPTY_FEATURES_INFO = pd.DataFrame(
148
+ columns=[
149
+ bundle.get("features_info_name"),
150
+ bundle.get("features_info_shap"),
151
+ bundle.get("features_info_hitrate"),
152
+ bundle.get("features_info_value_preview"),
153
+ bundle.get("features_info_provider"),
154
+ bundle.get("features_info_source"),
155
+ # bundle.get("features_info_commercial_schema"),
156
+ bundle.get("features_info_update_frequency"),
157
+ ]
158
+ )
159
+ EMPTY_INTERNAL_FEATURES_INFO = pd.DataFrame(
148
160
  columns=[
149
161
  bundle.get("features_info_name"),
150
162
  bundle.get("features_info_shap"),
@@ -153,6 +165,7 @@ class FeaturesEnricher(TransformerMixin):
153
165
  bundle.get("features_info_provider"),
154
166
  bundle.get("features_info_source"),
155
167
  bundle.get("features_info_commercial_schema"),
168
+ bundle.get("features_info_update_frequency"),
156
169
  ]
157
170
  )
158
171
  EMPTY_DATA_SOURCES = pd.DataFrame(
@@ -233,7 +246,7 @@ class FeaturesEnricher(TransformerMixin):
233
246
  self._search_task: Optional[SearchTask] = None
234
247
  self.features_info: pd.DataFrame = self.EMPTY_FEATURES_INFO
235
248
  self._features_info_without_links: pd.DataFrame = self.EMPTY_FEATURES_INFO
236
- self._internal_features_info: pd.DataFrame = self.EMPTY_FEATURES_INFO
249
+ self._internal_features_info: pd.DataFrame = self.EMPTY_INTERNAL_FEATURES_INFO
237
250
  self.relevant_data_sources: pd.DataFrame = self.EMPTY_DATA_SOURCES
238
251
  self._relevant_data_sources_wo_links: pd.DataFrame = self.EMPTY_DATA_SOURCES
239
252
  self.metrics: Optional[pd.DataFrame] = None
@@ -1179,11 +1192,11 @@ class FeaturesEnricher(TransformerMixin):
1179
1192
  self, commercial_schema: str, exclude_features_sources: Optional[List[str]]
1180
1193
  ) -> List[str]:
1181
1194
  if exclude_features_sources:
1182
- filtered_features_info = self.features_info[
1183
- ~self.features_info[self.bundle.get("features_info_name")].isin(exclude_features_sources)
1195
+ filtered_features_info = self._internal_features_info[
1196
+ ~self._internal_features_info[self.bundle.get("features_info_name")].isin(exclude_features_sources)
1184
1197
  ]
1185
1198
  else:
1186
- filtered_features_info = self.features_info
1199
+ filtered_features_info = self._internal_features_info
1187
1200
  return list(
1188
1201
  filtered_features_info.loc[
1189
1202
  filtered_features_info[self.bundle.get("features_info_commercial_schema")] == commercial_schema,
@@ -1191,9 +1204,6 @@ class FeaturesEnricher(TransformerMixin):
1191
1204
  ].values
1192
1205
  )
1193
1206
 
1194
- def _has_trial_features(self, exclude_features_sources: Optional[List[str]]) -> bool:
1195
- return self._has_features_with_commercial_schema(CommercialSchema.TRIAL.value, exclude_features_sources)
1196
-
1197
1207
  def _has_paid_features(self, exclude_features_sources: Optional[List[str]]) -> bool:
1198
1208
  return self._has_features_with_commercial_schema(CommercialSchema.PAID.value, exclude_features_sources)
1199
1209
 
@@ -1276,8 +1286,6 @@ class FeaturesEnricher(TransformerMixin):
1276
1286
  elif isinstance(_cv, GroupsConsumerMixin):
1277
1287
  groups = get_groups(X, group_columns)
1278
1288
 
1279
- self.logger.info(f"Using CV: {_cv}")
1280
-
1281
1289
  return _cv, groups
1282
1290
 
1283
1291
  def _prepare_data_for_metrics(
@@ -1575,18 +1583,18 @@ class FeaturesEnricher(TransformerMixin):
1575
1583
  if eval_set is not None:
1576
1584
  self.logger.info("Transform with eval_set")
1577
1585
  # concatenate X and eval_set with eval_set_index
1578
- df_with_eval_set_index = validated_X.copy()
1579
- df_with_eval_set_index[TARGET] = validated_y
1580
- df_with_eval_set_index[EVAL_SET_INDEX] = 0
1586
+ df = validated_X.copy()
1587
+ df[TARGET] = validated_y
1588
+ df[EVAL_SET_INDEX] = 0
1581
1589
  for idx, eval_pair in enumerate(eval_set):
1582
1590
  eval_x, eval_y = self._validate_eval_set_pair(validated_X, eval_pair)
1583
1591
  eval_df_with_index = eval_x.copy()
1584
1592
  eval_df_with_index[TARGET] = eval_y
1585
1593
  eval_df_with_index[EVAL_SET_INDEX] = idx + 1
1586
- df_with_eval_set_index = pd.concat([df_with_eval_set_index, eval_df_with_index])
1594
+ df = pd.concat([df, eval_df_with_index])
1587
1595
 
1588
- _, df_with_eval_set_index = remove_fintech_duplicates(
1589
- df_with_eval_set_index,
1596
+ _, df = remove_fintech_duplicates(
1597
+ df,
1590
1598
  self.search_keys,
1591
1599
  date_format=self.date_format,
1592
1600
  logger=self.logger,
@@ -1595,30 +1603,31 @@ class FeaturesEnricher(TransformerMixin):
1595
1603
  )
1596
1604
 
1597
1605
  # downsample if need to eval_set threshold
1598
- num_samples = _num_samples(df_with_eval_set_index)
1606
+ num_samples = _num_samples(df)
1599
1607
  if num_samples > Dataset.FIT_SAMPLE_WITH_EVAL_SET_THRESHOLD:
1600
1608
  self.logger.info(f"Downsampling from {num_samples} to {Dataset.FIT_SAMPLE_WITH_EVAL_SET_ROWS}")
1601
- df_with_eval_set_index = df_with_eval_set_index.sample(
1609
+ df = df.sample(
1602
1610
  n=Dataset.FIT_SAMPLE_WITH_EVAL_SET_ROWS, random_state=self.random_state
1603
1611
  )
1604
1612
 
1605
- df_extended, search_keys = self._extend_x(df_with_eval_set_index, is_demo_dataset)
1613
+ df_extended, search_keys = self._extend_x(df, is_demo_dataset)
1606
1614
 
1607
1615
  eval_set_sampled_dict = dict()
1608
1616
 
1609
- df_extended = self.__add_fit_system_record_id(df_extended, dict(), search_keys)
1617
+ df = self.__add_fit_system_record_id(df, dict(), self.search_keys)
1610
1618
 
1611
1619
  x_columns = [
1612
1620
  c
1613
1621
  for c in df_extended.columns
1614
1622
  if c not in [TARGET, EVAL_SET_INDEX, DateTimeSearchKeyConverter.DATETIME_COL]
1615
1623
  ]
1624
+ x_columns.append(SYSTEM_RECORD_ID)
1616
1625
 
1617
1626
  tmp_target_name = "__target"
1618
- df_extended.rename(columns={SYSTEM_RECORD_ID: SORT_ID, TARGET: tmp_target_name}, inplace=True)
1627
+ df.rename(columns={SYSTEM_RECORD_ID: SORT_ID, TARGET: tmp_target_name}, inplace=True)
1619
1628
 
1620
1629
  enriched_df = self.transform(
1621
- df_extended,
1630
+ df,
1622
1631
  exclude_features_sources=exclude_features_sources,
1623
1632
  silent_mode=True,
1624
1633
  trace_id=trace_id,
@@ -1632,6 +1641,7 @@ class FeaturesEnricher(TransformerMixin):
1632
1641
  enriched_df.rename(columns={SORT_ID: SYSTEM_RECORD_ID, tmp_target_name: TARGET}, inplace=True)
1633
1642
 
1634
1643
  enriched_Xy = enriched_df.query(f"{EVAL_SET_INDEX} == 0")
1644
+ x_columns = [col for col in x_columns if col in enriched_Xy.columns]
1635
1645
  X_sampled = enriched_Xy[x_columns].copy()
1636
1646
  y_sampled = enriched_Xy[TARGET].copy()
1637
1647
  enriched_X = enriched_Xy.drop(columns=[TARGET, EVAL_SET_INDEX])
@@ -1654,15 +1664,16 @@ class FeaturesEnricher(TransformerMixin):
1654
1664
 
1655
1665
  df_extended, search_keys = self._extend_x(df, is_demo_dataset)
1656
1666
 
1657
- df_extended = self.__add_fit_system_record_id(df_extended, dict(), search_keys)
1667
+ df = self.__add_fit_system_record_id(df, dict(), self.search_keys)
1658
1668
 
1659
- x_columns = [c for c in df_extended if c not in [TARGET, DateTimeSearchKeyConverter.DATETIME_COL]]
1669
+ x_columns = [c for c in df_extended.columns if c not in [TARGET, DateTimeSearchKeyConverter.DATETIME_COL]]
1670
+ x_columns.append(SYSTEM_RECORD_ID)
1660
1671
 
1661
1672
  tmp_target_name = "__target"
1662
- df_extended.rename(columns={SYSTEM_RECORD_ID: SORT_ID, TARGET: tmp_target_name}, inplace=True)
1673
+ df.rename(columns={SYSTEM_RECORD_ID: SORT_ID, TARGET: tmp_target_name}, inplace=True)
1663
1674
 
1664
1675
  enriched_Xy = self.transform(
1665
- df_extended,
1676
+ df,
1666
1677
  exclude_features_sources=exclude_features_sources,
1667
1678
  silent_mode=True,
1668
1679
  trace_id=trace_id,
@@ -1675,7 +1686,8 @@ class FeaturesEnricher(TransformerMixin):
1675
1686
 
1676
1687
  enriched_Xy.rename(columns={SORT_ID: SYSTEM_RECORD_ID, tmp_target_name: TARGET}, inplace=True)
1677
1688
 
1678
- X_sampled = enriched_Xy[x_columns].copy() # check that all columns are present
1689
+ x_columns = [col for col in x_columns if col in enriched_Xy.columns]
1690
+ X_sampled = enriched_Xy[x_columns].copy()
1679
1691
  y_sampled = enriched_Xy[TARGET].copy()
1680
1692
  enriched_X = enriched_Xy.drop(columns=TARGET)
1681
1693
 
@@ -1794,15 +1806,16 @@ class FeaturesEnricher(TransformerMixin):
1794
1806
 
1795
1807
  is_demo_dataset = hash_input(validated_X) in DEMO_DATASET_HASHES
1796
1808
 
1797
- if (
1798
- self._has_trial_features(exclude_features_sources)
1799
- and not metrics_calculation
1800
- and not self.__is_registered
1801
- and not is_demo_dataset
1802
- ):
1803
- msg = self.bundle.get("transform_with_trial_features")
1804
- self.logger.warning(msg)
1805
- print(msg)
1809
+ # No more trial features functionality
1810
+ # if (
1811
+ # self._has_trial_features(exclude_features_sources)
1812
+ # and not metrics_calculation
1813
+ # and not self.__is_registered
1814
+ # and not is_demo_dataset
1815
+ # ):
1816
+ # msg = self.bundle.get("transform_with_trial_features")
1817
+ # self.logger.warning(msg)
1818
+ # print(msg)
1806
1819
 
1807
1820
  columns_to_drop = [c for c in validated_X.columns if c in self.feature_names_]
1808
1821
  if len(columns_to_drop) > 0:
@@ -2020,14 +2033,14 @@ class FeaturesEnricher(TransformerMixin):
2020
2033
  if len(
2021
2034
  filtered_features[
2022
2035
  filtered_features[comm_schema_header].isin(
2023
- [CommercialSchema.PAID.value, CommercialSchema.TRIAL.value]
2036
+ [CommercialSchema.PAID.value]
2024
2037
  )
2025
2038
  ]
2026
2039
  ):
2027
2040
  return []
2028
2041
  excluded_features = external_features[~external_features.index.isin(filtered_features.index)].copy()
2029
2042
  excluded_features = excluded_features[
2030
- excluded_features[comm_schema_header].isin([CommercialSchema.PAID.value, CommercialSchema.TRIAL.value])
2043
+ excluded_features[comm_schema_header].isin([CommercialSchema.PAID.value])
2031
2044
  ]
2032
2045
  return excluded_features[feature_name_header].values.tolist()
2033
2046
 
@@ -3048,11 +3061,6 @@ class FeaturesEnricher(TransformerMixin):
3048
3061
  else:
3049
3062
  feature_name = internal_feature_name
3050
3063
 
3051
- commercial_schema = (
3052
- "Premium"
3053
- if feature_meta.commercial_schema in ["Trial", "Paid"] or feature_meta.commercial_schema is None
3054
- else feature_meta.commercial_schema
3055
- )
3056
3064
  features_info.append(
3057
3065
  {
3058
3066
  self.bundle.get("features_info_name"): feature_name,
@@ -3061,7 +3069,7 @@ class FeaturesEnricher(TransformerMixin):
3061
3069
  self.bundle.get("features_info_value_preview"): feature_sample,
3062
3070
  self.bundle.get("features_info_provider"): provider,
3063
3071
  self.bundle.get("features_info_source"): source,
3064
- self.bundle.get("features_info_commercial_schema"): commercial_schema,
3072
+ self.bundle.get("features_info_update_frequency"): feature_meta.update_frequency,
3065
3073
  }
3066
3074
  )
3067
3075
  features_info_without_links.append(
@@ -3072,7 +3080,7 @@ class FeaturesEnricher(TransformerMixin):
3072
3080
  self.bundle.get("features_info_value_preview"): feature_sample,
3073
3081
  self.bundle.get("features_info_provider"): internal_provider,
3074
3082
  self.bundle.get("features_info_source"): internal_source,
3075
- self.bundle.get("features_info_commercial_schema"): commercial_schema,
3083
+ self.bundle.get("features_info_update_frequency"): feature_meta.update_frequency,
3076
3084
  }
3077
3085
  )
3078
3086
  internal_features_info.append(
@@ -3087,6 +3095,7 @@ class FeaturesEnricher(TransformerMixin):
3087
3095
  self.bundle.get("features_info_source"): internal_source,
3088
3096
  "source_link": feature_meta.data_source_link,
3089
3097
  self.bundle.get("features_info_commercial_schema"): feature_meta.commercial_schema or "",
3098
+ self.bundle.get("features_info_update_frequency"): feature_meta.update_frequency,
3090
3099
  }
3091
3100
  )
3092
3101
 
@@ -0,0 +1,8 @@
1
+ /**
2
+ * FingerprintJS v3.4.2 - Copyright (c) FingerprintJS, Inc, 2023 (https://fingerprint.com)
3
+ * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
4
+ *
5
+ * This software contains code from open-source projects:
6
+ * MurmurHash3 by Karan Lyons (https://github.com/karanlyons/murmurHash3.js)
7
+ */
8
+ var e=function(){return e=Object.assign||function(e){for(var n,t=1,r=arguments.length;t<r;t++)for(var o in n=arguments[t])Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o]);return e},e.apply(this,arguments)};function n(e,n,t,r){return new(t||(t=Promise))((function(o,a){function i(e){try{u(r.next(e))}catch(n){a(n)}}function c(e){try{u(r.throw(e))}catch(n){a(n)}}function u(e){var n;e.done?o(e.value):(n=e.value,n instanceof t?n:new t((function(e){e(n)}))).then(i,c)}u((r=r.apply(e,n||[])).next())}))}function t(e,n){var t,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function c(c){return function(u){return function(c){if(t)throw new TypeError("Generator is already executing.");for(;a&&(a=0,c[0]&&(i=0)),i;)try{if(t=1,r&&(o=2&c[0]?r.return:c[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,c[1])).done)return o;switch(r=0,o&&(c=[2&c[0],o.value]),c[0]){case 0:case 1:o=c;break;case 4:return i.label++,{value:c[1],done:!1};case 5:i.label++,r=c[1],c=[0];continue;case 7:c=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==c[0]&&2!==c[0])){i=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]<o[3])){i.label=c[1];break}if(6===c[0]&&i.label<o[1]){i.label=o[1],o=c;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(c);break}o[2]&&i.ops.pop(),i.trys.pop();continue}c=n.call(e,i)}catch(u){c=[6,u],r=0}finally{t=o=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}([c,u])}}}function r(e,n,t){if(t||2===arguments.length)for(var r,o=0,a=n.length;o<a;o++)!r&&o in n||(r||(r=Array.prototype.slice.call(n,0,o)),r[o]=n[o]);return e.concat(r||Array.prototype.slice.call(n))}function o(e,n){return new Promise((function(t){return setTimeout(t,e,n)}))}function a(e){return!!e&&"function"==typeof e.then}function i(e,n){try{var t=e();a(t)?t.then((function(e){return n(!0,e)}),(function(e){return n(!1,e)})):n(!0,t)}catch(r){n(!1,r)}}function c(e,r,a){return void 0===a&&(a=16),n(this,void 0,void 0,(function(){var n,i,c,u;return t(this,(function(t){switch(t.label){case 0:n=Array(e.length),i=Date.now(),c=0,t.label=1;case 1:return c<e.length?(n[c]=r(e[c],c),(u=Date.now())>=i+a?(i=u,[4,o(0)]):[3,3]):[3,4];case 2:t.sent(),t.label=3;case 3:return++c,[3,1];case 4:return[2,n]}}))}))}function u(e){e.then(void 0,(function(){}))}function l(e,n){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],n=[n[0]>>>16,65535&n[0],n[1]>>>16,65535&n[1]];var t=[0,0,0,0];return t[3]+=e[3]+n[3],t[2]+=t[3]>>>16,t[3]&=65535,t[2]+=e[2]+n[2],t[1]+=t[2]>>>16,t[2]&=65535,t[1]+=e[1]+n[1],t[0]+=t[1]>>>16,t[1]&=65535,t[0]+=e[0]+n[0],t[0]&=65535,[t[0]<<16|t[1],t[2]<<16|t[3]]}function s(e,n){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],n=[n[0]>>>16,65535&n[0],n[1]>>>16,65535&n[1]];var t=[0,0,0,0];return t[3]+=e[3]*n[3],t[2]+=t[3]>>>16,t[3]&=65535,t[2]+=e[2]*n[3],t[1]+=t[2]>>>16,t[2]&=65535,t[2]+=e[3]*n[2],t[1]+=t[2]>>>16,t[2]&=65535,t[1]+=e[1]*n[3],t[0]+=t[1]>>>16,t[1]&=65535,t[1]+=e[2]*n[2],t[0]+=t[1]>>>16,t[1]&=65535,t[1]+=e[3]*n[1],t[0]+=t[1]>>>16,t[1]&=65535,t[0]+=e[0]*n[3]+e[1]*n[2]+e[2]*n[1]+e[3]*n[0],t[0]&=65535,[t[0]<<16|t[1],t[2]<<16|t[3]]}function d(e,n){return 32===(n%=64)?[e[1],e[0]]:n<32?[e[0]<<n|e[1]>>>32-n,e[1]<<n|e[0]>>>32-n]:(n-=32,[e[1]<<n|e[0]>>>32-n,e[0]<<n|e[1]>>>32-n])}function m(e,n){return 0===(n%=64)?e:n<32?[e[0]<<n|e[1]>>>32-n,e[1]<<n]:[e[1]<<n-32,0]}function f(e,n){return[e[0]^n[0],e[1]^n[1]]}function v(e){return e=f(e,[0,e[0]>>>1]),e=f(e=s(e,[4283543511,3981806797]),[0,e[0]>>>1]),e=f(e=s(e,[3301882366,444984403]),[0,e[0]>>>1])}function h(e,n){n=n||0;var t,r=(e=e||"").length%16,o=e.length-r,a=[0,n],i=[0,n],c=[0,0],u=[0,0],h=[2277735313,289559509],p=[1291169091,658871167];for(t=0;t<o;t+=16)c=[255&e.charCodeAt(t+4)|(255&e.charCodeAt(t+5))<<8|(255&e.charCodeAt(t+6))<<16|(255&e.charCodeAt(t+7))<<24,255&e.charCodeAt(t)|(255&e.charCodeAt(t+1))<<8|(255&e.charCodeAt(t+2))<<16|(255&e.charCodeAt(t+3))<<24],u=[255&e.charCodeAt(t+12)|(255&e.charCodeAt(t+13))<<8|(255&e.charCodeAt(t+14))<<16|(255&e.charCodeAt(t+15))<<24,255&e.charCodeAt(t+8)|(255&e.charCodeAt(t+9))<<8|(255&e.charCodeAt(t+10))<<16|(255&e.charCodeAt(t+11))<<24],c=d(c=s(c,h),31),a=l(a=d(a=f(a,c=s(c,p)),27),i),a=l(s(a,[0,5]),[0,1390208809]),u=d(u=s(u,p),33),i=l(i=d(i=f(i,u=s(u,h)),31),a),i=l(s(i,[0,5]),[0,944331445]);switch(c=[0,0],u=[0,0],r){case 15:u=f(u,m([0,e.charCodeAt(t+14)],48));case 14:u=f(u,m([0,e.charCodeAt(t+13)],40));case 13:u=f(u,m([0,e.charCodeAt(t+12)],32));case 12:u=f(u,m([0,e.charCodeAt(t+11)],24));case 11:u=f(u,m([0,e.charCodeAt(t+10)],16));case 10:u=f(u,m([0,e.charCodeAt(t+9)],8));case 9:u=s(u=f(u,[0,e.charCodeAt(t+8)]),p),i=f(i,u=s(u=d(u,33),h));case 8:c=f(c,m([0,e.charCodeAt(t+7)],56));case 7:c=f(c,m([0,e.charCodeAt(t+6)],48));case 6:c=f(c,m([0,e.charCodeAt(t+5)],40));case 5:c=f(c,m([0,e.charCodeAt(t+4)],32));case 4:c=f(c,m([0,e.charCodeAt(t+3)],24));case 3:c=f(c,m([0,e.charCodeAt(t+2)],16));case 2:c=f(c,m([0,e.charCodeAt(t+1)],8));case 1:c=s(c=f(c,[0,e.charCodeAt(t)]),h),a=f(a,c=s(c=d(c,31),p))}return a=l(a=f(a,[0,e.length]),i=f(i,[0,e.length])),i=l(i,a),a=l(a=v(a),i=v(i)),i=l(i,a),("00000000"+(a[0]>>>0).toString(16)).slice(-8)+("00000000"+(a[1]>>>0).toString(16)).slice(-8)+("00000000"+(i[0]>>>0).toString(16)).slice(-8)+("00000000"+(i[1]>>>0).toString(16)).slice(-8)}function p(e){return parseInt(e)}function b(e){return parseFloat(e)}function y(e,n){return"number"==typeof e&&isNaN(e)?n:e}function g(e){return e.reduce((function(e,n){return e+(n?1:0)}),0)}function w(e,n){if(void 0===n&&(n=1),Math.abs(n)>=1)return Math.round(e/n)*n;var t=1/n;return Math.round(e*t)/t}function L(e){return e&&"object"==typeof e&&"message"in e?e:{message:e}}function k(e){return"function"!=typeof e}function V(e,r,o){var a=Object.keys(e).filter((function(e){return!function(e,n){for(var t=0,r=e.length;t<r;++t)if(e[t]===n)return!0;return!1}(o,e)})),l=c(a,(function(n){return function(e,n){var t=new Promise((function(t){var r=Date.now();i(e.bind(null,n),(function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];var o=Date.now()-r;if(!e[0])return t((function(){return{error:L(e[1]),duration:o}}));var a=e[1];if(k(a))return t((function(){return{value:a,duration:o}}));t((function(){return new Promise((function(e){var n=Date.now();i(a,(function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];var a=o+Date.now()-n;if(!t[0])return e({error:L(t[1]),duration:a});e({value:t[1],duration:a})}))}))}))}))}));return u(t),function(){return t.then((function(e){return e()}))}}(e[n],r)}));return u(l),function(){return n(this,void 0,void 0,(function(){var e,n,r,o;return t(this,(function(t){switch(t.label){case 0:return[4,l];case 1:return[4,c(t.sent(),(function(e){var n=e();return u(n),n}))];case 2:return e=t.sent(),[4,Promise.all(e)];case 3:for(n=t.sent(),r={},o=0;o<a.length;++o)r[a[o]]=n[o];return[2,r]}}))}))}}function Z(e,n){var t=function(e){return k(e)?n(e):function(){var t=e();return a(t)?t.then(n):n(t)}};return function(n){var r=e(n);return a(r)?r.then(t):t(r)}}function W(){var e=window,n=navigator;return g(["MSCSSMatrix"in e,"msSetImmediate"in e,"msIndexedDB"in e,"msMaxTouchPoints"in n,"msPointerEnabled"in n])>=4}function C(){var e=window,n=navigator;return g(["msWriteProfilerMark"in e,"MSStream"in e,"msLaunchUri"in n,"msSaveBlob"in n])>=3&&!W()}function S(){var e=window,n=navigator;return g(["webkitPersistentStorage"in n,"webkitTemporaryStorage"in n,0===n.vendor.indexOf("Google"),"webkitResolveLocalFileSystemURL"in e,"BatteryManager"in e,"webkitMediaStream"in e,"webkitSpeechGrammar"in e])>=5}function x(){var e=window,n=navigator;return g(["ApplePayError"in e,"CSSPrimitiveValue"in e,"Counter"in e,0===n.vendor.indexOf("Apple"),"getStorageUpdates"in n,"WebKitMediaKeys"in e])>=4}function F(){var e=window;return g(["safari"in e,!("DeviceMotionEvent"in e),!("ongestureend"in e),!("standalone"in navigator)])>=3}function Y(){var e,n,t=window;return g(["buildID"in navigator,"MozAppearance"in(null!==(n=null===(e=document.documentElement)||void 0===e?void 0:e.style)&&void 0!==n?n:{}),"onmozfullscreenchange"in t,"mozInnerScreenX"in t,"CSSMozDocumentRule"in t,"CanvasCaptureMediaStream"in t])>=4}function M(){var e=document;return e.fullscreenElement||e.msFullscreenElement||e.mozFullScreenElement||e.webkitFullscreenElement||null}function G(){var e=S(),n=Y();if(!e&&!n)return!1;var t=window;return g(["onorientationchange"in t,"orientation"in t,e&&!("SharedWorker"in t),n&&/android/i.test(navigator.appVersion)])>=2}function R(e){var n=new Error(e);return n.name=e,n}function X(e,r,a){var i,c,u;return void 0===a&&(a=50),n(this,void 0,void 0,(function(){var n,l;return t(this,(function(t){switch(t.label){case 0:n=document,t.label=1;case 1:return n.body?[3,3]:[4,o(a)];case 2:return t.sent(),[3,1];case 3:l=n.createElement("iframe"),t.label=4;case 4:return t.trys.push([4,,10,11]),[4,new Promise((function(e,t){var o=!1,a=function(){o=!0,e()};l.onload=a,l.onerror=function(e){o=!0,t(e)};var i=l.style;i.setProperty("display","block","important"),i.position="absolute",i.top="0",i.left="0",i.visibility="hidden",r&&"srcdoc"in l?l.srcdoc=r:l.src="about:blank",n.body.appendChild(l);var c=function(){var e,n;o||("complete"===(null===(n=null===(e=l.contentWindow)||void 0===e?void 0:e.document)||void 0===n?void 0:n.readyState)?a():setTimeout(c,10))};c()}))];case 5:t.sent(),t.label=6;case 6:return(null===(c=null===(i=l.contentWindow)||void 0===i?void 0:i.document)||void 0===c?void 0:c.body)?[3,8]:[4,o(a)];case 7:return t.sent(),[3,6];case 8:return[4,e(l,l.contentWindow)];case 9:return[2,t.sent()];case 10:return null===(u=l.parentNode)||void 0===u||u.removeChild(l),[7];case 11:return[2]}}))}))}function A(e){for(var n=function(e){for(var n,t,r="Unexpected syntax '".concat(e,"'"),o=/^\s*([a-z-]*)(.*)$/i.exec(e),a=o[1]||void 0,i={},c=/([.:#][\w-]+|\[.+?\])/gi,u=function(e,n){i[e]=i[e]||[],i[e].push(n)};;){var l=c.exec(o[2]);if(!l)break;var s=l[0];switch(s[0]){case".":u("class",s.slice(1));break;case"#":u("id",s.slice(1));break;case"[":var d=/^\[([\w-]+)([~|^$*]?=("(.*?)"|([\w-]+)))?(\s+[is])?\]$/.exec(s);if(!d)throw new Error(r);u(d[1],null!==(t=null!==(n=d[4])&&void 0!==n?n:d[5])&&void 0!==t?t:"");break;default:throw new Error(r)}}return[a,i]}(e),t=n[0],r=n[1],o=document.createElement(null!=t?t:"div"),a=0,i=Object.keys(r);a<i.length;a++){var c=i[a],u=r[c].join(" ");"style"===c?j(o.style,u):o.setAttribute(c,u)}return o}function j(e,n){for(var t=0,r=n.split(";");t<r.length;t++){var o=r[t],a=/^\s*([\w-]+)\s*:\s*(.+?)(\s*!([\w-]+))?\s*$/.exec(o);if(a){var i=a[1],c=a[2],u=a[4];e.setProperty(i,c,u||"")}}}var I=["monospace","sans-serif","serif"],J=["sans-serif-thin","ARNO PRO","Agency FB","Arabic Typesetting","Arial Unicode MS","AvantGarde Bk BT","BankGothic Md BT","Batang","Bitstream Vera Sans Mono","Calibri","Century","Century Gothic","Clarendon","EUROSTILE","Franklin Gothic","Futura Bk BT","Futura Md BT","GOTHAM","Gill Sans","HELV","Haettenschweiler","Helvetica Neue","Humanst521 BT","Leelawadee","Letter Gothic","Levenim MT","Lucida Bright","Lucida Sans","Menlo","MS Mincho","MS Outlook","MS Reference Specialty","MS UI Gothic","MT Extra","MYRIAD PRO","Marlett","Meiryo UI","Microsoft Uighur","Minion Pro","Monotype Corsiva","PMingLiU","Pristina","SCRIPTINA","Segoe UI Light","Serifa","SimHei","Small Fonts","Staccato222 BT","TRAJAN PRO","Univers CE 55 Medium","Vrinda","ZWAdobeF"];function H(e){return e.toDataURL()}var P,N;function z(){var e=this;return function(){if(void 0===N){var e=function(){var n=D();E(n)?N=setTimeout(e,2500):(P=n,N=void 0)};e()}}(),function(){return n(e,void 0,void 0,(function(){var e;return t(this,(function(n){switch(n.label){case 0:return E(e=D())?P?[2,r([],P,!0)]:M()?[4,(t=document,(t.exitFullscreen||t.msExitFullscreen||t.mozCancelFullScreen||t.webkitExitFullscreen).call(t))]:[3,2]:[3,2];case 1:n.sent(),e=D(),n.label=2;case 2:return E(e)||(P=e),[2,e]}var t}))}))}}function D(){var e=screen;return[y(b(e.availTop),null),y(b(e.width)-b(e.availWidth)-y(b(e.availLeft),0),null),y(b(e.height)-b(e.availHeight)-y(b(e.availTop),0),null),y(b(e.availLeft),null)]}function E(e){for(var n=0;n<4;++n)if(e[n])return!1;return!0}function T(e){var r;return n(this,void 0,void 0,(function(){var n,a,i,c,u,l,s;return t(this,(function(t){switch(t.label){case 0:for(n=document,a=n.createElement("div"),i=new Array(e.length),c={},B(a),s=0;s<e.length;++s)"DIALOG"===(u=A(e[s])).tagName&&u.show(),B(l=n.createElement("div")),l.appendChild(u),a.appendChild(l),i[s]=u;t.label=1;case 1:return n.body?[3,3]:[4,o(50)];case 2:return t.sent(),[3,1];case 3:n.body.appendChild(a);try{for(s=0;s<e.length;++s)i[s].offsetParent||(c[e[s]]=!0)}finally{null===(r=a.parentNode)||void 0===r||r.removeChild(a)}return[2,c]}}))}))}function B(e){e.style.setProperty("display","block","important")}function _(e){return matchMedia("(inverted-colors: ".concat(e,")")).matches}function O(e){return matchMedia("(forced-colors: ".concat(e,")")).matches}function U(e){return matchMedia("(prefers-contrast: ".concat(e,")")).matches}function Q(e){return matchMedia("(prefers-reduced-motion: ".concat(e,")")).matches}function K(e){return matchMedia("(dynamic-range: ".concat(e,")")).matches}var q=Math,$=function(){return 0};var ee={default:[],apple:[{font:"-apple-system-body"}],serif:[{fontFamily:"serif"}],sans:[{fontFamily:"sans-serif"}],mono:[{fontFamily:"monospace"}],min:[{fontSize:"1px"}],system:[{fontFamily:"system-ui"}]};var ne={fonts:function(){return X((function(e,n){var t=n.document,r=t.body;r.style.fontSize="48px";var o=t.createElement("div"),a={},i={},c=function(e){var n=t.createElement("span"),r=n.style;return r.position="absolute",r.top="0",r.left="0",r.fontFamily=e,n.textContent="mmMwWLliI0O&1",o.appendChild(n),n},u=I.map(c),l=function(){for(var e={},n=function(n){e[n]=I.map((function(e){return function(e,n){return c("'".concat(e,"',").concat(n))}(n,e)}))},t=0,r=J;t<r.length;t++){n(r[t])}return e}();r.appendChild(o);for(var s=0;s<I.length;s++)a[I[s]]=u[s].offsetWidth,i[I[s]]=u[s].offsetHeight;return J.filter((function(e){return n=l[e],I.some((function(e,t){return n[t].offsetWidth!==a[e]||n[t].offsetHeight!==i[e]}));var n}))}))},domBlockers:function(e){var r=(void 0===e?{}:e).debug;return n(this,void 0,void 0,(function(){var e,n,o,a,i;return t(this,(function(t){switch(t.label){case 0:return x()||G()?(c=atob,e={abpIndo:["#Iklan-Melayang","#Kolom-Iklan-728","#SidebarIklan-wrapper",'[title="ALIENBOLA" i]',c("I0JveC1CYW5uZXItYWRz")],abpvn:[".quangcao","#mobileCatfish",c("LmNsb3NlLWFkcw=="),'[id^="bn_bottom_fixed_"]',"#pmadv"],adBlockFinland:[".mainostila",c("LnNwb25zb3JpdA=="),".ylamainos",c("YVtocmVmKj0iL2NsaWNrdGhyZ2guYXNwPyJd"),c("YVtocmVmXj0iaHR0cHM6Ly9hcHAucmVhZHBlYWsuY29tL2FkcyJd")],adBlockPersian:["#navbar_notice_50",".kadr",'TABLE[width="140px"]',"#divAgahi",c("YVtocmVmXj0iaHR0cDovL2cxLnYuZndtcm0ubmV0L2FkLyJd")],adBlockWarningRemoval:["#adblock-honeypot",".adblocker-root",".wp_adblock_detect",c("LmhlYWRlci1ibG9ja2VkLWFk"),c("I2FkX2Jsb2NrZXI=")],adGuardAnnoyances:[".hs-sosyal","#cookieconsentdiv",'div[class^="app_gdpr"]',".as-oil",'[data-cypress="soft-push-notification-modal"]'],adGuardBase:[".BetterJsPopOverlay",c("I2FkXzMwMFgyNTA="),c("I2Jhbm5lcmZsb2F0MjI="),c("I2NhbXBhaWduLWJhbm5lcg=="),c("I0FkLUNvbnRlbnQ=")],adGuardChinese:[c("LlppX2FkX2FfSA=="),c("YVtocmVmKj0iLmh0aGJldDM0LmNvbSJd"),"#widget-quan",c("YVtocmVmKj0iLzg0OTkyMDIwLnh5eiJd"),c("YVtocmVmKj0iLjE5NTZobC5jb20vIl0=")],adGuardFrench:["#pavePub",c("LmFkLWRlc2t0b3AtcmVjdGFuZ2xl"),".mobile_adhesion",".widgetadv",c("LmFkc19iYW4=")],adGuardGerman:['aside[data-portal-id="leaderboard"]'],adGuardJapanese:["#kauli_yad_1",c("YVtocmVmXj0iaHR0cDovL2FkMi50cmFmZmljZ2F0ZS5uZXQvIl0="),c("Ll9wb3BJbl9pbmZpbml0ZV9hZA=="),c("LmFkZ29vZ2xl"),c("Ll9faXNib29zdFJldHVybkFk")],adGuardMobile:[c("YW1wLWF1dG8tYWRz"),c("LmFtcF9hZA=="),'amp-embed[type="24smi"]',"#mgid_iframe1",c("I2FkX2ludmlld19hcmVh")],adGuardRussian:[c("YVtocmVmXj0iaHR0cHM6Ly9hZC5sZXRtZWFkcy5jb20vIl0="),c("LnJlY2xhbWE="),'div[id^="smi2adblock"]',c("ZGl2W2lkXj0iQWRGb3hfYmFubmVyXyJd"),"#psyduckpockeball"],adGuardSocial:[c("YVtocmVmXj0iLy93d3cuc3R1bWJsZXVwb24uY29tL3N1Ym1pdD91cmw9Il0="),c("YVtocmVmXj0iLy90ZWxlZ3JhbS5tZS9zaGFyZS91cmw/Il0="),".etsy-tweet","#inlineShare",".popup-social"],adGuardSpanishPortuguese:["#barraPublicidade","#Publicidade","#publiEspecial","#queTooltip",".cnt-publi"],adGuardTrackingProtection:["#qoo-counter",c("YVtocmVmXj0iaHR0cDovL2NsaWNrLmhvdGxvZy5ydS8iXQ=="),c("YVtocmVmXj0iaHR0cDovL2hpdGNvdW50ZXIucnUvdG9wL3N0YXQucGhwIl0="),c("YVtocmVmXj0iaHR0cDovL3RvcC5tYWlsLnJ1L2p1bXAiXQ=="),"#top100counter"],adGuardTurkish:["#backkapat",c("I3Jla2xhbWk="),c("YVtocmVmXj0iaHR0cDovL2Fkc2Vydi5vbnRlay5jb20udHIvIl0="),c("YVtocmVmXj0iaHR0cDovL2l6bGVuemkuY29tL2NhbXBhaWduLyJd"),c("YVtocmVmXj0iaHR0cDovL3d3dy5pbnN0YWxsYWRzLm5ldC8iXQ==")],bulgarian:[c("dGQjZnJlZW5ldF90YWJsZV9hZHM="),"#ea_intext_div",".lapni-pop-over","#xenium_hot_offers"],easyList:[".yb-floorad",c("LndpZGdldF9wb19hZHNfd2lkZ2V0"),c("LnRyYWZmaWNqdW5reS1hZA=="),".textad_headline",c("LnNwb25zb3JlZC10ZXh0LWxpbmtz")],easyListChina:[c("LmFwcGd1aWRlLXdyYXBbb25jbGljayo9ImJjZWJvcy5jb20iXQ=="),c("LmZyb250cGFnZUFkdk0="),"#taotaole","#aafoot.top_box",".cfa_popup"],easyListCookie:[".ezmob-footer",".cc-CookieWarning","[data-cookie-number]",c("LmF3LWNvb2tpZS1iYW5uZXI="),".sygnal24-gdpr-modal-wrap"],easyListCzechSlovak:["#onlajny-stickers",c("I3Jla2xhbW5pLWJveA=="),c("LnJla2xhbWEtbWVnYWJvYXJk"),".sklik",c("W2lkXj0ic2tsaWtSZWtsYW1hIl0=")],easyListDutch:[c("I2FkdmVydGVudGll"),c("I3ZpcEFkbWFya3RCYW5uZXJCbG9jaw=="),".adstekst",c("YVtocmVmXj0iaHR0cHM6Ly94bHR1YmUubmwvY2xpY2svIl0="),"#semilo-lrectangle"],easyListGermany:["#SSpotIMPopSlider",c("LnNwb25zb3JsaW5rZ3J1ZW4="),c("I3dlcmJ1bmdza3k="),c("I3Jla2xhbWUtcmVjaHRzLW1pdHRl"),c("YVtocmVmXj0iaHR0cHM6Ly9iZDc0Mi5jb20vIl0=")],easyListItaly:[c("LmJveF9hZHZfYW5udW5jaQ=="),".sb-box-pubbliredazionale",c("YVtocmVmXj0iaHR0cDovL2FmZmlsaWF6aW9uaWFkcy5zbmFpLml0LyJd"),c("YVtocmVmXj0iaHR0cHM6Ly9hZHNlcnZlci5odG1sLml0LyJd"),c("YVtocmVmXj0iaHR0cHM6Ly9hZmZpbGlhemlvbmlhZHMuc25haS5pdC8iXQ==")],easyListLithuania:[c("LnJla2xhbW9zX3RhcnBhcw=="),c("LnJla2xhbW9zX251b3JvZG9z"),c("aW1nW2FsdD0iUmVrbGFtaW5pcyBza3lkZWxpcyJd"),c("aW1nW2FsdD0iRGVkaWt1b3RpLmx0IHNlcnZlcmlhaSJd"),c("aW1nW2FsdD0iSG9zdGluZ2FzIFNlcnZlcmlhaS5sdCJd")],estonian:[c("QVtocmVmKj0iaHR0cDovL3BheTRyZXN1bHRzMjQuZXUiXQ==")],fanboyAnnoyances:["#ac-lre-player",".navigate-to-top","#subscribe_popup",".newsletter_holder","#back-top"],fanboyAntiFacebook:[".util-bar-module-firefly-visible"],fanboyEnhancedTrackers:[".open.pushModal","#issuem-leaky-paywall-articles-zero-remaining-nag","#sovrn_container",'div[class$="-hide"][zoompage-fontsize][style="display: block;"]',".BlockNag__Card"],fanboySocial:["#FollowUs","#meteored_share","#social_follow",".article-sharer",".community__social-desc"],frellwitSwedish:[c("YVtocmVmKj0iY2FzaW5vcHJvLnNlIl1bdGFyZ2V0PSJfYmxhbmsiXQ=="),c("YVtocmVmKj0iZG9rdG9yLXNlLm9uZWxpbmsubWUiXQ=="),"article.category-samarbete",c("ZGl2LmhvbGlkQWRz"),"ul.adsmodern"],greekAdBlock:[c("QVtocmVmKj0iYWRtYW4ub3RlbmV0LmdyL2NsaWNrPyJd"),c("QVtocmVmKj0iaHR0cDovL2F4aWFiYW5uZXJzLmV4b2R1cy5nci8iXQ=="),c("QVtocmVmKj0iaHR0cDovL2ludGVyYWN0aXZlLmZvcnRobmV0LmdyL2NsaWNrPyJd"),"DIV.agores300","TABLE.advright"],hungarian:["#cemp_doboz",".optimonk-iframe-container",c("LmFkX19tYWlu"),c("W2NsYXNzKj0iR29vZ2xlQWRzIl0="),"#hirdetesek_box"],iDontCareAboutCookies:['.alert-info[data-block-track*="CookieNotice"]',".ModuleTemplateCookieIndicator",".o--cookies--container","#cookies-policy-sticky","#stickyCookieBar"],icelandicAbp:[c("QVtocmVmXj0iL2ZyYW1ld29yay9yZXNvdXJjZXMvZm9ybXMvYWRzLmFzcHgiXQ==")],latvian:[c("YVtocmVmPSJodHRwOi8vd3d3LnNhbGlkemluaS5sdi8iXVtzdHlsZT0iZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMjBweDsgaGVpZ2h0OiA0MHB4OyBvdmVyZmxvdzogaGlkZGVuOyBwb3NpdGlvbjogcmVsYXRpdmU7Il0="),c("YVtocmVmPSJodHRwOi8vd3d3LnNhbGlkemluaS5sdi8iXVtzdHlsZT0iZGlzcGxheTogYmxvY2s7IHdpZHRoOiA4OHB4OyBoZWlnaHQ6IDMxcHg7IG92ZXJmbG93OiBoaWRkZW47IHBvc2l0aW9uOiByZWxhdGl2ZTsiXQ==")],listKr:[c("YVtocmVmKj0iLy9hZC5wbGFuYnBsdXMuY28ua3IvIl0="),c("I2xpdmVyZUFkV3JhcHBlcg=="),c("YVtocmVmKj0iLy9hZHYuaW1hZHJlcC5jby5rci8iXQ=="),c("aW5zLmZhc3R2aWV3LWFk"),".revenue_unit_item.dable"],listeAr:[c("LmdlbWluaUxCMUFk"),".right-and-left-sponsers",c("YVtocmVmKj0iLmFmbGFtLmluZm8iXQ=="),c("YVtocmVmKj0iYm9vcmFxLm9yZyJd"),c("YVtocmVmKj0iZHViaXp6bGUuY29tL2FyLz91dG1fc291cmNlPSJd")],listeFr:[c("YVtocmVmXj0iaHR0cDovL3Byb21vLnZhZG9yLmNvbS8iXQ=="),c("I2FkY29udGFpbmVyX3JlY2hlcmNoZQ=="),c("YVtocmVmKj0id2Vib3JhbWEuZnIvZmNnaS1iaW4vIl0="),".site-pub-interstitiel",'div[id^="crt-"][data-criteo-id]'],officialPolish:["#ceneo-placeholder-ceneo-12",c("W2hyZWZePSJodHRwczovL2FmZi5zZW5kaHViLnBsLyJd"),c("YVtocmVmXj0iaHR0cDovL2Fkdm1hbmFnZXIudGVjaGZ1bi5wbC9yZWRpcmVjdC8iXQ=="),c("YVtocmVmXj0iaHR0cDovL3d3dy50cml6ZXIucGwvP3V0bV9zb3VyY2UiXQ=="),c("ZGl2I3NrYXBpZWNfYWQ=")],ro:[c("YVtocmVmXj0iLy9hZmZ0cmsuYWx0ZXgucm8vQ291bnRlci9DbGljayJd"),c("YVtocmVmXj0iaHR0cHM6Ly9ibGFja2ZyaWRheXNhbGVzLnJvL3Ryay9zaG9wLyJd"),c("YVtocmVmXj0iaHR0cHM6Ly9ldmVudC4ycGVyZm9ybWFudC5jb20vZXZlbnRzL2NsaWNrIl0="),c("YVtocmVmXj0iaHR0cHM6Ly9sLnByb2ZpdHNoYXJlLnJvLyJd"),'a[href^="/url/"]'],ruAd:[c("YVtocmVmKj0iLy9mZWJyYXJlLnJ1LyJd"),c("YVtocmVmKj0iLy91dGltZy5ydS8iXQ=="),c("YVtocmVmKj0iOi8vY2hpa2lkaWtpLnJ1Il0="),"#pgeldiz",".yandex-rtb-block"],thaiAds:["a[href*=macau-uta-popup]",c("I2Fkcy1nb29nbGUtbWlkZGxlX3JlY3RhbmdsZS1ncm91cA=="),c("LmFkczMwMHM="),".bumq",".img-kosana"],webAnnoyancesUltralist:["#mod-social-share-2","#social-tools",c("LmN0cGwtZnVsbGJhbm5lcg=="),".zergnet-recommend",".yt.btn-link.btn-md.btn"]},n=Object.keys(e),[4,T((i=[]).concat.apply(i,n.map((function(n){return e[n]}))))]):[2,void 0];case 1:return o=t.sent(),r&&function(e,n){for(var t="DOM blockers debug:\n```",r=0,o=Object.keys(e);r<o.length;r++){var a=o[r];t+="\n".concat(a,":");for(var i=0,c=e[a];i<c.length;i++){var u=c[i];t+="\n ".concat(n[u]?"🚫":"➡️"," ").concat(u)}}console.log("".concat(t,"\n```"))}(e,o),(a=n.filter((function(n){var t=e[n];return g(t.map((function(e){return o[e]})))>.6*t.length}))).sort(),[2,a]}var c}))}))},fontPreferences:function(){return function(e,n){void 0===n&&(n=4e3);return X((function(t,o){var a=o.document,i=a.body,c=i.style;c.width="".concat(n,"px"),c.webkitTextSizeAdjust=c.textSizeAdjust="none",S()?i.style.zoom="".concat(1/o.devicePixelRatio):x()&&(i.style.zoom="reset");var u=a.createElement("div");return u.textContent=r([],Array(n/20<<0),!0).map((function(){return"word"})).join(" "),i.appendChild(u),e(a,i)}),'<!doctype html><html><head><meta name="viewport" content="width=device-width, initial-scale=1">')}((function(e,n){for(var t={},r={},o=0,a=Object.keys(ee);o<a.length;o++){var i=a[o],c=ee[i],u=c[0],l=void 0===u?{}:u,s=c[1],d=void 0===s?"mmMwWLliI0fiflO&1":s,m=e.createElement("span");m.textContent=d,m.style.whiteSpace="nowrap";for(var f=0,v=Object.keys(l);f<v.length;f++){var h=v[f],p=l[h];void 0!==p&&(m.style[h]=p)}t[i]=m,n.appendChild(e.createElement("br")),n.appendChild(m)}for(var b=0,y=Object.keys(ee);b<y.length;b++){r[i=y[b]]=t[i].getBoundingClientRect().width}return r}))},audio:function(){var e=window,n=e.OfflineAudioContext||e.webkitOfflineAudioContext;if(!n)return-2;if(x()&&!F()&&!function(){var e=window;return g(["DOMRectList"in e,"RTCPeerConnectionIceEvent"in e,"SVGGeometryElement"in e,"ontransitioncancel"in e])>=3}())return-1;var t=new n(1,5e3,44100),r=t.createOscillator();r.type="triangle",r.frequency.value=1e4;var o=t.createDynamicsCompressor();o.threshold.value=-50,o.knee.value=40,o.ratio.value=12,o.attack.value=0,o.release.value=.25,r.connect(o),o.connect(t.destination),r.start(0);var i=function(e){var n=3,t=500,r=500,o=5e3,i=function(){};return[new Promise((function(c,l){var s=!1,d=0,m=0;e.oncomplete=function(e){return c(e.renderedBuffer)};var f=function(){setTimeout((function(){return l(R("timeout"))}),Math.min(r,m+o-Date.now()))},v=function(){try{var r=e.startRendering();switch(a(r)&&u(r),e.state){case"running":m=Date.now(),s&&f();break;case"suspended":document.hidden||d++,s&&d>=n?l(R("suspended")):setTimeout(v,t)}}catch(o){l(o)}};v(),i=function(){s||(s=!0,m>0&&f())}})),i]}(t),c=i[0],l=i[1],s=c.then((function(e){return function(e){for(var n=0,t=0;t<e.length;++t)n+=Math.abs(e[t]);return n}(e.getChannelData(0).subarray(4500))}),(function(e){if("timeout"===e.name||"suspended"===e.name)return-3;throw e}));return u(s),function(){return l(),s}},screenFrame:function(){var e=this,r=z();return function(){return n(e,void 0,void 0,(function(){var e,n;return t(this,(function(t){switch(t.label){case 0:return[4,r()];case 1:return e=t.sent(),[2,[(n=function(e){return null===e?null:w(e,10)})(e[0]),n(e[1]),n(e[2]),n(e[3])]]}}))}))}},osCpu:function(){return navigator.oscpu},languages:function(){var e,n=navigator,t=[],r=n.language||n.userLanguage||n.browserLanguage||n.systemLanguage;if(void 0!==r&&t.push([r]),Array.isArray(n.languages))S()&&g([!("MediaSettingsRange"in(e=window)),"RTCEncodedAudioFrame"in e,""+e.Intl=="[object Intl]",""+e.Reflect=="[object Reflect]"])>=3||t.push(n.languages);else if("string"==typeof n.languages){var o=n.languages;o&&t.push(o.split(","))}return t},colorDepth:function(){return window.screen.colorDepth},deviceMemory:function(){return y(b(navigator.deviceMemory),void 0)},screenResolution:function(){var e=screen,n=function(e){return y(p(e),null)},t=[n(e.width),n(e.height)];return t.sort().reverse(),t},hardwareConcurrency:function(){return y(p(navigator.hardwareConcurrency),void 0)},timezone:function(){var e,n=null===(e=window.Intl)||void 0===e?void 0:e.DateTimeFormat;if(n){var t=(new n).resolvedOptions().timeZone;if(t)return t}var r,o=(r=(new Date).getFullYear(),-Math.max(b(new Date(r,0,1).getTimezoneOffset()),b(new Date(r,6,1).getTimezoneOffset())));return"UTC".concat(o>=0?"+":"").concat(Math.abs(o))},sessionStorage:function(){try{return!!window.sessionStorage}catch(e){return!0}},localStorage:function(){try{return!!window.localStorage}catch(e){return!0}},indexedDB:function(){if(!W()&&!C())try{return!!window.indexedDB}catch(e){return!0}},openDatabase:function(){return!!window.openDatabase},cpuClass:function(){return navigator.cpuClass},platform:function(){var e=navigator.platform;return"MacIntel"===e&&x()&&!F()?function(){if("iPad"===navigator.platform)return!0;var e=screen,n=e.width/e.height;return g(["MediaSource"in window,!!Element.prototype.webkitRequestFullscreen,n>.65&&n<1.53])>=2}()?"iPad":"iPhone":e},plugins:function(){var e=navigator.plugins;if(e){for(var n=[],t=0;t<e.length;++t){var r=e[t];if(r){for(var o=[],a=0;a<r.length;++a){var i=r[a];o.push({type:i.type,suffixes:i.suffixes})}n.push({name:r.name,description:r.description,mimeTypes:o})}}return n}},canvas:function(){var e,n,t=!1,r=function(){var e=document.createElement("canvas");return e.width=1,e.height=1,[e,e.getContext("2d")]}(),o=r[0],a=r[1];if(function(e,n){return!(!n||!e.toDataURL)}(o,a)){t=function(e){return e.rect(0,0,10,10),e.rect(2,2,6,6),!e.isPointInPath(5,5,"evenodd")}(a),function(e,n){e.width=240,e.height=60,n.textBaseline="alphabetic",n.fillStyle="#f60",n.fillRect(100,1,62,20),n.fillStyle="#069",n.font='11pt "Times New Roman"';var t="Cwm fjordbank gly ".concat(String.fromCharCode(55357,56835));n.fillText(t,2,15),n.fillStyle="rgba(102, 204, 0, 0.2)",n.font="18pt Arial",n.fillText(t,4,45)}(o,a);var i=H(o);i!==H(o)?e=n="unstable":(n=i,function(e,n){e.width=122,e.height=110,n.globalCompositeOperation="multiply";for(var t=0,r=[["#f2f",40,40],["#2ff",80,40],["#ff2",60,80]];t<r.length;t++){var o=r[t],a=o[0],i=o[1],c=o[2];n.fillStyle=a,n.beginPath(),n.arc(i,c,40,0,2*Math.PI,!0),n.closePath(),n.fill()}n.fillStyle="#f9c",n.arc(60,60,60,0,2*Math.PI,!0),n.arc(60,60,20,0,2*Math.PI,!0),n.fill("evenodd")}(o,a),e=H(o))}else e=n="";return{winding:t,geometry:e,text:n}},touchSupport:function(){var e,n=navigator,t=0;void 0!==n.maxTouchPoints?t=p(n.maxTouchPoints):void 0!==n.msMaxTouchPoints&&(t=n.msMaxTouchPoints);try{document.createEvent("TouchEvent"),e=!0}catch(r){e=!1}return{maxTouchPoints:t,touchEvent:e,touchStart:"ontouchstart"in window}},vendor:function(){return navigator.vendor||""},vendorFlavors:function(){for(var e=[],n=0,t=["chrome","safari","__crWeb","__gCrWeb","yandex","__yb","__ybro","__firefox__","__edgeTrackingPreventionStatistics","webkit","oprt","samsungAr","ucweb","UCShellJava","puffinDevice"];n<t.length;n++){var r=t[n],o=window[r];o&&"object"==typeof o&&e.push(r)}return e.sort()},cookiesEnabled:function(){var e=document;try{e.cookie="cookietest=1; SameSite=Strict;";var n=-1!==e.cookie.indexOf("cookietest=");return e.cookie="cookietest=1; SameSite=Strict; expires=Thu, 01-Jan-1970 00:00:01 GMT",n}catch(t){return!1}},colorGamut:function(){for(var e=0,n=["rec2020","p3","srgb"];e<n.length;e++){var t=n[e];if(matchMedia("(color-gamut: ".concat(t,")")).matches)return t}},invertedColors:function(){return!!_("inverted")||!_("none")&&void 0},forcedColors:function(){return!!O("active")||!O("none")&&void 0},monochrome:function(){if(matchMedia("(min-monochrome: 0)").matches){for(var e=0;e<=100;++e)if(matchMedia("(max-monochrome: ".concat(e,")")).matches)return e;throw new Error("Too high value")}},contrast:function(){return U("no-preference")?0:U("high")||U("more")?1:U("low")||U("less")?-1:U("forced")?10:void 0},reducedMotion:function(){return!!Q("reduce")||!Q("no-preference")&&void 0},hdr:function(){return!!K("high")||!K("standard")&&void 0},math:function(){var e,n=q.acos||$,t=q.acosh||$,r=q.asin||$,o=q.asinh||$,a=q.atanh||$,i=q.atan||$,c=q.sin||$,u=q.sinh||$,l=q.cos||$,s=q.cosh||$,d=q.tan||$,m=q.tanh||$,f=q.exp||$,v=q.expm1||$,h=q.log1p||$;return{acos:n(.12312423423423424),acosh:t(1e308),acoshPf:(e=1e154,q.log(e+q.sqrt(e*e-1))),asin:r(.12312423423423424),asinh:o(1),asinhPf:function(e){return q.log(e+q.sqrt(e*e+1))}(1),atanh:a(.5),atanhPf:function(e){return q.log((1+e)/(1-e))/2}(.5),atan:i(.5),sin:c(-1e300),sinh:u(1),sinhPf:function(e){return q.exp(e)-1/q.exp(e)/2}(1),cos:l(10.000000000123),cosh:s(1),coshPf:function(e){return(q.exp(e)+1/q.exp(e))/2}(1),tan:d(-1e300),tanh:m(1),tanhPf:function(e){return(q.exp(2*e)-1)/(q.exp(2*e)+1)}(1),exp:f(1),expm1:v(1),expm1Pf:function(e){return q.exp(e)-1}(1),log1p:h(10),log1pPf:function(e){return q.log(1+e)}(10),powPI:function(e){return q.pow(q.PI,e)}(-100)}},videoCard:function(){var e,n=document.createElement("canvas"),t=null!==(e=n.getContext("webgl"))&&void 0!==e?e:n.getContext("experimental-webgl");if(t&&"getExtension"in t){var r=t.getExtension("WEBGL_debug_renderer_info");if(r)return{vendor:(t.getParameter(r.UNMASKED_VENDOR_WEBGL)||"").toString(),renderer:(t.getParameter(r.UNMASKED_RENDERER_WEBGL)||"").toString()}}},pdfViewerEnabled:function(){return navigator.pdfViewerEnabled},architecture:function(){var e=new Float32Array(1),n=new Uint8Array(e.buffer);return e[0]=1/0,e[0]=e[0]-e[0],n[3]}};function te(e){var n=function(e){if(G())return.4;if(x())return F()?.5:.3;var n=e.platform.value||"";if(/^Win/.test(n))return.6;if(/^Mac/.test(n))return.5;return.7}(e),t=function(e){return w(.99+.01*e,1e-4)}(n);return{score:n,comment:"$ if upgrade to Pro: https://fpjs.dev/pro".replace(/\$/g,"".concat(t))}}function re(n){return JSON.stringify(n,(function(n,t){return t instanceof Error?e({name:(r=t).name,message:r.message,stack:null===(o=r.stack)||void 0===o?void 0:o.split("\n")},r):t;var r,o}),2)}function oe(e){return h(function(e){for(var n="",t=0,r=Object.keys(e).sort();t<r.length;t++){var o=r[t],a=e[o],i=a.error?"error":JSON.stringify(a.value);n+="".concat(n?"|":"").concat(o.replace(/([:|\\])/g,"\\$1"),":").concat(i)}return n}(e))}function ae(e){return void 0===e&&(e=50),function(e,n){void 0===n&&(n=1/0);var t=window.requestIdleCallback;return t?new Promise((function(e){return t.call(window,(function(){return e()}),{timeout:n})})):o(Math.min(e,n))}(e,2*e)}function ie(e,r){var o=Date.now();return{get:function(a){return n(this,void 0,void 0,(function(){var n,i,c;return t(this,(function(t){switch(t.label){case 0:return n=Date.now(),[4,e()];case 1:return i=t.sent(),c=function(e){var n;return{get visitorId(){return void 0===n&&(n=oe(this.components)),n},set visitorId(e){n=e},confidence:te(e),components:e,version:"3.4.2"}}(i),(r||(null==a?void 0:a.debug))&&console.log("Copy the text below to get the debug data:\n\n```\nversion: ".concat(c.version,"\nuserAgent: ").concat(navigator.userAgent,"\ntimeBetweenLoadAndGet: ").concat(n-o,"\nvisitorId: ").concat(c.visitorId,"\ncomponents: ").concat(re(i),"\n```")),[2,c]}}))}))}}}function ce(e){var r=void 0===e?{}:e,o=r.delayFallback,a=r.debug;return r.monitoring,n(this,void 0,void 0,(function(){return t(this,(function(e){switch(e.label){case 0:return[4,ae(o)];case 1:return e.sent(),[2,ie(V(ne,{debug:a},[]),a)]}}))}))}var ue={load:ce,hashComponents:oe,componentsToDebugString:re},le=h;export{re as componentsToDebugString,ue as default,M as getFullscreenElement,z as getScreenFrame,oe as hashComponents,G as isAndroid,S as isChromium,F as isDesktopSafari,C as isEdgeHTML,Y as isGecko,W as isTrident,x as isWebKit,ce as load,V as loadSources,le as murmurX64Hash128,ae as prepareForSources,ne as sources,Z as transformSource,X as withIframe};
@@ -228,6 +228,7 @@ class FeaturesMetadataV2(BaseModel):
228
228
  data_source_link: Optional[str]
229
229
  data_source_links: Optional[List[str]]
230
230
  doc_link: Optional[str]
231
+ update_frequency: Optional[str]
231
232
 
232
233
 
233
234
  class HitRateMetrics(BaseModel):
@@ -230,7 +230,9 @@ features_info_name=Feature name
230
230
  features_info_shap=SHAP value
231
231
  features_info_hitrate=Coverage %
232
232
  features_info_type=Type
233
+ # Deprecated
233
234
  features_info_commercial_schema=Feature type
235
+ features_info_update_frequency=Updates
234
236
  features_info_value_preview=Value preview
235
237
 
236
238
  # Relevant data sources
@@ -55,8 +55,6 @@ class CVConfig:
55
55
  if self.cv_type == CVType.time_series:
56
56
  return TimeSeriesSplit(n_splits=self.n_folds), None
57
57
  elif self.cv_type == CVType.blocked_time_series:
58
- if X.shape[0] < 100 * self.n_folds:
59
- return TimeSeriesSplit(n_splits=self.n_folds), None
60
58
  return BlockedTimeSeriesSplit(n_splits=self.n_folds, test_size=self.test_size), None
61
59
  elif self.cv_type == CVType.group_k_fold and self.group_columns:
62
60
  groups = get_groups(X, self.group_columns)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: upgini
3
- Version: 1.1.249a2
3
+ Version: 1.1.250
4
4
  Summary: Intelligent data search & enrichment for Machine Learning
5
5
  Home-page: https://upgini.com/
6
6
  Author: Upgini Developers
@@ -7,6 +7,7 @@ src/upgini/ads.py
7
7
  src/upgini/dataset.py
8
8
  src/upgini/errors.py
9
9
  src/upgini/features_enricher.py
10
+ src/upgini/fingerprint.js
10
11
  src/upgini/http.py
11
12
  src/upgini/metadata.py
12
13
  src/upgini/metrics.py
@@ -98,7 +98,7 @@ def run_search(
98
98
  columns={"Source": included_in_data_listings_header, "Feature name": field_column_header}
99
99
  )
100
100
  relevant_fields = relevant_fields.query("Provider != ''")
101
- relevant_fields = relevant_fields.drop(columns=["Coverage %", "Feature type"])
101
+ relevant_fields = relevant_fields.drop(columns=["Coverage %", "Feature type"], errors="ignore")
102
102
 
103
103
  raw_relevant_fields = relevant_fields.copy()
104
104
 
@@ -294,6 +294,7 @@ def test_widget(requests_mock: Mocker):
294
294
  data_source="Calendar data",
295
295
  data_source_link="https://upgini.com/#data_sources",
296
296
  doc_link="https://docs.upgini.com/public/calendar/calendar#f_events_date_month_sin4_81a273ac",
297
+ update_frequency="Daily",
297
298
  ),
298
299
  FeaturesMetadataV2(
299
300
  name="f_ip_company_name_emb145_e56eb2a3",
@@ -306,6 +307,7 @@ def test_widget(requests_mock: Mocker):
306
307
  data_provider_link="https://ipinfo.io",
307
308
  data_source="Company IP Address Data",
308
309
  data_source_link="https://app.snowflake.com/marketplace/listing/GZSTZ3VDMFU/?referer=upgini",
310
+ update_frequency="Monthly",
309
311
  ),
310
312
  FeaturesMetadataV2(
311
313
  name="f_ip_company_name_emb54_805ee5b8",
@@ -318,6 +320,7 @@ def test_widget(requests_mock: Mocker):
318
320
  data_provider_link="https://ipinfo.io",
319
321
  data_source="Company IP Address Data",
320
322
  data_source_link="https://app.snowflake.com/marketplace/listing/GZSTZ3VDMFU/?referer=upgini",
323
+ update_frequency="Monthly",
321
324
  ),
322
325
  FeaturesMetadataV2(
323
326
  name="f_ip_operator_5d5fc3f3",
@@ -330,6 +333,7 @@ def test_widget(requests_mock: Mocker):
330
333
  data_provider_link="https://ipinfo.io",
331
334
  data_source="IP Address Data for Mobile Carrier Detection",
332
335
  data_source_link="https://app.snowflake.com/marketplace/listing/GZSTZ3VDMF6/?referer=upgini",
336
+ update_frequency="Monthly",
333
337
  ),
334
338
  ],
335
339
  hit_rate_metrics=HitRateMetrics(
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes