SuperModelingFactory 0.6.8__tar.gz → 0.6.9__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 (116) hide show
  1. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Pipeline/credit_model.py +11 -1
  2. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/WOE/WOE_Monotone_Binner.py +84 -0
  3. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/__init__.py +1 -1
  4. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/PKG-INFO +2 -2
  5. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/README.md +1 -1
  6. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/SuperModelingFactory.egg-info/PKG-INFO +2 -2
  7. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/pyproject.toml +1 -1
  8. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/setup.py +1 -1
  9. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/ExcelMaster/ExcelFormatTool.py +0 -0
  10. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/ExcelMaster/ExcelMaster.py +0 -0
  11. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/ExcelMaster/Template.py +0 -0
  12. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/ExcelMaster/Utility.py +0 -0
  13. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/ExcelMaster/__init__.py +0 -0
  14. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/LICENSE +0 -0
  15. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/MANIFEST.in +0 -0
  16. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Core/Binning_Tool.py +0 -0
  17. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Core/Binning_Tool.pyi +0 -0
  18. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Core/Check_DuckDB_Compatibility.py +0 -0
  19. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Core/Json_Data_Converter.py +0 -0
  20. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Core/Model_Registry_Tool.py +0 -0
  21. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Core/ODPS_Tool.py +0 -0
  22. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Core/Parallel_Engine.py +0 -0
  23. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Core/Parallel_ODPS_Manager.py +0 -0
  24. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Core/Proc_Compare.py +0 -0
  25. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Core/Slope_Tool.py +0 -0
  26. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Core/Slope_Tool.pyi +0 -0
  27. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Core/XOR_Encryptor.py +0 -0
  28. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Core/XOR_Encryptor.pyi +0 -0
  29. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Core/__init__.py +0 -0
  30. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Core/kDataFrame.py +0 -0
  31. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Core/kDataFrame.pyi +0 -0
  32. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Core/sample_weight_utils.py +0 -0
  33. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Core/utils.py +0 -0
  34. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Eval/Evaluation_Tool.py +0 -0
  35. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Eval/Evaluation_Tool.pyi +0 -0
  36. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Eval/Model_Eval_Tool.py +0 -0
  37. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Eval/Model_Eval_Tool.pyi +0 -0
  38. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Eval/__init__.py +0 -0
  39. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Eval/evaluate_model.py +0 -0
  40. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Eval/evaluate_model.pyi +0 -0
  41. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Eval/weighted_eval_utils.py +0 -0
  42. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Explainability/Coalition_Structure.py +0 -0
  43. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Explainability/Model_Explainer.py +0 -0
  44. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Explainability/__init__.py +0 -0
  45. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Feature/Distribution_Tool.py +0 -0
  46. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Feature/Distribution_Tool.pyi +0 -0
  47. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Feature/Feature_Insights.py +0 -0
  48. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Feature/Feature_Insights.pyi +0 -0
  49. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Feature/Feature_Screen.py +0 -0
  50. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Feature/ODPS_Distribution_Tool.py +0 -0
  51. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Feature/ODPS_Distribution_Tool.pyi +0 -0
  52. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Feature/PSI_Tool.py +0 -0
  53. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Feature/PSI_Tool.pyi +0 -0
  54. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Feature/Screen_Gates.py +0 -0
  55. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Feature/WOE_Engine_Feature_Patch.py +0 -0
  56. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Feature/Weighted_Screen.py +0 -0
  57. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Feature/__init__.py +0 -0
  58. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Model/Backward_Tool.py +0 -0
  59. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Model/Backward_Tool.pyi +0 -0
  60. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Model/GBM_Search_Tool.py +0 -0
  61. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Model/GBM_Tool.py +0 -0
  62. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Model/GBM_Tool.pyi +0 -0
  63. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Model/LRM_Tool.py +0 -0
  64. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Model/LRM_Tool.pyi +0 -0
  65. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Model/__init__.py +0 -0
  66. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Pipeline/__init__.py +0 -0
  67. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Pipeline/_common.py +0 -0
  68. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Pipeline/feature_validation.py +0 -0
  69. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Pipeline/field_meta.py +0 -0
  70. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Pipeline/mock_sample.py +0 -0
  71. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Pipeline/orchestrator.py +0 -0
  72. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Pipeline/reject_inference.py +0 -0
  73. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Pipeline/sample_analysis.py +0 -0
  74. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Pipeline/score_comparison.py +0 -0
  75. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Pipeline/score_consistency_uat.py +0 -0
  76. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Pipeline/screening_artifact.py +0 -0
  77. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Sample/Distribution_Adaptation.py +0 -0
  78. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Sample/Distribution_Adaptation.pyi +0 -0
  79. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Sample/Reject_Infer.py +0 -0
  80. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Sample/Reject_Infer.pyi +0 -0
  81. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Sample/Sample_Split.py +0 -0
  82. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Sample/Sample_Split.pyi +0 -0
  83. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/Sample/__init__.py +0 -0
  84. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/UAT/UAT_Consistency_Checker.py +0 -0
  85. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/UAT/__init__.py +0 -0
  86. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/WOE/WOE_Adapter.py +0 -0
  87. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/WOE/WOE_Adapter.pyi +0 -0
  88. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/WOE/WOE_Master.py +0 -0
  89. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/WOE/WOE_Master.pyi +0 -0
  90. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/WOE/WOE_Monotone_Binner.pyi +0 -0
  91. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/WOE/WOE_Plot_Tool.py +0 -0
  92. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/WOE/WOE_Plot_Tool.pyi +0 -0
  93. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/WOE/WOE_Report_Builder.py +0 -0
  94. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/WOE/WOE_Report_Builder.pyi +0 -0
  95. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/WOE/WOE_Tool.py +0 -0
  96. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/WOE/WOE_Tool.pyi +0 -0
  97. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/WOE/__init__.py +0 -0
  98. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/WOE/plot_woe_tool.py +0 -0
  99. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/WOE/plot_woe_tool.pyi +0 -0
  100. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/_utils/__init__.py +0 -0
  101. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/_utils/nan_guard.py +0 -0
  102. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/_utils/robust.py +0 -0
  103. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/_utils/sentinels.py +0 -0
  104. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/ref_font/KaiTi.ttf +0 -0
  105. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/ref_font/WeiRuanYaHei.ttf +0 -0
  106. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/ref_font/__init__.py +0 -0
  107. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Modeling_Tool/ref_font/simsun.ttc +0 -0
  108. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Report/Report_Tool.py +0 -0
  109. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/Report/__init__.py +0 -0
  110. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/SuperModelingFactory.egg-info/SOURCES.txt +0 -0
  111. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/SuperModelingFactory.egg-info/dependency_links.txt +0 -0
  112. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/SuperModelingFactory.egg-info/not-zip-safe +0 -0
  113. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/SuperModelingFactory.egg-info/requires.txt +0 -0
  114. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/SuperModelingFactory.egg-info/top_level.txt +0 -0
  115. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/requirements.txt +0 -0
  116. {supermodelingfactory-0.6.8 → supermodelingfactory-0.6.9}/setup.cfg +0 -0
