upgini 1.2.167a4220.dev11__tar.gz → 1.2.167a4220.dev12__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.
Files changed (94) hide show
  1. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/PKG-INFO +1 -1
  2. upgini-1.2.167a4220.dev12/src/upgini/__about__.py +1 -0
  3. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/report/assemble.py +11 -67
  4. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/report/html.py +22 -16
  5. upgini-1.2.167a4220.dev11/src/upgini/__about__.py +0 -1
  6. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/.gitignore +0 -0
  7. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/LICENSE +0 -0
  8. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/README.md +0 -0
  9. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/pyproject.toml +0 -0
  10. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/__init__.py +0 -0
  11. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/ads.py +0 -0
  12. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/ads_management/__init__.py +0 -0
  13. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/ads_management/ads_manager.py +0 -0
  14. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/__init__.py +0 -0
  15. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/all_operators.py +0 -0
  16. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/binary.py +0 -0
  17. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/date.py +0 -0
  18. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/feature.py +0 -0
  19. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/groupby.py +0 -0
  20. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/operand.py +0 -0
  21. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/operator.py +0 -0
  22. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/timeseries/__init__.py +0 -0
  23. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/timeseries/base.py +0 -0
  24. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/timeseries/cross.py +0 -0
  25. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/timeseries/delta.py +0 -0
  26. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/timeseries/lag.py +0 -0
  27. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/timeseries/numpy_kernels.py +0 -0
  28. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/timeseries/roll.py +0 -0
  29. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/timeseries/trend.py +0 -0
  30. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/timeseries/volatility.py +0 -0
  31. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/unary.py +0 -0
  32. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/utils.py +0 -0
  33. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/autofe/vector.py +0 -0
  34. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/data_source/__init__.py +0 -0
  35. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/data_source/data_source_publisher.py +0 -0
  36. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/dataset.py +0 -0
  37. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/errors.py +0 -0
  38. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/features_enricher.py +0 -0
  39. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/http.py +0 -0
  40. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/mdc/__init__.py +0 -0
  41. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/mdc/context.py +0 -0
  42. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/metadata.py +0 -0
  43. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/metrics.py +0 -0
  44. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/normalizer/__init__.py +0 -0
  45. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/normalizer/normalize_utils.py +0 -0
  46. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/report/__init__.py +0 -0
  47. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/report/data.py +0 -0
  48. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/report/stats.py +0 -0
  49. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/report/template.html +0 -0
  50. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/resource_bundle/__init__.py +0 -0
  51. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/resource_bundle/exceptions.py +0 -0
  52. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/resource_bundle/strings.properties +0 -0
  53. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/resource_bundle/strings_widget.properties +0 -0
  54. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/sampler/__init__.py +0 -0
  55. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/sampler/base.py +0 -0
  56. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/sampler/random_under_sampler.py +0 -0
  57. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/sampler/utils.py +0 -0
  58. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/search_task.py +0 -0
  59. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/spinner.py +0 -0
  60. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/Roboto-Regular.ttf +0 -0
  61. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/__init__.py +0 -0
  62. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/base_search_key_detector.py +0 -0
  63. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/blocked_time_series.py +0 -0
  64. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/config.py +0 -0
  65. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/country_utils.py +0 -0
  66. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/cpu_utils.py +0 -0
  67. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/custom_loss_utils.py +0 -0
  68. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/cv_utils.py +0 -0
  69. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/datetime_utils.py +0 -0
  70. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/deduplicate_utils.py +0 -0
  71. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/display_utils.py +0 -0
  72. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/email_utils.py +0 -0
  73. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/fallback_progress_bar.py +0 -0
  74. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/feature_info.py +0 -0
  75. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/features_validator.py +0 -0
  76. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/format.py +0 -0
  77. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/hash_utils.py +0 -0
  78. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/ip_utils.py +0 -0
  79. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/mstats.py +0 -0
  80. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/one_hot_encoder.py +0 -0
  81. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/phone_utils.py +0 -0
  82. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/postal_code_utils.py +0 -0
  83. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/progress_bar.py +0 -0
  84. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/psi.py +0 -0
  85. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/pyarrow_utils.py +0 -0
  86. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/sample_utils.py +0 -0
  87. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/search_key_derivations.py +0 -0
  88. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/sklearn_ext.py +0 -0
  89. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/sort.py +0 -0
  90. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/target_utils.py +0 -0
  91. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/track_info.py +0 -0
  92. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/ts_utils.py +0 -0
  93. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/utils/warning_counter.py +0 -0
  94. {upgini-1.2.167a4220.dev11 → upgini-1.2.167a4220.dev12}/src/upgini/version_validator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: upgini
