{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Use HOOT to compute CER\n",
    "\n",
    "should help filtering out some tails of data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-11-17T23:02:32.745724Z",
     "iopub.status.busy": "2024-11-17T23:02:32.745591Z",
     "iopub.status.idle": "2024-11-17T23:02:37.499167Z",
     "shell.execute_reply": "2024-11-17T23:02:37.498526Z",
     "shell.execute_reply.started": "2024-11-17T23:02:32.745710Z"
    }
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import json\n",
    "from suno_utils.tasks.hoot import clean_text\n",
    "from suno_utils.utils.metrics import get_cer\n",
    "import os\n",
    "import tqdm\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-11-17T23:02:37.500293Z",
     "iopub.status.busy": "2024-11-17T23:02:37.499890Z",
     "iopub.status.idle": "2024-11-17T23:02:48.320106Z",
     "shell.execute_reply": "2024-11-17T23:02:48.319352Z",
     "shell.execute_reply.started": "2024-11-17T23:02:37.500275Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(523076, 68)\n"
     ]
    }
   ],
   "source": [
    "data_path = \"/home/tony/Data/Preference/30b_v6/interesting_clips_v4_t_6_20241117_full.pkl\"\n",
    "# data_path = \"/home/tony/Data/Preference/30b_v3/interesting_clips_v4_t_4_20241007_full.pkl\"\n",
    "# data_path = \"/home/tony/Data/Preference/30b_v3/interesting_clips_v4_t_4_20240925_full_l10.pkl\"\n",
    "# data_path = \"/home/tony/Data/Preference/30b_v0/interesting_clips_v4_t_1_20240808_v22_slice.pkl\"\n",
    "# data_path = \"/home/tony/Data/Preference/30b_v1/interesting_clips_v4_t_2_20240830_v16_slice.pkl\"\n",
    "JSON_DIR = \"/app/suno/data/dpo/30b_json\"\n",
    "\n",
    "# data_path = \"/home/tony/Data/Preference/13b_v31/interesting_clips_13b_s31_20241115_full.pkl\"\n",
    "# JSON_DIR = \"/app/suno/data/dpo/13b_s31_json\"\n",
    "df = pd.read_pickle(data_path)\n",
    "print(df.shape)\n",
    "df = df.sort_values(by=[\"request_id\", \"preference\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-11-17T23:02:48.321160Z",
     "iopub.status.busy": "2024-11-17T23:02:48.320877Z",
     "iopub.status.idle": "2024-11-17T23:02:48.323814Z",
     "shell.execute_reply": "2024-11-17T23:02:48.323329Z",
     "shell.execute_reply.started": "2024-11-17T23:02:48.321141Z"
    }
   },
   "outputs": [],
   "source": [
    "# id_to_cer = {}\n",
    "# for i, row in tqdm.tqdm(df.iterrows(), total=df.shape[0]):\n",
    "#     prompt_text = row[\"prompt_text\"]\n",
    "#     cleaned_prompt_text = clean_text(prompt_text)\n",
    "#     s3_id = row[\"s3_id\"]\n",
    "#     expected_json_path = f\"{JSON_DIR}/{s3_id}_hoot.json\"\n",
    "#     if not os.path.exists(expected_json_path):\n",
    "#         # print(f\"File not found: {expected_json_path}\")\n",
    "#         continue\n",
    "#     with open(expected_json_path, \"r\") as f:\n",
    "#         expected_json = json.load(f)\n",
    "#     for data_dict in expected_json:\n",
    "#         if \"hoot_lyrics\" in data_dict:\n",
    "#             hooted_text = data_dict[\"hoot_lyrics\"]\n",
    "#             cer = get_cer(cleaned_prompt_text, hooted_text)\n",
    "#             id_to_cer[s3_id] = round(cer, 4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-11-17T23:02:48.324539Z",
     "iopub.status.busy": "2024-11-17T23:02:48.324400Z",
     "iopub.status.idle": "2024-11-17T23:04:32.011348Z",
     "shell.execute_reply": "2024-11-17T23:04:32.010693Z",
     "shell.execute_reply.started": "2024-11-17T23:02:48.324525Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████| 523076/523076 [00:28<00:00, 18634.07it/s]\n"
     ]
    }
   ],
   "source": [
    "id_to_cer = {}\n",
    "# Preprocess the dataframe to avoid repeated operations\n",
    "df['cleaned_prompt_text'] = df['prompt_text'].apply(lambda x: clean_text(str(x)))\n",
    "\n",
    "# Use multiprocessing to speed up the process\n",
    "from multiprocessing import Pool, cpu_count\n",
    "\n",
    "def process_row(row):\n",
    "    s3_id = row['s3_id']\n",
    "    cleaned_prompt_text = row['cleaned_prompt_text']\n",
    "    expected_json_path = f\"{JSON_DIR}/{s3_id}_hoot.json\"\n",
    "    if not os.path.exists(expected_json_path):\n",
    "        return s3_id, 0\n",
    "    with open(expected_json_path, \"r\") as f:\n",
    "        expected_json = json.load(f)\n",
    "    for data_dict in expected_json:\n",
    "        if \"hoot_lyrics\" in data_dict:\n",
    "            hooted_text = data_dict[\"hoot_lyrics\"]\n",
    "            cer = get_cer(cleaned_prompt_text, hooted_text)\n",
    "            return s3_id, round(cer, 4)\n",
    "    # if no hooted text, set cer to 0\n",
    "    return s3_id, 0\n",
    "\n",
    "# Use all available CPU cores\n",
    "with Pool(cpu_count() - 1) as p:\n",
    "    results = list(tqdm.tqdm(p.imap(process_row, df.to_dict('records')), total=df.shape[0]))\n",
    "\n",
    "# Filter out None results and create the id_to_cer dictionary\n",
    "id_to_cer = dict(filter(None, results))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-11-17T23:04:32.012209Z",
     "iopub.status.busy": "2024-11-17T23:04:32.012044Z",
     "iopub.status.idle": "2024-11-17T23:04:32.186234Z",
     "shell.execute_reply": "2024-11-17T23:04:32.185615Z",
     "shell.execute_reply.started": "2024-11-17T23:04:32.012192Z"
    }
   },
   "outputs": [],
   "source": [
    "df[\"cer\"] = df[\"s3_id\"].map(id_to_cer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-11-17T23:04:32.187961Z",
     "iopub.status.busy": "2024-11-17T23:04:32.187554Z",
     "iopub.status.idle": "2024-11-17T23:04:32.212541Z",
     "shell.execute_reply": "2024-11-17T23:04:32.212101Z",
     "shell.execute_reply.started": "2024-11-17T23:04:32.187942Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "count    523076.000000\n",
       "mean          0.320539\n",
       "std           0.312440\n",
       "min           0.000000\n",
       "25%           0.069400\n",
       "50%           0.212100\n",
       "75%           0.489000\n",
       "max           1.000000\n",
       "Name: cer, dtype: float64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"cer\"].describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-11-17T23:04:32.213303Z",
     "iopub.status.busy": "2024-11-17T23:04:32.213157Z",
     "iopub.status.idle": "2024-11-17T23:04:34.373207Z",
     "shell.execute_reply": "2024-11-17T23:04:34.372576Z",
     "shell.execute_reply.started": "2024-11-17T23:04:32.213288Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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Wxpse0+6efMmhgwZItZh5MiRuHfvXpnrvP3222jQoAFsbGxQu3Zt9OnTB2fPntVp89577yEgIABWVlal9l8QBCxYsACNGjWClZUVXnjhBcydO9dQh1YihhwiIqpW5s+fj6VLlyIuLg6HDx9GjRo1EBISgry8vFLXqVu3LubNm4fU1FQcOXIEHTt2xKuvvopTp04BAC5fvozLly9jwYIF+PPPPxEfH4/ExESMHDlS3MYff/yBXr16oUePHjh+/Dg2btyIbdu2YerUqUY/ZkMZMmQITp06BZVKhe3bt2P//v0YM2ZMmesEBARg9erVOHPmDHbu3AlBEBAcHIzCwkKddm+99RYGDhxY6nbGjx+PlStXYsGCBTh79iy2bduGtm3bGuS4SsOQQ0RUBbp06YL33nsPkydPhrOzM1xdXTFr1iydNrdv38aoUaNQu3ZtKBQKvPzyy/jjjz902syZMwd16tSBvb09Ro0ahalTp5Y5ErB3717IZDLs3LkTrVq1go2NDV5++WVcvXoVv/zyC3x9faFQKDB48GDcv39fXK+oqAgxMTHw9vaGjY0NWrRoge+//15cXlhYiJEjR4rLGzdujCVLlujse/jw4ejbty8WLFgANzc31KxZE+Hh4dBoNBWumyAIWLx4MaZPn44+ffrA398fa9euxeXLl7F169ZS1+vduzd69eqFhg0bolGjRvjoo49gZ2eHQ4cOAQCaNWuGH374Ab1790aDBg3w8ssvY+7cufj555/FkZqNGzfC398f0dHR8PHxQefOnTF//nzExsbi7t27FT6GvXv3om3btqhRowYcHR3RoUMHXLp0CfHx8Zg1axb++OMPyGQyyGQyxMfHAwDOnTuHTp06wdraGn5+flCpVBXen9aZM2eQmJiIlStXIjAwEC+99BKWLVuGDRs24PLly6WuN2bMGHTq1AleXl5o3bo15syZg7///hsXL14U2yxduhTh4eGoX79+qftesWIFfvrpJ7zyyivw9vZGQEAAunfvrvdx6IMhh4ioiqxZswY1atTA4cOHMX/+fMyePRt79uwRl7/++uti+EhNTUXr1q3RrVs33Lx5EwCwbt06zJ07F59++ilSU1NRr149rFixokL7njlzJpYvX46DBw/i77//xoABA7B48WKsX78eO3bsQFJSEpYtWya2j4mJwdq1axEXF4dTp05h4sSJePPN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57cdOsdg+6D/6ty9e3c+68LIWGvTYJ1Ng3U2DWPWWXsmpjx6hxy5XA4fHx8AQEBAAH7//XcsWbIEAwcOREFBAW7fvq0zmpOdnS0+ltnV1bXYXVDau68eb/PkHVnZ2dlQKBSwsbERH/hVUpvyHv9sZWUFKyurYvMtLS2N8oNuJhTqhBz+MhmHsf79qDjW2jRYZ9NgnU3DGHWu6Pae+jk5RUVFyM/PR0BAACwtLZGcnCwuS09PR1ZWFpRKJQBAqVTi5MmTOndBqVQqKBQK+Pn5iW0e34a2jXYbcrkcAQEBOm2KioqQnJwstiEiIiLSayQnKioKPXv2RL169XD37l2sX78ee/fuxc6dO+Hg4ICRI0ciMjISzs7OUCgUePfdd6FUKtGuXTsAQHBwMPz8/DB06FDMnz8farUa06dPR3h4uDjCMnbsWCxfvhyTJ0/GW2+9hd27d2PTpk3YsWOH2I/IyEiEhYWhTZs2aNu2LRYvXozc3FyMGDHCgKUhIiKi6kyvkHP16lUMGzYMV65cgYODA/z9/bFz5050794dALBo0SKYmZmhX79+yM/PR0hICL744gtxfXNzc2zfvh3jxo2DUqlEjRo1EBYWho8//lhs4+3tjR07dmDixIlYsmQJ6tati5UrVyIkJERsM3DgQFy7dg3R0dFQq9Vo2bIlEhMTi12MTERERM8vvULOqlWrylxubW2N2NhYxMbGltrG09Oz3LuMunTpguPHj5fZJiIiAhEREWW2ISIioucX311FREREksSQQ0RERJLEkENERESSxJBDREREksSQQ0RERJLEkENERESSxJBDREREksSQQ0RERJLEkENERESSxJBDREREksSQQ0RERJLEkENERESSxJBDREREksSQQ0RERJLEkENERESSxJBDREREksSQQ0RERJLEkENERESSxJBDREREksSQQ0RERJLEkENERESSxJBDREREksSQQ0RERJLEkENERESSxJBDREREksSQQ0RERJLEkENERESSxJBDREREksSQQ0RERJLEkENERESSxJBDREREksSQQ0RERJLEkENERESSxJBDREREksSQQ0RERJLEkENERESSxJBDREREksSQQ0RERJLEkENERESSxJBDREREkqRXyImJicGLL74Ie3t71KlTB3379kV6erpOmy5dukAmk+l8jR07VqdNVlYWQkNDYWtrizp16mDSpEl4+PChTpu9e/eidevWsLKygo+PD+Lj44v1JzY2Fl5eXrC2tkZgYCCOHDmiz+EQERGRhOkVcvbt24fw8HAcOnQIKpUKGo0GwcHByM3N1Wk3evRoXLlyRfyaP3++uKywsBChoaEoKCjAwYMHsWbNGsTHxyM6Olpsk5mZidDQUHTt2hVpaWmYMGECRo0ahZ07d4ptNm7ciMjISMyYMQPHjh1DixYtEBISgqtXr1a2FkRERCQhFvo0TkxM1JmOj49HnTp1kJqaik6dOonzbW1t4erqWuI2kpKScPr0aezatQsuLi5o2bIlZs+ejSlTpmDmzJmQy+WIi4uDt7c3Fi5cCADw9fXFgQMHsGjRIoSEhAAAPv/8c4wePRojRowAAMTFxWHHjh34+uuvMXXqVH0Oi4iIiCRIr5DzpDt37gAAnJ2ddeavW7cO3377LVxdXdG7d2989NFHsLW1BQCkpKSgefPmcHFxEduHhIRg3LhxOHXqFFq1aoWUlBQEBQXpbDMkJAQTJkwAABQUFCA1NRVRUVHicjMzMwQFBSElJaXU/ubn5yM/P1+czsnJAQBoNBpoNJpKVKBk2m0VycxLnE+Goa0n62p8rLVpsM6mwTqbhjHrXNFtVjrkFBUVYcKECejQoQOaNWsmzh88eDA8PT3h7u6OEydOYMqUKUhPT8ePP/4IAFCr1ToBB4A4rVary2yTk5ODBw8e4NatWygsLCyxzdmzZ0vtc0xMDGbNmlVsflJSkhjCDOmmc6DOdEJCgsH3QYBKparqLjw3WGvTYJ1Ng3U2DWPU+f79+xVqV+mQEx4ejj///BMHDhzQmT9mzBjx++bNm8PNzQ3dunVDRkYGGjRoUNndGURUVBQiIyPF6ZycHHh4eCA4OBgKhcJg+9FoNFCpVHC+eRhmQqE4v+3QOQbbB/1X5+7du8PS0rKquyNprLVpsM6mwTqbhjHrrD0TU55KhZyIiAhs374d+/fvR926dctsGxj4aDTj/PnzaNCgAVxdXYvdBZWdnQ0A4nU8rq6u4rzH2ygUCtjY2MDc3Bzm5uYltintWiAAsLKygpWVVbH5lpaWRvlBNxMKdUIOf5mMw1j/flQca20arLNpsM6mYYw6V3R7et1dJQgCIiIisGXLFuzevRve3t7lrpOWlgYAcHNzAwAolUqcPHlS5y4olUoFhUIBPz8/sU1ycrLOdlQqFZRKJQBALpcjICBAp01RURGSk5PFNkRERPR802skJzw8HOvXr8dPP/0Ee3t78RoaBwcH2NjYICMjA+vXr0evXr1Qs2ZNnDhxAhMnTkSnTp3g7+8PAAgODoafnx+GDh2K+fPnQ61WY/r06QgPDxdHWcaOHYvly5dj8uTJeOutt7B7925s2rQJO3bsEPsSGRmJsLAwtGnTBm3btsXixYuRm5sr3m1FREREzze9Qs6KFSsAPHrg3+NWr16N4cOHQy6XY9euXWLg8PDwQL9+/TB9+nSxrbm5ObZv345x48ZBqVSiRo0aCAsLw8cffyy28fb2xo4dOzBx4kQsWbIEdevWxcqVK8XbxwFg4MCBuHbtGqKjo6FWq9GyZUskJiYWuxiZiIiInk96hRxBEMpc7uHhgX379pW7HU9Pz3LvNOrSpQuOHz9eZpuIiAhERESUuz8iIiJ6/vDdVURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJeoWcmJgYvPjii7C3t0edOnXQt29fpKen67TJy8tDeHg4atasCTs7O/Tr1w/Z2dk6bbKyshAaGgpbW1vUqVMHkyZNwsOHD3Xa7N27F61bt4aVlRV8fHwQHx9frD+xsbHw8vKCtbU1AgMDceTIEX0Oh4iIiCRMr5Czb98+hIeH49ChQ1CpVNBoNAgODkZubq7YZuLEifj555+xefNm7Nu3D5cvX8Zrr70mLi8sLERoaCgKCgpw8OBBrFmzBvHx8YiOjhbbZGZmIjQ0FF27dkVaWhomTJiAUaNGYefOnWKbjRs3IjIyEjNmzMCxY8fQokULhISE4OrVq09TDyIiIpIIC30aJyYm6kzHx8ejTp06SE1N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OURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEl6h5z9+/ejd+/ecHd3h0wmw9atW3WWC4KA6OhouLm5wcbGBkFBQTh37pxOm5s3b2LIkCFQKBRwdHTEyJEjce/ePZ02J06cQMeOHWFtbQ0PDw/Mnz+/WF82b96MJk2awNraGs2bN0dCQoK+h0NEREQSpXfIyc3NRYsWLRAbG1vi8vnz52Pp0qWIi4vD4cOHUaNGDYSEhCAvL09sM2TIEJw6dQoqlQrbt2/H/v37MWbMGHF5Tk4OgoOD4enpidTUVHz22WeYOXMmvvzyS7HNwYMH8cYbb2DkyJE4fvw4+vbti759++LPP//U95CIiIhIgiz0XaFnz57o2bNnicsEQcDixYsxffp09OnTBwCwdu1auLi4YOvWrRg0aBDOnDmDxMRE/P7772jTpg0AYNmyZejVqxcWLFgAd3d3rFu3DgUFBfj6668hl8vRtGlTpKWl4fPPPxfD0JIlS9CjRw9MmjQJADB79myoVCosX74ccXFxlSoGERERSYfeIacsmZmZUKvVCAoKEuc5ODggMDAQKSkpGDRoEFJSUuDo6CgGHAAICgqCmZkZDh8+jFdffRUpKSno1KkT5HK52CYkJASffvopbt26BScnJ6SkpCAyMlJn/yEhIcVOnz0uPz8f+fn54nROTg4AQKPRQKPRPO3hi7TbKpKZlzifDENbT9bV+Fhr02CdTYN1Np7HP/e03xujzhXdpkFDjlqtBgC4uLjozHdxcRGXqdVq1KlTR7cTFhZwdnbWaePt7V1sG9plTk5OUKvVZe6nJDExMZg1a1ax+UlJSbC1ta3IIerlpnOgzjSvGTIOlUpV1V14brDWpsE6mwbrbAQ12xebZYw6379/v0LtDBpynnVRUVE6oz85OTnw8PBAcHAwFAqFwfaj0WigUqngfPMwzIRCcX7boXMMtg/6r87du3eHpaVlVXdH0lhr02CdTYN1Np4j30wXvy+SmeOmc6BR6qw9E1Meg4YcV1dXAEB2djbc3NzE+dnZ2WjZsqXY5urVqzrrPXz4EDdv3hTXd3V1RXZ2tk4b7XR5bbTLS2JlZQUrK6ti8y0tLY3yg24mFOqEHP4yGYex/v2oONbaNFhn02CdDe/xzzwtY9S5otsz6HNyvL294erqiuTkZHFeTk4ODh8+DKVSCQBQKpW4ffs2UlNTxTa7d+9GUVERAgMDxTb79+/XOeemUqnQuHFjODk5iW0e34+2jXY/RERE9HzTO+Tcu3cPaWlpSEtLA/DoYuO0tDRkZWVBJpNhwoQJmDNnDrZt24aTJ09i2LBhcHd3R9++fQEAvr6+6NGjB0aPHo0jR47gt99+Q0REBAYNGgR3d3cAwODBgyGXyzFy5EicOnUKGzduxJIlS3RONY0fPx6JiYlYuHAhzp49i5kzZ+Lo0aOIiIh4+qoQERFRtaf36aqjR4+ia9eu4rQ2eISFhSE+Ph6TJ09Gbm4uxowZg9u3b+Oll15CYmIirK2txXXWrVuHiIgIdOvWDWZmZujXrx+WLl0qLndwcEBSUhLCw8MREBCAWrVqITo6WudZOu3bt8f69esxffp0fPjhh2jYsCG2bt2KZs2aVaoQREREJC16h5wuXbpAEIRSl8tkMnz88cf4+OOPS23j7OyM9evXl7kff39//Prrr2W2ef311/H666+X3WEiIiJ6LvHdVURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSQw5REREJEkMOURERCRJDDlEREQkSRZV3QHS3yLVXzrTE7s3qqKeEBERPbsYcp5xTwaairZh8CEioucdT1cRERGRJDHkEBERkSTxdFU11C7rS53pQ/XGFGvD63aIiOh5x5DzjKnINThERERUPoYcCXhyZAcoPrrDi5OJiOh5w5DzjCspwFRmvZJOaREREUkZLzwmIiIiSWLIISIiIkni6arnRMmnvRaYvB9ERESmYvCRnJkzZ0Im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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "df[df[\"preference\"]][\"cer\"].hist(bins=100, alpha=0.5, label=f\"pos mean: {df[df['preference']]['cer'].mean():.3f}, std: {df[df['preference']]['cer'].std():.3f}\")\n",
    "df[~df[\"preference\"]][\"cer\"].hist(bins=100, alpha=0.5, label=f\"neg mean: {df[~df['preference']]['cer'].mean():.3f}, std: {df[~df['preference']]['cer'].std():.3f}\")\n",
    "plt.legend()\n",
    "plt.title(\"CER Distribution\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-11-17T23:04:34.374073Z",
     "iopub.status.busy": "2024-11-17T23:04:34.373823Z",
     "iopub.status.idle": "2024-11-17T23:04:48.218957Z",
     "shell.execute_reply": "2024-11-17T23:04:48.218241Z",
     "shell.execute_reply.started": "2024-11-17T23:04:34.374056Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(523076, 70)\n"
     ]
    }
   ],
   "source": [
    "print(df.shape)\n",
    "df.to_pickle(f\"{data_path.replace('.pkl', '_with_cer.pkl')}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
