churnkit 0.76.1a1__py3-none-any.whl → 0.76.1a2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/00_start_here.ipynb +10 -5
  2. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/01_data_discovery.ipynb +6 -6
  3. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/01a_a_temporal_text_deep_dive.ipynb +52 -46
  4. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/01a_temporal_deep_dive.ipynb +68 -65
  5. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/01b_temporal_quality.ipynb +12 -27
  6. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/01c_temporal_patterns.ipynb +216 -221
  7. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/01d_event_aggregation.ipynb +88 -81
  8. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/02_column_deep_dive.ipynb +111 -108
  9. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/02a_text_columns_deep_dive.ipynb +44 -38
  10. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/03_quality_assessment.ipynb +89 -85
  11. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/04_relationship_analysis.ipynb +81 -80
  12. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/05_multi_dataset.ipynb +83 -89
  13. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/06_feature_opportunities.ipynb +102 -98
  14. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/07_modeling_readiness.ipynb +32 -31
  15. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/08_baseline_experiments.ipynb +33 -29
  16. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/09_business_alignment.ipynb +6 -5
  17. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/10_spec_generation.ipynb +67 -63
  18. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/11_scoring_validation.ipynb +38 -23
  19. {churnkit-0.76.1a1.data → churnkit-0.76.1a2.data}/data/share/churnkit/exploration_notebooks/12_view_documentation.ipynb +3 -1
  20. {churnkit-0.76.1a1.dist-info → churnkit-0.76.1a2.dist-info}/METADATA +1 -1
  21. {churnkit-0.76.1a1.dist-info → churnkit-0.76.1a2.dist-info}/RECORD +30 -30
  22. customer_retention/__init__.py +1 -1
  23. customer_retention/analysis/auto_explorer/explorer.py +2 -2
  24. customer_retention/analysis/notebook_progress.py +4 -1
  25. customer_retention/core/compat/__init__.py +10 -0
  26. customer_retention/integrations/databricks_init.py +13 -0
  27. customer_retention/stages/profiling/column_profiler.py +9 -2
  28. {churnkit-0.76.1a1.dist-info → churnkit-0.76.1a2.dist-info}/WHEEL +0 -0
  29. {churnkit-0.76.1a1.dist-info → churnkit-0.76.1a2.dist-info}/entry_points.txt +0 -0
  30. {churnkit-0.76.1a1.dist-info → churnkit-0.76.1a2.dist-info}/licenses/LICENSE +0 -0
@@ -1,13 +1,13 @@
1
- customer_retention/__init__.py,sha256=fNqb1iL6Q95kXsIVQBbVJtV_NmNSWBtgbGZxRy7vuYM,1406
1
+ customer_retention/__init__.py,sha256=WoYIyGA62vbXjZNwi_JHtf4CH4bwc7jFm8fTryQFLzE,1406
2
2
  customer_retention/cli.py,sha256=Wdl540cZgu_9mV-hWmTV9jD3S8QTDR8Ik-5hQXYCvmg,2466
3
3
  customer_retention/analysis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  customer_retention/analysis/jupyter_save_hook.py,sha256=iiNFIL83yOPX8BGUjCE6Pt5Kc8X-2adtE1_NZTMUaZQ,947
5
5
  customer_retention/analysis/notebook_html_exporter.py,sha256=AMOTcD6nZncM4MPdVS1Kn4WF2YoaOoODMI2X48oEZ24,4491
6
- customer_retention/analysis/notebook_progress.py,sha256=Tm98ihaFQMXRAlEHTH89T23gLNZardzrCMC4svcoAUw,2463
6
+ customer_retention/analysis/notebook_progress.py,sha256=ojzkeL0m8JmB0_xfIhfijbrKG_SKRRc2Kk69vqxLehQ,2511
7
7
  customer_retention/analysis/plotly_preprocessor.py,sha256=Bdd_9-AmfmJdrmm030wzgpLflbiszp9KhXPbw_F5Id0,5300
