AI Engineer Python

AI Engineer Python

1. PYTHON: FUNDAMENTOS

Sintaxis de Python

Definición: La sintaxis define cómo deben escribirse las instrucciones; Python usa la indentación para delimitar bloques. Los dos puntos introducen bloques como funciones, condicionales y bucles.

Ejemplo:

if saldo >= 0:
    print("Cuenta válida")

Variables y tipos de datos

Definición: Una variable referencia un valor y su tipo determina qué operaciones admite. Tipos frecuentes son int, float, str, bool, list, tuple, dict y NoneType.

Ejemplo:

cliente_id = 1042
saldo = 2580.75
activo = True

Operadores

Definición: Los operadores realizan operaciones aritméticas, comparaciones y combinaciones lógicas; == compara valores y = asigna. and, or y not combinan condiciones booleanas.

Ejemplo:

saldo = 1200.0
es_aprobable = saldo >= 500 and cliente_activo  # cliente_activo es un bool existente

Condicionales

Definición: if, elif y else ejecutan una rama según se cumplan condiciones. Las condiciones deben evaluar a un valor verdadero o falso.

Ejemplo:

if score >= 700:
    riesgo = "bajo"
else:
    riesgo = "revisar"

Bucles

Definición: for recorre elementos de un iterable y while repite mientras una condición sea verdadera. break termina un bucle y continue salta a la siguiente iteración.

Ejemplo:

for importe in [120, 80, 250]:
    if importe > 200:
        print("Revisar operación:", importe)

Funciones

Definición: Una función encapsula instrucciones reutilizables, recibe parámetros y puede devolver un resultado con return. Facilita las pruebas y reduce duplicación.

Ejemplo:

def calcular_comision(importe, tasa=0.01):
    return round(importe * tasa, 2)
print(calcular_comision(1500))

Listas

Definición: Una lista es una colección ordenada y mutable que admite valores repetidos. Sus índices empiezan en cero.

Ejemplo:

importes = [120.0, 450.0, 80.0]
importes.append(200.0)
print(importes[0], len(importes))

Tuplas

Definición: Una tupla es una colección ordenada e inmutable, útil para representar registros que no deben modificarse. Puede contener elementos de distintos tipos.

Ejemplo:

operacion = ("TRX-901", 750.00, "MXN")
folio, importe, moneda = operacion

Diccionarios

Definición: Un diccionario almacena pares clave-valor y permite recuperar datos por una clave. Las claves deben ser hashables y únicas.

Ejemplo:

transaccion = {"id": "TRX-901", "importe": 750.0}
transaccion["estado"] = "pendiente"
print(transaccion["importe"])

Conjuntos (set)

Definición: Un set almacena elementos únicos sin garantizar un orden posicional. Se usa para eliminar duplicados y realizar operaciones como unión e intersección.

Ejemplo:

clientes = {101, 102, 101, 103}
clientes_bloqueados = {103, 104}
print(clientes - clientes_bloqueados)

Manejo de cadenas (str)

Definición: str representa texto y ofrece métodos para limpiar, dividir, buscar y transformar cadenas. Las cadenas son inmutables, por lo que los métodos devuelven nuevas cadenas.

Ejemplo:

referencia = "  pago tarjeta  ".strip().upper()
print(referencia.replace(" ", "_"))

Comprensiones de listas

Definición: Una comprensión crea una lista a partir de un iterable, opcionalmente filtrando o transformando elementos. Conviene mantenerla legible y evitar efectos secundarios.

Ejemplo:

importes = [120, -5, 300, 0]
validos = [x for x in importes if x > 0]

Manejo de excepciones (try/except)

Definición: try/except permite manejar errores esperados sin detener abruptamente el programa. Conviene capturar excepciones específicas y no ocultar fallos con un except genérico.

Ejemplo:

try:
    importe = float("1250.50")
except ValueError:
    importe = None

Lectura y escritura de archivos

Definición: open permite leer o escribir archivos; with cierra el recurso automáticamente. Especificar la codificación evita problemas con caracteres como acentos.

Ejemplo:

from pathlib import Path
Path("salida.txt").write_text("Lote procesado\n", encoding="utf-8")
texto = Path("salida.txt").read_text(encoding="utf-8")

Módulos e importaciones

Definición: Un módulo es un archivo Python reutilizable; import permite usar sus funciones, clases y constantes. Los entornos virtuales ayudan a aislar dependencias del proyecto.

Ejemplo:

from decimal import Decimal
importe = Decimal("125.40")
print(importe.quantize(Decimal("0.01")))

Programación orientada a objetos (POO)

Definición: La POO organiza datos y comportamiento en clases e instancias; __init__ inicializa el objeto y self se refiere a la instancia. La encapsulación ayuda a mantener reglas de negocio coherentes.

Ejemplo:

class Cuenta:
    def __init__(self, saldo): self.saldo = saldo
    def depositar(self, importe):
        if importe > 0: self.saldo += importe
