{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "7fb27b941602401d91542211134fc71a",
   "metadata": {},
   "source": [
    "# Reinforcement Learning Course Kit: Logged Support Triage Policy\n",
    "\n",
    "Use this notebook to audit logged decision data before trusting offline policy evaluation. Reward is not enough; support and guardrails decide whether a learned policy can be used.\n",
    "\n",
    "Dataset path on the education site: `/course-kits/reinforcement-learning/support_triage_logs.csv`.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "acae54e37e7d407bbb7b55eff062a284",
   "metadata": {},
   "source": [
    "## 1. Load the data\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9a63283cbaf04dbcab1f6479b197f3a8",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "\n",
    "DATA_URL = \"https://education.dooperator.ai/course-kits/reinforcement-learning/support_triage_logs.csv\"\n",
    "df = pd.read_csv(DATA_URL)\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8dd0d8092fe74a7c96281538738b07e2",
   "metadata": {},
   "source": [
    "## 2. Core summary\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "72eea5119410473aa328ad9291626812",
   "metadata": {},
   "outputs": [],
   "source": [
    "actions = (\n",
    "    df.groupby(\"action\")\n",
    "    .agg(\n",
    "        tickets=(\"ticket_id\", \"count\"),\n",
    "        avg_behavior_probability=(\"behavior_probability\", \"mean\"),\n",
    "        resolved_24h_rate=(\"resolved_24h\", \"mean\"),\n",
    "        escalation_rate=(\"escalated\", \"mean\"),\n",
    "        avg_csat=(\"csat\", \"mean\"),\n",
    "    )\n",
    "    .sort_values(\"tickets\", ascending=False)\n",
    ")\n",
    "actions"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8edb47106e1a46a883d545849b8ab81b",
   "metadata": {},
   "source": [
    "## 3. Diagnostic check\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "10185d26023b46108eb7d9f57d49d2b3",
   "metadata": {},
   "outputs": [],
   "source": [
    "support = (\n",
    "    df.groupby([\"urgency\", \"action\"])\n",
    "    .agg(\n",
    "        tickets=(\"ticket_id\", \"count\"),\n",
    "        min_behavior_probability=(\"behavior_probability\", \"min\"),\n",
    "        resolved_24h_rate=(\"resolved_24h\", \"mean\"),\n",
    "        escalation_rate=(\"escalated\", \"mean\"),\n",
    "    )\n",
    "    .reset_index()\n",
    ")\n",
    "support"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8763a12b2bbd4a93a75aff182afb95dc",
   "metadata": {},
   "source": [
    "## 4. Decision memo prompt\n",
    "\n",
    "Write a policy-readiness note: what the logs support, where the candidate policy must be constrained, which guardrails must be monitored, and which cases need human fallback.\n",
    "\n",
    "Keep the memo decision-oriented: say what you would do next, what assumption could break the recommendation, and what evidence would change your mind.\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "pygments_lexer": "ipython3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
