From 8c169dedc4dcbfe1c1e95e282e438d8e95c70d04 Mon Sep 17 00:00:00 2001 From: abalint Date: Fri, 5 Apr 2024 09:52:45 +0200 Subject: [PATCH] added darts.NaiveMovingAverage --- models/dt-naive-moving-avg/Dockerfile | 13 +++++ models/dt-naive-moving-avg/requirements.txt | 1 + models/dt-naive-moving-avg/src/main.py | 61 +++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 models/dt-naive-moving-avg/Dockerfile create mode 100644 models/dt-naive-moving-avg/requirements.txt create mode 100644 models/dt-naive-moving-avg/src/main.py diff --git a/models/dt-naive-moving-avg/Dockerfile b/models/dt-naive-moving-avg/Dockerfile new file mode 100644 index 0000000..d007395 --- /dev/null +++ b/models/dt-naive-moving-avg/Dockerfile @@ -0,0 +1,13 @@ +FROM attilabalint/enfobench-models:base-u8darts-0.27.2 + +WORKDIR /usr/local/app + +COPY ./requirements.txt /usr/local/app/requirements.txt +RUN pip install --no-cache-dir -r /usr/local/app/requirements.txt + +COPY ./src /usr/local/app/src + +ENV ENFOBENCH_MODEL_HISTORY="1D" + +EXPOSE 3000 +CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "3000"] diff --git a/models/dt-naive-moving-avg/requirements.txt b/models/dt-naive-moving-avg/requirements.txt new file mode 100644 index 0000000..a72ecee --- /dev/null +++ b/models/dt-naive-moving-avg/requirements.txt @@ -0,0 +1 @@ +enfobench>=0.6.0,<0.7.0 \ No newline at end of file diff --git a/models/dt-naive-moving-avg/src/main.py b/models/dt-naive-moving-avg/src/main.py new file mode 100644 index 0000000..20f9c90 --- /dev/null +++ b/models/dt-naive-moving-avg/src/main.py @@ -0,0 +1,61 @@ +import os + +import pandas as pd +from darts import TimeSeries +from darts.models.forecasting.baselines import NaiveMovingAverage + +from enfobench import AuthorInfo, ForecasterType, ModelInfo +from enfobench.evaluation.server import server_factory +from enfobench.evaluation.utils import periods_in_duration + + +class DartsNaiveMovingAverageModel: + def __init__(self, history: str): + self.history = history.upper() + + def info(self) -> ModelInfo: + return ModelInfo( + name=f"Darts.NaiveMovingAverage.{self.history}", + authors=[AuthorInfo(name="Attila Balint", email="attila.balint@kuleuven.be")], + type=ForecasterType.point, + params={ + "history": self.history, + }, + ) + + def forecast( + self, + horizon: int, + history: pd.DataFrame, + past_covariates: pd.DataFrame | None = None, + future_covariates: pd.DataFrame | None = None, + metadata: dict | None = None, + **kwargs, + ) -> pd.DataFrame: + # Fill missing values + history = history.fillna(history.y.mean()) + + # Create model + periods = periods_in_duration(history.index, duration=self.history) + model = NaiveMovingAverage(input_chunk_length=periods) + + # Fit model + series = TimeSeries.from_dataframe(history, value_cols=["y"]) + model.fit(series) + + # Make forecast + pred = model.predict(horizon) + + # Postprocess forecast + forecast = pred.pd_dataframe().rename(columns={"y": "yhat"}).fillna(history.y.mean()) + return forecast + + +# Load parameters +history = os.getenv("ENFOBENCH_MODEL_HISTORY") + +# Instantiate your model +model = DartsNaiveMovingAverageModel(history) + +# Create a forecast server by passing in your model +app = server_factory(model)