700 lines
71 KiB
Plaintext
700 lines
71 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Building train and test sets"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# if you don't have some library installed try using pip or pip3 to install it - you can do it from the notebook\n",
|
||
"# example: !pip install tqdm\n",
|
||
"# also on labs it's better to use python3 kernel - ipython3 notebook\n",
|
||
"\n",
|
||
"import pandas as pd\n",
|
||
"import numpy as np\n",
|
||
"import scipy.sparse as sparse\n",
|
||
"import time\n",
|
||
"import random\n",
|
||
"import evaluation_measures as ev\n",
|
||
"import matplotlib\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"\n",
|
||
"# df = pd.DataFrame(np.loadtxt( './Datasets/ml-1m.dat',delimiter='::'))\n",
|
||
"df=pd.read_csv('./Datasets/ml-100k/u.data',delimiter='\\t', header=None)\n",
|
||
"df.columns=['user', 'item', 'rating', 'timestamp']\n",
|
||
"\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"\n",
|
||
"train, test = train_test_split(df, test_size=0.2, random_state=30)\n",
|
||
"\n",
|
||
"train.to_csv('./Datasets/ml-100k/train.csv', sep='\\t', header=None, index=False)\n",
|
||
"test.to_csv('./Datasets/ml-100k/test.csv', sep='\\t', header=None, index=False)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Interactions properties"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### How data looks like?"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"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>user</th>\n",
|
||
" <th>item</th>\n",
|
||
" <th>rating</th>\n",
|
||
" <th>timestamp</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>196</td>\n",
|
||
" <td>242</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>881250949</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>186</td>\n",
|
||
" <td>302</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>891717742</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>22</td>\n",
|
||
" <td>377</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>878887116</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>244</td>\n",
|
||
" <td>51</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>880606923</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>166</td>\n",
|
||
" <td>346</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>886397596</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" user item rating timestamp\n",
|
||
"0 196 242 3 881250949\n",
|
||
"1 186 302 3 891717742\n",
|
||
"2 22 377 1 878887116\n",
|
||
"3 244 51 2 880606923\n",
|
||
"4 166 346 1 886397596"
|
||
]
|
||
},
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df[:5]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Sample properties"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"We have 943 users, 1682 items and 100000 ratings.\n",
|
||
"\n",
|
||
"Average number of ratings per user is 106.04. \n",
|
||
"\n",
|
||
"Average number of ratings per item is 59.453.\n",
|
||
"\n",
|
||
"Data sparsity (% of missing entries) is 6.3047%.\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"users, items, ratings=len(set(df['user'])), len(set(df['item'])), len(df)\n",
|
||
"\n",
|
||
"print('We have {} users, {} items and {} ratings.\\n'.format(users, items, ratings))\n",
|
||
"\n",
|
||
"print('Average number of ratings per user is {}. \\n'.format(round(ratings/users,2)))\n",
|
||
"print('Average number of ratings per item is {}.\\n'.format(round(ratings/items,4)))\n",
|
||
"print('Data sparsity (% of missing entries) is {}%.'.format(round(100*ratings/(users*items),4)))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA6gAAAHvCAYAAABZg/LVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3X2cFXXd//H3hzvTsERFA9TWzBvkxoU9FKYZ5WWa3KSZib80zQKzvEpNryhC8KbC1CukrgxIL7AbrEsvkRszb9JU1HQXgcuIUnRVbkQE7xBQ0c/vj5ndPbOcnXNgd2dmmdfz8TiPPWdmzpz3+ewsnM+Zme+YuwsAAAAAgLR1SjsAAAAAAAASDSoAAAAAICNoUAEAAAAAmUCDCgAAAADIBBpUAAAAAEAm0KACAAAAADKBBhUAEmJmk8zMw9uwtPN0NGa2p5n9yMyeMLM3zOy9sJavpp2tvZjZzKJtpirtPAAAtDcaVABtrugDdcPt4xU8Z3TR8pMSiIkOxMz2lVQn6QeSqiV1l2SphtoBZjYs/KJiEg0nAADb6pJ2AAC58GNJx6YdAh3aeElV4f2Fkn4raa0kl/ROSpl2xDBJE8P790uqTysIAABZRIMKIAmfMbN/c/d70g6CDuvE8Ocrkj7r7pvSDJMUdz9b0tkpxwAAIDEc4gugPRU3ET9JLQV2BvuHP/+Zl+YUAIA8okEF0J5ekHRbeL9gZl9IMww6tG7hz7dSTQEAANoVDSqA9vZDSe+F9680s847uqKiQZTub+2yZnZ/wzLh405mdk44/SUze9PM/s/MxpvZ7s2e+yEzu8LMlprZ62b2mpk9YGan7cB7OtHMbjezlWb2VvhztpkduR3r2DvM+aCZvWhmb5vZuvDxfzTPX+L59WEt6sPH7zOzb5vZQ2a2Nhwt9/7tfW9F69/NzC40s/vCfG+FNX7IzL5vZh9s4XmNox4XTf5UiUG4hm1nnrOLnnt2OK1gZr82s6fD331kvRb4ZDiK8F/MbHX4Pt40s2fN7GYzG2lmJQduangvajr/VJLuK/Fe7m/2vNhRfMNBlyKDi5nZAWZ2rZktD/O9amYPm9k3zayiU3vM7GQzWxD+/reE28hvLRzwrFQNW1jP583sj2b2jJltCte1ysyWmNlvzOzLZtajkkwtrD9SNzPraWaXh3+7r4V/n3VmNs7Mdt2O9Z4Q1v4pC0aM3mRmK8JpR5d57nZvXxVmqnhE50qWteDv/JtmdreZrQm3543h7/oxM7vOzD5nZl3LvNaRZna9mS0Lt7UtZva8mf3BzIaXeW6p7fdQM5tiZv8If3+x2xiAnZC7c+PGjVub3hQMXOOSloePZxZNO7uF54wuWmZSmfXevx0ZSi6rYICahmW6S7qn6HHz2yJJPcLnHSnppZhlr4nJNKlouWGS/itmPe9KmljB+zxb0usx63FJL0o6MmYd9eFy9ZIOlPRkiXWUrXkL6x4qaVWZfC8rOK80rl5xt2Hbmens4u1R0jhJW+PWK+m/K8zyJ0kfaMV7ub/Z82YWzasqsd5hRfMnSTpBwXm6La3/Lkm7xNSmq6Q/xjx/q6TvNq9hifXsKml+he/5gjb4t+Z+SYMkrYx5nackHVhmfT0l3VtB5l9L6tpW21eF7zV2W9jO7eagsB6V/H6qW3iN90uaXcHz50vavYV1NN9+v6Lg1JDm69hmG+PGjdvOe2OQJABJmCjpdAWHaU4ys9+7+9spZyr23wpGGV6o4MP5i5I+LOlb4c9BkqaY2URJf1bwPn4t6SFJb0v6pKQxCgae+66Z/dnd7y7zmt+RdJKC5uzXkpZK2k1Bg3GKgiNcJpnZenf/RakVmNl3JE0JH74l6VZJD0paL2nPcF2fl7SvpHvMbIi7L4vJtIuk/5XUL3xvt0pareBD+75l3k+pfNWS/qKgWZGkJyT9XtLzkj4k6UuSjpK0l6T5ZvZZd7+/aBU3S1oc3m84VPzvCvbKF3tye7MV+ZKkz0l6TdIsBZeyeVfSEeG0BrsqqPFfJT0maYWkNxXU5hBJZ6qp5jcp+N0Wa3gvoyU17GmfUCL7y614L9WSLlFw+Z1pkh4JMxckfUNBQ3GcghGRL21hHdMlnRre36Kg0XlEQU0Kkr4m6RpJt5TJ8mNJDXvP1igYdfnvkjYq+ELoowq+7Dmm8rcX64MKtt0+CprwOZI2SDo0zHxA+Jr3mlm1u7/efAVmtqeC93pQOGmZpP+R9C8FR4H0U9Bw7heus4vKD2BV6faVmHAv//8oqIcUbJe3SHpGwYjYPST1lfRpBdtUqXXsouBLvaHhpOcVNKt/V7DNfVRBs3mogu1gjpkd5+7vlVhdg6MUbJvvSrpBwb/HW8J1vLgDbxVAR5V2h8yNG7ed76amb72XF02bWjT92yWek+YeVJf0gxLL9FTT3r+tCj7IvSRpYIllzyxa1x0tvOakZq/5pKR9Six3koIPiq6gCTqgxDI1Rcssl3RwC685XEET7ZL+1sIy9c1yXdgG20AnRffETpHUqcRyE4qWeV7S+1r7u68g29nN3u8/JPUu85xPStojZv77Fd3z+KkKtoFhFWSdWbR8VYn5w5q9l+dKbQuSPla0vWxQib2oCr6kaVjPOkn9SyxTVWJ7ObvZMp0lvRrOqy+1jTf7GzusFb/L5nvavlVime6S7ita5uctrOu2omV+2ML22l3Bl1QNy53QFttXhe81dluodFkFXzQ0zJsnqXPMeg6XtFeJ6T8rWsf1krqVWKargqa8YblvVLD9rpF0eGtrxY0bt4594xxUAEm5UkGzJUnjzax7mmGa+bO7/7j5RHdfJ6lh72VnBXs9znf3pSWW/Y2CQ+Yk6dgKzvXbKuk0d3+pxLrmSLo2fLibpPNKPH+igj04b0ka4e5PlVhG7r5A0uTw4cfM7BNlct3m7j8rs0wlRijY4yRJjypoerfZe+LuV0haED7cX9IZbfDa28MljXb31bELuT/o7q/GzH9TwV61hm38zLaLuF3OKLUtuPtjkv4QPuyhoGFt7sKi++e7+zZ7pt29XuX3GvZUsEdTkm4vtY0XrW+duy8vs75K3ezu/1XiNTYq+AKsYa/p18xsj+JlzGywmvZ63+juV7awvTasq2Hv50VlMlW0fSXso0X3b3T3d1ta0N2Xufv64mlm1kvSN8OH97r7eV7iiBh3f0fS1xXsmZXK10qSzvX4ozwA5AANKoBEhB9SGw5H3UfSBSnGaa7kIbShhUX31yr+0MaHwp/d1HSYYEv+7O5/j5k/RcGhbpJ0cvGMcFCZhsMnb3f3p8u81m+L7n+2zLI/LzO/UsUjNl/t7h6z7OSi+0mP9Pyguy9pixW5+xuS/i98+PG2WOd2esLdH4yZ/5ei+4cXzzCz96lp21ij4BDQkjw4DHubL2mKbG7pddrZtS3NcPe1avo72FXBodjFir9QuCbuRdz9FUl3hA+PCQ93bUmbbV9tqPgyTf1aXKplX1LTqNot1lxqbFIbvhg5uMzgTs8p2KMLIOc4BxVAkq5WsDdwT0kXm9kv3X1Dypkk6W8x89YW3a8rtVelhWXLjUx6b9xMd3/RzP4hqb+kQ8zsg+7esNfmKDV9wbjFzJqf79hc8SicfWOWe1fBOXhtoWEPnUsqdz7uw2o6NzHpxi6uoYsIG5EvKTiv9wgF5+V2V3DOZ3P7tUm67fNomfmriu433z6PUNN28tcy27kUHCI/sNQMd3/NzB5TsA38m5ndpuCLjwfDhqU9vKbg/M44f1HTnr8hCs4LbvDJ8Ofbkg41s0PLrGuXop8fUXAYbykVb18JekjBlwi7SpoYfuE1q9SRIS34ZNH9fSr496d4W+ur4LDvkrnKfJEFICdoUAEkJvzgepWkqxQcAjhO0n+km0pSMKhQS4qvuxm3XPNl31dm2XJ7PRuW6a+gAfqQmg4rrCpa5ivhrVJxjfN6d9+yHeuK0yv8+WK4Z7FF7v6ema1Q0CTtaWbdSh0y2E5WlV9EMrMBCgaNOrjC9X5ghxPtuHIDLMVtn72L7j+j8sot8y0FX8J8QMGhsydJetPM/qagQbpH0sIKGuFKraiguSn+m+vdbF5V+LObmgbkqlTc31RF21eS3H2DmV2o4NzRLgoOvb3IzF5S8GXRg5L+5O4tNd1VRfdnbufLd6haAUgHh/gCSNrPFYwMK0nnm1nzD4qJ244PyW31YVqKHmbXkjeL7hefs1vyuqEV6hYzb3PMvO3VcO3VN2OXarKxxHOTUPY9h6O73qOm5vQFBR/uvyPp/yk4LPnk8NZw2HYa/7+2Zvt8f9H97d02t+HutQpGgL1JTTV+v6TPKBhB+AFJK8ysrc45bs3fk9Qx/qbajLtPUzBK771q2m72UfBFwrWSlpnZQjMrda5yrmoFIHnsQQWQKHffbGZXKPiAv6uCD6vfaMvXMLOO8OXbbhUsU9w0bGzh/tnuPqttIrWpNyTtoeh7iFPcMMTucU3B+Qo+vEvBqKRfd/etpRY0s/GJpWpbxc3b9m6bJbn7s5LOMrNzFVxS5hOSjpb0KQV/+1WSfmNmB5QapGw7tebvqeHxHpLq3f3AVmbJgrL/Brr7XyX91cz2UnDY7pEKfjdDwud/QtJDJS7/1FC7rZJ2belvAQB2VEf4EAdg53ODgutISsGImh+NW7hIw2Gfcd/CS9LeO5QqWZW854ZlXNHrABYfCrcjg5wkYU3480NmFrtHNLwuY8OgUusTPLy3Uv8W/twq6YIyH8g/nECe9lA8yuxHKli+kmUkSe6+xd3vc/cfufvnFDT731OwXUvSpWGT1BoHhdtRnOK/ueaj6jb8Te1vZmkcnl2J4kO02+zfQHdf7+5z3P177j5UwTVjfx/O7qptB41qqFUXBdcABoA2RYMKIHHhQCmXhg+7SLq8wqc2XOaj3GHBaYygur0+EzfTzD6kpgGN/lU0QJIUHB7Z8OH+8xndY/xY+NMUXF8zzifUtAf1sbgFU7Jv+HN93KVmzGyQgkusxCk+DLdcQ5WkJQqukyoFI9OW26aG7egLuftGd/+pgnN6pWCgoSE7ur7QByUNLrPMp4vuP95s3l/Dn50ljWxllvZSvO21+G+gmXVWcK3THeLuqySdpaYvxWrMbNeiRf5adD8ywjgAtIUsfqgBkA+z1XSpitEKBsgpp+H6eB82s7g9ON9uTbCEnGBmcSPqflvBh2VJ+t/iGeEle+4MHx6i4PqbWXNr0f2Ly+zd+l4Lz8uKhvMb9ymzN/jSmHkNig8trfTw53YXDo51V/iwt6RTW1rWzIaphRF8t1N90f22OOWoxetsmllPNV1jd7Oa/n4a3FR0/1Izy8zvpkjx9UHjvuAarfJflMQKjxJYWTSp+Pdzs5qOZrkw/DINANoMDSqAVIQjbjacr2eS/r2CpxV/qLyqVNNjZper6ZDMLOsi6Q/hB+cIMxsp6eLw4SYF5+s290M17fH6ebnBZszsADO72sz2iVuuDS1Q04BBR0m6utReOTP7gZr2WL0g6XfJxNsuDXvbTNKVzWda4HIFA8yU82zR/XJ7/JI2pej+L8ysf/MFwutYzoxbiZkNMrMJZrZvzDJ7q6kJdsVfV7VS/8/MtjmfPWw2Z6tpcJ8bmu8Jd/e/qenLkUMkzSuTv4uZnWRm32xpmXZwt5qujfwtM9vmcHIzK6jMtYzN7Mtm9tVme0WbLzNU0qDw4TPFI3G7+wtFr7GXpD/HnaYR/n0c24HPzwaQMAZJApAad59vZg8rOMSzkj0WNyq4LM2ekr4o6UEz+52Cy2scoGDPQUHBN/yj2yV025mjoKH5u5nNkPR/CgZ6OV7BB/eG5vt74QfCCHdfZGbnSZqh4BDJ35jZdyXdruByGm8pGPTlMAUN4sfCdV7Xnm+qKN97ZnampIUKBsT5rqRPh7+vlQoOm/2SgkFzpKDZ/kobXuamLf1S0jkK9mh/28yqFezVflHS/gpG8h2kYA/XZkk1Met6UMF77SrpEjNraM4azi/c4O6pHObs7veY2UxJZys4h/Hx8PHDCg5NLiiowwck3aLgb1DadvTgDyo4bH+imS0Mn/8vBYNf7SlpgIKa7Rku/zt3f76V8Rcr2N6vD6/LeZuCQ2IbjjBoaOaeVdMXY82dEy4/QMHhwM+Y2S0Krg38soJL8/RS8MXCZ8P8N7Qyd8XcfbWZ/V7SmeFrP25mv1Sw3XVXcNj16ZJeUXDN15b2sh4saaKCL7buVvAFzAsKtsF9FAyYdJKajuAoNYDV9xWM0nysgr3py8zsdgWnH7yoYPveV8GRMccp2Ct/r6Qf7di7B5AnNKgA0vZ9Rc9papG7rwv3FP6vgg+LR4W3YvMVfCDNeoN6nYLBRr4l6Qcl5ruky939Fy2twN1vCK9dOEPBh8Hq8NaS9ZISawDd/QkzO1bBnqmGD/al9hpukPT/mo0UmhnuvtjM/l3SLxQceXRMeCv2D0mfl/TrMut62cyuUbDdd9e251//Va04v7MNjFWQ64sK/sa+oego2+8p2Lv/mpoa1OajLjc0rJ1VulbF/hi+Zmu9JumrCv7+jw9vza2Q9Fl3f73UCtz9dTM7SsHf02kKvjAqd53h5oMttbcLFDTQ1QoO453YbP4aBeeFnhezjobfz/vVdI3aUt6RNMHdt2nC3f0dMztRwSVpzlPQkH5RTdtEKVznFEBFOMQXQKrc/QFtez5Y3PJ/UvDh7L8lPa/gXKh1ku5TsGdhlLtXck3E1Ln7+ZKGS5qn4IPu2+HPP0g6yt0nVbCOeZIOVNBEzFWwJ2SzmuryiILD8UZK6u3uL7f5G4nP94iCPTYXKWi+1in44Ls+zDZe0kHu/uckc20vd79ewZch/6NgD9E7kl5SsHfwIkkFd3+6wnX9QMGerjvDdWVm1GJ3f8fdT5V0ioJ86xTsWXteweHXR7n7tQoO7Wywodk6HpB0qILG5Y+Slis49/a98OcyBUdDfMrdT3P3Nrn+pbsvVrAn+0pJTyponDdKekLBl0AD3f2ZMut4w91HK/giZUr43PUKRnDeKOkpBUc/XKRgu63kvOM24+4bFBxxMi7MtlHBJYKWKdg7eUR4uHKcH0kaqqAmdyo4F3izgvf4ioKByq6SdLi7XxWT5W13/3cFR2lMlvQ3BdvLVgWnJjwr6Q411f6s7X/HAPLIgtPAAAAAKmNmt0r6Qvhwr7BxSiNHw4eYv7r7sDQyAADaFntQAQBAxcKBkkaED5ek1ZwCAHZONKgAAECSZGYHmdl+MfP7KBiAqFs4aVoiwQAAucEgSQAAoMGRkv7bzB5QMOLwCgXnJ+6l4LzFLykYPEiSHpU0PY2QAICdFw0qAAAo1kXBJUpaukyJJN0v6RR3fzdmGQAAthsNKgAAaDBX0pclnaBgRNy9FVxz821JaxWM1HpzOHo0AABtLhOj+O69995eVVWVdox2s27dOvXs2TPtGI2ylicvqDsAAADyqq6u7mV3L/thOBN7UKuqqlRbW5t2DAAAAABAOzCz5ypZjlF8EzBp0qS0I0RkLU9eUHcAAAAgXiYO8S0UCr4z70E1M2Whzg2ylicvqDsAAADyyszq3L1Qbjn2oAIAAAAAMoEGFQAAAACQCTSoCcja4ctZy5MX1B0AAACIR4MKAAAAAMgEBklKQNYGx8lanryg7gAAAMgrBkkCAAAAAHQoZRtUM7vRzF4ysyeLpv3BzBaHt3ozWxxOrzKzzUXzftWe4QEAAAAAO48uFSwzU9IvJN3UMMHdT2u4b2bXSnqtaPkV7l7dVgF3BhMnTkw7QkTW8uQFdQcAAADiVXQOqplVSZrv7v2bTTdJz0v6jLs/1dJy5ezs56ACAAAAQJ4ldQ7qJyWtdfeniqYdaGZPmNlfzeyTMQHHmlmtmdWuW7eulTGyrXfv3mlHiMhanryg7gAAAEC81jaop0uaXfR4jaQD3H2QpIsk/d7MPlDqie4+3d0L7l7o2bNnK2Nk25o1axrvv/DCC/r0pz+tvn37ql+/frruuusa502aNEl9+vRRdXW1qqurdccdd0iSFi5cqIEDB2rIkCF6+umnJUmvvvqqjj/++B0aFbY4T2vMmTNHy5Yta3x86aWX6p577pEkDRs2bIev+3n77bdr4MCBqq6uVqFQ0EMPPSRJeu6551RTU6Pq6mr169dPv/pVxzrFuVzd//nPfzb+7qurq/WBD3xAU6ZMkZTcttFW2mvbWL58uY488kjtsssuuuaaa7aZ/+6772rQoEEaMWJE47R7771XgwcPVnV1tY4++ujGOgEAACB7KjkHtSQz6yLpC5JqGqa5+1uS3grv15nZCkmHSOL43VCXLl107bXXavDgwXrjjTdUU1Oj4447Tocffrgk6cILL9TFF18cec61116rW2+9VfX19br++ut17bXX6oorrtAPfvADBUdZp2POnDkaMWJEY/bLL7+8TdZ77LHHatSoUTIzLV26VF/60pe0fPly9erVSw8//LB22WUXbdy4Uf3799eoUaN2mj2Thx56qBYvXiwpaLT69Omjk08+uXE+24a05557aurUqZozZ07J+dddd5369u2r119/vXHaeeedp9tvv119+/bVL3/5S1155ZWaOXNmm+QBAABA22rNHtR/k7Tc3Vc2TDCznmbWObz/EUkHS3qmdRE7vsGDBzfe79WrV+Pj3XffXX379tWqVatin9+1a1dt3rxZmzZtUteuXbVixQqtWrVKn/rUp1p8zp133qnDDjtMRx99tL797W837lFq2BPXoH///qqvr5cknXTSSaqpqVG/fv00ffr0xmW6d++u8ePH64gjjtDQoUO1du1aPfzww5o7d64uueQSVVdXa8WKFTr77LN1yy23bJPlrrvu0pFHHqnBgwfr1FNP1caNG2Pfb/fu3RubqzfffLPxfrdu3bTLLrtIkt566y299957sevJmuLtoJx7771XBx10kD784Q/HLtfW20bxXsksbhv77LOPhgwZoq5du24zb+XKlVqwYIG+/vWvR6abWWPD+tprr+00X2gAAADsjCq5zMxsSY9IOtTMVprZ18JZoxU9vFeSjpG01MyWSLpF0jfcfUNbBu6I6urqSk6vr6/XE088oY9//OON037xi19o4MCBOuecc/TKK69Ikr7//e9r7NixmjJlis4//3yNHz9eV1xxRYuvt2XLFo0ZM0bz5s3Tgw8+qBdffDEy/4ILLij5vBtvvFF1dXWqra3V1KlTtX79eklBkzh06FAtWbJExxxzjGbMmKFPfOITGjVqlK6++motXrxYBx10UMl1vvzyy7ryyit1zz33aNGiRSoUCvrP//xPScFhn3Pnzi35vNtuu02HHXaYhg8frhtvvLFx+gsvvKCBAwdq//331/e+970O1Wy0tB2UcvPNN+v000+PTEti22hJlraNllxwwQX66U9/qk6dov+s/frXv9aJJ56o/fbbT7/5zW80bty47VovAAAAklO2QXX30929l7t3dff93P2GcPrZ7v6rZsve6u793P0Idx/s7vPaK3hHMnbs2G2mbdy4UaeccoqmTJmiD3wgOE33vPPO04oVK7R48WL16tVL3/3udyVJ1dXVevTRR3XffffpmWeeUe/eveXuOu2003TGGWdo7dq1kXUvX75cBx54oA4++GCZmc4444zI/FJ7siRp6tSpjXvCXnjhBT31VDD2Vbdu3Rr3stXU1DTuVavEo48+qmXLlumoo45SdXW1Zs2apeeee05ScNjnqFGjSj7v5JNP1vLlyzVnzhxNmDChcfr++++vpUuX6umnn9asWbO2ee9ZVmo7KOXtt9/W3LlzdeqppzZOS2rbaEmWto1S5s+fr3322Uc1NTXbzPvZz36mO+64QytXrtRXv/pVXXTRRRWvFwAAAMlq7SBJqMCMGTMij9955x2dcsop+vKXv6wvfOELjdP33Xdfde7cWZ06ddKYMWP02GOPRZ7n7rryyis1YcIEXXbZZbrssst0xhlnaOrUqdu8ZkvnH3bp0kV/+9vfGh9v2bJFknT//ffrnnvu0SOPPKIlS5Zo0KBBjfO6du3auL7OnTtr69atFb93d9dxxx2nxYsXa/HixVq2bJluuOGGip9/zDHHaMWKFXr55Zcj03v37q1+/frpwQcfrHhdaWu+HbTkT3/6kwYPHqx99923cVpS20bxYdNZ3zaKLVy4UHPnzlVVVZVGjx6tv/zlLzrjjDO0bt06LVmypPEohdNOO00PP/zwDr0GAAAA2h8NasLcXV/72tfUt2/fbfbkFI/yetttt6l//+jlZGfNmqXhw4erR48e2rRpkzp16qROnTpp06ZNkeUOO+wwPfvss1qxYoUkafbspiOxq6qqGu8vWrRIzz77rKTg3LwePXpot9120/Lly/Xoo4+WfS+777673njjjdhlhg4dqoULFzaOnLpp0yb961//in3O008/3TgC7aJFi/T2229rr7320sqVK7V582ZJ0iuvvKKFCxfq0EMPLZuzo5k9e/Y2h/cmtW0sWrRIUna3jZb85Cc/0cqVK1VfX6+bb75Zn/nMZ/Tb3/5WPXr00Guvvda43rvvvlt9+/bdodcAAABA+9vhUXzzpmrcgtj59ZOHV7SehQsX6je/+Y0GDBig6upqSdKPf/xjnXjiifqP//gPLV68WGamqqoqTZs2rfF5mzZt0qxZs3TXXXdJki666CKdcsop6tatW6TJkKT3ve99mj59uoYPH669995bRx99tJ588klJ0imnnKIzzzxT1dXVGjJkiA455BBJ0gknnKBf/epXGjhwoA499FANHTq07HsZPXq0xowZo6lTp7Z42HDPnj01c+ZMnX766XrrrbckSVdeeaUOOeQQXXrppSoUCtscynnrrbfqpptuUteuXbXrrrvqD3/4g8xM//jHP/Td735XZiZ318UXX6wBAwZUUvYOY9OmTbr77rsjv3tJiW0bN910U6a3jRdffFGFQkGvv/66OnXqpClTpmjZsmWNh8k316VLF82YMUOnnHKKOnXqpB49ekTOaQYAAEC2WJrXSmxQKBR8R6+LmJTWNKirV69OdTCf+++/X9dcc43mz5+fiTx5lcW6N982AAAAgPZgZnXuXii3HIf4JmB7Rm9NQtby5AV1BwAAAOKxB7VCrdmD2nBIalZkLU9eUHfscrF7AAAgAElEQVQAAADkFXtQAQAAAAAdCg0qAAAAACATaFAT0HxE1rRlLU9eUHcAAAAgHuegVqitLjMDAAAAAHnDOagZYmZpR4jIWp68oO4AAABAPBpUAAAAAEAm0KACAAAAADKBBjUBI0aMSDtCRNby5AV1BwAAAOLRoCZg3rx5aUeIyFqevKDuAAAAQDwa1ASMHDky7QgRWcuTF9QdAAAAiEeDmoD58+enHSEia3nygroDAAAA8WhQsQ0z05lnntn4eOvWrerZs+d2n0M5bNgwNVzf9sQTT9Srr77apjkl6fnnn9dnP/tZ9e3bV4cffrjq6+slSWeffbYOPPBAVVdXq7q6WosXL27z1wYAAADQtrqkHQDZ8/73v19PPvmkNm/erF133VV33323+vTp06p13nHHHW2ULuorX/mKxo8fr+OOO04bN25Up05N37lcffXV+uIXv9gurwsAAACg7bEHNQHunnaEiEryfO5zn9OCBQskSbNnz9bpp5/eOO/NN9/UOeecoyFDhmjQoEG6/fbbJUmbN2/W6NGjNXDgQJ122mnavHlz43Oqqqr08ssvS5JOOukk1dTUqF+/fpo+fXrjMt27d9f48eN1xBFHaOjQoVq7dm1sxmXLlmnr1q067rjjGp+/2267VViF5GVtOwAAAACyhgY1AcVNWBZUkmf06NG6+eabtWXLFi1dulQf//jHG+f96Ec/0mc+8xk9/vjjuu+++3TJJZfozTff1PXXX6/ddttNS5cu1fjx41VXV1dy3TfeeKPq6upUW1urqVOnav369ZKCxnfo0KFasmSJjjnmGM2YMUOSNHfuXF166aXbrOdf//qX9thjD33hC1/QoEGDdMkll+jdd99tnD9+/HgNHDhQF154od56663tqlF7yNp2AAAAAGQNDWoCzj333LQjRFSSZ+DAgaqvr9fs2bN14oknRubdddddmjx5sqqrqzVs2DBt2bJFzz//vB544AGdccYZjc8fOHBgyXVPnTq1cS/pCy+8oKeeekqS1K1bt8bzXGtqahrPJx01apQuv/zybdazdetWPfjgg7rmmmv0+OOP65lnntHMmTMlST/5yU+0fPlyPf7449qwYYOuuuqqimrTnrK2HQAAAABZQ4OKFo0aNUoXX3xx5PBeKThU9dZbb9XixYu1ePFiPf/88+rbt6+kYIClOPfff7/uuecePfLII1qyZIkGDRqkLVu2SJK6du3a+PzOnTtr69atsevab7/9NGjQIH3kIx9Rly5ddNJJJ2nRokWSpF69esnMtMsuu+irX/2qHnvssR2qAQAAAIDk0KCiReecc44uvfRSDRgwIDL9+OOP189//vPGcyqfeOIJSdIxxxyj3/3ud5KkJ598UkuXLt1mna+99pp69Oih3XbbTcuXL9ejjz66w/mGDBmiV155RevWrZMk/eUvf9Hhhx8uSVqzZo2koJmeM2eO+vfvv8OvAwAAACAZNKgJmDt3btoRIirNs99+++k73/nONtMnTJigd955RwMHDlT//v01YcIESdJ5552njRs3auDAgfrpT3+qj33sY9s894QTTtDWrVs1cOBATZgwQUOHDq0ob6lzUDt37qxrrrlGxx57rAYMGCB315gxYyRJX/7ylzVgwAANGDBAL7/8sn74wx9W9J7bU9a2AwAAACBrLAsjixYKBW+4XmZWVY1bEDu/fvLwFuetXr1avXv3butIOyxrefKCugMAACCvzKzO3QvllmMPagJaew3Rtpa1PHlB3QEAAIB4NKgAAAAAgEygQQUAAAAAZAINagIaBu7JiqzlyQvqDgAAAMRjkKQKtWaQJAAAAADIMwZJypCampq0I0RkLU9eUHcAAAAgHg1qAhYtWpR2hIis5ckL6g4AAADEo0EFAAAAAGQCDWoCevXqlXaEiKzlyQvqDgAAAMSjQU3A6tWr044QkbU8eUHdAQAAgHg0qAmYNGlS2hEispYnL6g7AAAAEI/LzFSoNZeZMTNloc4NspYnL6g7AAAA8orLzAAAAAAAOhQaVAAAAABAJtCgJiBrhy9nLU9eUHcAAAAgHg0qAAAAACATaFATUCiU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\n",
|
||
"text/plain": [
|
||
"<Figure size 1152x576 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"items_per_user=df.groupby(['user']).count()['rating']\n",
|
||
"\n",
|
||
"plt.figure(figsize=(16,8))\n",
|
||
"plt.hist(items_per_user, bins=100)\n",
|
||
"\n",
|
||
"# Let's add median\n",
|
||
"t=items_per_user.median()\n",
|
||
"plt.axvline(t, color='k', linestyle='dashed', linewidth=1)\n",
|
||
"plt.text(t*1.1, plt.ylim()[1]*0.9, 'Median: {:.0f}'.format(t))\n",
|
||
"\n",
|
||
"# Let's add also some percentiles\n",
|
||
"t=items_per_user.quantile(0.25)\n",
|
||
"plt.axvline(t, color='k', linestyle='dashed', linewidth=1)\n",
|
||
"plt.text(t*1.1, plt.ylim()[1]*0.95, '25% quantile: {:.0f}'.format(t))\n",
|
||
"\n",
|
||
"t=items_per_user.quantile(0.75)\n",
|
||
"plt.axvline(t, color='k', linestyle='dashed', linewidth=1)\n",
|
||
"plt.text(t*1.05, plt.ylim()[1]*0.95, '75% quantile: {:.0f}'.format(t))\n",
|
||
"\n",
|
||
"plt.title('Number of ratings per user', fontsize=30)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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DVQyI+6eSu73uU7SMklPS7oznT0aAIBtoixm8d1zzz29R48eLd2NLbZ8+XJ16tRpu48ZI/IEAAAAtLy6urp33L3oH+ZlMYLao0cP1dbWtnQ3AAAAAADbgJm9WUo7ZvHNwNixYz8TMWNEngAAAIB4lMUpvlVVVR7zCKqZKXQeWyJmjMgTAAAA0PLMrM7dq4q1YwQVAAAAAFAWKFABAAAAAGWBAjUDLXF6csynRIdEngAAAIB4UKACAAAAAMoCkyRlgEmSyhd5AgAAAFoekyQBAAAAAKJCgQoAAAAAKAsUqBkYM2bMZyJmjMgTAAAAEA+uQQUAAAAAbFNcgxpQ165dPxMxY0SeAAAAgHhQoGagvr5eixYt0te+9jUdfPDB6t27t6677roN68eOHatu3bqpoqJCFRUVuu+++yRJTzzxhPr06aMjjjhC8+fPlyStXLlSAwYMKDrzbH19/TZ7P3/4wx/04osvbnh92WWX6cEHH5Qk9e/ff6vuLTp79mxVVFSod+/e+upXv7rVfS2muTy98sorGz6PiooK7brrrho/frykbfN5bUvb6vN6//33NXjwYB122GHq3bu3brvttg3rJk+erF69eqlXr16aPHny1r0BAAAAINWmpTuwvWjTpo2uvfZa9e3bV6tWrVJlZaWOO+44feELX5Ak/fCHP9SPf/zjjba59tprdc8992jhwoW66aabdO211+qKK67Qz3/+c5lZS7wNSUnBM2jQoA19v/zyyzPZ78qVK3Xeeedp5syZ2nffffX2229nst8tcdBBB2nu3LmSpE8++UTdunXTySefvGE9n5d044036gtf+IKmTZum5cuX66CDDtK3v/1trV69WuPGjVNtba3MTJWVlRoyZIg6dOiQSVwAAAB8djGCmoG+ffuqS5cu6tu3ryRpl1120cEHH6wlS5YU3K5t27Zau3at1qxZo7Zt22rBggVasmRJwZHFmTNn6vOf/7x23nln/eAHP9CgQYMkJaN+11xzzYZ2hxxyiBYuXChJOumkk1RZWanevXurpqZmQ5v27dvr0ksv1WGHHaZ+/fpp2bJl+stf/qKpU6fqJz/5iSoqKrRgwQINHz5cd9999yZ9uf/++3XUUUepb9++Ou2007R69eqC7/d///d/dcopp2jfffeVJO21114F22eh4TMp5KGHHlLPnj213377FWy3NZ/Xl7/85eg+LzPTqlWr5O5avXq1OnbsqDZt2mjWrFk67rjj1LFjR3Xo0EHHHXecZs6cWXBfAAAAQCkoUDNQV1e30euFCxfqueee0xe/+MUNy2644Qb16dNH55xzjt577z1J0s9+9jNVV1dr/PjxGjVqlC699FJdccUVzcb56KOPNGLECE2bNk2rVq3SW2+9VVL/br31VtXV1am2tlYTJkzQihUrJEkffvih+vXrp3nz5umYY47RxIkT9aUvfUlDhgzRr371K82dO1c9e/bMu8933nlHV155pR588EHNmTNHVVVV+s///E9JySmmU6dO3WSbV199Ve+995769++vyspKTZkypaT+b42mn00+d955p04//fSNlmX9eT322GPRfV6jRo3SSy+9pK5du+rQQw/Vddddp1atWmnJkiXaZ599NrTr3r170S9jAAAAgFJQoGagurp6w/PVq1dr6NChGj9+vHbddVdJ0ve+9z0tWLBAc+fOVZcuXfSjH/1IklRRUaGnnnpKjzzyiF5//XV17dpV7q5vfetbOuOMM7Rs2bKN4rz88svaf//91atXL40cOVJnnHFGSf2bMGHChlG3RYsW6bXXXpMktWvXbsOIXmVl5YYRvFI89dRTevHFF3X00UeroqJCkydP1ptvvikpOcV0yJAhm2yzfv161dXVacaMGZo1a5auuOIKvfrqqyXH3BK5n00+69at09SpU3XaaadtWLYtPi8zi+7zmjVrlioqKrR06VLNnTtXo0aN0gcffJD3etuWPMUZAAAA2w8K1AxMnDhRkvSPf/xDQ4cO1be//W2dcsopG9Z37txZrVu3VqtWrTRixAg988wzG23v7rryyis1evRojRs3TuPGjdMZZ5yhCRMmbBKroRBoiNmgTZs2+vTTTze8/uijjyQlkxI9+OCDevLJJzVv3jwdfvjhG9a1bdt2w/5at26t9evXl/ye3V3HHXec5s6dq7lz5+rFF1/ULbfcUnCb7t27a+DAgdp5552155576phjjtG8efNKjrklmuapqT/96U/q27evOnfuvGHZtvi8morh87rtttt0yimnyMx0wAEHaP/999fLL7+s7t27a9GiRRvaLV68mNmSAQAAkAkK1Iy4u84991wdfPDBuuiiizZalzuT7L333qtDDjlko/WTJ0/WCSecoA4dOmjNmjVq1aqVWrVqpTVr1mzU7vOf/7zeeOMNLViwQJJ0xx13bFjXo0cPzZkzR5I0Z84cvfHGG5KSmVg7dOignXbaSS+//LKeeuqpou9ll1120apVqwq26devn5544okNs9muWbOm6GjoiSeeqMcee0zr16/XmjVr9PTTT+vggw8u2p9t6Y477tjk9F4+r8S+++6rhx56SJK0bNkyvfLKK/qnf/onDRgwQPfff7/ee+89vffee7r//vs1YMCAov0EAAAAimEW3xL1uGRGwfVPPPGEfvvb3+rQQw9VRUWFJOmXv/yljj/+eP30pz/V3LlzZWbq0aOHbr755g3brVmzRpMnT9b9998vSbrooos0dOhQtWvXbqOCRpJ22GEH1dTU6IQTTpAk7bfffnrhhRckSUOHDtWUKVNUUVGhI444QgceeKAkaeDAgfqv//ov9enTRwcddJD69etX9L0OGzZMI0aM0IQJE/JOtiNJnTp10qRJk3T66afr448/liRdeeWVOvDAA3XZZZepqqpqk9NGDz74YA0cOFB9+vRRq1at9G//9m+bFH8hrVmzRg888MBGn4ekbfJ57bnnnvryl78c1ec1evRoDR8+XIceeqjcXVdffbX23HPPDeuOOOIISck1rB07dizaTwAAAKAYa8n7Nzaoqqryrbm3ZgiFCtT1q1Zo8Y1nBeyNtHTpUr366qu65pprNH369KCxY7J06dKyOf109uzZfF4AAAD4TDKzOnevKtaOU3wzsG7Z/OAxS5mdFuQJAAAAiAkjqCUqNIL65tWD8s5sui2ZWfCYMSJPAAAAQMtjBBUAAAAAEBUKVAAAAABAWaBAzUDHAaOCx2w68yzyI08AAABAPChQM7BLxcDgMaurq4PHjBF5AgAAAOJBgZqBN68eFDymmQWPGSPyBAAAAMSDAhUAAAAAUBYoUAEAAAAAZYECNQM79jwieMxBg8KfVhwj8gQAAADEgwI1A3udOiZ4zGnTpgWPGSPyBAAAAMSDAjUDb989LnjMwYMHB48ZI/IEAAAAxIMCNQNrFzwbPOb06dODx4wReQIAAADiQYG6HTEznXnmmRter1+/Xp06ddrs6zD79++v2tpaSdLxxx+vlStXZtrPuXPn6qijjlLv3r3Vp08f/e53v9uw7itf+YoqKipUUVGhrl276qSTTso0NgAAAIDy1aalO4Ds7LzzznrhhRe0du1a7bjjjnrggQfUrVu3rdrnfffdl1HvGu20006aMmWKevXqpaVLl6qyslIDBgzQ7rvvrscee2xDu6FDh+rEE0/MPD4AAACA8sQIagb2uzj8aaTunnf5N77xDc2YMUOSdMcdd+j000/fsO7DDz/UOeecoyOOOEKHH364/vjHP0qS1q5dq2HDhqlPnz761re+pbVr127YpkePHnrnnXckSSeddJIqKyvVu3dv1dTUbGjTvn17XXrppTrssMPUr18/LVu2rGDfDzzwQPXq1UuS1LVrV+21115avnz5Rm1WrVqlhx9+eKtHUJvLEwAAAIDyU3KBamatzew5M5uevt7ZeJBfAAAgAElEQVTfzJ42s9fM7Hdm1i5d/rn09fx0fY9t0/XysWruzOAxcwvEXMOGDdOdd96pjz76SM8//7y++MUvblj3i1/8Qscee6yeffZZPfLII/rJT36iDz/8UDfddJN22mknPf/887r00ktVV1eXd9+33nqr6urqVFtbqwkTJmjFihWSksK3X79+mjdvno455hhNnDhRkjR16lRddtllBd/HM888o3Xr1qlnz54bLb/33nv19a9/XbvuumvJOcmnuTwBAAAAKD+bM4J6gaSXcl5fLenX7t5L0nuSzk2XnyvpPXc/QNKv03bbtXdn3RA85siRI/Mu79OnjxYuXKg77rhDxx9//Ebr7r//fl111VWqqKhQ//799dFHH+nvf/+7Hn30UZ1xxhkbtu/Tp0/efU+YMGHDKOmiRYv02muvSZLatWu34TrXyspKLVy4UJI0ZMgQXX755c2+h/r6ep155pm67bbb1KrVxodi09HfLdVcngAAAACUn5KuQTWz7pJOkPQLSReZmUk6VtK/pk0mSxor6SZJJ6bPJeluSTeYmTnnWgYzZMgQ/fjHP9bs2bM3jHJKyemu99xzjw466KBNtkk+0ubNnj1bDz74oJ588knttNNOGwpcSWrbtu2G7Vu3bq3169cX7eMHH3ygE044QVdeeaX69eu30boVK1bomWee0b333lt0PwAAAAC2H6WOoI6X9FNJn6av95C00t0bKpHFkhpm4+kmaZEkpevfT9sjkHPOOUeXXXaZDj300I2WDxgwQNdff/2G6zKfe+45SdIxxxyj22+/XZL0wgsv6Pnnn99kn++//746dOignXbaSS+//LKeeuqpLe7funXrdPLJJ+uss87Saaedtsn6//u/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\n",
|
||
"text/plain": [
|
||
"<Figure size 1152x576 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"items_per_user=df.groupby(['item']).count()['rating']\n",
|
||
"\n",
|
||
"plt.figure(figsize=(16,8))\n",
|
||
"plt.hist(items_per_user, bins=100)\n",
|
||
"\n",
|
||
"# Let's add median\n",
|
||
"t=items_per_user.median()\n",
|
||
"plt.axvline(t, color='k', linestyle='dashed', linewidth=1)\n",
|
||
"plt.text(t*1.1, plt.ylim()[1]*0.9, 'Median: {:.0f}'.format(t))\n",
|
||
"\n",
|
||
"# Let's add also some percentiles\n",
|
||
"t=items_per_user.quantile(0.25)\n",
|
||
"plt.axvline(t, color='k', linestyle='dashed', linewidth=1)\n",
|
||
"plt.text(t*1.1, plt.ylim()[1]*0.95, '25% quantile: {:.0f}'.format(t))\n",
|
||
"\n",
|
||
"t=items_per_user.quantile(0.75)\n",
|
||
"plt.axvline(t, color='k', linestyle='dashed', linewidth=1)\n",
|
||
"plt.text(t*1.05, plt.ylim()[1]*0.95, '75% quantile: {:.0f}'.format(t))\n",
|
||
"\n",
|
||
"plt.title('Number of ratings per item', fontsize=30)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"rating\n",
|
||
"1 0.06110\n",
|
||
"2 0.11370\n",
|
||
"3 0.27145\n",
|
||
"4 0.34174\n",
|
||
"5 0.21201\n",
|
||
"Name: user, dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 6,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df.groupby(['rating']).count()['user']/len(df)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Item attributes"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"genres = pd.read_csv('./Datasets/ml-100k/u.genre', sep='|', header=None,\n",
|
||
" encoding='latin-1')\n",
|
||
"genres=dict(zip(genres[1], genres[0]))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"{0: 'unknown',\n",
|
||
" 1: 'Action',\n",
|
||
" 2: 'Adventure',\n",
|
||
" 3: 'Animation',\n",
|
||
" 4: \"Children's\",\n",
|
||
" 5: 'Comedy',\n",
|
||
" 6: 'Crime',\n",
|
||
" 7: 'Documentary',\n",
|
||
" 8: 'Drama',\n",
|
||
" 9: 'Fantasy',\n",
|
||
" 10: 'Film-Noir',\n",
|
||
" 11: 'Horror',\n",
|
||
" 12: 'Musical',\n",
|
||
" 13: 'Mystery',\n",
|
||
" 14: 'Romance',\n",
|
||
" 15: 'Sci-Fi',\n",
|
||
" 16: 'Thriller',\n",
|
||
" 17: 'War',\n",
|
||
" 18: 'Western'}"
|
||
]
|
||
},
|
||
"execution_count": 8,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"genres"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"movies = pd.read_csv('./Datasets/ml-100k/u.item', sep='|', encoding='latin-1', header=None)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"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>0</th>\n",
|
||
" <th>1</th>\n",
|
||
" <th>2</th>\n",
|
||
" <th>3</th>\n",
|
||
" <th>4</th>\n",
|
||
" <th>5</th>\n",
|
||
" <th>6</th>\n",
|
||
" <th>7</th>\n",
|
||
" <th>8</th>\n",
|
||
" <th>9</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>14</th>\n",
|
||
" <th>15</th>\n",
|
||
" <th>16</th>\n",
|
||
" <th>17</th>\n",
|
||
" <th>18</th>\n",
|
||
" <th>19</th>\n",
|
||
" <th>20</th>\n",
|
||
" <th>21</th>\n",
|
||
" <th>22</th>\n",
|
||
" <th>23</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>Toy Story (1995)</td>\n",
|
||
" <td>01-Jan-1995</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>http://us.imdb.com/M/title-exact?Toy%20Story%2...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>2</td>\n",
|
||
" <td>GoldenEye (1995)</td>\n",
|
||
" <td>01-Jan-1995</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>http://us.imdb.com/M/title-exact?GoldenEye%20(...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>3</td>\n",
|
||
" <td>Four Rooms (1995)</td>\n",
|
||
" <td>01-Jan-1995</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>http://us.imdb.com/M/title-exact?Four%20Rooms%...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>3 rows × 24 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" 0 1 2 3 \\\n",
|
||
"0 1 Toy Story (1995) 01-Jan-1995 NaN \n",
|
||
"1 2 GoldenEye (1995) 01-Jan-1995 NaN \n",
|
||
"2 3 Four Rooms (1995) 01-Jan-1995 NaN \n",
|
||
"\n",
|
||
" 4 5 6 7 8 9 ... \\\n",
|
||
"0 http://us.imdb.com/M/title-exact?Toy%20Story%2... 0 0 0 1 1 ... \n",
|
||
"1 http://us.imdb.com/M/title-exact?GoldenEye%20(... 0 1 1 0 0 ... \n",
|
||
"2 http://us.imdb.com/M/title-exact?Four%20Rooms%... 0 0 0 0 0 ... \n",
|
||
"\n",
|
||
" 14 15 16 17 18 19 20 21 22 23 \n",
|
||
"0 0 0 0 0 0 0 0 0 0 0 \n",
|
||
"1 0 0 0 0 0 0 0 1 0 0 \n",
|
||
"2 0 0 0 0 0 0 0 1 0 0 \n",
|
||
"\n",
|
||
"[3 rows x 24 columns]"
|
||
]
|
||
},
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"movies[:3]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"for i in range(19):\n",
|
||
" movies[i+5]=movies[i+5].apply(lambda x: genres[i] if x==1 else '')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"movies['genre']=movies.iloc[:, 5:].apply(lambda x: ', '.join(x[x!='']), axis = 1)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"movies=movies[[0,1,'genre']]\n",
|
||
"movies.columns=['id', 'title', 'genres']"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {},
|
||
"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>id</th>\n",
|
||
" <th>title</th>\n",
|
||
" <th>genres</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>Toy Story (1995)</td>\n",
|
||
" <td>Animation, Children's, Comedy</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>2</td>\n",
|
||
" <td>GoldenEye (1995)</td>\n",
|
||
" <td>Action, Adventure, Thriller</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>3</td>\n",
|
||
" <td>Four Rooms (1995)</td>\n",
|
||
" <td>Thriller</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4</td>\n",
|
||
" <td>Get Shorty (1995)</td>\n",
|
||
" <td>Action, Comedy, Drama</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>5</td>\n",
|
||
" <td>Copycat (1995)</td>\n",
|
||
" <td>Crime, Drama, Thriller</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" id title genres\n",
|
||
"0 1 Toy Story (1995) Animation, Children's, Comedy\n",
|
||
"1 2 GoldenEye (1995) Action, Adventure, Thriller\n",
|
||
"2 3 Four Rooms (1995) Thriller\n",
|
||
"3 4 Get Shorty (1995) Action, Comedy, Drama\n",
|
||
"4 5 Copycat (1995) Crime, Drama, Thriller"
|
||
]
|
||
},
|
||
"execution_count": 14,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"movies.to_csv('./Datasets/ml-100k/movies.csv', index=False)\n",
|
||
"movies[:5]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Toy example"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import os\n",
|
||
"if not os.path.exists('./Datasets/toy-example/'):\n",
|
||
" os.mkdir('./Datasets/toy-example/')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"toy_train=pd.DataFrame([[0,0,3,0], [0,10,4,0], [0,40,5,0], [0,70,4,0],\n",
|
||
" [10,10,1,0], [10,20,2,0], [10,30,3,0],\n",
|
||
" [20,30,5,0], [20,50,3,0], [20,60,4,0]])\n",
|
||
"toy_test=pd.DataFrame([[0,60,3,0],\n",
|
||
" [10,40,5,0],\n",
|
||
" [20,0,5,0], [20,20,4,0], [20,70,2,0]])\n",
|
||
"\n",
|
||
"toy_train.to_csv('./Datasets/toy-example/train.csv', sep='\\t', header=None, index=False)\n",
|
||
"toy_test.to_csv('./Datasets/toy-example/test.csv', sep='\\t', header=None, index=False)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3",
|
||
"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.6.5"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
}
|