From 915719ed75f21f316545c280d4cb7b910684803b Mon Sep 17 00:00:00 2001 From: Olivier Sprangers Date: Wed, 13 Nov 2024 20:38:50 +0100 Subject: [PATCH] FrameT_to_Frame --- hierarchicalforecast/core.py | 26 +++++++++++++------------- hierarchicalforecast/evaluation.py | 11 +++++------ hierarchicalforecast/utils.py | 12 ++++++------ nbs/src/core.ipynb | 26 +++++++++++++------------- nbs/src/evaluation.ipynb | 11 +++++------ nbs/src/utils.ipynb | 12 ++++++------ 6 files changed, 48 insertions(+), 50 deletions(-) diff --git a/hierarchicalforecast/core.py b/hierarchicalforecast/core.py index 2e73a79..d69c51c 100644 --- a/hierarchicalforecast/core.py +++ b/hierarchicalforecast/core.py @@ -10,7 +10,7 @@ from .methods import HReconciler from inspect import signature -from narwhals.typing import FrameT +from narwhals.typing import Frame from scipy.stats import norm from scipy import sparse from typing import Dict, List, Optional @@ -39,7 +39,7 @@ def _build_fn_name(fn) -> str: return fn_name # %% ../nbs/src/core.ipynb 10 -def _reverse_engineer_sigmah(Y_hat_df: FrameT, +def _reverse_engineer_sigmah(Y_hat_df: Frame, y_hat: np.ndarray, model_name: str, id_col: str = "unique_id", @@ -102,9 +102,9 @@ def __init__(self, self.insample = any([method.insample for method in reconcilers]) def _prepare_fit(self, - Y_hat_df: FrameT, - S_df: FrameT, - Y_df: Optional[FrameT], + Y_hat_df: Frame, + S_df: Frame, + Y_df: Optional[Frame], tags: Dict[str, np.ndarray], level: Optional[List[int]] = None, intervals_method: str = 'normality', @@ -198,8 +198,8 @@ def _prepare_fit(self, return Y_hat_df_nw, S_df_nw, Y_df_nw, model_names def _prepare_Y(self, - Y_df: FrameT, - S_df: FrameT, + Y_df: Frame, + S_df: Frame, is_balanced: bool = True, id_col: str = "unique_id", time_col: str = "ds", @@ -225,10 +225,10 @@ def _prepare_Y(self, def reconcile(self, - Y_hat_df: FrameT, - S: FrameT, + Y_hat_df: Frame, + S: Frame, tags: Dict[str, np.ndarray], - Y_df: Optional[FrameT] = None, + Y_df: Optional[Frame] = None, level: Optional[List[int]] = None, intervals_method: str = 'normality', num_samples: int = -1, @@ -407,10 +407,10 @@ def reconcile(self, return Y_tilde_df.to_native() def bootstrap_reconcile(self, - Y_hat_df: FrameT, - S_df: FrameT, + Y_hat_df: Frame, + S_df: Frame, tags: Dict[str, np.ndarray], - Y_df: Optional[FrameT] = None, + Y_df: Optional[Frame] = None, level: Optional[List[int]] = None, intervals_method: str = 'normality', num_samples: int = -1, diff --git a/hierarchicalforecast/evaluation.py b/hierarchicalforecast/evaluation.py index ffea8c1..f8b2217 100644 --- a/hierarchicalforecast/evaluation.py +++ b/hierarchicalforecast/evaluation.py @@ -10,8 +10,7 @@ import narwhals as nw import numpy as np -from .core import pivot -from narwhals.typing import FrameT +from narwhals.typing import Frame from scipy.stats import multivariate_normal # %% ../nbs/src/evaluation.ipynb 6 @@ -341,10 +340,10 @@ def __init__(self, self.evaluators = evaluators def evaluate(self, - Y_hat_df: FrameT, - Y_test_df: FrameT, + Y_hat_df: Frame, + Y_test_df: Frame, tags: Dict[str, np.ndarray], - Y_df: Optional[FrameT] = None, + Y_df: Optional[Frame] = None, benchmark: Optional[str] = None, id_col: str = "unique_id", time_col: str = "ds", @@ -396,7 +395,7 @@ def evaluate(self, y_test_cats = Y_h_cats[target_col].to_numpy().reshape(-1, h) if has_y_insample and Y_df is not None: - y_insample = pivot(Y_df_nw, index = id_col, columns = time_col, values = target_col) + y_insample = Y_df_nw.pivot(on=time_col, index = id_col, values = target_col, sort_columns=True).sort(by=id_col) y_insample = y_insample.filter(nw.col(id_col).is_in(cats)) y_insample = y_insample.drop(id_col).to_numpy() diff --git a/hierarchicalforecast/utils.py b/hierarchicalforecast/utils.py index 30b061b..b8babd7 100644 --- a/hierarchicalforecast/utils.py +++ b/hierarchicalforecast/utils.py @@ -13,7 +13,7 @@ import numpy as np import pandas as pd -from narwhals.typing import FrameT +from narwhals.typing import Frame from numba import njit, prange from sklearn.preprocessing import OneHotEncoder @@ -89,7 +89,7 @@ def join_upper(bottom_value): # %% ../nbs/src/utils.ipynb 13 def aggregate( - df: FrameT, + df: Frame, spec: List[List[str]], exog_vars: Optional[Dict[str, Union[str, List[str]]]] = None, sparse_s: bool = False, @@ -237,7 +237,7 @@ class HierarchicalPlot: each key is a level and its value contains tags associated to that level.

