pvar_dashboard / src /models /sarima.py
F1nnSBK's picture
Deploy Photovoltaik Risiko-Manager dashboard to Hugging Face Spaces
5841846
Raw
History Blame Contribute Delete
1.56 kB
import pandas as pd
import numpy as np
from statsmodels.tsa.statespace.sarimax import SARIMAX
class SARIMAModel:
"""
Seasonal Autoregressive Integrated Moving Average (SARIMA) model.
Encapsulates statsmodels SARIMAX for modeling time series structure.
"""
def __init__(self, order=(1, 0, 0), seasonal_order=(1, 0, 0, 24)):
self.order = order
self.seasonal_order = seasonal_order
self.model = None
self.results = None
def fit(self, y: pd.Series):
"""Fits the SARIMA model on time series target y."""
# Suppress potential warnings from statespace initialization
self.model = SARIMAX(
y,
order=self.order,
seasonal_order=self.seasonal_order,
enforce_stationarity=False,
enforce_invertibility=False
)
self.results = self.model.fit(disp=False)
return self
def predict(self, y_new: pd.Series) -> pd.Series:
"""
Generates one-step-ahead predictions for the new series y_new
by extending the fitted statespace model.
"""
if self.results is None:
raise ValueError("Model is not fitted yet. Call fit() first.")
extended = self.results.extend(y_new)
return extended.predict(start=y_new.index[0], end=y_new.index[-1])
def summary(self) -> str:
"""Returns the summary of the fitted model."""
if self.results is None:
return "Model not fitted yet."
return self.results.summary().as_text()