{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['index', 'id', 'created_at', 'updated_at', 'time_used', 'metadata',\n",
       "       'user_id', 'status', 'discord_message_id', 'prompt_id', 'request_id',\n",
       "       'is_generated', 's3_id', 'upvote_count', 'batch_index', 'model_name',\n",
       "       'prompt_text', 'daily_theme_id', 'is_deleted', 'image_s3_id',\n",
       "       'is_public', 'dislike_count', 'flag_count', 'play_count', 'skip_count',\n",
       "       'title', 'slug', 'p_date', 'p_hour', 'created_session_id',\n",
       "       'continued_parent', 'duration', 'source', 'clip_type', 'task',\n",
       "       'edited_clip_id', 'is_pro_user', 'is_in_playlist', 'has_stems',\n",
       "       'user_n_clips', 'upvoted', 'downvoted', 'has_continued',\n",
       "       'part_of_concat', 'has_action', 'flagged', 'deleted', 'n_edits',\n",
       "       'pos_preference', 'neg_preference', 'diff_preference', 'preference',\n",
       "       'reaction_play_count', 'reaction_pro_play_count', 'total_start_s',\n",
       "       'total_clip_s', 'concat_play_counts', 'concat_in_playlist',\n",
       "       'concat_likes', 'concat_dislikes'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# load pickle file via pandas\n",
    "import pandas as pd\n",
    "\n",
    "filepath = \"/home/tony/Data/Preference/up_v3/interesting_clips_vol_exp_20250121_full.pkl\"\n",
    "df = pd.read_pickle(filepath)\n",
    "\n",
    "df.columns\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['chirp-v4-h-s-32-vol-15', 'chirp-v4-h-s-32',\n",
       "       'chirp-v4-h-s-32-vol-07', 'chirp-v4-up-u-3-vol-15',\n",
       "       'chirp-v4-up-u-3', 'chirp-v4-up-u-3-vol-07'], dtype=object)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"model_name\"].unique() # this is how you find the experiment name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5297 12066 user_id\n",
      "67470363    18\n",
      "21253765    14\n",
      "67542042    10\n",
      "62624601    10\n",
      "57615288    10\n",
      "            ..\n",
      "30169874     2\n",
      "30159602     2\n",
      "30128406     2\n",
      "29976121     2\n",
      "30373726     2\n",
      "Name: id, Length: 5297, dtype: int64\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAicAAAGdCAYAAADJ6dNTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAd9UlEQVR4nO3df3TV9X348VcACcggFjgGIiB2c7qgJhYCp2qrrDmlmQeHnrZsp6UpPcdz1nPTitlh4nqAs60r2k3K6u6R2c65ns2N7ZzJrKysLgeh3bAEMrp64rRs6CgsQU9nInGNNLnfP/Y1LRXBhJt83jf38Tjn/nE/957P5/XhR3jyuZ/P51YUCoVCAAAkYkLWAwAA/DRxAgAkRZwAAEkRJwBAUsQJAJAUcQIAJEWcAABJEScAQFImZT3AcA0ODsaJEydi+vTpUVFRkfU4AMA7UCgU4rXXXouampqYMOHcx0ZKLk5OnDgR8+fPz3oMAGAEjh07FvPmzTvne0omTvL5fOTz+fjxj38cEf+3czNmzMh4KgDgnejt7Y358+fH9OnTz/veilL7bp3e3t6oqqqKnp4ecQIAJWI4/347IRYASIo4AQCSIk4AgKSIEwAgKSUTJ/l8Pmpra6OhoSHrUQCAUeRqHQBg1LlaBwAoWeIEAEiKOAEAkiJOAICkiBMAICklEycuJQaA8uBSYgBg1A3n3+9JYzRTyVi4YVfWIwzbi/fdmvUIAFA0JfOxDgBQHsQJAJAUcQIAJEWcAABJEScAQFLECQCQlJKJEzdhA4DyUDJxksvlorOzM9rb27MeBQAYRSUTJwBAeRAnAEBSxAkAkBRxAgAkRZwAAEkRJwBAUsQJAJAUcQIAJEWcAABJKZk4cft6ACgPJRMnbl8PAOWhZOIEACgP4gQASIo4AQCSIk4AgKSIEwAgKeIEAEiKOAEAkiJOAICkiBMAICniBABIijgBAJIiTgCApIgTACAp4gQASIo4AQCSUjJxks/no7a2NhoaGrIeBQAYRSUTJ7lcLjo7O6O9vT3rUQCAUVQycQIAlAdxAgAkRZwAAEkRJwBAUsQJAJAUcQIAJEWcAABJEScAQFLECQCQFHECACRFnAAASREnAEBSxAkAkBRxAgAkRZwAAEkRJwBAUsQJAJAUcQIAJEWcAABJGfM4efXVV2PJkiVRX18f11xzTXzlK18Z6xEAgIRNGusNTp8+Pfbt2xcXX3xx9PX1xTXXXBN33HFHzJo1a6xHAQASNOZHTiZOnBgXX3xxRET09/dHoVCIQqEw1mMAAIkadpzs27cvVq5cGTU1NVFRURE7d+58y3vy+XwsXLgwpkyZEsuWLYsDBw6c8fqrr74adXV1MW/evFi/fn3Mnj17xDsAAIwvw46Tvr6+qKuri3w+f9bXd+zYEa2trbF58+bo6OiIurq6WLFiRZw8eXLoPZdcckl897vfjaNHj8Zjjz0W3d3dI98DAGBcGXacNDU1xec///m4/fbbz/r61q1b484774y1a9dGbW1tbN++PS6++OJ45JFH3vLe6urqqKuri29961tvu73+/v7o7e094wEAjF9FPefkjTfeiEOHDkVjY+NPNjBhQjQ2Nsb+/fsjIqK7uztee+21iIjo6emJffv2xVVXXfW269yyZUtUVVUNPebPn1/MkQGAxBQ1Tl555ZUYGBiI6urqM5ZXV1dHV1dXRES89NJL8b73vS/q6urife97X3zmM5+Ja6+99m3Xee+990ZPT8/Q49ixY8UcGQBIzJhfSrx06dI4fPjwO35/ZWVlVFZWjt5AAEBSinrkZPbs2TFx4sS3nODa3d0dc+bMKeamAIBxqqhxMnny5Fi8eHG0tbUNLRscHIy2trZ473vfe0HrzufzUVtbGw0NDRc6JgCQsGF/rHPq1Kk4cuTI0POjR4/G4cOHY+bMmbFgwYJobW2N5ubmWLJkSSxdujS2bdsWfX19sXbt2gsaNJfLRS6Xi97e3qiqqrqgdQEA6Rp2nBw8eDCWL18+9Ly1tTUiIpqbm+PRRx+N1atXx8svvxybNm2Krq6uqK+vj927d7/lJFkAgLOpKJTYvePfPHLS09MTM2bMKPr6F27YVfR1jrYX77s16xEA4JyG8+/3mH+3DgDAuZRMnDghFgDKQ8nESS6Xi87Ozmhvb896FABgFJVMnAAA5UGcAABJEScAQFJKJk6cEAsA5aFk4sQJsQBQHkomTgCA8iBOAICkiBMAICniBABISsnEiat1AKA8lEycuFoHAMpDycQJAFAexAkAkBRxAgAkRZwAAEkRJwBAUsQJAJCUkokT9zkBgPJQMnHiPicAUB5KJk4AgPIwKesBuHALN+zKeoRhe/G+W7MeAYBEOXICACRFnAAASREnAEBSxAkAkJSSiRP3OQGA8lAyceI+JwBQHkomTgCA8iBOAICkiBMAICniBABIijgBAJIiTgCApIgTACAp4gQASIo4AQCSIk4AgKSUTJz4bh0AKA8lEye+WwcAykPJxAkAUB7ECQCQFHECACRFnAAASREnAEBSxAkAkBRxAgAkRZwAAEkRJwBAUsQJAJAUcQIAJEWcAABJEScAQFLECQCQlJKJk3w+H7W1tdHQ0JD1KADAKCqZOMnlctHZ2Rnt7e1ZjwIAjKKSiRMAoDyIEwAgKeIEAEiKOAEAkiJOAICkiBMAICniBABIijgBAJIiTgCApIgTACAp4gQASIo4AQCSIk4AgKSIEwAgKeIEAEiKOAEAkiJOAICkiBMAICniBABIijgBAJIy5nFy7NixuOWWW6K2tjauu+66+Nu//duxHgEASNikMd/gpEmxbdu2qK+vj66urli8eHH8yq/8SkybNm2sRwEAEjTmcTJ37tyYO3duRETMmTMnZs+eHT/84Q/FCQAQESP4WGffvn2xcuXKqKmpiYqKiti5c+db3pPP52PhwoUxZcqUWLZsWRw4cOCs6zp06FAMDAzE/Pnzhz04ADA+DTtO+vr6oq6uLvL5/Flf37FjR7S2tsbmzZujo6Mj6urqYsWKFXHy5Mkz3vfDH/4wPvGJT8TDDz88sskBgHFp2B/rNDU1RVNT09u+vnXr1rjzzjtj7dq1ERGxffv22LVrVzzyyCOxYcOGiIjo7++PVatWxYYNG+KGG2445/b6+/ujv79/6Hlvb+9wRwYASkhRr9Z544034tChQ9HY2PiTDUyYEI2NjbF///6IiCgUCvHJT34yfvmXfznWrFlz3nVu2bIlqqqqhh4+AgKA8a2ocfLKK6/EwMBAVFdXn7G8uro6urq6IiLin//5n2PHjh2xc+fOqK+vj/r6+vje9773tuu89957o6enZ+hx7NixYo4MACRmzK/Wuemmm2JwcPAdv7+ysjIqKytHcSIAICVFPXIye/bsmDhxYnR3d5+xvLu7O+bMmVPMTQEA41RRj5xMnjw5Fi9eHG1tbbFq1aqIiBgcHIy2trZoaWm5oHXn8/nI5/MxMDBQhEnJ2sINu7IeYdhevO/WrEcAKAvDjpNTp07FkSNHhp4fPXo0Dh8+HDNnzowFCxZEa2trNDc3x5IlS2Lp0qWxbdu26OvrG7p6Z6RyuVzkcrno7e2NqqqqC1oXAJCuYcfJwYMHY/ny5UPPW1tbIyKiubk5Hn300Vi9enW8/PLLsWnTpujq6or6+vrYvXv3W06SBQA4m4pCoVDIeojhePPISU9PT8yYMaPo6y/FjxsYGz7WARi54fz7PebfSjxS+Xw+amtro6GhIetRAIBRVDJxksvlorOzM9rb27MeBQAYRSUTJwBAeRAnAEBSxAkAkBRxAgAkpWTixNU6AFAeSiZOXK0DAOWhZOIEACgP4gQASIo4AQCSIk4AgKSUTJy4WgcAykPJxImrdQCgPJRMnAAA5UGcAABJEScAQFLECQCQFHECACSlZOLEpcQAUB5KJk5cSgwA5aFk4gQAKA/iBABIijgBAJIiTgCApIgTACAp4gQASIo4AQCSUjJx4iZsAFAeSiZO3IQNAMpDycQJAFAexAkAkBRxAgAkRZwAAEkRJwBAUsQJAJAUcQIAJEWcAABJEScAQFJKJk7cvh4AykPJxInb1wNAeSiZOAEAyoM4AQCSIk4AgKSIEwAgKeIEAEiKOAEAkiJOAICkiBMAICniBABIijgBAJIiTgCApIgTACAp4gQASIo4AQCSUjJxks/no7a2NhoaGrIeBQAYRSUTJ7lcLjo7O6O9vT3rUQCAUVQycQIAlAdxAgAkRZwAAEkRJwBAUsQJAJAUcQIAJEWcAABJEScAQFLECQCQFHECACRFnAAASREnAEBSxAkAkJRJWQ8ApWLhhl1ZjzBsL953a9YjAAybIycAQFLECQCQFHECACRFnAAASREnAEBSxAkAkJRM4uT222+Pd73rXfHhD384i80DAAnLJE7uuuuu+NrXvpbFpgGAxGUSJ7fccktMnz49i00DAIkbdpzs27cvVq5cGTU1NVFRURE7d+58y3vy+XwsXLgwpkyZEsuWLYsDBw4UY1YAoAwMO076+vqirq4u8vn8WV/fsWNHtLa2xubNm6OjoyPq6upixYoVcfLkyQseFgAY/4b93TpNTU3R1NT0tq9v3bo17rzzzli7dm1ERGzfvj127doVjzzySGzYsGHYA/b390d/f//Q897e3mGvAwAoHUU95+SNN96IQ4cORWNj4082MGFCNDY2xv79+0e0zi1btkRVVdXQY/78+cUaFwBIUFHj5JVXXomBgYGorq4+Y3l1dXV0dXUNPW9sbIyPfOQj8Q//8A8xb968c4bLvffeGz09PUOPY8eOFXNkACAxw/5Ypxj+6Z/+6R2/t7KyMiorK0dxGgAgJUU9cjJ79uyYOHFidHd3n7G8u7s75syZU8xNAQDjVFGPnEyePDkWL14cbW1tsWrVqoiIGBwcjLa2tmhpabmgdefz+cjn8zEwMFCESYFULdywK+sRhu3F+27NegQYV4YdJ6dOnYojR44MPT969GgcPnw4Zs6cGQsWLIjW1tZobm6OJUuWxNKlS2Pbtm3R19c3dPXOSOVyucjlctHb2xtVVVUXtC4AIF3DjpODBw/G8uXLh563trZGRERzc3M8+uijsXr16nj55Zdj06ZN0dXVFfX19bF79+63nCQLAHA2w46TW265JQqFwjnf09LScsEf4wAA5SmT79YBAHg7JRMn+Xw+amtro6GhIetRAIBRVDJxksvlorOzM9rb27MeBQAYRSUTJwBAeRAnAEBSxAkAkJSSiRMnxAJAeSiZOHFCLACUh5KJEwCgPIgTACAp4gQASIo4AQCSUjJx4modACgPJRMnrtYBgPJQMnECAJQHcQIAJEWcAABJEScAQFLECQCQFHECACSlZOLEfU4AoDyUTJy4zwkAlIeSiRMAoDyIEwAgKeIEAEiKOAEAkiJOAICkiBMAICklEyfucwIA5aFk4sR9TgCgPJRMnAAA5UGcAABJEScAQFLECQCQFHECACRFnAAASREnAEBSxAkAkBRxAgAkRZwAAEkpmTjx3ToAUB5KJk58tw4AlIeSiRMAoDyIEwAgKeIEAEiKOAEAkiJOAICkiBMAICniBABIijgBAJIiTgCApIgTACAp4gQASIo4AQCSIk4AgKSIEwAgKSUTJ/l8Pmpra6OhoSHrUQCAUVQycZLL5aKzszPa29uzHgUAGEUlEycAQHkQJwBAUsQJAJAUcQIAJEWcAABJEScAQFLECQCQFHECACRFnAAASREnAEBSxAkAkBRxAgAkRZwAAEkRJwBAUsQJAJAUcQIAJEWcAABJEScAQFLECQCQFHECACQlkzh58skn46qrroorr7wyvvrVr2YxAgCQqEljvcEf//jH0draGnv27ImqqqpYvHhx3H777TFr1qyxHgUASNCYHzk5cOBALFq0KC677LL4uZ/7uWhqaopvfvObYz0GAJCoYcfJvn37YuXKlVFTUxMVFRWxc+fOt7wnn8/HwoULY8qUKbFs2bI4cODA0GsnTpyIyy67bOj5ZZddFsePHx/Z9ADAuDPsOOnr64u6urrI5/NnfX3Hjh3R2toamzdvjo6Ojqirq4sVK1bEyZMnRzRgf39/9Pb2nvEAAMavYZ9z0tTUFE1NTW/7+tatW+POO++MtWvXRkTE9u3bY9euXfHII4/Ehg0boqam5owjJcePH4+lS5e+7fq2bNkSv/M7vzPcMQE4h4UbdmU9wrC9eN+tWY8wbH6dR6ao55y88cYbcejQoWhsbPzJBiZMiMbGxti/f39ERCxdujSeffbZOH78eJw6dSq+8Y1vxIoVK952nffee2/09PQMPY4dO1bMkQGAxBT1ap1XXnklBgYGorq6+ozl1dXV8e///u//t8FJk+KBBx6I5cuXx+DgYPzWb/3WOa/UqaysjMrKymKOCQAkbMwvJY6IuO222+K2227LYtMAQOKK+rHO7NmzY+LEidHd3X3G8u7u7pgzZ04xNwUAjFNFjZPJkyfH4sWLo62tbWjZ4OBgtLW1xXvf+94LWnc+n4/a2tpoaGi40DEBgIQN+2OdU6dOxZEjR4aeHz16NA4fPhwzZ86MBQsWRGtrazQ3N8eSJUti6dKlsW3btujr6xu6emekcrlc5HK56O3tjaqqqgtaFwCQrmHHycGDB2P58uVDz1tbWyMiorm5OR599NFYvXp1vPzyy7Fp06bo6uqK+vr62L1791tOkgUAOJthx8ktt9wShULhnO9paWmJlpaWEQ8FAJSvTL6VeCSccwIA5aFk4iSXy0VnZ2e0t7dnPQoAMIpKJk4AgPIgTgCApIgTACAp4gQASErJxImrdQCgPGTyxX8j8eYdYnt6euKSSy6J3t7eUdnOYP/ro7JeyMJo/T0ZTaX4d9Cv89jw6zw2RuvX+c31nu9eaRERFYV38q6E/OAHP4j58+dnPQYAMALHjh2LefPmnfM9JRcng4ODceLEiZg+fXpUVFQUdd29vb0xf/78OHbsWMyYMaOo606B/St9430f7V/pG+/7aP9GrlAoxGuvvRY1NTUxYcK5zyopmY913jRhwoTzFteFmjFjxrj8Q/cm+1f6xvs+2r/SN9730f6NzDv94t6SOSEWACgP4gQASIo4+SmVlZWxefPmqKyszHqUUWH/St9430f7V/rG+z7av7FRcifEAgDjmyMnAEBSxAkAkBRxAgAkRZwAAEkp+zjZsmVLNDQ0xPTp0+PSSy+NVatWxfPPP5/1WKPmvvvui4qKili3bl3WoxTV8ePH4+Mf/3jMmjUrpk6dGtdee20cPHgw67GKYmBgIDZu3BhXXHFFTJ06NX7+538+fu/3fu8dfT9Fqvbt2xcrV66MmpqaqKioiJ07d57xeqFQiE2bNsXcuXNj6tSp0djYGN///vezGXYEzrV/p0+fjnvuuSeuvfbamDZtWtTU1MQnPvGJOHHiRHYDD9P5fv9+2m/8xm9ERUVFbNu2bczmK4Z3so/PPfdc3HbbbVFVVRXTpk2LhoaG+K//+q+xH3YEzrd/p06dipaWlpg3b15MnTo1amtrY/v27WM2X9nHyd69eyOXy8UzzzwTTz31VJw+fTo++MEPRl9fX9ajFV17e3v8yZ/8SVx33XVZj1JU//M//xM33nhjXHTRRfGNb3wjOjs744EHHoh3vetdWY9WFPfff3889NBD8cd//Mfx3HPPxf333x9f/OIX48EHH8x6tBHr6+uLurq6yOfzZ339i1/8Ynz5y1+O7du3x3e+852YNm1arFixIn70ox+N8aQjc679e/3116OjoyM2btwYHR0d8Xd/93fx/PPPx2233ZbBpCNzvt+/Nz3++OPxzDPPRE1NzRhNVjzn28f/+I//iJtuuimuvvrqePrpp+Pf/u3fYuPGjTFlypQxnnRkzrd/ra2tsXv37viLv/iLeO6552LdunXR0tISTzzxxNgMWOAMJ0+eLEREYe/evVmPUlSvvfZa4corryw89dRThZtvvrlw1113ZT1S0dxzzz2Fm266KesxRs2tt95a+NSnPnXGsjvuuKPwsY99LKOJiisiCo8//vjQ88HBwcKcOXMKf/AHfzC07NVXXy1UVlYW/uqv/iqDCS/Mz+7f2Rw4cKAQEYWXXnppbIYqorfbvx/84AeFyy67rPDss88WLr/88sKXvvSlMZ+tWM62j6tXry58/OMfz2agIjvb/i1atKjwu7/7u2cse8973lP43Oc+NyYzlf2Rk5/V09MTEREzZ87MeJLiyuVyceutt0ZjY2PWoxTdE088EUuWLImPfOQjcemll8b1118fX/nKV7Ieq2huuOGGaGtrixdeeCEiIr773e/Gt7/97Whqasp4stFx9OjR6OrqOuPPalVVVSxbtiz279+f4WSjp6enJyoqKuKSSy7JepSiGBwcjDVr1sT69etj0aJFWY9TdIODg7Fr1674xV/8xVixYkVceumlsWzZsnN+vFVqbrjhhnjiiSfi+PHjUSgUYs+ePfHCCy/EBz/4wTHZvjj5KYODg7Fu3bq48cYb45prrsl6nKL567/+6+jo6IgtW7ZkPcqo+M///M946KGH4sorr4x//Md/jE9/+tPx2c9+Nv78z/8869GKYsOGDfFrv/ZrcfXVV8dFF10U119/faxbty4+9rGPZT3aqOjq6oqIiOrq6jOWV1dXD702nvzoRz+Ke+65J37913993HyR3P333x+TJk2Kz372s1mPMipOnjwZp06divvuuy8+9KEPxTe/+c24/fbb44477oi9e/dmPV5RPPjgg1FbWxvz5s2LyZMnx4c+9KHI5/Px/ve/f0y2X3LfSjyacrlcPPvss/Htb38761GK5tixY3HXXXfFU089VTKfhQ7X4OBgLFmyJL7whS9ERMT1118fzz77bGzfvj2am5sznu7C/c3f/E385V/+ZTz22GOxaNGiOHz4cKxbty5qamrGxf6Vs9OnT8dHP/rRKBQK8dBDD2U9TlEcOnQo/uiP/ig6OjqioqIi63FGxeDgYERE/Oqv/mrcfffdERFRX18f//Iv/xLbt2+Pm2++OcvxiuLBBx+MZ555Jp544om4/PLLY9++fZHL5aKmpmZMjsA7cvL/tbS0xJNPPhl79uyJefPmZT1O0Rw6dChOnjwZ73nPe2LSpEkxadKk2Lt3b3z5y1+OSZMmxcDAQNYjXrC5c+dGbW3tGct+6Zd+qWTOmj+f9evXDx09ufbaa2PNmjVx9913j9sjYXPmzImIiO7u7jOWd3d3D702HrwZJi+99FI89dRT4+aoybe+9a04efJkLFiwYOhnzksvvRS/+Zu/GQsXLsx6vKKYPXt2TJo0adz+3Pnf//3f+O3f/u3YunVrrFy5Mq677rpoaWmJ1atXxx/+4R+OyQxlf+SkUCjEZz7zmXj88cfj6aefjiuuuCLrkYrqAx/4QHzve987Y9natWvj6quvjnvuuScmTpyY0WTFc+ONN77l8u8XXnghLr/88owmKq7XX389Jkw48/8REydOHPrf23hzxRVXxJw5c6KtrS3q6+sjIqK3tze+853vxKc//elshyuSN8Pk+9//fuzZsydmzZqV9UhFs2bNmrf8z3rFihWxZs2aWLt2bUZTFdfkyZOjoaFh3P7cOX36dJw+fTrTnztlHye5XC4ee+yx+Pu///uYPn360GfaVVVVMXXq1Iynu3DTp09/y/kz06ZNi1mzZo2b82ruvvvuuOGGG+ILX/hCfPSjH40DBw7Eww8/HA8//HDWoxXFypUr4/d///djwYIFsWjRovjXf/3X2Lp1a3zqU5/KerQRO3XqVBw5cmTo+dGjR+Pw4cMxc+bMWLBgQaxbty4+//nPx5VXXhlXXHFFbNy4MWpqamLVqlXZDT0M59q/uXPnxoc//OHo6OiIJ598MgYGBoZ+7sycOTMmT56c1djv2Pl+/342ti666KKYM2dOXHXVVWM96oidbx/Xr18fq1evjve///2xfPny2L17d3z961+Pp59+Oruhh+F8+3fzzTfH+vXrY+rUqXH55ZfH3r1742tf+1ps3bp1bAYck2uCEhYRZ3382Z/9WdajjZrxdilxoVAofP3rXy9cc801hcrKysLVV19dePjhh7MeqWh6e3sLd911V2HBggWFKVOmFN797ncXPve5zxX6+/uzHm3E9uzZc9a/d83NzYVC4f8uJ964cWOhurq6UFlZWfjABz5QeP7557MdehjOtX9Hjx592587e/bsyXr0d+R8v38/qxQvJX4n+/inf/qnhV/4hV8oTJkypVBXV1fYuXNndgMP0/n277//+78Ln/zkJws1NTWFKVOmFK666qrCAw88UBgcHByT+SoKhRK+zSQAMO44IRYASIo4AQCSIk4AgKSIEwAgKeIEAEiKOAEAkiJOAICkiBMAICniBABIijgBAJIiTgCApIgTACAp/w8vKOL53A5oggAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "# count unique users \n",
    "unique_users = df[\"user_id\"].nunique()\n",
    "\n",
    "# count unique clips\n",
    "unique_clips = df[\"id\"].nunique()\n",
    "\n",
    "# count number of clips per user\n",
    "clips_per_user = df.groupby(\"user_id\")[\"id\"].nunique()\n",
    "\n",
    "# sort by users with most clips\n",
    "clips_per_user = clips_per_user.sort_values(ascending=False)\n",
    "\n",
    "print(unique_users, unique_clips, clips_per_user)\n",
    "\n",
    "# plot a histogram of the number of clips per user\n",
    "plt.hist(clips_per_user, bins=10)\n",
    "plt.yscale(\"log\")\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "14\n",
      "                                  comparison      first_model  \\\n",
      "0  chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-15  chirp-v4-up-u-3   \n",
      "1  chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-07  chirp-v4-up-u-3   \n",
      "2  chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-15  chirp-v4-up-u-3   \n",
      "3  chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-15  chirp-v4-up-u-3   \n",
      "4  chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-07  chirp-v4-up-u-3   \n",
      "5  chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-07  chirp-v4-up-u-3   \n",
      "6  chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-15  chirp-v4-up-u-3   \n",
      "\n",
      "             second_model  first_choice  second_choice                  winner  \n",
      "0  chirp-v4-up-u-3-vol-15             0              1  chirp-v4-up-u-3-vol-15  \n",
      "1  chirp-v4-up-u-3-vol-07             1              0         chirp-v4-up-u-3  \n",
      "2  chirp-v4-up-u-3-vol-15             0              1  chirp-v4-up-u-3-vol-15  \n",
      "3  chirp-v4-up-u-3-vol-15             0              1  chirp-v4-up-u-3-vol-15  \n",
      "4  chirp-v4-up-u-3-vol-07             1              0         chirp-v4-up-u-3  \n",
      "5  chirp-v4-up-u-3-vol-07             1              0         chirp-v4-up-u-3  \n",
      "6  chirp-v4-up-u-3-vol-15             0              1  chirp-v4-up-u-3-vol-15  \n",
      "winner\n",
      "chirp-v4-up-u-3-vol-15    4\n",
      "chirp-v4-up-u-3           3\n",
      "Name: count, dtype: int64\n"
     ]
    },
    {
     "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>comparison</th>\n",
       "      <th>first_model</th>\n",
       "      <th>second_model</th>\n",
       "      <th>first_choice</th>\n",
       "      <th>second_choice</th>\n",
       "      <th>winner</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-15</td>\n",
       "      <td>chirp-v4-up-u-3</td>\n",
       "      <td>chirp-v4-up-u-3-vol-15</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>chirp-v4-up-u-3-vol-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-07</td>\n",
       "      <td>chirp-v4-up-u-3</td>\n",
       "      <td>chirp-v4-up-u-3-vol-07</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>chirp-v4-up-u-3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-15</td>\n",
       "      <td>chirp-v4-up-u-3</td>\n",
       "      <td>chirp-v4-up-u-3-vol-15</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>chirp-v4-up-u-3-vol-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-15</td>\n",
       "      <td>chirp-v4-up-u-3</td>\n",
       "      <td>chirp-v4-up-u-3-vol-15</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>chirp-v4-up-u-3-vol-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-07</td>\n",
       "      <td>chirp-v4-up-u-3</td>\n",
       "      <td>chirp-v4-up-u-3-vol-07</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>chirp-v4-up-u-3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-07</td>\n",
       "      <td>chirp-v4-up-u-3</td>\n",
       "      <td>chirp-v4-up-u-3-vol-07</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>chirp-v4-up-u-3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-15</td>\n",
       "      <td>chirp-v4-up-u-3</td>\n",
       "      <td>chirp-v4-up-u-3-vol-15</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>chirp-v4-up-u-3-vol-15</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                  comparison      first_model  \\\n",
       "0  chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-15  chirp-v4-up-u-3   \n",
       "1  chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-07  chirp-v4-up-u-3   \n",
       "2  chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-15  chirp-v4-up-u-3   \n",
       "3  chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-15  chirp-v4-up-u-3   \n",
       "4  chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-07  chirp-v4-up-u-3   \n",
       "5  chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-07  chirp-v4-up-u-3   \n",
       "6  chirp-v4-up-u-3 vs chirp-v4-up-u-3-vol-15  chirp-v4-up-u-3   \n",
       "\n",
       "             second_model  first_choice  second_choice                  winner  \n",
       "0  chirp-v4-up-u-3-vol-15             0              1  chirp-v4-up-u-3-vol-15  \n",
       "1  chirp-v4-up-u-3-vol-07             1              0         chirp-v4-up-u-3  \n",
       "2  chirp-v4-up-u-3-vol-15             0              1  chirp-v4-up-u-3-vol-15  \n",
       "3  chirp-v4-up-u-3-vol-15             0              1  chirp-v4-up-u-3-vol-15  \n",
       "4  chirp-v4-up-u-3-vol-07             1              0         chirp-v4-up-u-3  \n",
       "5  chirp-v4-up-u-3-vol-07             1              0         chirp-v4-up-u-3  \n",
       "6  chirp-v4-up-u-3-vol-15             0              1  chirp-v4-up-u-3-vol-15  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "user_under_test = 21253765\n",
    "# lets look at the preference of this user\n",
    "user_df = df[df[\"user_id\"] == user_under_test]\n",
    "print(len(user_df))\n",
    "\n",
    "results_df, summary = analyze_ab_test(user_df)\n",
    "print(results_df)\n",
    "\n",
    "# 4. Get summary statistics\n",
    "#print(\"\\nWin Counts:\")\n",
    "print(results_df['winner'].value_counts())\n",
    "\n",
    "display(results_df)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from scipy import stats\n",
    "\n",
    "def analyze_ab_test(df):\n",
    "    \"\"\"\n",
    "    Analyze binary choice (0/1) AB test results.\n",
    "    \n",
    "    Args:\n",
    "    df: DataFrame with columns [user_id, model_name, preference] where preference is 0 or 1\n",
    "    \n",
    "    Returns:\n",
    "    DataFrame with comparison results and win rates\n",
    "    \"\"\"\n",
    "    results = []\n",
    "    \n",
    "    # Process each pair of comparisons\n",
    "    for i in range(0, len(df), 2):\n",
    "        # Get models and preferences\n",
    "        model_a = df.iloc[i]['model_name']\n",
    "        pref_a = int(df.iloc[i]['preference'])  # Convert to int for binary\n",
    "        model_b = df.iloc[i+1]['model_name']\n",
    "        pref_b = int(df.iloc[i+1]['preference'])  # Convert to int for binary\n",
    "        \n",
    "        # Create standardized comparison key by sorting model names\n",
    "        models = sorted([model_a, model_b])\n",
    "        comparison_key = f\"{models[0]} vs {models[1]}\"\n",
    "        \n",
    "        # If we swapped the order, adjust the preferences and models accordingly\n",
    "        if models[0] != model_a:\n",
    "            model_a, model_b = model_b, model_a\n",
    "            pref_a, pref_b = pref_b, pref_a\n",
    "        \n",
    "        # For binary choice, one model winning means the other lost\n",
    "        if pref_a == 1 and pref_b == 0:\n",
    "            winner = model_a\n",
    "        elif pref_b == 1 and pref_a == 0:\n",
    "            winner = model_b\n",
    "        else:\n",
    "            winner = \"Tie\"  # Both 1 or both 0\n",
    "        \n",
    "        results.append({\n",
    "            'comparison': comparison_key,\n",
    "            'first_model': models[0],\n",
    "            'second_model': models[1],\n",
    "            'first_choice': pref_a,\n",
    "            'second_choice': pref_b,\n",
    "            'winner': winner\n",
    "        })\n",
    "    \n",
    "    results_df = pd.DataFrame(results)\n",
    "    \n",
    "    # Aggregate results by comparison\n",
    "    summary = pd.DataFrame()\n",
    "    for comp in results_df['comparison'].unique():\n",
    "        comp_data = results_df[results_df['comparison'] == comp]\n",
    "        first_model = comp_data['first_model'].iloc[0]\n",
    "        second_model = comp_data['second_model'].iloc[0]\n",
    "        \n",
    "        total_comparisons = len(comp_data)\n",
    "        first_wins = (comp_data['winner'] == first_model).sum()\n",
    "        second_wins = (comp_data['winner'] == second_model).sum()\n",
    "        ties = (comp_data['winner'] == \"Tie\").sum()\n",
    "        \n",
    "        summary = pd.concat([summary, pd.DataFrame([{\n",
    "            'comparison': comp,\n",
    "            'first_model': first_model,\n",
    "            'second_model': second_model,\n",
    "            'first_model_wins': first_wins,\n",
    "            'second_model_wins': second_wins,\n",
    "            'ties': ties,\n",
    "            'first_win_rate': first_wins / total_comparisons,\n",
    "            'second_win_rate': second_wins / total_comparisons,\n",
    "            'tie_rate': ties / total_comparisons,\n",
    "            'total_comparisons': total_comparisons,\n",
    "            'winning_model': first_model if first_wins > second_wins else second_model if second_wins > first_wins else \"Tie\",\n",
    "            'win_rate_diff': (first_wins - second_wins) / total_comparisons\n",
    "        }])], ignore_index=True)\n",
    "    \n",
    "    return results_df, summary\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "suno_env",
   "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.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
