walopy 0.2.5__tar.gz → 0.2.6__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.
- {walopy-0.2.5/src/walopy.egg-info → walopy-0.2.6}/PKG-INFO +183 -20
- {walopy-0.2.5 → walopy-0.2.6}/README.md +182 -19
- {walopy-0.2.5 → walopy-0.2.6}/pyproject.toml +1 -1
- {walopy-0.2.5 → walopy-0.2.6}/src/walopy/__init__.py +45 -0
- {walopy-0.2.5 → walopy-0.2.6}/src/walopy/inventory.py +338 -0
- walopy-0.2.6/src/walopy/reliability.py +298 -0
- walopy-0.2.6/src/walopy/scheduling.py +315 -0
- {walopy-0.2.5 → walopy-0.2.6/src/walopy.egg-info}/PKG-INFO +183 -20
- {walopy-0.2.5 → walopy-0.2.6}/src/walopy.egg-info/SOURCES.txt +4 -1
- walopy-0.2.6/tests/test_v026.py +276 -0
- {walopy-0.2.5 → walopy-0.2.6}/LICENSE +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/setup.cfg +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/src/walopy/__main__.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/src/walopy/_utils.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/src/walopy/advanced.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/src/walopy/bottleneck.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/src/walopy/fitting.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/src/walopy/kpi.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/src/walopy/network.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/src/walopy/operations.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/src/walopy/plotting.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/src/walopy/queuing.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/src/walopy/solver.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/src/walopy.egg-info/dependency_links.txt +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/src/walopy.egg-info/requires.txt +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/src/walopy.egg-info/top_level.txt +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/tests/test_advanced.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/tests/test_bottleneck.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/tests/test_fitting.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/tests/test_inventory.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/tests/test_inventory_new.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/tests/test_kpi.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/tests/test_mg1.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/tests/test_network.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/tests/test_new_models.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/tests/test_operations.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/tests/test_queuing.py +0 -0
- {walopy-0.2.5 → walopy-0.2.6}/tests/test_solver.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: walopy
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.6
|
|
4
4
|
Summary: Queuing theory, operations analysis, OEE, bottleneck analysis and KPI trees for Python
|
|
5
5
|
Author-email: LeoSanta15 <angelsanta1@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -63,15 +63,17 @@ pip install walopy
|
|
|
63
63
|
9. [Análisis de cuellos de botella](#9-análisis-de-cuellos-de-botella)
|
|
64
64
|
10. [Balance de línea y tiempo takt](#10-balance-de-línea-y-tiempo-takt)
|
|
65
65
|
11. [Análisis de punto de equilibrio](#11-análisis-de-punto-de-equilibrio)
|
|
66
|
-
12. [
|
|
67
|
-
13. [
|
|
68
|
-
14. [
|
|
69
|
-
15. [
|
|
70
|
-
16. [
|
|
71
|
-
17. [
|
|
72
|
-
18. [
|
|
73
|
-
19. [
|
|
74
|
-
20. [
|
|
66
|
+
12. [Programación de producción (scheduling)](#12-programación-de-producción-scheduling)
|
|
67
|
+
13. [Confiabilidad](#13-confiabilidad--reliability)
|
|
68
|
+
14. [Árboles de KPI](#14-árboles-de-kpi)
|
|
69
|
+
15. [Solvers y optimización](#15-solvers-y-optimización)
|
|
70
|
+
16. [Análisis de sensibilidad](#16-análisis-de-sensibilidad)
|
|
71
|
+
17. [Escenarios en lote (batch_model)](#17-escenarios-en-lote-batch_model)
|
|
72
|
+
18. [Comparar múltiples resultados](#18-comparar-múltiples-resultados)
|
|
73
|
+
19. [Gráficas](#19-gráficas)
|
|
74
|
+
20. [CLI](#20-cli)
|
|
75
|
+
21. [Referencia de módulos](#21-referencia-de-módulos)
|
|
76
|
+
22. [Requisitos](#22-requisitos)
|
|
75
77
|
|
|
76
78
|
---
|
|
77
79
|
|
|
@@ -1055,7 +1057,7 @@ print(r.margin_of_safety_pct) # 0.375 — porcentaje del margen de seguridad
|
|
|
1055
1057
|
|
|
1056
1058
|
---
|
|
1057
1059
|
|
|
1058
|
-
##
|
|
1060
|
+
## 14. Árboles de KPI
|
|
1059
1061
|
|
|
1060
1062
|
Los árboles de KPI crean jerarquías interactivas visualizadas como **treemap** o **sunburst** con Plotly.
|
|
1061
1063
|
|
|
@@ -1108,7 +1110,7 @@ fig.show()
|
|
|
1108
1110
|
|
|
1109
1111
|
---
|
|
1110
1112
|
|
|
1111
|
-
##
|
|
1113
|
+
## 15. Solvers y optimización
|
|
1112
1114
|
|
|
1113
1115
|
### `solve_lam(metric, target, *, mu, model)` — Máxima tasa de llegada
|
|
1114
1116
|
|
|
@@ -1155,7 +1157,7 @@ r.plot() # gráfica de costo vs número de servidores
|
|
|
1155
1157
|
|
|
1156
1158
|
---
|
|
1157
1159
|
|
|
1158
|
-
##
|
|
1160
|
+
## 16. Análisis de sensibilidad
|
|
1159
1161
|
|
|
1160
1162
|
### `sensitivity(model_fn, param, values, **fixed_kwargs)` — Barrido paramétrico
|
|
1161
1163
|
|
|
@@ -1186,7 +1188,7 @@ fig.show()
|
|
|
1186
1188
|
|
|
1187
1189
|
---
|
|
1188
1190
|
|
|
1189
|
-
##
|
|
1191
|
+
## 17. Escenarios en lote (batch_model)
|
|
1190
1192
|
|
|
1191
1193
|
### `batch_model(model_fn, df, **fixed_kwargs)` — Aplicar modelo a un DataFrame
|
|
1192
1194
|
|
|
@@ -1221,7 +1223,7 @@ print(resultado[resultado["_error"].notna()]) # filas fallidas
|
|
|
1221
1223
|
|
|
1222
1224
|
---
|
|
1223
1225
|
|
|
1224
|
-
##
|
|
1226
|
+
## 18. Comparar múltiples resultados
|
|
1225
1227
|
|
|
1226
1228
|
### `compare(*results, labels)` — DataFrame comparativo
|
|
1227
1229
|
|
|
@@ -1246,7 +1248,7 @@ df2 = wl.compare(wl.mm1(1, 5), wl.mm1(2, 5), wl.mm1(3, 5))
|
|
|
1246
1248
|
|
|
1247
1249
|
---
|
|
1248
1250
|
|
|
1249
|
-
##
|
|
1251
|
+
## 19. Gráficas
|
|
1250
1252
|
|
|
1251
1253
|
Todos los resultados exponen `.plot()` que devuelve una figura de Matplotlib o Plotly. También se pueden llamar directamente desde `walopy.plotting`.
|
|
1252
1254
|
|
|
@@ -1282,7 +1284,7 @@ fig.show()
|
|
|
1282
1284
|
|
|
1283
1285
|
---
|
|
1284
1286
|
|
|
1285
|
-
##
|
|
1287
|
+
## 20. CLI
|
|
1286
1288
|
|
|
1287
1289
|
walopy incluye una interfaz de línea de comandos para uso rápido sin escribir código.
|
|
1288
1290
|
|
|
@@ -1324,14 +1326,175 @@ Wq : 0.3 (avg wait time in queue)
|
|
|
1324
1326
|
|
|
1325
1327
|
---
|
|
1326
1328
|
|
|
1327
|
-
##
|
|
1329
|
+
## 12. Programación de producción (scheduling)
|
|
1330
|
+
|
|
1331
|
+
### Máquina única — `schedule_single`
|
|
1332
|
+
|
|
1333
|
+
Asigna *n* trabajos a una sola máquina según una regla de prioridad.
|
|
1334
|
+
|
|
1335
|
+
```python
|
|
1336
|
+
import walopy as wl
|
|
1337
|
+
|
|
1338
|
+
p = [3, 1, 4, 1, 5] # tiempos de proceso
|
|
1339
|
+
d = [8, 3, 10, 4, 12] # fechas de entrega
|
|
1340
|
+
w = [2, 5, 1, 4, 1] # pesos de importancia
|
|
1341
|
+
|
|
1342
|
+
r = wl.schedule_single(p, rule="SPT", due_dates=d, weights=w,
|
|
1343
|
+
names=["A","B","C","D","E"])
|
|
1344
|
+
print(r)
|
|
1345
|
+
```
|
|
1346
|
+
|
|
1347
|
+
```
|
|
1348
|
+
Rule : SPT
|
|
1349
|
+
Sequence : B → D → A → C → E
|
|
1350
|
+
Makespan (Cmax) : 14
|
|
1351
|
+
Total completion ΣCj : 37
|
|
1352
|
+
Weighted completion ΣwCj: 89
|
|
1353
|
+
Max lateness : 2
|
|
1354
|
+
Total tardiness ΣTj : 2
|
|
1355
|
+
Tardy jobs : 1
|
|
1356
|
+
```
|
|
1357
|
+
|
|
1358
|
+
**Reglas disponibles**
|
|
1359
|
+
|
|
1360
|
+
| `rule` | Criterio minimizado | Datos requeridos |
|
|
1361
|
+
|--------|---------------------|-----------------|
|
|
1362
|
+
| `'SPT'` | ΣCj (tiempo total de completación) | — |
|
|
1363
|
+
| `'EDD'` | Lmax (máxima tardanza) | `due_dates` |
|
|
1364
|
+
| `'WSPT'` | ΣwjCj (completación ponderada) | `weights` |
|
|
1365
|
+
| `'CR'` | Ratio crítico dj/pj | `due_dates` |
|
|
1366
|
+
| `'FIFO'` | Orden de llegada (línea base) | — |
|
|
1367
|
+
|
|
1368
|
+
**Atributos de `ScheduleResult`**
|
|
1369
|
+
|
|
1370
|
+
| Atributo | Descripción |
|
|
1371
|
+
|----------|-------------|
|
|
1372
|
+
| `rule` | Regla utilizada |
|
|
1373
|
+
| `sequence` | Lista de nombres en orden de procesamiento |
|
|
1374
|
+
| `jobs` | Lista de `JobSchedule` (por trabajo) |
|
|
1375
|
+
| `makespan` | Cmax = suma de tiempos de proceso |
|
|
1376
|
+
| `total_completion_time` | ΣCj |
|
|
1377
|
+
| `total_weighted_completion_time` | ΣwjCj |
|
|
1378
|
+
| `max_lateness` | max(Lj) |
|
|
1379
|
+
| `total_tardiness` | ΣTj |
|
|
1380
|
+
| `n_tardy` | Número de trabajos tarde |
|
|
1381
|
+
|
|
1382
|
+
```python
|
|
1383
|
+
df = r.to_frame() # columnas: Name, p, d, w, Start, C, L, T, Tardy
|
|
1384
|
+
```
|
|
1385
|
+
|
|
1386
|
+
---
|
|
1387
|
+
|
|
1388
|
+
### Flow-shop de 2 máquinas — `johnson_flowshop`
|
|
1389
|
+
|
|
1390
|
+
El algoritmo de Johnson encuentra la secuencia óptima que minimiza el makespan cuando todos los trabajos pasan primero por M1 y luego por M2.
|
|
1391
|
+
|
|
1392
|
+
```python
|
|
1393
|
+
m1 = [3, 8, 5, 7, 2] # tiempos en máquina 1
|
|
1394
|
+
m2 = [5, 2, 8, 4, 6] # tiempos en máquina 2
|
|
1395
|
+
|
|
1396
|
+
r = wl.johnson_flowshop(m1, m2)
|
|
1397
|
+
print(r)
|
|
1398
|
+
```
|
|
1399
|
+
|
|
1400
|
+
```
|
|
1401
|
+
Sequence : J1 → J5 → J4 → J3 → J2
|
|
1402
|
+
Makespan : 34
|
|
1403
|
+
```
|
|
1404
|
+
|
|
1405
|
+
```python
|
|
1406
|
+
df = r.to_frame()
|
|
1407
|
+
# columnas: Job | M1 start | M1 end | M2 start | M2 end
|
|
1408
|
+
```
|
|
1409
|
+
|
|
1410
|
+
---
|
|
1411
|
+
|
|
1412
|
+
## 13. Confiabilidad — `reliability`
|
|
1413
|
+
|
|
1414
|
+
Modelos de confiabilidad con distribución exponencial (tasa de falla constante).
|
|
1415
|
+
|
|
1416
|
+
### Componente individual — `mtbf_analysis`
|
|
1417
|
+
|
|
1418
|
+
```python
|
|
1419
|
+
r = wl.mtbf_analysis(failure_rate=0.01, mttr=5.0, t=100)
|
|
1420
|
+
print(r)
|
|
1421
|
+
```
|
|
1422
|
+
|
|
1423
|
+
```
|
|
1424
|
+
Topology : component
|
|
1425
|
+
Components : 1
|
|
1426
|
+
Failure rates λ : ['0.01']
|
|
1427
|
+
MTBF : 100
|
|
1428
|
+
R(t=100) : 0.367879
|
|
1429
|
+
Availability : 95.2381%
|
|
1430
|
+
```
|
|
1431
|
+
|
|
1432
|
+
### Sistema en serie — `series_system`
|
|
1433
|
+
|
|
1434
|
+
El sistema falla si **cualquier** componente falla. λ_sys = Σλi.
|
|
1435
|
+
|
|
1436
|
+
```python
|
|
1437
|
+
r = wl.series_system([0.01, 0.02, 0.03], t=10)
|
|
1438
|
+
print(r.mtbf) # 1/0.06 ≈ 16.67
|
|
1439
|
+
print(r.R_t) # e^{-0.06·10} ≈ 0.549
|
|
1440
|
+
```
|
|
1441
|
+
|
|
1442
|
+
### Sistema en paralelo — `parallel_system`
|
|
1443
|
+
|
|
1444
|
+
El sistema opera si **al menos uno** de los componentes opera.
|
|
1445
|
+
R_sys(t) = 1 − ∏(1 − e^{−λi·t}). MTBF calculado numéricamente.
|
|
1446
|
+
|
|
1447
|
+
```python
|
|
1448
|
+
r = wl.parallel_system([0.01, 0.02], t=50)
|
|
1449
|
+
print(r.R_t) # mayor que el sistema en serie
|
|
1450
|
+
print(r.mtbf) # mayor que cualquier componente individual
|
|
1451
|
+
```
|
|
1452
|
+
|
|
1453
|
+
### Sistema k-de-n — `koon_system`
|
|
1454
|
+
|
|
1455
|
+
Opera si al menos **k** de **n** componentes idénticos están en servicio.
|
|
1456
|
+
MTBF exacto = (1/λ) · Σ_{j=k}^{n} (1/j).
|
|
1457
|
+
|
|
1458
|
+
```python
|
|
1459
|
+
# 2-de-3: requiere al menos 2 de 3 componentes idénticos
|
|
1460
|
+
r = wl.koon_system(n=3, k=2, failure_rate=0.01, t=50)
|
|
1461
|
+
print(r.mtbf) # (1/0.01) * (1/2 + 1/3) ≈ 83.33
|
|
1462
|
+
print(r.R_t)
|
|
1463
|
+
```
|
|
1464
|
+
|
|
1465
|
+
**Casos especiales**
|
|
1466
|
+
- `k=1` → equivale a `parallel_system` con n componentes idénticos.
|
|
1467
|
+
- `k=n` → equivale a `series_system` con n componentes idénticos.
|
|
1468
|
+
|
|
1469
|
+
**Atributos de `ReliabilityResult`**
|
|
1470
|
+
|
|
1471
|
+
| Atributo | Descripción |
|
|
1472
|
+
|----------|-------------|
|
|
1473
|
+
| `topology` | `'component'`, `'series'`, `'parallel'`, `'k-of-n'` |
|
|
1474
|
+
| `n_components` | Número de componentes |
|
|
1475
|
+
| `failure_rates` | Lista de λi |
|
|
1476
|
+
| `mtbf` | MTBF del sistema |
|
|
1477
|
+
| `R_t` | Confiabilidad R(t) si se proporcionó `t` |
|
|
1478
|
+
| `availability` | Disponibilidad estacionaria A si se proporcionó `mttr` |
|
|
1479
|
+
| `mttr` | Tiempo medio de reparación (si se proporcionó) |
|
|
1480
|
+
|
|
1481
|
+
```python
|
|
1482
|
+
df = r.to_frame() # columnas: Topology, Components, MTBF[, R(t), Availability]
|
|
1483
|
+
r.R(t=200) # evalúa R(t) en cualquier tiempo posterior
|
|
1484
|
+
```
|
|
1485
|
+
|
|
1486
|
+
---
|
|
1487
|
+
|
|
1488
|
+
## 21. Referencia de módulos
|
|
1328
1489
|
|
|
1329
1490
|
| Módulo | Funciones y clases principales |
|
|
1330
1491
|
|---|---|
|
|
1331
1492
|
| `queuing` | `mm1`, `mmc`, `md1`, `kingman`, `mg1`, `littles_law`, `QueueResult`, `cv2_normal`, `cv2_triangular`, `cv2_uniform`, `cv2_erlang`, `cv2_gamma`, `cv2_lognormal`, `cv2_weibull` |
|
|
1332
1493
|
| `advanced` | `mm1k`, `mmck`, `erlang_b`, `mm1_priority`, `monte_carlo_gg1`, `takt_time`, `line_balance`, `break_even`, `break_even_multi`, `break_even_sales`, `queue_length_pmf`, `sojourn_cdf`, `PriorityQueueResult`, `SimulationResult`, `LineBalanceResult`, `BreakEvenResult`, `BreakEvenMultiResult` |
|
|
1333
1494
|
| `fitting` | `fit_from_data`, `FitResult` |
|
|
1334
|
-
| `inventory` | `eoq`, `ebq`, `eoq_multi`, `ebq_multi`, `eoq_multi_constrained`, `lot_for_lot`, `silver_meal`, `eoq_quantity_discount`, `reorder_point`, `newsvendor`, `EOQResult`, `EBQResult`, `MultiItemResult`, `ConstrainedMultiEOQResult`, `LotSizingResult`, `QuantityDiscountResult`, `ReorderResult`, `NewsvendorResult` |
|
|
1495
|
+
| `inventory` | `eoq`, `ebq`, `eoq_multi`, `ebq_multi`, `eoq_multi_constrained`, `lot_for_lot`, `silver_meal`, `eoq_quantity_discount`, `wagner_whitin`, `rq_policy`, `rs_policy`, `reorder_point`, `newsvendor`, `EOQResult`, `EBQResult`, `MultiItemResult`, `ConstrainedMultiEOQResult`, `LotSizingResult`, `QuantityDiscountResult`, `ReorderResult`, `NewsvendorResult`, `RQPolicyResult`, `RSPolicyResult` |
|
|
1496
|
+
| `scheduling` | `schedule_single`, `johnson_flowshop`, `ScheduleResult`, `JobSchedule`, `FlowShopResult` |
|
|
1497
|
+
| `reliability` | `mtbf_analysis`, `series_system`, `parallel_system`, `koon_system`, `ReliabilityResult` |
|
|
1335
1498
|
| `network` | `jackson_network`, `JacksonResult`, `StationMetrics` |
|
|
1336
1499
|
| `operations` | `oee`, `utilization_efficiency`, `unit_cost`, `OEEResult`, `UtilizationResult`, `UnitCostResult` |
|
|
1337
1500
|
| `bottleneck` | `bottleneck_analysis`, `BottleneckResult`, `StationResult` |
|
|
@@ -1341,7 +1504,7 @@ Wq : 0.3 (avg wait time in queue)
|
|
|
1341
1504
|
|
|
1342
1505
|
---
|
|
1343
1506
|
|
|
1344
|
-
##
|
|
1507
|
+
## 22. Requisitos
|
|
1345
1508
|
|
|
1346
1509
|
```
|
|
1347
1510
|
Python ≥ 3.9
|
|
@@ -26,15 +26,17 @@ pip install walopy
|
|
|
26
26
|
9. [Análisis de cuellos de botella](#9-análisis-de-cuellos-de-botella)
|
|
27
27
|
10. [Balance de línea y tiempo takt](#10-balance-de-línea-y-tiempo-takt)
|
|
28
28
|
11. [Análisis de punto de equilibrio](#11-análisis-de-punto-de-equilibrio)
|
|
29
|
-
12. [
|
|
30
|
-
13. [
|
|
31
|
-
14. [
|
|
32
|
-
15. [
|
|
33
|
-
16. [
|
|
34
|
-
17. [
|
|
35
|
-
18. [
|
|
36
|
-
19. [
|
|
37
|
-
20. [
|
|
29
|
+
12. [Programación de producción (scheduling)](#12-programación-de-producción-scheduling)
|
|
30
|
+
13. [Confiabilidad](#13-confiabilidad--reliability)
|
|
31
|
+
14. [Árboles de KPI](#14-árboles-de-kpi)
|
|
32
|
+
15. [Solvers y optimización](#15-solvers-y-optimización)
|
|
33
|
+
16. [Análisis de sensibilidad](#16-análisis-de-sensibilidad)
|
|
34
|
+
17. [Escenarios en lote (batch_model)](#17-escenarios-en-lote-batch_model)
|
|
35
|
+
18. [Comparar múltiples resultados](#18-comparar-múltiples-resultados)
|
|
36
|
+
19. [Gráficas](#19-gráficas)
|
|
37
|
+
20. [CLI](#20-cli)
|
|
38
|
+
21. [Referencia de módulos](#21-referencia-de-módulos)
|
|
39
|
+
22. [Requisitos](#22-requisitos)
|
|
38
40
|
|
|
39
41
|
---
|
|
40
42
|
|
|
@@ -1018,7 +1020,7 @@ print(r.margin_of_safety_pct) # 0.375 — porcentaje del margen de seguridad
|
|
|
1018
1020
|
|
|
1019
1021
|
---
|
|
1020
1022
|
|
|
1021
|
-
##
|
|
1023
|
+
## 14. Árboles de KPI
|
|
1022
1024
|
|
|
1023
1025
|
Los árboles de KPI crean jerarquías interactivas visualizadas como **treemap** o **sunburst** con Plotly.
|
|
1024
1026
|
|
|
@@ -1071,7 +1073,7 @@ fig.show()
|
|
|
1071
1073
|
|
|
1072
1074
|
---
|
|
1073
1075
|
|
|
1074
|
-
##
|
|
1076
|
+
## 15. Solvers y optimización
|
|
1075
1077
|
|
|
1076
1078
|
### `solve_lam(metric, target, *, mu, model)` — Máxima tasa de llegada
|
|
1077
1079
|
|
|
@@ -1118,7 +1120,7 @@ r.plot() # gráfica de costo vs número de servidores
|
|
|
1118
1120
|
|
|
1119
1121
|
---
|
|
1120
1122
|
|
|
1121
|
-
##
|
|
1123
|
+
## 16. Análisis de sensibilidad
|
|
1122
1124
|
|
|
1123
1125
|
### `sensitivity(model_fn, param, values, **fixed_kwargs)` — Barrido paramétrico
|
|
1124
1126
|
|
|
@@ -1149,7 +1151,7 @@ fig.show()
|
|
|
1149
1151
|
|
|
1150
1152
|
---
|
|
1151
1153
|
|
|
1152
|
-
##
|
|
1154
|
+
## 17. Escenarios en lote (batch_model)
|
|
1153
1155
|
|
|
1154
1156
|
### `batch_model(model_fn, df, **fixed_kwargs)` — Aplicar modelo a un DataFrame
|
|
1155
1157
|
|
|
@@ -1184,7 +1186,7 @@ print(resultado[resultado["_error"].notna()]) # filas fallidas
|
|
|
1184
1186
|
|
|
1185
1187
|
---
|
|
1186
1188
|
|
|
1187
|
-
##
|
|
1189
|
+
## 18. Comparar múltiples resultados
|
|
1188
1190
|
|
|
1189
1191
|
### `compare(*results, labels)` — DataFrame comparativo
|
|
1190
1192
|
|
|
@@ -1209,7 +1211,7 @@ df2 = wl.compare(wl.mm1(1, 5), wl.mm1(2, 5), wl.mm1(3, 5))
|
|
|
1209
1211
|
|
|
1210
1212
|
---
|
|
1211
1213
|
|
|
1212
|
-
##
|
|
1214
|
+
## 19. Gráficas
|
|
1213
1215
|
|
|
1214
1216
|
Todos los resultados exponen `.plot()` que devuelve una figura de Matplotlib o Plotly. También se pueden llamar directamente desde `walopy.plotting`.
|
|
1215
1217
|
|
|
@@ -1245,7 +1247,7 @@ fig.show()
|
|
|
1245
1247
|
|
|
1246
1248
|
---
|
|
1247
1249
|
|
|
1248
|
-
##
|
|
1250
|
+
## 20. CLI
|
|
1249
1251
|
|
|
1250
1252
|
walopy incluye una interfaz de línea de comandos para uso rápido sin escribir código.
|
|
1251
1253
|
|
|
@@ -1287,14 +1289,175 @@ Wq : 0.3 (avg wait time in queue)
|
|
|
1287
1289
|
|
|
1288
1290
|
---
|
|
1289
1291
|
|
|
1290
|
-
##
|
|
1292
|
+
## 12. Programación de producción (scheduling)
|
|
1293
|
+
|
|
1294
|
+
### Máquina única — `schedule_single`
|
|
1295
|
+
|
|
1296
|
+
Asigna *n* trabajos a una sola máquina según una regla de prioridad.
|
|
1297
|
+
|
|
1298
|
+
```python
|
|
1299
|
+
import walopy as wl
|
|
1300
|
+
|
|
1301
|
+
p = [3, 1, 4, 1, 5] # tiempos de proceso
|
|
1302
|
+
d = [8, 3, 10, 4, 12] # fechas de entrega
|
|
1303
|
+
w = [2, 5, 1, 4, 1] # pesos de importancia
|
|
1304
|
+
|
|
1305
|
+
r = wl.schedule_single(p, rule="SPT", due_dates=d, weights=w,
|
|
1306
|
+
names=["A","B","C","D","E"])
|
|
1307
|
+
print(r)
|
|
1308
|
+
```
|
|
1309
|
+
|
|
1310
|
+
```
|
|
1311
|
+
Rule : SPT
|
|
1312
|
+
Sequence : B → D → A → C → E
|
|
1313
|
+
Makespan (Cmax) : 14
|
|
1314
|
+
Total completion ΣCj : 37
|
|
1315
|
+
Weighted completion ΣwCj: 89
|
|
1316
|
+
Max lateness : 2
|
|
1317
|
+
Total tardiness ΣTj : 2
|
|
1318
|
+
Tardy jobs : 1
|
|
1319
|
+
```
|
|
1320
|
+
|
|
1321
|
+
**Reglas disponibles**
|
|
1322
|
+
|
|
1323
|
+
| `rule` | Criterio minimizado | Datos requeridos |
|
|
1324
|
+
|--------|---------------------|-----------------|
|
|
1325
|
+
| `'SPT'` | ΣCj (tiempo total de completación) | — |
|
|
1326
|
+
| `'EDD'` | Lmax (máxima tardanza) | `due_dates` |
|
|
1327
|
+
| `'WSPT'` | ΣwjCj (completación ponderada) | `weights` |
|
|
1328
|
+
| `'CR'` | Ratio crítico dj/pj | `due_dates` |
|
|
1329
|
+
| `'FIFO'` | Orden de llegada (línea base) | — |
|
|
1330
|
+
|
|
1331
|
+
**Atributos de `ScheduleResult`**
|
|
1332
|
+
|
|
1333
|
+
| Atributo | Descripción |
|
|
1334
|
+
|----------|-------------|
|
|
1335
|
+
| `rule` | Regla utilizada |
|
|
1336
|
+
| `sequence` | Lista de nombres en orden de procesamiento |
|
|
1337
|
+
| `jobs` | Lista de `JobSchedule` (por trabajo) |
|
|
1338
|
+
| `makespan` | Cmax = suma de tiempos de proceso |
|
|
1339
|
+
| `total_completion_time` | ΣCj |
|
|
1340
|
+
| `total_weighted_completion_time` | ΣwjCj |
|
|
1341
|
+
| `max_lateness` | max(Lj) |
|
|
1342
|
+
| `total_tardiness` | ΣTj |
|
|
1343
|
+
| `n_tardy` | Número de trabajos tarde |
|
|
1344
|
+
|
|
1345
|
+
```python
|
|
1346
|
+
df = r.to_frame() # columnas: Name, p, d, w, Start, C, L, T, Tardy
|
|
1347
|
+
```
|
|
1348
|
+
|
|
1349
|
+
---
|
|
1350
|
+
|
|
1351
|
+
### Flow-shop de 2 máquinas — `johnson_flowshop`
|
|
1352
|
+
|
|
1353
|
+
El algoritmo de Johnson encuentra la secuencia óptima que minimiza el makespan cuando todos los trabajos pasan primero por M1 y luego por M2.
|
|
1354
|
+
|
|
1355
|
+
```python
|
|
1356
|
+
m1 = [3, 8, 5, 7, 2] # tiempos en máquina 1
|
|
1357
|
+
m2 = [5, 2, 8, 4, 6] # tiempos en máquina 2
|
|
1358
|
+
|
|
1359
|
+
r = wl.johnson_flowshop(m1, m2)
|
|
1360
|
+
print(r)
|
|
1361
|
+
```
|
|
1362
|
+
|
|
1363
|
+
```
|
|
1364
|
+
Sequence : J1 → J5 → J4 → J3 → J2
|
|
1365
|
+
Makespan : 34
|
|
1366
|
+
```
|
|
1367
|
+
|
|
1368
|
+
```python
|
|
1369
|
+
df = r.to_frame()
|
|
1370
|
+
# columnas: Job | M1 start | M1 end | M2 start | M2 end
|
|
1371
|
+
```
|
|
1372
|
+
|
|
1373
|
+
---
|
|
1374
|
+
|
|
1375
|
+
## 13. Confiabilidad — `reliability`
|
|
1376
|
+
|
|
1377
|
+
Modelos de confiabilidad con distribución exponencial (tasa de falla constante).
|
|
1378
|
+
|
|
1379
|
+
### Componente individual — `mtbf_analysis`
|
|
1380
|
+
|
|
1381
|
+
```python
|
|
1382
|
+
r = wl.mtbf_analysis(failure_rate=0.01, mttr=5.0, t=100)
|
|
1383
|
+
print(r)
|
|
1384
|
+
```
|
|
1385
|
+
|
|
1386
|
+
```
|
|
1387
|
+
Topology : component
|
|
1388
|
+
Components : 1
|
|
1389
|
+
Failure rates λ : ['0.01']
|
|
1390
|
+
MTBF : 100
|
|
1391
|
+
R(t=100) : 0.367879
|
|
1392
|
+
Availability : 95.2381%
|
|
1393
|
+
```
|
|
1394
|
+
|
|
1395
|
+
### Sistema en serie — `series_system`
|
|
1396
|
+
|
|
1397
|
+
El sistema falla si **cualquier** componente falla. λ_sys = Σλi.
|
|
1398
|
+
|
|
1399
|
+
```python
|
|
1400
|
+
r = wl.series_system([0.01, 0.02, 0.03], t=10)
|
|
1401
|
+
print(r.mtbf) # 1/0.06 ≈ 16.67
|
|
1402
|
+
print(r.R_t) # e^{-0.06·10} ≈ 0.549
|
|
1403
|
+
```
|
|
1404
|
+
|
|
1405
|
+
### Sistema en paralelo — `parallel_system`
|
|
1406
|
+
|
|
1407
|
+
El sistema opera si **al menos uno** de los componentes opera.
|
|
1408
|
+
R_sys(t) = 1 − ∏(1 − e^{−λi·t}). MTBF calculado numéricamente.
|
|
1409
|
+
|
|
1410
|
+
```python
|
|
1411
|
+
r = wl.parallel_system([0.01, 0.02], t=50)
|
|
1412
|
+
print(r.R_t) # mayor que el sistema en serie
|
|
1413
|
+
print(r.mtbf) # mayor que cualquier componente individual
|
|
1414
|
+
```
|
|
1415
|
+
|
|
1416
|
+
### Sistema k-de-n — `koon_system`
|
|
1417
|
+
|
|
1418
|
+
Opera si al menos **k** de **n** componentes idénticos están en servicio.
|
|
1419
|
+
MTBF exacto = (1/λ) · Σ_{j=k}^{n} (1/j).
|
|
1420
|
+
|
|
1421
|
+
```python
|
|
1422
|
+
# 2-de-3: requiere al menos 2 de 3 componentes idénticos
|
|
1423
|
+
r = wl.koon_system(n=3, k=2, failure_rate=0.01, t=50)
|
|
1424
|
+
print(r.mtbf) # (1/0.01) * (1/2 + 1/3) ≈ 83.33
|
|
1425
|
+
print(r.R_t)
|
|
1426
|
+
```
|
|
1427
|
+
|
|
1428
|
+
**Casos especiales**
|
|
1429
|
+
- `k=1` → equivale a `parallel_system` con n componentes idénticos.
|
|
1430
|
+
- `k=n` → equivale a `series_system` con n componentes idénticos.
|
|
1431
|
+
|
|
1432
|
+
**Atributos de `ReliabilityResult`**
|
|
1433
|
+
|
|
1434
|
+
| Atributo | Descripción |
|
|
1435
|
+
|----------|-------------|
|
|
1436
|
+
| `topology` | `'component'`, `'series'`, `'parallel'`, `'k-of-n'` |
|
|
1437
|
+
| `n_components` | Número de componentes |
|
|
1438
|
+
| `failure_rates` | Lista de λi |
|
|
1439
|
+
| `mtbf` | MTBF del sistema |
|
|
1440
|
+
| `R_t` | Confiabilidad R(t) si se proporcionó `t` |
|
|
1441
|
+
| `availability` | Disponibilidad estacionaria A si se proporcionó `mttr` |
|
|
1442
|
+
| `mttr` | Tiempo medio de reparación (si se proporcionó) |
|
|
1443
|
+
|
|
1444
|
+
```python
|
|
1445
|
+
df = r.to_frame() # columnas: Topology, Components, MTBF[, R(t), Availability]
|
|
1446
|
+
r.R(t=200) # evalúa R(t) en cualquier tiempo posterior
|
|
1447
|
+
```
|
|
1448
|
+
|
|
1449
|
+
---
|
|
1450
|
+
|
|
1451
|
+
## 21. Referencia de módulos
|
|
1291
1452
|
|
|
1292
1453
|
| Módulo | Funciones y clases principales |
|
|
1293
1454
|
|---|---|
|
|
1294
1455
|
| `queuing` | `mm1`, `mmc`, `md1`, `kingman`, `mg1`, `littles_law`, `QueueResult`, `cv2_normal`, `cv2_triangular`, `cv2_uniform`, `cv2_erlang`, `cv2_gamma`, `cv2_lognormal`, `cv2_weibull` |
|
|
1295
1456
|
| `advanced` | `mm1k`, `mmck`, `erlang_b`, `mm1_priority`, `monte_carlo_gg1`, `takt_time`, `line_balance`, `break_even`, `break_even_multi`, `break_even_sales`, `queue_length_pmf`, `sojourn_cdf`, `PriorityQueueResult`, `SimulationResult`, `LineBalanceResult`, `BreakEvenResult`, `BreakEvenMultiResult` |
|
|
1296
1457
|
| `fitting` | `fit_from_data`, `FitResult` |
|
|
1297
|
-
| `inventory` | `eoq`, `ebq`, `eoq_multi`, `ebq_multi`, `eoq_multi_constrained`, `lot_for_lot`, `silver_meal`, `eoq_quantity_discount`, `reorder_point`, `newsvendor`, `EOQResult`, `EBQResult`, `MultiItemResult`, `ConstrainedMultiEOQResult`, `LotSizingResult`, `QuantityDiscountResult`, `ReorderResult`, `NewsvendorResult` |
|
|
1458
|
+
| `inventory` | `eoq`, `ebq`, `eoq_multi`, `ebq_multi`, `eoq_multi_constrained`, `lot_for_lot`, `silver_meal`, `eoq_quantity_discount`, `wagner_whitin`, `rq_policy`, `rs_policy`, `reorder_point`, `newsvendor`, `EOQResult`, `EBQResult`, `MultiItemResult`, `ConstrainedMultiEOQResult`, `LotSizingResult`, `QuantityDiscountResult`, `ReorderResult`, `NewsvendorResult`, `RQPolicyResult`, `RSPolicyResult` |
|
|
1459
|
+
| `scheduling` | `schedule_single`, `johnson_flowshop`, `ScheduleResult`, `JobSchedule`, `FlowShopResult` |
|
|
1460
|
+
| `reliability` | `mtbf_analysis`, `series_system`, `parallel_system`, `koon_system`, `ReliabilityResult` |
|
|
1298
1461
|
| `network` | `jackson_network`, `JacksonResult`, `StationMetrics` |
|
|
1299
1462
|
| `operations` | `oee`, `utilization_efficiency`, `unit_cost`, `OEEResult`, `UtilizationResult`, `UnitCostResult` |
|
|
1300
1463
|
| `bottleneck` | `bottleneck_analysis`, `BottleneckResult`, `StationResult` |
|
|
@@ -1304,7 +1467,7 @@ Wq : 0.3 (avg wait time in queue)
|
|
|
1304
1467
|
|
|
1305
1468
|
---
|
|
1306
1469
|
|
|
1307
|
-
##
|
|
1470
|
+
## 22. Requisitos
|
|
1308
1471
|
|
|
1309
1472
|
```
|
|
1310
1473
|
Python ≥ 3.9
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "walopy"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.6"
|
|
8
8
|
description = "Queuing theory, operations analysis, OEE, bottleneck analysis and KPI trees for Python"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
@@ -113,6 +113,33 @@ from .network import (
|
|
|
113
113
|
jackson_network,
|
|
114
114
|
)
|
|
115
115
|
|
|
116
|
+
# Inventory additions
|
|
117
|
+
from .inventory import (
|
|
118
|
+
RQPolicyResult,
|
|
119
|
+
RSPolicyResult,
|
|
120
|
+
rq_policy,
|
|
121
|
+
rs_policy,
|
|
122
|
+
wagner_whitin,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
# Scheduling
|
|
126
|
+
from .scheduling import (
|
|
127
|
+
JobSchedule,
|
|
128
|
+
ScheduleResult,
|
|
129
|
+
FlowShopResult,
|
|
130
|
+
schedule_single,
|
|
131
|
+
johnson_flowshop,
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
# Reliability
|
|
135
|
+
from .reliability import (
|
|
136
|
+
ReliabilityResult,
|
|
137
|
+
mtbf_analysis,
|
|
138
|
+
series_system,
|
|
139
|
+
parallel_system,
|
|
140
|
+
koon_system,
|
|
141
|
+
)
|
|
142
|
+
|
|
116
143
|
from importlib.metadata import version, PackageNotFoundError
|
|
117
144
|
try:
|
|
118
145
|
__version__: str = version("walopy")
|
|
@@ -205,4 +232,22 @@ __all__ = [
|
|
|
205
232
|
"StationMetrics",
|
|
206
233
|
"JacksonResult",
|
|
207
234
|
"jackson_network",
|
|
235
|
+
# inventory additions
|
|
236
|
+
"RQPolicyResult",
|
|
237
|
+
"RSPolicyResult",
|
|
238
|
+
"rq_policy",
|
|
239
|
+
"rs_policy",
|
|
240
|
+
"wagner_whitin",
|
|
241
|
+
# scheduling
|
|
242
|
+
"JobSchedule",
|
|
243
|
+
"ScheduleResult",
|
|
244
|
+
"FlowShopResult",
|
|
245
|
+
"schedule_single",
|
|
246
|
+
"johnson_flowshop",
|
|
247
|
+
# reliability
|
|
248
|
+
"ReliabilityResult",
|
|
249
|
+
"mtbf_analysis",
|
|
250
|
+
"series_system",
|
|
251
|
+
"parallel_system",
|
|
252
|
+
"koon_system",
|
|
208
253
|
]
|