churnkit 0.76.1a1__tar.gz → 0.76.1a2__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 (326) hide show
  1. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/PKG-INFO +1 -1
  2. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/00_start_here.ipynb +10 -5
  3. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/01_data_discovery.ipynb +6 -6
  4. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/01a_a_temporal_text_deep_dive.ipynb +52 -46
  5. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/01a_temporal_deep_dive.ipynb +68 -65
  6. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/01b_temporal_quality.ipynb +12 -27
  7. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/01c_temporal_patterns.ipynb +216 -221
  8. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/01d_event_aggregation.ipynb +88 -81
  9. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/02_column_deep_dive.ipynb +111 -108
  10. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/02a_text_columns_deep_dive.ipynb +44 -38
  11. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/03_quality_assessment.ipynb +89 -85
  12. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/04_relationship_analysis.ipynb +81 -80
  13. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/05_multi_dataset.ipynb +83 -89
  14. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/06_feature_opportunities.ipynb +102 -98
  15. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/07_modeling_readiness.ipynb +32 -31
  16. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/08_baseline_experiments.ipynb +33 -29
  17. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/09_business_alignment.ipynb +6 -5
  18. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/10_spec_generation.ipynb +67 -63
  19. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/11_scoring_validation.ipynb +38 -23
  20. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/exploration_notebooks/12_view_documentation.ipynb +3 -1
  21. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/pyproject.toml +3 -1
  22. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/__init__.py +1 -1
  23. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/auto_explorer/explorer.py +2 -2
  24. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/notebook_progress.py +4 -1
  25. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/compat/__init__.py +10 -0
  26. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/databricks_init.py +13 -0
  27. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/column_profiler.py +9 -2
  28. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/.gitignore +0 -0
  29. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/LICENSE +0 -0
  30. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/README.md +0 -0
  31. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/constraints/.gitkeep +0 -0
  32. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/.claude/settings.local.json +0 -0
  33. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/README.md +0 -0
  34. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/data/create_snapshot.py +0 -0
  35. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/data/generate_retail_dataset.py +0 -0
  36. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/data/generate_test_data.py +0 -0
  37. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/data/migrate_parquet_to_delta.py +0 -0
  38. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/data/migrate_to_temporal.py +0 -0
  39. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/databricks/build_wheel.sh +0 -0
  40. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/databricks/capture_runtime.py +0 -0
  41. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/databricks/dbr_init.sh +0 -0
  42. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/databricks/generate_constraints.py +0 -0
  43. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/databricks/notebook_setup.py +0 -0
  44. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/notebooks/clean_notebook_outputs.py +0 -0
  45. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/notebooks/export_tutorial_html.py +0 -0
  46. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/notebooks/init_project.py +0 -0
  47. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/notebooks/plotly_image_preprocessor.py +0 -0
  48. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/notebooks/run_exploration.py +0 -0
  49. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/notebooks/test_notebooks.py +0 -0
  50. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/release.sh +0 -0
  51. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/templates/tutorial_html/conf.json +0 -0
  52. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/templates/tutorial_html/index.html.j2 +0 -0
  53. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/scripts/update_notebook_paths.py +0 -0
  54. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/__init__.py +0 -0
  55. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/auto_explorer/__init__.py +0 -0
  56. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/auto_explorer/exploration_manager.py +0 -0
  57. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/auto_explorer/findings.py +0 -0
  58. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/auto_explorer/layered_recommendations.py +0 -0
  59. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/auto_explorer/recommendation_builder.py +0 -0
  60. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/auto_explorer/recommendations.py +0 -0
  61. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/business/__init__.py +0 -0
  62. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/business/ab_test_designer.py +0 -0
  63. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/business/fairness_analyzer.py +0 -0
  64. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/business/intervention_matcher.py +0 -0
  65. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/business/report_generator.py +0 -0
  66. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/business/risk_profile.py +0 -0
  67. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/business/roi_analyzer.py +0 -0
  68. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/diagnostics/__init__.py +0 -0
  69. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/diagnostics/calibration_analyzer.py +0 -0
  70. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/diagnostics/cv_analyzer.py +0 -0
  71. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/diagnostics/error_analyzer.py +0 -0
  72. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/diagnostics/leakage_detector.py +0 -0
  73. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/diagnostics/noise_tester.py +0 -0
  74. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/diagnostics/overfitting_analyzer.py +0 -0
  75. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/diagnostics/segment_analyzer.py +0 -0
  76. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/discovery/__init__.py +0 -0
  77. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/discovery/config_generator.py +0 -0
  78. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/discovery/discovery_flow.py +0 -0
  79. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/discovery/type_inferencer.py +0 -0
  80. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/interpretability/__init__.py +0 -0
  81. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/interpretability/cohort_analyzer.py +0 -0
  82. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/interpretability/counterfactual.py +0 -0
  83. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/interpretability/individual_explainer.py +0 -0
  84. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/interpretability/pdp_generator.py +0 -0
  85. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/interpretability/shap_explainer.py +0 -0
  86. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/jupyter_save_hook.py +0 -0
  87. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/notebook_html_exporter.py +0 -0
  88. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/plotly_preprocessor.py +0 -0
  89. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/recommendations/__init__.py +0 -0
  90. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/recommendations/base.py +0 -0
  91. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/recommendations/cleaning/__init__.py +0 -0
  92. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/recommendations/cleaning/consistency.py +0 -0
  93. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/recommendations/cleaning/deduplicate.py +0 -0
  94. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/recommendations/cleaning/impute.py +0 -0
  95. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/recommendations/cleaning/outlier.py +0 -0
  96. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/recommendations/datetime/__init__.py +0 -0
  97. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/recommendations/datetime/extract.py +0 -0
  98. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/recommendations/encoding/__init__.py +0 -0
  99. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/recommendations/encoding/categorical.py +0 -0
  100. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/recommendations/pipeline.py +0 -0
  101. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/recommendations/registry.py +0 -0
  102. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/recommendations/selection/__init__.py +0 -0
  103. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/recommendations/selection/drop_column.py +0 -0
  104. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/recommendations/transform/__init__.py +0 -0
  105. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/recommendations/transform/power.py +0 -0
  106. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/recommendations/transform/scale.py +0 -0
  107. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/visualization/__init__.py +0 -0
  108. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/visualization/chart_builder.py +0 -0
  109. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/visualization/console.py +0 -0
  110. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/visualization/display.py +0 -0
  111. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/analysis/visualization/number_formatter.py +0 -0
  112. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/artifacts/__init__.py +0 -0
  113. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/artifacts/fit_artifact_registry.py +0 -0
  114. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/cli.py +0 -0
  115. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/__init__.py +0 -0
  116. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/compat/detection.py +0 -0
  117. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/compat/ops.py +0 -0
  118. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/compat/pandas_backend.py +0 -0
  119. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/compat/spark_backend.py +0 -0
  120. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/components/__init__.py +0 -0
  121. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/components/base.py +0 -0
  122. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/components/components/__init__.py +0 -0
  123. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/components/components/deployer.py +0 -0
  124. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/components/components/explainer.py +0 -0
  125. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/components/components/feature_eng.py +0 -0
  126. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/components/components/ingester.py +0 -0
  127. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/components/components/profiler.py +0 -0
  128. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/components/components/trainer.py +0 -0
  129. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/components/components/transformer.py +0 -0
  130. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/components/components/validator.py +0 -0
  131. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/components/enums.py +0 -0
  132. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/components/orchestrator.py +0 -0
  133. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/components/registry.py +0 -0
  134. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/config/__init__.py +0 -0
  135. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/config/column_config.py +0 -0
  136. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/config/experiments.py +0 -0
  137. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/config/pipeline_config.py +0 -0
  138. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/config/source_config.py +0 -0
  139. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/utils/__init__.py +0 -0
  140. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/utils/leakage.py +0 -0
  141. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/utils/severity.py +0 -0
  142. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/core/utils/statistics.py +0 -0
  143. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/__init__.py +0 -0
  144. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/__init__.py +0 -0
  145. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/base.py +0 -0
  146. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/cell_builder.py +0 -0
  147. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/config.py +0 -0
  148. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/databricks_generator.py +0 -0
  149. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/local_generator.py +0 -0
  150. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/project_init.py +0 -0
  151. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/runner.py +0 -0
  152. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/script_generator.py +0 -0
  153. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/stages/__init__.py +0 -0
  154. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/stages/base_stage.py +0 -0
  155. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/stages/s01_ingestion.py +0 -0
  156. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/stages/s02_profiling.py +0 -0
  157. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/stages/s03_cleaning.py +0 -0
  158. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/stages/s04_transformation.py +0 -0
  159. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/stages/s05_feature_engineering.py +0 -0
  160. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/stages/s06_feature_selection.py +0 -0
  161. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/stages/s07_model_training.py +0 -0
  162. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/stages/s08_deployment.py +0 -0
  163. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/stages/s09_monitoring.py +0 -0
  164. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/stages/s10_batch_inference.py +0 -0
  165. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/notebook_generator/stages/s11_feature_store.py +0 -0
  166. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/orchestration/__init__.py +0 -0
  167. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/orchestration/code_generator.py +0 -0
  168. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/orchestration/context.py +0 -0
  169. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/orchestration/data_materializer.py +0 -0
  170. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/orchestration/databricks_exporter.py +0 -0
  171. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/orchestration/doc_generator.py +0 -0
  172. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/pipeline_generator/__init__.py +0 -0
  173. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/pipeline_generator/findings_parser.py +0 -0
  174. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/pipeline_generator/generator.py +0 -0
  175. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/pipeline_generator/models.py +0 -0
  176. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/pipeline_generator/renderer.py +0 -0
  177. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/spec_generator/__init__.py +0 -0
  178. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/spec_generator/databricks_generator.py +0 -0
  179. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/spec_generator/generic_generator.py +0 -0
  180. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/spec_generator/mlflow_pipeline_generator.py +0 -0
  181. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/generators/spec_generator/pipeline_spec.py +0 -0
  182. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/__init__.py +0 -0
  183. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/adapters/__init__.py +0 -0
  184. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/adapters/base.py +0 -0
  185. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/adapters/factory.py +0 -0
  186. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/adapters/feature_store/__init__.py +0 -0
  187. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/adapters/feature_store/base.py +0 -0
  188. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/adapters/feature_store/databricks.py +0 -0
  189. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/adapters/feature_store/feast_adapter.py +0 -0
  190. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/adapters/feature_store/local.py +0 -0
  191. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/adapters/mlflow/__init__.py +0 -0
  192. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/adapters/mlflow/base.py +0 -0
  193. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/adapters/mlflow/databricks.py +0 -0
  194. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/adapters/mlflow/experiment_tracker.py +0 -0
  195. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/adapters/mlflow/local.py +0 -0
  196. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/adapters/storage/__init__.py +0 -0
  197. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/adapters/storage/base.py +0 -0
  198. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/adapters/storage/databricks.py +0 -0
  199. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/adapters/storage/local.py +0 -0
  200. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/feature_store/__init__.py +0 -0
  201. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/feature_store/definitions.py +0 -0
  202. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/feature_store/manager.py +0 -0
  203. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/feature_store/registry.py +0 -0
  204. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/iteration/__init__.py +0 -0
  205. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/iteration/context.py +0 -0
  206. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/iteration/feedback_collector.py +0 -0
  207. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/iteration/orchestrator.py +0 -0
  208. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/iteration/recommendation_tracker.py +0 -0
  209. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/iteration/signals.py +0 -0
  210. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/llm_context/__init__.py +0 -0
  211. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/llm_context/context_builder.py +0 -0
  212. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/llm_context/prompts.py +0 -0
  213. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/streaming/__init__.py +0 -0
  214. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/streaming/batch_integration.py +0 -0
  215. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/streaming/early_warning_model.py +0 -0
  216. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/streaming/event_schema.py +0 -0
  217. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/streaming/online_store_writer.py +0 -0
  218. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/streaming/realtime_scorer.py +0 -0
  219. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/streaming/trigger_engine.py +0 -0
  220. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/integrations/streaming/window_aggregator.py +0 -0
  221. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/__init__.py +0 -0
  222. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/cleaning/__init__.py +0 -0
  223. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/cleaning/base.py +0 -0
  224. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/cleaning/missing_handler.py +0 -0
  225. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/cleaning/outlier_handler.py +0 -0
  226. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/deployment/__init__.py +0 -0
  227. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/deployment/batch_scorer.py +0 -0
  228. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/deployment/champion_challenger.py +0 -0
  229. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/deployment/model_registry.py +0 -0
  230. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/deployment/retraining_trigger.py +0 -0
  231. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/features/__init__.py +0 -0
  232. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/features/behavioral_features.py +0 -0
  233. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/features/customer_segmentation.py +0 -0
  234. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/features/feature_definitions.py +0 -0
  235. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/features/feature_engineer.py +0 -0
  236. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/features/feature_manifest.py +0 -0
  237. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/features/feature_selector.py +0 -0
  238. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/features/interaction_features.py +0 -0
  239. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/features/temporal_features.py +0 -0
  240. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/ingestion/__init__.py +0 -0
  241. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/ingestion/load_result.py +0 -0
  242. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/ingestion/loaders.py +0 -0
  243. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/ingestion/source_registry.py +0 -0
  244. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/modeling/__init__.py +0 -0
  245. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/modeling/baseline_trainer.py +0 -0
  246. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/modeling/cross_validator.py +0 -0
  247. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/modeling/data_splitter.py +0 -0
  248. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/modeling/feature_scaler.py +0 -0
  249. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/modeling/hyperparameter_tuner.py +0 -0
  250. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/modeling/imbalance_handler.py +0 -0
  251. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/modeling/mlflow_logger.py +0 -0
  252. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/modeling/model_comparator.py +0 -0
  253. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/modeling/model_evaluator.py +0 -0
  254. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/modeling/threshold_optimizer.py +0 -0
  255. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/monitoring/__init__.py +0 -0
  256. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/monitoring/alert_manager.py +0 -0
  257. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/monitoring/drift_detector.py +0 -0
  258. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/monitoring/performance_monitor.py +0 -0
  259. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/preprocessing/__init__.py +0 -0
  260. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/preprocessing/transformer_manager.py +0 -0
  261. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/__init__.py +0 -0
  262. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/categorical_distribution.py +0 -0
  263. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/categorical_target_analyzer.py +0 -0
  264. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/distribution_analysis.py +0 -0
  265. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/drift_detector.py +0 -0
  266. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/feature_capacity.py +0 -0
  267. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/pattern_analysis_config.py +0 -0
  268. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/profile_result.py +0 -0
  269. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/quality_checks.py +0 -0
  270. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/relationship_detector.py +0 -0
  271. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/relationship_recommender.py +0 -0
  272. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/report_generator.py +0 -0
  273. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/scd_analyzer.py +0 -0
  274. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/segment_analyzer.py +0 -0
  275. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/segment_aware_outlier.py +0 -0
  276. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/target_level_analyzer.py +0 -0
  277. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/temporal_analyzer.py +0 -0
  278. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/temporal_coverage.py +0 -0
  279. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/temporal_feature_analyzer.py +0 -0
  280. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/temporal_feature_engineer.py +0 -0
  281. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/temporal_pattern_analyzer.py +0 -0
  282. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/temporal_quality_checks.py +0 -0
  283. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/temporal_target_analyzer.py +0 -0
  284. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/text_embedder.py +0 -0
  285. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/text_processor.py +0 -0
  286. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/text_reducer.py +0 -0
  287. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/time_series_profiler.py +0 -0
  288. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/time_window_aggregator.py +0 -0
  289. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/type_detector.py +0 -0
  290. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/profiling/window_recommendation.py +0 -0
  291. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/temporal/__init__.py +0 -0
  292. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/temporal/access_guard.py +0 -0
  293. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/temporal/cutoff_analyzer.py +0 -0
  294. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/temporal/data_preparer.py +0 -0
  295. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/temporal/point_in_time_join.py +0 -0
  296. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/temporal/point_in_time_registry.py +0 -0
  297. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/temporal/scenario_detector.py +0 -0
  298. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/temporal/snapshot_manager.py +0 -0
  299. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/temporal/synthetic_coordinator.py +0 -0
  300. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/temporal/timestamp_discovery.py +0 -0
  301. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/temporal/timestamp_manager.py +0 -0
  302. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/transformation/__init__.py +0 -0
  303. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/transformation/binary_handler.py +0 -0
  304. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/transformation/categorical_encoder.py +0 -0
  305. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/transformation/datetime_transformer.py +0 -0
  306. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/transformation/numeric_transformer.py +0 -0
  307. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/transformation/pipeline.py +0 -0
  308. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/validation/__init__.py +0 -0
  309. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/validation/adversarial_scoring_validator.py +0 -0
  310. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/validation/business_sense_gate.py +0 -0
  311. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/validation/data_quality_gate.py +0 -0
  312. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/validation/data_validators.py +0 -0
  313. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/validation/feature_quality_gate.py +0 -0
  314. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/validation/gates.py +0 -0
  315. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/validation/leakage_gate.py +0 -0
  316. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/validation/model_validity_gate.py +0 -0
  317. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/validation/pipeline_validation_runner.py +0 -0
  318. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/validation/quality_scorer.py +0 -0
  319. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/validation/rule_generator.py +0 -0
  320. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/validation/scoring_pipeline_validator.py +0 -0
  321. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/stages/validation/timeseries_detector.py +0 -0
  322. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/transforms/__init__.py +0 -0
  323. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/transforms/artifact_store.py +0 -0
  324. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/transforms/executor.py +0 -0
  325. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/transforms/fitted.py +0 -0
  326. {churnkit-0.76.1a1 → churnkit-0.76.1a2}/src/customer_retention/transforms/ops.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: churnkit
