{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:38:25.165274Z",
     "start_time": "2024-04-12T15:38:23.675301Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_2966002/2858474091.py:1: DeprecationWarning: \n",
      "Pyarrow will become a required dependency of pandas in the next major release of pandas (pandas 3.0),\n",
      "(to allow more performant data types, such as the Arrow string type, and better interoperability with other libraries)\n",
      "but was not found to be installed on your system.\n",
      "If this would cause problems for you,\n",
      "please provide us feedback at https://github.com/pandas-dev/pandas/issues/54466\n",
      "        \n",
      "  import pandas as pd\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import os\n",
    "from tqdm import tqdm\n",
    "from sklearn.model_selection import train_test_split\n",
    "from suno_utils.utils.s3 import download_s3_files\n",
    "import sys\n",
    "from collections import defaultdict\n",
    "from suno_utils.utils.text import (\n",
    "    write_jsonl,\n",
    "    read_jsonl,\n",
    "    write_json,\n",
    "    read_json,\n",
    ")\n",
    "import ast\n",
    "from preference_helper import *\n",
    "\n",
    "sys.path.insert(0, \"/home/tony/Work/glockenspiel/sunoGPT/scripts/\")\n",
    "\n",
    "from data_preparation_7b import *\n",
    "import numpy as np\n",
    "\n",
    "pd.set_option('display.max_rows', 500)\n",
    "pd.set_option('display.max_columns', 500)\n",
    "pd.set_option('display.width', 1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:38:25.169086Z",
     "start_time": "2024-04-12T15:38:25.166868Z"
    }
   },
   "outputs": [],
   "source": [
    "OUT_DATA_DIR = \"/app/suno/data/dpo/7v_v21_full/\"\n",
    "# OUT_DATA_DIR = \"/home/tony/Data/test/7v_v6_full/\"\n",
    "os.makedirs(OUT_DATA_DIR, exist_ok=True)\n",
    "NPZ_DIR = \"/app/suno/data/dpo/v3_npz\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:39:27.785420Z",
     "start_time": "2024-04-12T15:38:25.170885Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1822704, 41)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv(\"/home/tony/Data/Preference/7b_v0/interesting_clips.csv\")\n",
    "df.shape\n",
    "# v0: (68746, 31)\n",
    "# v5: (938008, 37)\n",
    "# v6: (1097024, 38)\n",
    "# v21: (1822704, 41)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:39:27.789279Z",
     "start_time": "2024-04-12T15:39:27.787036Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1822704, 41)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:39:28.230726Z",
     "start_time": "2024-04-12T15:39:27.790267Z"
    }
   },
   "outputs": [],
   "source": [
    "# download all clips; 883k\n",
    "from suno_utils.utils.s3 import download_s3_files\n",
    "\n",
    "s3_ids = df[\"s3_id\"].values\n",
    "s3_paths = [f\"s3://suno-data-uploads/studio/uploads/{s3_id}.npz\" for s3_id in s3_ids]\n",
    "local_paths = [f\"{NPZ_DIR}/{s3_id}.npz\" for s3_id in s3_ids]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:39:28.233959Z",
     "start_time": "2024-04-12T15:39:28.232430Z"
    }
   },
   "outputs": [],
   "source": [
    "# finished_paths = os.listdir(NPZ_DIR)\n",
    "# finished_paths_set = set(finished_paths)\n",
    "# unfinished_s3_paths = [\n",
    "#     path for path in s3_paths if os.path.basename(path) not in finished_paths_set\n",
    "# ]\n",
    "# unfinished_paths = [\n",
    "#     path for path in local_paths if os.path.basename(path) not in finished_paths_set\n",
    "# ]\n",
    "# print(\"jobs to be done\", len(unfinished_paths), len(unfinished_s3_paths))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:39:28.334307Z",
     "start_time": "2024-04-12T15:39:28.235009Z"
    }
   },
   "outputs": [],
   "source": [
    "# _ = download_s3_files(unfinished_s3_paths, unfinished_paths, n_cores=32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:39:28.398509Z",
     "start_time": "2024-04-12T15:39:28.335528Z"
    }
   },
   "outputs": [],
   "source": [
    "# # # deleted files are at: deleted; try to get them as well\n",
    "# finished_paths = os.listdir(NPZ_DIR)\n",
    "# finished_paths_set = set(finished_paths)\n",
    "# unfinished_s3_paths = [\n",
    "#     path for path in s3_paths if os.path.basename(path) not in finished_paths_set\n",
    "# ]\n",
    "# unfinished_paths = [\n",
    "#     path for path in local_paths if os.path.basename(path) not in finished_paths_set\n",
    "# ]\n",
    "# print(\"jobs to be done\", len(unfinished_paths), len(unfinished_s3_paths))\n",
    "# unfinished_deleted_s3_paths = [\n",
    "#     path.replace(\"/uploads/\", \"/deleted/\") for path in unfinished_s3_paths\n",
    "# ]\n",
    "# _ = download_s3_files(unfinished_deleted_s3_paths, unfinished_paths, n_cores=32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:39:28.460938Z",
     "start_time": "2024-04-12T15:39:28.399545Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Finish downloads\n"
     ]
    }
   ],
   "source": [
    "print(\"Finish downloads\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:39:30.994188Z",
     "start_time": "2024-04-12T15:39:28.462978Z"
    }
   },
   "outputs": [],
   "source": [
    "converted_paths = os.listdir(NPZ_DIR)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:39:30.997475Z",
     "start_time": "2024-04-12T15:39:30.995928Z"
    }
   },
   "outputs": [],
   "source": [
    "# # don't run this unless you kill some job accidentally\n",
    "# for processed_file in tqdm.tqdm(converted_paths):\n",
    "#     processed_file_path = os.path.join(\"/app/suno/data/dpo/7b_npz\", processed_file)\n",
    "#     # could have been removed already\n",
    "#     if os.path.exists(processed_file_path):\n",
    "#         file_size = os.stat(processed_file_path).st_size\n",
    "#         # print(processed_file_path, file_size)\n",
    "#         # break\n",
    "#         if file_size < 1000:\n",
    "#             print(processed_file_path, file_size)\n",
    "#             os.remove(processed_file_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:39:32.940079Z",
     "start_time": "2024-04-12T15:39:30.998393Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "6545245\n"
     ]
    }
   ],
   "source": [
    "converted_paths = set([f.replace(\".npz\", \"\") for f in converted_paths])\n",
    "print(len(converted_paths))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:39:41.660884Z",
     "start_time": "2024-04-12T15:39:32.941360Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "pre-downloaded df (1822704, 41)\n",
      "downloaded df (1822704, 41)\n"
     ]
    }
   ],
   "source": [
    "print(\"pre-downloaded df\", df.shape)\n",
    "df[df[\"s3_id\"].isin(converted_paths)].shape\n",
    "df = df[df[\"s3_id\"].isin(converted_paths)].copy()\n",
    "print(\"downloaded df\", df.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:39:42.274109Z",
     "start_time": "2024-04-12T15:39:41.662183Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "is_7b\n",
       "True    1822704\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"is_7b\"] = df[\"model_name\"].str.contains(\"v3\")\n",
    "df[\"is_7b\"].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# LET's do the data prep"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:39:42.727924Z",
     "start_time": "2024-04-12T15:39:42.275282Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "preference  model_name         \n",
      "False       chirp-v3-engine-v0     478570\n",
      "            chirp-v3-engine-d      383156\n",
      "            chirp-v3-engine-i       47302\n",
      "            chirp-v3-engine-i-d      2222\n",
      "            chirp-v3-alpha            102\n",
      "True        chirp-v3-engine-d      534973\n",
      "            chirp-v3-engine-v0     316186\n",
      "            chirp-v3-engine-i       57984\n",
      "            chirp-v3-engine-i-d      2120\n",
      "            chirp-v3-alpha             88\n",
      "            chirp-v3-engine-exp         1\n",
      "Name: count, dtype: int64\n",
      "(1822704, 42)\n",
      "(1712885, 42)\n"
     ]
    }
   ],
   "source": [
    "# # let's also kick out the ... ipo and ipo-dpoed model for now?\n",
    "print(df.groupby([\"preference\"])[\"model_name\"].value_counts())\n",
    "print(df.shape)\n",
    "# df = df[df[\"model_name\"].isin([\"chirp-v3-engine-d\", \"chirp-v3-engine-v0\", \"chirp-v3-engine-i\"])]\n",
    "df = df[df[\"model_name\"].isin([\"chirp-v3-engine-d\", \"chirp-v3-engine-v0\"])]\n",
    "# df = df[df[\"model_name\"].isin([\"chirp-v3-engine-v0\"])]\n",
    "print(df.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:39:44.504772Z",
     "start_time": "2024-04-12T15:39:42.729211Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1712885, 42)\n",
      "(1630516, 42)\n"
     ]
    }
   ],
   "source": [
    "print(df.shape)\n",
    "df = df[\n",
    "    df[\"request_id\"].isin(\n",
    "        df[\"request_id\"].value_counts().index[df[\"request_id\"].value_counts() == 2]\n",
    "    )\n",
    "]\n",
    "print(df.shape)\n",
    "assert df.shape[0] == df[\"request_id\"].nunique() * 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:45:28.462257Z",
     "start_time": "2024-04-12T15:39:44.506060Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "unique_requests 815258\n"
     ]
    }
   ],
   "source": [
    "# expand the metadata columns -- this takes forever...~ 6 mins\n",
    "test_slice = df[\"metadata\"].apply(lambda x: ast.literal_eval(x))\n",
    "test_slice_series = test_slice.apply(pd.Series)\n",
    "df = pd.concat([df, test_slice_series], axis=1, join=\"inner\")\n",
    "print(\"unique_requests\", df[\"request_id\"].nunique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:45:30.794104Z",
     "start_time": "2024-04-12T15:45:28.488174Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "unique_requests 815258\n"
     ]
    }
   ],
   "source": [
    "# double check we removed the gpt prompted ones for now\n",
    "df = df[df[\"has_gpt_prompt\"] == False]\n",
    "print(\"unique_requests\", df[\"request_id\"].nunique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:45:30.801703Z",
     "start_time": "2024-04-12T15:45:30.795418Z"
    }
   },
   "outputs": [],
   "source": [
    "# get the original duration of the clips, if they are concacted\n",
    "df[\"original_duration_s\"] = df[\"total_start_s\"] + df[\"duration\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:07.052308Z",
     "start_time": "2024-04-12T15:45:30.803305Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "345418\n",
      "good_continue_at\n",
      "True     1608119\n",
      "False      22397\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "# classify the continue at behavoirs by the duration choice\n",
    "audio_prompt_id_to_continue_at = {}\n",
    "for _, row in df[~df[\"audio_prompt_id\"].isna()].iterrows():\n",
    "    audio_prompt_id = row[\"audio_prompt_id\"]\n",
    "    if audio_prompt_id not in audio_prompt_id_to_continue_at:\n",
    "        audio_prompt_id_to_continue_at[audio_prompt_id] = row[\"continue_at\"]\n",
    "    else:\n",
    "        # pick the max\n",
    "        audio_prompt_id = max(\n",
    "            audio_prompt_id_to_continue_at[audio_prompt_id], row[\"continue_at\"]\n",
    "        )\n",
    "print(len(audio_prompt_id_to_continue_at))\n",
    "df[\"has_continue_and_start_continue_at\"] = df[\"id\"].apply(\n",
    "    lambda x: audio_prompt_id_to_continue_at.get(x)\n",
    ")\n",
    "# we want continue at to be at least half of the clip...\n",
    "df[\"good_continue_at\"] = (\n",
    "    (df[\"has_continue_and_start_continue_at\"] / df[\"duration\"]) > 0.9\n",
    ") | df[\"has_continue_and_start_continue_at\"].isna()\n",
    "print(df[\"good_continue_at\"].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:07.229584Z",
     "start_time": "2024-04-12T15:46:07.053564Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "preference\n",
      "False    815258\n",
      "True     815258\n",
      "Name: count, dtype: int64 is_7b\n",
      "True    1630516\n",
      "Name: count, dtype: int64 model_name\n",
      "chirp-v3-engine-d     873982\n",
      "chirp-v3-engine-v0    756534\n",
      "Name: count, dtype: int64 preference  model_name        \n",
      "False       chirp-v3-engine-v0    453432\n",
      "            chirp-v3-engine-d     361826\n",
      "True        chirp-v3-engine-d     512156\n",
      "            chirp-v3-engine-v0    303102\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "print(\n",
    "    df[\"preference\"].value_counts(),\n",
    "    df[\"is_7b\"].value_counts(),\n",
    "    df[\"model_name\"].value_counts(),\n",
    "    df.groupby([\"preference\"])[\"model_name\"].value_counts()\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:08.552051Z",
     "start_time": "2024-04-12T15:46:07.230871Z"
    }
   },
   "outputs": [],
   "source": [
    "df = df.sort_values(by=[\"request_id\", \"preference\"])\n",
    "df[\"duration_rel_diff\"] = df['duration'].diff() \n",
    "df[\"play_rel_diff\"] = df['play_count'].diff() "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:08.583740Z",
     "start_time": "2024-04-12T15:46:08.553798Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>request_id</th>\n",
       "      <th>preference</th>\n",
       "      <th>duration</th>\n",
       "      <th>duration_rel_diff</th>\n",
       "      <th>play_count</th>\n",
       "      <th>play_rel_diff</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1822690</th>\n",
       "      <td>ffff5c5c-4d86-48d1-9bb4-4199cebfda68</td>\n",
       "      <td>False</td>\n",
       "      <td>9.519979</td>\n",
       "      <td>-13.28</td>\n",
       "      <td>2</td>\n",
       "      <td>-1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1822691</th>\n",
       "      <td>ffff5c5c-4d86-48d1-9bb4-4199cebfda68</td>\n",
       "      <td>True</td>\n",
       "      <td>26.079979</td>\n",
       "      <td>16.56</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1822692</th>\n",
       "      <td>ffff6f6a-1e14-40d6-9950-8e3b83d29762</td>\n",
       "      <td>False</td>\n",
       "      <td>119.999979</td>\n",
       "      <td>93.92</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1822693</th>\n",
       "      <td>ffff6f6a-1e14-40d6-9950-8e3b83d29762</td>\n",
       "      <td>True</td>\n",
       "      <td>76.479979</td>\n",
       "      <td>-43.52</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1822694</th>\n",
       "      <td>ffff85e3-fdac-4b36-83fc-0e67cc2b6624</td>\n",
       "      <td>False</td>\n",
       "      <td>59.999979</td>\n",
       "      <td>-16.48</td>\n",
       "      <td>5</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1822695</th>\n",
       "      <td>ffff85e3-fdac-4b36-83fc-0e67cc2b6624</td>\n",
       "      <td>True</td>\n",
       "      <td>46.199979</td>\n",
       "      <td>-13.80</td>\n",
       "      <td>4</td>\n",
       "      <td>-1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1822700</th>\n",
       "      <td>ffffd361-2cc2-402f-9001-fafb482d976f</td>\n",
       "      <td>False</td>\n",
       "      <td>54.359979</td>\n",
       "      <td>8.16</td>\n",
       "      <td>3</td>\n",
       "      <td>-1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1822701</th>\n",
       "      <td>ffffd361-2cc2-402f-9001-fafb482d976f</td>\n",
       "      <td>True</td>\n",
       "      <td>56.359979</td>\n",
       "      <td>2.00</td>\n",
       "      <td>3</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1822702</th>\n",
       "      <td>ffffd665-d1a5-46ae-be62-e30cd54b18ce</td>\n",
       "      <td>False</td>\n",
       "      <td>36.559979</td>\n",
       "      <td>-19.80</td>\n",
       "      <td>1</td>\n",
       "      <td>-2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1822703</th>\n",
       "      <td>ffffd665-d1a5-46ae-be62-e30cd54b18ce</td>\n",
       "      <td>True</td>\n",
       "      <td>40.559979</td>\n",
       "      <td>4.00</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                   request_id  preference    duration  duration_rel_diff  play_count  play_rel_diff\n",
       "1822690  ffff5c5c-4d86-48d1-9bb4-4199cebfda68       False    9.519979             -13.28           2           -1.0\n",
       "1822691  ffff5c5c-4d86-48d1-9bb4-4199cebfda68        True   26.079979              16.56           2            0.0\n",
       "1822692  ffff6f6a-1e14-40d6-9950-8e3b83d29762       False  119.999979              93.92           2            0.0\n",
       "1822693  ffff6f6a-1e14-40d6-9950-8e3b83d29762        True   76.479979             -43.52           2            0.0\n",
       "1822694  ffff85e3-fdac-4b36-83fc-0e67cc2b6624       False   59.999979             -16.48           5            3.0\n",
       "1822695  ffff85e3-fdac-4b36-83fc-0e67cc2b6624        True   46.199979             -13.80           4           -1.0\n",
       "1822700  ffffd361-2cc2-402f-9001-fafb482d976f       False   54.359979               8.16           3           -1.0\n",
       "1822701  ffffd361-2cc2-402f-9001-fafb482d976f        True   56.359979               2.00           3            0.0\n",
       "1822702  ffffd665-d1a5-46ae-be62-e30cd54b18ce       False   36.559979             -19.80           1           -2.0\n",
       "1822703  ffffd665-d1a5-46ae-be62-e30cd54b18ce        True   40.559979               4.00           1            0.0"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\n",
    "    [\n",
    "        \"request_id\",\n",
    "        \"preference\",\n",
    "        \"duration\",\n",
    "        \"duration_rel_diff\",\n",
    "        \"play_count\",\n",
    "        \"play_rel_diff\",\n",
    "    ]\n",
    "].tail(n=10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:09.667867Z",
     "start_time": "2024-04-12T15:46:08.584933Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>time_used</th>\n",
       "      <th>user_id</th>\n",
       "      <th>discord_message_id</th>\n",
       "      <th>prompt_id</th>\n",
       "      <th>upvote_count</th>\n",
       "      <th>batch_index</th>\n",
       "      <th>daily_theme_id</th>\n",
       "      <th>dislike_count</th>\n",
       "      <th>flag_count</th>\n",
       "      <th>play_count</th>\n",
       "      <th>skip_count</th>\n",
       "      <th>slug</th>\n",
       "      <th>user_n_clips</th>\n",
       "      <th>total_start_s</th>\n",
       "      <th>total_clip_s</th>\n",
       "      <th>concat_play_counts</th>\n",
       "      <th>duration</th>\n",
       "      <th>options</th>\n",
       "      <th>continue_at</th>\n",
       "      <th>error_type</th>\n",
       "      <th>error_message</th>\n",
       "      <th>original_duration_s</th>\n",
       "      <th>has_continue_and_start_continue_at</th>\n",
       "      <th>duration_rel_diff</th>\n",
       "      <th>play_rel_diff</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>815258.000000</td>\n",
       "      <td>8.152580e+05</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>815258.000000</td>\n",
       "      <td>815258.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>815258.000000</td>\n",
       "      <td>815258.0</td>\n",
       "      <td>815258.000000</td>\n",
       "      <td>815258.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>815258.000000</td>\n",
       "      <td>414798.000000</td>\n",
       "      <td>414524.000000</td>\n",
       "      <td>414799.000000</td>\n",
       "      <td>815258.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>403500.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>414798.000000</td>\n",
       "      <td>222289.000000</td>\n",
       "      <td>815258.000000</td>\n",
       "      <td>815258.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>69.290134</td>\n",
       "      <td>3.514895e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.482074</td>\n",
       "      <td>0.524397</td>\n",
       "      <td>NaN</td>\n",
       "      <td>-0.000002</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.594571</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>815.532030</td>\n",
       "      <td>55.195949</td>\n",
       "      <td>217.614687</td>\n",
       "      <td>25.932717</td>\n",
       "      <td>68.730715</td>\n",
       "      <td>NaN</td>\n",
       "      <td>71.115409</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>111.120964</td>\n",
       "      <td>59.861563</td>\n",
       "      <td>-0.335504</td>\n",
       "      <td>1.645848</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>34.290252</td>\n",
       "      <td>1.990836e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.708381</td>\n",
       "      <td>0.499405</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.001566</td>\n",
       "      <td>0.0</td>\n",
       "      <td>26.404208</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>944.224876</td>\n",
       "      <td>56.668435</td>\n",
       "      <td>136.528942</td>\n",
       "      <td>665.434580</td>\n",
       "      <td>32.206342</td>\n",
       "      <td>NaN</td>\n",
       "      <td>55.694426</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>55.543710</td>\n",
       "      <td>31.910610</td>\n",
       "      <td>23.295509</td>\n",
       "      <td>27.166199</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.856004</td>\n",
       "      <td>3.000000e+00</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>6.880000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.479979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2.519979</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>-175.280000</td>\n",
       "      <td>-6030.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>47.565125</td>\n",
       "      <td>1.643707e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>249.000000</td>\n",
       "      <td>10.359979</td>\n",
       "      <td>147.759979</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>49.199979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>43.559979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>77.159958</td>\n",
       "      <td>40.639979</td>\n",
       "      <td>-6.920000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>61.681939</td>\n",
       "      <td>4.360947e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>483.000000</td>\n",
       "      <td>54.319979</td>\n",
       "      <td>187.999979</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>59.999979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>59.999979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>109.759958</td>\n",
       "      <td>59.999979</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>97.617304</td>\n",
       "      <td>5.209475e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1068.000000</td>\n",
       "      <td>74.079979</td>\n",
       "      <td>247.560000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>97.479979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>94.559979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>123.159958</td>\n",
       "      <td>66.639979</td>\n",
       "      <td>6.480000</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>238.794114</td>\n",
       "      <td>6.113625e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>396.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>11178.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>12533.000000</td>\n",
       "      <td>3000.000000</td>\n",
       "      <td>2757.919979</td>\n",
       "      <td>105307.000000</td>\n",
       "      <td>234.999979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5940.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>3059.999979</td>\n",
       "      <td>3240.000000</td>\n",
       "      <td>165.080000</td>\n",
       "      <td>11165.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           time_used       user_id  discord_message_id  prompt_id   upvote_count    batch_index  daily_theme_id  dislike_count  flag_count     play_count  skip_count  slug   user_n_clips  total_start_s   total_clip_s  concat_play_counts       duration  options    continue_at  error_type  error_message  original_duration_s  has_continue_and_start_continue_at  duration_rel_diff  play_rel_diff\n",
       "count  815258.000000  8.152580e+05                 0.0        0.0  815258.000000  815258.000000             0.0  815258.000000    815258.0  815258.000000    815258.0   0.0  815258.000000  414798.000000  414524.000000       414799.000000  815258.000000      0.0  403500.000000         0.0            0.0        414798.000000                       222289.000000      815258.000000  815258.000000\n",
       "mean       69.290134  3.514895e+06                 NaN        NaN       0.482074       0.524397             NaN      -0.000002         0.0       3.594571         0.0   NaN     815.532030      55.195949     217.614687           25.932717      68.730715      NaN      71.115409         NaN            NaN           111.120964                           59.861563          -0.335504       1.645848\n",
       "std        34.290252  1.990836e+06                 NaN        NaN       0.708381       0.499405             NaN       0.001566         0.0      26.404208         0.0   NaN     944.224876      56.668435     136.528942          665.434580      32.206342      NaN      55.694426         NaN            NaN            55.543710                           31.910610          23.295509      27.166199\n",
       "min         0.856004  3.000000e+00                 NaN        NaN      -1.000000       0.000000             NaN      -1.000000         0.0       1.000000         0.0   NaN       2.000000       0.000000       6.880000            1.000000       2.479979      NaN       1.000000         NaN            NaN             2.519979                            1.000000        -175.280000   -6030.000000\n",
       "25%        47.565125  1.643707e+06                 NaN        NaN       0.000000       0.000000             NaN       0.000000         0.0       1.000000         0.0   NaN     249.000000      10.359979     147.759979            1.000000      49.199979      NaN      43.559979         NaN            NaN            77.159958                           40.639979          -6.920000       0.000000\n",
       "50%        61.681939  4.360947e+06                 NaN        NaN       0.000000       1.000000             NaN       0.000000         0.0       2.000000         0.0   NaN     483.000000      54.319979     187.999979            2.000000      59.999979      NaN      59.999979         NaN            NaN           109.759958                           59.999979           0.000000       1.000000\n",
       "75%        97.617304  5.209475e+06                 NaN        NaN       1.000000       1.000000             NaN       0.000000         0.0       4.000000         0.0   NaN    1068.000000      74.079979     247.560000            4.000000      97.479979      NaN      94.559979         NaN            NaN           123.159958                           66.639979           6.480000       2.000000\n",
       "max       238.794114  6.113625e+06                 NaN        NaN     396.000000       1.000000             NaN       0.000000         0.0   11178.000000         0.0   NaN   12533.000000    3000.000000    2757.919979       105307.000000     234.999979      NaN    5940.000000         NaN            NaN          3059.999979                         3240.000000         165.080000   11165.000000"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df[\"preference\"] == True].describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:10.586301Z",
     "start_time": "2024-04-12T15:46:09.669080Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>time_used</th>\n",
       "      <th>user_id</th>\n",
       "      <th>discord_message_id</th>\n",
       "      <th>prompt_id</th>\n",
       "      <th>upvote_count</th>\n",
       "      <th>batch_index</th>\n",
       "      <th>daily_theme_id</th>\n",
       "      <th>dislike_count</th>\n",
       "      <th>flag_count</th>\n",
       "      <th>play_count</th>\n",
       "      <th>skip_count</th>\n",
       "      <th>slug</th>\n",
       "      <th>user_n_clips</th>\n",
       "      <th>total_start_s</th>\n",
       "      <th>total_clip_s</th>\n",
       "      <th>concat_play_counts</th>\n",
       "      <th>duration</th>\n",
       "      <th>options</th>\n",
       "      <th>continue_at</th>\n",
       "      <th>error_type</th>\n",
       "      <th>error_message</th>\n",
       "      <th>original_duration_s</th>\n",
       "      <th>has_continue_and_start_continue_at</th>\n",
       "      <th>duration_rel_diff</th>\n",
       "      <th>play_rel_diff</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>815258.000000</td>\n",
       "      <td>8.152580e+05</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>815258.000000</td>\n",
       "      <td>815258.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>815258.000000</td>\n",
       "      <td>815258.000000</td>\n",
       "      <td>815258.000000</td>\n",
       "      <td>815258.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>815258.000000</td>\n",
       "      <td>476.000000</td>\n",
       "      <td>476.000000</td>\n",
       "      <td>476.000000</td>\n",
       "      <td>815258.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>403500.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>476.000000</td>\n",
       "      <td>825.000000</td>\n",
       "      <td>815257.000000</td>\n",
       "      <td>815257.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>69.778687</td>\n",
       "      <td>3.514895e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000091</td>\n",
       "      <td>0.475603</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.105746</td>\n",
       "      <td>0.001932</td>\n",
       "      <td>1.948723</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>815.532030</td>\n",
       "      <td>58.285533</td>\n",
       "      <td>195.760491</td>\n",
       "      <td>89.689076</td>\n",
       "      <td>69.066218</td>\n",
       "      <td>NaN</td>\n",
       "      <td>71.115409</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>117.388622</td>\n",
       "      <td>64.069945</td>\n",
       "      <td>0.335438</td>\n",
       "      <td>-1.645850</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>37.595927</td>\n",
       "      <td>1.990836e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.016427</td>\n",
       "      <td>0.499405</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.307512</td>\n",
       "      <td>0.043911</td>\n",
       "      <td>7.107140</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>944.224876</td>\n",
       "      <td>51.993868</td>\n",
       "      <td>106.953174</td>\n",
       "      <td>1873.702595</td>\n",
       "      <td>35.390511</td>\n",
       "      <td>NaN</td>\n",
       "      <td>55.694426</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>48.497727</td>\n",
       "      <td>34.371348</td>\n",
       "      <td>47.829310</td>\n",
       "      <td>27.346549</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.853549</td>\n",
       "      <td>3.000000e+00</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>-2.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>39.559979</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.479979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>10.719958</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>-217.200000</td>\n",
       "      <td>-11176.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>44.849515</td>\n",
       "      <td>1.643707e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>249.000000</td>\n",
       "      <td>15.000000</td>\n",
       "      <td>133.239984</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>46.399979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>43.559979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>88.959958</td>\n",
       "      <td>41.399979</td>\n",
       "      <td>-33.880000</td>\n",
       "      <td>-2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>61.847164</td>\n",
       "      <td>4.360947e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>483.000000</td>\n",
       "      <td>59.979979</td>\n",
       "      <td>179.059979</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>59.999979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>59.999979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>116.299969</td>\n",
       "      <td>59.999979</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>108.114422</td>\n",
       "      <td>5.209475e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1068.000000</td>\n",
       "      <td>79.499979</td>\n",
       "      <td>237.520000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>107.559979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>94.559979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>124.039958</td>\n",
       "      <td>89.759979</td>\n",
       "      <td>34.800000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>239.597446</td>\n",
       "      <td>6.113625e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>12.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>6033.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>12533.000000</td>\n",
       "      <td>404.879979</td>\n",
       "      <td>899.440000</td>\n",
       "      <td>40883.000000</td>\n",
       "      <td>239.999979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5940.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>464.719958</td>\n",
       "      <td>119.999979</td>\n",
       "      <td>217.760000</td>\n",
       "      <td>6032.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           time_used       user_id  discord_message_id  prompt_id   upvote_count    batch_index  daily_theme_id  dislike_count     flag_count     play_count  skip_count  slug   user_n_clips  total_start_s  total_clip_s  concat_play_counts       duration  options    continue_at  error_type  error_message  original_duration_s  has_continue_and_start_continue_at  duration_rel_diff  play_rel_diff\n",
       "count  815258.000000  8.152580e+05                 0.0        0.0  815258.000000  815258.000000             0.0  815258.000000  815258.000000  815258.000000    815258.0   0.0  815258.000000     476.000000    476.000000          476.000000  815258.000000      0.0  403500.000000         0.0            0.0           476.000000                          825.000000      815257.000000  815257.000000\n",
       "mean       69.778687  3.514895e+06                 NaN        NaN       0.000091       0.475603             NaN       0.105746       0.001932       1.948723         0.0   NaN     815.532030      58.285533    195.760491           89.689076      69.066218      NaN      71.115409         NaN            NaN           117.388622                           64.069945           0.335438      -1.645850\n",
       "std        37.595927  1.990836e+06                 NaN        NaN       0.016427       0.499405             NaN       0.307512       0.043911       7.107140         0.0   NaN     944.224876      51.993868    106.953174         1873.702595      35.390511      NaN      55.694426         NaN            NaN            48.497727                           34.371348          47.829310      27.346549\n",
       "min         0.853549  3.000000e+00                 NaN        NaN      -2.000000       0.000000             NaN       0.000000       0.000000       1.000000         0.0   NaN       2.000000       0.000000     39.559979            1.000000       2.479979      NaN       1.000000         NaN            NaN            10.719958                            1.000000        -217.200000  -11176.000000\n",
       "25%        44.849515  1.643707e+06                 NaN        NaN       0.000000       0.000000             NaN       0.000000       0.000000       1.000000         0.0   NaN     249.000000      15.000000    133.239984            1.000000      46.399979      NaN      43.559979         NaN            NaN            88.959958                           41.399979         -33.880000      -2.000000\n",
       "50%        61.847164  4.360947e+06                 NaN        NaN       0.000000       0.000000             NaN       0.000000       0.000000       1.000000         0.0   NaN     483.000000      59.979979    179.059979            2.000000      59.999979      NaN      59.999979         NaN            NaN           116.299969                           59.999979           0.000000      -1.000000\n",
       "75%       108.114422  5.209475e+06                 NaN        NaN       0.000000       1.000000             NaN       0.000000       0.000000       2.000000         0.0   NaN    1068.000000      79.499979    237.520000            4.000000     107.559979      NaN      94.559979         NaN            NaN           124.039958                           89.759979          34.800000       0.000000\n",
       "max       239.597446  6.113625e+06                 NaN        NaN      12.000000       1.000000             NaN       1.000000       1.000000    6033.000000         0.0   NaN   12533.000000     404.879979    899.440000        40883.000000     239.999979      NaN    5940.000000         NaN            NaN           464.719958                          119.999979         217.760000    6032.000000"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df[\"preference\"] == False].describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:11.814874Z",
     "start_time": "2024-04-12T15:46:10.587503Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "negative 700145 positive 108786\n",
      "total pair requests 815258 selected pair requests 78657 frac 0.096\n"
     ]
    }
   ],
   "source": [
    "normal_pos_play_count = 7\n",
    "# this is lower, cause a concat is probably already ensuring that it is good\n",
    "concat_pos_play_count = 2\n",
    "# this is a filter on the concated clip\n",
    "concat_total_play_count = 5\n",
    "\n",
    "neg_filter_selection_mask = (\n",
    "    (df[\"preference\"] == False)  # get basics aligned\n",
    "    & (df[\"play_count\"] >= 1)  # has to be played once\n",
    "    & (df[\"play_count\"] <= 3)  # if it is actually bad, shouldn't be listened often\n",
    "    & (df[\"duration\"] >= 10)  # can't be too short, otherwise it is obvious\n",
    "    & (df[\"duration\"] <= 120)  # can't be badly long\n",
    "    & (df[\"has_continue_and_start_continue_at\"].isna())  # won't have any continues\n",
    "    # & (df[\"dislike_count\"] >= 1) # this is kinda strict\n",
    "    #     & (\n",
    "    #         (df_slice[\"is_in_playlist\"] == False)\n",
    "    #         & (df_slice[\"concat_in_playlist\"] == False)\n",
    "    #     )  # can't be part of a playlist -- otherwise there are some like signal in it?\n",
    "    & (\n",
    "        ((df[\"is_7b\"] == False) & (df[\"play_count\"] >= 2) & (df[\"duration\"] >= 10))\n",
    "        | ((df[\"is_7b\"] == True) & (df[\"play_count\"] >= 1))\n",
    "    )\n",
    ")\n",
    "pos_filter_selectin_mask = (\n",
    "    (df[\"preference\"] == True)  # get basics aligned\n",
    "    & (\n",
    "        df[\"good_continue_at\"] == True\n",
    "    )  # if continue, needs to continue off a certain percentage\n",
    "    & (\n",
    "        ((df[\"play_count\"] >= 1) & (df[\"is_7b\"] == True))\n",
    "        | ((df[\"play_count\"] >= 10) & (df[\"is_7b\"] == False))\n",
    "    )\n",
    "    & (\n",
    "        (\n",
    "            (df[\"part_of_concat\"] == True)\n",
    "            & (df[\"play_count\"] >= concat_pos_play_count)\n",
    "            & (df[\"concat_play_counts\"] >= concat_total_play_count)\n",
    "        )\n",
    "        | (\n",
    "            (df[\"part_of_concat\"] == False)\n",
    "            & (df[\"play_count\"] >= normal_pos_play_count)\n",
    "        )\n",
    "    )\n",
    "    & (df[\"play_rel_diff\"] >= 0)  # this is more like quality assurance\n",
    "    & (df[\"duration\"] >= 10)  # can't be too short, otherwise it is obvious\n",
    "    & (df[\"duration\"] <= 120)  # can't be badly long\n",
    "    & (df[\"dislike_count\"] == 0)  # can't have dislikes\n",
    "    & (df[\"flag_count\"] == 0)  # can't have issues\n",
    "    & (df[\"user_n_clips\"] >= 20)  # user needs to have genereated at least 20\n",
    "    # & (df[\"duration_rel_diff\"] < 10) # positive isn't just longer\n",
    "    # & (df[\"upvote_count\"] >= 1)\n",
    ")\n",
    "print(\n",
    "    \"negative\",\n",
    "    sum(neg_filter_selection_mask),\n",
    "    \"positive\",\n",
    "    sum(pos_filter_selectin_mask),\n",
    ")\n",
    "\n",
    "neg_filter_requests = df[neg_filter_selection_mask][\"request_id\"].unique()\n",
    "pos_filter_requests = df[pos_filter_selectin_mask][\"request_id\"].unique()\n",
    "# looking for very strong signal here:\n",
    "# listen to the positive/negative more than once\n",
    "# disliked one of the clips\n",
    "unique_requests = set(pos_filter_requests).intersection(neg_filter_requests)\n",
    "print(\n",
    "    \"total pair requests\",\n",
    "    df[\"request_id\"].nunique(),\n",
    "    \"selected pair requests\",\n",
    "    len(unique_requests),\n",
    "    f\"frac {len(unique_requests) / df['request_id'].nunique():.3f}\",\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:12.131162Z",
     "start_time": "2024-04-12T15:46:11.816172Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "78657 157314 total khrs 2.972; n gpus for 1250 iters 3.933; n unique unsers 13756\n"
     ]
    }
   ],
   "source": [
    "df_slice = df[df[\"request_id\"].isin(set(unique_requests))].copy()\n",
    "print(\n",
    "    df_slice[\"request_id\"].nunique(),\n",
    "    df_slice.shape[0],\n",
    "    f\"total khrs {sum(df_slice['duration'] / 3600 / 1000):.3f};\",\n",
    "    f\"n gpus for 1250 iters {df_slice.shape[0] / 8 / 4 / 1250:.3f};\",\n",
    "    f\"n unique unsers {df_slice['user_id'].nunique()}\"\n",
    ")\n",
    "# 76171 152342 total khrs 2.880 n gpus for 1250 iters 3.809"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:13.305885Z",
     "start_time": "2024-04-12T15:46:12.134633Z"
    }
   },
   "outputs": [],
   "source": [
    "last_continue_requests = df[\n",
    "    ((df[\"has_continue_and_start_continue_at\"] / df[\"duration\"]) > 0.99)\n",
    "][\"request_id\"].unique()\n",
    "early_continue_requests = df[\n",
    "    ((df[\"has_continue_and_start_continue_at\"] / df[\"duration\"]) < 0.99)\n",
    "    & ((df[\"has_continue_and_start_continue_at\"] / df[\"duration\"]) > 0.01)\n",
    "][\"request_id\"].unique()\n",
    "not_continue_requests = df[df[\"has_continue_and_start_continue_at\"].isna()][\n",
    "    \"request_id\"\n",
    "].unique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:13.667302Z",
     "start_time": "2024-04-12T15:46:13.307844Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "chirp-v3-engine-d_win_over_chirp-v3-engine-d, win ratio 1.000, counts 20770\n",
      "chirp-v3-engine-d_win_over_chirp-v3-engine-v0, win ratio 0.666, counts 28653\n",
      "chirp-v3-engine-v0_win_over_chirp-v3-engine-d, win ratio 0.334, counts 14369\n",
      "chirp-v3-engine-v0_win_over_chirp-v3-engine-v0, win ratio 1.000, counts 14865\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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FZWkC5EoX758SboRrrZPCXMoAAAAgAzO29tbFStWVFhYmGOZ3W5XWFiYKleunOw+ISEh2rp1q9OyLVu2KCQkJE3npqAAAAAA/gG6deum+fPna8mSJTp27Jg++OADxcXFqU2bNpKkQYMG6bPPPnNs/9JLL2nTpk2aNm2ajh07pq+++koHDx5Uly5d0nRehjwBAAAA/wDNmjVTdHS0xo0bp8jISJUvX15TpkxxDGE6d+6cPDz+7idUqVJFn376qb744gt9/vnnKlWqlCZMmCB/f/80nddmGAb3EgcAAADgFoY8AQAAAHAbBQUAAAAAt1FQAAAAAHAbBQVM89dffykgIECHDx9OcZvFixerWrVqjzBVxmHme8O/C3AHv8ceDO8N8M/AVZ5gac2aNVP9+vVNO3/v3r31xx9/KCoqSrlz51atWrU0cOBAFSxY0LRMicx+bwCkjtk/q/weS51t27bpk08+0dGjR1W4cGH16dPHcalNAK7RoYClZcuWTX5+fimuj4+Pf6jnf/LJJ/XFF19ozZo1GjdunM6cOaM33njjoZ4zte733gCwBn6Ppcwqv8fOnDmjXr16qWbNmlq2bJlefvllvffee9q0aZPZ0YAMgYICD53dbtc333yjxo0bKzAwUE8//bQmTpzoWH/mzBl17dpVlSpV0nPPPac9e/Y41t3bDv/qq6/0/PPPa8GCBWrQoIGCg4MlSV27dtWHH36oDz/8UFWrVlXNmjX1xRdfKKWrIsfExCg4OFgbNmxwWr5u3TpVrlxZcXFxkqRXXnlFISEhKlq0qKpUqaLXXntNe/fu1a1bt1y+5p9++kmtW7dWUFCQGjZsqPHjx+v27duO9QEBAVqwYIH69eunSpUq6ZlnntH69eudjrF+/Xo988wzCgoKUteuXbVkyRIFBATo6tWrLt+bpUuXqkGDBqpatareeustxcTEOP1bhIaGOt675557TmvWrHH5WhLP9fTTT6tSpUrq16+fLl++fN99gH8Sfo9l3N9j8+bNU506dWS3252W9+nTR0OGDJEkzZ07V8WKFdO///1vlSlTRl26dFGTJk307bffunyPANxBQYGH7rPPPtM333yjvn37avXq1fr0008dN1iRpLFjx6pHjx5aunSpSpUqpXfeecfpP617nT59WmvXrtX48eO1dOlSx/IlS5bI09NTCxYs0H/+8x99++23WrBgQbLH8PHx0dNPP62VK1c6LV+xYoUaNWqk7NmzJ9nn8uXLWrFihSpXrqwsWbKkmG/nzp0aPHiwXnrpJa1evVoffvihFi9erEmTJjltN378eDVt2lTLly9XvXr1NHDgQMcH9cS/IDZs2FDLli1Tx44dNXbs2BTPefd7s379ek2aNEmhoaHasWOHvvnmG8f60NBQLV26VMOHD9eqVav0yiuv6N1339X27dtTPOa+ffv0n//8R507d9bSpUtVs2ZNpw9SQGbA77GM+3vs2Wef1eXLl7Vt2zan92HTpk167rnnJEl79+5VrVq1nParU6eO9u7de9+8ACQZwEN07do1IzAw0Jg/f36SdWfOnDH8/f2d1h09etTw9/c3/vzzT8MwDGPRokVG1apVHevHjRtnVKxY0YiKinI6VpcuXYymTZsadrvdsWzMmDFG06ZNU8y2bt06IyQkxIiNjXVkDQoKMjZs2OC03f/93/8ZlSpVMvz9/Y327dsb0dHRLl/zyy+/bEyaNMlp2dKlS42nnnrK8dzf398YO3as4/n169cNf39/x7nHjBljtGjRwukYn3/+ueHv729cuXLFMIzk35tKlSoZ165dcywbPXq00a5dO8MwDOPmzZtGpUqVjN27dzsdd+jQocbbb7+d4ut5++23jddee81p2Ztvvul0buCfjN9jd2Tk32N9+vQxhgwZ4ng+d+5co06dOkZCQoJhGIbxzDPPJHm9v/76q+Hv72/ExcWleFwAdzApGw/V8ePHFR8fryeffDLFbQICAhxf58+fX5IUHR2tMmXKJLt9kSJF5Ovrm2R5pUqVZLPZHM9DQkI0ffp0JSQk6JtvvlFoaKhj3apVq1SvXj1lyZJFP//8s5o3b661a9fKx8dHtWvXdjpujx499MILLyg8PFzjx4/X4MGDFRoaKpvNpsqVKzu2a9mypT788EP98ccf2r17t9Nf8hISEnTz5k3FxcU5/mp49+vOkSOHfHx8FB0dLUk6ceKEAgMDnXIkDotwpWjRovLx8XE8L1CggKKioiRJp06dUlxcnLp37+60z61bt1S+fHlJUvPmzRUeHi5Jqlq1qqZMmaJjx46pUaNGTvuEhIQwthiZBr/H7sjIv8datmypYcOG6YMPPpC3t7dWrFih5s2by8ODgRpAeqCgwEOVNWvW+25zd9s98T/Se8e63i25Nv79dOzYUU2bNnU8L1CggLy8vNSkSRPHfywrV65Us2bN5OXl/GPh6+srX19fPf744ypTpozq16+vvXv3qnLlyk5DFRL/A4yNjdWAAQP0zDPPJMlx9/tx73ADm83m8nWnxr3ZJTnGX8fGxkq6M1zg3qu7eHt7S5ImT57sGKaRLVu2B8oC/FPwe8xZRvw91qBBA7333nv69ddfFRQUpJ07dzrmT0hSvnz5dPHiRafjXbx4UT4+PvwuBFKBggIPValSpZQtWzZt3bpVxYsXf6jn2r9/v9Pzffv2qWTJkvL09FSePHmUJ0+eJPu0bNlS3bt319GjR7V161a9+eabLs+R+B9l4lVZSpYsmWSbChUq6MSJE8muS63HH388yUTLAwcOuH08SSpTpoy8vb0VHh6uGjVqJLtN0aJFk90vufcWyCz4PeYeK/0ey5o1q5555hmtWLFCp06d0uOPP66KFSs61oeEhGjjxo1O+2zZskUhISEPlBfILCgo8FBlzZpVr732msaMGaMsWbKoSpUqio6O1tGjR5NMgHtQ4eHhGjVqlDp06KDff/9ds2bN0uDBg13uU716deXLl08DBw5UsWLFVKlSJce6ffv26cCBA6patapy5cql06dP68svv1SJEiWchgjcq1+/furdu7eKFCmiJk2ayMPDQ3/88YeOHDmit956K1WvpUOHDvr22281ZswYvfDCCzp8+LCWLFkiSU7DIdLCx8dH3bt316hRo2QYhqpWrapr165p9+7d8vHxUevWrZPdr2vXrurUqZOmTp2qhg0b6rfffmO4EzIVfo9l/N9j0p3Cq1evXjp69KhjMnaijh07avbs2fq///s/tW3bVlu3btUPP/zgNMQMQMooKPDQ9e3bV56enho3bpwuXLig/Pnzq2PHjul+nlatWunGjRtq166dPD099dJLL6lDhw4u97HZbGrevLmmTJmifv36Oa3Lli2bfvzxR3311VeKjY1V/vz5VbduXfXt29fRWk9O3bp1NWnSJE2YMEHffPONvLy8VLp0abVr1y7Vr6V48eL68ssvNXr0aH333XcKCQlR7969HeN/3fXmm2/K19dXoaGh+uuvv/TYY4+pQoUK6t27d4r7hISEaMSIEfrqq680btw41apVS3369NHXX3/tdg4go+H3WMb+PSbduR9H7ty5deLECbVs2TJJ1tDQUI0aNUrfffedChUqpI8++kh169Z1OyeQmdgMI4ULXAMZSNeuXVWuXDn95z//MTvKQzNx4kTNnTs3yRACAP8M/B4DkFHRoQAsavbs2QoKClLevHm1a9cuTZ06VZ07dzY7FgCkGr/HgMyBggKwqFOnTmnixIm6cuWKihQpom7duqlXr15mxwKAVOP3GJA5MOQJAAAAgNu4owsAAAAAt1FQAAAAAHAbBQUAAAAAt1FQAAAAAHAbBQUAAAAAt1FQAMAD+uqrrxQQEGB2jEdq27ZtCggI0LZt29K87+LFixUQEKC//vrrISQDADxqFBQA/nESP7AeOHDA7CgP3b///W8FBASoSpUqunHjRpL1J0+eVEBAgAICAjR16lQTEgIA/ukoKADgAfXp00f79+837fxeXl66ceOGfv755yTrVqxYoaxZs5qQCgCQWVBQAMAD8vLyMvVDu7e3t2rVqqVVq1YlWbdy5Uo9/fTTjz4UACDToKAAkGn9/vvvevXVV1WlShVVrlxZL7/8svbu3eu0za1btzR+/Hg988wzCgoKUs2aNdWpUydt3rzZsU1ycygCAgL04Ycf6qefflKLFi0UGBio5s2ba+PGjUlybNu2TW3atFFQUJAaNWqkuXPnpnleRosWLbRx40ZdvXrVsWz//v06efKkWrRokew+Z86c0euvv64aNWqoUqVKat++vX799dck250/f159+/ZVSEiIatWqpZEjRyo+Pj7ZY+7bt089evRQ1apVValSJXXp0kW7du26b/4DBw6oR48eqlmzpoKDg9WgQQMNGTIkdS8eAGAqL7MDAIAZjh49qs6dOytnzpx69dVX5eXlpXnz5qlr166aNWuWKlWqJEkaP368QkND1a5dOwUHBysmJkYHDx7UoUOH9NRTT7k8x65du/Tjjz/qxRdfVM6cOTVz5ky9/vrr+uWXX5Q3b15Jfxc1+fPn14ABA2S32zVhwgT5+vqm6fU0btxY77//vn788Ue98MILku50J0qXLq0KFSok2f7ixYvq2LGj4uLi1LVrV+XNm1dLlixRnz59NG7cODVu3FiSdOPGDb388ss6d+6cunbtqgIFCmjZsmXaunVrkmOGhYXptddeU2BgoPr37y+bzabFixfr5Zdf1vfff6/g4OBks0dFRalHjx7KmzevevbsqVy5cumvv/7SunXr0vQeAADMQUEBIFP64osvdOvWLc2ZM0fFixeXJLVq1UrPPvusxowZo1mzZkmSfv31V9WvX18jRoxI8zmOHTum1atXq0SJEpKkmjVr6vnnn9eqVavUpUsXSdK4cePk6empOXPmqGDBgpKkpk2bqlmzZmk6l4+Pj55++mmtXLlSL7zwgux2u1avXq2OHTsmu/3kyZN18eJFzZ49W9WqVZMktWvXTs8995xGjRqlhg0bysPDQ/PmzdPJkyf1xRdfqGnTppKk9u3b6/nnn3c6nmEY+uCDD1SzZk1NmTJFNptNktSxY0c1b95cX3zxhaZNm5Zslj179ujKlSuaOnWqgoKCHMvfeuutNL0HAABzMOQJQKaTkJCgzZs3q1GjRo5iQpIKFCigFi1aaNeuXYqJiZEk5cqVS0ePHtXJkyfTfJ7atWs7iglJKleunHx8fHTmzBlHjrCwMDVs2NBRTEhSyZIlVbdu3TSfr2XLltq+fbsiIyO1detWRUZGqmXLlsluu2HDBgUHBzuKCUnKmTOnOnTooLNnz+rPP/+UJG3cuFH58+fXs88+69gue/bsat++vdPxDh8+rJMnT6ply5a6dOmSoqOjFR0drdjYWNWqVUs7duyQ3W5PNstjjz0m6U7xduvWrTS/bgCAuehQAMh0oqOjFRcXp8cffzzJujJlyshut+vcuXN64okn9Prrr6tv375q0qSJ/P39VadOHT3//PMqV67cfc9TuHDhJMty587tmOcQFRWlGzduqGTJkkm2S27Z/dSvX185c+bU6tWr9ccffygoKEglS5ZM9n4P4eHhjmFddytdurRjvb+/v86ePauSJUs6Og6J7n3vEguuwYMHp5jv2rVryp07d5LlNWrUUJMmTTR+/Hh9++23qlGjhho1aqSWLVvK29v7vq8bAGAuCgoAcKF69epat26d1q9fr82bN2vhwoWaMWOGhg8frnbt2rnc19PTM9nlhmE8jKjy9vZW48aNtXTpUp05c0b9+/d/KOdJTuJrGjRokMqXL5/sNjly5Eh2uc1m07hx47R371798ssv2rRpk4YOHarp06dr3rx5ypkz50PLDQB4cBQUADIdX19fZc+eXSdOnEiy7vjx4/Lw8HDqLuTJk0dt27ZV27Ztdf36dXXp0kVfffXVfQuK+/Hz81PWrFl16tSpJOuSW5YaLVu21KJFi+Th4aHmzZunuF2RIkVSfP2J6yWpaNGiOnLkiAzDcOpS3Ltv4tAxHx8f1a5d263sISEhCgkJ0VtvvaUVK1Zo4MCBWr169QO/zwCAh4s5FAAyHU9PTz311FNav36903CgixcvauXKlapatap8fHwkSZcuXXLaN2fOnCpRokSKl01Na47atWtr/fr1ioiIcCw/deqUNm3a5NYxa9asqTfeeEPDhg1T/vz5U9yufv362r9/v/bs2eNYFhsbq/nz56to0aIqW7asJKlevXq6cOGC1qxZ49guLi5O8+fPdzpeYGCgSpQooWnTpun69etJzhcdHZ1ilitXriTp2iR2OdLjfQYAPFx0KAD8Yy1atCjZD+YvvfSS3nzzTW3ZskUvvviiXnzxRXl6emrevHmKj4/Xu+++69i2efPmqlGjhipWrKg8efLowIEDWrt2reMqTQ+qf//++u2339SpUyd16tRJdrtds2bN0hNPPKHDhw+n+XgeHh7q27fvfbfr2bOnVq1apddee01du3ZV7ty5tXTpUv3111/66quv5OFx5+9N7du31+zZszV48GAdOnRI+fPn17Jly5QtW7Yk5/3oo4/02muvqUWLFmrTpo0KFiyoiIgIbdu2TT4+Ppo0aVKyWZYsWaI5c+aoUaNGKlGihK5fv6758+fLx8dH9erVS/N7AAB4tCgoAPxjzZkzJ9nlbdq00RNPPKHZs2frs88+U2hoqAzDUHBwsMaMGeM0Wblr1676+eeftXnzZsXHx6tIkSJ688031aNHj3TJGBgYqG+++Ub/93//py+//FKFCxfW66+/ruPHjzuGHz0M+fLl09y5cx2XyL1586YCAgI0adIkpztrZ8+eXd9++61GjBihWbNmKVu2bGrZsqXq1aunV1991emYNWvW1Lx58/T1119r1qxZio2NVf78+RUcHKwOHTqkmKVGjRo6cOCAVq9erYsXL+qxxx5TcHCwPv30U6ercAEArMlmPKzZgQAAt/Xt21d//vmnfvzxR7OjAADgEnMoAMBkN27ccHp+8uRJbdy4UTVq1DApEQAAqceQJwAwWaNGjdS6dWsVL15cZ8+e1dy5c5UlS5YkQ4oAALAiCgoAMFndunW1atUqRUZGytvbWyEhIXr77bdVqlQps6MBAHBfzKEAAAAA4DbmUAAAAABwGwUFAAAAALdRUAAAAABwGwUFAAAAALdRUAAAAABwGwUFAAAAALdRUAAAAABwGwUFAAAAALf9P14uvrJp5TEOAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1000x800 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "get_preferfence_counts(df_slice)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:14.216851Z",
     "start_time": "2024-04-12T15:46:13.668554Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "chirp-v3-engine-d_win_over_chirp-v3-engine-d, win ratio 1.000, counts 20770\n",
      "chirp-v3-engine-d_win_over_chirp-v3-engine-v0, win ratio 0.666, counts 28653\n",
      "chirp-v3-engine-v0_win_over_chirp-v3-engine-d, win ratio 0.334, counts 14369\n",
      "chirp-v3-engine-v0_win_over_chirp-v3-engine-v0, win ratio 1.000, counts 14865\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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FZWkC5EoX758SboRrrZPCXMoAAAAgAzO29tbFStWVFhYmGOZ3W5XWFiYKleunOw+ISEh2rp1q9OyLVu2KCQkJE3npqAAAAAA/gG6deum+fPna8mSJTp27Jg++OADxcXFqU2bNpKkQYMG6bPPPnNs/9JLL2nTpk2aNm2ajh07pq+++koHDx5Uly5d0nRehjwBAAAA/wDNmjVTdHS0xo0bp8jISJUvX15TpkxxDGE6d+6cPDz+7idUqVJFn376qb744gt9/vnnKlWqlCZMmCB/f/80nddmGAb3EgcAAADgFoY8AQAAAHAbBQUAAAAAt1FQAAAAAHAbBQVM89dffykgIECHDx9OcZvFixerWrVqjzBVxmHme8O/C3AHv8ceDO8N8M/AVZ5gac2aNVP9+vVNO3/v3r31xx9/KCoqSrlz51atWrU0cOBAFSxY0LRMicx+bwCkjtk/q/weS51t27bpk08+0dGjR1W4cGH16dPHcalNAK7RoYClZcuWTX5+fimuj4+Pf6jnf/LJJ/XFF19ozZo1GjdunM6cOaM33njjoZ4zte733gCwBn6Ppcwqv8fOnDmjXr16qWbNmlq2bJlefvllvffee9q0aZPZ0YAMgYICD53dbtc333yjxo0bKzAwUE8//bQmTpzoWH/mzBl17dpVlSpV0nPPPac9e/Y41t3bDv/qq6/0/PPPa8GCBWrQoIGCg4MlSV27dtWHH36oDz/8UFWrVlXNmjX1xRdfKKWrIsfExCg4OFgbNmxwWr5u3TpVrlxZcXFxkqRXXnlFISEhKlq0qKpUqaLXXntNe/fu1a1bt1y+5p9++kmtW7dWUFCQGjZsqPHjx+v27duO9QEBAVqwYIH69eunSpUq6ZlnntH69eudjrF+/Xo988wzCgoKUteuXbVkyRIFBATo6tWrLt+bpUuXqkGDBqpatareeustxcTEOP1bhIaGOt675557TmvWrHH5WhLP9fTTT6tSpUrq16+fLl++fN99gH8Sfo9l3N9j8+bNU506dWS3252W9+nTR0OGDJEkzZ07V8WKFdO///1vlSlTRl26dFGTJk307bffunyPANxBQYGH7rPPPtM333yjvn37avXq1fr0008dN1iRpLFjx6pHjx5aunSpSpUqpXfeecfpP617nT59WmvXrtX48eO1dOlSx/IlS5bI09NTCxYs0H/+8x99++23WrBgQbLH8PHx0dNPP62VK1c6LV+xYoUaNWqk7NmzJ9nn8uXLWrFihSpXrqwsWbKkmG/nzp0aPHiwXnrpJa1evVoffvihFi9erEmTJjltN378eDVt2lTLly9XvXr1NHDgQMcH9cS/IDZs2FDLli1Tx44dNXbs2BTPefd7s379ek2aNEmhoaHasWOHvvnmG8f60NBQLV26VMOHD9eqVav0yiuv6N1339X27dtTPOa+ffv0n//8R507d9bSpUtVs2ZNpw9SQGbA77GM+3vs2Wef1eXLl7Vt2zan92HTpk167rnnJEl79+5VrVq1nParU6eO9u7de9+8ACQZwEN07do1IzAw0Jg/f36SdWfOnDH8/f2d1h09etTw9/c3/vzzT8MwDGPRokVG1apVHevHjRtnVKxY0YiKinI6VpcuXYymTZsadrvdsWzMmDFG06ZNU8y2bt06IyQkxIiNjXVkDQoKMjZs2OC03f/93/8ZlSpVMvz9/Y327dsb0dHRLl/zyy+/bEyaNMlp2dKlS42nnnrK8dzf398YO3as4/n169cNf39/x7nHjBljtGjRwukYn3/+ueHv729cuXLFMIzk35tKlSoZ165dcywbPXq00a5dO8MwDOPmzZtGpUqVjN27dzsdd+jQocbbb7+d4ut5++23jddee81p2Ztvvul0buCfjN9jd2Tk32N9+vQxhgwZ4ng+d+5co06dOkZCQoJhGIbxzDPPJHm9v/76q+Hv72/ExcWleFwAdzApGw/V8ePHFR8fryeffDLFbQICAhxf58+fX5IUHR2tMmXKJLt9kSJF5Ovrm2R5pUqVZLPZHM9DQkI0ffp0JSQk6JtvvlFoaKhj3apVq1SvXj1lyZJFP//8s5o3b661a9fKx8dHtWvXdjpujx499MILLyg8PFzjx4/X4MGDFRoaKpvNpsqVKzu2a9mypT788EP98ccf2r17t9Nf8hISEnTz5k3FxcU5/mp49+vOkSOHfHx8FB0dLUk6ceKEAgMDnXIkDotwpWjRovLx8XE8L1CggKKioiRJp06dUlxcnLp37+60z61bt1S+fHlJUvPmzRUeHi5Jqlq1qqZMmaJjx46pUaNGTvuEhIQwthiZBr/H7sjIv8datmypYcOG6YMPPpC3t7dWrFih5s2by8ODgRpAeqCgwEOVNWvW+25zd9s98T/Se8e63i25Nv79dOzYUU2bNnU8L1CggLy8vNSkSRPHfywrV65Us2bN5OXl/GPh6+srX19fPf744ypTpozq16+vvXv3qnLlyk5DFRL/A4yNjdWAAQP0zDPPJMlx9/tx73ADm83m8nWnxr3ZJTnGX8fGxkq6M1zg3qu7eHt7S5ImT57sGKaRLVu2B8oC/FPwe8xZRvw91qBBA7333nv69ddfFRQUpJ07dzrmT0hSvnz5dPHiRafjXbx4UT4+PvwuBFKBggIPValSpZQtWzZt3bpVxYsXf6jn2r9/v9Pzffv2qWTJkvL09FSePHmUJ0+eJPu0bNlS3bt319GjR7V161a9+eabLs+R+B9l4lVZSpYsmWSbChUq6MSJE8muS63HH388yUTLAwcOuH08SSpTpoy8vb0VHh6uGjVqJLtN0aJFk90vufcWyCz4PeYeK/0ey5o1q5555hmtWLFCp06d0uOPP66KFSs61oeEhGjjxo1O+2zZskUhISEPlBfILCgo8FBlzZpVr732msaMGaMsWbKoSpUqio6O1tGjR5NMgHtQ4eHhGjVqlDp06KDff/9ds2bN0uDBg13uU716deXLl08DBw5UsWLFVKlSJce6ffv26cCBA6patapy5cql06dP68svv1SJEiWchgjcq1+/furdu7eKFCmiJk2ayMPDQ3/88YeOHDmit956K1WvpUOHDvr22281ZswYvfDCCzp8+LCWLFkiSU7DIdLCx8dH3bt316hRo2QYhqpWrapr165p9+7d8vHxUevWrZPdr2vXrurUqZOmTp2qhg0b6rfffmO4EzIVfo9l/N9j0p3Cq1evXjp69KhjMnaijh07avbs2fq///s/tW3bVlu3btUPP/zgNMQMQMooKPDQ9e3bV56enho3bpwuXLig/Pnzq2PHjul+nlatWunGjRtq166dPD099dJLL6lDhw4u97HZbGrevLmmTJmifv36Oa3Lli2bfvzxR3311VeKjY1V/vz5VbduXfXt29fRWk9O3bp1NWnSJE2YMEHffPONvLy8VLp0abVr1y7Vr6V48eL68ssvNXr0aH333XcKCQlR7969HeN/3fXmm2/K19dXoaGh+uuvv/TYY4+pQoUK6t27d4r7hISEaMSIEfrqq680btw41apVS3369NHXX3/tdg4go+H3WMb+PSbduR9H7ty5deLECbVs2TJJ1tDQUI0aNUrfffedChUqpI8++kh169Z1OyeQmdgMI4ULXAMZSNeuXVWuXDn95z//MTvKQzNx4kTNnTs3yRACAP8M/B4DkFHRoQAsavbs2QoKClLevHm1a9cuTZ06VZ07dzY7FgCkGr/HgMyBggKwqFOnTmnixIm6cuWKihQpom7duqlXr15mxwKAVOP3GJA5MOQJAAAAgNu4owsAAAAAt1FQAAAAAHAbBQUAAAAAt1FQAAAAAHAbBQUAAAAAt1FQAMAD+uqrrxQQEGB2jEdq27ZtCggI0LZt29K87+LFixUQEKC//vrrISQDADxqFBQA/nESP7AeOHDA7CgP3b///W8FBASoSpUqunHjRpL1J0+eVEBAgAICAjR16lQTEgIA/ukoKADgAfXp00f79+837fxeXl66ceOGfv755yTrVqxYoaxZs5qQCgCQWVBQAMAD8vLyMvVDu7e3t2rVqqVVq1YlWbdy5Uo9/fTTjz4UACDToKAAkGn9/vvvevXVV1WlShVVrlxZL7/8svbu3eu0za1btzR+/Hg988wzCgoKUs2aNdWpUydt3rzZsU1ycygCAgL04Ycf6qefflKLFi0UGBio5s2ba+PGjUlybNu2TW3atFFQUJAaNWqkuXPnpnleRosWLbRx40ZdvXrVsWz//v06efKkWrRokew+Z86c0euvv64aNWqoUqVKat++vX799dck250/f159+/ZVSEiIatWqpZEjRyo+Pj7ZY+7bt089evRQ1apVValSJXXp0kW7du26b/4DBw6oR48eqlmzpoKDg9WgQQMNGTIkdS8eAGAqL7MDAIAZjh49qs6dOytnzpx69dVX5eXlpXnz5qlr166aNWuWKlWqJEkaP368QkND1a5dOwUHBysmJkYHDx7UoUOH9NRTT7k8x65du/Tjjz/qxRdfVM6cOTVz5ky9/vrr+uWXX5Q3b15Jfxc1+fPn14ABA2S32zVhwgT5+vqm6fU0btxY77//vn788Ue98MILku50J0qXLq0KFSok2f7ixYvq2LGj4uLi1LVrV+XNm1dLlixRnz59NG7cODVu3FiSdOPGDb388ss6d+6cunbtqgIFCmjZsmXaunVrkmOGhYXptddeU2BgoPr37y+bzabFixfr5Zdf1vfff6/g4OBks0dFRalHjx7KmzevevbsqVy5cumvv/7SunXr0vQeAADMQUEBIFP64osvdOvWLc2ZM0fFixeXJLVq1UrPPvusxowZo1mzZkmSfv31V9WvX18jRoxI8zmOHTum1atXq0SJEpKkmjVr6vnnn9eqVavUpUsXSdK4cePk6empOXPmqGDBgpKkpk2bqlmzZmk6l4+Pj55++mmtXLlSL7zwgux2u1avXq2OHTsmu/3kyZN18eJFzZ49W9WqVZMktWvXTs8995xGjRqlhg0bysPDQ/PmzdPJkyf1xRdfqGnTppKk9u3b6/nnn3c6nmEY+uCDD1SzZk1NmTJFNptNktSxY0c1b95cX3zxhaZNm5Zslj179ujKlSuaOnWqgoKCHMvfeuutNL0HAABzMOQJQKaTkJCgzZs3q1GjRo5iQpIKFCigFi1aaNeuXYqJiZEk5cqVS0ePHtXJkyfTfJ7atWs7iglJKleunHx8fHTmzBlHjrCwMDVs2NBRTEhSyZIlVbdu3TSfr2XLltq+fbsiIyO1detWRUZGqmXLlsluu2HDBgUHBzuKCUnKmTOnOnTooLNnz+rPP/+UJG3cuFH58+fXs88+69gue/bsat++vdPxDh8+rJMnT6ply5a6dOmSoqOjFR0drdjYWNWqVUs7duyQ3W5PNstjjz0m6U7xduvWrTS/bgCAuehQAMh0oqOjFRcXp8cffzzJujJlyshut+vcuXN64okn9Prrr6tv375q0qSJ/P39VadOHT3//PMqV67cfc9TuHDhJMty587tmOcQFRWlGzduqGTJkkm2S27Z/dSvX185c+bU6tWr9ccffygoKEglS5ZM9n4P4eHhjmFddytdurRjvb+/v86ePauSJUs6Og6J7n3vEguuwYMHp5jv2rVryp07d5LlNWrUUJMmTTR+/Hh9++23qlGjhho1aqSWLVvK29v7vq8bAGAuCgoAcKF69epat26d1q9fr82bN2vhwoWaMWOGhg8frnbt2rnc19PTM9nlhmE8jKjy9vZW48aNtXTpUp05c0b9+/d/KOdJTuJrGjRokMqXL5/sNjly5Eh2uc1m07hx47R371798ssv2rRpk4YOHarp06dr3rx5ypkz50PLDQB4cBQUADIdX19fZc+eXSdOnEiy7vjx4/Lw8HDqLuTJk0dt27ZV27Ztdf36dXXp0kVfffXVfQuK+/Hz81PWrFl16tSpJOuSW5YaLVu21KJFi+Th4aHmzZunuF2RIkVSfP2J6yWpaNGiOnLkiAzDcOpS3Ltv4tAxHx8f1a5d263sISEhCgkJ0VtvvaUVK1Zo4MCBWr169QO/zwCAh4s5FAAyHU9PTz311FNav36903CgixcvauXKlapatap8fHwkSZcuXXLaN2fOnCpRokSKl01Na47atWtr/fr1ioiIcCw/deqUNm3a5NYxa9asqTfeeEPDhg1T/vz5U9yufv362r9/v/bs2eNYFhsbq/nz56to0aIqW7asJKlevXq6cOGC1qxZ49guLi5O8+fPdzpeYGCgSpQooWnTpun69etJzhcdHZ1ilitXriTp2iR2OdLjfQYAPFx0KAD8Yy1atCjZD+YvvfSS3nzzTW3ZskUvvviiXnzxRXl6emrevHmKj4/Xu+++69i2efPmqlGjhipWrKg8efLowIEDWrt2reMqTQ+qf//++u2339SpUyd16tRJdrtds2bN0hNPPKHDhw+n+XgeHh7q27fvfbfr2bOnVq1apddee01du3ZV7ty5tXTpUv3111/66quv5OFx5+9N7du31+zZszV48GAdOnRI+fPn17Jly5QtW7Yk5/3oo4/02muvqUWLFmrTpo0KFiyoiIgIbdu2TT4+Ppo0aVKyWZYsWaI5c+aoUaNGKlGihK5fv6758+fLx8dH9erVS/N7AAB4tCgoAPxjzZkzJ9nlbdq00RNPPKHZs2frs88+U2hoqAzDUHBwsMaMGeM0Wblr1676+eeftXnzZsXHx6tIkSJ688031aNHj3TJGBgYqG+++Ub/93//py+//FKFCxfW66+/ruPHjzuGHz0M+fLl09y5cx2XyL1586YCAgI0adIkpztrZ8+eXd9++61GjBihWbNmKVu2bGrZsqXq1aunV1991emYNWvW1Lx58/T1119r1qxZio2NVf78+RUcHKwOHTqkmKVGjRo6cOCAVq9erYsXL+qxxx5TcHCwPv30U6ercAEArMlmPKzZgQAAt/Xt21d//vmnfvzxR7OjAADgEnMoAMBkN27ccHp+8uRJbdy4UTVq1DApEQAAqceQJwAwWaNGjdS6dWsVL15cZ8+e1dy5c5UlS5YkQ4oAALAiCgoAMFndunW1atUqRUZGytvbWyEhIXr77bdVqlQps6MBAHBfzKEAAAAA4DbmUAAAAABwGwUFAAAAALdRUAAAAABwGwUFAAAAALdRUAAAAABwGwUFAAAAALdRUAAAAABwGwUFAAAAALf9P14uvrJp5TEOAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1000x800 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "get_preferfence_counts(df_slice[df_slice[\"request_id\"].isin(not_continue_requests)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:14.511025Z",
     "start_time": "2024-04-12T15:46:14.218168Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "chirp-v3-engine-d_win_over_chirp-v3-engine-d, win ratio 1.000, counts 6989\n",
      "chirp-v3-engine-d_win_over_chirp-v3-engine-v0, win ratio 0.649, counts 8994\n",
      "chirp-v3-engine-v0_win_over_chirp-v3-engine-d, win ratio 0.351, counts 4871\n",
      "chirp-v3-engine-v0_win_over_chirp-v3-engine-v0, win ratio 1.000, counts 4847\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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fHx08uRJ113XpNtzSRKGQCXcRexOt27d8jiE7c65KPd6b0mx2Wxq3LixJGn27NmKiIhItM25c+c0e/ZsSXLdJQwA0hIFBWBRdevW1aBBgzRo0KBUDVFo1KiRypcvL0l67bXXtHTpUlen4+TJk+rfv792794tSYnmOeTPn1/PP/+8JOnLL7/UxIkTXROQo6Ki9P7772vJkiV65JFHkjx3sWLF1Lt3b0nS5MmTNXDgQLeJqrdu3dKBAwc0duxYPfXUU2l+C80HqWrVqq6haO+//76GDx+ukydPutbHxcVpz549+t///qd//etfioqKStXxc+TIoSFDhki6fWvPHj16aO/eva45BE6nU4cPH9aUKVPUtGnTVP2V/07vvPOOsmXLpmPHjqlt27b66aef3P56fu7cOS1atEgvvviiPv74Y6/OkZyuXbuqRIkSiouL00svvaQ5c+a4TXA/ceKExo4dq6+//toymROULFlSDRs2lCSNHz/eVTBmz57d1UX56KOPtHnzZtd/s4MHD6pHjx767bffXE+uvluOHDlcnZsFCxa4dT9SqlevXsqRI4cuXbqkLl26uO6MJd3ujnTp0kVXrlxRQECAevTokerjA8C9MCkb+Ifx9fXVF198oW7duunQoUMaMGCABg8erKxZs7r+qu3j46PBgwerbt26ifZ/6623dPjwYW3atEmffvqpPv/8c/n7++vKlSsyDEPdu3fX3r17tW3btiTP37dvX8XHx2v8+PFavHixFi9erCxZsihLliy6evWq2zMCvJ2oa5ahQ4fK19dXc+fO1bRp0zRt2jRly5ZNmTJl0tWrV10fJCXv3lvLli11/fp1ffjhh1q/fr3Wr18vu92ubNmy6dq1a263IfX22jkcDk2ePFmvvvqqjhw5or59+8rX11ePPPKIrl+/7nb3qLQeGuPv76/JkyerV69e+uuvv/TOO+/o3XffVY4cOXTjxg3XHZBeeOEFy2S+U69evbRq1SqFh4dr7ty56tixoyRpyJAh6ty5s86dO6eXXnpJdrtdmTJl0rVr1+Tn56cPP/xQY8aMSXYOSPv27fX555/ru+++0+zZsxUYGCgfHx+VL18+RRP0CxQooHHjxqlPnz46dOiQOnTo4CpgEs6ZI0cOjRs37p53cAMAb1BQAP9A+fPn1/z58zVz5kz98MMPOnz4sGJjY1WwYEFVrVpV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Cgo8UJkzZ77nNne23RP+R3r3WNc7JdXGv5f27durcePGru/z5csnPz8/NWrUyPU/lmXLlqlJkyby83P/Z5E7d27lzp1bjz76qEqWLKm6detqz549qlChgttQhYT/AcbExKh///566qmnEuW483rcPdzAZrN5fN8pcXd2Sa7x1zExMZJuDxe4++4udrtdkjRp0iTXMI0sWbLcVxbgn4LfY+7S4++xevXq6e2339batWsVEhKiHTt2uOZPSFKePHl04cIFt+NduHBB/v7+/C4EUoCCAg9UiRIllCVLFm3ZskVFixZ9oOfat2+f2/d79+5V8eLF5evrq4CAAAUEBCTap3nz5uratasOHTqkLVu26LXXXvN4joT/USbclaV48eKJtilbtqyOHj2a5LqUevTRRxNNtNy/f7/Xx5OkkiVLym63Kzw8XFWrVk1ym8KFCye5X1LXFsgo+D3mHSv9HsucObOeeuopLV26VMePH9ejjz6qcuXKudaHhYVp/fr1bvts2rRJYWFh95UXyCgoKPBAZc6cWd27d9eoUaOUKVMmVaxYUVFRUTp06FCiCXD3Kzw8XCNGjFC7du30xx9/aPr06Ro0aJDHfapUqaI8efJowIABKlKkiMqXL+9at3fvXu3fv1+VKlVSjhw5dOLECX3++ecqVqyY2xCBu/Xt21e9evVSoUKF1KhRI/n4+OjPP//UwYMH9frrr6fovbRr107ffPONRo0apeeee04HDhzQwoULJcltOERq+Pv7q2vXrhoxYoQMw1ClSpV09epV7dq1S/7+/mrZsmWS+3Xu3FkdOnTQ119/rfr16+vXX39luBMyFH6Ppf/fY9Ltwqtnz546dOiQazJ2gvbt22vGjBn63//+p9atW2vLli364Ycf3IaYAUgeBQUeuD59+sjX11djxozR+fPnlTdvXrVv3z7Nz9OiRQtdv35dbdq0ka+vr1544QW1a9fO4z42m01NmzbV5MmT1bdvX7d1WbJk0Y8//qgvvvhCMTExyps3r2rXrq0+ffq4WutJqV27tiZMmKBx48bpq6++kp+fnx577DG1adMmxe+laNGi+vzzzzVy5Eh9++23CgsLU69evVzjf7312muvKXfu3Jo4caJOnTqlRx55RGXLllWvXr2S3ScsLEzDhg3TF198oTFjxqhGjRrq3bu3vvzyS69zAOkNv8fS9+8x6fbz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R02bNk12u0KFCiX7/hPWS1LhwoV18OBBGYbh1qW4e9+EoWP+/v6qWbOmV9nDwsIUFham119/XUuXLtWAAQO0YsWK+77OAIAHizkUADIcX19fPfHEE1qzZo3bcKALFy5o2bJlqlSpkvz9/SVJFy9edNs3e/bsKlasWLK3TU1tjpo1a2rNmjU6d+6ca/nx48e1YcMGr45ZrVo1vfrqq3rnnXeUN2/eZLerW7eu9u3bp927d7uWxcTEaM6cOSpcuLBKlSolSapTp47Onz+vlStXuraLjY3VnDlz3I4XHBysYsWKacqUKbp27Vqi80VFRSWb5fLly4m6NgldjrS4zgCAB4sOBYB/rPnz5yf5wfyFF17Qa6+9pk2bNun555/X888/L19fX82ePVtxcXF66623XNs2bdpUVatWVbly5RQQEKD9+/dr1apVrrs03a9+/frp119/VYcOHdShQwc5nU5Nnz5djz/+uA4cOJDq4/n4+KhPnz733K5Hjx5avny5unfvrs6dOytnzpxatGiRTp06pS+++EI+Prf/3tS2bVvNmDFDgwYN0u+//668efNq8eLFypIlS6LzfvDBB+revbuaNWumVq1aKX/+/Dp37py2bt0qf39/TZgwIcksCxcu1MyZM9WgQQMVK1ZM165d05w5c+Tv7686deqk+hoAAB4uCgoA/1gzZ85McnmrVq30+OOPa8aMGfrkk080ceJEGYah0NBQjRo1ym2ycufOnfXzzz9r48aNiouLU6FChfTaa6+pW7duaZIxODhYX331lf73v//p888/V8GCBfXKK6/oyJEjruFHD0KePHk0a9Ys1y1yb9y4oaCgIE2YMMHtydpZs2bVN998o2HDhmn69OnKkiWLmjdvrjp16ujll192O2a1atU0e/Zsffnll5o+fbpiYmKUN29ehYaGql27dslmqVq1qvbv368VK1bowoULeuSRRxQaGqqPP/7Y7S5cAABrshkPanYgAMBrffr00V9//aUff/zR7CgAAHjEHAoAMNn169fdvj927JjWr1+vqlWrmpQIAICUY8gTAJisQYMGatmypYoWLarTp09r1qxZypQpU6IhRQAAWBEFBQCYrHbt2lq+fLkiIiJkt9sVFhamN954QyVKlDA7GgAA98QcCgAAAABeYw4FAAAAAK9RUAAAAADwGgUFAAAAAK9RUAAAAADwGgUFAAAAAK9RUAAAAADwGgUFAAAAAK9RUAAAAADw2v8DM9nQJvM5TTUAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x800 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "get_preferfence_counts(df_slice[df_slice[\"request_id\"].isin(last_continue_requests)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:14.691419Z",
     "start_time": "2024-04-12T15:46:14.512297Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "chirp-v3-engine-d_win_over_chirp-v3-engine-d, win ratio 1.000, counts 279\n",
      "chirp-v3-engine-d_win_over_chirp-v3-engine-v0, win ratio 0.688, counts 370\n",
      "chirp-v3-engine-v0_win_over_chirp-v3-engine-d, win ratio 0.312, counts 168\n",
      "chirp-v3-engine-v0_win_over_chirp-v3-engine-v0, win ratio 1.000, counts 165\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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T56s+fPnJxpCAOCfgc8xAOkVHQrAoubOnavy5csrd+7c2r17t6ZPn65OnTqZHQsAUozPMSBjoKAALOrUqVOaPHmyrly5okKFCqlbt27q3bu32bEAIMX4HAMyBoY8AQAAAHAbd3QBAAAA4DYKCgAAAABuo6AAAAAA4DYKCgAAAABuo6AAAAAA4DYKCgB4QBMmTFBAQIDZMR6p7du3KyAgQNu3b0/1vt99950CAgL0119/PYRkAIBHjYICwD9OwhfWgwcPmh3lofv3v/+tgIAAVapUSTdu3Ei0/uTJkwoICFBAQICmT59uQkIAwD8dBQUAPKC+ffvqwIEDpp3fy8tLN27c0M8//5xo3cqVK5U5c2YTUgEAMgoKCgB4QF5eXqZ+aff29laNGjW0evXqROtWrVqlZ5555tGHAgBkGBQUADKs33//Xa+88ooqVaqkihUr6qWXXtK+ffuctrl165YmTpyoRo0aqXz58qpevbo6duyoLVu2OLZJag5FQECAPvjgA/30009q3ry5AgMD1axZM23atClRju3bt6t169YqX768GjRooPnz56d6Xkbz5s21adMmXb161bHswIEDOnnypJo3b57kPmfOnNGrr76qatWqqUKFCmrXrp02bNiQaLvz58+rX79+Cg4OVo0aNTRq1CjFxcUlecz9+/erR48eqly5sipUqKDOnTtr9+7d981/8OBB9ejRQ9WrV1dQUJDq1aunoUOHpuzFAwBM5WV2AAAww9GjR9WpUydlz55dr7zyiry8vLRgwQJ16dJFc+bMUYUKFSRJEydOVEhIiNq2baugoCBFR0frt99+06FDh/T000+7PMfu3bv1ww8/6MUXX1T27Nn1zTff6NVXX9Uvv/yi3LlzS/q7qMmbN68GDhwou92uSZMmydfXN1Wvp2HDhnr//ff1ww8/6IUXXpB0pzvxxBNPqGzZsom2v3jxojp06KDY2Fh16dJFuXPn1tKlS9W3b1+NHz9eDRs2lCTduHFDL730ks6dO6cuXbooX758Wr58ubZt25bomKGhoerZs6cCAwM1YMAA2Ww2fffdd3rppZf07bffKigoKMnskZGR6tGjh3Lnzq1evXopR44c+uuvv/Tjjz+m6j0AAJiDggJAhvT555/r1q1bmjdvnooWLSpJatmypZ599lmNHTtWc+bMkSRt2LBBdevW1ciRI1N9jmPH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",
      "text/plain": [
       "<Figure size 1000x800 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "get_preferfence_counts(df_slice[df_slice[\"request_id\"].isin(early_continue_requests)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:14.834693Z",
     "start_time": "2024-04-12T15:46:14.692611Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>time_used</th>\n",
       "      <th>user_id</th>\n",
       "      <th>discord_message_id</th>\n",
       "      <th>prompt_id</th>\n",
       "      <th>upvote_count</th>\n",
       "      <th>batch_index</th>\n",
       "      <th>daily_theme_id</th>\n",
       "      <th>dislike_count</th>\n",
       "      <th>flag_count</th>\n",
       "      <th>play_count</th>\n",
       "      <th>skip_count</th>\n",
       "      <th>slug</th>\n",
       "      <th>user_n_clips</th>\n",
       "      <th>total_start_s</th>\n",
       "      <th>total_clip_s</th>\n",
       "      <th>concat_play_counts</th>\n",
       "      <th>duration</th>\n",
       "      <th>options</th>\n",
       "      <th>continue_at</th>\n",
       "      <th>error_type</th>\n",
       "      <th>error_message</th>\n",
       "      <th>original_duration_s</th>\n",
       "      <th>has_continue_and_start_continue_at</th>\n",
       "      <th>duration_rel_diff</th>\n",
       "      <th>play_rel_diff</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>78657.000000</td>\n",
       "      <td>7.865700e+04</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>78657.000000</td>\n",
       "      <td>78657.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>78657.0</td>\n",
       "      <td>78657.0</td>\n",
       "      <td>78657.000000</td>\n",
       "      <td>78657.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>78657.000000</td>\n",
       "      <td>48049.000000</td>\n",
       "      <td>48033.000000</td>\n",
       "      <td>48049.000000</td>\n",
       "      <td>78657.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>40543.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>48049.000000</td>\n",
       "      <td>26683.000000</td>\n",
       "      <td>78657.000000</td>\n",
       "      <td>78657.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>67.671271</td>\n",
       "      <td>3.725337e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.527544</td>\n",
       "      <td>0.517678</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>8.121502</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>784.131406</td>\n",
       "      <td>52.156664</td>\n",
       "      <td>214.344857</td>\n",
       "      <td>103.059856</td>\n",
       "      <td>67.197044</td>\n",
       "      <td>NaN</td>\n",
       "      <td>69.115725</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>109.248392</td>\n",
       "      <td>63.367834</td>\n",
       "      <td>-1.651701</td>\n",
       "      <td>6.368689</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>32.505499</td>\n",
       "      <td>1.944523e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.699265</td>\n",
       "      <td>0.499691</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>39.307605</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>857.194919</td>\n",
       "      <td>52.831272</td>\n",
       "      <td>125.224879</td>\n",
       "      <td>1356.869025</td>\n",
       "      <td>30.427584</td>\n",
       "      <td>NaN</td>\n",
       "      <td>48.903577</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>51.214971</td>\n",
       "      <td>28.129117</td>\n",
       "      <td>22.627014</td>\n",
       "      <td>39.311565</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>3.028488</td>\n",
       "      <td>3.000000e+00</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>20.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>16.560000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>10.039979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>10.239979</td>\n",
       "      <td>10.039979</td>\n",
       "      <td>-109.840000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>46.563219</td>\n",
       "      <td>2.000354e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>267.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>148.640000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>48.199979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>42.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>76.319958</td>\n",
       "      <td>46.079979</td>\n",
       "      <td>-8.600000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>61.058324</td>\n",
       "      <td>4.700348e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>480.000000</td>\n",
       "      <td>50.519979</td>\n",
       "      <td>188.720000</td>\n",
       "      <td>8.000000</td>\n",
       "      <td>59.999979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>59.999979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>106.999958</td>\n",
       "      <td>59.999979</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>4.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>89.198640</td>\n",
       "      <td>5.286772e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>9.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>970.000000</td>\n",
       "      <td>68.000000</td>\n",
       "      <td>243.639979</td>\n",
       "      <td>13.000000</td>\n",
       "      <td>89.599979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>88.999990</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>119.999979</td>\n",
       "      <td>73.699979</td>\n",
       "      <td>5.560000</td>\n",
       "      <td>7.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>238.794114</td>\n",
       "      <td>6.112222e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>88.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6321.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>12533.000000</td>\n",
       "      <td>2038.719979</td>\n",
       "      <td>2080.719979</td>\n",
       "      <td>105307.000000</td>\n",
       "      <td>119.999979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2038.719979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2080.759958</td>\n",
       "      <td>124.000000</td>\n",
       "      <td>108.680000</td>\n",
       "      <td>6318.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          time_used       user_id  discord_message_id  prompt_id  upvote_count   batch_index  daily_theme_id  dislike_count  flag_count    play_count  skip_count  slug  user_n_clips  total_start_s  total_clip_s  concat_play_counts      duration  options   continue_at  error_type  error_message  original_duration_s  has_continue_and_start_continue_at  duration_rel_diff  play_rel_diff\n",
       "count  78657.000000  7.865700e+04                 0.0        0.0  78657.000000  78657.000000             0.0        78657.0     78657.0  78657.000000     78657.0   0.0  78657.000000   48049.000000  48033.000000        48049.000000  78657.000000      0.0  40543.000000         0.0            0.0         48049.000000                        26683.000000       78657.000000   78657.000000\n",
       "mean      67.671271  3.725337e+06                 NaN        NaN      0.527544      0.517678             NaN            0.0         0.0      8.121502         0.0   NaN    784.131406      52.156664    214.344857          103.059856     67.197044      NaN     69.115725         NaN            NaN           109.248392                           63.367834          -1.651701       6.368689\n",
       "std       32.505499  1.944523e+06                 NaN        NaN      0.699265      0.499691             NaN            0.0         0.0     39.307605         0.0   NaN    857.194919      52.831272    125.224879         1356.869025     30.427584      NaN     48.903577         NaN            NaN            51.214971                           28.129117          22.627014      39.311565\n",
       "min        3.028488  3.000000e+00                 NaN        NaN     -1.000000      0.000000             NaN            0.0         0.0      2.000000         0.0   NaN     20.000000       0.000000     16.560000            5.000000     10.039979      NaN      1.000000         NaN            NaN            10.239979                           10.039979        -109.840000       0.000000\n",
       "25%       46.563219  2.000354e+06                 NaN        NaN      0.000000      0.000000             NaN            0.0         0.0      3.000000         0.0   NaN    267.000000       0.000000    148.640000            6.000000     48.199979      NaN     42.000000         NaN            NaN            76.319958                           46.079979          -8.600000       1.000000\n",
       "50%       61.058324  4.700348e+06                 NaN        NaN      1.000000      1.000000             NaN            0.0         0.0      6.000000         0.0   NaN    480.000000      50.519979    188.720000            8.000000     59.999979      NaN     59.999979         NaN            NaN           106.999958                           59.999979           0.000000       4.000000\n",
       "75%       89.198640  5.286772e+06                 NaN        NaN      1.000000      1.000000             NaN            0.0         0.0      9.000000         0.0   NaN    970.000000      68.000000    243.639979           13.000000     89.599979      NaN     88.999990         NaN            NaN           119.999979                           73.699979           5.560000       7.000000\n",
       "max      238.794114  6.112222e+06                 NaN        NaN     88.000000      1.000000             NaN            0.0         0.0   6321.000000         0.0   NaN  12533.000000    2038.719979   2080.719979       105307.000000    119.999979      NaN   2038.719979         NaN            NaN          2080.759958                          124.000000         108.680000    6318.000000"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_slice[df_slice[\"preference\"] == True].describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:14.960111Z",
     "start_time": "2024-04-12T15:46:14.835929Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>time_used</th>\n",
       "      <th>user_id</th>\n",
       "      <th>discord_message_id</th>\n",
       "      <th>prompt_id</th>\n",
       "      <th>upvote_count</th>\n",
       "      <th>batch_index</th>\n",
       "      <th>daily_theme_id</th>\n",
       "      <th>dislike_count</th>\n",
       "      <th>flag_count</th>\n",
       "      <th>play_count</th>\n",
       "      <th>skip_count</th>\n",
       "      <th>slug</th>\n",
       "      <th>user_n_clips</th>\n",
       "      <th>total_start_s</th>\n",
       "      <th>total_clip_s</th>\n",
       "      <th>concat_play_counts</th>\n",
       "      <th>duration</th>\n",
       "      <th>options</th>\n",
       "      <th>continue_at</th>\n",
       "      <th>error_type</th>\n",
       "      <th>error_message</th>\n",
       "      <th>original_duration_s</th>\n",
       "      <th>has_continue_and_start_continue_at</th>\n",
       "      <th>duration_rel_diff</th>\n",
       "      <th>play_rel_diff</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>78657.000000</td>\n",
       "      <td>7.865700e+04</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>78657.000000</td>\n",
       "      <td>78657.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>78657.000000</td>\n",
       "      <td>78657.000000</td>\n",
       "      <td>78657.000000</td>\n",
       "      <td>78657.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>78657.000000</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>78657.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>40543.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>78657.000000</td>\n",
       "      <td>78657.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>69.505060</td>\n",
       "      <td>3.725337e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000051</td>\n",
       "      <td>0.482322</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.104949</td>\n",
       "      <td>0.002047</td>\n",
       "      <td>1.752813</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>784.131406</td>\n",
       "      <td>68.431649</td>\n",
       "      <td>187.593326</td>\n",
       "      <td>4.833333</td>\n",
       "      <td>68.848746</td>\n",
       "      <td>NaN</td>\n",
       "      <td>69.115725</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>117.478295</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.228637</td>\n",
       "      <td>-1.764700</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>35.268005</td>\n",
       "      <td>1.944523e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.007131</td>\n",
       "      <td>0.499691</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.306490</td>\n",
       "      <td>0.045196</td>\n",
       "      <td>0.759140</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>857.194919</td>\n",
       "      <td>45.033549</td>\n",
       "      <td>91.888449</td>\n",
       "      <td>5.843366</td>\n",
       "      <td>33.039946</td>\n",
       "      <td>NaN</td>\n",
       "      <td>48.903577</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>43.598147</td>\n",
       "      <td>NaN</td>\n",
       "      <td>46.043756</td>\n",
       "      <td>10.970864</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>2.709564</td>\n",
       "      <td>3.000000e+00</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>20.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>59.519979</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>10.039979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>59.559958</td>\n",
       "      <td>NaN</td>\n",
       "      <td>-174.640000</td>\n",
       "      <td>-2221.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>45.685836</td>\n",
       "      <td>2.000354e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>267.000000</td>\n",
       "      <td>46.019979</td>\n",
       "      <td>127.220000</td>\n",
       "      <td>1.750000</td>\n",
       "      <td>47.119979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>42.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>85.229958</td>\n",
       "      <td>NaN</td>\n",
       "      <td>-32.080000</td>\n",
       "      <td>-2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>61.508941</td>\n",
       "      <td>4.700348e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>480.000000</td>\n",
       "      <td>59.999979</td>\n",
       "      <td>175.419990</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>59.999979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>59.999979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>112.279958</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>100.959296</td>\n",
       "      <td>5.286772e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>970.000000</td>\n",
       "      <td>93.799979</td>\n",
       "      <td>214.839984</td>\n",
       "      <td>4.250000</td>\n",
       "      <td>99.919979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>88.999990</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>143.929958</td>\n",
       "      <td>NaN</td>\n",
       "      <td>31.920000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>237.350943</td>\n",
       "      <td>6.112222e+06</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>12533.000000</td>\n",
       "      <td>168.000000</td>\n",
       "      <td>494.519979</td>\n",
       "      <td>25.000000</td>\n",
       "      <td>119.999979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2038.719979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>224.439979</td>\n",
       "      <td>NaN</td>\n",
       "      <td>117.520000</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          time_used       user_id  discord_message_id  prompt_id  upvote_count   batch_index  daily_theme_id  dislike_count    flag_count    play_count  skip_count  slug  user_n_clips  total_start_s  total_clip_s  concat_play_counts      duration  options   continue_at  error_type  error_message  original_duration_s  has_continue_and_start_continue_at  duration_rel_diff  play_rel_diff\n",
       "count  78657.000000  7.865700e+04                 0.0        0.0  78657.000000  78657.000000             0.0   78657.000000  78657.000000  78657.000000     78657.0   0.0  78657.000000      24.000000     24.000000           24.000000  78657.000000      0.0  40543.000000         0.0            0.0            24.000000                                 0.0       78657.000000   78657.000000\n",
       "mean      69.505060  3.725337e+06                 NaN        NaN      0.000051      0.482322             NaN       0.104949      0.002047      1.752813         0.0   NaN    784.131406      68.431649    187.593326            4.833333     68.848746      NaN     69.115725         NaN            NaN           117.478295                                 NaN           0.228637      -1.764700\n",
       "std       35.268005  1.944523e+06                 NaN        NaN      0.007131      0.499691             NaN       0.306490      0.045196      0.759140         0.0   NaN    857.194919      45.033549     91.888449            5.843366     33.039946      NaN     48.903577         NaN            NaN            43.598147                                 NaN          46.043756      10.970864\n",
       "min        2.709564  3.000000e+00                 NaN        NaN      0.000000      0.000000             NaN       0.000000      0.000000      1.000000         0.0   NaN     20.000000       0.000000     59.519979            1.000000     10.039979      NaN      1.000000         NaN            NaN            59.559958                                 NaN        -174.640000   -2221.000000\n",
       "25%       45.685836  2.000354e+06                 NaN        NaN      0.000000      0.000000             NaN       0.000000      0.000000      1.000000         0.0   NaN    267.000000      46.019979    127.220000            1.750000     47.119979      NaN     42.000000         NaN            NaN            85.229958                                 NaN         -32.080000      -2.000000\n",
       "50%       61.508941  4.700348e+06                 NaN        NaN      0.000000      0.000000             NaN       0.000000      0.000000      2.000000         0.0   NaN    480.000000      59.999979    175.419990            3.000000     59.999979      NaN     59.999979         NaN            NaN           112.279958                                 NaN           0.000000      -1.000000\n",
       "75%      100.959296  5.286772e+06                 NaN        NaN      0.000000      1.000000             NaN       0.000000      0.000000      2.000000         0.0   NaN    970.000000      93.799979    214.839984            4.250000     99.919979      NaN     88.999990         NaN            NaN           143.929958                                 NaN          31.920000       0.000000\n",
       "max      237.350943  6.112222e+06                 NaN        NaN      1.000000      1.000000             NaN       1.000000      1.000000      3.000000         0.0   NaN  12533.000000     168.000000    494.519979           25.000000    119.999979      NaN   2038.719979         NaN            NaN           224.439979                                 NaN         117.520000       2.000000"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_slice[df_slice[\"preference\"] == False].describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:14.967621Z",
     "start_time": "2024-04-12T15:46:14.961319Z"
    }
   },
   "outputs": [],
   "source": [
    "test_mask = (df_slice[\"preference\"] == True) & (\n",
    "    (df_slice[\"is_in_playlist\"] == True) | (df_slice[\"concat_in_playlist\"] == True)\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.051931Z",
     "start_time": "2024-04-12T15:46:14.969237Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(21210, 71)"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_slice[test_mask].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:48:18.190683Z",
     "start_time": "2024-04-12T15:48:09.947590Z"
    }
   },
   "outputs": [],
   "source": [
    "df_slice.to_csv(\"/home/tony/Data/Preference/7b_v2/r0_repro_v3.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.694151Z",
     "start_time": "2024-04-12T15:46:15.053026Z"
    }
   },
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'BREAK' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[37], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mBREAK\u001b[49m\n",
      "\u001b[0;31mNameError\u001b[0m: name 'BREAK' is not defined"
     ]
    }
   ],
   "source": [
    "BREAK"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Need to kick out the ones has gpt prompt -- these are pairs with different text inputs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.695116Z",
     "start_time": "2024-04-12T15:46:15.695107Z"
    }
   },
   "outputs": [],
   "source": [
    "# don't have continue at\n",
    "df_slice[df_slice[\"continue_at\"].isna()][\"request_id\"].nunique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.695868Z",
     "start_time": "2024-04-12T15:46:15.695859Z"
    }
   },
   "outputs": [],
   "source": [
    "final_filtered_requests = df_slice[\"request_id\"].unique()\n",
    "print(len(final_filtered_requests))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.696472Z",
     "start_time": "2024-04-12T15:46:15.696464Z"
    }
   },
   "outputs": [],
   "source": [
    "train_requests, val_requests = train_test_split(\n",
    "    sorted(list(final_filtered_requests)), test_size=0.01, random_state=42\n",
    ")\n",
    "print(len(train_requests), len(val_requests))\n",
    "\n",
    "train_df = df_slice[df_slice[\"request_id\"].isin(set(train_requests))].copy()\n",
    "val_df = df_slice[df_slice[\"request_id\"].isin(set(val_requests))].copy()\n",
    "train_df = train_df.sort_values(by=[\"request_id\", \"preference\"])\n",
    "train_df = train_df.reset_index()\n",
    "val_df = val_df.sort_values(by=[\"request_id\", \"preference\"])\n",
    "val_df = val_df.reset_index()\n",
    "\n",
    "print(train_df.shape, val_df.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.697257Z",
     "start_time": "2024-04-12T15:46:15.697249Z"
    }
   },
   "outputs": [],
   "source": [
    "def reshift(arr):\n",
    "    sem_start_idx = 0\n",
    "    sem_end_idx = len(arr) - 1\n",
    "    semantic_arr = arr[:, :SEMANTIC_N_CODEBOOKS]\n",
    "    coarse_arr = arr[:, SEMANTIC_N_CODEBOOKS:]\n",
    "\n",
    "    coarse_start_idx = int(round(sem_start_idx * COARSE_RATE_HZ / SEMANTIC_RATE_HZ))\n",
    "    coarse_end_idx = int(round(sem_end_idx * COARSE_RATE_HZ / SEMANTIC_RATE_HZ))\n",
    "    assert sem_end_idx >= 0 and coarse_start_idx >= 0\n",
    "    assert not (sem_end_idx > len(semantic_arr) or coarse_end_idx > len(coarse_arr))\n",
    "\n",
    "    # get array segments\n",
    "    arr_s = semantic_arr[sem_start_idx:sem_end_idx, :].copy()\n",
    "    arr_c = coarse_arr[coarse_start_idx:coarse_end_idx, :].copy()\n",
    "    assert arr_s.max() <= SEMANTIC_PAD_TOKEN\n",
    "    assert arr_c.max() <= COARSE_PAD_TOKEN\n",
    "    assert len(arr_s) == len(arr_c)\n",
    "    # concat and stack\n",
    "    if len(arr_c) < N_TOKENS_AUDIO:\n",
    "        arr_c = np.pad(\n",
    "            arr_c,\n",
    "            ((0, N_TOKENS_AUDIO - len(arr_c)), (0, 0)),\n",
    "            constant_values=COARSE_PAD_TOKEN,\n",
    "            mode=\"constant\",\n",
    "        )\n",
    "        arr_s = np.pad(\n",
    "            arr_s,\n",
    "            ((0, N_TOKENS_AUDIO - len(arr_s)), (0, 0)),\n",
    "            constant_values=SEMANTIC_PAD_TOKEN,\n",
    "            mode=\"constant\",\n",
    "        )\n",
    "    arr = np.concatenate([arr_s, arr_c], axis=-1)\n",
    "    arr = arr.astype(np.uint16)\n",
    "    assert arr.shape == (N_TOKENS_AUDIO, SEMANTIC_N_CODEBOOKS + COARSE_N_CODEBOOKS)\n",
    "    return arr\n",
    "\n",
    "\n",
    "def make_dataset(input_df, is_val=False):\n",
    "    dset_type = \"val\" if is_val else \"tr\"\n",
    "    out_mmap_path = os.path.join(OUT_DATA_DIR, f\"data_{dset_type}.bin\")\n",
    "    out_metas_path = os.path.join(OUT_DATA_DIR, f\"meta_{dset_type}.jsonl\")\n",
    "    out_info_filepath = os.path.join(OUT_DATA_DIR, f\"info_{dset_type}.json\")\n",
    "\n",
    "    # gather the data\n",
    "    _ = np.memmap(out_mmap_path, dtype=np.uint16, mode=\"w+\", shape=(1,))\n",
    "    n_offs = 0\n",
    "    tot_duration_dict = defaultdict(int)\n",
    "    datasets_info = defaultdict(dict)\n",
    "    n = 0\n",
    "    for i, row in tqdm.tqdm(input_df.iterrows(), total=len(input_df)):\n",
    "        # we need to alternate between preference: neg, pos\n",
    "        # print(i, row)\n",
    "        assert row[\"preference\"] == (i % 2 == 1)\n",
    "        # make mmap -- two different paths\n",
    "        local_path = (\n",
    "            f\"{NPZ_DIR}/{row['s3_id']}.npz\"\n",
    "            if row[\"is_7b\"]\n",
    "            else f\"/app/suno/data/dpo/7b_npz/{row['s3_id']}.npz\"\n",
    "        )\n",
    "        if not os.path.exists(local_path):\n",
    "            # print(row, local_path)\n",
    "            raise ValueError()\n",
    "        # print(local_path)\n",
    "        # print( np.load(local_path))\n",
    "        try:\n",
    "            arr = (\n",
    "                np.load(local_path)[\"v3.0_raw\"]\n",
    "                if row[\"is_7b\"]\n",
    "                else np.load(local_path)[\"v2_raw\"]\n",
    "            )\n",
    "        except Exception as e:\n",
    "            print(local_path)\n",
    "            raise e\n",
    "        assert arr.shape[0] <= 3000\n",
    "        assert arr.shape[1] == 13\n",
    "        arr_duration = arr.shape[0] / 25\n",
    "        # print(arr.shape)\n",
    "        arr = reshift(arr)\n",
    "        # print(\"after shift and pad\", arr.shape)\n",
    "        arr = arr.reshape(\n",
    "            -1,\n",
    "        )\n",
    "        # print(arr.shape)\n",
    "        out_mm = np.memmap(\n",
    "            out_mmap_path,\n",
    "            dtype=np.uint16,\n",
    "            mode=\"r+\",\n",
    "            shape=(n_offs + arr.size,),\n",
    "        )\n",
    "        out_mm[n_offs : n_offs + arr.size] = arr\n",
    "        # print(f\"offset is: {n_offs}\")\n",
    "        # break\n",
    "        # write it once\n",
    "        out_mm.flush()\n",
    "        del out_mm\n",
    "\n",
    "        add_metas = []\n",
    "        add_meta = {\n",
    "            \"dataset\": f\"perference_{int(row['preference'])}\",\n",
    "            \"id\": row[\"s3_id\"],  # this is the row s3_id\n",
    "            \"start_s\": row[\"total_start_s\"] if row[\"total_start_s\"] else 0,\n",
    "            \"end_s\": (\n",
    "                None if not row[\"total_clip_s\"] else row[\"total_clip_s\"]\n",
    "            ),  # for full clips we do know it has an edding, other wise, we don't know\n",
    "            \"original_duration_s\": (\n",
    "                arr_duration\n",
    "                if not row[\"original_duration_s\"]\n",
    "                else row[\"original_duration_s\"]\n",
    "            ),  # this nees to be... a bit more complicated, only works with concat!\n",
    "            \"vocal_start_s\": None,  # these are unfortunately missing for now\n",
    "            \"vocal_end_s\": None,  # these are unfortunately missing for now\n",
    "            \"tags\": [\n",
    "                row[\"tags\"] if row[\"tags\"] else \"\"\n",
    "            ],  # tags is a list, do you know :)\n",
    "            \"text\": row[\"prompt\"] if row[\"prompt\"] else \"\",\n",
    "        }\n",
    "        add_metas.append(add_meta)\n",
    "        tot_duration_dict[row[\"preference\"]] += arr_duration\n",
    "        write_jsonl(\n",
    "            add_metas,\n",
    "            os.path.join(out_metas_path),\n",
    "            do_append=bool(n_offs != 0),\n",
    "        )\n",
    "        if \"idx_list\" not in datasets_info[add_meta[\"dataset\"]]:\n",
    "            datasets_info[add_meta[\"dataset\"]][\"idx_list\"] = [n]\n",
    "        else:\n",
    "            datasets_info[add_meta[\"dataset\"]][\"idx_list\"].append(n)\n",
    "        n += 1\n",
    "        n_offs += arr.size\n",
    "\n",
    "    write_json(datasets_info, out_info_filepath)\n",
    "    print(f\"Total {n} clips\")\n",
    "    for k, v in tot_duration_dict.items():\n",
    "        print(f\"{round(v / 60 / 60):,} hours of {k}\")\n",
    "    print(f\"Done\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Actually make"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.697870Z",
     "start_time": "2024-04-12T15:46:15.697863Z"
    }
   },
   "outputs": [],
   "source": [
    "# val_df[[\"request_id\", \"metadata\", \"updated_at\", \"user_id\", \"preference\"]].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.698598Z",
     "start_time": "2024-04-12T15:46:15.698590Z"
    }
   },
   "outputs": [],
   "source": [
    "# total_duration = 0\n",
    "# for i, row in tqdm.tqdm(train_df.iterrows(), total=len(train_df)):\n",
    "#     # we need to alternate between preference: neg, pos\n",
    "#     # print(i, row)\n",
    "#     try:\n",
    "#         assert row[\"preference\"] == (i % 2 == 1)\n",
    "#     except:\n",
    "#         print(i, row)\n",
    "#     total_duration += row[\"duration\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.699448Z",
     "start_time": "2024-04-12T15:46:15.699439Z"
    }
   },
   "outputs": [],
   "source": [
    "# print(f\"{round(total_duration / 60 / 60):,} hours of {train_df.shape[0]} clips, {train_df.shape[0] / 8 / 4 / 1500} nodes\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.700005Z",
     "start_time": "2024-04-12T15:46:15.699997Z"
    }
   },
   "outputs": [],
   "source": [
    "make_dataset(val_df, is_val=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.700750Z",
     "start_time": "2024-04-12T15:46:15.700742Z"
    }
   },
   "outputs": [],
   "source": [
    "make_dataset(train_df, is_val=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-01-29T19:46:47.549860Z",
     "start_time": "2024-01-29T19:46:47.548015Z"
    }
   },
   "source": [
    "# Validation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.701369Z",
     "start_time": "2024-04-12T15:46:15.701362Z"
    }
   },
   "outputs": [],
   "source": [
    "# verify\n",
    "mm = np.memmap(os.path.join(OUT_DATA_DIR, f\"data_val.bin\"), dtype=np.uint16, mode=\"r\")\n",
    "test_metas = read_jsonl(os.path.join(OUT_DATA_DIR, f\"meta_val.jsonl\"))\n",
    "test_info = read_json(os.path.join(OUT_DATA_DIR, f\"info_val.json\"))\n",
    "mm = mm.reshape(-1, 3008, 13)\n",
    "assert len(mm) == len(test_metas)\n",
    "assert mm[:100, :, 0].min() >= 0\n",
    "assert mm[:100, :, 0].max() <= 4000\n",
    "assert mm[:100, :, 1:].min() >= 0\n",
    "assert mm[:100, :, 1:].max() <= 2048"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.702005Z",
     "start_time": "2024-04-12T15:46:15.701997Z"
    }
   },
   "outputs": [],
   "source": [
    "# randomly listen to some stuff\n",
    "from suno_utils.tasks.dac_2c_12cb import preload_models as preload_codec_models\n",
    "from suno_utils.tasks.dac_2c_12cb import (\n",
    "    encode as codec_encode,\n",
    "    decode_stream_to_full_audio as codec_decode,\n",
    "    EMBEDDING_RATE as CODEC_EMBEDDING_RATE,\n",
    ")\n",
    "os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"2\"\n",
    "_ = preload_codec_models(\"/app/suno/tony/v3/dac_2c_25x12.pt\", device=\"cuda\")\n",
    "assert len(test_metas) == len(mm)\n",
    "idx_list = list(range(len(test_metas)))\n",
    "# random.shuffle(idx_list)\n",
    "# idx_list = [idx for idx in idx_list if \"text\" in test_metas[idx]]\n",
    "print(len(mm))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.702897Z",
     "start_time": "2024-04-12T15:46:15.702888Z"
    }
   },
   "outputs": [],
   "source": [
    "idx = random.choice(test_info[\"perference_0\"][\"idx_list\"])\n",
    "assert \"original_duration_s\" in test_metas[idx]\n",
    "# positive index should be shifted by 1\n",
    "pos_idx = idx + 1\n",
    "print(\n",
    "    \"tags:\",\n",
    "    test_metas[idx].get(\"tags\") == test_metas[pos_idx].get(\"tags\"),\n",
    "    test_metas[idx].get(\"tags\"),\n",
    ")\n",
    "arr = mm[idx, 1:].copy().astype(np.int16)[:, 1:]\n",
    "pos_arr = mm[pos_idx, 1:].copy().astype(np.int16)[:, 1:]\n",
    "pad_idx_arr = np.where(arr == COARSE_PAD_TOKEN)[0]\n",
    "if len(pad_idx_arr) > 0:\n",
    "    arr = arr[: pad_idx_arr[0], :]\n",
    "pos_pad_idx_arr = np.where(pos_arr == COARSE_PAD_TOKEN)[0]\n",
    "if len(pos_pad_idx_arr) > 0:\n",
    "    pos_arr = pos_arr[: pos_pad_idx_arr[0], :]\n",
    "a = codec_decode(arr)\n",
    "print(\"negative example\")\n",
    "a.play(compress=False)\n",
    "pos_a = codec_decode(pos_arr)\n",
    "print(\"positive example\")\n",
    "pos_a.play(compress=False)\n",
    "print(\n",
    "    \"text:\",\n",
    "    test_metas[idx].get(\"text\") == test_metas[pos_idx].get(\"text\"),\n",
    "    test_metas[idx].get(\"text\"),\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.703577Z",
     "start_time": "2024-04-12T15:46:15.703568Z"
    }
   },
   "outputs": [],
   "source": [
    "from collections import Counter\n",
    "c = Counter()\n",
    "for _, row in df_slice.iterrows():\n",
    "    # print(row[\"metadata\"])\n",
    "    for k in ast.literal_eval(row[\"metadata\"]).keys():\n",
    "        c[k] += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.704205Z",
     "start_time": "2024-04-12T15:46:15.704197Z"
    }
   },
   "outputs": [],
   "source": [
    "# original_npz_path = f\"/app/suno/data/dpo/7b_npz/{test_metas[idx]['id']}.npz\"\n",
    "# original_npz_path = \"/app/suno/data/dpo/7b_npz/729c3011-f672-4ccd-8d82-1cbf2b52ff69.npz\"\n",
    "# original_arr = np.load(original_npz_path)[\"v2_raw\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.704782Z",
     "start_time": "2024-04-12T15:46:15.704774Z"
    }
   },
   "outputs": [],
   "source": [
    "total_bad = 0\n",
    "total_good = 0\n",
    "for idx in range(len(test_metas)):\n",
    "    if idx % 2 == 0:\n",
    "        pos_idx = idx + 1\n",
    "        if test_metas[idx].get(\"tags\") != test_metas[pos_idx].get(\"tags\"):\n",
    "            # print(test_metas[idx].get(\"text\") == test_metas[pos_idx].get(\"text\"), test_metas[idx].get(\"tags\"), test_metas[pos_idx].get(\"tags\"))\n",
    "            total_bad += 1\n",
    "        else:\n",
    "            total_good += 1\n",
    "print(total_good, total_bad)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.705563Z",
     "start_time": "2024-04-12T15:46:15.705554Z"
    }
   },
   "outputs": [],
   "source": [
    "train_info = read_json(os.path.join(OUT_DATA_DIR, f\"info_tr.json\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.706192Z",
     "start_time": "2024-04-12T15:46:15.706185Z"
    }
   },
   "outputs": [],
   "source": [
    "n_neg_tr = train_info[\"perference_0\"][\"idx_list\"]\n",
    "n_pos_tr = train_info[\"perference_1\"][\"idx_list\"]\n",
    "assert len(n_pos_tr) == len(n_neg_tr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.706759Z",
     "start_time": "2024-04-12T15:46:15.706751Z"
    }
   },
   "outputs": [],
   "source": [
    "total_iters = (len(n_neg_tr) + len(n_pos_tr))\n",
    "print(\"total samples\", total_iters, train_df.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.707410Z",
     "start_time": "2024-04-12T15:46:15.707403Z"
    }
   },
   "outputs": [],
   "source": [
    "print(\"1 epoch per batch 4, total\", total_iters / 8 / 4 / 8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-12T15:46:15.707914Z",
     "start_time": "2024-04-12T15:46:15.707906Z"
    }
   },
   "outputs": [],
   "source": [
    "# !cd /home/tony/Work/tony/slurm && sbatch sbatch_dpo"
   ]
  },
  {
   "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.13"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
