pynotas 0.12.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. pynotas-0.12.0/CHANGELOG.md +92 -0
  2. pynotas-0.12.0/LICENSE +21 -0
  3. pynotas-0.12.0/MANIFEST.in +3 -0
  4. pynotas-0.12.0/PKG-INFO +110 -0
  5. pynotas-0.12.0/README.md +82 -0
  6. pynotas-0.12.0/examples/01_PyNotas.ipynb +136 -0
  7. pynotas-0.12.0/examples/mediciones.py +14 -0
  8. pynotas-0.12.0/pyproject.toml +36 -0
  9. pynotas-0.12.0/setup.cfg +4 -0
  10. pynotas-0.12.0/src/pynotas/__init__.py +42 -0
  11. pynotas-0.12.0/src/pynotas/__main__.py +2 -0
  12. pynotas-0.12.0/src/pynotas/_version.py +1 -0
  13. pynotas-0.12.0/src/pynotas/analysis_context.py +47 -0
  14. pynotas-0.12.0/src/pynotas/analyzer.py +173 -0
  15. pynotas-0.12.0/src/pynotas/artwork.py +223 -0
  16. pynotas-0.12.0/src/pynotas/capture.py +81 -0
  17. pynotas-0.12.0/src/pynotas/cli.py +22 -0
  18. pynotas-0.12.0/src/pynotas/exports.py +109 -0
  19. pynotas-0.12.0/src/pynotas/files.py +32 -0
  20. pynotas-0.12.0/src/pynotas/fonts/DejaVuSans-Bold.ttf +0 -0
  21. pynotas-0.12.0/src/pynotas/fonts/DejaVuSans.ttf +0 -0
  22. pynotas-0.12.0/src/pynotas/fonts/DejaVuSansMono.ttf +0 -0
  23. pynotas-0.12.0/src/pynotas/fonts/LICENSE_DEJAVU +99 -0
  24. pynotas-0.12.0/src/pynotas/illustrations.py +61 -0
  25. pynotas-0.12.0/src/pynotas/infographic.py +208 -0
  26. pynotas-0.12.0/src/pynotas/layout.py +354 -0
  27. pynotas-0.12.0/src/pynotas/lessons.py +145 -0
  28. pynotas-0.12.0/src/pynotas/letter_layout.py +143 -0
  29. pynotas-0.12.0/src/pynotas/ml.py +219 -0
  30. pynotas-0.12.0/src/pynotas/model.py +131 -0
  31. pynotas-0.12.0/src/pynotas/notebook.py +214 -0
  32. pynotas-0.12.0/src/pynotas/preparation.py +157 -0
  33. pynotas-0.12.0/src/pynotas/presentation.py +42 -0
  34. pynotas-0.12.0/src/pynotas/reading_layout.py +164 -0
  35. pynotas-0.12.0/src/pynotas/renderers.py +232 -0
  36. pynotas-0.12.0/src/pynotas/resources.py +122 -0
  37. pynotas-0.12.0/src/pynotas/selector.py +73 -0
  38. pynotas-0.12.0/src/pynotas/sheets.py +109 -0
  39. pynotas-0.12.0/src/pynotas/stages.py +163 -0
  40. pynotas-0.12.0/src/pynotas/syntax.py +24 -0
  41. pynotas-0.12.0/src/pynotas/teacher.py +234 -0
  42. pynotas-0.12.0/src/pynotas/teaching.py +318 -0
  43. pynotas-0.12.0/src/pynotas/theory.py +200 -0
  44. pynotas-0.12.0/src/pynotas/walkthrough.py +413 -0
  45. pynotas-0.12.0/src/pynotas.egg-info/PKG-INFO +110 -0
  46. pynotas-0.12.0/src/pynotas.egg-info/SOURCES.txt +63 -0
  47. pynotas-0.12.0/src/pynotas.egg-info/dependency_links.txt +1 -0
  48. pynotas-0.12.0/src/pynotas.egg-info/entry_points.txt +2 -0
  49. pynotas-0.12.0/src/pynotas.egg-info/requires.txt +12 -0
  50. pynotas-0.12.0/src/pynotas.egg-info/top_level.txt +1 -0
  51. pynotas-0.12.0/tests/test_auto_import.py +84 -0
  52. pynotas-0.12.0/tests/test_design_080.py +86 -0
  53. pynotas-0.12.0/tests/test_engine.py +235 -0
  54. pynotas-0.12.0/tests/test_exports_theory.py +157 -0
  55. pynotas-0.12.0/tests/test_general.py +103 -0
  56. pynotas-0.12.0/tests/test_infographic_0110.py +153 -0
  57. pynotas-0.12.0/tests/test_letter_091.py +101 -0
  58. pynotas-0.12.0/tests/test_ml_visual_070.py +93 -0
  59. pynotas-0.12.0/tests/test_preparation.py +112 -0
  60. pynotas-0.12.0/tests/test_reading_090.py +145 -0
  61. pynotas-0.12.0/tests/test_rename_0120.py +92 -0
  62. pynotas-0.12.0/tests/test_resources.py +109 -0
  63. pynotas-0.12.0/tests/test_simple_sheets.py +88 -0
  64. pynotas-0.12.0/tests/test_teacher_0100.py +116 -0
  65. pynotas-0.12.0/tests/test_teaching.py +88 -0
