From 5011b448cfd58e651896d81284261be81fcbd810 Mon Sep 17 00:00:00 2001
From: "Daniel.Frisinghelli" <daniel.frisinghelli@eurac.edu>
Date: Tue, 28 Sep 2021 15:59:13 +0000
Subject: [PATCH] Added ROCSS for different thresholds.

---
 .../eval_precipitation_sensitivity.ipynb      | 28 +++++++++++++++++--
 1 file changed, 26 insertions(+), 2 deletions(-)

diff --git a/Notebooks/eval_precipitation_sensitivity.ipynb b/Notebooks/eval_precipitation_sensitivity.ipynb
index 7da3235..eb55dd8 100644
--- a/Notebooks/eval_precipitation_sensitivity.ipynb
+++ b/Notebooks/eval_precipitation_sensitivity.ipynb
@@ -334,13 +334,37 @@
     "    print('({:.1f} mm), RMSE of P{:.0f} = {:.2f} mm'.format(k, quantile * 100, rmse_ex.mean().to_array().item()))"
    ]
   },
+  {
+   "cell_type": "markdown",
+   "id": "f6dfd17e-6eb4-465f-a624-bd5c8f79c99b",
+   "metadata": {},
+   "source": [
+    "### ROC: Receiver operating characteristics"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "26b130a6-5caa-490f-93ce-72f4a5f53412",
+   "id": "92733418-8840-46c2-bf33-adf93b78c646",
    "metadata": {},
    "outputs": [],
-   "source": []
+   "source": [
+    "# true and predicted probability of precipitation\n",
+    "for k, v in y_pred.items():\n",
+    "    p_true = (y_true.precipitation > k).values.flatten()\n",
+    "    p_pred = v.prob.values.flatten()\n",
+    "    \n",
+    "    # apply mask of valid pixels\n",
+    "    mask = (~np.isnan(p_true) & ~np.isnan(p_pred))\n",
+    "    p_pred = p_pred[mask]\n",
+    "    p_true = p_true[mask].astype(float)\n",
+    "    \n",
+    "    # calculate ROC: false positive rate vs. true positive rate\n",
+    "    fpr, tpr, _ = roc_curve(p_true, p_pred)\n",
+    "    area = auc(fpr, tpr) # area under ROC curve\n",
+    "    rocss = 2 * area - 1 # ROC skill score (cf. https://journals.ametsoc.org/view/journals/clim/16/24/1520-0442_2003_016_4145_otrsop_2.0.co_2.xml)\n",
+    "    print('({:.1f} mm), ROCSS = {:.2f}'.format(k, rocss))"
+   ]
   }
  ],
  "metadata": {
-- 
GitLab