3
- Version: 0.76.1a1
3
+ Version: 0.76.1a2
4
4
  Summary: Structured ML framework for customer churn prediction -- from exploration notebooks to production pipelines, locally or on Databricks.
5
5
  Project-URL: Homepage, https://github.com/aladjov/CR
6
6
  Project-URL: Documentation, https://github.com/aladjov/CR/wiki
@@ -70,17 +70,22 @@
70
70
  "outputs": [],
71
71
  "source": [
72
72
  "from customer_retention.analysis.notebook_progress import track_and_export_previous\n",
73
+ "\n",
73
74
  "track_and_export_previous(\"00_start_here.ipynb\")\n",
74
75
  "\n",
75
76
  "try:\n",
76
77
  " import customer_retention\n",
77
- " from customer_retention.core.config.experiments import FINDINGS_DIR, EXPERIMENTS_DIR, OUTPUT_DIR, setup_experiments_structure\n",
78
- " print(f\"customer_retention is installed\")\n",
78
+ " from customer_retention.core.config.experiments import (\n",
79
+ " EXPERIMENTS_DIR,\n",
80
+ " FINDINGS_DIR,\n",
81
+ " OUTPUT_DIR,\n",
82
+ " setup_experiments_structure,\n",
83
+ " )\n",
84
+ " print(\"customer_retention is installed\")\n",
79
85
  "except ImportError:\n",
80
86
  " print(\"customer_retention not found. Install with:\")\n",
81
87
  " print(\" uv sync\")\n",
82
- " print(\" # or: pip install -e .\")\n",
83
- "from customer_retention.stages.temporal import TEMPORAL_METADATA_COLS"
88
+ " print(\" # or: pip install -e .\")"
84
89
  ]
