statslibx 0.1.7__tar.gz → 0.1.8__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 (27) hide show
  1. {statslibx-0.1.7 → statslibx-0.1.8}/PKG-INFO +17 -3
  2. {statslibx-0.1.7 → statslibx-0.1.8}/README.md +16 -2
  3. {statslibx-0.1.7 → statslibx-0.1.8}/pyproject.toml +1 -1
  4. {statslibx-0.1.7 → statslibx-0.1.8}/statslibx/__init__.py +12 -8
  5. statslibx-0.1.8/statslibx/computacional.py +2 -0
  6. statslibx-0.1.8/statslibx/datasets/__init__.py +244 -0
  7. {statslibx-0.1.7 → statslibx-0.1.8}/statslibx/descriptive.py +8 -9
  8. statslibx-0.1.8/statslibx/inferential.py +1480 -0
  9. {statslibx-0.1.7 → statslibx-0.1.8}/statslibx/preprocessing/__init__.py +12 -5
  10. statslibx-0.1.8/statslibx/probability.py +2 -0
  11. {statslibx-0.1.7 → statslibx-0.1.8}/statslibx/utils.py +112 -150
  12. {statslibx-0.1.7 → statslibx-0.1.8}/statslibx.egg-info/PKG-INFO +17 -3
  13. {statslibx-0.1.7 → statslibx-0.1.8}/statslibx.egg-info/SOURCES.txt +2 -5
  14. statslibx-0.1.7/statslibx/datasets/__init__.py +0 -71
  15. statslibx-0.1.7/statslibx/datasets/course_completion.csv +0 -100001
  16. statslibx-0.1.7/statslibx/datasets/iris.csv +0 -151
  17. statslibx-0.1.7/statslibx/datasets/penguins.csv +0 -345
  18. statslibx-0.1.7/statslibx/datasets/sp500_companies.csv +0 -504
  19. statslibx-0.1.7/statslibx/datasets/titanic.csv +0 -419
  20. statslibx-0.1.7/statslibx/inferential.py +0 -1041
  21. {statslibx-0.1.7 → statslibx-0.1.8}/setup.cfg +0 -0
  22. {statslibx-0.1.7 → statslibx-0.1.8}/statslibx/cli.py +0 -0
  23. {statslibx-0.1.7 → statslibx-0.1.8}/statslibx/io.py +0 -0
  24. {statslibx-0.1.7 → statslibx-0.1.8}/statslibx.egg-info/dependency_links.txt +0 -0
  25. {statslibx-0.1.7 → statslibx-0.1.8}/statslibx.egg-info/entry_points.txt +0 -0
  26. {statslibx-0.1.7 → statslibx-0.1.8}/statslibx.egg-info/requires.txt +0 -0
  27. {statslibx-0.1.7 → statslibx-0.1.8}/statslibx.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: statslibx
3
- Version: 0.1.7
3
+ Version: 0.1.8
4
4
  Summary: StatsLibx - Librería de estadística descriptiva e inferencial
5
5
  Author-email: Emmanuel Ascendra Perez <ascendraemmanuel@gmail.com>
6
6
  License: MIT
@@ -24,12 +24,14 @@ Provides-Extra: advanced
24
24
  Requires-Dist: scikit-learn>=1.0; extra == "advanced"
25
25
  Requires-Dist: statsmodels>=0.13; extra == "advanced"
26
26
 
27
- # 📦 Descripción para PyPI (Plantilla Profesional)
27
+ # 📦 StatsLibX
28
28
 
29
29
  StatsLibX es un paquete de Python diseñado para proporcionar una solución sencilla, eficiente y flexible para manejar volumenes de datos.
30
30
 
31
31
  Este proyecto surge con la idea de ofrecer una alternativa moderna, intuitiva y ligera que permita a desarrolladores y entusiastas integrar la **estadistica descriptiva e inferencial** sin complicaciones, con multiples funcionalidades y utilidades pensadas para el futuro.
32
32
 
