Files

65 lines
2.5 KiB
Python
Raw Permalink Normal View History

import pandas as pd
from sklearn.ensemble import IsolationForest
import joblib
import os
import pyodbc
from datetime import datetime, timedelta
print("--- INICIANDO SCRIPT DE ENTRENAMIENTO (CONEXIÓN BD) ---")
# --- 1. Configuración de Conexión y Parámetros ---
DB_SERVER = 'TECNICA3' # O el nombre de tu instancia, ej: '.\SQLEXPRESS'
DB_DATABASE = 'SistemaGestion' # El nombre de tu base de datos
# Para autenticación de Windows, usa la siguiente línea:
CONNECTION_STRING = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={DB_SERVER};DATABASE={DB_DATABASE};Trusted_Connection=yes;TrustServerCertificate=yes;'
MODEL_FILE = 'modelo_anomalias.joblib'
CONTAMINATION_RATE = 0.001 # Tasa de contaminación del 0.013% (ajustable según tus necesidades)
# --- 2. Carga de Datos desde SQL Server ---
try:
print(f"Conectando a la base de datos '{DB_DATABASE}' en '{DB_SERVER}'...")
cnxn = pyodbc.connect(CONNECTION_STRING)
# Tomamos el último año de datos para el entrenamiento
fecha_limite = datetime.now() - timedelta(days=365)
query = f"""
SELECT
Id_Canilla AS id_canilla,
Fecha AS fecha,
CantSalida AS cantidad_enviada,
CantEntrada AS cantidad_devuelta
FROM
dist_EntradasSalidasCanillas
WHERE
Fecha >= '{fecha_limite.strftime('%Y-%m-%d')}'
"""
print("Ejecutando consulta para obtener datos de entrenamiento...")
df = pd.read_sql(query, cnxn)
cnxn.close()
except Exception as e:
print(f"Error al conectar o consultar la base de datos: {e}")
exit()
if df.empty:
print("No se encontraron datos de entrenamiento en el último año. Saliendo.")
exit()
# --- 3. Preparación de Datos (sin cambios) ---
print(f"Preparando {len(df)} registros para el entrenamiento...")
df['porcentaje_devolucion'] = (df['cantidad_devuelta'] / (df['cantidad_enviada'] + 0.001)) * 100
df.fillna(0, inplace=True)
df['porcentaje_devolucion'] = df['porcentaje_devolucion'].clip(0, 100)
df['dia_semana'] = df['fecha'].dt.dayofweek
features = ['id_canilla', 'porcentaje_devolucion', 'dia_semana']
X = df[features]
# --- 4. Entrenamiento y Guardado (sin cambios) ---
print(f"Entrenando el modelo con tasa de contaminación de {CONTAMINATION_RATE}...")
model = IsolationForest(n_estimators=100, contamination=CONTAMINATION_RATE, random_state=42)
model.fit(X)
joblib.dump(model, MODEL_FILE)
print(f"--- ENTRENAMIENTO COMPLETADO. Modelo guardado en '{MODEL_FILE}' ---")