3
- Version: 1.2.167a4220.dev11
3
+ Version: 1.2.167a4220.dev12
4
4
  Summary: Intelligent data search & enrichment for Machine Learning
5
5
  Project-URL: Bug Reports, https://github.com/upgini/upgini/issues
6
6
  Project-URL: Homepage, https://upgini.com/
@@ -0,0 +1 @@
1
+ __version__ = "1.2.167.a4220.dev12"
@@ -22,7 +22,7 @@ from upgini.report.data import (
22
22
  )
23
23
  from upgini.report.stats import PSI_CRITICAL, PSI_WARNING, compute_report_charts
24
24
  from upgini.resource_bundle import ResourceBundle
25
- from upgini.utils.feature_info import FeatureInfo
25
+ from upgini.utils.feature_info import CLIENT_SOURCE, GENERATED_SOURCE, FeatureInfo
26
26
 
27
27
  UPGINI_REPORT_BRANDING_URL = "UPGINI_REPORT_BRANDING_URL"
28
28
  _STABILITY_PSI = 0.2
@@ -129,7 +129,6 @@ def build_search_results(
129
129
  ]
130
130
  sources = _source_rows(found_rows)
131
131
  summary = _overview_summary(
132
- features_meta=features_meta,
133
132
  model_rows=model_rows,
134
133
  found_rows=found_rows,
135
134
  sources=sources,
@@ -304,7 +303,6 @@ def _has_nonzero_shap_value(shap: Optional[float]) -> bool:
304
303
 
305
304
  def _overview_summary(
306
305
  *,
307
- features_meta: list[FeaturesMetadataV2],
308
306
  model_rows: list[FeatureRow],
309
307
  found_rows: list[FeatureRow],
310
308
  sources: list[SourceRow],
@@ -314,21 +312,16 @@ def _overview_summary(
314
312
  joined_ads_count: Optional[int],
315
313
  ) -> SearchResultsSummary:
316
314
  top_level = _unique_fold_model_inputs(generated_features)
317
- features_by_name = {meta.name: meta for meta in features_meta}
318
315
  autofe_by_name = _autofe_generated_by_name(generated_features, is_ensemble)
319
- columns_by_name = _base_columns_by_name(generated_features)
320
316
  ads_ids = _contributed_ads_ids(generated_features, autofe_by_name)
321
317
  if top_level:
322
318
  counts = {"external": 0, "original": 0, "autofe": 0}
323
- psis: list[Optional[float]] = []
324
- for node in top_level:
325
- kind = _top_level_kind(node, features_by_name, columns_by_name, autofe_by_name, is_ensemble)
326
- counts[kind] += 1
327
- meta = _feature_meta_for_node(node, features_by_name, columns_by_name)
328
- psis.append(None if meta is None else meta.psi_value)
329
- model_features = len(top_level)
319
+ for row in model_rows:
320
+ counts[_model_row_kind(row)] += 1
321
+ model_features = len(model_rows)
330
322
  external, original, autofe = counts["external"], counts["original"], counts["autofe"]
331
323
  contributed = len(ads_ids or set())
324
+ psis = [row.psi for row in model_rows]
332
325
  else:
333
326
  model_features = len(model_rows) or None
334
327
  external = original = autofe = None
@@ -383,38 +376,6 @@ def _top_level_key(node: Column | Feature) -> str:
383
376
  return f"fe:{node.to_formula()}"
384
377
 
385
378
 
386
- def _base_columns_by_name(generated_features: list[GeneratedFeatureMetadata]) -> dict[str, BaseColumnMetadata]:
387
- by_name: dict[str, BaseColumnMetadata] = {}
388
- for meta in generated_features:
389
- for column in meta.base_columns:
390
- if column.hashed_name:
391
- by_name.setdefault(column.hashed_name, column)
392
- if column.original_name:
393
- by_name.setdefault(column.original_name, column)
394
- return by_name
395
-
396
-
397
- def _column_names(node: Column, columns_by_name: dict[str, BaseColumnMetadata]) -> list[str]:
398
- names = [node.name]
399
- column = columns_by_name.get(node.name)
400
- if column is not None:
401
- names.extend([column.hashed_name, column.original_name])
402
- return [name for name in names if name]
403
-
404
-
405
- def _feature_meta_for_node(
406
- node: Column | Feature,
407
- features_by_name: dict[str, FeaturesMetadataV2],
408
- columns_by_name: dict[str, BaseColumnMetadata],
409
- ) -> Optional[FeaturesMetadataV2]:
410
- if not isinstance(node, Column):
411
- return None
412
- return next(
413
- (features_by_name[name] for name in _column_names(node, columns_by_name) if name in features_by_name),
414
- None,
415
- )
416
-
417
-
418
379
  def _autofe_generated_by_name(
419
380
  generated_features: list[GeneratedFeatureMetadata], is_ensemble: Callable[[str], bool]
420
381
  ) -> dict[str, GeneratedFeatureMetadata]:
@@ -452,30 +413,13 @@ def _generated_feature_names(meta: GeneratedFeatureMetadata) -> set[str]:
452
413
  return {feature.get_display_name(shorten=True, unhash=True, cache=False)}
453
414
 
454
415
 
455
- def _top_level_kind(
456
- node: Column | Feature,
457
- features_by_name: dict[str, FeaturesMetadataV2],
458
- columns_by_name: dict[str, BaseColumnMetadata],
459
- autofe_by_name: dict[str, GeneratedFeatureMetadata],
460
- is_ensemble: Callable[[str], bool],
461
- ) -> str:
462
- if isinstance(node, Feature):
463
- return "autofe"
464
- names = _column_names(node, columns_by_name)
465
- if any(name in autofe_by_name for name in names):
416
+ def _model_row_kind(row: FeatureRow) -> str:
417
+ source = (row.source or "").lower()
418
+ if source.startswith("autofe") or source == GENERATED_SOURCE.lower():
466
419
  return "autofe"
467
- meta = next((features_by_name[name] for name in names if name in features_by_name), None)
468
- if meta is not None and not is_ensemble(meta.name):
469
- if meta.source == "generated":
470
- return "autofe"
471
- if meta.source == "ads":
472
- return "external"
473
- if meta.source == "etalon":
474
- return "original"
475
- column = next((columns_by_name[name] for name in names if name in columns_by_name), None)
476
- if column is not None and column.ads_definition_id:
477
- return "external"
478
- return "original"
420
+ if source == CLIENT_SOURCE.lower():
421
+ return "original"
422
+ return "external"
479
423
 
480
424
 
481
425
  def _contributed_ads_ids(
@@ -41,7 +41,7 @@ def _report_payload(data: ReportData) -> dict:
41
41
  "features": _features_payload(data.features),
42
42
  "shap": {"topN": 5},
43
43
  "searchResults": {
44
- "relevantFeaturesCount": _dash(data.summary.relevant_features),
44
+ "relevantFeaturesCount": _dash(len(data.features) if data.features else data.summary.relevant_features),
45
45
  "dataSourcesCount": _dash(data.summary.data_sources),
46
46
  "autofeCount": _dash(len(data.autofe)),
47
47
  "sources": _sources_payload(data.sources),
@@ -170,21 +170,27 @@ def _used_in_model_caption(summary: SearchResultsSummary) -> str:
170
170
 
171
171
 
172
172
  def _features_payload(features: list[FeatureRow]) -> list[dict]:
173
- return [
174
- {
175
- "name": row.name,
176
- "provider": row.provider,
177
- "source": row.source,
178
- "shapClass": _shap_fill_class(row),
179
- "importance": abs(row.shap) if row.shap is not None else 0,
180
- "shap": row.shap,
181
- "coverage": row.coverage,
182
- "status": row.stability_status,
183
- "psi": row.psi,
184
- "drift": row.drift,
185
- }
186
- for row in features
187
- ]
173
+ rows = []
174
+ for row in features:
175
+ shap_class = _shap_fill_class(row)
176
+ provider = row.provider
177
+ if not provider and shap_class == "user":
178
+ provider = CLIENT_SOURCE
179
+ rows.append(
180
+ {
181
+ "name": row.name,
182
+ "provider": provider,
183
+ "source": row.source,
184
+ "shapClass": shap_class,
185
+ "importance": abs(row.shap) if row.shap is not None else 0,
186
+ "shap": row.shap,
187
+ "coverage": row.coverage,
188
+ "status": row.stability_status,
189
+ "psi": row.psi,
190
+ "drift": row.drift,
191
+ }
192
+ )
193
+ return rows
188
194
 
189
195
 
190
196
  def _shap_fill_class(row: FeatureRow) -> str:
@@ -1 +0,0 @@
1
- __version__ = "1.2.167.a4220.dev11"