33
+ GitHub del Proyecto: [text](https://github.com/GhostAnalyst30/StatsLibX)
34
+
33
35
  ## ✨ Características principales
34
36
 
35
37
  - ⚡ Rápido y eficiente: optimizado para ofrecer un rendimiento suave incluso en tareas exigentes.
@@ -45,16 +47,28 @@ Este proyecto surge con la idea de ofrecer una alternativa moderna, intuitiva y
45
47
  ## 🚀 Ejemplo rápido
46
48
  ```python
47
49
  from statslibx import DescriptiveStats, InferentialStats, UtilsStats
50
+ from statslibx.datasets import load_iris()
51
+
52
+ data = load_iris()
48
53
 
49
54
  stats = DescriptiveStats(data) # InferentialStats(data), UtilsStats()
50
- stats.help()
55
+
56
+ stats.summary()
51
57
  ```
58
+ Para ver mas funciones: [text](https://github.com/GhostAnalyst30/StatsLibX/blob/main/how_use_statslibx.ipynb)
52
59
 
53
60
  ## 📦 Instalación
54
61
  ```bash
55
62
  pip install statslibx
56
63
  ```
57
64
 
65
+ ## 👩‍💻 ¡Usalo en la terminal! (De forma preliminar)
66
+ ```bash
67
+ statslibx describe .\archive.csv # Devuelve una descripcion de la data
68
+ statslibx quality .\archive.csv # Devuelve la calidad de los datos
69
+ statslibx preview .\archive.csv # Devuelve una visualizacion de los datos
70
+ ```
71
+
58
72
  🤝 Contribuciones
59
73
 
60
74
  ¡Todas las mejoras e ideas son bienvenidas!
@@ -1,9 +1,11 @@
1
- # 📦 Descripción para PyPI (Plantilla Profesional)
1
+ # 📦 StatsLibX
2
2
 
3
3
  StatsLibX es un paquete de Python diseñado para proporcionar una solución sencilla, eficiente y flexible para manejar volumenes de datos.
4
4
 
5
5
  Este proyecto surge con la idea de ofrecer una alternativa moderna, intuitiva y ligera que permita a desarrolladores y entusiastas integrar la **estadistica descriptiva e inferencial** sin complicaciones, con multiples funcionalidades y utilidades pensadas para el futuro.
6
6
 
7
+ GitHub del Proyecto: [text](https://github.com/GhostAnalyst30/StatsLibX)
8
+
7
9
  ## ✨ Características principales
8
10
 
9
11
  - ⚡ Rápido y eficiente: optimizado para ofrecer un rendimiento suave incluso en tareas exigentes.
@@ -19,16 +21,28 @@ Este proyecto surge con la idea de ofrecer una alternativa moderna, intuitiva y
19
21
  ## 🚀 Ejemplo rápido
20
22
  ```python
21
23
  from statslibx import DescriptiveStats, InferentialStats, UtilsStats
24
+ from statslibx.datasets import load_iris()
25
+
26
+ data = load_iris()
22
27
 
23
28
  stats = DescriptiveStats(data) # InferentialStats(data), UtilsStats()
24
- stats.help()
29
+
30
+ stats.summary()
25
31
  ```
32
+ Para ver mas funciones: [text](https://github.com/GhostAnalyst30/StatsLibX/blob/main/how_use_statslibx.ipynb)
26
33
 
27
34
  ## 📦 Instalación
28
35
  ```bash
29
36
  pip install statslibx
30
37
  ```
31
38
 
39
+ ## 👩‍💻 ¡Usalo en la terminal! (De forma preliminar)
40
+ ```bash
41
+ statslibx describe .\archive.csv # Devuelve una descripcion de la data
42
+ statslibx quality .\archive.csv # Devuelve la calidad de los datos
43
+ statslibx preview .\archive.csv # Devuelve una visualizacion de los datos
44
+ ```
45
+
32
46
  🤝 Contribuciones
33
47
 
34
48
  ¡Todas las mejoras e ideas son bienvenidas!
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "statslibx"
7
- version = "0.1.7"
7
+ version = "0.1.8"
8
8
  description = "StatsLibx - Librería de estadística descriptiva e inferencial"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
@@ -1,30 +1,32 @@
1
1
  """
2
2
  StatsLibx - Librería de Estadística para Python
3
3
  Autor: Emmanuel Ascendra
4
- Versión: 0.1.6
4
+ Versión: 0.1.8
5
5
  """
6
6
 
7
- __version__ = "0.1.6"
7
+ __version__ = "0.1.8"
8
8
  __author__ = "Emmanuel Ascendra"
9
9
 
10
10
  # Importar las clases principales
11
11
  from .descriptive import DescriptiveStats, DescriptiveSummary
12
12
  from .inferential import InferentialStats, TestResult
13
+ from .probability import ProbabilityStats
14
+ from .computacional import ComputacionalStats
13
15
  from .utils import UtilsStats
14
16
  from .preprocessing import Preprocessing
15
- from .datasets import load_dataset
17
+ from .datasets import load_dataset, generate_dataset
16
18
 
17
19
  # Definir qué se expone cuando se hace: from statslib import *
18
20
  __all__ = [
19
21
  # Clases principales
20
22
  'DescriptiveStats',
21
- 'InferentialStats',
22
- 'LinearRegressionResult',
23
- 'DescriptiveSummary',
24
- 'TestResult',
23
+ 'InferentialStats',
24
+ 'ProbabilityStats',
25
+ 'ComputacionalStats',
25
26
  'UtilsStats',
26
27
  'Preprocessing',
27
- 'load_dataset'
28
+ 'load_dataset',
29
+ 'generate_dataset'
28
30
  ]
29
31
 
30
32
  # Mensaje de bienvenida (opcional)
@@ -37,5 +39,7 @@ def welcome():
37
39
  print(f" - DescriptiveStats: Estadística descriptiva")
38
40
  print(f" - InferentialStats: Estadística inferencial")
39
41
  print(f" - UtilsStats: Utilidades Extras")
42
+ print(f"\nMódulos disponibles:")
43
+ print(f" - Datasets: Carga de Datasets")
40
44
  print(f" - Preprocessing: Preprocesamiento de datos")
41
45
  print(f"\nPara más información: help(statslibx)")
@@ -0,0 +1,2 @@
1
+ class ComputacionalStats:
2
+ pass
@@ -0,0 +1,244 @@
1
+ from typing import Optional, Union, Literal, List, Tuple
2
+ import io
3
+ import pkgutil
4
+
5
+ import pandas as pd
6
+ import polars as pl
7
+ import numpy as np
8
+ from numpy.typing import NDArray
9
+
10
+
11
+ _SUPPORTED_BACKENDS = ("pandas", "polars")
12
+
13
+
14
+ def _validate_columns(
15
+ df: Union[pd.DataFrame, pl.DataFrame],
16
+ X_columns: List[str],
17
+ y_column: str
18
+ ) -> None:
19
+ columns = set(df.columns)
20
+ missing = set(X_columns + [y_column]) - columns
21
+ if missing:
22
+ raise ValueError(f"Columnas no encontradas en el dataset: {missing}")
23
+
24
+
25
+ def _X_y(
26
+ df: Union[pd.DataFrame, pl.DataFrame],
27
+ X_columns: List[str],
28
+ y_column: str
29
+ ) -> Tuple[NDArray, NDArray]:
30
+ """
31
+ Extrae X e y como arrays numpy desde pandas o polars.
32
+ """
33
+ _validate_columns(df, X_columns, y_column)
34
+
35
+ if isinstance(df, pd.DataFrame):
36
+ X = df[X_columns].to_numpy()
37
+ y = df[y_column].to_numpy().ravel()
38
+ return X, y
39
+
40
+ elif isinstance(df, pl.DataFrame):
41
+ X = df.select(X_columns).to_numpy()
42
+ y = df.select(y_column).to_numpy().ravel()
43
+ return X, y
44
+
45
+ else:
46
+ raise TypeError(
47
+ "Backend no soportado. Use pandas.DataFrame o polars.DataFrame."
48
+ )
49
+
50
+
51
+ def load_dataset(
52
+ name: str,
53
+ backend: Literal["pandas", "polars"] = "pandas",
54
+ return_X_y: Optional[Tuple[List[str], str]] = None
55
+ ) -> Union[pd.DataFrame, pl.DataFrame, Tuple[NDArray, NDArray]]:
56
+ """
57
+ Carga un dataset interno del paquete.
58
+
59
+ Datasets disponibles:
60
+ - iris.csv
61
+ - penguins.csv
62
+ - sp500_companies.csv
63
+ - titanic.csv
64
+ - course_completion.csv
65
+
66
+ Parámetros
67
+ ----------
68
+ name : str
69
+ Nombre del archivo CSV.
70
+ backend : {'pandas', 'polars'}, default='pandas'
71
+ Backend de DataFrame a utilizar.
72
+ return_X_y : tuple[list[str], str], optional
73
+ Si se especifica, devuelve (X, y) como arrays numpy,
74
+
75
+ Retorna
76
+ -------
77
+ DataFrame o (X, y)
78
+ """
79
+ if backend not in _SUPPORTED_BACKENDS:
80
+ raise ValueError(
81
+ f"Backend '{backend}' no soportado. "
82
+ f"Use uno de {_SUPPORTED_BACKENDS}."
83
+ )
84
+
85
+ # ---------- 1️⃣ Intentar cargar desde el paquete ----------
86
+ data_bytes = pkgutil.get_data("statslibx.datasets", name)
87
+
88
+ if data_bytes is not None:
89
+ df = (
90
+ pd.read_csv(io.BytesIO(data_bytes))
91
+ if backend == "pandas"
92
+ else pl.read_csv(io.BytesIO(data_bytes))
93
+ )
94
+
95
+ # ---------- 2️⃣ Si no está en el paquete, buscar en ruta actual ----------
96
+ else:
97
+ try:
98
+ df = (
99
+ pd.read_csv(name)
100
+ if backend == "pandas"
101
+ else pl.read_csv(name)
102
+ )
103
+ except FileNotFoundError:
104
+ raise FileNotFoundError(
105
+ f"Dataset '{name}' no encontrado "
106
+ f"ni en statslibx.datasets ni en la ruta actual."
107
+ )
108
+
109
+ # ---------- 3️⃣ Devolver X, y si se solicita ----------
110
+ if return_X_y is not None:
111
+ X_columns, y_column = return_X_y
112
+ return _X_y(df, X_columns, y_column)
113
+
114
+ return df
115
+
116
+ # =========================
117
+ # Datasets específicos
118
+ # =========================
119
+
120
+ def load_iris(
121
+ backend: Literal["pandas", "polars"] = "pandas",
122
+ return_X_y: Optional[Tuple[List[str], str]] = None
123
+ ):
124
+ return load_dataset(
125
+ "iris.csv",
126
+ backend=backend,
127
+ return_X_y=return_X_y
128
+ )
129
+
130
+
131
+ def load_penguins(
132
+ backend: Literal["pandas", "polars"] = "pandas",
133
+ return_X_y: Optional[Tuple[List[str], str]] = None
134
+ ):
135
+ return load_dataset(
136
+ "penguins.csv",
137
+ backend=backend,
138
+ return_X_y=return_X_y
139
+ )
140
+
141
+
142
+ from typing import Optional
143
+
144
+ def generate_dataset(n_rows, schema, seed=None, save: Optional[bool] = False, filename: Optional[str] = None):
145
+ if seed is not None:
146
+ if not isinstance(seed, int):
147
+ raise TypeError("seed debe ser un entero o None")
148
+ np.random.seed(seed)
149
+ else:
150
+ np.random.seed(42)
151
+
152
+ if not isinstance(schema, dict):
153
+ raise TypeError("schema debe ser un diccionario")
154
+
155
+
156
+
157
+ data = {}
158
+
159
+ for col, config in schema.items():
160
+ if "dist" not in config:
161
+ raise ValueError(f"La columna '{col}' no tiene 'dist' definido")
162
+
163
+ dist = config["dist"]
164
+ dtype = config.get("type", "float")
165
+ nround = config.get("round", 0)
166
+
167
+ # ---------- DISTRIBUCIONES ----------
168
+ if dist == "normal":
169
+ values = np.random.normal(
170
+ loc=config.get("mean", 0),
171
+ scale=config.get("std", 1),
172
+ size=n_rows
173
+ )
174
+
175
+ elif dist == "uniform":
176
+ values = np.random.uniform(
177
+ low=config.get("low", 0),
178
+ high=config.get("high", 1),
179
+ size=n_rows
180
+ )
181
+
182
+ elif dist == "exponential":
183
+ values = np.random.exponential(
184
+ scale=config.get("scale", 1),
185
+ size=n_rows
186
+ )
187
+
188
+ elif dist == "lognormal":
189
+ values = np.random.lognormal(
190
+ mean=config.get("mean", 0),
191
+ sigma=config.get("std", 1),
192
+ size=n_rows
193
+ )
194
+
195
+ elif dist == "poisson":
196
+ values = np.random.poisson(
197
+ lam=config.get("lam", 1),
198
+ size=n_rows
199
+ )
200
+
201
+ elif dist == "binomial":
202
+ values = np.random.binomial(
203
+ n=config.get("n", 1),
204
+ p=config.get("p", 0.5),
205
+ size=n_rows
206
+ )
207
+
208
+ elif dist == "categorical":
209
+ if "choices" not in config:
210
+ raise ValueError(f"'choices' es requerido para categorical ({col})")
211
+ values = np.random.choice(
212
+ config["choices"],
213
+ size=n_rows
214
+ )
215
+ data[col] = values
216
+ continue
217
+
218
+ else:
219
+ raise ValueError(f"Distribución no soportada: {dist}")
220
+
221
+ # ---------- CASTEO DE TIPO ----------
222
+ if dtype == "int":
223
+ values = np.round(values).astype(int)
224
+ elif dtype == "float":
225
+ values = values.astype(float)
226
+ else:
227
+ raise ValueError(f"Tipo no soportado: {dtype}")
228
+
229
+ # ---------- REDONDEO ----------
230
+ if nround > 0:
231
+ values = np.round(values, nround)
232
+ else:
233
+ values = np.round(values, 2)
234
+
235
+ data[col] = values
236
+
237
+ if save and filename:
238
+ df = pd.DataFrame(data)
239
+ df.to_csv(f"{filename}.csv", index=False)
240
+ else:
241
+ df = pd.DataFrame(data)
242
+ df.to_csv("dataset.csv", index=False)
243
+
244
+ return pd.DataFrame(data)
@@ -13,7 +13,6 @@ import plotly.express as px
13
13
 
14
14
  class DescriptiveStats:
15
15
  """
16
- Clase para estadística descriptiva univariada y multivariada
17
16
  Class for univariate and multivariate descriptive statistics
18
17
  """
19
18
 
@@ -23,7 +22,7 @@ class DescriptiveStats:
23
22
  thousand: str = None,
24
23
  backend: Literal['pandas', 'polars'] = 'pandas'):
25
24
  """
26
- # Inicialize DataFrame
25
+ # Initialize DataFrame
27
26
 
28
27
  ## **Parameters:**
29
28
 
@@ -54,7 +53,8 @@ class DescriptiveStats:
54
53
  if data.ndim == 1:
55
54
  data = pd.DataFrame({'var': data})
56
55
  else:
57
- data = pd.DataFrame(data, columns=[f'var_{i}' for i in range(data.shape[1])])
56
+ data = pd.DataFrame(data, columns=[f'var_{i}' for i in range(data.shape[1])]) \
57
+ if isinstance(data, pd.DataFrame) else pl.DataFrame(data, )
58
58
 
59
59
  self.data = data
60
60
  self.backend = backend
@@ -394,7 +394,7 @@ class DescriptiveStats:
394
394
 
395
395
 
396
396
 
397
- def help(self, lang="es-Es"):
397
+ def help(self, lang="es-ES"):
398
398
  """
399
399
  Muestra ayuda completa de la clase DescriptiveStats
400
400
 
@@ -407,7 +407,8 @@ class DescriptiveStats:
407
407
  if lang in ["en-US", "English", "english"]:
408
408
  lang = "en-US"
409
409
  else:
410
- lang = ""
410
+ lang = "es-ES"
411
+ help_text = " "
411
412
 
412
413
  match lang:
413
414
  case "es-ES":
@@ -614,10 +615,9 @@ class DescriptiveStats:
614
615
  ╚════════════════════════════════════════════════════════════════════════════╝
615
616
  """
616
617
  case "en-US":
617
- # --- Falta por traducir
618
618
  help_text = """
619
619
  ╔════════════════════════════════════════════════════════════════════════════╗
620
- ║ 📊 DescriptiveStats CLASS - COMPLETE HELP
620
+ ║ 📊 CLASS DescriptiveStats - COMPLETE HELP
621
621
  ╚════════════════════════════════════════════════════════════════════════════╝
622
622
 
623
623
  📝 DESCRIPTION:
@@ -821,8 +821,7 @@ class DescriptiveStats:
821
821
 
822
822
  print(help_text)
823
823
 
824
-
825
-
824
+
826
825
  class DescriptiveSummary:
827
826
  """Clase para formatear salida de estadística descriptiva"""
828
827