churnkit 1.3.2a2__tar.gz → 1.3.2a4__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.
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/PKG-INFO +1 -1
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/apps/databricks_app/src/data.py +142 -0
- churnkit-1.3.2a4/apps/databricks_app/src/playbooks_view.py +739 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/apps/databricks_app/src/theme.css +215 -1
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/causal_notebooks/c04_batch_inference.ipynb +256 -28
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/pyproject.toml +1 -1
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/__init__.py +1 -1
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/s_c04_batch_inference.py +59 -37
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/derivation.py +179 -9
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/llm_namer.py +134 -3
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/schemas.py +7 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/snapshot_writer.py +30 -1
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/sql/dashboard_views.sql +18 -9
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/scoring/batch_inference.py +68 -8
- churnkit-1.3.2a2/apps/databricks_app/src/playbooks_view.py +0 -346
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/.gitignore +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/LICENSE +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/README.md +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/apps/databricks_app/src/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/apps/databricks_app/src/accounts_view.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/apps/databricks_app/src/archetype_view.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/apps/databricks_app/src/archetypes_view.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/apps/databricks_app/src/auth.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/apps/databricks_app/src/config.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/apps/databricks_app/src/customer_profile.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/apps/databricks_app/src/default_profile.css +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/apps/databricks_app/src/default_profile.html +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/apps/databricks_app/src/masthead.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/apps/databricks_app/src/state.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/apps/databricks_app/src/template.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/apps/databricks_app/src/treemap.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/causal_notebooks/_diagnostic_scoring_probe.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/causal_notebooks/c01_publish_definitions.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/causal_notebooks/c02_archetype_derivation.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/causal_notebooks/c03_approval_gate.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/causal_notebooks/c05_snapshot_and_dashboard.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/constraints/.gitkeep +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/-1_parity_contract.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/-1_sample_datasets.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/00_start_here.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/01_data_discovery.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/01a_a_temporal_text_deep_dive.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/01a_temporal_deep_dive.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/01b_temporal_quality.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/01c_temporal_patterns.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/01d_event_aggregation.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/02_source_integrity.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/03_dataset_merge.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/04_column_deep_dive.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/04a_text_columns_deep_dive.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/05_relationship_analysis.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/06_feature_opportunities.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/07_modeling_readiness.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/08_baseline_experiments.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/09_business_alignment.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/10_spec_generation.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/11_scoring_validation.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/exploration_notebooks/12_view_documentation.ipynb +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/.claude/settings.local.json +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/README.md +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/build_framework_phase_map.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/data/create_snapshot.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/data/generate_edi_ticketing_dataset.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/data/generate_retail_dataset.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/data/generate_test_data.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/data/migrate_parquet_to_delta.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/data/migrate_to_temporal.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/databricks/build_wheel.sh +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/databricks/capture_runtime.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/databricks/dbr_init.sh +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/databricks/deploy_dev.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/databricks/generate_constraints.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/databricks/notebook_setup.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/experiments/capture_notebook_outputs.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/experiments/cell_profiling.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/experiments/compare_exploration_runs.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/experiments/compare_versions.sh +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/experiments/patch_dataset_config.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/generate_requirements.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/notebooks/build_causal_notebooks.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/notebooks/clean_notebook_outputs.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/notebooks/export_tutorial_html.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/notebooks/init_project.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/notebooks/migrate_notebook_cell_ids.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/notebooks/plotly_image_preprocessor.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/notebooks/run_exploration.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/notebooks/sync_notebooks.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/notebooks/tag_framework_cells.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/notebooks/tag_markdown_cells.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/notebooks/test_notebooks.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/release.sh +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/seed_playbooks_volume.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/templates/tutorial_html/conf.json +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/templates/tutorial_html/index.html.j2 +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/scripts/update_notebook_paths.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/active_dataset_store.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/analysis_context.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/column_describer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/dataset_fingerprinter.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/entity_timestamp_deriver.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/exploration_manager.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/explorer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/field_availability_audit.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/findings.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/intent_defaults.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/key_resolver.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/layered_recommendations.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/objective_support_communicator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/prediction_objective_detector.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/project_context.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/recommendation_builder.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/recommendations.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/run_namespace.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/sampling.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/schema_report.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/service_unit_detector.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/session.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/skip_logic.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/auto_explorer/snapshot_grid.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/business/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/business/ab_test_designer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/business/fairness_analyzer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/business/intervention_matcher.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/business/ratio_features.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/business/report_generator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/business/risk_profile.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/business/roi_analyzer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/diagnostics/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/diagnostics/calibration_analyzer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/diagnostics/cv_analyzer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/diagnostics/error_analyzer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/diagnostics/exploration_ledger.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/diagnostics/feature_provenance.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/diagnostics/feature_stability.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/diagnostics/leakage_detector.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/diagnostics/model_diagnostics_report.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/diagnostics/noise_tester.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/diagnostics/overfitting_analyzer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/diagnostics/parity_report.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/diagnostics/segment_analyzer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/discovery/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/discovery/config_generator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/discovery/discovery_flow.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/discovery/type_inferencer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/interpretability/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/interpretability/cohort_analyzer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/interpretability/counterfactual.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/interpretability/individual_explainer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/interpretability/pdp_generator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/interpretability/shap_explainer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/jupyter_save_hook.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/notebook_html_exporter.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/notebook_progress.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/plotly_preprocessor.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/recommendations/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/recommendations/base.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/recommendations/cleaning/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/recommendations/cleaning/consistency.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/recommendations/cleaning/deduplicate.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/recommendations/cleaning/impute.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/recommendations/cleaning/outlier.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/recommendations/datetime/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/recommendations/datetime/extract.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/recommendations/encoding/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/recommendations/encoding/categorical.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/recommendations/pipeline.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/recommendations/registry.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/recommendations/selection/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/recommendations/selection/drop_column.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/recommendations/transform/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/recommendations/transform/power.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/recommendations/transform/scale.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/visualization/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/visualization/attention_scorer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/visualization/chart_builder.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/visualization/column_paginator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/visualization/console.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/visualization/display.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/analysis/visualization/number_formatter.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/artifacts/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/artifacts/fit_artifact_registry.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/cli.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/compat/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/compat/bulk_profiling.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/compat/cell_profiling_hooks.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/compat/detection.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/compat/ops.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/compat/pandas_backend.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/compat/remote_path.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/compat/spark_backend.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/compat/timing.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/components/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/components/base.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/components/components/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/components/components/deployer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/components/components/explainer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/components/components/feature_eng.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/components/components/ingester.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/components/components/profiler.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/components/components/trainer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/components/components/transformer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/components/components/validator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/components/enums.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/components/orchestrator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/components/registry.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/config/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/config/column_config.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/config/experiments.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/config/pipeline_config.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/config/source_config.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/naming.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/utils/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/utils/leakage.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/utils/severity.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/core/utils/statistics.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/base.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/cell_builder.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/config.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/databricks_generator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/local_generator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/project_init.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/runner.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/scoring_replay.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/script_generator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/base_stage.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/causal_setup_cell.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/s01_ingestion.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/s02_profiling.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/s03_cleaning.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/s04_transformation.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/s05_feature_engineering.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/s06_feature_selection.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/s07_model_training.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/s08_deployment.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/s09_monitoring.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/s10_batch_inference.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/s11_feature_store.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/s_c01_publish_definitions.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/s_c02_archetype_derivation.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/s_c03_approval_gate.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_generator/stages/s_c05_snapshot_and_dashboard.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_merge/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_merge/cli.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_merge/config_merger.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_merge/config_parser.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_merge/conflict.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_merge/merge_engine.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_merge/merge_report.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_sync/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_sync/cell_id_standardizer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_sync/cell_types.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_sync/cli.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_sync/sync_engine.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/notebook_sync/sync_report.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/orchestration/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/orchestration/code_generator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/orchestration/context.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/orchestration/data_materializer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/orchestration/databricks_exporter.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/orchestration/doc_generator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/pipeline_generator/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/pipeline_generator/databricks_generator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/pipeline_generator/databricks_renderer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/pipeline_generator/exploration_generator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/pipeline_generator/findings_parser.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/pipeline_generator/generation_manifest.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/pipeline_generator/generator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/pipeline_generator/gold_transform_applicator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/pipeline_generator/llm_docs_generator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/pipeline_generator/models.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/pipeline_generator/override_merge.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/pipeline_generator/protocols.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/pipeline_generator/renderer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/pipeline_generator/user_extensions_emitter.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/spec_generator/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/generators/spec_generator/mlflow_pipeline_generator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/adapters/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/adapters/base.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/adapters/factory.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/adapters/feature_store/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/adapters/feature_store/base.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/adapters/feature_store/databricks.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/adapters/feature_store/feast_adapter.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/adapters/feature_store/local.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/adapters/mlflow/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/adapters/mlflow/base.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/adapters/mlflow/databricks.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/adapters/mlflow/experiment_tracker.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/adapters/mlflow/local.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/adapters/storage/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/adapters/storage/base.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/adapters/storage/databricks.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/adapters/storage/local.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/databricks_init.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/databricks_job_capture.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/feature_store/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/feature_store/definitions.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/feature_store/manager.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/feature_store/registry.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/iteration/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/iteration/context.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/iteration/feedback_collector.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/iteration/orchestrator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/iteration/recommendation_tracker.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/iteration/signals.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/llm_context/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/llm_context/context_builder.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/llm_context/prompts.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/requirements_generator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/streaming/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/streaming/batch_integration.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/streaming/early_warning_model.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/streaming/event_schema.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/streaming/online_store_writer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/streaming/realtime_scorer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/streaming/trigger_engine.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/integrations/streaming/window_aggregator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/parity/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/parity/audit.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/parity/decorator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/parity/exploration_scan.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/parity/gaps.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/parity/kinds.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/parity/manifest.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/parity/production_scan.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/parity/schedule.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/parity/trace.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/runtime/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/runtime/api.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/runtime/dataset_resolution.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/runtime/decorator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/runtime/flags.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/runtime/harvest.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/runtime/logging.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/runtime/persistence.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/runtime/registry.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/runtime/replay.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/runtime/summary.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/runtime/validation.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/approval_gate.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/clusterer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/column_descriptions_writer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/dashboard_profile_override.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/dashboard_views.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/delta_writer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/feature_meta_writer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/interpretation/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/interpretation/archetype_context.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/interpretation/business_phrase.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/interpretation/discovery.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/interpretation/enrichment_pipeline.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/interpretation/feature_meta_builder.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/interpretation/llm_prompt.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/interpretation/markdown_bootstrap.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/interpretation/predicate_prose.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/interpretation/prose_backfill.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/interpretation/quantile_phrasing.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/interpretation/sidecars.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/playbook_loader.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/playbook_mapper.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/policy_loader.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/population_stats.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/predicate_compiler.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/rule_extractor.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/run_context_writer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/seed_yamls/decision_policy.yaml +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/seed_yamls/response_schemas.yaml +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/seed_yamls/vocabularies.yaml +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/shap_runner.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/causal/top_drivers_writer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/cleaning/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/cleaning/base.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/cleaning/missing_handler.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/cleaning/outlier_handler.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/deployment/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/deployment/batch_scorer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/deployment/champion_challenger.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/deployment/model_registry.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/deployment/retraining_trigger.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/features/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/features/behavioral_features.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/features/customer_segmentation.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/features/feature_definitions.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/features/feature_engineer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/features/feature_manifest.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/features/feature_selector.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/features/interaction_features.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/features/temporal_features.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/ingestion/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/ingestion/load_result.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/ingestion/loaders.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/ingestion/source_registry.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/lifecycle/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/lifecycle/config.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/lifecycle/enrich.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/lifecycle/validation.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/modeling/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/modeling/baseline_trainer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/modeling/cross_validator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/modeling/data_splitter.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/modeling/feature_profile.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/modeling/feature_scaler.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/modeling/feature_spec.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/modeling/hyperparameter_tuner.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/modeling/imbalance_handler.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/modeling/mlflow_logger.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/modeling/model_comparator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/modeling/model_evaluator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/modeling/shap_attribution.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/modeling/spark_baseline_trainer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/modeling/spark_classifier_wrapper.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/modeling/spark_feature_scaler.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/modeling/threshold_optimizer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/modeling/training_preparator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/monitoring/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/monitoring/alert_manager.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/monitoring/drift_detector.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/monitoring/performance_monitor.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/preprocessing/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/preprocessing/transformer_manager.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/case_collision.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/categorical_distribution.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/categorical_target_analyzer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/column_profiler.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/distribution_analysis.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/drift_detector.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/feature_capacity.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/pattern_analysis_config.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/profile_result.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/quality_checks.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/recommendation_filter.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/relationship_detector.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/relationship_recommender.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/report_generator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/scd_analyzer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/segment_analyzer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/segment_aware_outlier.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/spark_segment_analyzer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/spark_temporal_feature_analyzer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/spark_temporal_feature_engineer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/spark_time_window_aggregator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/stats_helpers.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/target_level_analyzer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/target_validator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/temporal_analyzer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/temporal_coverage.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/temporal_feature_analyzer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/temporal_feature_engineer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/temporal_pattern_analyzer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/temporal_quality_checks.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/temporal_target_analyzer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/text_embedder.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/text_processor.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/text_reducer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/time_series_profiler.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/time_window_aggregator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/type_detector.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/profiling/window_recommendation.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/scd_history/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/scd_history/augment.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/scd_history/config.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/scd_history/reconstruct.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/scd_history/validation.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/scoring/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/scoring/config.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/scoring/data_loader.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/scoring/exceptions.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/scoring/pipeline_discovery.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/temporal/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/temporal/access_guard.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/temporal/data_preparer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/temporal/point_in_time_join.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/temporal/point_in_time_registry.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/temporal/scenario_detector.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/temporal/snapshot_manager.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/temporal/spark_temporal_merger.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/temporal/synthetic_coordinator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/temporal/temporal_merger.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/temporal/timestamp_discovery.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/temporal/timestamp_manager.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/transformation/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/transformation/binary_handler.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/transformation/categorical_encoder.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/transformation/datetime_transformer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/transformation/numeric_transformer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/transformation/pipeline.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/validation/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/validation/adversarial_scoring_validator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/validation/business_sense_gate.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/validation/data_quality_gate.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/validation/data_validators.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/validation/feature_quality_gate.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/validation/gates.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/validation/leakage_gate.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/validation/model_validity_gate.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/validation/pipeline_validation_runner.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/validation/quality_scorer.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/validation/rule_generator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/validation/scoring_pipeline_validator.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/stages/validation/timeseries_detector.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/transforms/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/transforms/artifact_store.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/transforms/executor.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/transforms/fitted.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/transforms/ops.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/src/customer_retention/transforms/spark_ops.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/tests/exploration_notebooks/test_distributed_dtype_safety.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/tests/exploration_notebooks/test_nb02_case_collision_detection.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/tests/exploration_notebooks/test_nb06_ratio_registration.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/tests/exploration_notebooks/test_nb08_categorical_baseline.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/tests/exploration_notebooks/test_nb08_early_drops.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/tests/exploration_notebooks/test_nb10_run_pipeline_ordering.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/tests/scripts/__init__.py +0 -0
- {churnkit-1.3.2a2 → churnkit-1.3.2a4}/tests/scripts/test_build_framework_phase_map.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: churnkit
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.2a4
|
|
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
|
|
@@ -329,6 +329,8 @@ def playbook_catalog_all() -> pd.DataFrame:
|
|
|
329
329
|
name,
|
|
330
330
|
description,
|
|
331
331
|
when_applicable,
|
|
332
|
+
policy_summary,
|
|
333
|
+
expected_effect,
|
|
332
334
|
cost_per_customer_default,
|
|
333
335
|
expected_uplift_pct_default,
|
|
334
336
|
outcome_windows_days,
|
|
@@ -366,6 +368,8 @@ def playbook_catalog_all() -> pd.DataFrame:
|
|
|
366
368
|
p.name,
|
|
367
369
|
p.description,
|
|
368
370
|
p.when_applicable,
|
|
371
|
+
p.policy_summary,
|
|
372
|
+
p.expected_effect,
|
|
369
373
|
p.cost_per_customer_default,
|
|
370
374
|
p.expected_uplift_pct_default,
|
|
371
375
|
p.outcome_windows_days,
|
|
@@ -440,6 +444,144 @@ def archetype_catalog_all() -> pd.DataFrame:
|
|
|
440
444
|
""")
|
|
441
445
|
|
|
442
446
|
|
|
447
|
+
@st.cache_data(ttl=600, show_spinner=False)
|
|
448
|
+
def playbook_yaml_runbook(playbook_id: str) -> dict | None:
|
|
449
|
+
"""Return the parsed playbook YAML (or ``None`` when unavailable).
|
|
450
|
+
|
|
451
|
+
The framework's playbook loader writes the ``catalog`` and ``steps``
|
|
452
|
+
blocks to UC but deliberately drops ``operator_runbook`` -- that block
|
|
453
|
+
is operator content, not model-derived. To surface it in the dashboard
|
|
454
|
+
without a schema migration we read the YAML directly from the same
|
|
455
|
+
playbooks directory the loader uses.
|
|
456
|
+
|
|
457
|
+
Resolution order for the playbooks root:
|
|
458
|
+
1. ``CR_PLAYBOOKS_DIR`` env var (Volume path like
|
|
459
|
+
``/Volumes/<catalog>/<schema>/playbooks`` or any filesystem dir).
|
|
460
|
+
Volume paths are read via the Databricks SDK ``files`` API; local
|
|
461
|
+
paths via ``Path.read_text``.
|
|
462
|
+
2. Repo-relative ``playbooks/`` discovered by walking up from this
|
|
463
|
+
file (works in local dev).
|
|
464
|
+
3. Give up — return ``None`` so the UI gracefully falls back to the
|
|
465
|
+
catalog-only layout.
|
|
466
|
+
|
|
467
|
+
Per-playbook caching is keyed on ``playbook_id`` so a click into a
|
|
468
|
+
different playbook only hits one file read.
|
|
469
|
+
"""
|
|
470
|
+
import os
|
|
471
|
+
from pathlib import Path
|
|
472
|
+
|
|
473
|
+
import yaml
|
|
474
|
+
|
|
475
|
+
candidates = []
|
|
476
|
+
env_dir = os.environ.get("CR_PLAYBOOKS_DIR")
|
|
477
|
+
if env_dir:
|
|
478
|
+
candidates.append(env_dir)
|
|
479
|
+
here = Path(__file__).resolve()
|
|
480
|
+
# apps/databricks_app/src/data.py -> repo_root/playbooks
|
|
481
|
+
for parent in here.parents:
|
|
482
|
+
candidate = parent / "playbooks"
|
|
483
|
+
if candidate.is_dir():
|
|
484
|
+
candidates.append(str(candidate))
|
|
485
|
+
break
|
|
486
|
+
|
|
487
|
+
for root in candidates:
|
|
488
|
+
text = _read_playbook_yaml(root, playbook_id)
|
|
489
|
+
if text is None:
|
|
490
|
+
continue
|
|
491
|
+
try:
|
|
492
|
+
parsed = yaml.safe_load(text)
|
|
493
|
+
except yaml.YAMLError:
|
|
494
|
+
return None
|
|
495
|
+
if isinstance(parsed, dict):
|
|
496
|
+
return parsed
|
|
497
|
+
return None
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
def _read_playbook_yaml(root: str, playbook_id: str) -> str | None:
|
|
501
|
+
"""Find ``<playbook_id>.yaml`` under ``root`` and return its contents.
|
|
502
|
+
|
|
503
|
+
Searches the top level and the first level of subdirectories so the
|
|
504
|
+
SPS/email split (``playbooks/sps/foo.yaml`` vs ``playbooks/email/bar.yaml``)
|
|
505
|
+
works without configuration. Volume paths (starting ``/Volumes/``)
|
|
506
|
+
go through the Databricks SDK file API; everything else uses the
|
|
507
|
+
local filesystem. Returns ``None`` when nothing matches.
|
|
508
|
+
"""
|
|
509
|
+
target = f"{playbook_id}.yaml"
|
|
510
|
+
if root.startswith("/Volumes/"):
|
|
511
|
+
return _read_yaml_from_volume(root, target)
|
|
512
|
+
from pathlib import Path
|
|
513
|
+
base = Path(root)
|
|
514
|
+
if not base.is_dir():
|
|
515
|
+
return None
|
|
516
|
+
candidates = [base / target]
|
|
517
|
+
for child in sorted(base.iterdir()):
|
|
518
|
+
if child.is_dir():
|
|
519
|
+
candidates.append(child / target)
|
|
520
|
+
for path in candidates:
|
|
521
|
+
if path.is_file():
|
|
522
|
+
try:
|
|
523
|
+
return path.read_text(encoding="utf-8")
|
|
524
|
+
except OSError:
|
|
525
|
+
return None
|
|
526
|
+
return None
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
def _read_yaml_from_volume(root: str, target: str) -> str | None:
|
|
530
|
+
"""Read ``<root>/<sub>/<target>`` from a Unity Catalog Volume.
|
|
531
|
+
|
|
532
|
+
Uses ``WorkspaceClient.files.download`` -- the supported SDK path that
|
|
533
|
+
works reliably from Databricks Apps where FUSE is unreliable. Walks
|
|
534
|
+
the top level then one level of subdirectories so the SPS/email split
|
|
535
|
+
is auto-discovered.
|
|
536
|
+
"""
|
|
537
|
+
try:
|
|
538
|
+
from databricks.sdk import WorkspaceClient
|
|
539
|
+
except ImportError:
|
|
540
|
+
return None
|
|
541
|
+
try:
|
|
542
|
+
w = WorkspaceClient()
|
|
543
|
+
except Exception:
|
|
544
|
+
return None
|
|
545
|
+
|
|
546
|
+
def _try_path(path: str) -> str | None:
|
|
547
|
+
try:
|
|
548
|
+
resp = w.files.download(path)
|
|
549
|
+
except Exception:
|
|
550
|
+
return None
|
|
551
|
+
try:
|
|
552
|
+
data = resp.contents.read()
|
|
553
|
+
except Exception:
|
|
554
|
+
return None
|
|
555
|
+
try:
|
|
556
|
+
return data.decode("utf-8") if isinstance(data, (bytes, bytearray)) else str(data)
|
|
557
|
+
except Exception:
|
|
558
|
+
return None
|
|
559
|
+
|
|
560
|
+
# Try top-level first.
|
|
561
|
+
direct = _try_path(f"{root.rstrip('/')}/{target}")
|
|
562
|
+
if direct is not None:
|
|
563
|
+
return direct
|
|
564
|
+
# Walk one level of subdirectories.
|
|
565
|
+
try:
|
|
566
|
+
listing = list(w.files.list_directory_contents(root))
|
|
567
|
+
except Exception:
|
|
568
|
+
return None
|
|
569
|
+
for entry in listing:
|
|
570
|
+
# The SDK returns a DirectoryEntry-like object; both ``is_directory``
|
|
571
|
+
# and ``path`` are present on the variants we care about.
|
|
572
|
+
try:
|
|
573
|
+
is_dir = bool(getattr(entry, "is_directory", False))
|
|
574
|
+
entry_path = getattr(entry, "path", None)
|
|
575
|
+
except Exception:
|
|
576
|
+
continue
|
|
577
|
+
if not is_dir or not entry_path:
|
|
578
|
+
continue
|
|
579
|
+
found = _try_path(f"{entry_path.rstrip('/')}/{target}")
|
|
580
|
+
if found is not None:
|
|
581
|
+
return found
|
|
582
|
+
return None
|
|
583
|
+
|
|
584
|
+
|
|
443
585
|
@st.cache_data(ttl=300, show_spinner=False)
|
|
444
586
|
def feature_business_phrases() -> pd.DataFrame:
|
|
445
587
|
"""``feature_name → business_phrase`` map for archetype detail.
|