8
8
  customer_retention/analysis/auto_explorer/__init__.py,sha256=0isViyt62QvDkYc2oxOhsDQ9RNMqBq1ihvwEZgoLb_s,1572
9
9
  customer_retention/analysis/auto_explorer/exploration_manager.py,sha256=60ObVRhYwAWqHnLrkeJ6_oQjPvXOl4gkLutE66_k8uc,18028
10
- customer_retention/analysis/auto_explorer/explorer.py,sha256=IFJ3K2TtTukB8ppn-wJ6JFMq8V3ZTLu9au5AZqjvtFM,13286
10
+ customer_retention/analysis/auto_explorer/explorer.py,sha256=bPz8iUZDZl3Bb6-RDpGIEqxWIMvZqwx-VV1tvugNaWY,13306
11
11
  customer_retention/analysis/auto_explorer/findings.py,sha256=frry7huqfDuP0VwE0AOn4zPr0TPiUYN8ESqanUYxRA4,11420
12
12
  customer_retention/analysis/auto_explorer/layered_recommendations.py,sha256=NcCzh92uI27ATze1_XAEcS1vzP8uu2bld8N6RYBWRTM,24392
13
13
  customer_retention/analysis/auto_explorer/recommendation_builder.py,sha256=7edPcLjpeOw1BiRO0J7M1DpdEdfAJrjVEfAe-v2IpYw,6225
@@ -63,7 +63,7 @@ customer_retention/analysis/visualization/number_formatter.py,sha256=I1gUB0tEmfT
63
63
  customer_retention/artifacts/__init__.py,sha256=zTROqiS6zlkkuCZgR6YOB0Cvlsyr0TpRBYsOEorpDYw,118
64
64
  customer_retention/artifacts/fit_artifact_registry.py,sha256=aNfZC0Dgbc6jEwRR5keDEop9jo_tuL82hKO3ouCh5eY,5750
65
65
  customer_retention/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
- customer_retention/core/compat/__init__.py,sha256=mriOzKG3GTe_fNvnES39BuEzgBcYO2Qa0RcqgcTVpec,7283
66
+ customer_retention/core/compat/__init__.py,sha256=H1unnElzwg9TMdJycKFHsOTc2CQr9SZTdbxVLUfjCcc,7612
67
67
  customer_retention/core/compat/detection.py,sha256=6W_1LefgQriBtRY2PnvSCUGDt0X63oIUEEVjFqG3qH0,2492
68
68
  customer_retention/core/compat/ops.py,sha256=L-tAh4A3UEfRvePS6rAbhqb0QtZ_bN-TV7ZWpTkMFLA,1809
69
69
  customer_retention/core/compat/pandas_backend.py,sha256=14JPoYTW6X-a3UwFaemhmPr8zi_GTdZnyitmqPQODR0,1839
@@ -131,7 +131,7 @@ customer_retention/generators/spec_generator/generic_generator.py,sha256=I_glnOO
131
131
  customer_retention/generators/spec_generator/mlflow_pipeline_generator.py,sha256=LME87sjzP_MjOMA3NTxqRfOhCroUJAb40BAnSH4-I74,29866
132
132
  customer_retention/generators/spec_generator/pipeline_spec.py,sha256=c8v1SWgTdeGmNs96l1hOS0qx1B1ua0iwPhw1I5w9OIo,10705
133
133
  customer_retention/integrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
134
- customer_retention/integrations/databricks_init.py,sha256=xQgCBhzx0DoGGGeocYX9Iu3H2dEl--bvA36T7_uF6TM,6526
134
+ customer_retention/integrations/databricks_init.py,sha256=kHlj1mTo5hB95zrwQdBFM6yktlKUFsK-AUjqSHec4n4,6923
135
135
  customer_retention/integrations/adapters/__init__.py,sha256=Fgdp0ESROTUHnOb2RN9Ubo0A4BdfoenOGuUz61lHz8g,583
136
136
  customer_retention/integrations/adapters/base.py,sha256=z6dVAowDKGogKsYGR7VMcLkS6VhcB9h4zgN1tilNYRg,254
