Files
GestionIntegralWeb/ProyectoIA_Gestion/train_danadas.py

67 lines
2.7 KiB
Python

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}' ---")