초기 커밋
This commit is contained in:
71
app/services/analytics_service.py
Normal file
71
app/services/analytics_service.py
Normal file
@@ -0,0 +1,71 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
from app.processing.analyzers.device_analyzer import analyze_device_status
|
||||
from app.processing.analyzers.trend_analyzer import analyze_trend
|
||||
from app.processing.pipelines.report_pipeline import generate_device_report
|
||||
from app.processing.pipelines.telemetry_pipeline import aggregate_telemetry
|
||||
from app.processing.utils.dataframe_utils import to_records
|
||||
from app.repositories.analytics_repo import AnalyticsRepository
|
||||
from app.schemas.analytics import (
|
||||
AnalyticsResultRead,
|
||||
ReportResponse,
|
||||
TelemetryAggregateResponse,
|
||||
)
|
||||
|
||||
|
||||
class AnalyticsService:
|
||||
def __init__(self) -> None:
|
||||
self.analytics_repo = AnalyticsRepository()
|
||||
|
||||
async def get_telemetry_aggregate(
|
||||
self, device_id: str, start: datetime, end: datetime, interval: str = "1h"
|
||||
) -> TelemetryAggregateResponse:
|
||||
df = await aggregate_telemetry(device_id, start, end, interval)
|
||||
records = to_records(df) if len(df) > 0 else []
|
||||
return TelemetryAggregateResponse(
|
||||
device_id=device_id, records=records, count=len(records)
|
||||
)
|
||||
|
||||
async def generate_report(
|
||||
self, device_id: str, start: datetime, end: datetime
|
||||
) -> ReportResponse:
|
||||
result = await generate_device_report(device_id, start, end)
|
||||
return ReportResponse(
|
||||
report_id=str(result.id),
|
||||
device_id=device_id,
|
||||
status=result.result.get("status", {}),
|
||||
trends=result.result.get("trends", {}),
|
||||
created_at=result.created_at,
|
||||
)
|
||||
|
||||
async def get_device_status_analysis(
|
||||
self, device_id: str, start: datetime, end: datetime
|
||||
) -> dict:
|
||||
return await analyze_device_status(device_id, start, end)
|
||||
|
||||
async def get_trend_analysis(
|
||||
self, device_id: str, start: datetime, end: datetime
|
||||
) -> dict:
|
||||
return await analyze_trend(device_id, start, end)
|
||||
|
||||
async def list_results(
|
||||
self, analysis_type: str, device_id: str | None = None, skip: int = 0, limit: int = 20
|
||||
) -> list[AnalyticsResultRead]:
|
||||
results = await self.analytics_repo.get_by_type(
|
||||
analysis_type, device_id=device_id, skip=skip, limit=limit
|
||||
)
|
||||
return [
|
||||
AnalyticsResultRead(
|
||||
id=str(r.id),
|
||||
analysis_type=r.analysis_type,
|
||||
device_id=r.device_id,
|
||||
result=r.result,
|
||||
parameters=r.parameters,
|
||||
period_start=r.period_start,
|
||||
period_end=r.period_end,
|
||||
created_at=r.created_at,
|
||||
)
|
||||
for r in results
|
||||
]
|
||||
Reference in New Issue
Block a user