cuenta = Cuenta(1000); cuenta.depositar(250)

Depuración de código

Definición: Depurar consiste en localizar y corregir la causa de un defecto mediante reproducción, inspección del estado y verificación de la solución. Un depurador permite usar puntos de interrupción y examinar variables paso a paso.

Ejemplo:

import pdb
saldo = 1200
pdb.set_trace()  # inspeccionar saldo y continuar con n/c
saldo -= 200

Jupyter Notebook

Definición: Jupyter permite ejecutar código por celdas y combinar código, resultados y notas, útil para análisis exploratorio reproducible. El estado permanece en memoria entre celdas, por lo que el orden de ejecución puede afectar los resultados.

Ejemplo:

# En una celda de Notebook
import pandas as pd
df = pd.DataFrame({"importe": [100, 250, 80]})
df["importe"].mean()

2. MANIPULACIÓN Y ANÁLISIS DE DATOS

NumPy

Definición: NumPy proporciona arreglos n-dimensionales y operaciones numéricas vectorizadas eficientes. Los arreglos suelen requerir elementos de tipo homogéneo y son base de muchas bibliotecas de datos y ML.

Ejemplo:

import numpy as np
importes = np.array([100.0, 250.0, 80.0])
print(importes.mean(), importes.max())

Pandas

Definición: Pandas permite cargar, transformar y analizar datos tabulares mediante operaciones por columnas, filtros y agregaciones. Es habitual para preparar datos antes de entrenar un modelo.

Ejemplo:

import pandas as pd
df = pd.DataFrame({"cliente": [1, 2], "saldo": [500, 900]})
print(df["saldo"].mean())

DataFrames y Series

Definición: Un DataFrame es una tabla bidimensional con etiquetas en filas y columnas; una Series es una estructura unidimensional etiquetada. Seleccionar una columna normalmente devuelve una Series.

Ejemplo:

df = pd.DataFrame({"cliente": [1, 2], "saldo": [500, 900]})
saldos = df["saldo"]
print(type(df).__name__, type(saldos).__name__)

Limpieza de datos

Definición: Limpiar datos consiste en corregir formatos inválidos, inconsistencias, valores imposibles y registros no utilizables según reglas documentadas. Las reglas deben preservar trazabilidad y no alterar silenciosamente importes financieros.

Ejemplo:

df["importe"] = pd.to_numeric(df["importe"], errors="coerce")
df = df.dropna(subset=["id_transaccion"])  # conservar la regla de importes del negocio

Valores nulos

Definición: Un valor nulo indica que un dato falta o no está disponible y no equivale necesariamente a cero. Puede detectarse con isna() y tratarse según la causa y el uso del campo.

Ejemplo:

mascara = df["ingreso_mensual"].isna()
print(df[mascara])
df["ingreso_mensual"] = df["ingreso_mensual"].fillna(df["ingreso_mensual"].median())

Duplicados

Definición: Los duplicados son filas repetidas total o parcialmente según una clave de negocio. Antes de eliminarlos, debe definirse si representan errores o eventos legítimos, por ejemplo dos pagos del mismo importe.

Ejemplo:

df = df.drop_duplicates(subset=["id_transaccion"], keep="last")

Filtrado de datos

Definición: Filtrar selecciona filas que cumplen condiciones y permite aislar subconjuntos para análisis o modelado. En Pandas, las condiciones booleanas se combinan con & o | entre paréntesis.

Ejemplo:

fraude_candidatos = df[(df["importe"] > 10000) & (df["pais"] != "MX")]

Transformación de datos

Definición: Transformar datos cambia formatos o crea variables derivadas para que sean consistentes y útiles para el análisis. La transformación debe basarse en reglas reproducibles y evitar usar información futura.

Ejemplo:

df["fecha"] = pd.to_datetime(df["fecha"], errors="coerce")
df["importe_mxn"] = df["importe"] * df["tipo_cambio"]

Análisis exploratorio de datos (EDA)

Definición: El EDA examina estructura, distribuciones, valores nulos, anomalías y relaciones antes de modelar. Sus hallazgos orientan la limpieza y ayudan a detectar sesgos o errores de captura.

Ejemplo:

print(df.shape, df.dtypes)
print(df.isna().mean().sort_values(ascending=False).head())
print(df.describe(include="all"))

Matplotlib

Definición: Matplotlib crea visualizaciones para inspeccionar distribuciones, tendencias y diferencias entre grupos. En análisis bancario puede ayudar a encontrar importes atípicos o cambios temporales.

Ejemplo:

import matplotlib.pyplot as plt
df["importe"].plot(kind="hist", bins=20)
plt.xlabel("Importe de transacción"); plt.tight_layout(); plt.show()

Archivos CSV

Definición: CSV representa datos tabulares en texto, normalmente separados por comas o punto y coma. Hay que validar codificación, delimitador, tipos y encabezados al importarlo.

Ejemplo:

df = pd.read_csv("transacciones.csv", encoding="utf-8")
df.to_csv("transacciones_limpias.csv", index=False)

Archivos JSON

Definición: JSON representa datos estructurados mediante objetos, arreglos y valores primitivos y se usa ampliamente en APIs. En Python, json.load(s) convierte JSON en estructuras nativas.

Ejemplo:

import json
registro = json.loads('{"id":"TRX-9","importe":450.0}')
print(registro["importe"])

3. SQL Y BASES DE DATOS

Fundamentos de bases de datos relacionales

Definición: Una base relacional organiza la información en tablas relacionadas mediante claves y restricciones. SQL permite consultar y modificar esos datos manteniendo reglas de integridad.

Ejemplo:

-- Tablas: clientes(id_cliente PRIMARY KEY), cuentas(id_cuenta PRIMARY KEY, id_cliente FOREIGN KEY)
SELECT id_cuenta, id_cliente
FROM cuentas;

SQL

Definición: SQL es el lenguaje declarativo usado para definir, consultar y modificar datos en bases relacionales. Se expresa qué resultado se necesita, mientras el motor decide cómo ejecutarlo.

Ejemplo:

SELECT id_cliente, saldo
FROM cuentas
WHERE saldo < 0;

SELECT

Definición: SELECT especifica las columnas o expresiones que devuelve una consulta; WHERE filtra filas antes de la agregación. Evitar SELECT * en producción reduce transferencia y acoplamiento a cambios de esquema.

Ejemplo:

SELECT id_transaccion, importe, fecha
FROM transacciones
WHERE estado = 'rechazada';

WHERE

Definición: WHERE restringe filas con condiciones sobre columnas, rangos, patrones o pertenencia a conjuntos. Los valores nulos se evalúan con IS NULL o IS NOT NULL, no con = NULL.

Ejemplo:

SELECT id_cliente, ingreso
FROM solicitudes
WHERE ingreso >= 15000 AND ingreso IS NOT NULL;

ORDER BY

Definición: ORDER BY ordena el resultado por una o varias columnas en orden ascendente (ASC) o descendente (DESC). Sin ORDER BY, SQL no garantiza el orden de las filas.

Ejemplo:

SELECT id_transaccion, importe
FROM transacciones
ORDER BY importe DESC
LIMIT 10;

GROUP BY

Definición: GROUP BY agrupa filas que comparten valores para calcular resultados por grupo. Las columnas seleccionadas que no estén agregadas normalmente deben incluirse en el agrupamiento.

Ejemplo:

SELECT estado, COUNT(*) AS operaciones
FROM transacciones
GROUP BY estado;

Funciones de agregación

Definición: COUNT, SUM, AVG, MIN y MAX calculan resúmenes de varias filas; la mayoría ignora valores NULL, mientras COUNT(*) cuenta filas. HAVING filtra grupos después de la agregación.

Ejemplo:

SELECT id_cliente, SUM(importe) AS gasto_total
FROM transacciones
GROUP BY id_cliente
HAVING SUM(importe) > 50000;

JOIN

Definición: JOIN combina filas de tablas según una condición; INNER JOIN conserva coincidencias y LEFT JOIN conserva todas las filas de la tabla izquierda. Una relación de uno-a-muchos puede multiplicar filas y afectar agregaciones.

Ejemplo:

SELECT c.id_cliente, t.importe
FROM clientes c
JOIN transacciones t ON t.id_cliente = c.id_cliente;

Claves primarias y foráneas

Definición: Una clave primaria identifica de forma única cada fila y no admite NULL; una clave foránea referencia una clave de otra tabla y ayuda a mantener integridad referencial. La restricción exacta depende del esquema y del motor SQL.

Ejemplo:

CREATE TABLE clientes (
  id_cliente INT PRIMARY KEY,
  nombre VARCHAR(100) NOT NULL
);

CRUD

Definición: CRUD significa crear, leer, actualizar y eliminar registros mediante INSERT, SELECT, UPDATE y DELETE. En sistemas bancarios, las escrituras deben aplicar permisos, validaciones y transacciones según las reglas del negocio.

Ejemplo:

INSERT INTO alertas (id_alerta, estado) VALUES (7, 'nueva');
SELECT estado FROM alertas WHERE id_alerta = 7;
UPDATE alertas SET estado = 'revisada' WHERE id_alerta = 7;
DELETE FROM alertas WHERE id_alerta = 7;

4. IA Y MACHINE LEARNING

Inteligencia Artificial (IA)

Definición: La IA comprende técnicas para que sistemas realicen tareas como percepción, razonamiento, generación o toma de decisiones. No toda IA aprende de datos; algunos sistemas siguen reglas explícitas.

Ejemplo:

def bloquear_por_regla(pais, importe):
    return pais in {"PAIS_SANCIONADO"} and importe > 0

Machine Learning (ML)

