process-improve 1.97.2__tar.gz → 1.99.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 (262) hide show
  1. process_improve-1.99.0/PKG-INFO +410 -0
  2. process_improve-1.99.0/README.md +326 -0
  3. {process_improve-1.97.2 → process_improve-1.99.0}/pyproject.toml +22 -5
  4. {process_improve-1.97.2 → process_improve-1.99.0}/pyproject.toml.orig +35 -21
  5. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/__init__.py +2 -2
  6. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/_extras.py +1 -2
  7. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/batch/_gaps.py +1 -3
  8. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/batch/control.py +1 -1
  9. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/batch/features.py +3 -2
  10. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/batch/plotting.py +2 -6
  11. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/batch/preprocessing.py +27 -27
  12. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/batch/tools.py +18 -1
  13. process_improve-1.99.0/src/process_improve/datasets/experiments/corrosion.csv +25 -0
  14. process_improve-1.99.0/src/process_improve/datasets/experiments/reference_catalogue/NOTICE.md +24 -0
  15. process_improve-1.99.0/src/process_improve/datasets/experiments/reference_catalogue/box-hunter-hunter-1978.json +58630 -0
  16. process_improve-1.99.0/src/process_improve/datasets/experiments/reference_catalogue/davies-1956.json +24793 -0
  17. process_improve-1.99.0/src/process_improve/datasets/experiments/reference_catalogue/efi-mooc-quizzes.json +15212 -0
  18. process_improve-1.99.0/src/process_improve/datasets/experiments/reference_catalogue/goos-2025.json +1848 -0
  19. process_improve-1.99.0/src/process_improve/datasets/experiments/reference_catalogue/jones-nachtsheim-2013.json +4109 -0
  20. process_improve-1.99.0/src/process_improve/datasets/experiments/reference_catalogue/nair-ffd-tutorial-2004.json +1346 -0
  21. process_improve-1.99.0/src/process_improve/datasets/experiments/reference_catalogue/nist-ehandbook-ch5.json +63256 -0
  22. process_improve-1.99.0/src/process_improve/datasets/experiments/reference_catalogue/nunez-ares-et-al-2023.json +1928 -0
  23. process_improve-1.99.0/src/process_improve/datasets/experiments/reference_catalogue/nunez-ares-goos-2019.json +3717 -0
  24. process_improve-1.99.0/src/process_improve/datasets/experiments/reference_catalogue/nunez-ares-goos-2020.json +6478 -0
  25. process_improve-1.99.0/src/process_improve/datasets/experiments/reference_catalogue/pid-book.json +42788 -0
  26. process_improve-1.99.0/src/process_improve/datasets/experiments/reference_catalogue/ullmann-doe-2012.json +1433 -0
  27. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/__init__.py +5 -0
  28. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_analyses/_shared.py +4 -0
  29. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_analyses/aliasing.py +8 -2
  30. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_analyses/lack_of_fit.py +3 -1
  31. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_analyses/lenth.py +7 -5
  32. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_analyses/ols_extractors.py +10 -7
  33. process_improve-1.99.0/src/process_improve/experiments/_analyses/split_plot.py +402 -0
  34. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_blocking.py +112 -7
  35. process_improve-1.99.0/src/process_improve/experiments/_classical.py +230 -0
  36. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_finite_fields.py +2 -1
  37. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_lm.py +57 -98
  38. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_moment_aberration.py +1 -1
  39. process_improve-1.99.0/src/process_improve/experiments/_orthogonal_arrays.py +572 -0
  40. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_tools/analyze_experiment.py +38 -3
  41. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_tools/generate_design.py +10 -4
  42. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_tools/optimize_responses.py +5 -2
  43. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_tools/visualize_doe.py +3 -2
  44. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/analysis.py +445 -61
  45. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/augment.py +2 -1
  46. process_improve-1.99.0/src/process_improve/experiments/compare.py +703 -0
  47. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/datasets.py +37 -2
  48. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/designs.py +125 -27
  49. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/designs_constrained.py +197 -30
  50. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/designs_omars_ilp.py +16 -21
  51. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/designs_optimal.py +51 -5
  52. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/designs_response_surface.py +139 -92
  53. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/designs_screening.py +16 -29
  54. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/designs_supersaturated.py +7 -10
  55. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/designs_utils.py +124 -48
  56. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/evaluate.py +15 -28
  57. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/factor.py +4 -1
  58. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/knowledge/engine.py +5 -65
  59. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/knowledge/models.py +0 -27
  60. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/optimization.py +77 -10
  61. process_improve-1.99.0/src/process_improve/experiments/reference_catalogue.py +811 -0
  62. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/strategy/engine.py +4 -1
  63. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/structures.py +89 -59
  64. process_improve-1.99.0/src/process_improve/experiments/true_process.py +232 -0
  65. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/visualization/plots/design_quality.py +89 -3
  66. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/visualization/plots/diagnostics.py +4 -3
  67. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/visualization/plots/significance.py +11 -8
  68. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/monitoring/control_charts.py +202 -43
  69. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/monitoring/tools.py +50 -20
  70. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_adaptive.py +4 -2
  71. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_base.py +4 -3
  72. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_common.py +88 -1
  73. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_cv_criteria.py +5 -2
  74. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_diagnostics.py +21 -5
  75. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_impute.py +12 -3
  76. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_limits.py +24 -7
  77. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_mbpca.py +34 -33
  78. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_mbpls.py +30 -32
  79. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_nipals.py +47 -6
  80. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_null.py +14 -7
  81. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_opls.py +3 -3
  82. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_pca.py +98 -59
  83. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_pls.py +42 -31
  84. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_preprocessing.py +29 -16
  85. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_tpls.py +37 -33
  86. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/plots.py +4 -3
  87. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/tools.py +7 -5
  88. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/regression/_robust_regression.py +20 -19
  89. process_improve-1.99.0/src/process_improve/regression/_variance_components.py +373 -0
  90. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/regression/tools.py +9 -11
  91. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/sensory/__init__.py +9 -1
  92. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/sensory/ingest.py +52 -8
  93. process_improve-1.99.0/src/process_improve/sensory/mam.py +650 -0
  94. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/simulation/model.py +1 -2
  95. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/tool_safety.py +23 -14
  96. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/visualization/adapters/echarts_adapter.py +28 -7
  97. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/visualization/adapters/plotly_adapter.py +18 -19
  98. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/visualization/themes.py +22 -1
  99. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/visualization/tools.py +1 -4
  100. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/visualization/types.py +1 -0
  101. process_improve-1.97.2/PKG-INFO +0 -545
  102. process_improve-1.97.2/README.md +0 -464
  103. process_improve-1.97.2/src/process_improve/sensory/mam.py +0 -264
  104. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/_linalg.py +0 -0
  105. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/_random.py +0 -0
  106. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/_remote_data.py +0 -0
  107. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/batch/__init__.py +0 -0
  108. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/batch/_batch_monitor.py +0 -0
  109. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/batch/_batch_pca.py +0 -0
  110. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/batch/_batch_plots.py +0 -0
  111. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/batch/_batch_pls.py +0 -0
  112. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/batch/_common.py +0 -0
  113. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/batch/_online.py +0 -0
  114. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/batch/alignment_helpers.py +0 -0
  115. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/batch/data_input.py +0 -0
  116. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/batch/datasets.py +0 -0
  117. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/bivariate/__init__.py +0 -0
  118. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/bivariate/_elbow_peak.py +0 -0
  119. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/bivariate/methods.py +0 -0
  120. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/bivariate/tools.py +0 -0
  121. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/chemistry/__init__.py +0 -0
  122. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/chemistry/preprocessing.py +0 -0
  123. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/config.py +0 -0
  124. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/batch/batch-fake-data.csv +0 -0
  125. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/batch/details.txt +0 -0
  126. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/batch/dryer.csv +0 -0
  127. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/batch/nylon.csv +0 -0
  128. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/experiments/boilingpot.csv +0 -0
  129. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/experiments/golf.csv +0 -0
  130. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/experiments/pollutant.csv +0 -0
  131. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/experiments/solar.csv +0 -0
  132. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/experiments/test_doe1.csv +0 -0
  133. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/monitoring/batch-yield-and-purity.csv +0 -0
  134. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/monitoring/rubber-colour.csv +0 -0
  135. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/LDPE/C.csv +0 -0
  136. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/LDPE/Hotellings_T2_A3.csv +0 -0
  137. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/LDPE/Hotellings_T2_A6.csv +0 -0
  138. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/LDPE/LDPE.csv +0 -0
  139. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/LDPE/P.csv +0 -0
  140. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/LDPE/R.csv +0 -0
  141. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/LDPE/T.csv +0 -0
  142. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/LDPE/U.csv +0 -0
  143. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/LDPE/W.csv +0 -0
  144. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/LDPE/Yhat_A6.csv +0 -0
  145. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/cheddar-cheese.csv +0 -0
  146. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/dtu-pectin/NOTICE +0 -0
  147. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/dtu-pectin/extraction1.csv +0 -0
  148. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/dtu-pectin/extraction2.csv +0 -0
  149. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/dtu-pectin/extraction3.csv +0 -0
  150. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/dtu-pectin/ftir1.csv +0 -0
  151. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/dtu-pectin/ftir2.csv +0 -0
  152. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/dtu-pectin/ftir3.csv +0 -0
  153. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/kamyr.csv +0 -0
  154. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/solvents.csv +0 -0
  155. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/tablet-spectra.csv +0 -0
  156. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/tpls-pyphi/SOURCE +0 -0
  157. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/tpls-pyphi/formulas_Group1.csv +0 -0
  158. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/tpls-pyphi/formulas_Group2.csv +0 -0
  159. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/tpls-pyphi/formulas_Group3.csv +0 -0
  160. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/tpls-pyphi/formulas_Group4.csv +0 -0
  161. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/tpls-pyphi/formulas_Group5.csv +0 -0
  162. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/tpls-pyphi/process_conditions.csv +0 -0
  163. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/tpls-pyphi/properties_Group1.csv +0 -0
  164. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/tpls-pyphi/properties_Group2.csv +0 -0
  165. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/tpls-pyphi/properties_Group3.csv +0 -0
  166. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/tpls-pyphi/properties_Group4.csv +0 -0
  167. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/tpls-pyphi/properties_Group5.csv +0 -0
  168. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/datasets/multivariate/tpls-pyphi/quality_indicators.csv +0 -0
  169. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_analyses/__init__.py +0 -0
  170. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_analyses/box_cox.py +0 -0
  171. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_analyses/curvature.py +0 -0
  172. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_analyses/diagnostics.py +0 -0
  173. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_analyses/mixture.py +0 -0
  174. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_analyses/model_selection.py +0 -0
  175. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_analyses/prediction.py +0 -0
  176. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_analyses/transforms.py +0 -0
  177. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_desirability.py +0 -0
  178. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_tools/__init__.py +0 -0
  179. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_tools/augment_design.py +0 -0
  180. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_tools/create_factorial_design.py +0 -0
  181. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_tools/doe_knowledge.py +0 -0
  182. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_tools/evaluate_design.py +0 -0
  183. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_tools/fit_linear_model.py +0 -0
  184. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_tools/recommend_strategy.py +0 -0
  185. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_tools/trade_off_table.py +0 -0
  186. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/_uniform_sampling.py +0 -0
  187. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/designs_factorial.py +0 -0
  188. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/designs_mixture.py +0 -0
  189. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/designs_mixture_constrained.py +0 -0
  190. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/designs_omars.py +0 -0
  191. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/designs_space_filling.py +0 -0
  192. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/knowledge/__init__.py +0 -0
  193. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/knowledge/api.py +0 -0
  194. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/knowledge/data/concepts.yaml +0 -0
  195. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/knowledge/data/decision_rules.yaml +0 -0
  196. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/knowledge/data/design_types.yaml +0 -0
  197. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/knowledge/data/diagnostics.yaml +0 -0
  198. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/models.py +0 -0
  199. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/omars.py +0 -0
  200. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/omars_trade_off.py +0 -0
  201. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/optimal.py +0 -0
  202. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/region.py +0 -0
  203. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/simulations.py +0 -0
  204. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/strategy/__init__.py +0 -0
  205. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/strategy/budget.py +0 -0
  206. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/strategy/domain_templates.py +0 -0
  207. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/strategy/models.py +0 -0
  208. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/tools.py +0 -0
  209. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/trade_off.py +0 -0
  210. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/visualization/__init__.py +0 -0
  211. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/visualization/api.py +0 -0
  212. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/visualization/plots/__init__.py +0 -0
  213. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/visualization/plots/cube_plot.py +0 -0
  214. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/visualization/plots/effects.py +0 -0
  215. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/visualization/plots/optimization_plots.py +0 -0
  216. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/visualization/plots/registry.py +0 -0
  217. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/visualization/plots/square_plot.py +0 -0
  218. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/experiments/visualization/plots/surfaces.py +0 -0
  219. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/interactions.py +0 -0
  220. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/mcp_server.py +0 -0
  221. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/monitoring/__init__.py +0 -0
  222. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/monitoring/metrics.py +0 -0
  223. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/__init__.py +0 -0
  224. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_asca.py +0 -0
  225. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_categorical.py +0 -0
  226. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_pca_pls.py +0 -0
  227. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_plsda.py +0 -0
  228. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_prm.py +0 -0
  229. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_procrustes.py +0 -0
  230. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_projection.py +0 -0
  231. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_resampling.py +0 -0
  232. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/_robust.py +0 -0
  233. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/multivariate/methods.py +0 -0
  234. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/py.typed +0 -0
  235. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/recipes.py +0 -0
  236. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/regression/__init__.py +0 -0
  237. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/regression/methods.py +0 -0
  238. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/sensory/analysis.py +0 -0
  239. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/sensory/designed.py +0 -0
  240. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/sensory/diagnostics.py +0 -0
  241. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/sensory/panel.py +0 -0
  242. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/sensory/recipes.py +0 -0
  243. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/sensory/tools.py +0 -0
  244. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/sensory/validation.py +0 -0
  245. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/simulation/__init__.py +0 -0
  246. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/simulation/batch.py +0 -0
  247. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/simulation/context.py +0 -0
  248. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/simulation/latent.py +0 -0
  249. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/simulation/recipes.py +0 -0
  250. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/simulation/tools.py +0 -0
  251. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/tool_spec.py +0 -0
  252. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/univariate/__init__.py +0 -0
  253. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/univariate/metrics.py +0 -0
  254. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/univariate/tools.py +0 -0
  255. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/visualization/__init__.py +0 -0
  256. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/visualization/adapters/__init__.py +0 -0
  257. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/visualization/adapters/base.py +0 -0
  258. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/visualization/charts/__init__.py +0 -0
  259. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/visualization/charts/boxplot.py +0 -0
  260. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/visualization/colors.py +0 -0
  261. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/visualization/raincloud.py +0 -0
  262. {process_improve-1.97.2 → process_improve-1.99.0}/src/process_improve/visualization/spec.py +0 -0
