feat: new file
This commit is contained in:
28
backend/app/services/forecast.py
Normal file
28
backend/app/services/forecast.py
Normal file
@@ -0,0 +1,28 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import numpy as np
|
||||
from statsmodels.tsa.holtwinters import ExponentialSmoothing
|
||||
|
||||
|
||||
def forecast_next_n(y: np.ndarray, n: int) -> np.ndarray:
|
||||
"""
|
||||
轻量级预测:优先 Holt-Winters(对短序列也相对稳),失败则用简单移动平均。
|
||||
"""
|
||||
y = np.asarray(y, dtype=float)
|
||||
if y.size < 3:
|
||||
return np.repeat(y[-1] if y.size else 0.0, n)
|
||||
|
||||
try:
|
||||
model = ExponentialSmoothing(
|
||||
y,
|
||||
trend="add",
|
||||
seasonal=None,
|
||||
initialization_method="estimated",
|
||||
)
|
||||
fit = model.fit(optimized=True)
|
||||
return np.asarray(fit.forecast(n), dtype=float)
|
||||
except Exception:
|
||||
window = int(min(7, max(3, y.size // 2)))
|
||||
avg = float(np.mean(y[-window:])) if y.size else 0.0
|
||||
return np.repeat(avg, n)
|
||||
|
||||
Reference in New Issue
Block a user