Definición: ML es una rama de IA donde los algoritmos aprenden patrones a partir de datos para producir predicciones o decisiones. Su desempeño depende de la representatividad, calidad y disponibilidad de los datos.

Ejemplo:

from sklearn.ensemble import RandomForestClassifier
modelo = RandomForestClassifier(random_state=42)
modelo.fit(X_train, y_train)

Deep Learning (DL)

Definición: DL es una subárea de ML que utiliza redes neuronales con múltiples capas para aprender representaciones complejas. Es frecuente en texto, imagen, voz y documentos, y suele requerir más datos y cómputo que modelos clásicos.

Ejemplo:

from sklearn.neural_network import MLPClassifier
modelo = MLPClassifier(hidden_layer_sizes=(32, 16), max_iter=500, random_state=42)
modelo.fit(X_train, y_train)

Aprendizaje supervisado

Definición: El aprendizaje supervisado entrena con ejemplos que incluyen características y una etiqueta objetivo conocida. Se usa, por ejemplo, para estimar incumplimiento o clasificar transacciones etiquetadas.

Ejemplo:

X = solicitudes[["ingreso", "antiguedad_meses"]]
y = solicitudes["incumplio"]  # etiqueta histórica: 0 o 1

Aprendizaje no supervisado

Definición: El aprendizaje no supervisado busca estructura en datos sin una etiqueta objetivo proporcionada. Puede usarse para segmentar clientes o detectar observaciones inusuales, pero los resultados requieren interpretación y validación de negocio.

Ejemplo:

from sklearn.cluster import KMeans
etiquetas = KMeans(n_clusters=3, random_state=42, n_init="auto").fit_predict(X_scaled)

Clasificación

Definición: La clasificación predice una categoría discreta, como fraude/no fraude o documento válido/inválido. En problemas desbalanceados, la exactitud por sí sola puede ocultar un mal desempeño en la clase minoritaria.

Ejemplo:

from sklearn.linear_model import LogisticRegression
clasificador = LogisticRegression(max_iter=1000).fit(X_train, y_train)
predicciones = clasificador.predict(X_test)

Regresión

Definición: La regresión estima un valor numérico continuo, como pérdida esperada o monto de reclamación. Se evalúa con métricas de error y debe compararse con una línea base sencilla.

Ejemplo:

from sklearn.linear_model import LinearRegression
regresor = LinearRegression().fit(X_train, y_train)
montos_estimados = regresor.predict(X_test)

Entrenamiento, validación y prueba

Definición: Entrenamiento ajusta parámetros; validación sirve para seleccionar modelos e hiperparámetros; prueba estima el desempeño final en datos no usados durante esas decisiones. Dividir antes de ajustar y evitar fugas de información produce métricas más fiables.

Ejemplo:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.25, stratify=y_train, random_state=42)  # 60/20/20

Preprocesamiento de datos

Definición: El preprocesamiento convierte datos crudos en características utilizables por un modelo, por ejemplo imputando nulos y escalando variables. Los transformadores se ajustan solo con el conjunto de entrenamiento para prevenir fuga de información.

Ejemplo:

from sklearn.preprocessing import StandardScaler
escalador = StandardScaler().fit(X_train)
X_train_scaled = escalador.transform(X_train)
X_test_scaled = escalador.transform(X_test)

Selección de características

Definición: La selección de características reduce o elige variables relevantes para mejorar generalización, eficiencia o interpretabilidad. La selección debe realizarse dentro del proceso de entrenamiento, no mirando el conjunto de prueba.

Ejemplo:

from sklearn.feature_selection import SelectKBest, f_classif
selector = SelectKBest(f_classif, k=5).fit(X_train, y_train)
X_train_sel = selector.transform(X_train)

Entrenamiento de modelos

Definición: Entrenar consiste en ajustar los parámetros del algoritmo a partir de ejemplos y una función objetivo. Se separa del uso posterior del modelo para que la inferencia pueda operar sobre datos nuevos.

Ejemplo:

from sklearn.ensemble import RandomForestClassifier
modelo = RandomForestClassifier(n_estimators=100, random_state=42)
modelo.fit(X_train, y_train)

Predicción e inferencia

Definición: La predicción es la salida estimada para una entrada; inferencia es la ejecución del modelo ya entrenado sobre datos nuevos. En producción deben mantenerse iguales las transformaciones y el orden de características usados durante entrenamiento.

Ejemplo:

prob_fraude = modelo.predict_proba(X_nueva)[:, 1]
alerta = prob_fraude >= 0.80

Sobreajuste (overfitting)

Definición: Ocurre cuando el modelo aprende demasiado los detalles del entrenamiento, incluido ruido, y generaliza mal a datos nuevos. Se detecta comparando desempeño de entrenamiento y validación; puede mitigarse con regularización, más datos o modelos menos complejos.

Ejemplo:

# Una brecha grande entre ambas métricas sugiere sobreajuste
print(modelo.score(X_train, y_train), modelo.score(X_val, y_val))

Subajuste (underfitting)