@@ -892,8 +892,18 @@ class CreditModelPipeline:
892
892
  },
893
893
  cfg.monotone_woe_params,
894
894
  )
895
+ # fit()-only kwargs must not reach MonotoneWOEBinner.__init__ —
896
+ # n_jobs / chi2_p / chi2_init_size in monotone_woe_params used to
897
+ # raise TypeError on this self-fit path (the screening-side
898
+ # fit_screening_woe_engine already splits init vs fit keys).
899
+ fit_kwargs = {
900
+ key: params.pop(key)
901
+ for key in ("chi2_binning", "chi2_p", "chi2_init_size", "n_jobs")
902
+ if key in params
903
+ }
904
+ fit_kwargs["chi2_binning"] = bool(fit_kwargs.get("chi2_binning", False))
895
905
  binner = MonotoneWOEBinner(**params)
896
- binner.fit(fit_ins, chi2_binning=bool(cfg.monotone_woe_params.get("chi2_binning", False)))
906
+ binner.fit(fit_ins, **fit_kwargs)
897
907
  if cfg.write_outputs and cfg.plot_outputs:
898
908
  binner.plot_woe_graph(graph_path=str(Path(cfg.output_dir) / "figs" / "mono_woe"))
899
909
  adapter = as_woe_engine(binner, woe_suffix=woe_suffix)
@@ -391,6 +391,11 @@ class MonotoneWOEBinner:
391
391
  # dict with unseen_values/affected_rows/affected_frac/total_rows.
392
392
  # Reset at the start of every apply_woe call.
393
393
  self._unseen_category_stats: Dict[str, dict] = {}
394
+ # G18: per-feature categorical transform coverage from the most recent
395
+ # apply_woe call — transform missing rate vs fit-time missing rate,
396
+ # exact / str()-fallback match counts, unmatched (missing_woe-filled)
397
+ # rows. Purely observational; reset at every apply_woe call.
398
+ self._categorical_transform_stats: Dict[str, dict] = {}
394
399
  # G08: populated when small_bin_policy is active; {feat: {bin_label,