137
137
  customer_retention/integrations/adapters/factory.py,sha256=CMsqOeDozADbWnk8fzktZvAyL1FEmUjDMvfDCpLDVaU,1202
@@ -213,7 +213,7 @@ customer_retention/stages/preprocessing/transformer_manager.py,sha256=-yDfUA5_No
213
213
  customer_retention/stages/profiling/__init__.py,sha256=9t4OJvV7DyI11zzN0ZkOi_pzCj_Qjp6BPpdpCA6-MKo,9884
214
214
  customer_retention/stages/profiling/categorical_distribution.py,sha256=kcbhpcIbdCcNJ9Cu_YiTz8cgUBTugrY5avMrL0Ymmd0,10704
215
215
  customer_retention/stages/profiling/categorical_target_analyzer.py,sha256=T-QvI0qW2R8aeamhuvSqglluMFUuJxdO9_lMLdU3Kr4,12077
216
- customer_retention/stages/profiling/column_profiler.py,sha256=WZKwPxpDmCQiBJBHB-y50Nwfd-m78XEDmhV0YtCDSok,20382
216
+ customer_retention/stages/profiling/column_profiler.py,sha256=tY8eQ0DQwVMmctDC4kNbbreXNdhRSPtVV8V1nz3fycY,20437
217
217
  customer_retention/stages/profiling/distribution_analysis.py,sha256=9v-QY41cuQI_Fuvjkqx1Q3QAcsSK8ThU43t8PRgD0uo,17052
218
218
  customer_retention/stages/profiling/drift_detector.py,sha256=I1OYr37ew-XB7sVp6VARqjH0eKZA1Rx0eOQNRJZTOMs,12681
219
219
  customer_retention/stages/profiling/feature_capacity.py,sha256=fP_sK2KxU6zpdfnIcAW313N451SXqHT1wv9psd5WhSk,19598
@@ -277,27 +277,27 @@ customer_retention/transforms/artifact_store.py,sha256=FYLpDcv2N6-dUTX5RPEIK3aCW
277
277
  customer_retention/transforms/executor.py,sha256=oML5dCidxbW_q6YUkAwWcutYP6bIFB6IdD3BvemK45A,6304
278
278
  customer_retention/transforms/fitted.py,sha256=3pNvnae-P3t3bKMeZz1Bl0xww-feapIYdoeTY6aUtI8,3278
279
279
  customer_retention/transforms/ops.py,sha256=Xg2g9UOOudq_y9Hf3oWsjpqw3dEoykQR5pDSoyW8GX0,4294
