pccpy 0.4.3__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.
- pccpy-0.4.3/LICENSE +21 -0
- pccpy-0.4.3/PKG-INFO +319 -0
- pccpy-0.4.3/README.md +282 -0
- pccpy-0.4.3/pyproject.toml +58 -0
- pccpy-0.4.3/setup.cfg +4 -0
- pccpy-0.4.3/src/pccpy.egg-info/PKG-INFO +319 -0
- pccpy-0.4.3/src/pccpy.egg-info/SOURCES.txt +35 -0
- pccpy-0.4.3/src/pccpy.egg-info/dependency_links.txt +1 -0
- pccpy-0.4.3/src/pccpy.egg-info/requires.txt +15 -0
- pccpy-0.4.3/src/pccpy.egg-info/top_level.txt +1 -0
- pccpy-0.4.3/src/spyc/__init__.py +89 -0
- pccpy-0.4.3/src/spyc/_constants.py +101 -0
- pccpy-0.4.3/src/spyc/_data.py +106 -0
- pccpy-0.4.3/src/spyc/_sigma.py +88 -0
- pccpy-0.4.3/src/spyc/capability.py +395 -0
- pccpy-0.4.3/src/spyc/charts/__init__.py +24 -0
- pccpy-0.4.3/src/spyc/charts/_engine.py +102 -0
- pccpy-0.4.3/src/spyc/charts/advanced.py +497 -0
- pccpy-0.4.3/src/spyc/charts/attributes.py +122 -0
- pccpy-0.4.3/src/spyc/charts/timeweighted.py +108 -0
- pccpy-0.4.3/src/spyc/charts/variables.py +148 -0
- pccpy-0.4.3/src/spyc/multivariate.py +542 -0
- pccpy-0.4.3/src/spyc/normality.py +78 -0
- pccpy-0.4.3/src/spyc/plotting.py +227 -0
- pccpy-0.4.3/src/spyc/quality_tools.py +60 -0
- pccpy-0.4.3/src/spyc/results.py +181 -0
- pccpy-0.4.3/src/spyc/rules.py +169 -0
- pccpy-0.4.3/tests/test_advanced_charts.py +283 -0
- pccpy-0.4.3/tests/test_capability.py +167 -0
- pccpy-0.4.3/tests/test_charts.py +285 -0
- pccpy-0.4.3/tests/test_constants.py +42 -0
- pccpy-0.4.3/tests/test_multivariate.py +274 -0
- pccpy-0.4.3/tests/test_multivariate_stages_boxcox.py +218 -0
- pccpy-0.4.3/tests/test_normality_and_tools.py +76 -0
- pccpy-0.4.3/tests/test_plots.py +46 -0
- pccpy-0.4.3/tests/test_rules.py +96 -0
- pccpy-0.4.3/tests/test_zone_mcusum.py +226 -0
pccpy-0.4.3/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Autores de spyc
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
pccpy-0.4.3/PKG-INFO
ADDED
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pccpy
|
|
3
|
+
Version: 0.4.3
|
|
4
|
+
Summary: Control Estadístico de Procesos (SPC) en Python: cartas de control, capacidad y pruebas al estilo Minitab
|
|
5
|
+
Author-email: LeoSanta15 <angelsanta1@gmail.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/LeoSanta15/pccpy
|
|
8
|
+
Project-URL: Issues, https://github.com/LeoSanta15/pccpy/issues
|
|
9
|
+
Project-URL: Changelog, https://github.com/LeoSanta15/pccpy/blob/main/CHANGELOG.md
|
|
10
|
+
Keywords: spc,control estadístico de procesos,cartas de control,capacidad,minitab,six sigma
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
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: Operating System :: OS Independent
|
|
18
|
+
Classifier: Intended Audience :: Science/Research
|
|
19
|
+
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
20
|
+
Requires-Python: >=3.9
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Requires-Dist: numpy>=1.22
|
|
24
|
+
Requires-Dist: scipy>=1.9
|
|
25
|
+
Requires-Dist: pandas>=1.4
|
|
26
|
+
Requires-Dist: matplotlib>=3.5
|
|
27
|
+
Provides-Extra: dev
|
|
28
|
+
Requires-Dist: pytest>=7; extra == "dev"
|
|
29
|
+
Requires-Dist: pytest-cov>=4; extra == "dev"
|
|
30
|
+
Requires-Dist: ruff>=0.6; extra == "dev"
|
|
31
|
+
Requires-Dist: mypy>=1.10; extra == "dev"
|
|
32
|
+
Provides-Extra: docs
|
|
33
|
+
Requires-Dist: sphinx>=7; extra == "docs"
|
|
34
|
+
Requires-Dist: sphinx-rtd-theme>=2; extra == "docs"
|
|
35
|
+
Requires-Dist: myst-parser>=2; extra == "docs"
|
|
36
|
+
Dynamic: license-file
|
|
37
|
+
|
|
38
|
+
# spyc
|
|
39
|
+
|
|
40
|
+
**Control Estadístico de Procesos (SPC) en Python, al estilo Minitab.**
|
|
41
|
+
|
|
42
|
+
Cartas de control, pruebas de causas especiales, análisis de capacidad, prueba de
|
|
43
|
+
normalidad y Pareto, con salidas y convenciones (LCS/LCI, LEI/LES, Cp/Cpk/Pp/Ppk,
|
|
44
|
+
Z.Bench, PPM, Anderson-Darling) pensadas para quien viene de Minitab.
|
|
45
|
+
|
|
46
|
+
Todo en español: nombres de columnas, mensajes, descripciones de pruebas y gráficos.
|
|
47
|
+
|
|
48
|
+
## Instalación
|
|
49
|
+
|
|
50
|
+
Desde GitHub:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pip install git+https://github.com/TU_USUARIO/spyc.git
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Desarrollo local:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
git clone https://github.com/TU_USUARIO/spyc.git
|
|
60
|
+
cd spyc
|
|
61
|
+
pip install -e ".[dev]"
|
|
62
|
+
pytest --cov=spyc # pruebas + cobertura (97% al momento de escribir esto)
|
|
63
|
+
ruff check src/ # estilo y errores comunes
|
|
64
|
+
mypy src/spyc # tipos
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Ver [`CHANGELOG.md`](CHANGELOG.md) para el historial de versiones.
|
|
68
|
+
|
|
69
|
+
## Documentación
|
|
70
|
+
|
|
71
|
+
Hay documentación construida con Sphinx en `docs/`, con una página por cada grupo
|
|
72
|
+
de cartas (generadas a partir de los docstrings, así que siempre coinciden con el
|
|
73
|
+
código instalado). Para generarla y abrirla en tu máquina:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
pip install -e ".[docs]"
|
|
77
|
+
sphinx-build -b html docs/source docs/build
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Abre `docs/build/index.html`. Una vez el repositorio esté en GitHub, puedes conectarlo
|
|
81
|
+
en [readthedocs.org](https://readthedocs.org) para tenerla publicada automáticamente
|
|
82
|
+
en cada push; el archivo `.readthedocs.yaml` ya está listo para eso.
|
|
83
|
+
|
|
84
|
+
Requiere Python ≥ 3.9 (numpy, scipy, pandas, matplotlib).
|
|
85
|
+
|
|
86
|
+
## Inicio rápido
|
|
87
|
+
|
|
88
|
+
```python
|
|
89
|
+
import numpy as np
|
|
90
|
+
import spyc
|
|
91
|
+
|
|
92
|
+
rng = np.random.default_rng(1)
|
|
93
|
+
x = rng.normal(100, 2, 60)
|
|
94
|
+
x[40:] += 3 # el proceso se desplaza
|
|
95
|
+
|
|
96
|
+
carta = spyc.imr_chart(x, tests=(1, 2, 3, 4, 5, 6, 7, 8))
|
|
97
|
+
print(carta.summary()) # resumen tipo sesión de Minitab
|
|
98
|
+
carta.violations() # DataFrame: panel, punto, prueba, descripción
|
|
99
|
+
carta.to_frame() # todos los valores, límites y pruebas fallidas
|
|
100
|
+
carta.plot() # figura de matplotlib
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Cartas de control
|
|
104
|
+
|
|
105
|
+
| Minitab | Función | Notas |
|
|
106
|
+
|---|---|---|
|
|
107
|
+
| I-MR | `imr_chart(x)` | `sigma_method`: `'mr'`, `'median_mr'`, `'mssd'`; `span` configurable |
|
|
108
|
+
| Xbar-R | `xbar_r_chart(datos)` | `sigma_method`: `'rbar'`, `'pooled'` |
|
|
109
|
+
| Xbar-S | `xbar_s_chart(datos)` | `sigma_method`: `'sbar'`, `'pooled'` |
|
|
110
|
+
| P | `p_chart(defectuosos, n)` | límites variables con `n` variable |
|
|
111
|
+
| NP | `np_chart(defectuosos, n)` | |
|
|
112
|
+
| C | `c_chart(defectos)` | |
|
|
113
|
+
| U | `u_chart(defectos, n)` | |
|
|
114
|
+
| Laney P' / U' | `laney_p_chart`, `laney_u_chart` | corrige sobredispersión |
|
|
115
|
+
| EWMA | `ewma_chart(datos, weight=0.2, k=3)` | límites exactos (se ensanchan al inicio) |
|
|
116
|
+
| CUSUM | `cusum_chart(datos, h=4, k=0.5)` | tabular, sumas superior e inferior |
|
|
117
|
+
| Media móvil | `ma_chart(datos, length=3)` | límites más anchos en los primeros `length-1` puntos |
|
|
118
|
+
| Z-MR | `zmr_chart(x, partes)` | corridas cortas; ver más abajo |
|
|
119
|
+
| I-MR-R/S (entre/dentro) | `imr_rs_chart(datos, within='r')` | variación entre y dentro de subgrupos |
|
|
120
|
+
| G | `g_chart(entre_eventos)` | eventos raros, geométrica |
|
|
121
|
+
| T | `t_chart(tiempos)` | eventos raros, Weibull o exponencial |
|
|
122
|
+
| T² de Hotelling | `t2_chart(matriz)` | Fase I / Fase II, con diagnóstico por variable |
|
|
123
|
+
| Varianza generalizada | `generalized_variance_chart(matriz, subgroup_size=n)` | dispersión multivariada, `\|S\|` |
|
|
124
|
+
| MEWMA | `mewma_chart(matriz)` | límite por ARL (por defecto 200) |
|
|
125
|
+
|
|
126
|
+
Los datos de variables aceptan una matriz 2D (filas = subgrupos), un vector con
|
|
127
|
+
`subgroup_size=5`, o un vector con `subgroup=identificadores` (subgrupos de tamaño desigual).
|
|
128
|
+
|
|
129
|
+
```python
|
|
130
|
+
datos = rng.normal(50, 1, size=(25, 5))
|
|
131
|
+
spyc.xbar_r_chart(datos, tests=(1, 2, 3, 4)).summary()
|
|
132
|
+
|
|
133
|
+
vector = datos.ravel() # mismos datos en un solo vector
|
|
134
|
+
ids = np.repeat(np.arange(25), 5) # identificador de subgrupo de cada dato
|
|
135
|
+
spyc.xbar_r_chart(vector, subgroup_size=5)
|
|
136
|
+
spyc.xbar_s_chart(vector, subgroup=ids)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**Parámetros históricos y etapas** (equivalentes a *Opciones de estimación* y *Etapas* de Minitab):
|
|
140
|
+
|
|
141
|
+
```python
|
|
142
|
+
spyc.imr_chart(x, mu=100, sigma=2) # parámetros conocidos
|
|
143
|
+
spyc.imr_chart(x, stages=["antes"] * 40 + ["después"] * 20) # límites por etapa
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**Atributos:**
|
|
147
|
+
|
|
148
|
+
```python
|
|
149
|
+
defectuosos = rng.binomial(200, 0.05, 30)
|
|
150
|
+
spyc.p_chart(defectuosos, n=200)
|
|
151
|
+
spyc.laney_p_chart(defectuosos, n=200)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Cartas avanzadas
|
|
155
|
+
|
|
156
|
+
```python
|
|
157
|
+
# Z-MR: partes con medias y variaciones distintas en una sola carta (corridas cortas)
|
|
158
|
+
partes = ["A"] * 10 + ["B"] * 10 + ["A"] * 10
|
|
159
|
+
medidas = np.r_[rng.normal(50, 1, 10), rng.normal(80, 2, 10), rng.normal(50, 1, 10)]
|
|
160
|
+
spyc.zmr_chart(medidas, partes, sigma_method="by_part") # 'constant', 'relative', 'by_part', 'by_run'
|
|
161
|
+
|
|
162
|
+
# I-MR-R/S: la variación entre subgrupos no genera falsas alarmas como en Xbar-R
|
|
163
|
+
sub = rng.normal(20, 1, (25, 5)) + rng.normal(0, 1.5, (25, 1))
|
|
164
|
+
c = spyc.imr_rs_chart(sub, within="s")
|
|
165
|
+
c.params[0] # sigma_dentro, sigma_entre, sigma_entre_dentro
|
|
166
|
+
|
|
167
|
+
# Eventos raros
|
|
168
|
+
spyc.g_chart(rng.geometric(0.02, 40) - 1) # casos entre eventos
|
|
169
|
+
spyc.t_chart(rng.weibull(1.5, 40) * 30) # tiempo entre eventos
|
|
170
|
+
|
|
171
|
+
# Media móvil
|
|
172
|
+
spyc.ma_chart(x, length=5)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
`zmr_chart` estandariza cada observación con la media de su parte y una sigma estimada
|
|
176
|
+
con el rango móvil *dentro de cada corrida* (bloque consecutivo de la misma parte);
|
|
177
|
+
`mu={parte: valor}` y `sigma=` aceptan valores históricos o nominales.
|
|
178
|
+
|
|
179
|
+
## Cartas multivariadas
|
|
180
|
+
|
|
181
|
+
```python
|
|
182
|
+
Sigma = [[1, .6, .3], [.6, 1, .2], [.3, .2, 1]]
|
|
183
|
+
historico = rng.multivariate_normal([0, 0, 0], Sigma, 100)
|
|
184
|
+
nuevos = rng.multivariate_normal([0, 0, 0], Sigma, 40)
|
|
185
|
+
nuevos[25:, 2] += 4 # la variable 3 se desplaza
|
|
186
|
+
|
|
187
|
+
# Fase I: parámetros estimados de los mismos datos
|
|
188
|
+
spyc.t2_chart(historico).summary()
|
|
189
|
+
|
|
190
|
+
# Fase II: parámetros históricos (n_hist = observaciones con que se estimaron)
|
|
191
|
+
c = spyc.t2_chart(nuevos, mu=historico.mean(axis=0), cov=np.cov(historico, rowvar=False),
|
|
192
|
+
n_hist=100)
|
|
193
|
+
c.violations()
|
|
194
|
+
c.contributions(31) # ¿qué variable explica la señal?
|
|
195
|
+
|
|
196
|
+
# Subgrupos: matriz N x p con subgroup_size, o array 3-D (subgrupos x n x p)
|
|
197
|
+
spyc.t2_chart(nuevos[:40], subgroup_size=4)
|
|
198
|
+
spyc.generalized_variance_chart(nuevos[:40], subgroup_size=8)
|
|
199
|
+
|
|
200
|
+
# MEWMA: cambios pequeños y sostenidos
|
|
201
|
+
spyc.mewma_chart(nuevos, mu=historico.mean(axis=0), cov=np.cov(historico, rowvar=False))
|
|
202
|
+
spyc.mewma_limit(p=2, weight=0.1, arl=200) # límite H para un ARL dado (≈ 8.64)
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Los datos pueden ser un `DataFrame` (los nombres de columna se usan en `contributions`).
|
|
206
|
+
El límite de T² usa por defecto α = 0.00135 (cola de 3 sigmas, como Minitab). Sin `mu`/`cov`
|
|
207
|
+
se usan límites de **Fase I** (Beta para individuales, F para subgrupos); con `mu`/`cov` y
|
|
208
|
+
`n_hist`, de **Fase II**; con `mu`/`cov` sin `n_hist` los parámetros se toman como conocidos (χ²).
|
|
209
|
+
|
|
210
|
+
### Etapas y Box-Cox
|
|
211
|
+
|
|
212
|
+
Las 4 cartas multivariadas (T², varianza generalizada, MEWMA y MCUSUM) aceptan `stages`
|
|
213
|
+
y `boxcox`, igual que las cartas univariadas:
|
|
214
|
+
|
|
215
|
+
```python
|
|
216
|
+
etapas = [1] * 40 + [2] * 40 # p. ej. antes/después de un ajuste
|
|
217
|
+
|
|
218
|
+
# Sin mu/cov: la media y la covarianza se vuelven a estimar dentro de cada etapa
|
|
219
|
+
c = spyc.t2_chart(nuevos_con_dos_etapas, stages=etapas)
|
|
220
|
+
c.stage_mean[1], c.stage_mean[2] # medias distintas por etapa
|
|
221
|
+
c.contributions(45) # usa la media/cov de la etapa del punto 45
|
|
222
|
+
|
|
223
|
+
# Con mu/cov históricos: los mismos parámetros en todas las etapas
|
|
224
|
+
spyc.t2_chart(nuevos_con_dos_etapas, mu=mu, cov=cov, n_hist=100, stages=etapas)
|
|
225
|
+
|
|
226
|
+
# MEWMA y MCUSUM: el acumulador reinicia al empezar cada etapa
|
|
227
|
+
spyc.mewma_chart(nuevos_con_dos_etapas, stages=etapas)
|
|
228
|
+
spyc.mcusum_chart(nuevos_con_dos_etapas, stages=etapas)
|
|
229
|
+
|
|
230
|
+
# Box-Cox: una lambda por variable (no se puede combinar con mu/cov históricos)
|
|
231
|
+
c = spyc.t2_chart(datos_positivos, boxcox=True)
|
|
232
|
+
c.params[0]["lambda_boxcox"] # {'X1': ..., 'X2': ..., 'X3': ...}
|
|
233
|
+
spyc.generalized_variance_chart(datos_positivos, subgroup_size=6, boxcox=True)
|
|
234
|
+
spyc.mewma_chart(datos_positivos, boxcox=True)
|
|
235
|
+
spyc.mcusum_chart(datos_positivos, boxcox=True)
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Pruebas de causas especiales
|
|
239
|
+
|
|
240
|
+
Las 8 pruebas de Minitab (1 a 8) con sus parámetros por defecto
|
|
241
|
+
(`K` = 3, 9, 6, 14, 2, 4, 15, 8). Se piden con `tests=(...)` y se ajustan con `test_params`:
|
|
242
|
+
|
|
243
|
+
```python
|
|
244
|
+
spyc.imr_chart(x, tests=(1, 2, 5), test_params={2: 7}) # prueba 2 con 7 puntos
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Cada tipo de carta aplica el subconjunto que corresponde (completo en I, Xbar y Z;
|
|
248
|
+
básicas 1-4 en MR, R, S, G, T y cartas de atributos; solo la 1 en EWMA, CUSUM, MA y las
|
|
249
|
+
multivariadas). En G y T la prueba 1 usa los percentiles de su distribución.
|
|
250
|
+
Las funciones individuales están en `spyc.rules`.
|
|
251
|
+
|
|
252
|
+
## Capacidad del proceso
|
|
253
|
+
|
|
254
|
+
```python
|
|
255
|
+
datos = rng.normal(10, 0.1, 100)
|
|
256
|
+
res = spyc.capability_analysis(datos, lsl=9.7, usl=10.3, subgroup_size=5)
|
|
257
|
+
print(res.summary()) # Cp, CPL, CPU, Cpk, Pp, PPL, PPU, Ppk, Cpm, Z.Bench, PPM, IC
|
|
258
|
+
res.to_frame()
|
|
259
|
+
res.plot()
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
Como en Minitab, **Cp/Cpk usan la desviación estándar dentro de subgrupos** y
|
|
263
|
+
**Pp/Ppk la desviación general**; por eso Cpk ≠ Ppk cuando el proceso se desplaza o hay variación entre subgrupos.
|
|
264
|
+
|
|
265
|
+
Datos no normales:
|
|
266
|
+
|
|
267
|
+
```python
|
|
268
|
+
spyc.capability_nonnormal(x, lsl=1, usl=20, distribution="weibull")
|
|
269
|
+
spyc.capability_boxcox(x, lsl=1, usl=20)
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Distribuciones: `normal`, `lognormal`, `weibull`, `gamma`, `exponential`,
|
|
273
|
+
`loglogistic`, `logistic`, `largest_extreme`, `smallest_extreme` (método de percentiles).
|
|
274
|
+
|
|
275
|
+
`spyc.capability_sixpack(datos, lsl, usl, subgroup_size=5)` genera el **Capability Sixpack**.
|
|
276
|
+
|
|
277
|
+
## Normalidad, Pareto y constantes
|
|
278
|
+
|
|
279
|
+
```python
|
|
280
|
+
spyc.normality_test(x) # Anderson-Darling (por defecto), 'shapiro', 'dagostino'
|
|
281
|
+
spyc.probability_plot(x)
|
|
282
|
+
|
|
283
|
+
tabla = spyc.pareto(["rayón", "abolladura", "rayón", "otro"])
|
|
284
|
+
spyc.plot_pareto(tabla)
|
|
285
|
+
|
|
286
|
+
spyc.control_chart_constants(5) # d2, d3, c4, c5, A2, A3, D3, D4, B3, B4
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Las constantes se calculan por integración numérica para **cualquier** `n ≥ 2` (no solo tablas hasta 25).
|
|
290
|
+
|
|
291
|
+
## Validación
|
|
292
|
+
|
|
293
|
+
pruebas automatizadas. Las referencias son independientes de spyc:
|
|
294
|
+
|
|
295
|
+
- Constantes d2, d3, c4 frente a las tablas publicadas (Montgomery).
|
|
296
|
+
- Límites I-MR, Xbar-R y Xbar-S frente al cálculo manual con A2, D3, D4, A3, B3, B4.
|
|
297
|
+
- Anderson-Darling frente a `statsmodels.stats.diagnostic.normal_ad` (coincide a 9 decimales).
|
|
298
|
+
- EWMA y CUSUM frente a la recursión manual.
|
|
299
|
+
- Las 8 pruebas de causas especiales frente a casos construidos a mano, incluidos los casos límite.
|
|
300
|
+
- T²: valores frente a `scipy.spatial.distance.mahalanobis`; los límites de Fase I y II
|
|
301
|
+
(Beta y F) por simulación Monte Carlo (tasa de falsa alarma y valor esperado).
|
|
302
|
+
- Varianza generalizada: constantes b1 y b2 por simulación de matrices de covarianza.
|
|
303
|
+
- MEWMA: el límite para p=2, λ=0.1, ARL=200 da 8.63 (publicado: 8.64, Prabhu y Runger 1997)
|
|
304
|
+
y el ARL se comprueba por simulación.
|
|
305
|
+
- G y T: cuantiles frente a `scipy.stats`, y máxima verosimilitud Weibull por su ecuación de score.
|
|
306
|
+
- Constantes de Z-MR (1.128 y 3.686) frente a las que documenta Minitab.
|
|
307
|
+
|
|
308
|
+
> **Importante:** spyc no se ha comparado corrida a corrida contra el software Minitab
|
|
309
|
+
> (no hay licencia disponible en el desarrollo). Sigue las fórmulas y convenciones que
|
|
310
|
+
> Minitab documenta. Si encuentras una diferencia, abre un issue (ver `CONTRIBUTING.md`).
|
|
311
|
+
|
|
312
|
+
## Fuera de alcance (por ahora)
|
|
313
|
+
|
|
314
|
+
Cartas multivariadas (T² de Hotelling), cartas de corridas cortas, Z-MR, I-MR-R/S
|
|
315
|
+
(entre/dentro), transformación de Johnson, MSA/Gage R&R.
|
|
316
|
+
|
|
317
|
+
## Licencia
|
|
318
|
+
|
|
319
|
+
MIT.
|
pccpy-0.4.3/README.md
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
# spyc
|
|
2
|
+
|
|
3
|
+
**Control Estadístico de Procesos (SPC) en Python, al estilo Minitab.**
|
|
4
|
+
|
|
5
|
+
Cartas de control, pruebas de causas especiales, análisis de capacidad, prueba de
|
|
6
|
+
normalidad y Pareto, con salidas y convenciones (LCS/LCI, LEI/LES, Cp/Cpk/Pp/Ppk,
|
|
7
|
+
Z.Bench, PPM, Anderson-Darling) pensadas para quien viene de Minitab.
|
|
8
|
+
|
|
9
|
+
Todo en español: nombres de columnas, mensajes, descripciones de pruebas y gráficos.
|
|
10
|
+
|
|
11
|
+
## Instalación
|
|
12
|
+
|
|
13
|
+
Desde GitHub:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pip install git+https://github.com/TU_USUARIO/spyc.git
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Desarrollo local:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
git clone https://github.com/TU_USUARIO/spyc.git
|
|
23
|
+
cd spyc
|
|
24
|
+
pip install -e ".[dev]"
|
|
25
|
+
pytest --cov=spyc # pruebas + cobertura (97% al momento de escribir esto)
|
|
26
|
+
ruff check src/ # estilo y errores comunes
|
|
27
|
+
mypy src/spyc # tipos
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Ver [`CHANGELOG.md`](CHANGELOG.md) para el historial de versiones.
|
|
31
|
+
|
|
32
|
+
## Documentación
|
|
33
|
+
|
|
34
|
+
Hay documentación construida con Sphinx en `docs/`, con una página por cada grupo
|
|
35
|
+
de cartas (generadas a partir de los docstrings, así que siempre coinciden con el
|
|
36
|
+
código instalado). Para generarla y abrirla en tu máquina:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
pip install -e ".[docs]"
|
|
40
|
+
sphinx-build -b html docs/source docs/build
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Abre `docs/build/index.html`. Una vez el repositorio esté en GitHub, puedes conectarlo
|
|
44
|
+
en [readthedocs.org](https://readthedocs.org) para tenerla publicada automáticamente
|
|
45
|
+
en cada push; el archivo `.readthedocs.yaml` ya está listo para eso.
|
|
46
|
+
|
|
47
|
+
Requiere Python ≥ 3.9 (numpy, scipy, pandas, matplotlib).
|
|
48
|
+
|
|
49
|
+
## Inicio rápido
|
|
50
|
+
|
|
51
|
+
```python
|
|
52
|
+
import numpy as np
|
|
53
|
+
import spyc
|
|
54
|
+
|
|
55
|
+
rng = np.random.default_rng(1)
|
|
56
|
+
x = rng.normal(100, 2, 60)
|
|
57
|
+
x[40:] += 3 # el proceso se desplaza
|
|
58
|
+
|
|
59
|
+
carta = spyc.imr_chart(x, tests=(1, 2, 3, 4, 5, 6, 7, 8))
|
|
60
|
+
print(carta.summary()) # resumen tipo sesión de Minitab
|
|
61
|
+
carta.violations() # DataFrame: panel, punto, prueba, descripción
|
|
62
|
+
carta.to_frame() # todos los valores, límites y pruebas fallidas
|
|
63
|
+
carta.plot() # figura de matplotlib
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Cartas de control
|
|
67
|
+
|
|
68
|
+
| Minitab | Función | Notas |
|
|
69
|
+
|---|---|---|
|
|
70
|
+
| I-MR | `imr_chart(x)` | `sigma_method`: `'mr'`, `'median_mr'`, `'mssd'`; `span` configurable |
|
|
71
|
+
| Xbar-R | `xbar_r_chart(datos)` | `sigma_method`: `'rbar'`, `'pooled'` |
|
|
72
|
+
| Xbar-S | `xbar_s_chart(datos)` | `sigma_method`: `'sbar'`, `'pooled'` |
|
|
73
|
+
| P | `p_chart(defectuosos, n)` | límites variables con `n` variable |
|
|
74
|
+
| NP | `np_chart(defectuosos, n)` | |
|
|
75
|
+
| C | `c_chart(defectos)` | |
|
|
76
|
+
| U | `u_chart(defectos, n)` | |
|
|
77
|
+
| Laney P' / U' | `laney_p_chart`, `laney_u_chart` | corrige sobredispersión |
|
|
78
|
+
| EWMA | `ewma_chart(datos, weight=0.2, k=3)` | límites exactos (se ensanchan al inicio) |
|
|
79
|
+
| CUSUM | `cusum_chart(datos, h=4, k=0.5)` | tabular, sumas superior e inferior |
|
|
80
|
+
| Media móvil | `ma_chart(datos, length=3)` | límites más anchos en los primeros `length-1` puntos |
|
|
81
|
+
| Z-MR | `zmr_chart(x, partes)` | corridas cortas; ver más abajo |
|
|
82
|
+
| I-MR-R/S (entre/dentro) | `imr_rs_chart(datos, within='r')` | variación entre y dentro de subgrupos |
|
|
83
|
+
| G | `g_chart(entre_eventos)` | eventos raros, geométrica |
|
|
84
|
+
| T | `t_chart(tiempos)` | eventos raros, Weibull o exponencial |
|
|
85
|
+
| T² de Hotelling | `t2_chart(matriz)` | Fase I / Fase II, con diagnóstico por variable |
|
|
86
|
+
| Varianza generalizada | `generalized_variance_chart(matriz, subgroup_size=n)` | dispersión multivariada, `\|S\|` |
|
|
87
|
+
| MEWMA | `mewma_chart(matriz)` | límite por ARL (por defecto 200) |
|
|
88
|
+
|
|
89
|
+
Los datos de variables aceptan una matriz 2D (filas = subgrupos), un vector con
|
|
90
|
+
`subgroup_size=5`, o un vector con `subgroup=identificadores` (subgrupos de tamaño desigual).
|
|
91
|
+
|
|
92
|
+
```python
|
|
93
|
+
datos = rng.normal(50, 1, size=(25, 5))
|
|
94
|
+
spyc.xbar_r_chart(datos, tests=(1, 2, 3, 4)).summary()
|
|
95
|
+
|
|
96
|
+
vector = datos.ravel() # mismos datos en un solo vector
|
|
97
|
+
ids = np.repeat(np.arange(25), 5) # identificador de subgrupo de cada dato
|
|
98
|
+
spyc.xbar_r_chart(vector, subgroup_size=5)
|
|
99
|
+
spyc.xbar_s_chart(vector, subgroup=ids)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Parámetros históricos y etapas** (equivalentes a *Opciones de estimación* y *Etapas* de Minitab):
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
spyc.imr_chart(x, mu=100, sigma=2) # parámetros conocidos
|
|
106
|
+
spyc.imr_chart(x, stages=["antes"] * 40 + ["después"] * 20) # límites por etapa
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Atributos:**
|
|
110
|
+
|
|
111
|
+
```python
|
|
112
|
+
defectuosos = rng.binomial(200, 0.05, 30)
|
|
113
|
+
spyc.p_chart(defectuosos, n=200)
|
|
114
|
+
spyc.laney_p_chart(defectuosos, n=200)
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Cartas avanzadas
|
|
118
|
+
|
|
119
|
+
```python
|
|
120
|
+
# Z-MR: partes con medias y variaciones distintas en una sola carta (corridas cortas)
|
|
121
|
+
partes = ["A"] * 10 + ["B"] * 10 + ["A"] * 10
|
|
122
|
+
medidas = np.r_[rng.normal(50, 1, 10), rng.normal(80, 2, 10), rng.normal(50, 1, 10)]
|
|
123
|
+
spyc.zmr_chart(medidas, partes, sigma_method="by_part") # 'constant', 'relative', 'by_part', 'by_run'
|
|
124
|
+
|
|
125
|
+
# I-MR-R/S: la variación entre subgrupos no genera falsas alarmas como en Xbar-R
|
|
126
|
+
sub = rng.normal(20, 1, (25, 5)) + rng.normal(0, 1.5, (25, 1))
|
|
127
|
+
c = spyc.imr_rs_chart(sub, within="s")
|
|
128
|
+
c.params[0] # sigma_dentro, sigma_entre, sigma_entre_dentro
|
|
129
|
+
|
|
130
|
+
# Eventos raros
|
|
131
|
+
spyc.g_chart(rng.geometric(0.02, 40) - 1) # casos entre eventos
|
|
132
|
+
spyc.t_chart(rng.weibull(1.5, 40) * 30) # tiempo entre eventos
|
|
133
|
+
|
|
134
|
+
# Media móvil
|
|
135
|
+
spyc.ma_chart(x, length=5)
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
`zmr_chart` estandariza cada observación con la media de su parte y una sigma estimada
|
|
139
|
+
con el rango móvil *dentro de cada corrida* (bloque consecutivo de la misma parte);
|
|
140
|
+
`mu={parte: valor}` y `sigma=` aceptan valores históricos o nominales.
|
|
141
|
+
|
|
142
|
+
## Cartas multivariadas
|
|
143
|
+
|
|
144
|
+
```python
|
|
145
|
+
Sigma = [[1, .6, .3], [.6, 1, .2], [.3, .2, 1]]
|
|
146
|
+
historico = rng.multivariate_normal([0, 0, 0], Sigma, 100)
|
|
147
|
+
nuevos = rng.multivariate_normal([0, 0, 0], Sigma, 40)
|
|
148
|
+
nuevos[25:, 2] += 4 # la variable 3 se desplaza
|
|
149
|
+
|
|
150
|
+
# Fase I: parámetros estimados de los mismos datos
|
|
151
|
+
spyc.t2_chart(historico).summary()
|
|
152
|
+
|
|
153
|
+
# Fase II: parámetros históricos (n_hist = observaciones con que se estimaron)
|
|
154
|
+
c = spyc.t2_chart(nuevos, mu=historico.mean(axis=0), cov=np.cov(historico, rowvar=False),
|
|
155
|
+
n_hist=100)
|
|
156
|
+
c.violations()
|
|
157
|
+
c.contributions(31) # ¿qué variable explica la señal?
|
|
158
|
+
|
|
159
|
+
# Subgrupos: matriz N x p con subgroup_size, o array 3-D (subgrupos x n x p)
|
|
160
|
+
spyc.t2_chart(nuevos[:40], subgroup_size=4)
|
|
161
|
+
spyc.generalized_variance_chart(nuevos[:40], subgroup_size=8)
|
|
162
|
+
|
|
163
|
+
# MEWMA: cambios pequeños y sostenidos
|
|
164
|
+
spyc.mewma_chart(nuevos, mu=historico.mean(axis=0), cov=np.cov(historico, rowvar=False))
|
|
165
|
+
spyc.mewma_limit(p=2, weight=0.1, arl=200) # límite H para un ARL dado (≈ 8.64)
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Los datos pueden ser un `DataFrame` (los nombres de columna se usan en `contributions`).
|
|
169
|
+
El límite de T² usa por defecto α = 0.00135 (cola de 3 sigmas, como Minitab). Sin `mu`/`cov`
|
|
170
|
+
se usan límites de **Fase I** (Beta para individuales, F para subgrupos); con `mu`/`cov` y
|
|
171
|
+
`n_hist`, de **Fase II**; con `mu`/`cov` sin `n_hist` los parámetros se toman como conocidos (χ²).
|
|
172
|
+
|
|
173
|
+
### Etapas y Box-Cox
|
|
174
|
+
|
|
175
|
+
Las 4 cartas multivariadas (T², varianza generalizada, MEWMA y MCUSUM) aceptan `stages`
|
|
176
|
+
y `boxcox`, igual que las cartas univariadas:
|
|
177
|
+
|
|
178
|
+
```python
|
|
179
|
+
etapas = [1] * 40 + [2] * 40 # p. ej. antes/después de un ajuste
|
|
180
|
+
|
|
181
|
+
# Sin mu/cov: la media y la covarianza se vuelven a estimar dentro de cada etapa
|
|
182
|
+
c = spyc.t2_chart(nuevos_con_dos_etapas, stages=etapas)
|
|
183
|
+
c.stage_mean[1], c.stage_mean[2] # medias distintas por etapa
|
|
184
|
+
c.contributions(45) # usa la media/cov de la etapa del punto 45
|
|
185
|
+
|
|
186
|
+
# Con mu/cov históricos: los mismos parámetros en todas las etapas
|
|
187
|
+
spyc.t2_chart(nuevos_con_dos_etapas, mu=mu, cov=cov, n_hist=100, stages=etapas)
|
|
188
|
+
|
|
189
|
+
# MEWMA y MCUSUM: el acumulador reinicia al empezar cada etapa
|
|
190
|
+
spyc.mewma_chart(nuevos_con_dos_etapas, stages=etapas)
|
|
191
|
+
spyc.mcusum_chart(nuevos_con_dos_etapas, stages=etapas)
|
|
192
|
+
|
|
193
|
+
# Box-Cox: una lambda por variable (no se puede combinar con mu/cov históricos)
|
|
194
|
+
c = spyc.t2_chart(datos_positivos, boxcox=True)
|
|
195
|
+
c.params[0]["lambda_boxcox"] # {'X1': ..., 'X2': ..., 'X3': ...}
|
|
196
|
+
spyc.generalized_variance_chart(datos_positivos, subgroup_size=6, boxcox=True)
|
|
197
|
+
spyc.mewma_chart(datos_positivos, boxcox=True)
|
|
198
|
+
spyc.mcusum_chart(datos_positivos, boxcox=True)
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## Pruebas de causas especiales
|
|
202
|
+
|
|
203
|
+
Las 8 pruebas de Minitab (1 a 8) con sus parámetros por defecto
|
|
204
|
+
(`K` = 3, 9, 6, 14, 2, 4, 15, 8). Se piden con `tests=(...)` y se ajustan con `test_params`:
|
|
205
|
+
|
|
206
|
+
```python
|
|
207
|
+
spyc.imr_chart(x, tests=(1, 2, 5), test_params={2: 7}) # prueba 2 con 7 puntos
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Cada tipo de carta aplica el subconjunto que corresponde (completo en I, Xbar y Z;
|
|
211
|
+
básicas 1-4 en MR, R, S, G, T y cartas de atributos; solo la 1 en EWMA, CUSUM, MA y las
|
|
212
|
+
multivariadas). En G y T la prueba 1 usa los percentiles de su distribución.
|
|
213
|
+
Las funciones individuales están en `spyc.rules`.
|
|
214
|
+
|
|
215
|
+
## Capacidad del proceso
|
|
216
|
+
|
|
217
|
+
```python
|
|
218
|
+
datos = rng.normal(10, 0.1, 100)
|
|
219
|
+
res = spyc.capability_analysis(datos, lsl=9.7, usl=10.3, subgroup_size=5)
|
|
220
|
+
print(res.summary()) # Cp, CPL, CPU, Cpk, Pp, PPL, PPU, Ppk, Cpm, Z.Bench, PPM, IC
|
|
221
|
+
res.to_frame()
|
|
222
|
+
res.plot()
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Como en Minitab, **Cp/Cpk usan la desviación estándar dentro de subgrupos** y
|
|
226
|
+
**Pp/Ppk la desviación general**; por eso Cpk ≠ Ppk cuando el proceso se desplaza o hay variación entre subgrupos.
|
|
227
|
+
|
|
228
|
+
Datos no normales:
|
|
229
|
+
|
|
230
|
+
```python
|
|
231
|
+
spyc.capability_nonnormal(x, lsl=1, usl=20, distribution="weibull")
|
|
232
|
+
spyc.capability_boxcox(x, lsl=1, usl=20)
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Distribuciones: `normal`, `lognormal`, `weibull`, `gamma`, `exponential`,
|
|
236
|
+
`loglogistic`, `logistic`, `largest_extreme`, `smallest_extreme` (método de percentiles).
|
|
237
|
+
|
|
238
|
+
`spyc.capability_sixpack(datos, lsl, usl, subgroup_size=5)` genera el **Capability Sixpack**.
|
|
239
|
+
|
|
240
|
+
## Normalidad, Pareto y constantes
|
|
241
|
+
|
|
242
|
+
```python
|
|
243
|
+
spyc.normality_test(x) # Anderson-Darling (por defecto), 'shapiro', 'dagostino'
|
|
244
|
+
spyc.probability_plot(x)
|
|
245
|
+
|
|
246
|
+
tabla = spyc.pareto(["rayón", "abolladura", "rayón", "otro"])
|
|
247
|
+
spyc.plot_pareto(tabla)
|
|
248
|
+
|
|
249
|
+
spyc.control_chart_constants(5) # d2, d3, c4, c5, A2, A3, D3, D4, B3, B4
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Las constantes se calculan por integración numérica para **cualquier** `n ≥ 2` (no solo tablas hasta 25).
|
|
253
|
+
|
|
254
|
+
## Validación
|
|
255
|
+
|
|
256
|
+
pruebas automatizadas. Las referencias son independientes de spyc:
|
|
257
|
+
|
|
258
|
+
- Constantes d2, d3, c4 frente a las tablas publicadas (Montgomery).
|
|
259
|
+
- Límites I-MR, Xbar-R y Xbar-S frente al cálculo manual con A2, D3, D4, A3, B3, B4.
|
|
260
|
+
- Anderson-Darling frente a `statsmodels.stats.diagnostic.normal_ad` (coincide a 9 decimales).
|
|
261
|
+
- EWMA y CUSUM frente a la recursión manual.
|
|
262
|
+
- Las 8 pruebas de causas especiales frente a casos construidos a mano, incluidos los casos límite.
|
|
263
|
+
- T²: valores frente a `scipy.spatial.distance.mahalanobis`; los límites de Fase I y II
|
|
264
|
+
(Beta y F) por simulación Monte Carlo (tasa de falsa alarma y valor esperado).
|
|
265
|
+
- Varianza generalizada: constantes b1 y b2 por simulación de matrices de covarianza.
|
|
266
|
+
- MEWMA: el límite para p=2, λ=0.1, ARL=200 da 8.63 (publicado: 8.64, Prabhu y Runger 1997)
|
|
267
|
+
y el ARL se comprueba por simulación.
|
|
268
|
+
- G y T: cuantiles frente a `scipy.stats`, y máxima verosimilitud Weibull por su ecuación de score.
|
|
269
|
+
- Constantes de Z-MR (1.128 y 3.686) frente a las que documenta Minitab.
|
|
270
|
+
|
|
271
|
+
> **Importante:** spyc no se ha comparado corrida a corrida contra el software Minitab
|
|
272
|
+
> (no hay licencia disponible en el desarrollo). Sigue las fórmulas y convenciones que
|
|
273
|
+
> Minitab documenta. Si encuentras una diferencia, abre un issue (ver `CONTRIBUTING.md`).
|
|
274
|
+
|
|
275
|
+
## Fuera de alcance (por ahora)
|
|
276
|
+
|
|
277
|
+
Cartas multivariadas (T² de Hotelling), cartas de corridas cortas, Z-MR, I-MR-R/S
|
|
278
|
+
(entre/dentro), transformación de Johnson, MSA/Gage R&R.
|
|
279
|
+
|
|
280
|
+
## Licencia
|
|
281
|
+
|
|
282
|
+
MIT.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=77.0.3", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "pccpy"
|
|
7
|
+
version = "0.4.3"
|
|
8
|
+
description = "Control Estadístico de Procesos (SPC) en Python: cartas de control, capacidad y pruebas al estilo Minitab"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.9"
|
|
11
|
+
|
|
12
|
+
license = "MIT"
|
|
13
|
+
license-files = ["LICENSE"]
|
|
14
|
+
|
|
15
|
+
authors = [
|
|
16
|
+
{ name = "LeoSanta15", email = "angelsanta1@gmail.com" }
|
|
17
|
+
]
|
|
18
|
+
keywords = ["spc", "control estadístico de procesos", "cartas de control", "capacidad", "minitab", "six sigma"]
|
|
19
|
+
classifiers = [
|
|
20
|
+
"Programming Language :: Python :: 3",
|
|
21
|
+
"Programming Language :: Python :: 3.9",
|
|
22
|
+
"Programming Language :: Python :: 3.10",
|
|
23
|
+
"Programming Language :: Python :: 3.11",
|
|
24
|
+
"Programming Language :: Python :: 3.12",
|
|
25
|
+
"Programming Language :: Python :: 3.13",
|
|
26
|
+
"Operating System :: OS Independent",
|
|
27
|
+
"Intended Audience :: Science/Research",
|
|
28
|
+
"Topic :: Scientific/Engineering :: Information Analysis",
|
|
29
|
+
]
|
|
30
|
+
dependencies = [
|
|
31
|
+
"numpy>=1.22",
|
|
32
|
+
"scipy>=1.9",
|
|
33
|
+
"pandas>=1.4",
|
|
34
|
+
"matplotlib>=3.5",
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
[project.optional-dependencies]
|
|
38
|
+
dev = ["pytest>=7", "pytest-cov>=4", "ruff>=0.6", "mypy>=1.10"]
|
|
39
|
+
docs = ["sphinx>=7", "sphinx-rtd-theme>=2", "myst-parser>=2"]
|
|
40
|
+
|
|
41
|
+
[project.urls]
|
|
42
|
+
Homepage = "https://github.com/LeoSanta15/pccpy"
|
|
43
|
+
Issues = "https://github.com/LeoSanta15/pccpy/issues"
|
|
44
|
+
Changelog = "https://github.com/LeoSanta15/pccpy/blob/main/CHANGELOG.md"
|
|
45
|
+
|
|
46
|
+
[tool.setuptools.packages.find]
|
|
47
|
+
where = ["src"]
|
|
48
|
+
|
|
49
|
+
[tool.pytest.ini_options]
|
|
50
|
+
testpaths = ["tests"]
|
|
51
|
+
addopts = "-q"
|
|
52
|
+
|
|
53
|
+
[tool.mypy]
|
|
54
|
+
ignore_missing_imports = true
|
|
55
|
+
|
|
56
|
+
[tool.ruff]
|
|
57
|
+
line-length = 110
|
|
58
|
+
target-version = "py39"
|
pccpy-0.4.3/setup.cfg
ADDED