churnkit 1.2.8a0__tar.gz → 1.2.8a1__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.2.8a0 → churnkit-1.2.8a1}/PKG-INFO +1 -1
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/pyproject.toml +1 -1
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/__init__.py +1 -1
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/pipeline_generator/findings_parser.py +241 -6
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/.gitignore +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/LICENSE +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/README.md +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/apps/databricks_app/src/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/apps/databricks_app/src/accounts_view.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/apps/databricks_app/src/archetype_view.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/apps/databricks_app/src/config.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/apps/databricks_app/src/customer_profile.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/apps/databricks_app/src/data.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/apps/databricks_app/src/default_profile.css +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/apps/databricks_app/src/default_profile.html +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/apps/databricks_app/src/masthead.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/apps/databricks_app/src/state.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/apps/databricks_app/src/template.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/apps/databricks_app/src/theme.css +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/apps/databricks_app/src/treemap.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/causal_notebooks/c01_publish_definitions.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/causal_notebooks/c02_archetype_derivation.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/causal_notebooks/c03_approval_gate.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/causal_notebooks/c04_batch_inference.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/causal_notebooks/c05_snapshot_and_dashboard.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/constraints/.gitkeep +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/-1_sample_datasets.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/00_start_here.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/01_data_discovery.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/01a_a_temporal_text_deep_dive.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/01a_temporal_deep_dive.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/01b_temporal_quality.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/01c_temporal_patterns.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/01d_event_aggregation.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/02_source_integrity.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/03_dataset_merge.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/04_column_deep_dive.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/04a_text_columns_deep_dive.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/05_relationship_analysis.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/06_feature_opportunities.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/07_modeling_readiness.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/08_baseline_experiments.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/09_business_alignment.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/10_spec_generation.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/11_scoring_validation.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/12_view_documentation.ipynb +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/.claude/settings.local.json +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/README.md +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/build_framework_phase_map.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/data/create_snapshot.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/data/generate_edi_ticketing_dataset.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/data/generate_retail_dataset.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/data/generate_test_data.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/data/migrate_parquet_to_delta.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/data/migrate_to_temporal.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/databricks/build_wheel.sh +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/databricks/capture_runtime.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/databricks/dbr_init.sh +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/databricks/deploy_dev.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/databricks/generate_constraints.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/databricks/notebook_setup.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/experiments/capture_notebook_outputs.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/experiments/cell_profiling.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/experiments/compare_exploration_runs.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/experiments/compare_versions.sh +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/experiments/patch_dataset_config.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/generate_requirements.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/notebooks/build_causal_notebooks.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/notebooks/clean_notebook_outputs.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/notebooks/export_tutorial_html.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/notebooks/init_project.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/notebooks/migrate_notebook_cell_ids.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/notebooks/plotly_image_preprocessor.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/notebooks/run_exploration.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/notebooks/sync_notebooks.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/notebooks/tag_framework_cells.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/notebooks/tag_markdown_cells.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/notebooks/test_notebooks.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/release.sh +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/seed_playbooks_volume.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/templates/tutorial_html/conf.json +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/templates/tutorial_html/index.html.j2 +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/scripts/update_notebook_paths.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/active_dataset_store.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/analysis_context.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/column_describer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/dataset_fingerprinter.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/entity_timestamp_deriver.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/exploration_manager.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/explorer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/field_availability_audit.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/findings.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/intent_defaults.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/key_resolver.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/layered_recommendations.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/objective_support_communicator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/prediction_objective_detector.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/project_context.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/recommendation_builder.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/recommendations.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/run_namespace.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/sampling.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/schema_report.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/service_unit_detector.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/session.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/skip_logic.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/snapshot_grid.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/business/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/business/ab_test_designer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/business/fairness_analyzer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/business/intervention_matcher.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/business/ratio_features.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/business/report_generator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/business/risk_profile.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/business/roi_analyzer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/diagnostics/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/diagnostics/calibration_analyzer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/diagnostics/cv_analyzer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/diagnostics/error_analyzer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/diagnostics/exploration_ledger.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/diagnostics/feature_provenance.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/diagnostics/feature_stability.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/diagnostics/leakage_detector.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/diagnostics/model_diagnostics_report.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/diagnostics/noise_tester.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/diagnostics/overfitting_analyzer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/diagnostics/parity_report.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/diagnostics/segment_analyzer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/discovery/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/discovery/config_generator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/discovery/discovery_flow.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/discovery/type_inferencer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/interpretability/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/interpretability/cohort_analyzer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/interpretability/counterfactual.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/interpretability/individual_explainer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/interpretability/pdp_generator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/interpretability/shap_explainer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/jupyter_save_hook.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/notebook_html_exporter.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/notebook_progress.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/plotly_preprocessor.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/recommendations/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/recommendations/base.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/recommendations/cleaning/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/recommendations/cleaning/consistency.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/recommendations/cleaning/deduplicate.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/recommendations/cleaning/impute.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/recommendations/cleaning/outlier.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/recommendations/datetime/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/recommendations/datetime/extract.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/recommendations/encoding/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/recommendations/encoding/categorical.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/recommendations/pipeline.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/recommendations/registry.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/recommendations/selection/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/recommendations/selection/drop_column.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/recommendations/transform/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/recommendations/transform/power.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/recommendations/transform/scale.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/visualization/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/visualization/attention_scorer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/visualization/chart_builder.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/visualization/column_paginator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/visualization/console.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/visualization/display.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/visualization/number_formatter.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/artifacts/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/artifacts/fit_artifact_registry.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/cli.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/compat/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/compat/bulk_profiling.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/compat/cell_profiling_hooks.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/compat/detection.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/compat/ops.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/compat/pandas_backend.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/compat/remote_path.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/compat/spark_backend.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/compat/timing.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/components/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/components/base.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/components/components/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/components/components/deployer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/components/components/explainer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/components/components/feature_eng.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/components/components/ingester.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/components/components/profiler.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/components/components/trainer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/components/components/transformer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/components/components/validator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/components/enums.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/components/orchestrator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/components/registry.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/config/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/config/column_config.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/config/experiments.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/config/pipeline_config.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/config/source_config.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/naming.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/utils/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/utils/leakage.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/utils/severity.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/core/utils/statistics.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/base.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/cell_builder.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/config.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/databricks_generator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/local_generator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/project_init.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/runner.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/scoring_replay.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/script_generator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/base_stage.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/causal_setup_cell.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/s01_ingestion.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/s02_profiling.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/s03_cleaning.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/s04_transformation.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/s05_feature_engineering.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/s06_feature_selection.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/s07_model_training.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/s08_deployment.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/s09_monitoring.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/s10_batch_inference.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/s11_feature_store.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/s_c01_publish_definitions.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/s_c02_archetype_derivation.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/s_c03_approval_gate.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/s_c04_batch_inference.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_generator/stages/s_c05_snapshot_and_dashboard.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_merge/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_merge/cli.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_merge/config_merger.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_merge/config_parser.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_merge/conflict.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_merge/merge_engine.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_merge/merge_report.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_sync/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_sync/cell_id_standardizer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_sync/cell_types.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_sync/cli.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_sync/sync_engine.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/notebook_sync/sync_report.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/orchestration/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/orchestration/code_generator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/orchestration/context.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/orchestration/data_materializer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/orchestration/databricks_exporter.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/orchestration/doc_generator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/pipeline_generator/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/pipeline_generator/databricks_generator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/pipeline_generator/databricks_renderer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/pipeline_generator/exploration_generator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/pipeline_generator/generation_manifest.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/pipeline_generator/generator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/pipeline_generator/gold_transform_applicator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/pipeline_generator/llm_docs_generator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/pipeline_generator/models.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/pipeline_generator/override_merge.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/pipeline_generator/protocols.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/pipeline_generator/renderer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/pipeline_generator/user_extensions_emitter.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/spec_generator/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/generators/spec_generator/mlflow_pipeline_generator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/adapters/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/adapters/base.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/adapters/factory.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/adapters/feature_store/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/adapters/feature_store/base.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/adapters/feature_store/databricks.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/adapters/feature_store/feast_adapter.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/adapters/feature_store/local.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/adapters/mlflow/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/adapters/mlflow/base.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/adapters/mlflow/databricks.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/adapters/mlflow/experiment_tracker.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/adapters/mlflow/local.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/adapters/storage/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/adapters/storage/base.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/adapters/storage/databricks.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/adapters/storage/local.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/databricks_init.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/databricks_job_capture.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/feature_store/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/feature_store/definitions.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/feature_store/manager.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/feature_store/registry.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/iteration/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/iteration/context.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/iteration/feedback_collector.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/iteration/orchestrator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/iteration/recommendation_tracker.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/iteration/signals.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/llm_context/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/llm_context/context_builder.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/llm_context/prompts.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/requirements_generator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/streaming/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/streaming/batch_integration.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/streaming/early_warning_model.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/streaming/event_schema.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/streaming/online_store_writer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/streaming/realtime_scorer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/streaming/trigger_engine.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/integrations/streaming/window_aggregator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/runtime/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/runtime/api.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/runtime/dataset_resolution.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/runtime/decorator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/runtime/flags.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/runtime/harvest.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/runtime/logging.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/runtime/persistence.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/runtime/registry.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/runtime/replay.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/runtime/summary.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/runtime/validation.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/approval_gate.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/clusterer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/column_descriptions_writer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/dashboard_profile_override.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/dashboard_views.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/delta_writer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/derivation.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/feature_meta_writer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/interpretation/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/interpretation/archetype_context.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/interpretation/business_phrase.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/interpretation/discovery.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/interpretation/enrichment_pipeline.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/interpretation/feature_meta_builder.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/interpretation/llm_prompt.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/interpretation/markdown_bootstrap.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/interpretation/predicate_prose.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/interpretation/prose_backfill.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/interpretation/quantile_phrasing.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/interpretation/sidecars.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/llm_namer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/playbook_loader.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/playbook_mapper.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/policy_loader.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/population_stats.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/predicate_compiler.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/rule_extractor.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/run_context_writer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/schemas.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/seed_yamls/decision_policy.yaml +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/seed_yamls/response_schemas.yaml +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/seed_yamls/vocabularies.yaml +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/shap_runner.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/snapshot_writer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/sql/dashboard_views.sql +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/causal/top_drivers_writer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/cleaning/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/cleaning/base.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/cleaning/missing_handler.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/cleaning/outlier_handler.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/deployment/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/deployment/batch_scorer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/deployment/champion_challenger.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/deployment/model_registry.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/deployment/retraining_trigger.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/features/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/features/behavioral_features.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/features/customer_segmentation.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/features/feature_definitions.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/features/feature_engineer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/features/feature_manifest.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/features/feature_selector.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/features/interaction_features.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/features/temporal_features.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/ingestion/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/ingestion/load_result.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/ingestion/loaders.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/ingestion/source_registry.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/lifecycle/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/lifecycle/config.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/lifecycle/enrich.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/lifecycle/validation.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/modeling/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/modeling/baseline_trainer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/modeling/cross_validator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/modeling/data_splitter.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/modeling/feature_profile.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/modeling/feature_scaler.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/modeling/feature_spec.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/modeling/hyperparameter_tuner.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/modeling/imbalance_handler.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/modeling/mlflow_logger.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/modeling/model_comparator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/modeling/model_evaluator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/modeling/shap_attribution.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/modeling/spark_baseline_trainer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/modeling/spark_classifier_wrapper.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/modeling/spark_feature_scaler.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/modeling/threshold_optimizer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/modeling/training_preparator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/monitoring/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/monitoring/alert_manager.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/monitoring/drift_detector.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/monitoring/performance_monitor.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/preprocessing/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/preprocessing/transformer_manager.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/categorical_distribution.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/categorical_target_analyzer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/column_profiler.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/distribution_analysis.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/drift_detector.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/feature_capacity.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/pattern_analysis_config.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/profile_result.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/quality_checks.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/recommendation_filter.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/relationship_detector.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/relationship_recommender.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/report_generator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/scd_analyzer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/segment_analyzer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/segment_aware_outlier.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/spark_segment_analyzer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/spark_temporal_feature_analyzer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/spark_temporal_feature_engineer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/spark_time_window_aggregator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/stats_helpers.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/target_level_analyzer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/target_validator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/temporal_analyzer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/temporal_coverage.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/temporal_feature_analyzer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/temporal_feature_engineer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/temporal_pattern_analyzer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/temporal_quality_checks.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/temporal_target_analyzer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/text_embedder.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/text_processor.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/text_reducer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/time_series_profiler.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/time_window_aggregator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/type_detector.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/profiling/window_recommendation.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/scd_history/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/scd_history/augment.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/scd_history/config.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/scd_history/reconstruct.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/scd_history/validation.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/scoring/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/scoring/batch_inference.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/scoring/config.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/scoring/data_loader.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/scoring/exceptions.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/scoring/pipeline_discovery.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/temporal/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/temporal/access_guard.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/temporal/data_preparer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/temporal/point_in_time_join.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/temporal/point_in_time_registry.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/temporal/scenario_detector.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/temporal/snapshot_manager.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/temporal/spark_temporal_merger.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/temporal/synthetic_coordinator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/temporal/temporal_merger.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/temporal/timestamp_discovery.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/temporal/timestamp_manager.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/transformation/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/transformation/binary_handler.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/transformation/categorical_encoder.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/transformation/datetime_transformer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/transformation/numeric_transformer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/transformation/pipeline.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/validation/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/validation/adversarial_scoring_validator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/validation/business_sense_gate.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/validation/data_quality_gate.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/validation/data_validators.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/validation/feature_quality_gate.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/validation/gates.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/validation/leakage_gate.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/validation/model_validity_gate.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/validation/pipeline_validation_runner.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/validation/quality_scorer.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/validation/rule_generator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/validation/scoring_pipeline_validator.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/stages/validation/timeseries_detector.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/transforms/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/transforms/artifact_store.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/transforms/executor.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/transforms/fitted.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/transforms/ops.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/transforms/spark_ops.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/tests/exploration_notebooks/test_distributed_dtype_safety.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/tests/exploration_notebooks/test_nb10_run_pipeline_ordering.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/tests/scripts/__init__.py +0 -0
- {churnkit-1.2.8a0 → churnkit-1.2.8a1}/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.2.
|
|
3
|
+
Version: 1.2.8a1
|
|
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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "churnkit"
|
|
3
|
-
version = "1.02.
|
|
3
|
+
version = "1.02.8a1"
|
|
4
4
|
description = "Structured ML framework for customer churn prediction -- from exploration notebooks to production pipelines, locally or on Databricks."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = {text = "Apache-2.0"}
|
|
@@ -1357,12 +1357,33 @@ class FindingsParser:
|
|
|
1357
1357
|
continue
|
|
1358
1358
|
target = config.landing.get(dataset)
|
|
1359
1359
|
if target is None:
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1360
|
+
# Entity-level target datasets (e.g. account in a churn run)
|
|
1361
|
+
# bypass the landing stage in `_build_landing_configs` —
|
|
1362
|
+
# the loop there iterates ``multi.event_datasets`` only.
|
|
1363
|
+
# Lazily synthesize a minimal LandingLayerConfig so the
|
|
1364
|
+
# cohort-scope predicate has a place to land. Bronze
|
|
1365
|
+
# entity scripts already read from `landing_<name>`
|
|
1366
|
+
# (FW-19), so a generated `landing_<dataset>.py` that
|
|
1367
|
+
# reads upstream and applies the filter integrates with
|
|
1368
|
+
# the existing wiring without renderer changes.
|
|
1369
|
+
if dataset == config.target_dataset:
|
|
1370
|
+
target = self._synthesize_target_landing_config(
|
|
1371
|
+
config, dataset
|
|
1372
|
+
)
|
|
1373
|
+
if target is None:
|
|
1374
|
+
logger.warning(
|
|
1375
|
+
"sample_filters: cannot synthesize landing for "
|
|
1376
|
+
"target dataset %r (no source_findings); skipping.",
|
|
1377
|
+
dataset,
|
|
1378
|
+
)
|
|
1379
|
+
continue
|
|
1380
|
+
else:
|
|
1381
|
+
logger.warning(
|
|
1382
|
+
"sample_filters: dataset %r not in pipeline landing config "
|
|
1383
|
+
"(known: %s); skipping.",
|
|
1384
|
+
dataset, sorted(config.landing.keys()),
|
|
1385
|
+
)
|
|
1386
|
+
continue
|
|
1366
1387
|
siblings = []
|
|
1367
1388
|
seen: set = set()
|
|
1368
1389
|
for match in self._SAMPLE_FILTER_SIBLING_RE.finditer(predicate):
|
|
@@ -1386,6 +1407,112 @@ class FindingsParser:
|
|
|
1386
1407
|
if deps:
|
|
1387
1408
|
self._reorder_landing_for_sibling_deps(config, deps)
|
|
1388
1409
|
|
|
1410
|
+
def _synthesize_target_landing_config(
|
|
1411
|
+
self, config: PipelineConfig, dataset: str
|
|
1412
|
+
) -> Optional[LandingLayerConfig]:
|
|
1413
|
+
"""Build a minimal ``LandingLayerConfig`` for an entity-level
|
|
1414
|
+
target dataset that ``_build_landing_configs`` skipped (its loop
|
|
1415
|
+
only handles event-level datasets). Used by FW-18 sample-filter
|
|
1416
|
+
replay so the cohort predicate can attach somewhere when the
|
|
1417
|
+
target dataset is entity-level.
|
|
1418
|
+
|
|
1419
|
+
The synthesized config carries enough to render a working
|
|
1420
|
+
landing script: source binding, raw_source_path, entity / time
|
|
1421
|
+
column hints. No lifecycle enrichments, no datetime_derivation —
|
|
1422
|
+
FW-18 only needs a place to drop the filter step. The downstream
|
|
1423
|
+
bronze_entity script already reads from ``landing_<dataset>``
|
|
1424
|
+
(FW-19), so adding this entry to ``config.landing`` causes a
|
|
1425
|
+
``landing_<dataset>.py`` script to be generated that the
|
|
1426
|
+
existing bronze step picks up automatically.
|
|
1427
|
+
"""
|
|
1428
|
+
source_cfg = next((s for s in config.sources if s.name == dataset), None)
|
|
1429
|
+
if source_cfg is None:
|
|
1430
|
+
return None
|
|
1431
|
+
# `parse()` does not stash source_findings on `self`, so reload the
|
|
1432
|
+
# target dataset's findings from disk on the namespace path. The
|
|
1433
|
+
# cost is one YAML read per synthesized entity-level target (≤1).
|
|
1434
|
+
# Used to populate entity_column / time_column hints AND build the
|
|
1435
|
+
# datetime_derivation config so `landing_<target>.py` produces the
|
|
1436
|
+
# *_delta_hours / *_dow / *_is_weekend columns the FeatureSpec
|
|
1437
|
+
# selected (otherwise bronze_entity_<target>.py reads landing
|
|
1438
|
+
# via FW-19 but the derived columns are absent — every windowed
|
|
1439
|
+
# datetime feature downstream falls into PARITY_IGNORED_FEATURES).
|
|
1440
|
+
findings_obj = None
|
|
1441
|
+
if self._namespace is not None:
|
|
1442
|
+
try:
|
|
1443
|
+
ds_dir = self._namespace.dataset_findings_dir(dataset)
|
|
1444
|
+
for fname in (f"{dataset}_findings.yaml",
|
|
1445
|
+
f"{dataset}_aggregated_findings.yaml"):
|
|
1446
|
+
fpath = ds_dir / fname
|
|
1447
|
+
if fpath.exists():
|
|
1448
|
+
from customer_retention.analysis.auto_explorer import (
|
|
1449
|
+
ExplorationFindings,
|
|
1450
|
+
)
|
|
1451
|
+
findings_obj = ExplorationFindings.load(fpath)
|
|
1452
|
+
break
|
|
1453
|
+
except Exception as exc:
|
|
1454
|
+
logger.warning(
|
|
1455
|
+
"sample_filters: could not load findings for synthesized "
|
|
1456
|
+
"landing[%r]: %s: %s",
|
|
1457
|
+
dataset, type(exc).__name__, exc,
|
|
1458
|
+
)
|
|
1459
|
+
|
|
1460
|
+
ts = getattr(findings_obj, "time_series_metadata", None) if findings_obj else None
|
|
1461
|
+
original_target = (
|
|
1462
|
+
self._resolve_original_target(findings_obj, config.target_column)
|
|
1463
|
+
if findings_obj is not None else None
|
|
1464
|
+
)
|
|
1465
|
+
raw_time_col = (
|
|
1466
|
+
self._resolve_raw_time_column(findings_obj)
|
|
1467
|
+
if findings_obj is not None else None
|
|
1468
|
+
)
|
|
1469
|
+
entity_col = (
|
|
1470
|
+
getattr(ts, "entity_column", None)
|
|
1471
|
+
or source_cfg.entity_key
|
|
1472
|
+
or "entity_id"
|
|
1473
|
+
)
|
|
1474
|
+
time_col = (
|
|
1475
|
+
getattr(ts, "time_column", None)
|
|
1476
|
+
or source_cfg.time_column
|
|
1477
|
+
or "as_of_date"
|
|
1478
|
+
)
|
|
1479
|
+
raw_source = self._resolve_raw_source(
|
|
1480
|
+
dataset,
|
|
1481
|
+
getattr(source_cfg, "raw_source_path", None) or source_cfg.path,
|
|
1482
|
+
)
|
|
1483
|
+
datetime_derivation = None
|
|
1484
|
+
if findings_obj is not None:
|
|
1485
|
+
try:
|
|
1486
|
+
datetime_derivation = self._build_datetime_derivation_config(
|
|
1487
|
+
findings_obj, "feature_timestamp", mask_future=True,
|
|
1488
|
+
)
|
|
1489
|
+
except Exception as exc:
|
|
1490
|
+
logger.warning(
|
|
1491
|
+
"sample_filters: could not build datetime_derivation for "
|
|
1492
|
+
"synthesized landing[%r]: %s: %s",
|
|
1493
|
+
dataset, type(exc).__name__, exc,
|
|
1494
|
+
)
|
|
1495
|
+
landing_cfg = LandingLayerConfig(
|
|
1496
|
+
source=source_cfg,
|
|
1497
|
+
raw_source_path=raw_source,
|
|
1498
|
+
raw_source_format=self._infer_format(raw_source),
|
|
1499
|
+
entity_column=entity_col,
|
|
1500
|
+
time_column=time_col,
|
|
1501
|
+
target_column=config.target_column or "target",
|
|
1502
|
+
original_target_column=original_target,
|
|
1503
|
+
raw_time_column=raw_time_col if raw_time_col and raw_time_col != time_col else None,
|
|
1504
|
+
datetime_derivation=datetime_derivation,
|
|
1505
|
+
)
|
|
1506
|
+
config.landing[dataset] = landing_cfg
|
|
1507
|
+
logger.info(
|
|
1508
|
+
"sample_filters: synthesized landing config for entity-level "
|
|
1509
|
+
"target dataset %r so the cohort predicate has a target step "
|
|
1510
|
+
"(datetime_derivation_sources=%r).",
|
|
1511
|
+
dataset,
|
|
1512
|
+
getattr(datetime_derivation, "source_columns", None),
|
|
1513
|
+
)
|
|
1514
|
+
return landing_cfg
|
|
1515
|
+
|
|
1389
1516
|
@staticmethod
|
|
1390
1517
|
def _reorder_landing_for_sibling_deps(
|
|
1391
1518
|
config: PipelineConfig, deps: Dict[str, List[str]]
|
|
@@ -1658,9 +1785,117 @@ class FindingsParser:
|
|
|
1658
1785
|
source_notebook=rec.source_notebook,
|
|
1659
1786
|
)
|
|
1660
1787
|
|
|
1788
|
+
def _augment_value_counts_from_silver_recs(
|
|
1789
|
+
self, registry: RecommendationRegistry
|
|
1790
|
+
) -> None:
|
|
1791
|
+
"""Back-fill ``_value_counts_by_source`` from silver_derived
|
|
1792
|
+
recommendation ``source_columns``.
|
|
1793
|
+
|
|
1794
|
+
The augment-from-spec pass (``_augment_value_counts_from_spec``)
|
|
1795
|
+
only sees values that appear in ``selected_features``. When the
|
|
1796
|
+
feature spec carries ``event_type_start_count_*`` but not
|
|
1797
|
+
``event_type_terminate_count_*`` (because terminate is the
|
|
1798
|
+
DENOMINATOR of a ratio, not a feature in itself), the unique_map
|
|
1799
|
+
for ``event_type`` ends up with ``['start']`` only, and the
|
|
1800
|
+
bronze-event predictor never emits ``event_type_terminate_count_*``.
|
|
1801
|
+
``_resolve_silver_derived_source`` then drops every
|
|
1802
|
+
``contract_terminate_to_start_ratio_*`` rec because its declared
|
|
1803
|
+
source columns aren't in the predicted set.
|
|
1804
|
+
|
|
1805
|
+
This pass walks ``registry.silver.derived_columns[*].source_columns``,
|
|
1806
|
+
parses each name as ``[<src>__]<col>_<val>_count_<window>``, and
|
|
1807
|
+
adds the harvested ``<val>`` to ``_value_counts_by_source[<src>][<col>]``.
|
|
1808
|
+
Same value-counts target column allow-list as the spec pass — only
|
|
1809
|
+
columns the operator declared as ``value_counts_columns`` for that
|
|
1810
|
+
source contribute. Idempotent: skips already-present values.
|
|
1811
|
+
"""
|
|
1812
|
+
if registry is None:
|
|
1813
|
+
return
|
|
1814
|
+
silver = getattr(registry, "silver", None)
|
|
1815
|
+
if silver is None:
|
|
1816
|
+
return
|
|
1817
|
+
recs = getattr(silver, "derived_columns", None) or []
|
|
1818
|
+
if not recs:
|
|
1819
|
+
return
|
|
1820
|
+
# Build per-source vc-targets the same way _augment_value_counts_from_spec
|
|
1821
|
+
# does so the heuristics match: only declared value_counts columns
|
|
1822
|
+
# contribute. This time the lookup also folds in registry-side
|
|
1823
|
+
# bronze_aggregations, so values from declarative `add_bronze_value_counts`
|
|
1824
|
+
# cells that NB10 didn't repeat in `BRONZE_AGGREGATIONS` still count.
|
|
1825
|
+
vc_targets_by_source: Dict[str, Set[str]] = {}
|
|
1826
|
+
overrides = getattr(self, "_bronze_aggregation_overrides", None) or {}
|
|
1827
|
+
for src, override in overrides.items():
|
|
1828
|
+
cols = override.get("value_counts_columns") if isinstance(override, dict) else None
|
|
1829
|
+
if cols:
|
|
1830
|
+
vc_targets_by_source[src] = set(cols)
|
|
1831
|
+
ba = getattr(registry, "bronze_aggregations", None) or {}
|
|
1832
|
+
if isinstance(ba, dict):
|
|
1833
|
+
for src, entry in ba.items():
|
|
1834
|
+
if isinstance(entry, dict):
|
|
1835
|
+
cols = entry.get("value_counts_columns") or []
|
|
1836
|
+
if cols:
|
|
1837
|
+
vc_targets_by_source.setdefault(src, set()).update(cols)
|
|
1838
|
+
if not vc_targets_by_source:
|
|
1839
|
+
return
|
|
1840
|
+
# Ensure _value_counts_by_source exists for the back-fill below.
|
|
1841
|
+
if not hasattr(self, "_value_counts_by_source"):
|
|
1842
|
+
self._value_counts_by_source = {}
|
|
1843
|
+
candidates: List[Tuple[str, str]] = sorted(
|
|
1844
|
+
((src, col) for src, cols in vc_targets_by_source.items() for col in cols),
|
|
1845
|
+
key=lambda pair: (-len(pair[1]), pair[0], pair[1]),
|
|
1846
|
+
)
|
|
1847
|
+
for rec in recs:
|
|
1848
|
+
params = getattr(rec, "parameters", None) or {}
|
|
1849
|
+
sources = list(params.get("source_columns") or [])
|
|
1850
|
+
for src_col in sources:
|
|
1851
|
+
if not isinstance(src_col, str):
|
|
1852
|
+
continue
|
|
1853
|
+
# When the source name carries a `<dataset>__` prefix,
|
|
1854
|
+
# anchor the value-counts lookup on that dataset only —
|
|
1855
|
+
# otherwise candidates iterate alphabetically and the
|
|
1856
|
+
# first declared dataset wins every parse, dropping
|
|
1857
|
+
# values for siblings (the `subscription__event_type_*`
|
|
1858
|
+
# case landed on `contract` before this fix).
|
|
1859
|
+
explicit_src: Optional[str] = None
|
|
1860
|
+
if "__" in src_col:
|
|
1861
|
+
head_src, bare = src_col.split("__", 1)
|
|
1862
|
+
if head_src in vc_targets_by_source:
|
|
1863
|
+
explicit_src = head_src
|
|
1864
|
+
else:
|
|
1865
|
+
bare = src_col
|
|
1866
|
+
m = FindingsParser._SPEC_TRAILING_WINDOW_RE.match(bare)
|
|
1867
|
+
if m is None:
|
|
1868
|
+
continue
|
|
1869
|
+
head = m.group("head")
|
|
1870
|
+
if explicit_src is not None:
|
|
1871
|
+
# Only consider candidates tied to the prefix-named source.
|
|
1872
|
+
src_candidates = [
|
|
1873
|
+
(s, c) for (s, c) in candidates if s == explicit_src
|
|
1874
|
+
]
|
|
1875
|
+
else:
|
|
1876
|
+
src_candidates = candidates
|
|
1877
|
+
for src, col in src_candidates:
|
|
1878
|
+
prefix = f"{col}_"
|
|
1879
|
+
if not head.startswith(prefix):
|
|
1880
|
+
continue
|
|
1881
|
+
val = head[len(prefix):]
|
|
1882
|
+
if not val:
|
|
1883
|
+
continue
|
|
1884
|
+
bucket = self._value_counts_by_source.setdefault(src, {})
|
|
1885
|
+
values = bucket.setdefault(col, [])
|
|
1886
|
+
if val not in values:
|
|
1887
|
+
values.append(val)
|
|
1888
|
+
break
|
|
1889
|
+
|
|
1661
1890
|
def _apply_silver_recommendations(self, config: PipelineConfig, registry: RecommendationRegistry) -> None:
|
|
1662
1891
|
if not hasattr(registry, "silver") or registry.silver is None:
|
|
1663
1892
|
return
|
|
1893
|
+
# FW-A4: back-fill value-counts unique_map from silver_derived
|
|
1894
|
+
# source_columns BEFORE the predictor runs. Without this, recs
|
|
1895
|
+
# like `contract_terminate_to_start_ratio_*` whose denominator
|
|
1896
|
+
# (`event_type_terminate_count_*`) isn't in selected_features
|
|
1897
|
+
# are silently dropped.
|
|
1898
|
+
self._augment_value_counts_from_silver_recs(registry)
|
|
1664
1899
|
predicted_silver, _ = self._predict_silver_post_merge_columns(config)
|
|
1665
1900
|
per_source_names = list(config.bronze.keys()) + [
|
|
1666
1901
|
n for n in config.bronze_event.keys() if n not in config.bronze
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/01a_a_temporal_text_deep_dive.ipynb
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/exploration_notebooks/04a_text_columns_deep_dive.ipynb
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/explorer.py
RENAMED
|
File without changes
|
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/findings.py
RENAMED
|
File without changes
|
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/key_resolver.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/run_namespace.py
RENAMED
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/sampling.py
RENAMED
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/schema_report.py
RENAMED
|
File without changes
|
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/session.py
RENAMED
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/skip_logic.py
RENAMED
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/auto_explorer/snapshot_grid.py
RENAMED
|
File without changes
|
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/business/ab_test_designer.py
RENAMED
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/business/fairness_analyzer.py
RENAMED
|
File without changes
|
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/business/ratio_features.py
RENAMED
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/business/report_generator.py
RENAMED
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/business/risk_profile.py
RENAMED
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/business/roi_analyzer.py
RENAMED
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/diagnostics/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/diagnostics/cv_analyzer.py
RENAMED
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/diagnostics/error_analyzer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{churnkit-1.2.8a0 → churnkit-1.2.8a1}/src/customer_retention/analysis/diagnostics/noise_tester.py
RENAMED
|
File without changes
|