processbehavior 0.4.0__tar.gz → 0.5.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 (242) hide show
  1. {processbehavior-0.4.0 → processbehavior-0.5.0}/CHANGELOG.md +69 -1
  2. {processbehavior-0.4.0 → processbehavior-0.5.0}/CITATION.cff +1 -1
  3. {processbehavior-0.4.0 → processbehavior-0.5.0}/PKG-INFO +32 -1
  4. {processbehavior-0.4.0 → processbehavior-0.5.0}/README.md +31 -0
  5. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/__init__.py +1 -1
  6. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/analysis.py +412 -192
  7. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/analysis_result.py +71 -2
  8. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/data_preparation.py +13 -2
  9. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/exceptions.py +4 -4
  10. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/focused_result.py +6 -0
  11. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/formulation_spec.py +6 -0
  12. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/plotting/plotter.py +1 -0
  13. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/plotting/renderers.py +3 -2
  14. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/process_behavior.py +59 -44
  15. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/result_tabular.py +26 -49
  16. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/spc_constants.py +14 -3
  17. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/study.py +84 -14
  18. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/types.py +18 -4
  19. processbehavior-0.5.0/tests/fixtures/data/wheeler_cavity_thickness.csv +401 -0
  20. processbehavior-0.5.0/tests/fixtures/golden_masters/paired_xbar_s/S_data.parquet +0 -0
  21. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/paired_xbar_s/S_metadata.json +1 -0
  22. processbehavior-0.5.0/tests/fixtures/golden_masters/paired_xbar_s/Xbar_data.parquet +0 -0
  23. {processbehavior-0.4.0/tests/fixtures/golden_masters/stratified_uneven → processbehavior-0.5.0/tests/fixtures/golden_masters/paired_xbar_s}/Xbar_metadata.json +1 -0
  24. processbehavior-0.5.0/tests/fixtures/golden_masters/phased_xbar_s/S_data.parquet +0 -0
  25. processbehavior-0.5.0/tests/fixtures/golden_masters/phased_xbar_s/S_metadata.json +53 -0
  26. processbehavior-0.5.0/tests/fixtures/golden_masters/phased_xbar_s/S_statistics.json +7 -0
  27. processbehavior-0.5.0/tests/fixtures/golden_masters/phased_xbar_s/Xbar_data.parquet +0 -0
  28. processbehavior-0.5.0/tests/fixtures/golden_masters/phased_xbar_s/Xbar_metadata.json +58 -0
  29. processbehavior-0.5.0/tests/fixtures/golden_masters/phased_xbar_s/Xbar_statistics.json +7 -0
  30. processbehavior-0.5.0/tests/fixtures/golden_masters/residual_chart/S_data.parquet +0 -0
  31. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/residual_chart/S_metadata.json +1 -0
  32. processbehavior-0.5.0/tests/fixtures/golden_masters/stratified_balanced/S_data.parquet +0 -0
  33. {processbehavior-0.4.0/tests/fixtures/golden_masters/stratified_uneven → processbehavior-0.5.0/tests/fixtures/golden_masters/stratified_balanced}/S_metadata.json +1 -0
  34. processbehavior-0.5.0/tests/fixtures/golden_masters/stratified_balanced/Xbar_data.parquet +0 -0
  35. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/stratified_balanced/Xbar_metadata.json +1 -0
  36. processbehavior-0.5.0/tests/fixtures/golden_masters/stratified_uneven/S_data.parquet +0 -0
  37. {processbehavior-0.4.0/tests/fixtures/golden_masters/stratified_balanced → processbehavior-0.5.0/tests/fixtures/golden_masters/stratified_uneven}/S_metadata.json +1 -0
  38. processbehavior-0.5.0/tests/fixtures/golden_masters/stratified_uneven/Xbar_data.parquet +0 -0
  39. {processbehavior-0.4.0/tests/fixtures/golden_masters/paired_xbar_s → processbehavior-0.5.0/tests/fixtures/golden_masters/stratified_uneven}/Xbar_metadata.json +1 -0
  40. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_analysis_golden_master.py +17 -0
  41. processbehavior-0.5.0/tests/test_ordered_categorical_lane_order.py +73 -0
  42. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_phased_limits.py +100 -12
  43. processbehavior-0.5.0/tests/test_phased_xbar_s.py +536 -0
  44. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_process_behavior.py +119 -15
  45. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_result_tabular.py +97 -3
  46. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_sds_detector.py +6 -4
  47. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_supports_calibration.py +14 -1
  48. processbehavior-0.5.0/tests/test_xbar_s_helpers.py +153 -0
  49. processbehavior-0.4.0/tests/fixtures/golden_masters/paired_xbar_s/S_data.parquet +0 -0
  50. processbehavior-0.4.0/tests/fixtures/golden_masters/paired_xbar_s/Xbar_data.parquet +0 -0
  51. processbehavior-0.4.0/tests/fixtures/golden_masters/residual_chart/S_data.parquet +0 -0
  52. processbehavior-0.4.0/tests/fixtures/golden_masters/stratified_balanced/S_data.parquet +0 -0
  53. processbehavior-0.4.0/tests/fixtures/golden_masters/stratified_balanced/Xbar_data.parquet +0 -0
  54. processbehavior-0.4.0/tests/fixtures/golden_masters/stratified_uneven/S_data.parquet +0 -0
  55. processbehavior-0.4.0/tests/fixtures/golden_masters/stratified_uneven/Xbar_data.parquet +0 -0
  56. {processbehavior-0.4.0 → processbehavior-0.5.0}/.gitignore +0 -0
  57. {processbehavior-0.4.0 → processbehavior-0.5.0}/CODE_OF_CONDUCT.md +0 -0
  58. {processbehavior-0.4.0 → processbehavior-0.5.0}/CONTRIBUTING.md +0 -0
  59. {processbehavior-0.4.0 → processbehavior-0.5.0}/LICENSE +0 -0
  60. {processbehavior-0.4.0 → processbehavior-0.5.0}/SECURITY.md +0 -0
  61. {processbehavior-0.4.0 → processbehavior-0.5.0}/examples/README.md +0 -0
  62. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/analysis_dataset.py +0 -0
  63. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/calibration.py +0 -0
  64. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/capability.py +0 -0
  65. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/datasets/__init__.py +0 -0
  66. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/datasets/data/coffee_shop_demo_long.csv +0 -0
  67. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/datasets/loaders.py +0 -0
  68. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/datasets/synthetic.py +0 -0
  69. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/derivations.py +0 -0
  70. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/effects_calculator.py +0 -0
  71. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/exporters/__init__.py +0 -0
  72. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/exporters/excel_exporter.py +0 -0
  73. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/loss_function.py +0 -0
  74. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/maximum_information.py +0 -0
  75. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/plotting/__init__.py +0 -0
  76. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/plotting/_math.py +0 -0
  77. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/plotting/capability_chart.py +0 -0
  78. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/plotting/contracts.py +0 -0
  79. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/plotting/control_chart.py +0 -0
  80. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/plotting/effects_charts.py +0 -0
  81. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/plotting/lane_boundaries.py +0 -0
  82. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/plotting/limits.py +0 -0
  83. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/plotting/maximum_information_chart.py +0 -0
  84. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/plotting/report.py +0 -0
  85. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/plotting/residuals.py +0 -0
  86. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/plotting/run_rules_viz.py +0 -0
  87. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/plotting/stats_box.py +0 -0
  88. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/plotting/themes.py +0 -0
  89. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/plotting/x_axis_layout.py +0 -0
  90. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/plotting/zones.py +0 -0
  91. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/py.typed +0 -0
  92. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/residual_calculator.py +0 -0
  93. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/result_signals.py +0 -0
  94. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/sds_detector.py +0 -0
  95. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/series_length.py +0 -0
  96. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/signals/__init__.py +0 -0
  97. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/signals/config.py +0 -0
  98. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/signals/detector.py +0 -0
  99. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/signals/detectors.py +0 -0
  100. {processbehavior-0.4.0 → processbehavior-0.5.0}/processbehavior/signals/result.py +0 -0
  101. {processbehavior-0.4.0 → processbehavior-0.5.0}/pyproject.toml +0 -0
  102. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/__init__.py +0 -0
  103. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/conftest.py +0 -0
  104. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/bishop_analyses/aco_medicare.json +0 -0
  105. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/bishop_analyses/known_effects_sds_1.json +0 -0
  106. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/bishop_analyses/pm_inert_sds_1.json +0 -0
  107. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/bishop_analyses/pm_inert_sds_2.json +0 -0
  108. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/bishop_analyses/pm_inert_sds_3.json +0 -0
  109. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/bishop_analyses/pm_inert_sds_4.json +0 -0
  110. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/bishop_analyses/pm_inert_sds_5.json +0 -0
  111. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/bishop_analyses/pm_inert_sds_6.json +0 -0
  112. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/bishop_analyses/pm_sds_1.json +0 -0
  113. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/bishop_analyses/pm_sds_2.json +0 -0
  114. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/bishop_analyses/pm_sds_3.json +0 -0
  115. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/bishop_analyses/pm_sds_4.json +0 -0
  116. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/bishop_analyses/pm_sds_5.json +0 -0
  117. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/bishop_analyses/pm_sds_6.json +0 -0
  118. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/coffee_capability_full_baseline.json +0 -0
  119. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/data/FILLWEIGHTDATA_800.csv +0 -0
  120. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/data/coffee_shop_demo_long.csv +0 -0
  121. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/missing_values/X_data.parquet +0 -0
  122. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/missing_values/X_metadata.json +0 -0
  123. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/missing_values/X_statistics.json +0 -0
  124. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/missing_values/mR_data.parquet +0 -0
  125. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/missing_values/mR_metadata.json +0 -0
  126. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/missing_values/mR_statistics.json +0 -0
  127. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/paired_xbar_s/S_statistics.json +0 -0
  128. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/paired_xbar_s/Xbar_statistics.json +0 -0
  129. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/paired_xmr_r/X_data.parquet +0 -0
  130. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/paired_xmr_r/X_metadata.json +0 -0
  131. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/paired_xmr_r/X_statistics.json +0 -0
  132. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/paired_xmr_r/mR_data.parquet +0 -0
  133. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/paired_xmr_r/mR_metadata.json +0 -0
  134. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/paired_xmr_r/mR_statistics.json +0 -0
  135. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/pathological_ordering/X_data.parquet +0 -0
  136. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/pathological_ordering/X_metadata.json +0 -0
  137. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/pathological_ordering/X_statistics.json +0 -0
  138. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/pathological_ordering/mR_data.parquet +0 -0
  139. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/pathological_ordering/mR_metadata.json +0 -0
  140. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/pathological_ordering/mR_statistics.json +0 -0
  141. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/residual_chart/S_statistics.json +0 -0
  142. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/single_obs_strata/X_data.parquet +0 -0
  143. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/single_obs_strata/X_metadata.json +0 -0
  144. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/single_obs_strata/X_statistics.json +0 -0
  145. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/single_obs_strata/mR_data.parquet +0 -0
  146. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/single_obs_strata/mR_metadata.json +0 -0
  147. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/single_obs_strata/mR_statistics.json +0 -0
  148. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/stratified_balanced/S_statistics.json +0 -0
  149. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/stratified_balanced/Xbar_statistics.json +0 -0
  150. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/stratified_uneven/S_statistics.json +0 -0
  151. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/stratified_uneven/Xbar_statistics.json +0 -0
  152. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/unstratified_small/X_data.parquet +0 -0
  153. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/unstratified_small/X_metadata.json +0 -0
  154. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/unstratified_small/X_statistics.json +0 -0
  155. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/unstratified_small/mR_data.parquet +0 -0
  156. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/unstratified_small/mR_metadata.json +0 -0
  157. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/fixtures/golden_masters/unstratified_small/mR_statistics.json +0 -0
  158. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_ads3_charts.py +0 -0
  159. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_analysis_bugs.py +0 -0
  160. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_analysis_dataset.py +0 -0
  161. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_analysis_result_contract.py +0 -0
  162. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_analysis_specifications.py +0 -0
  163. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_api_reference.py +0 -0
  164. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_beyond_limits_vectorized.py +0 -0
  165. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_bin_extremes.py +0 -0
  166. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_bishop_reference.py +0 -0
  167. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_by_parameter.py +0 -0
  168. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_by_permutations.py +0 -0
  169. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_calibration.py +0 -0
  170. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_capability.py +0 -0
  171. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_capability_chart.py +0 -0
  172. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_capability_window.py +0 -0
  173. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_chart_availability.py +0 -0
  174. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_chart_column_contract.py +0 -0
  175. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_chart_parsing.py +0 -0
  176. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_control_chart_figure.py +0 -0
  177. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_data_preparation.py +0 -0
  178. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_datasets.py +0 -0
  179. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_derivations.py +0 -0
  180. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_derivations_robustness.py +0 -0
  181. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_design_state_lineage.py +0 -0
  182. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_documented_rule_coverage.py +0 -0
  183. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_edge_cases.py +0 -0
  184. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_effects_calculator.py +0 -0
  185. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_effects_plotting.py +0 -0
  186. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_encode_rsg_vectorized.py +0 -0
  187. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_excel_export.py +0 -0
  188. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_execute_validation.py +0 -0
  189. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_focus.py +0 -0
  190. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_garbage_character_handling.py +0 -0
  191. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_init_cleaning.py +0 -0
  192. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_lane_boundaries.py +0 -0
  193. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_lane_connectors.py +0 -0
  194. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_limits_vectorized.py +0 -0
  195. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_loss_function.py +0 -0
  196. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_manual_citations.py +0 -0
  197. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_maximum_information.py +0 -0
  198. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_na_in_factor_columns.py +0 -0
  199. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_notebook_ergonomics.py +0 -0
  200. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_p0_p2_regressions.py +0 -0
  201. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_performance.py +0 -0
  202. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_plotting.py +0 -0
  203. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_plotting_decorations.py +0 -0
  204. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_plotting_hardening.py +0 -0
  205. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_plotting_xaxis.py +0 -0
  206. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_r2_unavailable.py +0 -0
  207. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_r6_effect.py +0 -0
  208. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_recentered_mr_fix.py +0 -0
  209. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_recentering.py +0 -0
  210. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_reference_integrity.py +0 -0
  211. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_release_gate_0_1_0_checklist.py +0 -0
  212. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_residual_aliases.py +0 -0
  213. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_residual_calculator.py +0 -0
  214. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_residual_labels.py +0 -0
  215. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_residual_scope.py +0 -0
  216. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_resolve_by_grouping.py +0 -0
  217. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_result_signals.py +0 -0
  218. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_sampling_plan.py +0 -0
  219. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_sds.py +0 -0
  220. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_series_length.py +0 -0
  221. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_signal_detectors.py +0 -0
  222. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_signal_result_surface.py +0 -0
  223. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_signals.py +0 -0
  224. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_single_detection.py +0 -0
  225. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_solo_mr_residuals.py +0 -0
  226. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_spc_constants.py +0 -0
  227. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_srp_refactor.py +0 -0
  228. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_strata_companion.py +0 -0
  229. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_strata_sufficiency.py +0 -0
  230. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_stratified_insufficiency.py +0 -0
  231. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_synthetic.py +0 -0
  232. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_types.py +0 -0
  233. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_unequal_subgroups.py +0 -0
  234. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_validate_by_parameter.py +0 -0
  235. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_vas_chart_constants.py +0 -0
  236. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_weco_integration.py +0 -0
  237. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_why_not.py +0 -0
  238. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_x_axis_layout.py +0 -0
  239. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_xbar_residual_center.py +0 -0
  240. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_xbar_s_options.py +0 -0
  241. {processbehavior-0.4.0 → processbehavior-0.5.0}/tests/test_xbar_stratified.py +0 -0
  242. {processbehavior-0.4.0 → processbehavior-0.5.0}/validation/PBTESTDATABASE_T100.csv +0 -0
