File size: 2,614 Bytes
c40c447
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
"""
Anomaly detection API endpoints.

Responsabilidad: Manejar requests de detecci贸n de anomal铆as.
"""

from fastapi import APIRouter, Depends, HTTPException, status

from app.api.dependencies import get_detect_anomalies_use_case
from app.application.use_cases.anomaly_use_case import DetectAnomaliesUseCase
from app.application.dtos.anomaly_dtos import (
    DetectAnomaliesRequestDTO,
    DetectAnomaliesResponseDTO
)
from app.utils.logger import setup_logger

logger = setup_logger(__name__)

router = APIRouter(prefix="/anomaly", tags=["Anomaly Detection"])


@router.post(
    "/detect",
    response_model=DetectAnomaliesResponseDTO,
    status_code=status.HTTP_200_OK,
    summary="Detectar anomal铆as",
    description="Detecta anomal铆as comparando valores observados con pron贸stico"
)
async def detect_anomalies(
    request: DetectAnomaliesRequestDTO,
    use_case: DetectAnomaliesUseCase = Depends(get_detect_anomalies_use_case)
):
    """
    Detecta anomal铆as en serie temporal.
    
    Compara valores observados recientes con pron贸stico basado
    en contexto hist贸rico. Marca como anomal铆as los valores que
    caen fuera de intervalos de confianza.
    
    Args:
        request: Contexto hist贸rico y valores recientes a evaluar
        use_case: Caso de uso inyectado
        
    Returns:
        Lista de puntos con indicador de anomal铆a
        
    Example:
        ```json
        {
            "context_values": [100, 102, 105, 103, 108],
            "recent_observed": [112, 150, 115],
            "quantile_low": 0.05,
            "quantile_high": 0.95,
            "freq": "D"
        }
        ```
    """
    try:
        logger.info(
            f"Anomaly detection request: {len(request.context_values)} context, "
            f"{len(request.recent_observed)} to evaluate"
        )
        
        # Ejecutar use case
        response = use_case.execute(request)
        
        num_anomalies = sum(1 for p in response.anomaly_points if p.is_anomaly)
        logger.info(
            f"Anomaly detection completed: {num_anomalies} anomalies found"
        )
        
        return response
        
    except ValueError as e:
        logger.error(f"Validation error: {e}")
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail=str(e)
        )
    except Exception as e:
        logger.error(f"Unexpected error in anomaly detection: {e}", exc_info=True)
        raise HTTPException(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail="Error interno en detecci贸n de anomal铆as"
        )