85
90
  },
86
91
  {
@@ -284,8 +289,8 @@
284
289
  "outputs": [],
285
290
  "source": [
286
291
  "# Download Bank Customer Churn dataset\n",
287
- "import subprocess\n",
288
292
  "import shutil\n",
293
+ "import subprocess\n",
289
294
  "\n",
290
295
  "FIXTURES_DIR.mkdir(parents=True, exist_ok=True)\n",
291
296
  "bank_churn_path = FIXTURES_DIR / \"bank_customer_churn.csv\"\n",
@@ -82,6 +82,7 @@
82
82
  "outputs": [],
83
83
  "source": [
84
84
  "from customer_retention.analysis.notebook_progress import track_and_export_previous\n",
85
+ "\n",
85
86
  "track_and_export_previous(\"01_data_discovery.ipynb\")\n",
86
87
  "\n",
87
88
  "from datetime import datetime\n",
@@ -94,7 +95,6 @@
94
95
  "from customer_retention.analysis.visualization import ChartBuilder, console, display_figure, display_table\n",
95
96
  "from customer_retention.core.config.column_config import DatasetGranularity\n",
96
97
  "from customer_retention.core.config.experiments import (\n",
97
- " EXPERIMENTS_DIR,\n",
98
98
  " FINDINGS_DIR, # noqa: F401 - required for test validation\n",
99
99
  " OUTPUT_DIR,\n",
100
100
  " setup_experiments_structure,\n",
@@ -889,14 +889,14 @@
889
889
  "if time_col and time_col in df.columns:\n",
890
890
  " exclude_cols = list(TEMPORAL_METADATA_COLS) + ([valid_entity_col] if valid_entity_col else [])\n",
891
891
  " availability = analyze_feature_availability(df, time_col, exclude_columns=exclude_cols)\n",
892
- " \n",
892
+ "\n",
893
893
  " console.start_section()\n",
894
894
  " console.header(\"Feature Availability\")\n",
895
895
  " console.metric(\"Data Span\", f\"{availability.data_start.date()} to {availability.data_end.date()} ({availability.time_span_days} days)\")\n",
896
- " \n",
896
+ "\n",
897
897
  " if availability.new_tracking or availability.retired_tracking or availability.partial_window:\n",
898
898
  " if availability.new_tracking:\n",
899
- " console.warning(f\"New tracking ({len(availability.new_tracking)}): {', '.join(availability.new_tracking[:5])}\" + \n",
899
+ " console.warning(f\"New tracking ({len(availability.new_tracking)}): {', '.join(availability.new_tracking[:5])}\" +\n",
900
900
  " (f\" +{len(availability.new_tracking)-5} more\" if len(availability.new_tracking) > 5 else \"\"))\n",
901
901
  " if availability.retired_tracking:\n",
902
902
  " console.warning(f\"Retired tracking ({len(availability.retired_tracking)}): {', '.join(availability.retired_tracking[:5])}\" +\n",
@@ -904,7 +904,7 @@
904
904
  " if availability.partial_window:\n",
905
905
  " console.warning(f\"Partial window ({len(availability.partial_window)}): {', '.join(availability.partial_window[:5])}\" +\n",
906
906
  " (f\" +{len(availability.partial_window)-5} more\" if len(availability.partial_window) > 5 else \"\"))\n",
907
- " \n",
907
+ "\n",
908
908
  " console.subheader(\"Recommendations\")\n",
909
909
  " for rec in availability.recommendations[:5]:\n",
910
910
  " if rec[\"column\"] != \"_general_\":\n",
@@ -915,7 +915,7 @@
915
915
  " else:\n",
916
916
  " console.success(\"All features have full temporal coverage\")\n",
917
917
  " console.end_section()\n",
918
- " \n",
918
+ "\n",
919
919
  " # Store structured availability metadata for downstream use\n",
920
920
  " features_info = {\n",
921
921
  " feat.column: FeatureAvailabilityInfo(\n",
@@ -109,22 +109,27 @@
109
109
  "outputs": [],
110
110
  "source": [
111
111
  "from customer_retention.analysis.notebook_progress import track_and_export_previous\n",
112
+ "\n",
112
113
  "track_and_export_previous(\"01a_a_temporal_text_deep_dive.ipynb\")\n",
113
114
  "\n",
114
- "from customer_retention.analysis.auto_explorer import ExplorationFindings, TextProcessingMetadata\n",
115
- "from customer_retention.analysis.visualization import ChartBuilder, display_figure, display_table, console\n",
116
- "from customer_retention.core.config.column_config import ColumnType, DatasetGranularity\n",
117
- "from customer_retention.stages.profiling import (\n",
118
- " TextColumnProcessor, TextProcessingConfig, TextColumnResult,\n",
119
- " TimeWindowAggregator, AggregationPlan,\n",
120
- " EMBEDDING_MODELS, get_model_info, list_available_models\n",
121
- ")\n",
122
- "import pandas as pd\n",
123
- "import numpy as np\n",
124
- "import plotly.graph_objects as go\n",
125
115
  "import plotly.express as px\n",
116
+ "import plotly.graph_objects as go\n",
126
117
  "from plotly.subplots import make_subplots\n",
127
- "from customer_retention.core.config.experiments import FINDINGS_DIR, EXPERIMENTS_DIR, OUTPUT_DIR, setup_experiments_structure"
118
+ "\n",
119
+ "from customer_retention.analysis.auto_explorer import ExplorationFindings, TextProcessingMetadata\n",
120
+ "from customer_retention.analysis.visualization import ChartBuilder, display_figure\n",
121
+ "from customer_retention.core.config.column_config import ColumnType\n",
122
+ "from customer_retention.core.config.experiments import (\n",
123
+ " EXPERIMENTS_DIR,\n",
124
+ " FINDINGS_DIR,\n",
125
+ ")\n",
126
+ "from customer_retention.stages.profiling import (\n",
127
+ " TextColumnProcessor,\n",
128
+ " TextProcessingConfig,\n",
129
+ " TimeWindowAggregator,\n",
130
+ " get_model_info,\n",
131
+ " list_available_models,\n",
132
+ ")"
128
133
  ]
129
134
  },
130
135
  {
@@ -296,7 +301,7 @@
296
301
  },
297
302
  "outputs": [],
298
303
  "source": [
299
- "from customer_retention.stages.temporal import load_data_with_snapshot_preference, TEMPORAL_METADATA_COLS\n",
304
+ "from customer_retention.stages.temporal import load_data_with_snapshot_preference\n",
300
305
  "\n",
301
306
  "df, data_source = load_data_with_snapshot_preference(findings, output_dir=str(FINDINGS_DIR))\n",
302
307
  "charts = ChartBuilder()\n",
@@ -478,28 +483,28 @@
478
483
  " print(f\"\\n{'='*70}\")\n",
479
484
  " print(f\"Column: {col_name}\")\n",
480
485
  " print(f\"{'='*70}\")\n",
481
- " \n",
486
+ "\n",
482
487
  " text_series = df[col_name].fillna(\"\")\n",
483
- " \n",
488
+ "\n",
484
489
  " non_empty = (text_series.str.len() > 0).sum()\n",
485
490
  " avg_length = text_series.str.len().mean()\n",
486
- " \n",
487
- " print(f\"\\n\\U0001f4ca Statistics:\")\n",
491
+ "\n",
492
+ " print(\"\\n\\U0001f4ca Statistics:\")\n",
488
493
  " print(f\" Total events: {len(text_series):,}\")\n",
489
494
  " print(f\" Non-empty: {non_empty:,} ({non_empty/len(text_series)*100:.1f}%)\")\n",
490
495
  " print(f\" Avg length: {avg_length:.0f} characters\")\n",
491
- " \n",
496
+ "\n",
492
497
  " # Texts per entity\n",
493
498
  " texts_per_entity = df.groupby(ENTITY_COLUMN)[col_name].apply(\n",
494
499
  " lambda x: (x.fillna(\"\").str.len() > 0).sum()\n",
495
500
  " )\n",
496
- " print(f\"\\n\\U0001f465 Text events per entity:\")\n",
501
+ " print(\"\\n\\U0001f465 Text events per entity:\")\n",
497
502
  " print(f\" Mean: {texts_per_entity.mean():.1f}\")\n",
498
503
  " print(f\" Median: {texts_per_entity.median():.0f}\")\n",
499
504
  " print(f\" Max: {texts_per_entity.max():,}\")\n",
500
- " \n",
505
+ "\n",
501
506
  " # Sample texts\n",
502
- " print(f\"\\n\\U0001f4dd Sample texts:\")\n",
507
+ " print(\"\\n\\U0001f4dd Sample texts:\")\n",
503
508
  " samples = text_series[text_series.str.len() > 10].head(3)\n",
504
509
  " for i, sample in enumerate(samples, 1):\n",
505
510
  " truncated = sample[:80] + \"...\" if len(sample) > 80 else sample\n",
@@ -547,26 +552,26 @@
547
552
  "source": [
548
553
  "if text_columns and findings.is_time_series:\n",
549
554
  " processor = TextColumnProcessor(text_config)\n",
550
- " \n",
555
+ "\n",
551
556
  " print(\"Processing TEXT columns...\")\n",
552
557
  " print(\"(This may take a moment for large datasets)\\n\")\n",
553
- " \n",
558
+ "\n",
554
559
  " results = []\n",
555
560
  " df_with_pcs = df.copy()\n",
556
- " \n",
561
+ "\n",
557
562
  " for col_name in text_columns:\n",
558
563
  " print(f\"\\n{'='*70}\")\n",
559
564
  " print(f\"Processing: {col_name}\")\n",
560
565
  " print(f\"{'='*70}\")\n",
561
- " \n",
566
+ "\n",
562
567
  " df_with_pcs, result = processor.process_column(df_with_pcs, col_name)\n",
563
568
  " results.append(result)\n",
564
- " \n",
565
- " print(f\"\\n\\u2705 Per-event processing complete:\")\n",
569
+ "\n",
570
+ " print(\"\\n\\u2705 Per-event processing complete:\")\n",
566
571
  " print(f\" Components: {result.n_components}\")\n",
567
572
  " print(f\" Explained variance: {result.explained_variance:.1%}\")\n",
568
573
  " print(f\" Features: {', '.join(result.component_columns)}\")\n",
569
- " \n",
574
+ "\n",
570
575
  " print(f\"\\n\\nDataFrame now has {len(df_with_pcs.columns)} columns (added {len(df_with_pcs.columns) - len(df.columns)} PC columns)\")"
571
576
  ]
572
577
  },
@@ -620,11 +625,11 @@
620
625
  " all_pc_columns = []\n",
621
626
  " for result in results:\n",
622
627
  " all_pc_columns.extend(result.component_columns)\n",
623
- " \n",
628
+ "\n",
624
629
  " print(f\"\\n{'='*70}\")\n",
625
630
  " print(\"AGGREGATION PLAN\")\n",
626
631
  " print(f\"{'='*70}\")\n",
627
- " \n",
632
+ "\n",
628
633
  " aggregator = TimeWindowAggregator(ENTITY_COLUMN, TIME_COLUMN)\n",
629
634
  " plan = aggregator.generate_plan(\n",
630
635
  " df_with_pcs,\n",
@@ -634,16 +639,16 @@
634
639
  " include_event_count=False,\n",
635
640
  " include_recency=False\n",
636
641
  " )\n",
637
- " \n",
638
- " print(f\"\\n\\U0001f4ca Plan Summary:\")\n",
642
+ "\n",
643
+ " print(\"\\n\\U0001f4ca Plan Summary:\")\n",
639
644
  " print(f\" Entity column: {plan.entity_column}\")\n",
640
645
  " print(f\" Time column: {plan.time_column}\")\n",
641
646
  " print(f\" Windows: {[w.name for w in plan.windows]}\")\n",
642
647
  " print(f\" Value columns: {len(plan.value_columns)}\")\n",
643
648
  " print(f\" Aggregation functions: {plan.agg_funcs}\")\n",
644
649
  " print(f\" Total features to create: {len(plan.feature_columns)}\")\n",
645
- " \n",
646
- " print(f\"\\n\\U0001f4dd Sample feature names:\")\n",
650
+ "\n",
651
+ " print(\"\\n\\U0001f4dd Sample feature names:\")\n",
647
652
  " for feat in plan.feature_columns[:10]:\n",
648
653
  " print(f\" - {feat}\")\n",
649
654
  " if len(plan.feature_columns) > 10:\n",
@@ -694,28 +699,28 @@
694
699
  " print(f\"\\n{'='*70}\")\n",
695
700
  " print(f\"PC Feature Distributions: {result.column_name}\")\n",
696
701
  " print(f\"{'='*70}\")\n",
697
- " \n",
702
+ "\n",
698
703
  " # Distribution of PC1 and PC2\n",
699
704
  " if len(result.component_columns) >= 2:\n",
700
705
  " fig = make_subplots(rows=1, cols=2,\n",
701
706
  " subplot_titles=(result.component_columns[0], result.component_columns[1]))\n",
702
- " \n",
707
+ "\n",
703
708
  " fig.add_trace(go.Histogram(\n",
704
709
  " x=df_with_pcs[result.component_columns[0]],\n",
705
710
  " nbinsx=50, marker_color='steelblue', opacity=0.7\n",
706
711
  " ), row=1, col=1)\n",
707
- " \n",
712
+ "\n",
708
713
  " fig.add_trace(go.Histogram(\n",
709
714
  " x=df_with_pcs[result.component_columns[1]],\n",
710
715
  " nbinsx=50, marker_color='coral', opacity=0.7\n",
711
716
  " ), row=1, col=2)\n",
712
- " \n",
717
+ "\n",
713
718
  " fig.update_layout(\n",
714
719
  " title=f\"PC Feature Distributions: {result.column_name}\",\n",
715
720
  " height=350, template=\"plotly_white\", showlegend=False\n",
716
721
  " )\n",
717
722
  " display_figure(fig)\n",
718
- " \n",
723
+ "\n",
719
724
  " # Scatter plot of PC1 vs PC2\n",
720
725
  " if len(result.component_columns) >= 2:\n",
721
726
  " fig = px.scatter(\n",
@@ -781,13 +786,14 @@
781
786
  " processing_approach=\"pca\"\n",
782
787
  " )\n",
783
788
  " findings.text_processing[result.column_name] = metadata\n",
784
- " \n",
789
+ "\n",
785
790
  " print(f\"\\u2705 Added text processing metadata for {result.column_name}\")\n",
786
- " \n",
791
+ "\n",
787
792
  " findings.save(FINDINGS_PATH)\n",
788
793
  " print(f\"\\nFindings saved to: {FINDINGS_PATH}\")\n",
789
794
  "\n",
790
795
  "from customer_retention.analysis.notebook_html_exporter import export_notebook_html\n",
796
+ "\n",
791
797
  "export_notebook_html(Path(\"01a_a_temporal_text_deep_dive.ipynb\"), EXPERIMENTS_DIR / \"docs\")\n"
792
798
  ]
793
799
  },