Definición: Ocurre cuando el modelo no captura suficientemente los patrones y rinde mal tanto en entrenamiento como en validación. Puede mitigarse con mejores características, un modelo más expresivo o un ajuste adecuado.

Ejemplo:

from sklearn.linear_model import LogisticRegression
modelo_simple = LogisticRegression(max_iter=1000).fit(X_train, y_train)
print(modelo_simple.score(X_train, y_train), modelo_simple.score(X_val, y_val))

Métricas de evaluación

Definición: En clasificación se usan precision, recall, F1, matriz de confusión y ROC-AUC; en regresión, MAE, MSE o RMSE. La métrica adecuada depende del costo de falsos positivos y falsos negativos del caso bancario.

Ejemplo:

from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test, predicciones))
print(classification_report(y_test, predicciones, zero_division=0))

scikit-learn

Definición: scikit-learn ofrece API consistentes para preprocesamiento, división de datos, entrenamiento, selección de modelos y evaluación. fit, transform, predict y predict_proba son métodos frecuentes del flujo de trabajo.

Ejemplo:

from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
pipeline = make_pipeline(SimpleImputer(strategy="median"), RandomForestClassifier(random_state=42))
pipeline.fit(X_train, y_train)

Regresión lineal

Definición: La regresión lineal estima una variable numérica como combinación lineal de características y parámetros. Es interpretable como línea base, pero sus supuestos y errores deben revisarse para el conjunto concreto.

Ejemplo:

from sklearn.linear_model import LinearRegression
modelo = LinearRegression().fit(X_train, y_train)
print(modelo.predict(X_test[:2]))

Regresión logística

Definición: La regresión logística modela la probabilidad de una clase, habitualmente mediante la función logística, y luego aplica un umbral para clasificar. Aunque se llama regresión, se usa principalmente para clasificación.

Ejemplo:

from sklearn.linear_model import LogisticRegression
modelo = LogisticRegression(max_iter=1000).fit(X_train, y_train)
probabilidades = modelo.predict_proba(X_test)[:, 1]

Árboles de decisión

Definición: Un árbol divide los datos mediante reglas sobre características y permite inspeccionar rutas de decisión. Puede sobreajustarse si crece demasiado; profundidad mínima, tamaño de hoja y poda ayudan a controlarlo.

Ejemplo:

from sklearn.tree import DecisionTreeClassifier
modelo = DecisionTreeClassifier(max_depth=4, min_samples_leaf=20, random_state=42)
modelo.fit(X_train, y_train)

5. NLP: PROCESAMIENTO DEL LENGUAJE NATURAL

Fundamentos de NLP

Definición: NLP reúne técnicas para procesar y analizar lenguaje humano en texto o voz. En banca puede clasificar motivos de reclamación, extraer entidades o enrutar solicitudes.

Ejemplo:

from sklearn.feature_extraction.text import TfidfVectorizer
textos = ["cargo no reconocido", "solicito estado de cuenta"]
X_texto = TfidfVectorizer().fit_transform(textos)

Limpieza de texto

Definición: La limpieza elimina o corrige elementos irrelevantes según la tarea, como espacios sobrantes, caracteres de control o formatos inconsistentes. No deben quitarse símbolos como decimales, signos o identificadores si contienen información relevante.

Ejemplo:

texto = "  CARGO   NO reconocido\n"
limpio = " ".join(texto.strip().lower().split())

Tokenización

Definición: Tokenizar divide el texto en unidades, como palabras, subpalabras o signos de puntuación. La estrategia de tokenización afecta cómo el modelo representa cantidades, fechas y términos financieros.

Ejemplo:

from nltk.tokenize import wordpunct_tokenize
tokens = wordpunct_tokenize("Cargo de $1,250.50 rechazado")

Stopwords

Definición: Las stopwords son palabras frecuentes que algunas tareas pueden ignorar por aportar poca señal discriminativa. No deben eliminarse automáticamente si afectan el sentido, por ejemplo negaciones como “no”.

Ejemplo:

texto = "no autorizo el cargo"
stopwords_es = {"el", "la", "de", "un", "una"}
tokens = [t for t in texto.split() if t not in stopwords_es]

Stemming

Definición: El stemming reduce una palabra mediante reglas heurísticas y puede producir una raíz que no sea una palabra válida. Es rápido, pero menos lingüísticamente preciso que la lematización.

Ejemplo:

from nltk.stem import SnowballStemmer
stemmer = SnowballStemmer("spanish")
print(stemmer.stem("transferencias"))

Lematización

Definición: La lematización convierte una palabra a su lema lingüístico usando información léxica y, según la herramienta, gramatical. Suele preservar formas más interpretables que el stemming, aunque puede requerir modelos de idioma.

Ejemplo:

import spacy
nlp = spacy.load("es_core_news_sm")
doc = nlp("Los clientes reclamaron cargos duplicados")
print([token.lemma_ for token in doc])

Normalización de texto

