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.
Files changed (246) hide show
  1. {processbehavior-0.4.0 → processbehavior-0.6.0}/CHANGELOG.md +178 -1
  2. {processbehavior-0.4.0 → processbehavior-0.6.0}/CITATION.cff +1 -1
  3. {processbehavior-0.4.0 → processbehavior-0.6.0}/CONTRIBUTING.md +16 -8
  4. {processbehavior-0.4.0 → processbehavior-0.6.0}/PKG-INFO +40 -4
  5. {processbehavior-0.4.0 → processbehavior-0.6.0}/README.md +32 -1
  6. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/__init__.py +1 -1
  7. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/analysis.py +424 -204
  8. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/analysis_dataset.py +7 -6
  9. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/analysis_result.py +76 -6
  10. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/capability.py +42 -14
  11. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/data_preparation.py +13 -2
  12. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/exceptions.py +4 -4
  13. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/exporters/excel_exporter.py +32 -0
  14. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/focused_result.py +6 -0
  15. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/formulation_spec.py +6 -0
  16. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/loss_function.py +96 -23
  17. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/maximum_information.py +5 -5
  18. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/effects_charts.py +3 -2
  19. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/plotter.py +1 -0
  20. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/renderers.py +4 -3
  21. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/process_behavior.py +157 -63
  22. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/residual_calculator.py +21 -21
  23. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/result_tabular.py +26 -49
  24. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/sds_detector.py +24 -11
  25. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/signals/config.py +8 -5
  26. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/signals/detector.py +1 -1
  27. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/signals/detectors.py +17 -14
  28. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/spc_constants.py +37 -26
  29. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/study.py +142 -21
  30. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/types.py +18 -4
  31. {processbehavior-0.4.0 → processbehavior-0.6.0}/pyproject.toml +7 -5
  32. processbehavior-0.6.0/tests/fixtures/data/wheeler_cavity_thickness.csv +401 -0
  33. processbehavior-0.6.0/tests/fixtures/golden_masters/paired_xbar_s/S_data.parquet +0 -0
  34. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/paired_xbar_s/S_metadata.json +1 -0
  35. processbehavior-0.6.0/tests/fixtures/golden_masters/paired_xbar_s/Xbar_data.parquet +0 -0
  36. {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
  37. processbehavior-0.6.0/tests/fixtures/golden_masters/phased_xbar_s/S_data.parquet +0 -0
  38. processbehavior-0.6.0/tests/fixtures/golden_masters/phased_xbar_s/S_metadata.json +53 -0
  39. processbehavior-0.6.0/tests/fixtures/golden_masters/phased_xbar_s/S_statistics.json +7 -0
  40. processbehavior-0.6.0/tests/fixtures/golden_masters/phased_xbar_s/Xbar_data.parquet +0 -0
  41. processbehavior-0.6.0/tests/fixtures/golden_masters/phased_xbar_s/Xbar_metadata.json +58 -0
  42. processbehavior-0.6.0/tests/fixtures/golden_masters/phased_xbar_s/Xbar_statistics.json +7 -0
  43. processbehavior-0.6.0/tests/fixtures/golden_masters/residual_chart/S_data.parquet +0 -0
  44. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/residual_chart/S_metadata.json +1 -0
  45. processbehavior-0.6.0/tests/fixtures/golden_masters/stratified_balanced/S_data.parquet +0 -0
  46. {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
  47. processbehavior-0.6.0/tests/fixtures/golden_masters/stratified_balanced/Xbar_data.parquet +0 -0
  48. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/stratified_balanced/Xbar_metadata.json +1 -0
  49. processbehavior-0.6.0/tests/fixtures/golden_masters/stratified_uneven/S_data.parquet +0 -0
  50. {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
  51. processbehavior-0.6.0/tests/fixtures/golden_masters/stratified_uneven/Xbar_data.parquet +0 -0
  52. {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
  53. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_ads3_charts.py +1 -1
  54. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_analysis_golden_master.py +17 -0
  55. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_capability.py +2 -2
  56. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_capability_window.py +23 -0
  57. processbehavior-0.6.0/tests/test_design_report_diagnostics.py +87 -0
  58. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_documented_rule_coverage.py +19 -2
  59. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_effects_plotting.py +12 -0
  60. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_excel_export.py +38 -0
  61. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_garbage_character_handling.py +57 -0
  62. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_loss_function.py +8 -8
  63. processbehavior-0.6.0/tests/test_loss_reference.py +79 -0
  64. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_maximum_information.py +1 -1
  65. processbehavior-0.6.0/tests/test_nested_in_time.py +94 -0
  66. processbehavior-0.6.0/tests/test_ordered_categorical_lane_order.py +73 -0
  67. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_phased_limits.py +100 -12
  68. processbehavior-0.6.0/tests/test_phased_xbar_s.py +536 -0
  69. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_process_behavior.py +119 -15
  70. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_r2_unavailable.py +1 -1
  71. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_r6_effect.py +2 -2
  72. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_recentering.py +1 -1
  73. processbehavior-0.6.0/tests/test_refresh_notebooks.py +104 -0
  74. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_residual_calculator.py +3 -3
  75. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_result_tabular.py +97 -3
  76. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_sds.py +3 -3
  77. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_sds_detector.py +8 -6
  78. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_signal_detectors.py +40 -0
  79. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_signals.py +1 -1
  80. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_spc_constants.py +1 -1
  81. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_supports_calibration.py +14 -1
  82. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_unequal_subgroups.py +5 -5
  83. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_vas_chart_constants.py +3 -3
  84. processbehavior-0.6.0/tests/test_xbar_s_helpers.py +153 -0
  85. processbehavior-0.4.0/examples/README.md +0 -10
  86. processbehavior-0.4.0/tests/fixtures/golden_masters/paired_xbar_s/S_data.parquet +0 -0
  87. processbehavior-0.4.0/tests/fixtures/golden_masters/paired_xbar_s/Xbar_data.parquet +0 -0
  88. processbehavior-0.4.0/tests/fixtures/golden_masters/residual_chart/S_data.parquet +0 -0
  89. processbehavior-0.4.0/tests/fixtures/golden_masters/stratified_balanced/S_data.parquet +0 -0
  90. processbehavior-0.4.0/tests/fixtures/golden_masters/stratified_balanced/Xbar_data.parquet +0 -0
  91. processbehavior-0.4.0/tests/fixtures/golden_masters/stratified_uneven/S_data.parquet +0 -0
  92. processbehavior-0.4.0/tests/fixtures/golden_masters/stratified_uneven/Xbar_data.parquet +0 -0
  93. processbehavior-0.4.0/tests/test_bishop_reference.py +0 -82
  94. {processbehavior-0.4.0 → processbehavior-0.6.0}/.gitignore +0 -0
  95. {processbehavior-0.4.0 → processbehavior-0.6.0}/CODE_OF_CONDUCT.md +0 -0
  96. {processbehavior-0.4.0 → processbehavior-0.6.0}/LICENSE +0 -0
  97. {processbehavior-0.4.0 → processbehavior-0.6.0}/SECURITY.md +0 -0
  98. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/calibration.py +0 -0
  99. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/datasets/__init__.py +0 -0
  100. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/datasets/data/coffee_shop_demo_long.csv +0 -0
  101. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/datasets/loaders.py +0 -0
  102. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/datasets/synthetic.py +0 -0
  103. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/derivations.py +0 -0
  104. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/effects_calculator.py +0 -0
  105. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/exporters/__init__.py +0 -0
  106. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/__init__.py +0 -0
  107. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/_math.py +0 -0
  108. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/capability_chart.py +0 -0
  109. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/contracts.py +0 -0
  110. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/control_chart.py +0 -0
  111. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/lane_boundaries.py +0 -0
  112. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/limits.py +0 -0
  113. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/maximum_information_chart.py +0 -0
  114. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/report.py +0 -0
  115. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/residuals.py +0 -0
  116. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/run_rules_viz.py +0 -0
  117. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/stats_box.py +0 -0
  118. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/themes.py +0 -0
  119. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/x_axis_layout.py +0 -0
  120. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/plotting/zones.py +0 -0
  121. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/py.typed +0 -0
  122. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/result_signals.py +0 -0
  123. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/series_length.py +0 -0
  124. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/signals/__init__.py +0 -0
  125. {processbehavior-0.4.0 → processbehavior-0.6.0}/processbehavior/signals/result.py +0 -0
  126. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/__init__.py +0 -0
  127. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/conftest.py +0 -0
  128. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/aco_medicare.json +0 -0
  129. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/known_effects_sds_1.json +0 -0
  130. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_inert_sds_1.json +0 -0
  131. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_inert_sds_2.json +0 -0
  132. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_inert_sds_3.json +0 -0
  133. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_inert_sds_4.json +0 -0
  134. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_inert_sds_5.json +0 -0
  135. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_inert_sds_6.json +0 -0
  136. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_sds_1.json +0 -0
  137. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_sds_2.json +0 -0
  138. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_sds_3.json +0 -0
  139. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_sds_4.json +0 -0
  140. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_sds_5.json +0 -0
  141. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/bishop_analyses/pm_sds_6.json +0 -0
  142. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/coffee_capability_full_baseline.json +0 -0
  143. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/data/FILLWEIGHTDATA_800.csv +0 -0
  144. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/data/coffee_shop_demo_long.csv +0 -0
  145. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/missing_values/X_data.parquet +0 -0
  146. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/missing_values/X_metadata.json +0 -0
  147. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/missing_values/X_statistics.json +0 -0
  148. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/missing_values/mR_data.parquet +0 -0
  149. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/missing_values/mR_metadata.json +0 -0
  150. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/missing_values/mR_statistics.json +0 -0
  151. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/paired_xbar_s/S_statistics.json +0 -0
  152. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/paired_xbar_s/Xbar_statistics.json +0 -0
  153. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/paired_xmr_r/X_data.parquet +0 -0
  154. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/paired_xmr_r/X_metadata.json +0 -0
  155. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/paired_xmr_r/X_statistics.json +0 -0
  156. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/paired_xmr_r/mR_data.parquet +0 -0
  157. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/paired_xmr_r/mR_metadata.json +0 -0
  158. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/paired_xmr_r/mR_statistics.json +0 -0
  159. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/pathological_ordering/X_data.parquet +0 -0
  160. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/pathological_ordering/X_metadata.json +0 -0
  161. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/pathological_ordering/X_statistics.json +0 -0
  162. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/pathological_ordering/mR_data.parquet +0 -0
  163. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/pathological_ordering/mR_metadata.json +0 -0
  164. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/pathological_ordering/mR_statistics.json +0 -0
  165. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/residual_chart/S_statistics.json +0 -0
  166. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/single_obs_strata/X_data.parquet +0 -0
  167. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/single_obs_strata/X_metadata.json +0 -0
  168. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/single_obs_strata/X_statistics.json +0 -0
  169. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/single_obs_strata/mR_data.parquet +0 -0
  170. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/single_obs_strata/mR_metadata.json +0 -0
  171. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/single_obs_strata/mR_statistics.json +0 -0
  172. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/stratified_balanced/S_statistics.json +0 -0
  173. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/stratified_balanced/Xbar_statistics.json +0 -0
  174. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/stratified_uneven/S_statistics.json +0 -0
  175. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/stratified_uneven/Xbar_statistics.json +0 -0
  176. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/unstratified_small/X_data.parquet +0 -0
  177. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/unstratified_small/X_metadata.json +0 -0
  178. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/unstratified_small/X_statistics.json +0 -0
  179. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/unstratified_small/mR_data.parquet +0 -0
  180. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/unstratified_small/mR_metadata.json +0 -0
  181. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/fixtures/golden_masters/unstratified_small/mR_statistics.json +0 -0
  182. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_analysis_bugs.py +0 -0
  183. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_analysis_dataset.py +0 -0
  184. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_analysis_result_contract.py +0 -0
  185. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_analysis_specifications.py +0 -0
  186. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_api_reference.py +0 -0
  187. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_beyond_limits_vectorized.py +0 -0
  188. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_bin_extremes.py +0 -0
  189. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_by_parameter.py +0 -0
  190. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_by_permutations.py +0 -0
  191. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_calibration.py +0 -0
  192. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_capability_chart.py +0 -0
  193. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_chart_availability.py +0 -0
  194. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_chart_column_contract.py +0 -0
  195. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_chart_parsing.py +0 -0
  196. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_control_chart_figure.py +0 -0
  197. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_data_preparation.py +0 -0
  198. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_datasets.py +0 -0
  199. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_derivations.py +0 -0
  200. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_derivations_robustness.py +0 -0
  201. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_design_state_lineage.py +0 -0
  202. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_edge_cases.py +0 -0
  203. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_effects_calculator.py +0 -0
  204. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_encode_rsg_vectorized.py +0 -0
  205. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_execute_validation.py +0 -0
  206. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_focus.py +0 -0
  207. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_init_cleaning.py +0 -0
  208. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_lane_boundaries.py +0 -0
  209. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_lane_connectors.py +0 -0
  210. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_limits_vectorized.py +0 -0
  211. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_manual_citations.py +0 -0
  212. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_na_in_factor_columns.py +0 -0
  213. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_notebook_ergonomics.py +0 -0
  214. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_p0_p2_regressions.py +0 -0
  215. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_performance.py +0 -0
  216. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_plotting.py +0 -0
  217. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_plotting_decorations.py +0 -0
  218. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_plotting_hardening.py +0 -0
  219. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_plotting_xaxis.py +0 -0
  220. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_recentered_mr_fix.py +0 -0
  221. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_reference_integrity.py +0 -0
  222. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_release_gate_0_1_0_checklist.py +0 -0
  223. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_residual_aliases.py +0 -0
  224. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_residual_labels.py +0 -0
  225. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_residual_scope.py +0 -0
  226. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_resolve_by_grouping.py +0 -0
  227. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_result_signals.py +0 -0
  228. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_sampling_plan.py +0 -0
  229. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_series_length.py +0 -0
  230. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_signal_result_surface.py +0 -0
  231. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_single_detection.py +0 -0
  232. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_solo_mr_residuals.py +0 -0
  233. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_srp_refactor.py +0 -0
  234. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_strata_companion.py +0 -0
  235. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_strata_sufficiency.py +0 -0
  236. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_stratified_insufficiency.py +0 -0
  237. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_synthetic.py +0 -0
  238. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_types.py +0 -0
  239. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_validate_by_parameter.py +0 -0
  240. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_weco_integration.py +0 -0
  241. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_why_not.py +0 -0
  242. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_x_axis_layout.py +0 -0
  243. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_xbar_residual_center.py +0 -0
  244. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_xbar_s_options.py +0 -0
  245. {processbehavior-0.4.0 → processbehavior-0.6.0}/tests/test_xbar_stratified.py +0 -0
  246. {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.4.0...HEAD
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.2.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 relevant Bishop-reference tests green:
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
- `(10-12 manual Eq 14-8)`, `Eqs 14-4..14-13`, `Eqs 11-16/17`. Name the edition once per file and use
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.4.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: nbmake>=1.5; extra == 'dev'
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: nbmake>=1.5; extra == 'test'
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
- - **Signal detection**: all eight Western Electric rules on X/mR; Rule 1 (3-sigma) on Xbar/S, where the run- and zone-based rules need a time order that subgroup comparisons don't have
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
- - **Signal detection**: all eight Western Electric rules on X/mR; Rule 1 (3-sigma) on Xbar/S, where the run- and zone-based rules need a time order that subgroup comparisons don't have
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.4.0'
50
+ __version__ = '0.6.0'
51
51
 
52
52
  # Result object
53
53
  from processbehavior.analysis_result import AnalysisResult