395
400
  # bad, good, thresholds, action}}.
396
401
  self._small_bin_stats: Dict[str, dict] = {}
@@ -2522,6 +2527,17 @@ class MonotoneWOEBinner:
2522
2527
  ``{"unseen_values": set, "affected_rows": int,
2523
2528
  "affected_frac": float, "total_rows": int}``. Reset at the
2524
2529
  start of every ``apply_woe`` call.
2530
+ _categorical_transform_stats : Dict[str, dict]
2531
+ G18: per-categorical-feature transform coverage from the most
2532
+ recent ``apply_woe`` call: ``{"total_rows", "missing_rows",
2533
+ "missing_rate", "fit_missing_rate", "exact_match_rows",
2534
+ "fallback_match_rows", "unmatched_rows"}``. Purely observational
2535
+ (mapped WOE values are unchanged). Two RuntimeWarnings fire
2536
+ unless ``unseen_category_policy="silent"``: rows matched only
2537
+ via the ``str()`` fallback (fit/transform dtype drift), and a
2538
+ transform missing rate ≥ 50% that exceeds the fit-time missing
2539
+ rate by ≥ 30pp (upstream column likely broken/renamed/re-typed).
2540
+ Reset at the start of every ``apply_woe`` call.
2525
2541
 
2526
2542
  Returns
2527
2543
  -------
@@ -2551,6 +2567,7 @@ class MonotoneWOEBinner:
2551
2567
  woe_outputs: Dict[str, np.ndarray] = {}
2552
2568
  # Reset per-call so callers can inspect stats from the *latest* run only.
2553
2569
  self._unseen_category_stats = {}
2570
+ self._categorical_transform_stats = {}
2554
2571
 