@@ -0,0 +1,92 @@
1
+ # Changelog
2
+
3
+ ## 0.12.0 — PyNotas
4
+
5
+ - SURF IA changes its library name to PyNotas: `pip install pynotas`, `import pynotas`.
6
+ - Updated visible branding, PDF/JPG filenames, HTML titles and CLI.
7
+ - Preserved the AST analysis, teaching explanations and single-execution notebook integration.
8
+ - Legacy opt-out comments, environment variable and appearance option remain accepted.
9
+ - A separate surfia-pedagogia compatibility package forwards old imports to PyNotas.
10
+
11
+ # 0.11.0 · Infografías por tareas y gráficos de la celda
12
+
13
+ - Modelo intermedio ampliado con etapas pedagógicas e imágenes ya publicadas; esquema 0.11.
14
+ - Nuevo render adaptable en carta: tarjetas numeradas, paleta por tarea, iconos vectoriales, sintaxis resaltada y actividad de práctica.
15
+ - Se explican cadenas de agrupación, cálculo, ordenación y parámetros de gráficos. Se conservan todos los fragmentos y alcances.
16
+ - Copia opcional de PNG/JPEG publicados por la celda mediante el publicador IPython. Sin reevaluar el código ni inspeccionar variables; límites de memoria, restauración de métodos y respeto de la salida original.
17
+ - Imágenes reales integradas en SVG, PDF y JPG; lectura estática sin resultados inventados.
18
+ - Notebook reproducible con motores, desviación estándar y decisiones; datos sintéticos y comprobaciones numéricas.
19
+ - Sin nuevas dependencias obligatorias, sin LLM ni API. La interacción en Colab debe verificarse después de publicar.
20
+
21
+ # 0.10.0 · Explicar como un profesor cercano
22
+
23
+ - Nueva lectura pedagógica: datos, acción y destino, con nombres concretos y lenguaje para principiantes.
24
+ - Analogías y humor breve separados de la explicación, con un máximo de dos por celda.
25
+ - Explicación de 11 puntos, seguida por el código de ancho completo; hojas carta con continuidad de líneas y alcances.
26
+ - Se retiran los paneles de teoría del dominio de la lámina. El catálogo sigue en el modelo, sin integrar un LLM ni servicios externos.
27
+ - Se conservan la salida plegada, la ejecución única y las exportaciones PDF/JPG.
28
+ - El borrador 0.9.2 de estabilidad de Colab se archivó, sin incorporarlo a esta versión.
29
+
30
+ # 0.9.1 · Carta y fundamento del análisis
31
+
32
+ - Hojas carta verticales reales (612 × 792 puntos) en PDF, SVG y JPG. Una página si cabe; varias páginas cuando el código lo necesita.
33
+ - Teoría al comienzo: objetivo del análisis, fundamento e interpretación. Explicaciones específicas de RMS, FFT y preparación de archivos MATLAB; se conservan los demás conceptos detectados.
34
+ - Código y explicación juntos, con lectura compacta, comentarios, líneas originales y continuidad de pasos y alcances entre páginas.
35
+ - JPG a 300 ppp (2550 × 3300 píxeles) por página; descargas con nombres distintos para evitar confusión.
36
+ - Sin nuevas dependencias, API ni reevaluación del código. Continúa oculto por defecto.
37
+
38
+ # 0.9.0 · Código y explicación juntos
39
+
40
+ - Una lámina continua por celda en HTML/SVG, PDF y JPG, sin paginación automática.
41
+ - Pasos en orden de lectura, cada fragmento de código junto a su explicación; comentarios y líneas originales conservados.
42
+ - Alcances explícitos para condiciones, bucles, funciones y manejo de errores.
43
+ - Explicaciones de búsqueda y carga de archivos MATLAB, filtros de diccionario y mensajes con formato.
44
+ - Contexto local sobre archivos .mat, diccionarios, tipos y dimensiones.
45
+ - Cálculos repartidos entre líneas explicados por su operación inmediata, sin atribuir el cálculo completo a la última línea.
46
+ - PDF vectorial con altura variable y JPG de una sola imagen. Se conservan el desplegable exterior y la ejecución única.
47
+
48
+ # 0.8.0 · 2026-10-09
49
+
50
+ - Rediseño del generador compartido por HTML/SVG, PDF y JPG. La selección de familia visual es automática y no requiere nueva configuración del estudiante.
51
+ - Mapa visual central para señales, redes, aprendizaje, decisiones, recursos y código general; curvas vectoriales, paletas por tema y anotaciones editoriales.
52
+ - La condición del código aparece en la primera bifurcación conceptual. Se conservan las explicaciones de ramas y estructuras anidadas.
53
+ - Menos repetición de texto cuando el propósito de una importación coincide exactamente con la teoría ya presentada.
54
+ - Maquetación y paginación revisadas, con código completo y resultados nativos intactos.
55
+
56
+ # 0.7.0 · 2026-10-09
57
+
58
+ - Nuevo diseño vectorial compartido por SVG, PDF y JPG: ilustraciones conceptuales, código con colores, secciones numeradas, tarjetas en columnas y continuidad de páginas.
59
+ - 21 conceptos revisados de machine learning/redes neuronales con fuentes oficiales, seleccionados por sintaxis e identidad explícita de importaciones.
60
+ - Identificación conservadora de constructores y métodos de scikit-learn y Keras, entre celdas exitosas. Se invalidan identidades ante errores, reasignaciones y mutaciones explícitas.
61
+ - Se mantienen importación automática, salida inicialmente oculta, ejecución única y descargas sin servicios externos.
62
+ - Ejemplos reproducibles de vibraciones, clasificación y perceptrón multicapa.
63
+
64
+ # Cambios
65
+
66
+ ## 0.6.0 — 2026-10-08
67
+
68
+ - Explicación automática plegada por defecto; resultados originales visibles.
69
+ - Una única apertura, con código y detalle pedagógico completos en su interior.
70
+ - Diseño paginado común para SVG, PDF vectorial y JPG a 300 ppp.
71
+ - Botones de descarga autocontenidos y API `exportar`, sin reejecutar código.
72
+ - Teoría local revisada para operaciones de NumPy/SciPy y vibraciones.
73
+ - Fuentes DejaVu incluidas para exportaciones portátiles.
74
+ - Nuevas dependencias locales: ReportLab, PDFium y Pillow.
75
+ - Modelo 0.4 con contexto y teoría; compatibilidad con la API de 0.5.
76
+ - Límite adicional de 24 páginas por lámina para evitar salidas excesivas.
77
+
78
+ ## 0.5.0 — 2026-10-06
79
+
80
+ - Base general de código abierto MIT, publicada en PyPI.
81
+ - Conserva las láminas simples de 0.4.0 y elimina la dependencia del caso SAG.
82
+ - Núcleo sin dependencias externas; IPython es opcional para integración con notebooks.
83
+ - API `guardar` / `explicar_archivo` y comando `surfia` para exportar HTML sin ejecutar el archivo.
84
+ - Explicaciones internas desplegables de funciones, bucles, clases, contextos, errores y patrones.
85
+ - Modelo pedagógico 0.3: cuerpos internos separados del diagrama exterior.
86
+ - Lecturas específicas para generadores, funciones lambda, mensajes formateados y control de bucles.
87
+ - Protección de archivos existentes y comprobaciones de sintaxis antes de escribir una lámina.
88
+
89
+ ## 0.4.0
90
+
91
+ - Diseño datos → proceso → resultado, teoría breve y código desplegable.
92
+ - Validación del caso SAG sin modificar sus resultados numéricos.
pynotas-0.12.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 SURF IA contributors
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.
@@ -0,0 +1,3 @@
1
+ include LICENSE README.md CHANGELOG.md
2
+ recursive-include tests test_*.py
3
+ recursive-include examples *.ipynb *.py
@@ -0,0 +1,110 @@
1
+ Metadata-Version: 2.4
2
+ Name: pynotas
3
+ Version: 0.12.0
4
+ Summary: Láminas visuales en español para comprender código Python y sus conceptos
5
+ Author: SURF IA
6
+ License-Expression: MIT
7
+ Keywords: education,python,jupyter,colab,spanish
8
+ Classifier: Development Status :: 4 - Beta
9
+ Classifier: Intended Audience :: Education
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3 :: Only
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Topic :: Education
14
+ Requires-Python: >=3.10
15
+ Description-Content-Type: text/markdown
16
+ License-File: LICENSE
17
+ Requires-Dist: reportlab<5,>=4.2
18
+ Requires-Dist: pypdfium2<6,>=4.30
19
+ Requires-Dist: pillow<13,>=10
20
+ Provides-Extra: notebook
21
+ Requires-Dist: ipython>=7.34; extra == "notebook"
22
+ Provides-Extra: dev
23
+ Requires-Dist: ipython>=7.34; extra == "dev"
24
+ Requires-Dist: build>=1.2; extra == "dev"
25
+ Requires-Dist: twine>=6; extra == "dev"
26
+ Requires-Dist: nbformat>=5; extra == "dev"
27
+ Dynamic: license-file
28
+
29
+ # PyNotas
30
+
31
+ **Tu código, explicado paso a paso.** Una biblioteca pedagógica de SURF IA.
32
+
33
+ PyNotas convierte código Python en apuntes visuales en español para acompañar el
34
+ aprendizaje. Puedes usarla con código escrito por ti o generado con ayuda de un LLM.
35
+ Identifica operaciones conocidas, explica sus pasos y parámetros y organiza las
36
+ notas en láminas descargables. Funciona mediante análisis estático y plantillas:
37
+ no necesita un LLM ni una API, y no vuelve a ejecutar tu código.
38
+
39
+ ## En Google Colab o Jupyter
40
+
41
+ ```python
42
+ %pip install pynotas
43
+ ```
44
+
45
+ En una nueva celda:
46
+
47
+ ```python
48
+ import pynotas
49
+ ```
50
+
51
+ Ejecuta después una celda de Python. La salida original permanece visible y las
52
+ notas aparecen plegadas en **Ver explicación de PyNotas**. Puedes abrirlas,
53
+ descargarlas como PDF o JPG y volver a ocultarlas. Se pliegan las notas, no la
54
+ celda completa ni sus resultados. Si actualizas una biblioteca ya importada,
55
+ reinicia la sesión antes de volver a importarla.
56
+
57
+ ## Opciones
58
+
59
+ ```python
60
+ pynotas.activar(oculto=True) # Notas plegadas al terminar cada celda.
61
+ pynotas.activar(capturar_graficos=False)
62
+ pynotas.desactivar()
63
+ pynotas.activar()
64
+ print(pynotas.__version__)
65
+ ```
66
+
67
+ No hace falta indicar un contexto para comenzar. `contexto="vibraciones"` y otras
68
+ opciones del motor se conservan. Para omitir una celda, incluye `# pynotas: omitir`.
69
+ `PYNOTAS_AUTOACTIVAR=0` desactiva el inicio automático antes del primer import.
70
+
71
+ Fuera de un notebook puedes generar apuntes sin ejecutar el código:
72
+
73
+ ```python
74
+ import pynotas
75
+ pynotas.guardar("temperaturas = [60, 65, 70, 75]\npromedio = sum(temperaturas) / len(temperaturas)", "apuntes.html")
76
+ ```
77
+
78
+ También existe `python -m pynotas archivo.py`.
79
+
80
+ ## Alcance pedagógico
81
+
82
+ La explicación es una lectura de la sintaxis y de patrones reconocidos; no es
83
+ una validación de la corrección del programa ni de sus resultados. Las funciones
84
+ desconocidas reciben una explicación general. El objetivo es apoyar el estudio,
85
+ la práctica y las preguntas al docente, no sustituirlos ni garantizar aprendizaje.
86
+
87
+ Los gráficos PNG/JPEG ya publicados por la celda pueden incorporarse sin repetir
88
+ los cálculos. No se capturan tablas HTML ni gráficos interactivos que solo emitan
89
+ HTML. Las hojas son tamaño carta; los códigos extensos pueden ocupar varias hojas.
90
+ Los límites del motor y de captura se mantienen respecto de SURF IA 0.11.0.
91
+
92
+ ## Transición desde SURF IA
93
+
94
+ La biblioteca antes se distribuía como `surfia-pedagogia` y se importaba con
95
+ `import surfia`. El nuevo nombre es `pynotas` en ambos casos. El paquete de
96
+ compatibilidad `surfia-pedagogia==0.12.0` depende de PyNotas 0.12.0 y conserva
97
+ los imports anteriores. No contiene una segunda copia del motor.
98
+
99
+ Para actualizar una clase existente tras publicar ambos paquetes:
100
+
101
+ ```python
102
+ %pip install --upgrade "surfia-pedagogia==0.12.0"
103
+ ```
104
+
105
+ Reinicia la sesión. Los notebooks anteriores pueden seguir usando `import surfia`.
106
+ Para nuevos materiales, usa `import pynotas`.
107
+
108
+ ## Licencia
109
+
110
+ MIT. Se conserva la autoría SURF IA y la licencia original.
@@ -0,0 +1,82 @@
1
+ # PyNotas
2
+
3
+ **Tu código, explicado paso a paso.** Una biblioteca pedagógica de SURF IA.
4
+
5
+ PyNotas convierte código Python en apuntes visuales en español para acompañar el
6
+ aprendizaje. Puedes usarla con código escrito por ti o generado con ayuda de un LLM.
7
+ Identifica operaciones conocidas, explica sus pasos y parámetros y organiza las
8
+ notas en láminas descargables. Funciona mediante análisis estático y plantillas:
9
+ no necesita un LLM ni una API, y no vuelve a ejecutar tu código.
10
+
11
+ ## En Google Colab o Jupyter
12
+
13
+ ```python
14
+ %pip install pynotas
15
+ ```
16
+
17
+ En una nueva celda:
18
+
19
+ ```python
20
+ import pynotas
21
+ ```
22
+
23
+ Ejecuta después una celda de Python. La salida original permanece visible y las
24
+ notas aparecen plegadas en **Ver explicación de PyNotas**. Puedes abrirlas,
25
+ descargarlas como PDF o JPG y volver a ocultarlas. Se pliegan las notas, no la
26
+ celda completa ni sus resultados. Si actualizas una biblioteca ya importada,
27
+ reinicia la sesión antes de volver a importarla.
28
+
29
+ ## Opciones
30
+
31
+ ```python
32
+ pynotas.activar(oculto=True) # Notas plegadas al terminar cada celda.
33
+ pynotas.activar(capturar_graficos=False)
34
+ pynotas.desactivar()
35
+ pynotas.activar()
36
+ print(pynotas.__version__)
37
+ ```
38
+
39
+ No hace falta indicar un contexto para comenzar. `contexto="vibraciones"` y otras
40
+ opciones del motor se conservan. Para omitir una celda, incluye `# pynotas: omitir`.
41
+ `PYNOTAS_AUTOACTIVAR=0` desactiva el inicio automático antes del primer import.
42
+
43
+ Fuera de un notebook puedes generar apuntes sin ejecutar el código:
44
+
45
+ ```python
46
+ import pynotas
47
+ pynotas.guardar("temperaturas = [60, 65, 70, 75]\npromedio = sum(temperaturas) / len(temperaturas)", "apuntes.html")
48
+ ```
49
+
50
+ También existe `python -m pynotas archivo.py`.
51
+
52
+ ## Alcance pedagógico
53
+
54
+ La explicación es una lectura de la sintaxis y de patrones reconocidos; no es
55
+ una validación de la corrección del programa ni de sus resultados. Las funciones
56
+ desconocidas reciben una explicación general. El objetivo es apoyar el estudio,
57
+ la práctica y las preguntas al docente, no sustituirlos ni garantizar aprendizaje.
58
+
59
+ Los gráficos PNG/JPEG ya publicados por la celda pueden incorporarse sin repetir
60
+ los cálculos. No se capturan tablas HTML ni gráficos interactivos que solo emitan
61
+ HTML. Las hojas son tamaño carta; los códigos extensos pueden ocupar varias hojas.
62
+ Los límites del motor y de captura se mantienen respecto de SURF IA 0.11.0.
63
+
64
+ ## Transición desde SURF IA
65
+
66
+ La biblioteca antes se distribuía como `surfia-pedagogia` y se importaba con
67
+ `import surfia`. El nuevo nombre es `pynotas` en ambos casos. El paquete de
68
+ compatibilidad `surfia-pedagogia==0.12.0` depende de PyNotas 0.12.0 y conserva
69
+ los imports anteriores. No contiene una segunda copia del motor.
70
+
71
+ Para actualizar una clase existente tras publicar ambos paquetes:
72
+
73
+ ```python
74
+ %pip install --upgrade "surfia-pedagogia==0.12.0"
75
+ ```
76
+
77
+ Reinicia la sesión. Los notebooks anteriores pueden seguir usando `import surfia`.
78
+ Para nuevos materiales, usa `import pynotas`.
79
+
80
+ ## Licencia
81
+
82
+ MIT. Se conserva la autoría SURF IA y la licencia original.
@@ -0,0 +1,136 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "id": "24124b75",
6
+ "metadata": {},
7
+ "source": [
8
+ "# PyNotas · Del código a tus apuntes\n",
9
+ "\n",
10
+ "Una herramienta pedagógica para estudiar código propio o generado con ayuda de un LLM. En este ejemplo usamos cinco valores sintéticos para aprender a calcular y representar su promedio y desviación estándar."
11
+ ]
12
+ },
13
+ {
14
+ "cell_type": "markdown",
15
+ "id": "3b22ed0b",
16
+ "metadata": {},
17
+ "source": [
18
+ "## 1. Instalar\n",
19
+ "\n",
20
+ "Si ya habías importado la biblioteca, reinicia la sesión después de instalar. El nombre nuevo en instalación e importación es **pynotas**.\n",
21
+ "\n",
22
+ "**Esta instalación pública estará disponible después de publicar PyNotas 0.12.0 en PyPI.**"
23
+ ]
24
+ },
25
+ {
26
+ "cell_type": "code",
27
+ "execution_count": null,
28
+ "id": "3ebbe442",
29
+ "metadata": {},
30
+ "outputs": [],
31
+ "source": [
32
+ "%pip install \"pynotas==0.12.0\" numpy matplotlib"
33
+ ]
34
+ },
35
+ {
36
+ "cell_type": "markdown",
37
+ "id": "2d5d7b8d",
38
+ "metadata": {},
39
+ "source": [
40
+ "## 2. Activar\n",
41
+ "\n",
42
+ "Basta con importar la biblioteca. No necesitas una clave de API ni indicar un contexto."
43
+ ]
44
+ },
45
+ {
46
+ "cell_type": "code",
47
+ "execution_count": null,
48
+ "id": "65f3e66b",
49
+ "metadata": {},
50
+ "outputs": [],
51
+ "source": [
52
+ "import pynotas"
53
+ ]
54
+ },
55
+ {
56
+ "cell_type": "markdown",
57
+ "id": "904f9818",
58
+ "metadata": {},
59
+ "source": [
60
+ "## 3. Ejecutar y comprender\n",
61
+ "\n",
62
+ "Ejecuta esta celda una vez. Después abre **Ver explicación de PyNotas** para estudiar las operaciones, sus parámetros y el gráfico. Los datos son sintéticos. `np.std` usa aquí `ddof=0`: describe la dispersión de estos cinco valores."
63
+ ]
64
+ },
65
+ {
66
+ "cell_type": "code",
67
+ "execution_count": null,
68
+ "id": "b304695b",
69
+ "metadata": {},
70
+ "outputs": [],
71
+ "source": [
72
+ "import numpy as np\n",
73
+ "import matplotlib.pyplot as plt\n",
74
+ "\n",
75
+ "mediciones = np.array([8, 9, 10, 11, 12])\n",
76
+ "promedio = np.mean(mediciones)\n",
77
+ "desviacion = np.std(mediciones)\n",
78
+ "\n",
79
+ "plt.plot(mediciones, marker=\"o\", label=\"Mediciones\")\n",
80
+ "plt.axhline(promedio, color=\"orange\", label=\"Promedio\")\n",
81
+ "plt.title(f\"Desviación estándar: {desviacion:.2f}\")\n",
82
+ "plt.xlabel(\"Índice de la medición\")\n",
83
+ "plt.ylabel(\"Valor\")\n",
84
+ "plt.legend()\n",
85
+ "plt.show()"
86
+ ]
87
+ },
88
+ {
89
+ "cell_type": "markdown",
90
+ "id": "97fc9f1a",
91
+ "metadata": {},
92
+ "source": [
93
+ "## 4. Llevarte tus apuntes\n",
94
+ "\n",
95
+ "Dentro de la explicación, usa **Descargar PDF** o **JPG · página ...**. El PDF reúne todas las hojas carta. **Ocultar explicación de PyNotas** vuelve a plegar las notas; el código y su gráfico siguen visibles.\n",
96
+ "\n",
97
+ "Prueba cambiando el último valor de 12 a 20. Antes de ejecutar, predice qué pasará con el promedio y la desviación estándar."
98
+ ]
99
+ },
100
+ {
101
+ "cell_type": "markdown",
102
+ "id": "1d09af86",
103
+ "metadata": {},
104
+ "source": [
105
+ "## 5. Comprobar\n",
106
+ "\n",
107
+ "Con los valores originales, el promedio debe ser 10 y la desviación estándar aproximadamente 1,4142."
108
+ ]
109
+ },
110
+ {
111
+ "cell_type": "code",
112
+ "execution_count": null,
113
+ "id": "4d26cb5f",
114
+ "metadata": {},
115
+ "outputs": [],
116
+ "source": [
117
+ "# pynotas: omitir\n",
118
+ "assert np.isclose(promedio, 10)\n",
119
+ "assert np.isclose(desviacion, np.sqrt(2))\n",
120
+ "print(\"PyNotas\", pynotas.__version__, \"· resultados comprobados\")"
121
+ ]
122
+ }
123
+ ],
124
+ "metadata": {
125
+ "kernelspec": {
126
+ "display_name": "Python 3",
127
+ "language": "python",
128
+ "name": "python3"
129
+ },
130
+ "language_info": {
131
+ "name": "python"
132
+ }
133
+ },
134
+ "nbformat": 4,
135
+ "nbformat_minor": 5
136
+ }
@@ -0,0 +1,14 @@
1
+ import numpy as np
2
+ import matplotlib.pyplot as plt
3
+
4
+ mediciones = np.array([8, 9, 10, 11, 12])
5
+ promedio = np.mean(mediciones)
6
+ desviacion = np.std(mediciones)
7
+
8
+ plt.plot(mediciones, marker="o", label="Mediciones")
9
+ plt.axhline(promedio, color="orange", label="Promedio")
10
+ plt.title(f"Desviación estándar: {desviacion:.2f}")
11
+ plt.xlabel("Índice de la medición")
12
+ plt.ylabel("Valor")
13
+ plt.legend()
14
+ plt.show()
@@ -0,0 +1,36 @@
1
+ [build-system]
2
+ requires = ["setuptools>=77", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "pynotas"
7
+ version = "0.12.0"
8
+ description = "Láminas visuales en español para comprender código Python y sus conceptos"
9
+ readme = "README.md"
10
+ license = "MIT"
11
+ license-files = ["LICENSE"]
12
+ authors = [{name = "SURF IA"}]
13
+ requires-python = ">=3.10"
14
+ keywords = ["education", "python", "jupyter", "colab", "spanish"]
15
+ classifiers = [
16
+ "Development Status :: 4 - Beta",
17
+ "Intended Audience :: Education",
18
+ "Programming Language :: Python :: 3",
19
+ "Programming Language :: Python :: 3 :: Only",
20
+ "Operating System :: OS Independent",
21
+ "Topic :: Education",
22
+ ]
23
+ dependencies = ["reportlab>=4.2,<5", "pypdfium2>=4.30,<6", "pillow>=10,<13"]
24
+
25
+ [project.optional-dependencies]
26
+ notebook = ["ipython>=7.34"]
27
+ dev = ["ipython>=7.34", "build>=1.2", "twine>=6", "nbformat>=5"]
28
+
29
+ [project.scripts]
30
+ pynotas = "pynotas.cli:main"
31
+
32
+ [tool.setuptools.packages.find]
33
+ where = ["src"]
34
+
35
+ [tool.setuptools.package-data]
36
+ pynotas = ["fonts/*.ttf", "fonts/LICENSE_DEJAVU"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,42 @@
1
+ """PyNotas: código → modelo → representación → SVG/HTML."""
2
+ from .analyzer import analyze as analizar
3
+ from .selector import select as seleccionar
4
+ from .renderers import render as renderizar
5
+ from .notebook import activate as activar, deactivate as desactivar, diagnostics as diagnostico
6
+
7
+ from ._version import __version__
8
+ __all__ = ["analizar", "seleccionar", "renderizar", "generar", "mostrar", "activar", "desactivar", "diagnostico", "guardar", "explicar_archivo", "exportar"]
9
+
10
+
11
+ def generar(codigo, formato="auto", nivel="inicial",
12
+ objetivo="Comprender cómo los datos se transforman en un resultado",
13
+ contexto="auto", oculto=False, descargas=True):
14
+ """Devuelve HTML autocontenido. No ejecuta codigo."""
15
+ model = analizar(codigo, objetivo, nivel, context=contexto)
16
+ return renderizar(model, seleccionar(model, formato), collapsed=oculto, downloads=descargas)
17
+
18
+
19
+ def mostrar(codigo, **opciones):
20
+ """Muestra una lámina estática sin ejecutar codigo."""
21
+ try:
22
+ from IPython.display import HTML, display
23
+ except ImportError as error:
24
+ raise RuntimeError("mostrar() necesita IPython. Instala pynotas[notebook] o usa guardar().") from error
25
+ display(HTML(generar(codigo, **opciones)))
26
+
27
+
28
+ def load_ipython_extension(ipython):
29
+ activar(shell=ipython)
30
+
31
+
32
+ def unload_ipython_extension(ipython):
33
+ desactivar(shell=ipython)
34
+
35
+
36
+ from .files import guardar, explicar_archivo
37
+ from .exports import exportar
38
+
39
+ # Importing in a notebook starts the existing post-run observer. No user code
40
+ # is executed here; normal Python imports do not create an interactive shell.
41
+ from .notebook import auto_activate as _auto_activate
42
+ _auto_activate()
@@ -0,0 +1,2 @@
1
+ from .cli import main
2
+ raise SystemExit(main())
@@ -0,0 +1 @@
1
+ __version__ = "0.12.0"
@@ -0,0 +1,47 @@
1
+ """Reviewed analytical purpose, principle and interpretation; no runtime values."""
2
+ from dataclasses import dataclass
3
+ from .lessons import LESSONS
4
+
5
+
6
+ @dataclass(frozen=True)
7
+ class AnalysisContext:
8
+ title: str
9
+ purpose: str
10
+ principle: str
11
+ interpretation: str
12
+ formula: str = ''
13
+ source: str = ''
14
+
15
+
16
+ RMS_SOURCE='https://www.ifm.com/ca/en/shared/technologies/real-time-maintenance/technology/time-domain'
17
+
18
+
19
+ def for_model(model,representation):
20
+ keys={t.key for t in model.theories}
21
+ if 'rms' in keys:
22
+ return AnalysisContext('RMS · medir la magnitud de una señal',
23
+ 'Resumir la magnitud global de una señal real. En vibraciones ayuda a seguir cambios en el nivel de un registro.',
24
+ 'Los signos pueden cancelarse al promediar. Elevar al cuadrado evita esa cancelación; promediar resume y la raíz recupera las unidades.',
25
+ 'Un RMS mayor indica mayor magnitud en el registro. Compara iguales unidades, banda y condiciones. Por sí solo no identifica una falla.',
26
+ 'RMS = √[(x₁² + … + xₙ²) / N] x: muestras reales · N: cantidad de muestras',RMS_SOURCE)
27
+ if 'fft' in keys:
28
+ return AnalysisContext('FFT · reconocer componentes de frecuencia',
29
+ 'Pasar de cómo cambia una señal en el tiempo a qué componentes de frecuencia contiene.',
30
+ 'La transformada expresa la señal muestreada como componentes sinusoidales. La frecuencia de muestreo permite construir el eje en Hz.',
31
+ 'Un pico señala una componente destacada. Revisa escalado, ventana y muestreo antes de interpretar amplitudes; un pico no confirma una falla.',
32
+ 'Separación entre frecuencias = fs / N · Límite de Nyquist = fs / 2',
33
+ 'https://numpy.org/doc/stable/reference/routines.fft.html')
34
+ if model.case:
35
+ vibration=('En vibraciones, ' if model.context=='vibraciones' else 'Si los datos son vibraciones, ')
36
+ return AnalysisContext('Archivo MATLAB · preparar los datos para analizarlos',
37
+ 'Identificar qué variables hay y cómo están organizadas antes de elegir los datos del análisis.',
38
+ 'Un .mat guarda variables. loadmat las organiza por nombre en un diccionario; type indica su tipo y shape, sus dimensiones.',
39
+ vibration+'identifica canal, eje de muestras, unidades y frecuencia de muestreo. Cargar el archivo todavía no calcula RMS ni FFT.',
40
+ source='https://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html')
41
+ if model.theories:
42
+ theory=model.theories[0]
43
+ return AnalysisContext(theory.title,theory.idea,' → '.join(theory.steps)+'.',theory.meaning,source=theory.source)
44
+ lesson=LESSONS.get(representation.lesson_key,LESSONS['generic'])
45
+ return AnalysisContext(lesson.title,lesson.idea,
46
+ (' → '.join(s for s in (lesson.incoming,lesson.action,lesson.outgoing) if s)+'.') if lesson.incoming else 'Importar permite usar herramientas; no realiza todavía el análisis.',
47
+ lesson.meaning,source=lesson.source)