280
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/00_start_here.ipynb,sha256=zCyhftEd3v9fc0Ta6wvA6b-9LcoGzRi8bS1tMZ3iu9w,21911
281
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/01_data_discovery.ipynb,sha256=EDhWyKM2stHtWg2bS8HdRMItZ6WtokWRyZ90_MjTPFQ,46500
282
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/01a_a_temporal_text_deep_dive.ipynb,sha256=uai8T3iJSqOrabBQnVi8Z0k8zZGVgs_VVQWRHyXN8QU,33690
283
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/01a_temporal_deep_dive.ipynb,sha256=fC1ASNtvI8X1lAe-Lzcw3oX2cptDC-ymPeEtKKWhg20,67326
284
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/01b_temporal_quality.ipynb,sha256=RU5hxgrTVMZs1ytChVv1t49WpTO0Oj6B_Fu8g0xS0To,23039
285
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/01c_temporal_patterns.ipynb,sha256=ZGYfztP6JhOEwPmTYdC0l7w579fKXcNEJXq-PnCLc2I,153167
286
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/01d_event_aggregation.ipynb,sha256=-FT3SoBU0fhaZxGeTo-_UQl6riCrtoJaFnUg31opk64,63244
287
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/02_column_deep_dive.ipynb,sha256=mbP2LQWsXDyTsWg0bhrCBHEfHsEer_XOXRYV9f8JxAk,60250
288
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/02a_text_columns_deep_dive.ipynb,sha256=M9YN8yAjjuC6ZaUlc-rVqVLEkWd7Rc_GNILHS9qO3PU,29704
289
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/03_quality_assessment.ipynb,sha256=H49LLmn1PHbcbAvSQfteESRGk125QwkPI5qbLk3yZgc,68595
290
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/04_relationship_analysis.ipynb,sha256=Rr-B4-xg0ILuAIgztlZkiGJdTzLuNjOqBFxO8W4o9iU,78624
291
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/05_multi_dataset.ipynb,sha256=bBxkuZyTl1yZg4kMXO87WRjgZMhj_6hwLGX6m3XC270,62664
292
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/06_feature_opportunities.ipynb,sha256=cBJF5o4z3Z-dustQ4CVklnfTcQ8saG97tlgswWK9uWE,67409
293
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/07_modeling_readiness.ipynb,sha256=IiA04fyb-l097Glp3MtR03vPjQsZlS1Icg-hjEHa_Dg,28376
294
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/08_baseline_experiments.ipynb,sha256=KmjhnDf1JdpEiIcdfQ-ZFo_at6t9JRC30B6NmmvMBmg,34226
295
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/09_business_alignment.ipynb,sha256=tMNfGM7AH50N1ONzHhGW2HZLpQwraIxVzOiVnI-10X8,17214
296
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/10_spec_generation.ipynb,sha256=KeUdfL9Mvdi6023XpnfZ6oLEDNZaWiIHUfsAWig24mE,42847
297
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/11_scoring_validation.ipynb,sha256=5fi3eHMm03ZKZgdFAXMgydtZ3qX2TtR3L9bZS2MpWPE,49937
298
- churnkit-0.76.1a1.data/data/share/churnkit/exploration_notebooks/12_view_documentation.ipynb,sha256=aQF7CG8HxckqUKOKqnmZgMkSvfVzyO2LlYPrymLYjBY,4405
299
- churnkit-0.76.1a1.dist-info/METADATA,sha256=CkjX1u5qlqFbTuNbtFC93u25moHVAf2TaxYJwFAMWZY,13005
300
- churnkit-0.76.1a1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
301
- churnkit-0.76.1a1.dist-info/entry_points.txt,sha256=swQFVe-jjgQSBJQNO2Ulkz2F5odaE-TsnlTor3HQBjw,70
302
- churnkit-0.76.1a1.dist-info/licenses/LICENSE,sha256=Bud8Oj25tnpoIuXCWW0xcSfmGPeEZAAHrDRoKdSYtZY,11344
303
- churnkit-0.76.1a1.dist-info/RECORD,,
280
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/00_start_here.ipynb,sha256=FBfETZrERR885XQYGAYvwRDrffebfqLfhk_m9Lq8yjw,21927
281
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/01_data_discovery.ipynb,sha256=OwoSunIqy8E47xwjtmqQXst2e8rUj0dhsG-RAEAwggc,46459
282
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/01a_a_temporal_text_deep_dive.ipynb,sha256=Y4b2Fy2i9SO0cdTD5c9mFkVoScLfXNPdd9vFG2dLYTM,33396
283
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/01a_temporal_deep_dive.ipynb,sha256=cRyVDtDKhunz_CQP7e44SPxOcqIuntIrtt6dkdCNWOw,67114
284
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/01b_temporal_quality.ipynb,sha256=lxk2GrrpaemSgDg2u1Kr5buuJ37X3ZGo49vrgFtXuNc,22824
285
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/01c_temporal_patterns.ipynb,sha256=QI7ItAGNU20mRW9s0iCpUNdWkdXVIhZGMbZ6I8HXdHs,151565
286
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/01d_event_aggregation.ipynb,sha256=P0uCz8RkfGOutoXwZ5OyObHUKxaa78gYQfxwk7j9zSY,62919
287
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/02_column_deep_dive.ipynb,sha256=Eg1Zf2kMfKO3cZvcdy0AWH-3tgJJ228TVoy9wUEj82o,59793
288
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/02a_text_columns_deep_dive.ipynb,sha256=_uH1J-6djvBrJetEF4iVlLsB5N6uMRa3sk-Faf3izoo,29441
289
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/03_quality_assessment.ipynb,sha256=5wxPf3S-yhE19ViYu6_slAjzTaZ2oMbS9Uenj4TaB9U,68069
290
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/04_relationship_analysis.ipynb,sha256=iYbe9jfB_EbcisEmb2iUmKA2wYeC__nEuPZ-qAO5bV8,77948
291
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/05_multi_dataset.ipynb,sha256=G667NbSvjvPDCJq9n1RkrOa2yTBdkLsvWEyUhaXFep8,61927
292
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/06_feature_opportunities.ipynb,sha256=ZriCpdO_BFBfnxkp2zGWRRfeyZqI57yff5lhyh8l0W0,67027
293
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/07_modeling_readiness.ipynb,sha256=Mnk9O79SxHWt6UK0sn3auENW5MGVoozAY9ymxbbgdbU,28098
294
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/08_baseline_experiments.ipynb,sha256=9JA6kZ7DCe7Dk5YU2GXTPR6sbOJbVbBr4lBm7qVJQRA,33993
295
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/09_business_alignment.ipynb,sha256=uA-WyKnplytnb1rjrph5CPenA2WQ1l48Ix7qnT3DVSY,17013
296
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/10_spec_generation.ipynb,sha256=lGxwOpmpuTIRhihtnkkMWV0iS1hclCANRGrwLOksaEY,42453
297
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/11_scoring_validation.ipynb,sha256=PF8RuENHLyyHVUwFSqFoQ0VyEuzV2LSt_jclKCCCddk,49877
298
+ churnkit-0.76.1a2.data/data/share/churnkit/exploration_notebooks/12_view_documentation.ipynb,sha256=VaijwVQeiMpXP0SaEb7P_e_6V-FG9Ww9yGGaXvPZPJ0,4425
299
+ churnkit-0.76.1a2.dist-info/METADATA,sha256=Zj44SOAqqfJn01_4NId1QLm6XENcCBBrIf80MAdG9dM,13005
300
+ churnkit-0.76.1a2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
301
+ churnkit-0.76.1a2.dist-info/entry_points.txt,sha256=swQFVe-jjgQSBJQNO2Ulkz2F5odaE-TsnlTor3HQBjw,70
302
+ churnkit-0.76.1a2.dist-info/licenses/LICENSE,sha256=Bud8Oj25tnpoIuXCWW0xcSfmGPeEZAAHrDRoKdSYtZY,11344
303
+ churnkit-0.76.1a2.dist-info/RECORD,,
@@ -17,7 +17,7 @@ Main module categories:
17
17
  llm_context, iteration)