@@ -0,0 +1,410 @@
1
+ Metadata-Version: 2.4
2
+ Name: process-improve
3
+ Version: 1.99.0
4
+ Summary: Designed Experiments; Latent Variables (PCA, PLS, multivariate methods with missing data); Process Monitoring; Batch data analysis.
5
+ Keywords: Designed Experiments,Design of Experiments,DoE,Optimal Design,Response Surface,Latent Variables,PCA,PLS,Multivariate Data Analysis,Chemometrics,Process Monitoring,Batch data analysis
6
+ Author: Kevin Dunn
7
+ Author-email: Kevin Dunn <kgdunn@gmail.com>
8
+ License-Expression: MIT
9
+ Classifier: Development Status :: 4 - Beta
10
+ Classifier: Intended Audience :: Science/Research
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Topic :: Scientific/Engineering
18
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
19
+ Requires-Dist: numpy>=2.2.6
20
+ Requires-Dist: pandas>=2.3.3
21
+ Requires-Dist: patsy>=1.0.2
22
+ Requires-Dist: pydantic>=2.12.5
23
+ Requires-Dist: pyyaml>=6.0
24
+ Requires-Dist: scikit-learn>=1.7.2
25
+ Requires-Dist: scipy>=1.15
26
+ Requires-Dist: statsmodels>=0.14.6
27
+ Requires-Dist: threadpoolctl>=3.5.0
28
+ Requires-Dist: tqdm>=4.67.1
29
+ Requires-Dist: matplotlib>=3.10.8 ; extra == 'all'
30
+ Requires-Dist: mcp>=2.0 ; extra == 'all'
31
+ Requires-Dist: numba>=0.63.1 ; extra == 'all'
32
+ Requires-Dist: openpyxl>=3.1.5 ; extra == 'all'
33
+ Requires-Dist: osqp>=1.0 ; extra == 'all'
34
+ Requires-Dist: plotly>=6.5.2 ; extra == 'all'
35
+ Requires-Dist: ridgeplot>=0.5.0 ; extra == 'all'
36
+ Requires-Dist: ruptures>=1.1.9 ; extra == 'all'
37
+ Requires-Dist: scikit-image>=0.25.2 ; extra == 'all'
38
+ Requires-Dist: seaborn>=0.13.2 ; extra == 'all'
39
+ Requires-Dist: openpyxl>=3.1.5 ; extra == 'batch'
40
+ Requires-Dist: ruptures>=1.1.9 ; extra == 'batch'
41
+ Requires-Dist: scikit-image>=0.25.2 ; extra == 'batch'
42
+ Requires-Dist: osqp>=1.0 ; extra == 'control'
43
+ Requires-Dist: coverage>=7.13.1 ; extra == 'dev'
44
+ Requires-Dist: hypothesis>=6.100 ; extra == 'dev'
45
+ Requires-Dist: matplotlib-stubs>=0.3.11 ; extra == 'dev'
46
+ Requires-Dist: mypy>=1.19.1,<2.5 ; extra == 'dev'
47
+ Requires-Dist: pandas-stubs>=2.3.3.260113 ; extra == 'dev'
48
+ Requires-Dist: plotly-stubs>=0.0.6 ; extra == 'dev'
49
+ Requires-Dist: pre-commit>=4.5.1 ; extra == 'dev'
50
+ Requires-Dist: pytest>=9.0.2 ; extra == 'dev'
51
+ Requires-Dist: pytest-benchmark>=4.0.0 ; extra == 'dev'
52
+ Requires-Dist: pytest-cov>=7.0.0 ; extra == 'dev'
53
+ Requires-Dist: pytest-xdist>=3.8.0 ; extra == 'dev'
54
+ Requires-Dist: pydata-sphinx-theme>=0.16.1 ; extra == 'dev'
55
+ Requires-Dist: ruff>=0.11.0,<0.17 ; extra == 'dev'
56
+ Requires-Dist: sphinx>=8.1.3 ; extra == 'dev'
57
+ Requires-Dist: nbsphinx>=0.9.5 ; extra == 'dev'
58
+ Requires-Dist: ipykernel>=6.29 ; extra == 'dev'
59
+ Requires-Dist: tqdm-stubs>=0.2.1 ; extra == 'dev'
60
+ Requires-Dist: watchdog>=6.0.0 ; extra == 'dev'
61
+ Requires-Dist: numba>=0.63.1 ; extra == 'fast'
62
+ Requires-Dist: mcp>=2.0 ; extra == 'mcp'
63
+ Requires-Dist: matplotlib>=3.10.8 ; extra == 'plotting'
64
+ Requires-Dist: plotly>=6.5.2 ; extra == 'plotting'
65
+ Requires-Dist: ridgeplot>=0.5.0 ; extra == 'plotting'
66
+ Requires-Dist: seaborn>=0.13.2 ; extra == 'plotting'
67
+ Requires-Python: >=3.10
68
+ Project-URL: Homepage, https://github.com/kgdunn/process-improve
69
+ Project-URL: Documentation, https://kgdunn.github.io/process-improve/
70
+ Project-URL: Try it in your browser, https://kgdunn.github.io/process-improve/app/
71
+ Project-URL: Textbook, https://learnche.org/pid
72
+ Project-URL: Repository, https://github.com/kgdunn/process-improve
73
+ Project-URL: Issues, https://github.com/kgdunn/process-improve/issues
74
+ Project-URL: Changelog, https://github.com/kgdunn/process-improve/blob/main/CHANGELOG.md
75
+ Provides-Extra: all
76
+ Provides-Extra: batch
77
+ Provides-Extra: control
78
+ Provides-Extra: dev
79
+ Provides-Extra: fast
80
+ Provides-Extra: ilp
81
+ Provides-Extra: mcp
82
+ Provides-Extra: plotting
83
+ Description-Content-Type: text/markdown
84
+
85
+ # process-improve
86
+
87
+ **Designed experiments, multivariate analysis and process monitoring for Python.**
88
+ Built for the chemometrics, manufacturing and pharma workflows where you need to know
89
+ not just *what fits*, but *which factors matter, is this observation normal, which
90
+ variable moved, and how sure am I?*
91
+
92
+ <picture>
93
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/kgdunn/process-improve/main/docs/_static/readme/banner-dark.png">
94
+ <img alt="Four experimental designs from one generate_design call: a definitive screening design, a central composite design, a constrained I-optimal design and a MaxPro space-filling design" src="https://raw.githubusercontent.com/kgdunn/process-improve/main/docs/_static/readme/banner-light.png">
95
+ </picture>
96
+
97
+ [![PyPI version](https://img.shields.io/pypi/v/process-improve.svg)](https://pypi.org/project/process-improve/)
98
+ [![Python versions](https://img.shields.io/python/required-version-toml?tomlFilePath=https%3A%2F%2Fraw.githubusercontent.com%2Fkgdunn%2Fprocess-improve%2Fmain%2Fpyproject.toml&label=python)](https://pypi.org/project/process-improve/)
99
+ [![Downloads](https://static.pepy.tech/badge/process-improve)](https://pepy.tech/project/process-improve)
100
+ [![Downloads per month](https://static.pepy.tech/badge/process-improve/month)](https://pepy.tech/project/process-improve)
101
+ [![CI](https://github.com/kgdunn/process-improve/actions/workflows/run-tests.yml/badge.svg?branch=main&event=push)](https://github.com/kgdunn/process-improve/actions/workflows/run-tests.yml?query=branch%3Amain)
102
+ [![codecov](https://codecov.io/gh/kgdunn/process-improve/branch/main/graph/badge.svg)](https://codecov.io/gh/kgdunn/process-improve)
103
+ [![Docs](https://img.shields.io/badge/docs-kgdunn.github.io-blue.svg)](https://kgdunn.github.io/process-improve/)
104
+ [![License](https://img.shields.io/pypi/l/process-improve.svg)](https://github.com/kgdunn/process-improve/blob/main/LICENSE)
105
+
106
+ **[Try it in your browser](https://factori.al/)** ·
107
+ [Documentation](https://kgdunn.github.io/process-improve/) ·
108
+ [Free textbook](https://learnche.org/pid) ·
109
+ [Design gallery](#designed-experiments-in-one-call)
110
+
111
+ ```bash
112
+ pip install process-improve
113
+ ```
114
+
115
+ ## Try it without installing anything
116
+
117
+ <a href="https://factori.al/"><img width="600" alt="The designed-experiments app in a browser tab: the yield of a reactor and the factors that may change it, the designs that can learn its curvature compared on nine measures, a Box-Behnken run sheet with results simulated from a known process, and the fitted coefficients beside the true ones" src="https://raw.githubusercontent.com/kgdunn/process-improve/main/docs/_static/readme/app-demo.gif"></a>
118
+
119
+ [Factorial](https://factori.al/), the designed-experiments app, runs
120
+ this package inside your browser tab (Pyodide / WebAssembly). Say what you will measure, with
121
+ its units and goal, and what might change it: the app lists the designs that can learn how the
122
+ one depends on the other, scored on the nine measures of
123
+ [Process Improvement using Data](https://learnche.org/pid) and on their power to find the change
124
+ you care about. Run the one you pick, type in the results or practise with results simulated from
125
+ a process whose true model is known, and read the analysis, beside the truth when it is known.
126
+ Copy the Python behind each step. The analysis runs on your machine, and your data never leave it.
127
+
128
+ ## Learn the methods
129
+
130
+ - **Free textbook:** [Process Improvement using Data](https://learnche.org/pid), the
131
+ companion to this package, from data visualization to latent-variable models, designed
132
+ experiments and process monitoring.
133
+ - **API reference and user guide:** <https://kgdunn.github.io/process-improve/>
134
+ - **Applied DoE tutorial (8 modules):** <https://kgdunn.github.io/process-improve/applied_doe/index.html>
135
+ - **Every design family and its `design_type`:** <https://kgdunn.github.io/process-improve/user_guide/doe_coverage.html>
136
+ - **Fully worked quickstart:** <https://kgdunn.github.io/process-improve/quickstart.html>
137
+
138
+ ## Ask a question, get one line of code and the chapter that explains it
139
+
140
+ Under each question is the chapter of the free textbook that explains the method.
141
+
142
+ | You want to know | One call |
143
+ | --- | --- |
144
+ | **Which design should I run?**<br>[Comparing design families](https://learnche.org/pid/design-analysis-experiments/comparing-design-families) | `recommend_strategy(factors=factors, budget=30)` |
145
+ | **Which of my factors matter?**<br>[Definitive screening designs](https://learnche.org/pid/design-analysis-experiments/definitive-screening-designs) | `generate_design(factors, design_type="dsd")` |
146
+ | **Which effects are real?**<br>[Significance of effects](https://learnche.org/pid/design-analysis-experiments/full-factorial-designs/assessing-significance-of-main-effects-and-interactions) | `analyze_experiment(design.design, responses)` |
147
+ | **Which way is the optimum?**<br>[Response surface methods](https://learnche.org/pid/design-analysis-experiments/response-surface-methods) | `optimize_responses([fit], method="steepest_ascent")` |
148
+ | **Is this observation normal?**<br>[Hotelling's T²](https://learnche.org/pid/latent-variable-modelling/principal-component-analysis/hotellings-t2-statistic) | `pca.diagnose(new).spe` |
149
+ | **Which variable moved?**<br>[Contribution plots](https://learnche.org/pid/latent-variable-modelling/principal-component-analysis/latent-variable-contribution-plots) | `pca.spe_contributions(new)` |
150
+ | **How sure is this prediction?**<br>[Projection to latent structures](https://learnche.org/pid/latent-variable-modelling/projection-to-latent-structures/index) | `pls.prediction_interval(new)` |
151
+ | **Which recipe hits my target?**<br>[Using a PLS model backwards](https://learnche.org/pid/latent-variable-modelling/projection-to-latent-structures/pls-model-inversion-and-the-orthogonal-space) | `model.invert(y_desired=20.9)` |
152
+ | **Is the process in control?**<br>[Shewhart charts](https://learnche.org/pid/process-monitoring/shewhart-charts) | `ControlChart().calculate_limits(y)` |
153
+ | **Is this batch on track?**<br>[Batch process monitoring](https://learnche.org/pid/product-development-product-improvement/batch-process-monitoring) | `BatchMonitor(model).fit(good).monitor(batch)` |
154
+
155
+ ## Designed experiments in one call
156
+
157
+ ```python
158
+ from process_improve.experiments import Factor, generate_design
159
+
160
+ factors = [
161
+ Factor(name="Temperature", low=150, high=200, units="degC"),
162
+ Factor(name="Pressure", low=1, high=5, units="bar"),
163
+ Factor(name="Catalyst", low=0.5, high=2.0, units="g"),
164
+ ]
165
+ design = generate_design(factors, design_type="dsd") # a definitive screening design
166
+ print(design.n_runs) # 9
167
+ run_sheet = design.design_actual # in your units, ready to run
168
+ ```
169
+
170
+ Change `design_type` and the same call builds any of these, each true to its
171
+ [published definition](https://kgdunn.github.io/process-improve/user_guide/doe_coverage.html).
172
+ Leave `design_type` out and give a `budget`, and one is chosen for you.
173
+
174
+ <a href="https://kgdunn.github.io/process-improve/user_guide/doe_coverage.html"><picture>
175
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/kgdunn/process-improve/main/docs/_static/readme/design-gallery-dark.png">
176
+ <img width="560" alt="Sixteen designs drawn from generate_design: supersaturated, Plackett-Burman, fractional and full factorial, definitive screening, central composite, Box-Behnken, OMARS, Taguchi, D-optimal, constrained I-optimal, constrained mixture, Latin hypercube, uniform, MaxPro and Sobol" src="https://raw.githubusercontent.com/kgdunn/process-improve/main/docs/_static/readme/design-gallery-light.png">
177
+ </picture></a>
178
+
179
+ `evaluate_design` scores any design (efficiencies, prediction variance, fraction of design
180
+ space, aliasing), `analyze_experiment` fits it, `augment_design` extends it, and
181
+ `optimize_responses` finds the best settings for several responses at once. Not sure where
182
+ to start? Ask for a whole strategy:
183
+
184
+ ```python
185
+ from process_improve.experiments import Response
186
+ from process_improve.experiments.strategy import recommend_strategy
187
+
188
+ strategy = recommend_strategy(
189
+ factors=factors, # the three factors above
190
+ responses=[Response(name="Yield", goal="maximize", units="%")],
191
+ budget=30,
192
+ )
193
+ print([(stage["design_type"], stage["estimated_runs"]) for stage in strategy["stages"]]) # [('full_factorial', 8), ('ccd', 17), ('replicates_at_optimum', 3)]
194
+ ```
195
+
196
+ ## Quick start: real data, real answers
197
+
198
+ The examples below use measurements from a low-density polyethylene reactor: 54 runs,
199
+ 14 process variables and 5 quality measurements of the polymer. The last four runs come
200
+ from a process upset. Paste the blocks in order and you get the numbers in the comments.
201
+
202
+ ### Is this observation normal, and which variable moved?
203
+
204
+ ```python
205
+ import pandas as pd
206
+ from process_improve.multivariate import PCA, MCUVScaler
207
+
208
+ ldpe = pd.read_csv("https://openmv.net/file/LDPE.csv", index_col=0)
209
+ process, quality = ldpe.loc[:, "Tin":"Press"], ldpe.loc[:, "Conv":"SCB"]
210
+
211
+ # Learn normal operation from the first 50 runs, then check the last four
212
+ scaler = MCUVScaler().fit(process.loc[:50])
213
+ pca = PCA(n_components=3).fit(scaler.transform(process.loc[:50]))
214
+ new = scaler.transform(process.loc[51:])
215
+
216
+ # SPE above its limit means "unlike anything seen in normal operation"
217
+ print(pca.diagnose(new).spe.round(1).to_list()) # [2.3, 3.7, 5.3, 7.6]
218
+ print(round(pca.spe_limit(conf_level=0.95), 1)) # 3.4
219
+
220
+ # Which variables moved in run 54? All three belong to the second reactor zone
221
+ print(pca.spe_contributions(new).loc[54].abs().nlargest(3).round(1).to_dict()) # {'z2': 5.9, 'Fi2': 3.1, 'Tcin2': 1.9}
222
+ pca.score_plot() # interactive Plotly figure
223
+ ```
224
+
225
+ ### How sure is this prediction?
226
+
227
+ ```python
228
+ from process_improve.multivariate import PLS
229
+
230
+ # Hold out runs 41 to 50 and predict their 5 quality measurements, with 95% intervals
231
+ x_scaler, y_scaler = MCUVScaler().fit(process.loc[:40]), MCUVScaler().fit(quality.loc[:40])
232
+ n = PLS.select_n_components(process.loc[:40], quality.loc[:40], max_components=6, random_state=0).n_components
233
+ pls = PLS(n_components=n).fit(x_scaler.transform(process.loc[:40]), y_scaler.transform(quality.loc[:40]))
234
+ interval = pls.prediction_interval(x_scaler.transform(process.loc[41:50]))
235
+ low, high = y_scaler.inverse_transform(interval.lower), y_scaler.inverse_transform(interval.upper)
236
+
237
+ # Cross-validation picks 3 components, and 48 of the 50 held-out measurements land inside
238
+ inside = (quality.loc[41:50] >= low) & (quality.loc[41:50] <= high)
239
+ print(n, int(inside.to_numpy().sum())) # 3 48
240
+
241
+ # The quality is driven by the same reactor zone that moved in the upset
242
+ print(pls.vip().nlargest(3).round(2).to_dict()) # {'z2': 1.38, 'Fi2': 1.38, 'Tmax2': 1.37}
243
+ ```
244
+
245
+ ### Which recipe hits my target?
246
+
247
+ ```python
248
+ from process_improve.multivariate import OPLS
249
+
250
+ # Acetic acid, H2S and lactic acid in 26 cheddar cheeses, and their taste score
251
+ cheese = pd.read_csv("https://openmv.net/file/cheddar-cheese.csv").iloc[4:]
252
+ X, y = cheese[["Acetic", "H2S", "Lactic"]], cheese[["Taste"]]
253
+ model = PLS(n_components=2).fit(X, y)
254
+
255
+ recipe = model.invert(y_desired=20.9) # the inputs predicted to give a taste of 20.9
256
+ print(recipe.x_new.round(2).to_list()) # [5.52, 5.56, 1.4]
257
+ print(round(recipe.hotellings_t2, 2)) # 0.06
258
+ print(recipe.null_space_dimension) # 1
259
+
260
+ # One free direction: a line of recipes with the same predicted taste
261
+ walk = [model.invert(20.9, null_space_coordinates=[s]).x_new.round(2).to_list() for s in (-1.0, 0.0, 1.0)]
262
+ print(walk) # [[4.95, 6.1, 1.33], [5.52, 5.56, 1.4], [6.09, 5.02, 1.46]]
263
+
264
+ # O-PLS separates that freedom while fitting, so inversion becomes one division
265
+ opls = OPLS(n_orthogonal_components=1).fit(X, y)
266
+ print(opls.invert(y_desired=20.9).x_new.round(2).to_list()) # [5.46, 5.62, 1.39]
267
+ ```
268
+
269
+ The freedom along that line is what you spend on cost, supply or a regulatory window; the
270
+ `hotellings_t2` tells you when a recipe has walked past the evidence. The
271
+ [user guide](https://kgdunn.github.io/process-improve/user_guide/model_inversion.html) and the
272
+ [book chapter](https://learnche.org/pid/latent-variable-modelling/projection-to-latent-structures/pls-model-inversion-and-the-orthogonal-space)
273
+ go further.
274
+
275
+ ### Has the process drifted?
276
+
277
+ ```python
278
+ from process_improve.multivariate import AdaptivePCA
279
+
280
+ # Learn from the first 50 runs in their own units (the model centres and scales itself),
281
+ # then stream the last four, one at a time
282
+ monitor = AdaptivePCA(n_components=3).fit(process.loc[:50])
283
+ alarms = [not monitor.update(row.to_numpy()).in_control for _, row in process.loc[51:].iterrows()]
284
+ print(alarms) # [False, True, True, True]
285
+ ```
286
+
287
+ `AdaptivePCA` and `AdaptivePLS` keep learning as data arrive, so a model does not go stale
288
+ when the process drifts, and they report how far it has moved from where it was trained.
289
+
290
+ ## What's inside
291
+
292
+ - **Designed experiments**: factorial, screening (Plackett-Burman, DSD, supersaturated),
293
+ response-surface (CCD, Box-Behnken, OMARS), mixture, space-filling and optimal (D, I, A, E,
294
+ G, K) designs, in constrained regions too; design evaluation, analysis (including split
295
+ plots), augmentation, multi-response optimisation and a multi-stage strategy recommender.
296
+ - **PCA** with SVD and NIPALS, native missing-value handling by Trimmed Score Regression,
297
+ Hotelling's T² and SPE limits, and score, T² and SPE contributions.
298
+ - **PLS** regression with a scikit-learn API, VIP, cross-validated component selection and
299
+ prediction intervals; **PLS-DA** classification with a Bayesian decision rule for
300
+ unbalanced classes and a permutation test that says whether the separation is real.
301
+ - **Model inversion**: `PLS.invert()` and `OPLS` solve for the inputs that reach a target
302
+ and return the null space of equally valid designs.
303
+ - **Multi-block and T-shaped data**: TPLS (PLS for T-shaped data structures), MBPCA and MBPLS.
304
+ - **On-line models**: `AdaptivePCA` and `AdaptivePLS` for monitoring and soft sensing.
305
+ - **Process monitoring**: Shewhart, EWMA, CUSUM and Holt-Winters control charts, process capability.
306
+ - **Batch data**: alignment, feature extraction, batch PCA and PLS, on-line batch monitoring.
307
+ - **Sensory panels**: panel validation, the Mixed Assessor Model, attribute-to-product relations.
308
+ - **Robust regression**: repeated-median and Theil-Sen estimators for data with outliers.
309
+ - **Interactive Plotly diagnostics** on every fitted model, and `pandas`-native outputs that
310
+ keep your row and column labels.
311
+
312
+ Release notes are in the [changelog](https://github.com/kgdunn/process-improve/blob/main/CHANGELOG.md).
313
+
314
+ ## Works alongside scikit-learn
315
+
316
+ `process-improve` sits *next to* scikit-learn, not in place of it. Its estimators follow the
317
+ same conventions (`fit`, `predict`, `score`, the `_` suffix on fitted attributes), so they
318
+ drop into `Pipeline`, `GridSearchCV` and `cross_val_score`. What it adds is the
319
+ process-analytics layer: the diagnostics that tell you whether a new observation is normal,
320
+ which variable moved, and how confident a prediction is.
321
+
322
+ | Capability | scikit-learn | process-improve |
323
+ | ------------------------------------------------- | :----------: | :-------------: |
324
+ | PCA, PLS with sklearn-style API | ✓ | ✓ |
325
+ | Missing-data fitting (NIPALS / TSR) | - | ✓ |
326
+ | Hotelling's T² + SPE outlier limits | - | ✓ |
327
+ | Variable-level contributions | - | ✓ |
328
+ | Prediction intervals for PLS | - | ✓ |
329
+ | Multi-block models (TPLS, MBPLS) | - | ✓ |
330
+ | Model inversion: design inputs for a target | - | ✓ |
331
+ | On-line / adaptive monitoring (recursive PCA/PLS) | - | ✓ |
332
+ | Designed experiments, incl. OMARS & optimal | - | ✓ |
333
+ | Shewhart, EWMA, CUSUM, Holt-Winters charts | - | ✓ |
334
+ | Batch process monitoring | - | ✓ |
335
+ | Plotly diagnostics built in | - | ✓ |
336
+ | Labeled `DataFrame` outputs | partial | ✓ |
337
+
338
+ `fit()` returns `self`, fitted attributes end with an underscore (`scores_`, `loadings_`,
339
+ `spe_`, `hotellings_t2_`, `r2_cumulative_`, ...), `predict()` returns predictions, and
340
+ `diagnose()` returns an `sklearn.utils.Bunch` with named fields such as `spe` and
341
+ `hotellings_t2`. Pipelines that mix scaled numeric and one-hot encoded columns, and the
342
+ current gaps, are in
343
+ [SKLEARN_COMPATIBILITY.md](https://github.com/kgdunn/process-improve/blob/main/SKLEARN_COMPATIBILITY.md).
344
+
345
+ ## Installation
346
+
347
+ ```bash
348
+ pip install process-improve # core: numpy, pandas, scipy, scikit-learn, statsmodels, ...
349
+ pip install 'process-improve[plotting]' # adds matplotlib, plotly, seaborn, ridgeplot
350
+ pip install 'process-improve[batch]' # adds openpyxl, ruptures, scikit-image (batch data IO, change points)
351
+ pip install 'process-improve[control]' # adds osqp (the batch mid-course correction solver)
352
+ pip install 'process-improve[mcp]' # adds mcp (the MCP server runtime)
353
+ pip install 'process-improve[fast]' # adds numba (JIT speedups for batch alignment)
354
+ pip install 'process-improve[all]' # everything above
355
+ ```
356
+
357
+ Requires Python 3.10 or newer. The core install pulls in `numpy`, `pandas`, `scipy`,
358
+ `scikit-learn`, `statsmodels`, `patsy`, `pydantic`, `pyyaml`, `threadpoolctl` and `tqdm`.
359
+ Heavier optional surfaces (plotting, Taguchi arrays, batch IO, batch control, the MCP server, numba JIT)
360
+ live in extras, so a caller who only needs, say, `detect_multivariate_outliers` does not have
361
+ to install Plotly or numba.
362
+
363
+ ## Use it from Claude
364
+
365
+ The designed-experiments tooling ships as a Claude Skill, so you can plan, generate, verify
366
+ and analyse experiments in your own Claude account with no server involved:
367
+
368
+ ```
369
+ /plugin marketplace add kgdunn/process-improve
370
+ /plugin install doe-designer@process-improve
371
+ ```
372
+
373
+ The skill's first rule is that a design matrix is never written out by the model: it is
374
+ generated from a catalogue and then verified, because a language model asked to produce a
375
+ fractional factorial will often return one that looks right and is a lower resolution than
376
+ it claims. See [`skills/README.md`](https://github.com/kgdunn/process-improve/blob/main/skills/README.md)
377
+ for the other install routes (local folder, claude.ai upload) and for the MCP server, which
378
+ exposes the same tool registry without the workflow guidance.
379
+
380
+ ## Citing process-improve
381
+
382
+ If you use this package in academic work, please cite it. The
383
+ [`CITATION.cff`](https://github.com/kgdunn/process-improve/blob/main/CITATION.cff) file carries
384
+ the current version and release date, and GitHub renders a *"Cite this repository"* button
385
+ in the sidebar with ready-made BibTeX and APA entries:
386
+
387
+ ```bibtex
388
+ @software{dunn_process_improve,
389
+ author = {Dunn, Kevin G.},
390
+ title = {{process-improve: Multivariate Analysis for Process Improvement}},
391
+ year = {2026},
392
+ url = {https://github.com/kgdunn/process-improve}
393
+ }
394
+ ```
395
+
396
+ Add the `version` field from `CITATION.cff` (or the release tag you installed) when citing a
397
+ specific version.
398
+
399
+ ## License
400
+
401
+ MIT: see [LICENSE](https://github.com/kgdunn/process-improve/blob/main/LICENSE) for details.
402
+
403
+ ## Contributing
404
+
405
+ Bug reports, feature requests and pull requests are welcome. See
406
+ [CONTRIBUTING.md](https://github.com/kgdunn/process-improve/blob/main/CONTRIBUTING.md) for
407
+ development setup, testing and code style, and the
408
+ [architecture overview](https://kgdunn.github.io/process-improve/architecture.html) for a map
409
+ of the codebase. Bugs and feature requests go on the
410
+ [issue tracker](https://github.com/kgdunn/process-improve/issues).