| import pandas as pd |
| from numpy import sqrt as npsq |
|
|
|
|
| def get_metrics(df_grouped: pd.DataFrame) -> pd.DataFrame: |
| mape = df_grouped["error_rel"] |
| mae = df_grouped["error_abs"] |
| rmse = npsq(df_grouped["error_sq"]) |
| bias = df_grouped["error_raw"] |
|
|
| return pd.DataFrame( |
| { |
| "mape": mape, |
| "mae": mae, |
| "rmse": rmse, |
| "bias": bias, |
| } |
| ) |
|
|
|
|
| def get_metrics_data( |
| df: pd.DataFrame, |
| ) -> tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]: |
| df["model_config"] = [ |
| f"p:{p} q:{q} dist:{d}" for p, q, d in df["model_config"].str.split("_") |
| ] |
|
|
| df_grouped_date = df.groupby(["target_date", "model_config"]).mean( |
| numeric_only=True |
| ) |
| df_grouped_ticker = df.groupby(["ticker", "model_config"]).mean(numeric_only=True) |
|
|
| worst_tickers = ( |
| df_grouped_ticker.sort_values("error_abs", ascending=False) |
| .head(10) |
| .reset_index() |
| ) |
| worst_tickers.rename( |
| columns={ |
| "ticker": "Ticker", |
| "model_config": "Model Config", |
| "error_raw": "Avg Error (Bias)", |
| "error_rel": "Avg % Error", |
| "error_abs": "Avg Abs Error", |
| "error_sq": "Avg Squared Error", |
| }, |
| inplace=True, |
| ) |
|
|
| metrics_df_date = get_metrics(df_grouped_date) |
| metrics_df_ticker = get_metrics(df_grouped_ticker) |
|
|
| metrics_df_date = metrics_df_date.reset_index().sort_values("target_date") |
| metrics_df_date.rename( |
| columns={ |
| "target_date": "Prediction Date", |
| "model_config": "Model Config", |
| "mape": "MAPE", |
| "mae": "MAE", |
| "rmse": "RMSE", |
| "bias": "Bias (mean error)", |
| }, |
| inplace=True, |
| ) |
| metrics_df_ticker = metrics_df_ticker.reset_index().sort_values("ticker") |
| metrics_df_ticker.rename( |
| columns={ |
| "ticker": "Ticker", |
| "model_config": "Model Config", |
| "mape": "MAPE", |
| "mae": "MAE", |
| "rmse": "RMSE", |
| "bias": "Bias (mean error)", |
| }, |
| inplace=True, |
| ) |
|
|
| return metrics_df_date, metrics_df_ticker, worst_tickers |
|
|