18
18
  """
19
19
 
20
- __version__ = "0.76.1a1"
20
+ __version__ = "0.76.1a2"
21
21
 
22
22
  # Environment utilities (always available)
23
23
  from .core.compat import (
@@ -2,7 +2,7 @@ import hashlib
2
2
  from pathlib import Path
3
3
  from typing import List, Optional, Union
4
4
 
5
- from customer_retention.core.compat import DataFrame, Series, pd, to_pandas
5
+ from customer_retention.core.compat import DataFrame, Series, pd, safe_memory_usage_bytes, to_pandas
6
6
  from customer_retention.core.config.column_config import ColumnType
7
7
  from customer_retention.stages.profiling import ProfilerFactory, TypeDetector
8
8
  from customer_retention.stages.temporal import TEMPORAL_METADATA_COLS
@@ -53,7 +53,7 @@ class DataExplorer:
53
53
  source_format=source_format,
54
54
  row_count=len(df),
55
55
  column_count=len(df.columns),
56
- memory_usage_mb=df.memory_usage(deep=True).sum() / (1024 * 1024)
56
+ memory_usage_mb=safe_memory_usage_bytes(df) / (1024 * 1024)
57
57
  )
58
58
 
59
59
  def _explore_all_columns(self, df: DataFrame, findings: ExplorationFindings, target_hint: Optional[str]):
@@ -27,7 +27,10 @@ def track_and_export_previous(current_notebook: str) -> None:
27
27
  Returns ``None`` — the export runs asynchronously.
28
28
  """
