초기 커밋
This commit is contained in:
0
app/processing/pipelines/__init__.py
Normal file
0
app/processing/pipelines/__init__.py
Normal file
29
app/processing/pipelines/report_pipeline.py
Normal file
29
app/processing/pipelines/report_pipeline.py
Normal 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
|
||||
57
app/processing/pipelines/telemetry_pipeline.py
Normal file
57
app/processing/pipelines/telemetry_pipeline.py
Normal 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)
|
||||
Reference in New Issue
Block a user