processbehavior 0.4.0__tar.gz → 0.6.0__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.
- {processbehavior-0.4.0 → processbehavior-0.6.0}/CHANGELOG.md +178 -1
- {processbehavior-0.4.0 → processbehavior-0.6.0}/CITATION.cff +1 -1
- {processbehavior-0.4.0 → processbehavior-0.6.0}/CONTRIBUTING.md +16 -8
- {processbehavior-0.4.0 → processbehavior-0.6.0}/PKG-INFO +40 -4
- {processbehavior-0.4.0 → processbehavior-0.6.0}/README.md +32 -1
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/__init__.py +1 -1
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/analysis.py +424 -204
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/analysis_dataset.py +7 -6
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/analysis_result.py +76 -6
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/capability.py +42 -14
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/data_preparation.py +13 -2
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/exceptions.py +4 -4
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/exporters/excel_exporter.py +32 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/focused_result.py +6 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/formulation_spec.py +6 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/loss_function.py +96 -23
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/maximum_information.py +5 -5
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/effects_charts.py +3 -2
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/plotter.py +1 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/renderers.py +4 -3
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/process_behavior.py +157 -63
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/residual_calculator.py +21 -21
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/result_tabular.py +26 -49
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/sds_detector.py +24 -11
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/signals/config.py +8 -5
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/signals/detector.py +1 -1
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/signals/detectors.py +17 -14
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/spc_constants.py +37 -26
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/study.py +142 -21
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/types.py +18 -4
- {processbehavior-0.4.0 → processbehavior-0.6.0}/pyproject.toml +7 -5
- processbehavior-0.6.0/tests/fixtures/data/wheeler_cavity_thickness.csv +401 -0
- processbehavior-0.6.0/tests/fixtures/golden_masters/paired_xbar_s/S_data.parquet +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/paired_xbar_s/S_metadata.json +1 -0
- processbehavior-0.6.0/tests/fixtures/golden_masters/paired_xbar_s/Xbar_data.parquet +0 -0
- {processbehavior-0.4.0/tests/fixtures/golden_masters/stratified_uneven → processbehavior-0.6.0/tests/fixtures/golden_masters/paired_xbar_s}/Xbar_metadata.json +1 -0
- processbehavior-0.6.0/tests/fixtures/golden_masters/phased_xbar_s/S_data.parquet +0 -0
- processbehavior-0.6.0/tests/fixtures/golden_masters/phased_xbar_s/S_metadata.json +53 -0
- processbehavior-0.6.0/tests/fixtures/golden_masters/phased_xbar_s/S_statistics.json +7 -0
- processbehavior-0.6.0/tests/fixtures/golden_masters/phased_xbar_s/Xbar_data.parquet +0 -0
- processbehavior-0.6.0/tests/fixtures/golden_masters/phased_xbar_s/Xbar_metadata.json +58 -0
- processbehavior-0.6.0/tests/fixtures/golden_masters/phased_xbar_s/Xbar_statistics.json +7 -0
- processbehavior-0.6.0/tests/fixtures/golden_masters/residual_chart/S_data.parquet +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/residual_chart/S_metadata.json +1 -0
- processbehavior-0.6.0/tests/fixtures/golden_masters/stratified_balanced/S_data.parquet +0 -0
- {processbehavior-0.4.0/tests/fixtures/golden_masters/stratified_uneven → processbehavior-0.6.0/tests/fixtures/golden_masters/stratified_balanced}/S_metadata.json +1 -0
- processbehavior-0.6.0/tests/fixtures/golden_masters/stratified_balanced/Xbar_data.parquet +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/stratified_balanced/Xbar_metadata.json +1 -0
- processbehavior-0.6.0/tests/fixtures/golden_masters/stratified_uneven/S_data.parquet +0 -0
- {processbehavior-0.4.0/tests/fixtures/golden_masters/stratified_balanced → processbehavior-0.6.0/tests/fixtures/golden_masters/stratified_uneven}/S_metadata.json +1 -0
- processbehavior-0.6.0/tests/fixtures/golden_masters/stratified_uneven/Xbar_data.parquet +0 -0
- {processbehavior-0.4.0/tests/fixtures/golden_masters/paired_xbar_s → processbehavior-0.6.0/tests/fixtures/golden_masters/stratified_uneven}/Xbar_metadata.json +1 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_ads3_charts.py +1 -1
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_analysis_golden_master.py +17 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_capability.py +2 -2
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_capability_window.py +23 -0
- processbehavior-0.6.0/tests/test_design_report_diagnostics.py +87 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_documented_rule_coverage.py +19 -2
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_effects_plotting.py +12 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_excel_export.py +38 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_garbage_character_handling.py +57 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_loss_function.py +8 -8
- processbehavior-0.6.0/tests/test_loss_reference.py +79 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_maximum_information.py +1 -1
- processbehavior-0.6.0/tests/test_nested_in_time.py +94 -0
- processbehavior-0.6.0/tests/test_ordered_categorical_lane_order.py +73 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_phased_limits.py +100 -12
- processbehavior-0.6.0/tests/test_phased_xbar_s.py +536 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_process_behavior.py +119 -15
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_r2_unavailable.py +1 -1
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_r6_effect.py +2 -2
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_recentering.py +1 -1
- processbehavior-0.6.0/tests/test_refresh_notebooks.py +104 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_residual_calculator.py +3 -3
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_result_tabular.py +97 -3
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_sds.py +3 -3
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_sds_detector.py +8 -6
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_signal_detectors.py +40 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_signals.py +1 -1
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_spc_constants.py +1 -1
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_supports_calibration.py +14 -1
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_unequal_subgroups.py +5 -5
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_vas_chart_constants.py +3 -3
- processbehavior-0.6.0/tests/test_xbar_s_helpers.py +153 -0
- processbehavior-0.4.0/examples/README.md +0 -10
- processbehavior-0.4.0/tests/fixtures/golden_masters/paired_xbar_s/S_data.parquet +0 -0
- processbehavior-0.4.0/tests/fixtures/golden_masters/paired_xbar_s/Xbar_data.parquet +0 -0
- processbehavior-0.4.0/tests/fixtures/golden_masters/residual_chart/S_data.parquet +0 -0
- processbehavior-0.4.0/tests/fixtures/golden_masters/stratified_balanced/S_data.parquet +0 -0
- processbehavior-0.4.0/tests/fixtures/golden_masters/stratified_balanced/Xbar_data.parquet +0 -0
- processbehavior-0.4.0/tests/fixtures/golden_masters/stratified_uneven/S_data.parquet +0 -0
- processbehavior-0.4.0/tests/fixtures/golden_masters/stratified_uneven/Xbar_data.parquet +0 -0
- processbehavior-0.4.0/tests/test_bishop_reference.py +0 -82
- {processbehavior-0.4.0 → processbehavior-0.6.0}/.gitignore +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/CODE_OF_CONDUCT.md +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/LICENSE +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/SECURITY.md +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/calibration.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/datasets/__init__.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/datasets/data/coffee_shop_demo_long.csv +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/datasets/loaders.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/datasets/synthetic.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/derivations.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/effects_calculator.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/exporters/__init__.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/__init__.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/_math.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/capability_chart.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/contracts.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/control_chart.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/lane_boundaries.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/limits.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/maximum_information_chart.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/report.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/residuals.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/run_rules_viz.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/stats_box.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/themes.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/x_axis_layout.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/zones.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/py.typed +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/result_signals.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/series_length.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/signals/__init__.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/signals/result.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/__init__.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/conftest.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/aco_medicare.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/known_effects_sds_1.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_inert_sds_1.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_inert_sds_2.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_inert_sds_3.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_inert_sds_4.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_inert_sds_5.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_inert_sds_6.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_sds_1.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_sds_2.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_sds_3.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_sds_4.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_sds_5.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_sds_6.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/coffee_capability_full_baseline.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/data/FILLWEIGHTDATA_800.csv +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/data/coffee_shop_demo_long.csv +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/missing_values/X_data.parquet +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/missing_values/X_metadata.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/missing_values/X_statistics.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/missing_values/mR_data.parquet +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/missing_values/mR_metadata.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/missing_values/mR_statistics.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/paired_xbar_s/S_statistics.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/paired_xbar_s/Xbar_statistics.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/paired_xmr_r/X_data.parquet +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/paired_xmr_r/X_metadata.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/paired_xmr_r/X_statistics.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/paired_xmr_r/mR_data.parquet +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/paired_xmr_r/mR_metadata.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/paired_xmr_r/mR_statistics.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/pathological_ordering/X_data.parquet +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/pathological_ordering/X_metadata.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/pathological_ordering/X_statistics.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/pathological_ordering/mR_data.parquet +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/pathological_ordering/mR_metadata.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/pathological_ordering/mR_statistics.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/residual_chart/S_statistics.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/single_obs_strata/X_data.parquet +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/single_obs_strata/X_metadata.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/single_obs_strata/X_statistics.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/single_obs_strata/mR_data.parquet +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/single_obs_strata/mR_metadata.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/single_obs_strata/mR_statistics.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/stratified_balanced/S_statistics.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/stratified_balanced/Xbar_statistics.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/stratified_uneven/S_statistics.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/stratified_uneven/Xbar_statistics.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/unstratified_small/X_data.parquet +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/unstratified_small/X_metadata.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/unstratified_small/X_statistics.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/unstratified_small/mR_data.parquet +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/unstratified_small/mR_metadata.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/unstratified_small/mR_statistics.json +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_analysis_bugs.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_analysis_dataset.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_analysis_result_contract.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_analysis_specifications.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_api_reference.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_beyond_limits_vectorized.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_bin_extremes.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_by_parameter.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_by_permutations.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_calibration.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_capability_chart.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_chart_availability.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_chart_column_contract.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_chart_parsing.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_control_chart_figure.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_data_preparation.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_datasets.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_derivations.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_derivations_robustness.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_design_state_lineage.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_edge_cases.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_effects_calculator.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_encode_rsg_vectorized.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_execute_validation.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_focus.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_init_cleaning.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_lane_boundaries.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_lane_connectors.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_limits_vectorized.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_manual_citations.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_na_in_factor_columns.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_notebook_ergonomics.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_p0_p2_regressions.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_performance.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_plotting.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_plotting_decorations.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_plotting_hardening.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_plotting_xaxis.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_recentered_mr_fix.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_reference_integrity.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_release_gate_0_1_0_checklist.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_residual_aliases.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_residual_labels.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_residual_scope.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_resolve_by_grouping.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_result_signals.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_sampling_plan.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_series_length.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_signal_result_surface.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_single_detection.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_solo_mr_residuals.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_srp_refactor.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_strata_companion.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_strata_sufficiency.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_stratified_insufficiency.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_synthetic.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_types.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_validate_by_parameter.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_weco_integration.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_why_not.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_x_axis_layout.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_xbar_residual_center.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_xbar_s_options.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_xbar_stratified.py +0 -0
- {processbehavior-0.4.0 → processbehavior-0.6.0}/validation/PBTESTDATABASE_T100.csv +0 -0
|
@@ -7,6 +7,181 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.6.0] - 2026-11-07
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **`validation/truth_report.py`.** It reports how closely the methods, as implemented, recover
|
|
14
|
+
answers known by construction: the PM INERT pure-noise data under all six missing-data
|
|
15
|
+
patterns, and Dr. Bishop's known-effects data. It is a report, not a gate.
|
|
16
|
+
- **Two design-report lines.** In ADS 3 the report says how many cells hold a single reading,
|
|
17
|
+
since one is enough to switch R2 for the whole study to the differencing method. When
|
|
18
|
+
conditions were observed in different periods, it says how far apart their average periods
|
|
19
|
+
are, since condition effects then average over different times.
|
|
20
|
+
- **`LossResult.reference`: what each loss part shows from noise alone.** The PDC, Time and
|
|
21
|
+
Interaction parts average squared deviations of estimated means, so with no effects each is
|
|
22
|
+
still above zero (about 14% interaction on the PM INERT pure-noise data). `reference` gives
|
|
23
|
+
the expected value of each under no effects for the study's own layout, exact for any
|
|
24
|
+
pattern of occupied cells and cell sizes, and the printed result shows it as a share of the
|
|
25
|
+
total. It is in `as_dict()` too. In ADS 2/3 the interaction is a remainder, so its reference
|
|
26
|
+
is `None`. Loss values are unchanged.
|
|
27
|
+
- **Windowed capability shows the window's own noise.** `CapabilityResult.window_sigma_r2` is
|
|
28
|
+
σ̂ from the window's R2 values, printed beside the full-study `sigma_hat_r2` that the
|
|
29
|
+
potential indices use. It appears only on windowed results; the default result is unchanged.
|
|
30
|
+
- **A Provenance sheet in Excel exports.** Written with the Summary sheet: library version,
|
|
31
|
+
time written, variables, input rows and rows analysed, design states, and a SHA-256
|
|
32
|
+
fingerprint of the analysed values. `AnalysisDataSet.n_input_rows` holds the input row count.
|
|
33
|
+
- **`validation/chance_signals.py`.** It reports how often charts signal on pure noise: X/mR
|
|
34
|
+
charts under the default rules (and mR with all eight), and the R3-R5 effect charts, whose
|
|
35
|
+
limits sit between about 2.2 and 4.4 standard deviations of the plotted points depending on
|
|
36
|
+
the chart and layout. A report, not a gate; its tables are in the WECO rules reference and
|
|
37
|
+
the residuals guide.
|
|
38
|
+
|
|
39
|
+
### Changed
|
|
40
|
+
- **Manual citations follow the 11-7 edition.** Dr. Bishop's manual of 2026-11-07 has 20 chapters
|
|
41
|
+
(chapters 7 and up are one lower than before) and dot-numbered captions; every equation and
|
|
42
|
+
chapter citation in the code, docs and tests now uses its numbering, in the hyphen form the
|
|
43
|
+
manual repository checks ("11-7 manual Eq 13-8"). Seven equations it removed are cited by
|
|
44
|
+
their replacements. No behaviour changes.
|
|
45
|
+
- **mR charts check Rule 1 only by default.** Wheeler reads the moving range chart for points
|
|
46
|
+
above its upper limit. The zone and run rules assume symmetric, independent points, and
|
|
47
|
+
successive moving ranges share a reading, so with all eight rules on, 95% of 100-point
|
|
48
|
+
pure-noise mR charts showed a signal (59% with Rule 1 alone). X charts still check all eight.
|
|
49
|
+
`rules='all'` restores the old behaviour. Signal counts on mR charts drop.
|
|
50
|
+
- **The validation page says what is compared with VAS.** It claimed "every analytical
|
|
51
|
+
output"; the gate compares chart centres and limits, capability indices and loss shares. The
|
|
52
|
+
page now lists what is not compared (residual values one by one, signals, staged charts,
|
|
53
|
+
effects tables, calibrations, capability windows, the design report) and points to the truth
|
|
54
|
+
report. The `detect_signals()` docstring no longer says Rules 1-4 are the default.
|
|
55
|
+
|
|
56
|
+
### Fixed
|
|
57
|
+
- **Tutorial outputs match the library again.** The docs site shows each notebook's saved outputs,
|
|
58
|
+
and eight tutorials had drifted: limits from before 0.4.0 in the Design-State-1 analysis, flat
|
|
59
|
+
limits where they now vary by subgroup size in the reference validation, older process means and
|
|
60
|
+
signal counts. All were re-executed. The Derived Variables tutorial, saved without outputs, now
|
|
61
|
+
shows them. Prose that the new outputs contradicted was corrected; the Bishop reference values in
|
|
62
|
+
the reference validation now quote his VAS rerun of 13 October 2026.
|
|
63
|
+
- **The factor x time interaction chart draws its lines in factor order on every machine.** It
|
|
64
|
+
sorted by time with an unstable sort, so the legend order, and the colour each line got, depended
|
|
65
|
+
on the numpy version.
|
|
66
|
+
- **Three signal rules now match their definitions.** Rule 5 (trend) fired only on 7 rising or
|
|
67
|
+
falling points, not 6; Rule 6 (oscillation) only on 15 alternating points, not 14; and Rule 2
|
|
68
|
+
counted only points in Zone A, leaving out points beyond 3σ, which Western Electric and Wheeler
|
|
69
|
+
count as "beyond 2σ". The docs, the rule descriptions and the minimum-observation table already
|
|
70
|
+
said 6, 14 and "Zone A or beyond". X charts may show slightly more signals; on 100 points of
|
|
71
|
+
pure noise, the share with a signal under the eight default rules rises from 70% to 79%.
|
|
72
|
+
- **The WECO rules page gives correct chance rates.** Six of its eight per-rule false-alarm rates
|
|
73
|
+
were wrong (for example 0.003% for 15 points hugging the centre, where it is 0.33%), and its
|
|
74
|
+
rule-set table had no source. The rates are now exact per-window figures, the table is measured
|
|
75
|
+
by `validation/chance_signals.py`, and the wording no longer says a signal is "almost certainly"
|
|
76
|
+
a special cause.
|
|
77
|
+
- **Commas in numbers stored as text are no longer misread.** A comma was removed wherever it
|
|
78
|
+
appeared, so a decimal comma such as `10,4` became 104; and a lone `10,4` in a column of plain
|
|
79
|
+
numbers silently became missing. Commas are now read one way per column: as decimal points
|
|
80
|
+
when the column has no `.` and some comma is not a thousands group, otherwise only as
|
|
81
|
+
separators between groups of three digits. Any other comma value becomes missing and is named.
|
|
82
|
+
- **The numeric-cleaning warning says what happened.** It counts the values actually reformatted
|
|
83
|
+
(it used to count every value in the column), gives examples, says when commas were read as
|
|
84
|
+
decimal points, and names the values that could not be read. A column of plain numeric strings
|
|
85
|
+
no longer warns.
|
|
86
|
+
- **A factor nested in time is named.** When every time period holds one level of a factor (a
|
|
87
|
+
stage, a before/after split), the design report says so beside the empty-cell count, and
|
|
88
|
+
`loss_function()` warns that the PDC and Time parts both contain that factor's effect, so the
|
|
89
|
+
decomposition counts it more than once. It points to staged charts instead. Loss values are
|
|
90
|
+
unchanged.
|
|
91
|
+
- **The design report no longer says "Complete structure" when there is nothing to compare.**
|
|
92
|
+
Without a sampling plan the structure line reads "Not checked (no sampling plan supplied)". It
|
|
93
|
+
used to say "Complete structure", even beside hundreds of empty cells.
|
|
94
|
+
- **Potential capability says why it is unavailable.** A study with no factors (such as one
|
|
95
|
+
stream of subgroups) or no time variable got "R2 residuals not available (ADS 1)". It now
|
|
96
|
+
says that Cp/Cpk use the VAS R2 residuals, which need at least one factor (or a time
|
|
97
|
+
variable), and that the study has none.
|
|
98
|
+
|
|
99
|
+
### Removed
|
|
100
|
+
- **`examples/` and `validation/effects_visualization.ipynb`.** These demos predated the 0.2.0
|
|
101
|
+
API (`ProcessDataFrame`, `study.sds`, moved data files) and no longer ran; nothing linked to
|
|
102
|
+
them. The maintained, CI-executed tutorials are in `docs/tutorials/`.
|
|
103
|
+
- **`tests/test_bishop_reference.py`.** Its one test compared residual values with a workbook
|
|
104
|
+
of Dr. Bishop's that is not in the repository, so it skipped on every run. Residual charts are
|
|
105
|
+
still compared with VAS through their limits.
|
|
106
|
+
|
|
107
|
+
### CI / Infrastructure
|
|
108
|
+
- **CI checks that docs notebooks match their saved outputs.** `scripts/refresh_notebooks.py`
|
|
109
|
+
re-executes the docs notebooks; with `--check` (in CI, replacing the nbmake run) it fails when a
|
|
110
|
+
notebook no longer runs or what a reader would see has changed, comparing printed text, tables
|
|
111
|
+
and each figure's data and labels. The `[test]` extra now needs nbclient, nbformat and ipykernel
|
|
112
|
+
instead of nbmake.
|
|
113
|
+
- **Python 3.14 is tested** on Ubuntu and Windows, in CI and in the release gate, and listed in
|
|
114
|
+
the package classifiers.
|
|
115
|
+
- **The truth report runs in CI.** `validation/truth_report.py` runs on every push (Ubuntu,
|
|
116
|
+
Python 3.13) and its output is kept as the `truth-report` artifact.
|
|
117
|
+
|
|
118
|
+
## [0.5.0] - 2026-10-29
|
|
119
|
+
|
|
120
|
+
This release adds staged (phased) Xbar and S charts, computed per stage as Dr. Bishop
|
|
121
|
+
specified (2026-10-18), with `phase_statistics()` for the numbers behind each stage on both
|
|
122
|
+
chart families. A column of values with no time is now charted in the order received.
|
|
123
|
+
|
|
124
|
+
### Added
|
|
125
|
+
- **A bare response is charted in the order received.** `formulate(response=...)` with no time,
|
|
126
|
+
factors or plan used to be refused. The values are now numbered 1..N in an `Observation` column
|
|
127
|
+
(the same numbers as `obs_id`) and the study is exactly the one `time='Observation'` gives: a
|
|
128
|
+
single stream, ADS 2, X/mR, sigma from N − 1 moving ranges. An NA response keeps its place as an
|
|
129
|
+
empty cell. The design report adds `Time: received order (no time column given)`. If the data
|
|
130
|
+
already has an `Observation` column, formulate asks you to pass it as `time=` or rename it (#129).
|
|
131
|
+
- **Phased limits on Xbar and S charts.** `execute(chart='Xbar', phased=True)` gives each factor
|
|
132
|
+
combination its own centre line and limits on one chart, drawn as stepped lines with a divider at
|
|
133
|
+
each change, the way phased X/mR already does for its lanes. Each phase is computed as a separate
|
|
134
|
+
Xbar/S analysis, exactly as `by=[time]` computes one chart per condition: the centre is the mean of
|
|
135
|
+
the phase's subgroup means, with its own S-bar and sigma-hat (10-12 manual Eqs 11-5, 11-8, 11-9,
|
|
136
|
+
11-16, 11-17). `by=['stage', time]` pools the other factors into the subgroup and phases on the
|
|
137
|
+
stage; the centre is then the mean of the pooled subgroup averages, as Dr. Bishop specified
|
|
138
|
+
(2026-10-18). On Wheeler's four-cavity thickness data the per-cavity centres and limits match
|
|
139
|
+
Minitab's staged Xbar-S chart. Residual values, calibrations and `by=[time]` are refused with
|
|
140
|
+
messages that say what to use instead; a phase with no replicated subgroup keeps its points without
|
|
141
|
+
limits and is named in `metadata['insufficient_phases']`. (#144)
|
|
142
|
+
- **`result.phase_statistics(chart, stratum=None)`.** One row per phase of a phased chart. Xbar/S:
|
|
143
|
+
`phase`, `subgroups`, `N`, `center`, `s_bar`, `sigma_hat`, `lpl`, `upl`. X/mR: `phase`, `points`,
|
|
144
|
+
`center`, `mR_bar`, `lpl`, `upl`, per stratum on a stratified chart (`stratum=`, or through
|
|
145
|
+
`focus()`). (#144)
|
|
146
|
+
- **Docs: a Staged Charts tutorial**, executed in CI. On the bundled coffee-shop data, with the
|
|
147
|
+
stage derived by one `.bin()` call, it compares one set of limits with limits per stage on Xbar
|
|
148
|
+
and S, reads `phase_statistics()`, puts every reading on a phased X/mR chart, and pools or splits
|
|
149
|
+
a second factor. The chart-types guide's staged example now runs as written, and its pooling
|
|
150
|
+
example uses a study that has a factor to pool. (#144)
|
|
151
|
+
|
|
152
|
+
### Changed
|
|
153
|
+
- **`formulate(response=..., factors=[])` with no time is the same study.** It used to treat the
|
|
154
|
+
whole column as one replicated cell: ADS 1, a recommended one-point Xbar chart, the "within-cell
|
|
155
|
+
replication" series-length line, and an X chart plotted against the response values. Its chart
|
|
156
|
+
tables now start with `Observation` (#129).
|
|
157
|
+
- **Xbar and S chart data carry `n`.** `get_chart('Xbar')` / `get_chart('S')`, and the Excel chart
|
|
158
|
+
sheets, gain an `n` column after the subgroup label. Unstratified Xbar/S metadata names the label
|
|
159
|
+
column as `group_col` (#143).
|
|
160
|
+
- **Lane dividers on an Xbar or S chart are labelled with the phase.** These charts have no time
|
|
161
|
+
column and so no cell band under the axis, which is where X charts name their lanes. (#144)
|
|
162
|
+
- **Phased chart data and `chart_table` carry a `phase` column** (the lane label) after the subgroup
|
|
163
|
+
label, on X/mR as well as Xbar/S. Phased Xbar/S metadata carries `phase_by`, `lane_boundaries`,
|
|
164
|
+
`single_point_phases` and `insufficient_phases`; `n_avg` is not reported on a phased chart, whose
|
|
165
|
+
`n_mode='average'` is applied per phase, so the per-phase mean size is `phase_statistics(chart)['N']`.
|
|
166
|
+
(#144)
|
|
167
|
+
|
|
168
|
+
### Fixed
|
|
169
|
+
- **Xbar/S `chart_table` keeps the subgroup label and `n` on every `by=`.** With a `by=` other than
|
|
170
|
+
time alone, such as a pooled subset (`by=['FACTOR 1', time]`), all factors, factors without time,
|
|
171
|
+
or one factor, the table dropped both columns, so a row couldn't be traced to its subgroup and
|
|
172
|
+
stepped limits went unexplained. `n` is now the aggregation's own count, which covers every cell
|
|
173
|
+
a pooled subgroup spans. This also corrects one row on residual charts whose limits rest on R2
|
|
174
|
+
(R1, R3, R4, R5) in a design with singletons: the stream's first cell, where R2 is undefined at
|
|
175
|
+
the first value, showed its cell size, not the one-fewer values its S and limits use. Limits,
|
|
176
|
+
centres and statistics are unchanged (#143).
|
|
177
|
+
- **`execute()` no longer documents `phased=True` as requiring `by=[]`.** Stratified phasing of X/mR
|
|
178
|
+
(`by=['factor 1'], phased=True`) has been accepted since 75bcdd1; the docstring never caught up. (#144)
|
|
179
|
+
- **The companion mR of a phased X chart reports `single_point_phases`.** Only the solo mR did. (#144)
|
|
180
|
+
- **X/mR lane order honours an ordered pandas Categorical factor.** A stage column with categories
|
|
181
|
+
`before < after` already ordered the Xbar/S subgroups that way, but the canonical row order sorted
|
|
182
|
+
the raw labels, so X/mR lanes, phases and `strata` came out `after, before`. The canonical sort now
|
|
183
|
+
uses an ordered Categorical's category codes; plain string and numeric factors sort as before. (#144)
|
|
184
|
+
|
|
10
185
|
## [0.4.0] - 2026-10-14
|
|
11
186
|
|
|
12
187
|
This release aligns the library with Bishop's VAS documentation manual dated 10-12-2026 and
|
|
@@ -1114,7 +1289,9 @@ and may change between minor versions until 1.0.
|
|
|
1114
1289
|
- `natsort >= 8.0`
|
|
1115
1290
|
- `plotly >= 5.18, < 7`
|
|
1116
1291
|
|
|
1117
|
-
[Unreleased]: https://github.com/cnicholas/processbehavior/compare/v0.
|
|
1292
|
+
[Unreleased]: https://github.com/cnicholas/processbehavior/compare/v0.6.0...HEAD
|
|
1293
|
+
[0.6.0]: https://github.com/cnicholas/processbehavior/compare/v0.5.0...v0.6.0
|
|
1294
|
+
[0.5.0]: https://github.com/cnicholas/processbehavior/compare/v0.4.0...v0.5.0
|
|
1118
1295
|
[0.4.0]: https://github.com/cnicholas/processbehavior/compare/v0.3.3...v0.4.0
|
|
1119
1296
|
[0.3.3]: https://github.com/cnicholas/processbehavior/compare/v0.3.2...v0.3.3
|
|
1120
1297
|
[0.3.2]: https://github.com/cnicholas/processbehavior/compare/v0.3.1...v0.3.2
|
|
@@ -17,7 +17,7 @@ authors:
|
|
|
17
17
|
repository-code: "https://github.com/cnicholas/processbehavior"
|
|
18
18
|
url: "https://cnicholas.github.io/processbehavior/"
|
|
19
19
|
license: Apache-2.0
|
|
20
|
-
version: 0.
|
|
20
|
+
version: 0.6.0
|
|
21
21
|
keywords:
|
|
22
22
|
- statistical process control
|
|
23
23
|
- process behavior charts
|
|
@@ -74,13 +74,7 @@ The full test suite is the gate: if it fails, the change is not ready.
|
|
|
74
74
|
The file `validation/PBTESTDATABASE_T100.csv` is ground-truth Minitab output
|
|
75
75
|
for DS 1–6 from Bishop's reference materials. Numerical changes that touch
|
|
76
76
|
residuals (R1–R5), DS detection, limit calculations, or variance
|
|
77
|
-
decomposition must keep the
|
|
78
|
-
|
|
79
|
-
```bash
|
|
80
|
-
pytest tests/test_bishop_reference.py -v # skips unless Bishop's residual workbooks are present
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
There is also a full end-to-end check that compares every chart center, control
|
|
77
|
+
decomposition must keep the end-to-end check green. It compares every chart center, control
|
|
84
78
|
limit, capability index and loss component against Bishop's VAS runs for the
|
|
85
79
|
10-12-2026 manual (PM SDS 1–6, PM INERT, his known-effects data and the Medicare data):
|
|
86
80
|
|
|
@@ -97,10 +91,24 @@ summary.
|
|
|
97
91
|
If a Bishop check fails after your change, the change is wrong — not the
|
|
98
92
|
reference.
|
|
99
93
|
|
|
94
|
+
## Docs notebooks
|
|
95
|
+
|
|
96
|
+
The docs site shows each notebook's saved outputs; it does not run them. After a change that
|
|
97
|
+
alters what a notebook prints or plots, refresh the saved outputs:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
python scripts/refresh_notebooks.py # every docs notebook
|
|
101
|
+
python scripts/refresh_notebooks.py docs/tutorials/signal-detection.ipynb
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
CI runs `python scripts/refresh_notebooks.py --check` and fails when a notebook no longer runs or
|
|
105
|
+
no longer matches its saved outputs. Then read the text around any changed output: the check
|
|
106
|
+
compares outputs, not prose.
|
|
107
|
+
|
|
100
108
|
## Citing the methodology
|
|
101
109
|
|
|
102
110
|
Code and docs cite Bishop's VAS documentation manual by edition and equation number:
|
|
103
|
-
`(
|
|
111
|
+
`(11-7 manual Eq 13-8)`, `Eqs 13-4..13-13`, `Eqs 10-16/17`. Name the edition once per file and use
|
|
104
112
|
the chapter-number form; `tests/test_manual_citations.py` checks both. The citations are read
|
|
105
113
|
against the manual itself, so a new edition reports every place in the library whose equation
|
|
106
114
|
changed or moved.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: processbehavior
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.6.0
|
|
4
4
|
Summary: Python-native Process Behavior & Control Charts (spec-driven SPC with tidy outputs)
|
|
5
5
|
Project-URL: Homepage, https://github.com/cnicholas/processbehavior
|
|
6
6
|
Project-URL: Repository, https://github.com/cnicholas/processbehavior
|
|
@@ -21,6 +21,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
21
21
|
Classifier: Programming Language :: Python :: 3.11
|
|
22
22
|
Classifier: Programming Language :: Python :: 3.12
|
|
23
23
|
Classifier: Programming Language :: Python :: 3.13
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
24
25
|
Classifier: Topic :: Scientific/Engineering
|
|
25
26
|
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
26
27
|
Classifier: Typing :: Typed
|
|
@@ -33,12 +34,14 @@ Requires-Dist: typing-extensions>=4.0; python_version < '3.11'
|
|
|
33
34
|
Provides-Extra: dev
|
|
34
35
|
Requires-Dist: filelock>=3.20.3; extra == 'dev'
|
|
35
36
|
Requires-Dist: ipykernel; extra == 'dev'
|
|
37
|
+
Requires-Dist: ipykernel>=6; extra == 'dev'
|
|
36
38
|
Requires-Dist: jupyter-book>=2.0; extra == 'dev'
|
|
37
39
|
Requires-Dist: kaleido>=0.2; extra == 'dev'
|
|
38
40
|
Requires-Dist: lxml>=6.1.0; extra == 'dev'
|
|
39
41
|
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
42
|
+
Requires-Dist: nbclient>=0.10; extra == 'dev'
|
|
40
43
|
Requires-Dist: nbconvert>=7.17.1; extra == 'dev'
|
|
41
|
-
Requires-Dist:
|
|
44
|
+
Requires-Dist: nbformat>=5.10; extra == 'dev'
|
|
42
45
|
Requires-Dist: openpyxl>=3.1; extra == 'dev'
|
|
43
46
|
Requires-Dist: orjson>=3.11.6; extra == 'dev'
|
|
44
47
|
Requires-Dist: pillow>=12.2.0; extra == 'dev'
|
|
@@ -73,7 +76,9 @@ Requires-Dist: pre-commit>=3.7; extra == 'lint'
|
|
|
73
76
|
Requires-Dist: ruff>=0.5; extra == 'lint'
|
|
74
77
|
Requires-Dist: virtualenv>=20.36.1; extra == 'lint'
|
|
75
78
|
Provides-Extra: test
|
|
76
|
-
Requires-Dist:
|
|
79
|
+
Requires-Dist: ipykernel>=6; extra == 'test'
|
|
80
|
+
Requires-Dist: nbclient>=0.10; extra == 'test'
|
|
81
|
+
Requires-Dist: nbformat>=5.10; extra == 'test'
|
|
77
82
|
Requires-Dist: openpyxl>=3.1; extra == 'test'
|
|
78
83
|
Requires-Dist: pyarrow>=14.0; extra == 'test'
|
|
79
84
|
Requires-Dist: pytest-cov>=5; extra == 'test'
|
|
@@ -108,6 +113,22 @@ pip install "processbehavior[images]" # kaleido, for static plot images
|
|
|
108
113
|
|
|
109
114
|
## Quickstart
|
|
110
115
|
|
|
116
|
+
A column of values, charted in the order received, is an X/mR chart in two calls:
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
import pandas as pd
|
|
120
|
+
import processbehavior as pb
|
|
121
|
+
|
|
122
|
+
df = pd.DataFrame({'weight': [50.2, 49.8, 50.5, 50.1, 49.6, 50.9, 50.3, 49.9, 50.4, 50.0, 49.7, 50.6]})
|
|
123
|
+
|
|
124
|
+
study = pb.formulate(df, response='weight') # no time column: rows are numbered 1..N as 'Observation'
|
|
125
|
+
result = study.execute(companion=True) # X chart with its mR companion
|
|
126
|
+
print(result.statistics('X')) # {'N': 1, 'center': 50.167, 'lpl': 48.619, 'upl': 51.714}
|
|
127
|
+
result.plot()
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
When the data has a time order, factors, or both, name them. The design state routes the analysis:
|
|
131
|
+
|
|
111
132
|
```python
|
|
112
133
|
import processbehavior as pb
|
|
113
134
|
|
|
@@ -149,6 +170,20 @@ The whole pipeline is one expression when you don't need the intermediate object
|
|
|
149
170
|
pb.formulate(df, response='y', factors=['factor 1'], time='time').execute().plot()
|
|
150
171
|
```
|
|
151
172
|
|
|
173
|
+
A process that changed on purpose gets its own limits for each stage with `phased=True`:
|
|
174
|
+
|
|
175
|
+
```python
|
|
176
|
+
import processbehavior as pb
|
|
177
|
+
|
|
178
|
+
# The bundled coffee-shop data: a new machine in week 8, a new POS in week 12, new baristas from week 14
|
|
179
|
+
pbd = pb.load_coffee_shop().bin('week', method='breaks', breaks=[8, 12, 14],
|
|
180
|
+
bin_labels=['baseline', 'new machine', 'new POS', 'new baristas'],
|
|
181
|
+
label='stage')
|
|
182
|
+
staged = pbd.formulate(response='wait_sec', factors=['stage'], time='date').execute(chart='Xbar', phased=True, companion=True)
|
|
183
|
+
staged.phase_statistics('Xbar') # one row per stage: center, S-bar, sigma-hat, limits
|
|
184
|
+
staged.plot(chart='Xbar', title='Wait time: limits per stage')
|
|
185
|
+
```
|
|
186
|
+
|
|
152
187
|
Use `pb.ProcessBehavior(df)` directly when you want the fluent derived-variable verbs
|
|
153
188
|
(`.transform(...)`, `.bin(...)`), which attach before formulating. With that object in hand,
|
|
154
189
|
`pbd.cols.<column_name>` provides IDE auto-completion for column references.
|
|
@@ -251,7 +286,8 @@ The full report renders to `validation/e2e_bishop_report.html`.
|
|
|
251
286
|
- **Variance decomposition**: R1-R6 residuals for factorial designs
|
|
252
287
|
- **Effects analysis**: Main effects, time effects, and interaction effects
|
|
253
288
|
- **Stratified charts**: Automatic per-stratum limits for grouped individual data
|
|
254
|
-
- **
|
|
289
|
+
- **Staged charts**: `phased=True` gives each stage its own center and limits on X/mR and Xbar/S; `phase_statistics()` returns the numbers behind the steps
|
|
290
|
+
- **Signal detection**: all eight Western Electric rules on X charts; Rule 1 (3-sigma) on mR, Xbar and S, where the run- and zone-based rules don't fit: subgroup comparisons have no time order, and successive moving ranges share a reading
|
|
255
291
|
- **Beyond the charts**: capability indices (Cp/Cpk/Pp/Ppk), Taguchi loss decomposition, and maximum-information analysis — validated in the same Bishop-reference CI gate
|
|
256
292
|
- **IDE support**: Column auto-completion via `ProcessBehavior(df).cols`
|
|
257
293
|
- **Self-diagnostic errors**: Helpful messages that say what's available and how to fix it
|
|
@@ -25,6 +25,22 @@ pip install "processbehavior[images]" # kaleido, for static plot images
|
|
|
25
25
|
|
|
26
26
|
## Quickstart
|
|
27
27
|
|
|
28
|
+
A column of values, charted in the order received, is an X/mR chart in two calls:
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
import pandas as pd
|
|
32
|
+
import processbehavior as pb
|
|
33
|
+
|
|
34
|
+
df = pd.DataFrame({'weight': [50.2, 49.8, 50.5, 50.1, 49.6, 50.9, 50.3, 49.9, 50.4, 50.0, 49.7, 50.6]})
|
|
35
|
+
|
|
36
|
+
study = pb.formulate(df, response='weight') # no time column: rows are numbered 1..N as 'Observation'
|
|
37
|
+
result = study.execute(companion=True) # X chart with its mR companion
|
|
38
|
+
print(result.statistics('X')) # {'N': 1, 'center': 50.167, 'lpl': 48.619, 'upl': 51.714}
|
|
39
|
+
result.plot()
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
When the data has a time order, factors, or both, name them. The design state routes the analysis:
|
|
43
|
+
|
|
28
44
|
```python
|
|
29
45
|
import processbehavior as pb
|
|
30
46
|
|
|
@@ -66,6 +82,20 @@ The whole pipeline is one expression when you don't need the intermediate object
|
|
|
66
82
|
pb.formulate(df, response='y', factors=['factor 1'], time='time').execute().plot()
|
|
67
83
|
```
|
|
68
84
|
|
|
85
|
+
A process that changed on purpose gets its own limits for each stage with `phased=True`:
|
|
86
|
+
|
|
87
|
+
```python
|
|
88
|
+
import processbehavior as pb
|
|
89
|
+
|
|
90
|
+
# The bundled coffee-shop data: a new machine in week 8, a new POS in week 12, new baristas from week 14
|
|
91
|
+
pbd = pb.load_coffee_shop().bin('week', method='breaks', breaks=[8, 12, 14],
|
|
92
|
+
bin_labels=['baseline', 'new machine', 'new POS', 'new baristas'],
|
|
93
|
+
label='stage')
|
|
94
|
+
staged = pbd.formulate(response='wait_sec', factors=['stage'], time='date').execute(chart='Xbar', phased=True, companion=True)
|
|
95
|
+
staged.phase_statistics('Xbar') # one row per stage: center, S-bar, sigma-hat, limits
|
|
96
|
+
staged.plot(chart='Xbar', title='Wait time: limits per stage')
|
|
97
|
+
```
|
|
98
|
+
|
|
69
99
|
Use `pb.ProcessBehavior(df)` directly when you want the fluent derived-variable verbs
|
|
70
100
|
(`.transform(...)`, `.bin(...)`), which attach before formulating. With that object in hand,
|
|
71
101
|
`pbd.cols.<column_name>` provides IDE auto-completion for column references.
|
|
@@ -168,7 +198,8 @@ The full report renders to `validation/e2e_bishop_report.html`.
|
|
|
168
198
|
- **Variance decomposition**: R1-R6 residuals for factorial designs
|
|
169
199
|
- **Effects analysis**: Main effects, time effects, and interaction effects
|
|
170
200
|
- **Stratified charts**: Automatic per-stratum limits for grouped individual data
|
|
171
|
-
- **
|
|
201
|
+
- **Staged charts**: `phased=True` gives each stage its own center and limits on X/mR and Xbar/S; `phase_statistics()` returns the numbers behind the steps
|
|
202
|
+
- **Signal detection**: all eight Western Electric rules on X charts; Rule 1 (3-sigma) on mR, Xbar and S, where the run- and zone-based rules don't fit: subgroup comparisons have no time order, and successive moving ranges share a reading
|
|
172
203
|
- **Beyond the charts**: capability indices (Cp/Cpk/Pp/Ppk), Taguchi loss decomposition, and maximum-information analysis — validated in the same Bishop-reference CI gate
|
|
173
204
|
- **IDE support**: Column auto-completion via `ProcessBehavior(df).cols`
|
|
174
205
|
- **Self-diagnostic errors**: Helpful messages that say what's available and how to fix it
|
|
@@ -47,7 +47,7 @@ its ``.sds`` field. Internally some modules still use the legacy "SDS"
|
|
|
47
47
|
prefix (e.g. ``sds_detector.py``); the model itself is three-state.
|
|
48
48
|
"""
|
|
49
49
|
|
|
50
|
-
__version__ = '0.
|
|
50
|
+
__version__ = '0.6.0'
|
|
51
51
|
|
|
52
52
|
# Result object
|
|
53
53
|
from processbehavior.analysis_result import AnalysisResult
|