초기 커밋
This commit is contained in:
45
app/processing/analyzers/trend_analyzer.py
Normal file
45
app/processing/analyzers/trend_analyzer.py
Normal file
@@ -0,0 +1,45 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
import numpy as np
|
||||
|
||||
from app.models.mongodb.telemetry import TelemetryData
|
||||
|
||||
|
||||
async def analyze_trend(
|
||||
device_id: str, start: datetime, end: datetime
|
||||
) -> dict:
|
||||
"""Analyze telemetry data trends using linear regression."""
|
||||
docs = await (
|
||||
TelemetryData.find(
|
||||
TelemetryData.device_id == device_id,
|
||||
TelemetryData.timestamp >= start,
|
||||
TelemetryData.timestamp <= end,
|
||||
)
|
||||
.sort("+timestamp")
|
||||
.to_list()
|
||||
)
|
||||
|
||||
if len(docs) < 2:
|
||||
return {"status": "insufficient_data", "count": len(docs)}
|
||||
|
||||
timestamps = np.array([d.timestamp.timestamp() for d in docs])
|
||||
values = np.array([d.metrics.get("value", 0) for d in docs], dtype=float)
|
||||
|
||||
# Normalize timestamps
|
||||
t_norm = timestamps - timestamps[0]
|
||||
|
||||
# Linear regression
|
||||
coeffs = np.polyfit(t_norm, values, 1)
|
||||
slope = float(coeffs[0])
|
||||
|
||||
return {
|
||||
"count": len(docs),
|
||||
"mean": float(np.mean(values)),
|
||||
"std": float(np.std(values)),
|
||||
"min": float(np.min(values)),
|
||||
"max": float(np.max(values)),
|
||||
"slope": slope,
|
||||
"trend": "increasing" if slope > 0.001 else "decreasing" if slope < -0.001 else "stable",
|
||||
}
|
||||
Reference in New Issue
Block a user