2555
2572
  selected_features = (
2556
2573
  list(self._results)
@@ -2669,6 +2686,7 @@ class MonotoneWOEBinner:
2669
2686
  mapped = pd.Series(np.nan, index=series.index, dtype=float)
2670
2687
 
2671
2688
  fallback_mask = mapped.isna() & ~missing_mask
2689
+ exact_arr = mapped.notna().to_numpy() # G18: hits before the str() fallback
2672
2690
  if cat_woe_map_str and fallback_mask.any():
2673
2691
  mapped.loc[fallback_mask] = (
2674
2692
  series.loc[fallback_mask].astype(str).map(cat_woe_map_str)
@@ -2683,6 +2701,72 @@ class MonotoneWOEBinner:
2683
2701
  out[hit_arr] = mapped.to_numpy(dtype=float)[hit_arr]
2684
2702
 
2685
2703
  woe_outputs[woe_col] = out.astype(float, copy=False)
2704
+
2705
+ # ── G18: transform-coverage stats + loud guards ──
2706
+ # Observational only: the WOE values written above are
2707
+ # byte-identical to pre-G18 behavior. Two silent failure
2708
+ # modes get a voice here:
2709
+ # 1) rows matched only via the str() fallback — the
2710
+ # transform column's dtype differs from fit time;
2711
+ # 2) a mostly-missing transform column whose missing rate
2712
+ # exploded vs fit time — upstream column broken/renamed
2713
+ # (every such row silently gets the [Missing]-bin WOE).
2714
+ n_rows = int(len(series))
2715
+ n_missing = int(missing_arr.sum())
2716
+ n_hit = int(hit_arr.sum())
2717
+ n_exact = int((exact_arr & ~missing_arr).sum())
2718
+ n_fallback = n_hit - n_exact
2719
+ n_unmatched = n_rows - n_missing - n_hit
2720
+ fit_missing_rate = None
2721
+ fit_n_normal = float(wt["n"].sum()) if "n" in wt.columns and len(wt) else None
2722
+ if (
2723
+ fit_n_normal is not None
2724
+ and len(sv_table) > 0
2725
+ and "n" in sv_table.columns
2726
+ and "bin_label" in sv_table.columns
2727
+ ):
2728
+ fit_n_missing = float(sv_table.loc[sv_table["bin_label"] == "[Missing]", "n"].sum())
2729
+ denom = fit_n_normal + float(sv_table["n"].sum())
2730
+ if denom > 0:
2731
+ fit_missing_rate = fit_n_missing / denom
2732
+ elif fit_n_normal:
2733
+ fit_missing_rate = 0.0
2734
+ missing_rate = n_missing / max(n_rows, 1)
2735
+ self._categorical_transform_stats[feat] = {
2736
+ "total_rows": n_rows,
2737
+ "missing_rows": n_missing,
2738
+ "missing_rate": missing_rate,
2739
+ "fit_missing_rate": fit_missing_rate,
2740
+ "exact_match_rows": n_exact,
2741
+ "fallback_match_rows": n_fallback,
2742
+ "unmatched_rows": n_unmatched,
2743
+ }
2744
+ if unseen_category_policy != "silent":
2745
+ if n_fallback > 0:
2746
+ warnings.warn(
2747
+ f"apply_woe: feature {feat!r} matched {n_fallback} row(s) "
2748
+ f"only through the str() fallback — the transform column's "
2749
+ f"dtype likely differs from fit time (e.g. int codes vs "
2750
+ f"zero-padded strings). The mapping resolved, but the same "
2751
+ f"drift can silently mis-map when value renderings collide; "
2752
+ f"align the upstream column dtype with fit time.",
2753
+ RuntimeWarning,
2754
+ stacklevel=2,
2755
+ )
2756
+ if missing_rate >= 0.5 and (
2757
+ fit_missing_rate is None or missing_rate - fit_missing_rate >= 0.3
2758
+ ):
2759
+ fit_desc = "unknown" if fit_missing_rate is None else f"{fit_missing_rate:.1%}"
2760
+ warnings.warn(
2761
+ f"apply_woe: categorical feature {feat!r} is "
2762
+ f"{missing_rate:.1%} missing in the transform data vs "
2763
+ f"{fit_desc} at fit time — all those rows receive the "
2764
+ f"[Missing]-bin WOE. The upstream column is likely broken, "
2765
+ f"renamed or re-typed; the feature column is near-constant "
2766
+ f"after transform.",
2767
+ RuntimeWarning,
2768
+ stacklevel=2,
2769
+ )
2686
2770
  continue
2687
2771
 
2688
2772
 
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  __author__ = "Jingkai Sun"
4
- __version__ = "0.6.8"
4
+ __version__ = "0.6.9"
5
5
 
6
6
  from ._utils import SMF_MISSING_BIN
7
7
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: SuperModelingFactory
3
- Version: 0.6.8
3
+ Version: 0.6.9
4
4
  Summary: Credit risk modeling factory: WOE binning, scorecards, LightGBM, Excel reporting.
5
5
  Home-page: https://github.com/Kyle-J-Sun/SuperModelingFactory
6
6
  Author: Kyle Sun
@@ -265,7 +265,7 @@ em.close_workbook()
265
265
 
266
266
  ## 版本
267
267
 
268
- - **Version**: 0.6.8
268
+ - **Version**: 0.6.9
269
269
  - **Author**: Jingkai Sun
270
270
 
271
271
  ## 许可证
@@ -208,7 +208,7 @@ em.close_workbook()
208
208
 
209
209
  ## 版本
210
210
 
211
- - **Version**: 0.6.8
211
+ - **Version**: 0.6.9
212
212
  - **Author**: Jingkai Sun
213
213
 
214
214
  ## 许可证
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: SuperModelingFactory
3
- Version: 0.6.8
3
+ Version: 0.6.9
4
4
  Summary: Credit risk modeling factory: WOE binning, scorecards, LightGBM, Excel reporting.
5
5
  Home-page: https://github.com/Kyle-J-Sun/SuperModelingFactory
6
6
  Author: Kyle Sun
@@ -265,7 +265,7 @@ em.close_workbook()
265
265
 
266
266
  ## 版本
267
267
 
268
- - **Version**: 0.6.8
268
+ - **Version**: 0.6.9
269
269
  - **Author**: Jingkai Sun
270
270
 
271
271
  ## 许可证
@@ -12,7 +12,7 @@ build-backend = "setuptools.build_meta"
12
12
 
13
13
  [project]
14
14
  name = "SuperModelingFactory"
15
- version = "0.6.8"
15
+ version = "0.6.9"
16
16
  description = "Credit risk modeling factory: WOE binning, scorecards, LightGBM, Excel reporting."
17
17
  readme = "README.md"
18
18
  requires-python = ">=3.10"
@@ -15,7 +15,7 @@ def _read(path: str) -> str:
15
15
 
16
16
  setup(
17
17
  name="SuperModelingFactory",
18
- version=os.environ.get("SMF_VERSION", "0.6.8"),
18
+ version=os.environ.get("SMF_VERSION", "0.6.9"),
19
19
  description="Credit risk modeling factory: WOE binning, scorecards, LightGBM, Excel reporting.",
20
20
  long_description=_read("README.md"),
21
21
  long_description_content_type="text/markdown",