""" def __init__(self, - S: FrameT, + S: Frame, tags: Dict[str, np.ndarray], ): @@ -258,7 +258,7 @@ def plot_summing_matrix(self): def plot_series(self, series: str, - Y_df: FrameT, + Y_df: Frame, models: Optional[List[str]] = None, level: Optional[List[int]] = None, id_col: str = "unique_id", @@ -322,7 +322,7 @@ def plot_series(self, def plot_hierarchically_linked_series(self, bottom_series: str, - Y_df: FrameT, + Y_df: Frame, models: Optional[List[str]] = None, level: Optional[List[int]] = None, id_col: str = "unique_id", @@ -394,7 +394,7 @@ def plot_hierarchically_linked_series(self, fig.legend(handles, labels, **kwargs) def plot_hierarchical_predictions_gap(self, - Y_df: FrameT, + Y_df: Frame, models: Optional[List[str]] = None, xlabel: Optional[str] = None, ylabel: Optional[str] = None, diff --git a/nbs/src/core.ipynb b/nbs/src/core.ipynb index b5db163..33c944a 100644 --- a/nbs/src/core.ipynb +++ b/nbs/src/core.ipynb @@ -49,7 +49,7 @@ "\n", "from hierarchicalforecast.methods import HReconciler\n", "from inspect import signature\n", - "from narwhals.typing import FrameT\n", + "from narwhals.typing import Frame\n", "from scipy.stats import norm\n", "from scipy import sparse\n", "from typing import Dict, List, Optional\n", @@ -144,7 +144,7 @@ "outputs": [], "source": [ "#| exporti\n", - "def _reverse_engineer_sigmah(Y_hat_df: FrameT, \n", + "def _reverse_engineer_sigmah(Y_hat_df: Frame, \n", " y_hat: np.ndarray, \n", " model_name: str,\n", " id_col: str = \"unique_id\",\n", @@ -214,9 +214,9 @@ " self.insample = any([method.insample for method in reconcilers])\n", " \n", " def _prepare_fit(self,\n", - " Y_hat_df: FrameT,\n", - " S_df: FrameT,\n", - " Y_df: Optional[FrameT],\n", + " Y_hat_df: Frame,\n", + " S_df: Frame,\n", + " Y_df: Optional[Frame],\n", " tags: Dict[str, np.ndarray],\n", " level: Optional[List[int]] = None,\n", " intervals_method: str = 'normality',\n", @@ -310,8 +310,8 @@ " return Y_hat_df_nw, S_df_nw, Y_df_nw, model_names\n", "\n", " def _prepare_Y(self, \n", - " Y_df: FrameT, \n", - " S_df: FrameT, \n", + " Y_df: Frame, \n", + " S_df: Frame, \n", " is_balanced: bool = True,\n", " id_col: str = \"unique_id\",\n", " time_col: str = \"ds\", \n", @@ -337,10 +337,10 @@ "\n", "\n", " def reconcile(self, \n", - " Y_hat_df: FrameT,\n", - " S: FrameT,\n", + " Y_hat_df: Frame,\n", + " S: Frame,\n", " tags: Dict[str, np.ndarray],\n", - " Y_df: Optional[FrameT] = None,\n", + " Y_df: Optional[Frame] = None,\n", " level: Optional[List[int]] = None,\n", " intervals_method: str = 'normality',\n", " num_samples: int = -1,\n", @@ -519,10 +519,10 @@ " return Y_tilde_df.to_native()\n", "\n", " def bootstrap_reconcile(self,\n", - " Y_hat_df: FrameT,\n", - " S_df: FrameT,\n", + " Y_hat_df: Frame,\n", + " S_df: Frame,\n", " tags: Dict[str, np.ndarray],\n", - " Y_df: Optional[FrameT] = None,\n", + " Y_df: Optional[Frame] = None,\n", " level: Optional[List[int]] = None,\n", " intervals_method: str = 'normality',\n", " num_samples: int = -1,\n", diff --git a/nbs/src/evaluation.ipynb b/nbs/src/evaluation.ipynb index c6f9604..81fdd9a 100644 --- a/nbs/src/evaluation.ipynb +++ b/nbs/src/evaluation.ipynb @@ -40,8 +40,7 @@ "import narwhals as nw\n", "import numpy as np\n", "\n", - "from hierarchicalforecast.core import pivot\n", - "from narwhals.typing import FrameT\n", + "from narwhals.typing import Frame\n", "from scipy.stats import multivariate_normal" ] }, @@ -533,10 +532,10 @@ " self.evaluators = evaluators\n", "\n", " def evaluate(self, \n", - " Y_hat_df: FrameT,\n", - " Y_test_df: FrameT,\n", + " Y_hat_df: Frame,\n", + " Y_test_df: Frame,\n", " tags: Dict[str, np.ndarray],\n", - " Y_df: Optional[FrameT] = None,\n", + " Y_df: Optional[Frame] = None,\n", " benchmark: Optional[str] = None,\n", " id_col: str = \"unique_id\",\n", " time_col: str = \"ds\", \n", @@ -588,7 +587,7 @@ " y_test_cats = Y_h_cats[target_col].to_numpy().reshape(-1, h)\n", "\n", " if has_y_insample and Y_df is not None:\n", - " y_insample = pivot(Y_df_nw, index = id_col, columns = time_col, values = target_col)\n", + " y_insample = Y_df_nw.pivot(on=time_col, index = id_col, values = target_col, sort_columns=True).sort(by=id_col)\n", " y_insample = y_insample.filter(nw.col(id_col).is_in(cats))\n", " y_insample = y_insample.drop(id_col).to_numpy()\n", "\n", diff --git a/nbs/src/utils.ipynb b/nbs/src/utils.ipynb index 4b02213..131e262 100644 --- a/nbs/src/utils.ipynb +++ b/nbs/src/utils.ipynb @@ -48,7 +48,7 @@ "import numpy as np\n", "import pandas as pd\n", "\n", - "from narwhals.typing import FrameT\n", + "from narwhals.typing import Frame\n", "from numba import njit, prange\n", "from sklearn.preprocessing import OneHotEncoder\n", "\n", @@ -323,7 +323,7 @@ "source": [ "#| export\n", "def aggregate(\n", - " df: FrameT,\n", + " df: Frame,\n", " spec: List[List[str]],\n", " exog_vars: Optional[Dict[str, Union[str, List[str]]]] = None,\n", " sparse_s: bool = False,\n", @@ -871,7 +871,7 @@ " each key is a level and its value contains tags associated to that level.

\n", " \"\"\"\n", " def __init__(self,\n", - " S: FrameT,\n", + " S: Frame,\n", " tags: Dict[str, np.ndarray],\n", " ):\n", "\n", @@ -892,7 +892,7 @@ "\n", " def plot_series(self,\n", " series: str,\n", - " Y_df: FrameT,\n", + " Y_df: Frame,\n", " models: Optional[List[str]] = None,\n", " level: Optional[List[int]] = None,\n", " id_col: str = \"unique_id\",\n", @@ -956,7 +956,7 @@ " \n", " def plot_hierarchically_linked_series(self,\n", " bottom_series: str,\n", - " Y_df: FrameT,\n", + " Y_df: Frame,\n", " models: Optional[List[str]] = None,\n", " level: Optional[List[int]] = None,\n", " id_col: str = \"unique_id\",\n", @@ -1028,7 +1028,7 @@ " fig.legend(handles, labels, **kwargs)\n", "\n", " def plot_hierarchical_predictions_gap(self,\n", - " Y_df: FrameT,\n", + " Y_df: Frame,\n", " models: Optional[List[str]] = None,\n", " xlabel: Optional[str] = None,\n", " ylabel: Optional[str] = None,\n",