import pandas as pd from sklearn.ensemble import IsolationForest import joblib import pyodbc from datetime import datetime, timedelta print("--- INICIANDO SCRIPT DE ENTRENAMIENTO (BOBINAS DAÑADAS) ---") # --- 1. Configuración --- DB_SERVER = 'TECNICA3' DB_DATABASE = 'SistemaGestion' CONNECTION_STRING = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={DB_SERVER};DATABASE={DB_DATABASE};Trusted_Connection=yes;TrustServerCertificate=yes;' MODEL_FILE = 'modelo_danadas.joblib' CONTAMINATION_RATE = 0.02 # Un 2% de los días podrían tener una cantidad anómala de bobinas dañadas (ajustable) # --- 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) fecha_limite = datetime.now() - timedelta(days=365) # << CAMBIO IMPORTANTE: Nueva consulta para contar bobinas marcadas como "Dañada" por día y planta >> # Asumimos que el estado "Dañada" tiene Id_EstadoBobina = 3 y el historial lo registra query = f""" SELECT CAST(h.FechaMod AS DATE) as fecha, DATEPART(weekday, h.FechaMod) as dia_semana, h.Id_Planta as id_planta, COUNT(DISTINCT h.Id_Bobina) as cantidad_danadas FROM bob_StockBobinas_H h WHERE h.Id_EstadoBobina = 3 -- Asumiendo que 3 es el ID del estado 'Dañada' AND h.TipoMod = 'Estado: Dañada' -- Filtra por el evento específico del cambio de estado AND h.FechaMod >= '{fecha_limite.strftime('%Y-%m-%d')}' GROUP BY CAST(h.FechaMod AS DATE), DATEPART(weekday, h.FechaMod), h.Id_Planta """ print("Ejecutando consulta para obtener historial de bobinas dañadas...") 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 de bobinas dañadas en el último año. Saliendo.") exit() # --- 3. Preparación de Datos --- print(f"Preparando {len(df)} registros agregados para el entrenamiento...") # Las características serán la planta, el día de la semana y la cantidad de bobinas dañadas ese día features = ['id_planta', 'dia_semana', 'cantidad_danadas'] X = df[features] # --- 4. Entrenamiento y Guardado --- print(f"Entrenando el modelo de bobinas dañadas 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 DE BOBINAS DAÑADAS COMPLETADO. Modelo guardado en '{MODEL_FILE}' ---")