29
29
  experiments_dir = get_notebook_experiments_dir()
30
- experiments_dir.mkdir(parents=True, exist_ok=True)
30
+ try:
31
+ experiments_dir.mkdir(parents=True, exist_ok=True)
32
+ except OSError:
33
+ return
31
34
  progress_file = experiments_dir / "notebook_progress.json"
32
35
  docs_dir = experiments_dir / "docs"
33
36
 
@@ -167,6 +167,15 @@ def _infer_epoch_unit(value: int) -> str:
167
167
  return "s"
168
168
 
169
169
 
170
+ def safe_memory_usage_bytes(obj: Any) -> int:
171
+ """Return memory usage in bytes, returning 0 when unsupported (e.g. PySpark)."""
172
+ try:
173
+ usage = obj.memory_usage(deep=True)
174
+ return int(usage.sum()) if hasattr(usage, 'sum') else int(usage)
175
+ except Exception:
176
+ return 0
177
+
178
+
170
179
  def safe_to_datetime(series: Any, **kwargs: Any) -> _pandas.Series:
171
180
  """Convert a Series to datetime, handling Spark LongType epoch integers.
172
181
 
@@ -259,6 +268,7 @@ __all__ = [
259
268
  "is_notebook",
260
269
  "get_display_function",
261
270
  "get_dbutils",
271
+ "safe_memory_usage_bytes",
262
272
  "safe_to_datetime",
263
273
  "ensure_datetime_column",
264
274
  "ops",
@@ -47,6 +47,7 @@ def databricks_init(
47
47
  resolved_experiment_name = _make_absolute_experiment_path(resolved_experiment_name, workspace_path)
48
48
  _set_experiment_name_env_var(resolved_experiment_name)
49
49
  _reload_config_constants()
50
+ _ensure_experiments_volume_exists(catalog, schema)
50
51
  _setup_experiment_directories()
51
52
  _configure_mlflow_experiment(resolved_experiment_name)
52
53
  notebooks_copied: list[str] = []
@@ -96,6 +97,18 @@ def _reload_config_constants() -> None:
96
97
  reload_config()
97
98
 
98
99
 
100
+ def _ensure_experiments_volume_exists(catalog: str, schema: str) -> None:
101
+ from customer_retention.core.compat.detection import get_spark_session
102
+
103
+ spark = get_spark_session()
104
+ if not spark:
105
+ return
106
+ try:
107
+ spark.sql(f"CREATE VOLUME IF NOT EXISTS {catalog}.{schema}.experiments")
108
+ except Exception:
109
+ pass
110
+
111
+
99
112
  def _setup_experiment_directories() -> None:
100
113
  from customer_retention.core.config.experiments import setup_experiments_structure
101
114
 
@@ -4,7 +4,14 @@ from typing import Optional
4
4
 
5
5
  import numpy as np
6
6
 
7
- from customer_retention.core.compat import Timestamp, is_bool_dtype, is_datetime64_any_dtype, pd, to_datetime
7
+ from customer_retention.core.compat import (
8
+ Timestamp,
9
+ is_bool_dtype,
10
+ is_datetime64_any_dtype,
11
+ pd,
12
+ safe_memory_usage_bytes,
13
+ to_datetime,
14
+ )
8
15
  from customer_retention.core.config.column_config import ColumnType
9
16
 
10
17
  from .profile_result import (
@@ -31,7 +38,7 @@ class ColumnProfiler(ABC):
31
38
  most_common_value = value_counts.index[0] if len(value_counts) > 0 else None
32
39
  most_common_frequency = int(value_counts.iloc[0]) if len(value_counts) > 0 else None
33
40
 
34
- memory_size = series.memory_usage(deep=True)
41
+ memory_size = safe_memory_usage_bytes(series)
35
42
 
36
43
  return UniversalMetrics(
37
44
  total_count=total_count,