초기 커밋

This commit is contained in:
2026-03-01 07:44:19 +09:00
commit 09359f30be
146 changed files with 6120 additions and 0 deletions

View File

View File

@@ -0,0 +1,29 @@
from __future__ import annotations
from datetime import datetime
from app.models.mongodb.analytics_result import AnalyticsResult
from app.processing.analyzers.device_analyzer import analyze_device_status
from app.processing.analyzers.trend_analyzer import analyze_trend
async def generate_device_report(
device_id: str, start: datetime, end: datetime
) -> AnalyticsResult:
"""Generate a comprehensive device report."""
status_report = await analyze_device_status(device_id, start, end)
trend_report = await analyze_trend(device_id, start, end)
result = AnalyticsResult(
analysis_type="device_report",
device_id=device_id,
parameters={"start": start.isoformat(), "end": end.isoformat()},
result={
"status": status_report,
"trends": trend_report,
},
period_start=start,
period_end=end,
)
await result.insert()
return result

View File

@@ -0,0 +1,57 @@
from __future__ import annotations
from datetime import datetime
import polars as pl
from app.models.mongodb.telemetry import TelemetryData
async def aggregate_telemetry(
device_id: str,
start: datetime,
end: datetime,
interval: str = "1h",
) -> pl.DataFrame:
"""Aggregate telemetry data for a device over a time range."""
docs = await (
TelemetryData.find(
TelemetryData.device_id == device_id,
TelemetryData.timestamp >= start,
TelemetryData.timestamp <= end,
)
.sort("+timestamp")
.to_list()
)
if not docs:
return pl.DataFrame()
records = [
{"timestamp": d.timestamp, "device_id": d.device_id, **d.metrics}
for d in docs
]
df = pl.DataFrame(records)
return df.sort("timestamp").group_by_dynamic("timestamp", every=interval).agg(
pl.all().exclude("timestamp", "device_id").mean()
)
async def get_latest_telemetry(device_id: str, limit: int = 100) -> pl.DataFrame:
"""Get latest telemetry records as a Polars DataFrame."""
docs = await (
TelemetryData.find(TelemetryData.device_id == device_id)
.sort("-timestamp")
.limit(limit)
.to_list()
)
if not docs:
return pl.DataFrame()
records = [
{"timestamp": d.timestamp, "device_id": d.device_id, **d.metrics}
for d in docs
]
return pl.DataFrame(records)