|
1 | 1 | # AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/losses.ipynb. |
2 | 2 |
|
3 | 3 | # %% auto 0 |
4 | | -__all__ = ['mae', 'mse', 'rmse', 'mape', 'smape', 'mase', 'rmae', 'quantile_loss', 'mqloss', 'coverage', 'calibration', |
| 4 | +__all__ = ['mae', 'mse', 'rmse', 'bias', 'mape', 'smape', 'mase', 'rmae', 'quantile_loss', 'mqloss', 'coverage', 'calibration', |
5 | 5 | 'scaled_crps'] |
6 | 6 |
|
7 | 7 | # %% ../nbs/losses.ipynb 3 |
@@ -141,15 +141,42 @@ def rmse( |
141 | 141 | res = res.with_columns(*[pl.col(c).pow(0.5) for c in models]) |
142 | 142 | return res |
143 | 143 |
|
144 | | -# %% ../nbs/losses.ipynb 30 |
| 144 | +# %% ../nbs/losses.ipynb 27 |
| 145 | +@_base_docstring |
| 146 | +def bias( |
| 147 | + df: DFType, |
| 148 | + models: List[str], |
| 149 | + id_col: str = "unique_id", |
| 150 | + target_col: str = "y", |
| 151 | +) -> DFType: |
| 152 | + """Forecast estimator bias. |
| 153 | +
|
| 154 | + Defined as prediction - actual""" |
| 155 | + if isinstance(df, pd.DataFrame): |
| 156 | + res = ( |
| 157 | + (df[models].sub(df[target_col], axis=0)) |
| 158 | + .groupby(df[id_col], observed=True) |
| 159 | + .mean() |
| 160 | + ) |
| 161 | + res.index.name = id_col |
| 162 | + res = res.reset_index() |
| 163 | + else: |
| 164 | + |
| 165 | + def gen_expr(model): |
| 166 | + return pl.col(model).sub(pl.col(target_col)).alias(model) |
| 167 | + |
| 168 | + res = _pl_agg_expr(df, models, id_col, gen_expr) |
| 169 | + return res |
| 170 | + |
| 171 | +# %% ../nbs/losses.ipynb 33 |
145 | 172 | def _zero_to_nan(series: Union[pd.Series, "pl.Expr"]) -> Union[pd.Series, "pl.Expr"]: |
146 | 173 | if isinstance(series, pd.Series): |
147 | 174 | res = series.replace(0, np.nan) |
148 | 175 | else: |
149 | 176 | res = pl.when(series == 0).then(float("nan")).otherwise(series.abs()) |
150 | 177 | return res |
151 | 178 |
|
152 | | -# %% ../nbs/losses.ipynb 31 |
| 179 | +# %% ../nbs/losses.ipynb 34 |
153 | 180 | @_base_docstring |
154 | 181 | def mape( |
155 | 182 | df: DFType, |
@@ -187,7 +214,7 @@ def gen_expr(model): |
187 | 214 | res = _pl_agg_expr(df, models, id_col, gen_expr) |
188 | 215 | return res |
189 | 216 |
|
190 | | -# %% ../nbs/losses.ipynb 35 |
| 217 | +# %% ../nbs/losses.ipynb 38 |
191 | 218 | @_base_docstring |
192 | 219 | def smape( |
193 | 220 | df: DFType, |
@@ -225,7 +252,7 @@ def gen_expr(model): |
225 | 252 | res = _pl_agg_expr(df, models, id_col, gen_expr) |
226 | 253 | return res |
227 | 254 |
|
228 | | -# %% ../nbs/losses.ipynb 41 |
| 255 | +# %% ../nbs/losses.ipynb 44 |
229 | 256 | def mase( |
230 | 257 | df: DFType, |
231 | 258 | models: List[str], |
@@ -293,7 +320,7 @@ def gen_expr(model): |
293 | 320 | res = _pl_agg_expr(full_df, models, id_col, gen_expr) |
294 | 321 | return res |
295 | 322 |
|
296 | | -# %% ../nbs/losses.ipynb 46 |
| 323 | +# %% ../nbs/losses.ipynb 49 |
297 | 324 | def rmae( |
298 | 325 | df: DFType, |
299 | 326 | models: List[str], |
@@ -347,7 +374,7 @@ def gen_expr(model, baseline) -> pl_Expr: |
347 | 374 | res = res.select([id_col, *exprs]) |
348 | 375 | return res |
349 | 376 |
|
350 | | -# %% ../nbs/losses.ipynb 52 |
| 377 | +# %% ../nbs/losses.ipynb 55 |
351 | 378 | def quantile_loss( |
352 | 379 | df: DFType, |
353 | 380 | models: Dict[str, str], |
@@ -409,7 +436,7 @@ def gen_expr(model): |
409 | 436 | res = _pl_agg_expr(df, list(models.items()), id_col, gen_expr) |
410 | 437 | return res |
411 | 438 |
|
412 | | -# %% ../nbs/losses.ipynb 58 |
| 439 | +# %% ../nbs/losses.ipynb 61 |
413 | 440 | def mqloss( |
414 | 441 | df: DFType, |
415 | 442 | models: Dict[str, List[str]], |
@@ -468,7 +495,7 @@ def mqloss( |
468 | 495 | res = ufp.assign_columns(res, model, model_res[model]) |
469 | 496 | return res |
470 | 497 |
|
471 | | -# %% ../nbs/losses.ipynb 64 |
| 498 | +# %% ../nbs/losses.ipynb 67 |
472 | 499 | def coverage( |
473 | 500 | df: DFType, |
474 | 501 | models: List[str], |
@@ -527,7 +554,7 @@ def gen_expr(model): |
527 | 554 | res = _pl_agg_expr(df, models, id_col, gen_expr) |
528 | 555 | return res |
529 | 556 |
|
530 | | -# %% ../nbs/losses.ipynb 68 |
| 557 | +# %% ../nbs/losses.ipynb 71 |
531 | 558 | def calibration( |
532 | 559 | df: DFType, |
533 | 560 | models: Dict[str, str], |
@@ -577,7 +604,7 @@ def gen_expr(model): |
577 | 604 | res = _pl_agg_expr(df, list(models.items()), id_col, gen_expr) |
578 | 605 | return res |
579 | 606 |
|
580 | | -# %% ../nbs/losses.ipynb 72 |
| 607 | +# %% ../nbs/losses.ipynb 75 |
581 | 608 | def scaled_crps( |
582 | 609 | df: DFType, |
583 | 610 | models: Dict[str, List[str]], |
|
0 commit comments