"""趋势预测 + 异常检测。""" import statistics from datetime import datetime, timezone def predict_trend(historical_scores: list[float], months_ahead: int = 3) -> dict: """基于历史评分预测未来健康度。""" if len(historical_scores) < 2: return {"predicted": [], "confidence": 0.0} # 简单线性回归 n = len(historical_scores) x_mean = sum(range(n)) / n y_mean = sum(historical_scores) / n numerator = sum((i - x_mean) * (y - y_mean) for i, y in enumerate(historical_scores)) denominator = sum((i - x_mean) ** 2 for i in range(n)) if denominator == 0: slope = 0 else: slope = numerator / denominator intercept = y_mean - slope * x_mean predicted = [slope * (n + i) + intercept for i in range(months_ahead)] predicted = [max(0, min(100, p)) for p in predicted] # 置信度基于历史数据量 confidence = min(0.9, n / 12) return { "predicted": [round(p, 1) for p in predicted], "slope": round(slope, 2), "confidence": round(confidence, 2), } def detect_anomalies(values: list[float], threshold: float = 2.0) -> list[int]: """统计方法识别指标突变。""" if len(values) < 3: return [] mean = statistics.mean(values) stdev = statistics.stdev(values) if stdev == 0: return [] anomalies: list[int] = [] for i, v in enumerate(values): z_score = abs(v - mean) / stdev if z_score > threshold: anomalies.append(i) return anomalies