@@ -7,6 +7,73 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.5.0] - 2026-10-29
11
+
12
+ This release adds staged (phased) Xbar and S charts, computed per stage as Dr. Bishop
13
+ specified (2026-10-18), with `phase_statistics()` for the numbers behind each stage on both
14
+ chart families. A column of values with no time is now charted in the order received.
15
+
16
+ ### Added
17
+ - **A bare response is charted in the order received.** `formulate(response=...)` with no time,
18
+ factors or plan used to be refused. The values are now numbered 1..N in an `Observation` column
19
+ (the same numbers as `obs_id`) and the study is exactly the one `time='Observation'` gives: a
20
+ single stream, ADS 2, X/mR, sigma from N − 1 moving ranges. An NA response keeps its place as an
21
+ empty cell. The design report adds `Time: received order (no time column given)`. If the data
22
+ already has an `Observation` column, formulate asks you to pass it as `time=` or rename it (#129).
23
+ - **Phased limits on Xbar and S charts.** `execute(chart='Xbar', phased=True)` gives each factor
24
+ combination its own centre line and limits on one chart, drawn as stepped lines with a divider at
25
+ each change, the way phased X/mR already does for its lanes. Each phase is computed as a separate
26
+ Xbar/S analysis, exactly as `by=[time]` computes one chart per condition: the centre is the mean of
27
+ the phase's subgroup means, with its own S-bar and sigma-hat (10-12 manual Eqs 11-5, 11-8, 11-9,
28
+ 11-16, 11-17). `by=['stage', time]` pools the other factors into the subgroup and phases on the
29
+ stage; the centre is then the mean of the pooled subgroup averages, as Dr. Bishop specified
30
+ (2026-10-18). On Wheeler's four-cavity thickness data the per-cavity centres and limits match
31
+ Minitab's staged Xbar-S chart. Residual values, calibrations and `by=[time]` are refused with
32
+ messages that say what to use instead; a phase with no replicated subgroup keeps its points without
33
+ limits and is named in `metadata['insufficient_phases']`. (#144)
34
+ - **`result.phase_statistics(chart, stratum=None)`.** One row per phase of a phased chart. Xbar/S:
35
+ `phase`, `subgroups`, `N`, `center`, `s_bar`, `sigma_hat`, `lpl`, `upl`. X/mR: `phase`, `points`,
36
+ `center`, `mR_bar`, `lpl`, `upl`, per stratum on a stratified chart (`stratum=`, or through
37
+ `focus()`). (#144)
38
+ - **Docs: a Staged Charts tutorial**, executed in CI. On the bundled coffee-shop data, with the
39
+ stage derived by one `.bin()` call, it compares one set of limits with limits per stage on Xbar
40
+ and S, reads `phase_statistics()`, puts every reading on a phased X/mR chart, and pools or splits
41
+ a second factor. The chart-types guide's staged example now runs as written, and its pooling
42
+ example uses a study that has a factor to pool. (#144)
43
+
44
+ ### Changed
45
+ - **`formulate(response=..., factors=[])` with no time is the same study.** It used to treat the
46
+ whole column as one replicated cell: ADS 1, a recommended one-point Xbar chart, the "within-cell
47
+ replication" series-length line, and an X chart plotted against the response values. Its chart
48
+ tables now start with `Observation` (#129).
49
+ - **Xbar and S chart data carry `n`.** `get_chart('Xbar')` / `get_chart('S')`, and the Excel chart
50
+ sheets, gain an `n` column after the subgroup label. Unstratified Xbar/S metadata names the label
51
+ column as `group_col` (#143).
52
+ - **Lane dividers on an Xbar or S chart are labelled with the phase.** These charts have no time
53
+ column and so no cell band under the axis, which is where X charts name their lanes. (#144)
54
+ - **Phased chart data and `chart_table` carry a `phase` column** (the lane label) after the subgroup
55
+ label, on X/mR as well as Xbar/S. Phased Xbar/S metadata carries `phase_by`, `lane_boundaries`,
56
+ `single_point_phases` and `insufficient_phases`; `n_avg` is not reported on a phased chart, whose
57
+ `n_mode='average'` is applied per phase, so the per-phase mean size is `phase_statistics(chart)['N']`.
58
+ (#144)
59
+
60
+ ### Fixed
61
+ - **Xbar/S `chart_table` keeps the subgroup label and `n` on every `by=`.** With a `by=` other than
62
+ time alone, such as a pooled subset (`by=['FACTOR 1', time]`), all factors, factors without time,
63
+ or one factor, the table dropped both columns, so a row couldn't be traced to its subgroup and
64
+ stepped limits went unexplained. `n` is now the aggregation's own count, which covers every cell
65
+ a pooled subgroup spans. This also corrects one row on residual charts whose limits rest on R2
66
+ (R1, R3, R4, R5) in a design with singletons: the stream's first cell, where R2 is undefined at
67
+ the first value, showed its cell size, not the one-fewer values its S and limits use. Limits,
68
+ centres and statistics are unchanged (#143).
69
+ - **`execute()` no longer documents `phased=True` as requiring `by=[]`.** Stratified phasing of X/mR
70
+ (`by=['factor 1'], phased=True`) has been accepted since 75bcdd1; the docstring never caught up. (#144)
71
+ - **The companion mR of a phased X chart reports `single_point_phases`.** Only the solo mR did. (#144)
72
+ - **X/mR lane order honours an ordered pandas Categorical factor.** A stage column with categories
73
+ `before < after` already ordered the Xbar/S subgroups that way, but the canonical row order sorted
74
+ the raw labels, so X/mR lanes, phases and `strata` came out `after, before`. The canonical sort now
75
+ uses an ordered Categorical's category codes; plain string and numeric factors sort as before. (#144)
76
+
10
77
  ## [0.4.0] - 2026-10-14
11
78
 
12
79
  This release aligns the library with Bishop's VAS documentation manual dated 10-12-2026 and
@@ -1114,7 +1181,8 @@ and may change between minor versions until 1.0.
1114
1181
  - `natsort >= 8.0`
1115
1182
  - `plotly >= 5.18, < 7`
1116
1183
 
1117
- [Unreleased]: https://github.com/cnicholas/processbehavior/compare/v0.4.0...HEAD
1184
+ [Unreleased]: https://github.com/cnicholas/processbehavior/compare/v0.5.0...HEAD
1185
+ [0.5.0]: https://github.com/cnicholas/processbehavior/compare/v0.4.0...v0.5.0
1118
1186
  [0.4.0]: https://github.com/cnicholas/processbehavior/compare/v0.3.3...v0.4.0
1119
1187
  [0.3.3]: https://github.com/cnicholas/processbehavior/compare/v0.3.2...v0.3.3
1120
1188
  [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.5.0
21
21
  keywords:
22
22
  - statistical process control
23
23
  - process behavior charts
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: processbehavior
3
- Version: 0.4.0
3
+ Version: 0.5.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
@@ -108,6 +108,22 @@ pip install "processbehavior[images]" # kaleido, for static plot images
108
108
 
109
109
  ## Quickstart
110
110
 
111
+ A column of values, charted in the order received, is an X/mR chart in two calls:
112
+
113
+ ```python
114
+ import pandas as pd
115
+ import processbehavior as pb
116
+
117
+ 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]})
118
+
119
+ study = pb.formulate(df, response='weight') # no time column: rows are numbered 1..N as 'Observation'
120
+ result = study.execute(companion=True) # X chart with its mR companion
121
+ print(result.statistics('X')) # {'N': 1, 'center': 50.167, 'lpl': 48.619, 'upl': 51.714}
122
+ result.plot()
123
+ ```
124
+
125
+ When the data has a time order, factors, or both, name them. The design state routes the analysis:
126
+
111
127
  ```python
112
128
  import processbehavior as pb
113
129
 
@@ -149,6 +165,20 @@ The whole pipeline is one expression when you don't need the intermediate object
149
165
  pb.formulate(df, response='y', factors=['factor 1'], time='time').execute().plot()
150
166
  ```
151
167
 
168
+ A process that changed on purpose gets its own limits for each stage with `phased=True`:
169
+
170
+ ```python
171
+ import processbehavior as pb
172
+
173
+ # The bundled coffee-shop data: a new machine in week 8, a new POS in week 12, new baristas from week 14
174
+ pbd = pb.load_coffee_shop().bin('week', method='breaks', breaks=[8, 12, 14],
175
+ bin_labels=['baseline', 'new machine', 'new POS', 'new baristas'],
176
+ label='stage')
177
+ staged = pbd.formulate(response='wait_sec', factors=['stage'], time='date').execute(chart='Xbar', phased=True, companion=True)
178
+ staged.phase_statistics('Xbar') # one row per stage: center, S-bar, sigma-hat, limits
179
+ staged.plot(chart='Xbar', title='Wait time: limits per stage')
180
+ ```
181
+
152
182
  Use `pb.ProcessBehavior(df)` directly when you want the fluent derived-variable verbs
153
183
  (`.transform(...)`, `.bin(...)`), which attach before formulating. With that object in hand,
154
184
  `pbd.cols.<column_name>` provides IDE auto-completion for column references.
@@ -251,6 +281,7 @@ The full report renders to `validation/e2e_bishop_report.html`.
251
281
  - **Variance decomposition**: R1-R6 residuals for factorial designs
252
282
  - **Effects analysis**: Main effects, time effects, and interaction effects
253
283
  - **Stratified charts**: Automatic per-stratum limits for grouped individual data
284
+ - **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
254
285
  - **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
255
286
  - **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
287
  - **IDE support**: Column auto-completion via `ProcessBehavior(df).cols`
@@ -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,6 +198,7 @@ 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
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
171
202
  - **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
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`
@@ -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.5.0'
51
51
 
52
52
  # Result object
53
53
  from processbehavior.analysis_result import AnalysisResult