Definición: La normalización unifica representaciones equivalentes, por ejemplo minúsculas, espacios, Unicode o formatos de fechas. Debe ajustarse a la tarea: normalizar identificadores o cifras de forma incorrecta puede destruir información.

Ejemplo:

import unicodedata
texto = unicodedata.normalize("NFKC", "  TRANSFERENCIA  ").strip().casefold()

Extracción de información

Definición: La extracción de información identifica campos estructurados en texto libre, como fechas, importes, cuentas o nombres de entidades. Los valores extraídos deben validarse contra reglas del dominio y conservar su procedencia.

Ejemplo:

import re
texto = "Importe reclamado: MXN 1250.50"
importe = re.search(r"MXN\s+(\d+(?:\.\d{2})?)", texto).group(1)

Expresiones regulares (Regex)

Definición: Regex define patrones para localizar o validar cadenas según una sintaxis de búsqueda. Es útil para formatos conocidos, pero una coincidencia de patrón no garantiza que el dato sea correcto semánticamente.

Ejemplo:

import re
folio = re.fullmatch(r"TRX-\d{6}", "TRX-123456")
print(folio is not None)

NLTK

Definición: NLTK es una biblioteca de Python para procesamiento lingüístico y recursos como tokenizadores, corpus y stemmers. Resulta útil para tareas educativas o pipelines clásicos de texto.

Ejemplo:

from nltk.tokenize import word_tokenize
# Requiere el recurso punkt apropiado instalado para la versión de NLTK
tokens = word_tokenize("Pago de tarjeta rechazado", language="spanish")

spaCy

Definición: spaCy es una biblioteca de NLP orientada a pipelines eficientes con tokenización, análisis gramatical y reconocimiento de entidades nombradas. El idioma y el modelo instalado deben corresponder al texto que se procesa.

Ejemplo:

import spacy
nlp = spacy.load("es_core_news_sm")
doc = nlp("Banco del Centro reportó 25 reclamaciones")
print([(e.text, e.label_) for e in doc.ents])

6. OCR Y PROCESAMIENTO DE DOCUMENTOS

OCR (reconocimiento óptico de caracteres)

Definición: OCR convierte texto presente en imágenes o páginas escaneadas en texto digital, y puede producir errores por baja resolución, inclinación o calidad del documento. NLP interpreta el texto; OCR lo reconoce visualmente, por lo que son etapas distintas.

Ejemplo:

# La imagen debe estar disponible en disco y contener texto legible
import pytesseract
from PIL import Image
texto = pytesseract.image_to_string(Image.open("estado_cuenta.png"), lang="spa")

Tesseract OCR

Definición: Tesseract es un motor OCR que reconoce caracteres en imágenes y puede usarse desde Python con pytesseract. Requiere tener instalado el ejecutable Tesseract y los datos de idioma correspondientes.

Ejemplo:

import pytesseract
texto = pytesseract.image_to_string("factura.png", lang="spa")
print(texto[:300])

Extracción de texto de documentos

Definición: La extracción obtiene texto y campos a partir de documentos digitales o escaneados, combinando bibliotecas de PDF, OCR, regex y validaciones. Un campo importante debe conservar página, confianza o evidencia de origen cuando sea posible.

Ejemplo:

import re
texto = "Cuenta: 0012345678\nTotal MXN 890.00"
cuenta = re.search(r"Cuenta:\s*(\d+)", texto).group(1)

Procesamiento de PDF

Definición: Un PDF puede contener texto digital, imágenes escaneadas o ambos; la estrategia depende de su contenido. Extraer texto directamente es preferible cuando existe una capa textual y se usa OCR cuando solo hay imágenes.

Ejemplo:

from pypdf import PdfReader
lector = PdfReader("estado_cuenta.pdf")
texto = "\n".join(p.extract_text() or "" for p in lector.pages)

PyPDF2

Definición: PyPDF2 es una biblioteca Python para leer y manipular PDFs, incluyendo extracción de texto cuando el documento contiene una capa textual. No es un motor OCR, por lo que las páginas escaneadas pueden necesitar OCR aparte.

Ejemplo:

from PyPDF2 import PdfReader
lector = PdfReader("contrato.pdf")
texto = "\n".join(p.extract_text() or "" for p in lector.pages)

Validación de datos extraídos

Definición: Validar datos extraídos comprueba formato, rangos, consistencia y reglas del negocio antes de aceptarlos. En documentos financieros conviene contrastar totales, moneda, fechas y cuentas; un valor OCR plausible puede seguir siendo incorrecto.

Ejemplo:

from decimal import Decimal
importe = Decimal("890.00")
assert importe >= 0 and importe.as_tuple().exponent == -2

7. APIs REST Y PRUEBAS

Fundamentos de APIs REST

Definición: Una API REST expone recursos mediante HTTP y suele intercambiar datos en JSON; los recursos se identifican por URI y los métodos expresan la operación solicitada. La autenticación, autorización, validación y registro seguro son esenciales en un entorno bancario.