@@ -834,25 +840,25 @@
834
840
  " print(\"\\n\" + \"=\"*70)\n",
835
841
  " print(\"PRODUCTION PIPELINE RECOMMENDATIONS\")\n",
836
842
  " print(\"=\"*70)\n",
837
- " \n",
843
+ "\n",
838
844
  " print(\"\\n\\U0001f527 Bronze Layer (per-event processing):\")\n",
839
845
  " for result in results:\n",
840
846
  " print(f\"\\n {result.column_name}:\")\n",
841
- " print(f\" Action: embed_reduce\")\n",
847
+ " print(\" Action: embed_reduce\")\n",
842
848
  " print(f\" Model: {text_config.embedding_model}\")\n",
843
849
  " print(f\" Components: {result.n_components}\")\n",
844
850
  " print(f\" Output: {', '.join(result.component_columns[:3])}...\")\n",
845
- " \n",
851
+ "\n",
846
852
  " print(\"\\n\\U0001f527 Silver Layer (entity aggregation):\")\n",
847
853
  " print(f\" Windows: {AGGREGATION_WINDOWS}\")\n",
848
854
  " print(f\" Functions: {AGGREGATION_FUNCS}\")\n",
849
- " print(f\" Example features:\")\n",
855
+ " print(\" Example features:\")\n",
850
856
  " for result in results[:1]:\n",
851
857
  " pc1 = result.component_columns[0]\n",
852
858
  " for window in AGGREGATION_WINDOWS[:2]:\n",
853
859
  " for func in AGGREGATION_FUNCS[:2]:\n",
854
860
  " print(f\" - {pc1}_{func}_{window}\")\n",
855
- " \n",
861
+ "\n",
856
862
  " print(\"\\n\\U0001f4a1 The pipeline generator will create these transformations automatically.\")"
857
863
  ]
858
864
  },