process-improve 1.22.0__tar.gz → 1.22.2__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 (142) hide show
  1. {process_improve-1.22.0 → process_improve-1.22.2}/PKG-INFO +1 -1
  2. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/batch/features.py +6 -6
  3. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/batch/plotting.py +3 -3
  4. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/batch/tools.py +2 -2
  5. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/bivariate/methods.py +6 -5
  6. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/optimization.py +3 -1
  7. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/monitoring/control_charts.py +12 -8
  8. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/multivariate/methods.py +12 -7
  9. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/multivariate/plots.py +2 -1
  10. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/regression/methods.py +8 -2
  11. {process_improve-1.22.0 → process_improve-1.22.2}/pyproject.toml +1 -1
  12. {process_improve-1.22.0 → process_improve-1.22.2}/README.md +0 -0
  13. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/__init__.py +0 -0
  14. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/batch/__init__.py +0 -0
  15. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/batch/alignment_helpers.py +0 -0
  16. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/batch/data_input.py +0 -0
  17. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/batch/preprocessing.py +0 -0
  18. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/bivariate/__init__.py +0 -0
  19. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/bivariate/tools.py +0 -0
  20. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/batch/batch-fake-data.csv +0 -0
  21. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/batch/details.txt +0 -0
  22. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/batch/dryer.csv +0 -0
  23. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/batch/nylon.csv +0 -0
  24. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/experiments/boilingpot.csv +0 -0
  25. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/experiments/test_doe1.csv +0 -0
  26. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/monitoring/batch-yield-and-purity.csv +0 -0
  27. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/monitoring/rubber-colour.csv +0 -0
  28. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/LDPE/C.csv +0 -0
  29. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/LDPE/Hotellings_T2_A3.csv +0 -0
  30. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/LDPE/Hotellings_T2_A6.csv +0 -0
  31. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/LDPE/LDPE.csv +0 -0
  32. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/LDPE/P.csv +0 -0
  33. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/LDPE/R.csv +0 -0
  34. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/LDPE/T.csv +0 -0
  35. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/LDPE/U.csv +0 -0
  36. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/LDPE/W.csv +0 -0
  37. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/LDPE/Yhat_A6.csv +0 -0
  38. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/dtu-pectin/NOTICE +0 -0
  39. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/dtu-pectin/extraction1.csv +0 -0
  40. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/dtu-pectin/extraction2.csv +0 -0
  41. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/dtu-pectin/extraction3.csv +0 -0
  42. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/dtu-pectin/ftir1.csv +0 -0
  43. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/dtu-pectin/ftir2.csv +0 -0
  44. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/dtu-pectin/ftir3.csv +0 -0
  45. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/kamyr.csv +0 -0
  46. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/tablet-spectra.csv +0 -0
  47. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/tpls-pyphi/SOURCE +0 -0
  48. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/tpls-pyphi/formulas_Group1.csv +0 -0
  49. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/tpls-pyphi/formulas_Group2.csv +0 -0
  50. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/tpls-pyphi/formulas_Group3.csv +0 -0
  51. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/tpls-pyphi/formulas_Group4.csv +0 -0
  52. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/tpls-pyphi/formulas_Group5.csv +0 -0
  53. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/tpls-pyphi/process_conditions.csv +0 -0
  54. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/tpls-pyphi/properties_Group1.csv +0 -0
  55. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/tpls-pyphi/properties_Group2.csv +0 -0
  56. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/tpls-pyphi/properties_Group3.csv +0 -0
  57. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/tpls-pyphi/properties_Group4.csv +0 -0
  58. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/tpls-pyphi/properties_Group5.csv +0 -0
  59. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/datasets/multivariate/tpls-pyphi/quality_indicators.csv +0 -0
  60. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/__init__.py +0 -0
  61. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/analysis.py +0 -0
  62. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/augment.py +0 -0
  63. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/datasets.py +0 -0
  64. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/designs.py +0 -0
  65. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/designs_factorial.py +0 -0
  66. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/designs_mixture.py +0 -0
  67. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/designs_optimal.py +0 -0
  68. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/designs_response_surface.py +0 -0
  69. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/designs_screening.py +0 -0
  70. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/designs_utils.py +0 -0
  71. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/evaluate.py +0 -0
  72. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/factor.py +0 -0
  73. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/knowledge/__init__.py +0 -0
  74. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/knowledge/api.py +0 -0
  75. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/knowledge/data/concepts.yaml +0 -0
  76. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/knowledge/data/decision_rules.yaml +0 -0
  77. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/knowledge/data/design_types.yaml +0 -0
  78. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/knowledge/data/diagnostics.yaml +0 -0
  79. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/knowledge/engine.py +0 -0
  80. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/knowledge/models.py +0 -0
  81. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/models.py +0 -0
  82. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/optimal.py +0 -0
  83. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/simulations.py +0 -0
  84. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/strategy/__init__.py +0 -0
  85. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/strategy/budget.py +0 -0
  86. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/strategy/domain_templates.py +0 -0
  87. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/strategy/engine.py +0 -0
  88. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/strategy/models.py +0 -0
  89. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/structures.py +0 -0
  90. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/tools.py +0 -0
  91. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/visualization/__init__.py +0 -0
  92. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/visualization/api.py +0 -0
  93. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/visualization/plots/__init__.py +0 -0
  94. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/visualization/plots/cube_plot.py +0 -0
  95. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/visualization/plots/design_quality.py +0 -0
  96. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/visualization/plots/diagnostics.py +0 -0
  97. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/visualization/plots/effects.py +0 -0
  98. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/visualization/plots/optimization_plots.py +0 -0
  99. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/visualization/plots/registry.py +0 -0
  100. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/visualization/plots/significance.py +0 -0
  101. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/visualization/plots/square_plot.py +0 -0
  102. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/experiments/visualization/plots/surfaces.py +0 -0
  103. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/mcp_server.py +0 -0
  104. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/monitoring/__init__.py +0 -0
  105. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/monitoring/metrics.py +0 -0
  106. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/monitoring/tools.py +0 -0
  107. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/multivariate/__init__.py +0 -0
  108. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/multivariate/tools.py +0 -0
  109. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/notebooks_examples/Example notebook.ipynb +0 -0
  110. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/notebooks_examples/Tablets.xlsx +0 -0
  111. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/notebooks_examples/batch/__init__.py +0 -0
  112. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/notebooks_examples/batch/alignment-and-pca-example.ipynb +0 -0
  113. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/notebooks_examples/batch/batch-optimization.ipynb +0 -0
  114. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/notebooks_examples/batch/batch_llm.py +0 -0
  115. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/notebooks_examples/batch/batch_llm_multivariate.py +0 -0
  116. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/notebooks_examples/batch/batch_music.py +0 -0
  117. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/notebooks_examples/batch/demo-multiplots.ipynb +0 -0
  118. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/notebooks_examples/experiments/case-studies.py +0 -0
  119. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/notebooks_examples/least-squares-modelling/Misguided-reliance-on-R2-alone.ipynb +0 -0
  120. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/notebooks_examples/multivariate/pca_example.py +0 -0
  121. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/regression/__init__.py +0 -0
  122. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/regression/tools.py +0 -0
  123. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/simulation/__init__.py +0 -0
  124. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/simulation/model.py +0 -0
  125. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/simulation/tools.py +0 -0
  126. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/tool_safety.py +0 -0
  127. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/tool_spec.py +0 -0
  128. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/univariate/__init__.py +0 -0
  129. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/univariate/metrics.py +0 -0
  130. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/univariate/tools.py +0 -0
  131. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/visualization/__init__.py +0 -0
  132. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/visualization/adapters/__init__.py +0 -0
  133. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/visualization/adapters/base.py +0 -0
  134. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/visualization/adapters/echarts_adapter.py +0 -0
  135. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/visualization/adapters/plotly_adapter.py +0 -0
  136. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/visualization/charts/__init__.py +0 -0
  137. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/visualization/charts/boxplot.py +0 -0
  138. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/visualization/colors.py +0 -0
  139. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/visualization/spec.py +0 -0
  140. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/visualization/themes.py +0 -0
  141. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/visualization/tools.py +0 -0
  142. {process_improve-1.22.0 → process_improve-1.22.2}/process_improve/visualization/types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: process-improve