Ejemplo:

import requests
respuesta = requests.get("https://api.ejemplo.test/clientes/1042", timeout=10)
respuesta.raise_for_status()
cliente = respuesta.json()

Métodos HTTP

Definición: GET consulta; POST suele crear o ejecutar una operación; PUT reemplaza un recurso; PATCH modifica parcialmente; DELETE elimina. Idempotencia y efectos exactos dependen del método y del contrato de la API.

Ejemplo:

import requests
requests.get("https://api.ejemplo.test/clientes/1042", timeout=10)
requests.post("https://api.ejemplo.test/alertas", json={"cliente_id": 1042}, timeout=10)

Códigos de estado HTTP

Definición: Los códigos indican el resultado de una petición: 2xx éxito, 3xx redirección, 4xx problema de solicitud o permisos y 5xx fallo del servidor. Por ejemplo, 200 es OK, 201 creado, 400 solicitud inválida, 401 no autenticado, 403 prohibido, 404 no encontrado y 500 error interno.

Ejemplo:

if respuesta.status_code == 200:
    datos = respuesta.json()
elif respuesta.status_code == 404:
    datos = None

JSON en APIs

Definición: JSON representa objetos y arreglos de datos y es un formato habitual de solicitud y respuesta en APIs. Validar presencia, tipo y rango de cada campo evita aceptar cargas malformadas o inconsistentes.

Ejemplo:

import requests
payload = {"cuenta": "001234", "importe": 125.50, "moneda": "MXN"}
respuesta = requests.post("https://api.ejemplo.test/transacciones", json=payload, timeout=10)

Pruebas unitarias

Definición: Una prueba unitaria verifica una unidad pequeña de código de forma aislada, normalmente con entradas y resultados esperados. Debe probar casos normales, límites y errores sin depender de servicios externos reales.

Ejemplo:

def es_importe_valido(x): return x > 0

def test_es_importe_valido():
    assert es_importe_valido(10)
    assert not es_importe_valido(0)

Pruebas de integración

Definición: Una prueba de integración comprueba que varios componentes colaboran correctamente, por ejemplo API, base de datos y procesamiento de datos. A diferencia de la prueba unitaria, verifica contratos e interacciones entre componentes.

Ejemplo:

def test_api_devuelve_alerta(client):
    r = client.get("/alertas/7")
    assert r.status_code == 200 and r.json["id"] == 7

Depuración de errores en APIs y pruebas

Definición: Depurar implica reproducir el fallo, inspeccionar logs y entradas, aislar la causa y verificar una corrección con pruebas. No deben registrarse contraseñas, tokens ni datos personales completos en logs.

Ejemplo:

import logging, requests
logger = logging.getLogger(__name__)
try:
    respuesta.raise_for_status()
except requests.RequestException as error:
    logger.error("Fallo de API: %s", type(error).__name__)
    raise

8. GIT Y GITHUB

Control de versiones

Definición: El control de versiones registra cambios a lo largo del tiempo y permite comparar, recuperar y colaborar sobre el código. Git es un sistema distribuido: cada clon conserva el historial del repositorio.

Ejemplo:

git status
git log --oneline -5

git clone

Definición: git clone crea una copia local de un repositorio remoto con su historial. Se utiliza normalmente al comenzar a trabajar en un proyecto existente.

Ejemplo:

git clone https://github.com/organizacion/proyecto.git

git add

Definición: git add prepara cambios para el siguiente commit en el área de staging. Conviene revisar exactamente qué archivos se agregan, especialmente si pueden contener credenciales o datos sensibles.

Ejemplo:

git add src/modelo.py tests/test_modelo.py
git status

git commit

Definición: git commit guarda en el historial una instantánea de los cambios staged con un mensaje descriptivo. Un commit local todavía no publica los cambios al repositorio remoto.

Ejemplo:

git commit -m "Valida importes extraídos de estados de cuenta"

git push

Definición: git push publica commits locales en una rama remota. Puede ser rechazado si el historial remoto avanzó o si no se tienen permisos.

Ejemplo:

git push origin feature/validacion-documentos

git pull

Definición: git pull incorpora cambios del remoto a la rama actual, normalmente mediante fetch y merge o rebase según la configuración. Revisar el estado de trabajo antes de ejecutarlo ayuda a evitar conflictos inesperados.

Ejemplo:

git pull origin main

Ramas (branches)

Definición: Una rama es una referencia móvil a una línea de desarrollo que permite trabajar en cambios aislados. Los nombres descriptivos facilitan revisar funciones, correcciones y experimentos.

Ejemplo:

git switch -c feature/clasificador-reclamaciones
git switch main

Resolución de conflictos

Definición: Un conflicto ocurre cuando Git no puede combinar cambios automáticamente; se deben revisar los bloques conflictivos y conservar la lógica correcta de ambas modificaciones. Después se marcan los archivos resueltos y se completa el merge o rebase.

Ejemplo:

git status
# Editar archivos con marcadores <<<<<<<, =======, >>>>>>>
git add archivo_resuelto.py
git commit

Pull requests

Definición: Un pull request propone integrar cambios de una rama en otra para revisión, discusión y ejecución de controles automáticos. La revisión debe valorar corrección, pruebas, seguridad, calidad de datos y efectos sobre el modelo.

Ejemplo:

git push origin feature/clasificador-reclamaciones
# Abrir un Pull Request en GitHub y solicitar revisión

9. DEVOPS Y METODOLOGÍAS ÁGILES

DevOps

Definición: DevOps integra prácticas de desarrollo y operación para entregar software de forma frecuente, segura, monitorizable y reproducible. Incluye automatización de pruebas, despliegue, observabilidad y gestión de configuración.

Ejemplo:

# Ejecutar pruebas de forma repetible en el entorno del proyecto
python -m pytest

Integración continua (CI)

Definición: CI ejecuta automáticamente controles sobre cada cambio integrado, como pruebas, análisis estático y validaciones. Busca detectar errores pronto y mantener la rama compartida en un estado verificable.

Ejemplo:

# Comando típico en un pipeline CI
python -m pip install -r requirements.txt
python -m pytest

Entrega continua (CD)

Definición: La entrega continua automatiza el empaquetado y validación para mantener una versión lista para desplegar; el despliegue continuo va más allá y publica automáticamente cambios que superan los controles. En banca, aprobaciones y segregación de funciones dependen de los controles internos.

Ejemplo:

# Pasos conceptuales del pipeline
python -m pytest
python -m build

Scrum

Definición: Scrum es un marco ágil de trabajo iterativo que organiza el desarrollo en Sprints y define responsabilidades, eventos y artefactos. Busca entregar incrementos de valor e inspeccionar el progreso de manera frecuente.

Ejemplo:

# Ejemplo de Product Backlog
"Como analista, quiero extraer el total de una factura para validar reclamaciones."

Sprints

Definición: Un Sprint es un periodo fijo, de un mes o menos, durante el cual el equipo crea un incremento útil y potencialmente liberable. El objetivo del Sprint da foco al trabajo y evita cambios que lo pongan en riesgo.

Ejemplo:

# Objetivo de Sprint
"Clasificar reclamaciones por motivo y medir F1 en un conjunto de validación."

Daily Scrum

Definición: El Daily Scrum es un evento diario de 15 minutos para que los Developers inspeccionen el avance hacia el objetivo del Sprint y adapten el plan. No es un reporte de estatus al gerente ni una sesión para resolver todos los problemas.

Ejemplo:

# Actualización breve del equipo
"Ayer validé OCR; hoy revisaré importes; bloqueo: PDF con texto ilegible."

Sprint Planning

Definición: Sprint Planning define por qué el Sprint es valioso, qué trabajo puede realizarse y cómo se abordará. El equipo selecciona trabajo según prioridad, capacidad y definición de terminado.

Ejemplo:

# Criterio de aceptación de una historia
"El extractor devuelve importe y moneda; los campos inválidos generan error auditable."

10. RECORDATORIOS TÉCNICOS CLAVE PARA BANCA

Fuga de información (data leakage)

Definición: Hay fuga cuando el entrenamiento usa información que no estaría disponible al momento real de la predicción o que proviene indirectamente del conjunto de prueba. Genera métricas artificialmente altas y debe prevenirse en la división temporal, las transformaciones y la selección de variables.

Ejemplo:

# Ajustar transformaciones con entrenamiento, no con todos los datos
imputer.fit(X_train)
X_train_ok = imputer.transform(X_train)
X_test_ok = imputer.transform(X_test)

Desbalance de clases

Definición: Existe cuando una clase, por ejemplo fraude, aparece mucho menos que la clase mayoritaria. Evalúe precision, recall, F1, PR-AUC y umbrales según el coste de errores, en vez de confiar solo en accuracy.

Ejemplo:

from sklearn.metrics import average_precision_score
score = average_precision_score(y_test, modelo.predict_proba(X_test)[:, 1])

Trazabilidad y reproducibilidad

Definición: La trazabilidad conecta datos de entrada, transformaciones, versión del código y del modelo con cada resultado; la reproducibilidad permite repetir el proceso con las mismas condiciones. En sistemas bancarios favorece auditoría, diagnóstico y control de cambios.

Ejemplo:

import sklearn
print("sklearn", sklearn.__version__, "filas", len(X_train))

Seguridad de datos sensibles

Definición: Los datos personales, credenciales e información financiera deben procesarse con acceso mínimo, almacenamiento seguro y registro controlado. En ejemplos, pruebas y logs deben usarse datos ficticios o enmascarados y nunca secretos reales.

Ejemplo:

import os
api_token = os.environ["API_TOKEN"]  # no escribir el token directamente en el código

© Arturo Juárez Monroy