3
- Version: 1.22.0
3
+ Version: 1.22.2
4
4
  Summary: Designed Experiments; Latent Variables (PCA, PLS, multivariate methods with missing data); Process Monitoring; Batch data analysis.
5
5
  Keywords: Designed Experiments,Latent Variables,PCA,PLS,Multivariate Data Analysis,Batch data analysis
6
6
  Author: Kevin Dunn
@@ -448,12 +448,12 @@ def f_count(
448
448
  """
449
449
  Feature: count.
450
450
 
451
- The index number of the final value for each tag, for the given tags
451
+ The number of non-missing observations for each tag, for the given tags
452
452
  in ``tags``, for each unique batch in the ``batch_col`` indicator column,
453
453
  and within each unique phase, per batch, of the ``phase_col`` column.
454
454
 
455
- Can be useful to get the 1-based index (it is a count!), and to then
456
- use that index for other calculation purposes.
455
+ For data without internal gaps this count equals the 1-based index of the
456
+ final row, so it can also be used as that index for other calculations.
457
457
 
458
458
  See also: f_sum, f_last
459
459
  """
@@ -659,10 +659,10 @@ def f_elbow( # noqa: PLR0913
659
659
  elbow_index = np.nan
660
660
 
661
661
  if only_index:
662
- output.loc[batch_id][tag] = elbow_index
662
+ output.loc[batch_id, tag] = elbow_index
663
663
  elif np.isnan(elbow_index):
664
- output.loc[batch_id][tag] = np.isnan
664
+ output.loc[batch_id, tag] = np.nan
665
665
  else:
666
- output.loc[batch_id][tag] = x_vals[elbow_index]
666
+ output.loc[batch_id, tag] = x_vals[elbow_index]
667
667
 
668
668
  return output.rename(columns=dict(zip(tags, f_names, strict=False)))
@@ -237,7 +237,7 @@ def colours_per_batch_id(
237
237
  Return a colour to use for each trace in the plot. A dictionary: keys are batch ids, and
238
238
  the value is a colour and line width setting for Plotly.
239
239
 
240
- override_default_colour: bool
240
+ use_default_colour: bool
241
241
  If True, then the default colour is used (grey: 0.5, 0.5, 0.5)
242
242
  """
243
243
  if colour_map is None:
@@ -558,8 +558,8 @@ def plot_multitags( # noqa: PLR0912, PLR0913, PLR0915
558
558
  method="animate",
559
559
  args=[
560
560
  # https://plotly.com/python/animations/
561
- # Note the None is in a list!
562
- [[None]], # TODO: does not work at the moment.
561
+ # Note the None is in a list.
562
+ [None],
563
563
  dict(
564
564
  frame=dict(duration=0, redraw=False),
565
565
  transition=dict(duration=0),
@@ -53,7 +53,7 @@ _TIME_FEATURE_MAP = {
53
53
  "etc. for each batch and each measurement tag. "
54
54
  "The result is a feature matrix with one row per batch, suitable for multivariate "
55
55
  "analysis (e.g. PCA on batch data). "
56
- "Available features: 'mean', 'median', 'std', 'iqr', 'mad', 'robust_mad', 'sum', "
56
+ "Available features: 'mean', 'median', 'std', 'iqr', 'sum', "
57
57
  "'min', 'max', 'last', 'count'. "
58
58
  "Time-dependent features (require time_column): 'area', 'slope'."
59
59
  ),
@@ -76,7 +76,7 @@ _TIME_FEATURE_MAP = {
76
76
  "items": {
77
77
  "type": "string",
78
78
  "enum": [
79
- "mean", "median", "std", "iqr", "mad", "robust_mad",
79
+ "mean", "median", "std", "iqr",
80
80
  "sum", "min", "max", "last", "count", "area", "slope",
81
81
  ],
82
82
  },
@@ -16,13 +16,14 @@ def find_elbow_point(x: np.ndarray, y: np.ndarray, max_iter: int = 41) -> int |
16
16
  Find the elbow point when plotting numeric entries in `x` vs numeric values in list `y`.
17
17
 
18
18
  Return the index into the vectors `x` and `y` [the vectors must have the same length], where
19
- the elbow point occurs.
19
+ the elbow point occurs. Returns -1 if every value in `x` or `y` is missing.
20
20
 
21
21
  Using a robust linear fit, sorts the samples in X (independent variable)
22
- and takes sample 1:5 from the left, and samples (end-5):end and fits two
23
- linear regressions, then computes the intersection of the two fitted lines.
24
- Adds a point to each regression, so (1:6) and (end-6:end) and repeats,
25
- accumulating one intersection point per iteration.
22
+ and takes the first 5 samples from the left, and the last 5 from the right,
23
+ then fits two linear regressions and computes the intersection of the two
24
+ fitted lines. The window size is then grown over `max_iter` (default 41)
25
+ evenly spaced steps, via `numpy.linspace`, up to roughly half the data,
26
+ accumulating one intersection point per step.
26
27
 
27
28
  The elbow is taken as the data point whose (x, y) location is closest to
28
29
  the median of the accumulated intersection points; the median location is
@@ -359,7 +359,9 @@ def _steepest_path( # noqa: PLR0913
359
359
  step_size : float
360
360
  Step magnitude in coded units (default 0.5).
361
361
  n_steps : int
362
- Number of steps to generate (default 10).
362
+ Number of steps to take away from the design centre (default 10).
363
+ The returned ``steps`` list has ``n_steps + 1`` entries because it
364
+ also includes step 0 at the centre.
363
365
  direction : str
364
366
  ``"ascent"`` or ``"descent"``.
365
367
  factor_ranges : dict or None
@@ -84,13 +84,17 @@ class ControlChart:
84
84
  """
85
85
  Find for a given vector `y`, the control chart target and limits.
86
86
 
87
- Only for the Holt-Winters method, and only when there are more than
88
- min(20, max(10, np.ceil(0.10 * N))))
87
+ Works for both the Holt-Winters ('hw') and 'xbar.no.subgroup' variants.
89
88
 
90
- measurements, where N is the length of the input vector. In other words, the provided
91
- target and standard deviation are only used if more than 10 to 20 measurements.
92
- If `target` and `s` are numeric, then that target value and that standard deviation value
93
- are used, otherwise these values are estimated.
89
+ For the Holt-Winters variant, when there are fewer than
90
+
91
+ min(20, max(10, np.ceil(0.10 * N)))
92
+
93
+ measurements (where N is the length of the input vector), the target and
94
+ standard deviation are estimated directly from the data and any provided
95
+ `target` / `s` are ignored for that small-sample case.
96
+ Otherwise, if `target` and `s` are numeric, those values are used;
97
+ if not, they are estimated.
94
98
  """
95
99
  self._given_target = target
96
100
  self._given_s = s
@@ -149,8 +153,8 @@ class ControlChart:
149
153
  def _xbar_no_subgroup_fit(self) -> None:
150
154
  """
151
155
  Fit the control chart from the data samples, assuming each sample is its own subgroup.
152
- Variant = 'regulur' | 'robust' switchs how the average and standard deviation are
153
- calculated.
156
+ The `style` attribute ('regular' | 'robust') switches how the average and standard
157
+ deviation are calculated.
154
158
 
155
159
  Control chart limits assume the data are normally distributed and independent. In
156
160
  particular, this last assumption can have consequences if not actually met. Limits may be
@@ -2972,17 +2972,22 @@ class TPLS(RegressorMixin, BaseEstimator):
2972
2972
  max_iter : int, optional
2973
2973
  The maximum number of iterations for the TPLS algorithm. Default is 500.
2974
2974
 
2975
+ skip_f_matrix_preprocessing : bool, optional
2976
+ If True, the F (formula) matrices are used as-is, skipping the internal
2977
+ centering and scaling of the F block. Default is False.
2978
+
2975
2979
  Notes
2976
2980
  -----
2977
- The input ``X`` is a dictionary with 4 keys:
2981
+ The input ``X`` passed to :meth:`fit` and :meth:`predict` is a dictionary with 3 keys:
2978
2982
 
2979
- - ``D``: Database of DataFrames (properties in columns, materials in rows).
2980
- ``D = {"Group A": df_props_a, "Group B": df_props_b, ...}``
2981
2983
  - ``F``: Formula matrices (rows = blends, columns = materials).
2982
2984
  ``F = {"Group A": df_formulas_a, "Group B": df_formulas_b, ...}``
2983
2985
  - ``Z``: Process conditions - one row per blend, one column per condition.
2984
2986
  - ``Y``: Product quality indicators - one row per blend, one column per indicator.
2985
2987
 
2988
+ The ``D`` matrix (database of material properties) is supplied once at
2989
+ construction via the ``d_matrix`` argument; it is not part of ``X``.
2990
+
2986
2991
  Attributes
2987
2992
  ----------
2988
2993
  n_samples : int
@@ -3014,8 +3019,8 @@ class TPLS(RegressorMixin, BaseEstimator):
3014
3019
  >>> }
3015
3020
  >>> process_conditions = {"Conditions": pd.DataFrame(rng.standard_normal((n_formulas, n_conditions)))}
3016
3021
  >>> quality_indicators = {"Quality": pd.DataFrame(rng.standard_normal((n_formulas, n_outputs)))}
3017
- >>> all_data = {"Z": process_conditions, "D": properties, "F": formulas, "Y": quality_indicators}
3018
- >>> estimator = TPLS(n_components=4)
3022
+ >>> all_data = {"Z": process_conditions, "F": formulas, "Y": quality_indicators}
3023
+ >>> estimator = TPLS(n_components=4, d_matrix=properties)
3019
3024
  >>> estimator.fit(all_data)
3020
3025
  """
3021
3026
 
@@ -3063,7 +3068,7 @@ class TPLS(RegressorMixin, BaseEstimator):
3063
3068
 
3064
3069
  Parameters
3065
3070
  ----------
3066
- X : {dictionary of dataframes}, keys that must be present: "D", "F", "Z", and "Y"
3071
+ X : {dictionary of dataframes}, keys that must be present: "F", "Z", and "Y"
3067
3072
  The training input samples. See documentation in the class definition for more information on each matrix.
3068
3073
 
3069
3074
  Returns
@@ -3238,7 +3243,7 @@ class TPLS(RegressorMixin, BaseEstimator):
3238
3243
 
3239
3244
  # Testing/inference phase:
3240
3245
  new_data = {"Z": ..., "F": ...} # you need at least the F block for a new prediction. "Z" is optional.
3241
- predictions = estimator.predict(new_data_pp)
3246
+ predictions = estimator.predict(new_data)
3242
3247
 
3243
3248
  Parameters
3244
3249
  ----------
@@ -29,7 +29,8 @@ def plot_pre_checks(model: BaseEstimator, pc_horiz: int, pc_vert: int, pc_depth:
29
29
  f"The model has {n_components} components. Ensure that 1 <= pc_vert<={n_components}."
30
30
  )
31
31
  assert -1 <= pc_depth <= n_components, (
32
- f"The model has {n_components} components. Ensure that 1 <= pc_depth<={n_components}."
32
+ f"The model has {n_components} components. Ensure that pc_depth is -1 (no depth axis) "
33
+ f"or 1 <= pc_depth <= {n_components}."
33
34
  )
34
35
  assert len({pc_horiz, pc_vert, pc_depth}) == 3, "Specify distinct components for each axis"
35
36
 
@@ -85,17 +85,23 @@ def robust_regression( # noqa: PLR0913, PLR0915
85
85
 
86
86
  Returns a dictionary of outputs with these keys::
87
87
 
88
- coefficients: a vector of K coefficients, one for each column in X
88
+ N: the number of observations used to fit the model
89
+ coefficients: a length-1 list containing the regression slope
89
90
  intercept: returned if fit_intercept==True, otherwise 0
90
- standard_errors: a vector of K standard errors, one per column in X
91
+ standard_errors: a length-1 list containing the standard error of the slope
91
92
  standard_error_intercept: standard error for the intercept (np.nan if fit_intercept=False)
92
93
  R2: the R^2 value
93
94
  SE: the model's standard error
95
+ x_ssq: the sum of squares of (x - mean(x))
96
+ k: the number of model parameters (2 if fit_intercept else 1)
94
97
  fitted_values: the N predicted values, one per row in y
95
98
  residuals: the N residuals
96
99
  t_value: the t-values for the standard errors
97
100
  conf_intervals: K rows x 2 columns (lower, upper) confidence intervals
101
+ conf_interval_intercept: (lower, upper) confidence interval for the intercept
98
102
  pi_range: prediction intervals above and below, over the range of data
103
+ leverage: the hat-matrix diagonal (leverage) for each observation
104
+ influence: Cook-style influence values for each observation
99
105
  """
100
106
 
101
107
  out: dict[str, Any] = {
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "process-improve"
3
- version = "1.22.0"
3
+ version = "1.22.2"
4
4
  description = 'Designed Experiments; Latent Variables (PCA, PLS, multivariate methods with missing data); Process Monitoring; Batch data analysis.'
5
5
  readme = "README.md"
6
6
  license = "MIT"