[go: up one dir, main page]

0% found this document useful (0 votes)
16 views108 pages

MOVICO Ipynb

Jjiojjjj. Uvoucotc ygugigcugigyocitxtiyfcycpyoyoyououupuppufpufupjljlhchcch. Jbhiggi

Uploaded by

cocnik000
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
16 views108 pages

MOVICO Ipynb

Jjiojjjj. Uvoucotc ygugigcugigyocitxtiyfcycpyoyoyououupuppufpufupjljlhchcch. Jbhiggi

Uploaded by

cocnik000
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 108

{

"cells": [
{
"cell_type": "markdown",
"id": "2c37d752",
"metadata": {},
"source": [
"# MOVICO "
]
},
{
"cell_type": "markdown",
"id": "34822e5a",
"metadata": {},
"source": [
"# MOVIE RECOMMENDATION SYSTEM - COLLABORATIVE"
]
},
{
"cell_type": "markdown",
"id": "a5d4f371",
"metadata": {},
"source": [
"## EXPLORATORY DATA ANALYSIS"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "e917df43",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"from scipy.sparse import csr_matrix\n",
"from datetime import datetime\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "f76fbf79",
"metadata": {},
"outputs": [],
"source": [
"ratings_file='dataset/ratings.csv'\n",
"movies_file='dataset/movies.csv'"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "492a8ba2",
"metadata": {},
"outputs": [],
"source": [
"movies = pd.read_csv(movies_file)\n",
"ratings = pd.read_csv(ratings_file)\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "d568f2c5",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(9742, 3)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"movies.shape"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "9921a354",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(100836, 4)"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ratings.shape"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "6838d82a",
"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>movieId</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>Adventure|Animation|Children|Comedy|Fantasy</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>Jumanji (1995)</td>\n",
" <td>Adventure|Children|Fantasy</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>Grumpier Old Men (1995)</td>\n",
" <td>Comedy|Romance</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>Waiting to Exhale (1995)</td>\n",
" <td>Comedy|Drama|Romance</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>Father of the Bride Part II (1995)</td>\n",
" <td>Comedy</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" movieId title \\\n",
"0 1 Toy Story (1995) \n",
"1 2 Jumanji (1995) \n",
"2 3 Grumpier Old Men (1995) \n",
"3 4 Waiting to Exhale (1995) \n",
"4 5 Father of the Bride Part II (1995) \n",
"\n",
" genres \n",
"0 Adventure|Animation|Children|Comedy|Fantasy \n",
"1 Adventure|Children|Fantasy \n",
"2 Comedy|Romance \n",
"3 Comedy|Drama|Romance \n",
"4 Comedy "
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"movies.head()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "121a1326",
"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>userId</th>\n",
" <th>movieId</th>\n",
" <th>rating</th>\n",
" <th>timestamp</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>4.0</td>\n",
" <td>964982703</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>4.0</td>\n",
" <td>964981247</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1</td>\n",
" <td>6</td>\n",
" <td>4.0</td>\n",
" <td>964982224</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>47</td>\n",
" <td>5.0</td>\n",
" <td>964983815</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1</td>\n",
" <td>50</td>\n",
" <td>5.0</td>\n",
" <td>964982931</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" userId movieId rating timestamp\n",
"0 1 1 4.0 964982703\n",
"1 1 3 4.0 964981247\n",
"2 1 6 4.0 964982224\n",
"3 1 47 5.0 964983815\n",
"4 1 50 5.0 964982931"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ratings.head()"
]
},
{
"cell_type": "markdown",
"id": "10df7b97",
"metadata": {},
"source": [
"## MOVIE GENRE"
]
},
{
"cell_type": "markdown",
"id": "0fe078ad",
"metadata": {},
"source": [
"### Most popular genres of movie released"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "96152da1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<BarContainer object of 19 artists>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png":
"iVBORw0KGgoAAAANSUhEUgAABIoAAAGbCAYAAACro3tsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIH
ZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/
YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAqiUlEQVR4nO3de7hkZX0n+u/
PbgIYAoqgg0Bsx8MkAcYQ6Ri8RNvERKIZ0USPEKNwxjmMPDpqMo6jkzkGdchRE3MxCXEIY0BjVBJvaGKUEL
dGxWCjyE1REokQGME7GA8KvueP9W66enfV3rWv1d1+Ps+zn71q1Vqr3ndd3rXquy5VrbUAAAAAwD1mXQAAA
AAAdg+CIgAAAACSCIoAAAAA6ARFAAAAACQRFAEAAADQbZ51AZZyyCGHtC1btsy6GAAAAAB7jcsuu+xLrbVD
F/bf7YOiLVu2ZPv27bMuBgAAAMBeo6r+aVx/
t54BAAAAkERQBAAAAEAnKAIAAAAgiaAIAAAAgE5QBAAAAEASQREAAAAAnaAIAAAAgCSCIgAAAAA6QREAAAA
ASQRFAAAAAHSCIgAAAACSCIoAAAAA6ARFAAAAACQRFAEAAADQCYoAAAAASCIoAgAAAKDbPOsCAPC9Za7mZl
2EqW1r22ZdBAAA2FCuKAIAAAAgiaAIAAAAgE5QBAAAAEASQREAAAAAnaAIAAAAgCSCIgAAAAA6QREAAAAAS
QRFAAAAAHSCIgAAAACSCIoAAAAA6ARFAAAAACQRFAEAAADQCYoAAAAASCIoAgAAAKATFAEAAACQRFAEAAAA
QCcoAgAAACCJoAgAAACATlAEAAAAQBJBEQAAAACdoAgAAACAJIIiAAAAADpBEQAAAABJBEUAAAAAdIIiAAA
AAJIIigAAAADopg6KqmpTVX2yqt7TXx9cVRdV1ef6/3uPDPuSqrquqq6tqseN9D+
+qq7s7722qmptqwMAAADASi3niqLnJ/n0yOsXJ7m4tXZUkov761TV0UlOTnJMkhOTnF1Vm/
o4f5Tk9CRH9b8TV1V6AAAAANbMVEFRVR2R5AlJzh3pfVKS83v3+UmeNNL/
La21O1prn09yXZKHVtVhSQ5srV3SWmtJ3jAyDgAAAAAzNu0VRb+b5EVJvjvS736ttZuTpP+/b+9/
eJIbRoa7sfc7vHcv7L+Lqjq9qrZX1fZbb711yiICAAAAsBpLBkVV9fNJbmmtXTblNMc9d6gt0n/
Xnq2d01rb2lrbeuihh075sQAAAACsxuYphnlEkidW1eOT7JfkwKr60yRfrKrDWms399vKbunD35jkyJHxj0
hyU+9/xJj+AAAAAOwGlryiqLX2ktbaEa21LRkeUv23rbVfTnJhklP7YKcmeVfvvjDJyVW1b1U9MMNDqy/
tt6fdVlUn9F87e+bIOAAAAADM2DRXFE3yyiQXVNWzknwhyVOTpLV2dVVdkOSaJHcmeU5r7a4+zhlJzkuyf5
L39j8AAAAAdgPLCopaa3NJ5nr3l5P89IThzkpy1pj+25Mcu9xCAgAAALD+pv3VMwAAAAD2coIiAAAAAJIIi
gAAAADoBEUAAAAAJBEUAQAAANAJigAAAABIIigCAAAAoBMUAQAAAJBEUAQAAABAJygCAAAAIImgCAAAAIBO
UAQAAABAEkERAAAAAJ2gCAAAAIAkgiIAAAAAus2zLgCwceZqbtZFmNq2tm3WRQAAAPie44oiAAAAAJIIigA
AAADoBEUAAAAAJBEUAQAAANAJigAAAABIIigCAAAAoBMUAQAAAJBEUAQAAABAJygCAAAAIImgCAAAAIBOUA
QAAABAEkERAAAAAJ2gCAAAAIAkgiIAAAAAOkERAAAAAEkERQAAAAB0giIAAAAAkgiKAAAAAOgERQAAAAAkE
RQBAAAA0AmKAAAAAEgiKAIAAACgExQBAAAAkERQBAAAAEAnKAIAAAAgiaAIAAAAgE5QBAAAAEASQREAAAAA
naAIAAAAgCSCIgAAAAA6QREAAAAASQRFAAAAAHSCIgAAAACSCIoAAAAA6ARFAAAAACQRFAEAAADQCYoAAAA
ASCIoAgAAAKATFAEAAACQRFAEAAAAQCcoAgAAACCJoAgAAACATlAEAAAAQBJBEQAAAACdoAgAAACAJIIiAA
AAADpBEQAAAABJBEUAAAAAdIIiAAAAAJIIigAAAADoBEUAAAAAJBEUAQAAANAJigAAAABIIigCAAAAoBMUA
QAAAJBEUAQAAABAJygCAAAAIImgCAAAAIBuyaCoqvarqkur6lNVdXVVvaz3P7iqLqqqz/X/
9x4Z5yVVdV1VXVtVjxvpf3xVXdnfe21V1fpUCwAAAIDlmuaKojuS/
FRr7UeTHJfkxKo6IcmLk1zcWjsqycX9darq6CQnJzkmyYlJzq6qTX1af5Tk9CRH9b8T164qAAAAAKzGkkFR
G9zeX+7T/1qSk5Kc3/ufn+RJvfukJG9prd3RWvt8kuuSPLSqDktyYGvtktZaS/
KGkXEAAAAAmLGpnlFUVZuq6vIktyS5qLX290nu11q7OUn6//
v2wQ9PcsPI6Df2fof37oX9x33e6VW1vaq233rrrcuoDgAAAAArNVVQ1Fq7q7V2XJIjMlwddOwig4977lBbp
P+4zzuntba1tbb10EMPnaaIAAAAAKzSsn71rLX2tSRzGZ4t9MV+O1n6/1v6YDcmOXJktCOS3NT7HzGmPwAA
AAC7gWl+9ezQqrpX794/yWOTfCbJhUlO7YOdmuRdvfvCJCdX1b5V9cAMD62+tN+edltVndB/
7eyZI+MAAAAAMGObpxjmsCTn918uu0eSC1pr76mqS5JcUFXPSvKFJE9Nktba1VV1QZJrktyZ5Dmttbv6tM5
Icl6S/ZO8t/
8BAAAAsBtYMihqrV2R5MfG9P9ykp+eMM5ZSc4a0397ksWebwQAAADAjCzrGUUAAAAA7L0ERQAAAAAkERQBA
AAA0AmKAAAAAEgiKAIAAACgExQBAAAAkERQBAAAAEAnKAIAAAAgiaAIAAAAgE5QBAAAAEASQREAAAAAnaAI
AAAAgCSCIgAAAAA6QREAAAAASQRFAAAAAHSCIgAAAACSCIoAAAAA6ARFAAAAACQRFAEAAADQCYoAAAAASCI
oAgAAAKATFAEAAACQRFAEAAAAQCcoAgAAACCJoAgAAACATlAEAAAAQBJBEQAAAACdoAgAAACAJIIiAAAAAD
pBEQAAAABJBEUAAAAAdIIiAAAAAJIIigAAAADoBEUAAAAAJBEUAQAAANAJigAAAABIIigCAAAAoBMUAQAAA
JBEUAQAAABAJygCAAAAIImgCAAAAIBOUAQAAABAEkERAAAAAJ2gCAAAAIAkgiIAAAAAOkERAAAAAEkERQAA
AAB0giIAAAAAkgiKAAAAAOgERQAAAAAkERQBAAAA0AmKAAAAAEgiKAIAAACgExQBAAAAkERQBAAAAEAnKAI
AAAAgiaAIAAAAgE5QBAAAAEASQREAAAAAnaAIAAAAgCSCIgAAAAA6QREAAAAASQRFAAAAAHSCIgAAAACSCI
oAAAAA6ARFAAAAACQRFAEAAADQCYoAAAAASCIoAgAAAKATFAEAAACQRFAEAAAAQCcoAgAAACCJoAgAAACAT
lAEAAAAQBJBEQAAAADdkkFRVR1ZVR+oqk9X1dVV9fze/+CquqiqPtf/33tknJdU1XVVdW1VPW6k//
FVdWV/77VVVetTLQAAAACWa5oriu5M8p9baz+S5IQkz6mqo5O8OMnFrbWjklzcX6e/
d3KSY5KcmOTsqtrUp/VHSU5PclT/
O3EN6wIAAADAKiwZFLXWbm6tfaJ335bk00kOT3JSkvP7YOcneVLvPinJW1prd7TWPp/
kuiQPrarDkhzYWruktdaSvGFkHAAAAABmbFnPKKqqLUl+LMnfJ7lfa+3mZAiTkty3D3Z4khtGRrux9zu8dy
/sP+5zTq+q7VW1/dZbb11OEQEAAABYoamDoqo6IMnbkrygtfaNxQYd068t0n/
Xnq2d01rb2lrbeuihh05bRAAAAABWYaqgqKr2yRASvam19vbe+4v9drL0/7f0/
jcmOXJk9COS3NT7HzGmPwAAAAC7gWl+9ayS/K8kn26t/
fbIWxcmObV3n5rkXSP9T66qfavqgRkeWn1pvz3ttqo6oU/
zmSPjAAAAADBjm6cY5hFJnpHkyqq6vPf7b0lemeSCqnpWki8keWqStNaurqoLklyT4RfTntNau6uPd0aS85
Lsn+S9/Q8AAACA3cCSQVFr7cMZ/
3yhJPnpCeOcleSsMf23Jzl2OQUEAAAAYGMs61fPAAAAANh7CYoAAAAASDLdM4oAAPYqczU36yJMbVvbNusi
AADfQ1xRBAAAAEASQREAAAAAnaAIAAAAgCSCIgAAAAA6QREAAAAASfzqGQCsCb+iBQDA3sAVRQAAAAAkERQ
BAAAA0AmKAAAAAEgiKAIAAACgExQBAAAAkERQBAAAAEAnKAIAAAAgiaAIAAAAgE5QBAAAAEASQREAAAAAna
AIAAAAgCSCIgAAAAA6QREAAAAASQRFAAAAAHSCIgAAAACSCIoAAAAA6ARFAAAAACQRFAEAAADQbZ51AQAYb
67mZl2EqW1r22ZdBAAAYA24oggAAACAJIIiAAAAADpBEQAAAABJBEUAAAAAdIIiAAAAAJIIigAAAADoBEUA
AAAAJBEUAQAAANAJigAAAABIIigCAAAAoBMUAQAAAJBEUAQAAABAJygCAAAAIImgCAAAAIBOUAQAAABAEkE
RAAAAAJ2gCAAAAIAkgiIAAAAAOkERAAAAAEkERQAAAAB0giIAAAAAkgiKAAAAAOgERQAAAAAkERQBAAAA0A
mKAAAAAEgiKAIAAACgExQBAAAAkCTZPOsCfK+Yq7lZF2FZtrVtsy4CAAAAsMFcUQQAAABAEkERAAAAAJ2gC
AAAAIAkgiIAAAAAOg+zBgAm2pN+jMEPMQAArJ4rigAAAABIIigCAAAAoBMUAQAAAJBEUAQAAABAJygCAAAA
IImgCAAAAIBOUAQAAABAEkERAAAAAJ2gCAAAAIAkgiIAAAAAOkERAAAAAEkERQAAAAB0giIAAAAAkkwRFFX
V66vqlqq6aqTfwVV1UVV9rv+/98h7L6mq66rq2qp63Ej/
46vqyv7ea6uq1r46AAAAAKzUNFcUnZfkxAX9Xpzk4tbaUUku7q9TVUcnOTnJMX2cs6tqUx/nj5KcnuSo/
rdwmgAAAADM0JJBUWvtQ0m+sqD3SUnO793nJ3nSSP+3tNbuaK19Psl1SR5aVYclObC1dklrrSV5w8g4AAAA
AOwGVvqMovu11m5Okv7/
vr3/4UluGBnuxt7v8N69sP9YVXV6VW2vqu233nrrCosIAAAAwHJsXuPpjXvuUFuk/
1ittXOSnJMkW7dunTgcAADsqeZqbtZFmNq2tm3WRQBgg6w0KPpiVR3WWru531Z2S+9/
Y5IjR4Y7IslNvf8RY/
oDALBGBA8AwGqt9NazC5Oc2rtPTfKukf4nV9W+VfXADA+tvrTfnnZbVZ3Qf+3smSPjAAAAALAbWPKKoqp6c
5JtSQ6pqhuT/HqSVya5oKqeleQLSZ6aJK21q6vqgiTXJLkzyXNaa3f1SZ2R4RfU9k/
y3v4HAAAAwG5iyaCotXbKhLd+esLwZyU5a0z/
7UmOXVbpAAAAANgwK731DAAAAIC9jKAIAAAAgCSCIgAAAAA6QREAAAAASQRFAAAAAHSCIgAAAACSCIoAAAA
A6ARFAAAAACQRFAEAAADQCYoAAAAASCIoAgAAAKATFAEAAACQJNk86wIArNZczc26CFPb1rbNuggAAAATua
IIAAAAgCSCIgAAAAA6QREAAAAASQRFAAAAAHSCIgAAAACSCIoAAAAA6ARFAAAAACQRFAEAAADQCYoAAAAAS
JJsnnUBYHc0V3OzLsKybGvbZl0EAAAA9gKuKAIAAAAgiaAIAAAAgE5QBAAAAEASzyhilTzLBwAAAPYerigC
AAAAIImgCAAAAIDOrWcAAOzW9qRb3d3mDsCezhVFAAAAACQRFAEAAADQCYoAAAAASCIoAgAAAKATFAEAAAC
QRFAEAAAAQCcoAgAAACCJoAgAAACATlAEAAAAQBJBEQAAAADd5lkXAAAAgNmYq7lZF2Fq29q2WRcBvie4og
gAAACAJIIiAAAAADpBEQAAAABJBEUAAAAAdB5mDQAArBkPRwbYs7miCAAAAIAkgiIAAAAAOkERAAAAAEk8o
wgAAGBJnr0EfK9wRREAAAAASQRFAAAAAHSCIgAAAACSCIoAAAAA6ARFAAAAACQRFAEAAADQCYoAAAAASCIo
AgAAAKATFAEAAACQRFAEAAAAQCcoAgAAACCJoAgAAACATlAEAAAAQJJk86wLAAAAACxtruZmXYSpbWvbZl0
EVkhQBAAAwF5FoAIr59YzAAAAAJIIigAAAADoBEUAAAAAJBEUAQAAANAJigAAAABI4lfPAAAAgBnyK3W7F1
cUAQAAAJBEUAQAAABAJygCAAAAIMkMgqKqOrGqrq2q66rqxRv9+QAAAACMt6FBUVVtSvKHSX4uydFJTqmqo
zeyDAAAAACMt9FXFD00yXWttX9srX07yVuSnLTBZQAAAABgjM0b/HmHJ7lh5PWNSX5i4UBVdXqS0/
vL26vq2g0o257qkCRfWvOp1ppPcbnUazn2xnrNvk6Jek1PvdaTek1LvdaTek1LvdaTek1r9vVyzLsc6rVe9
tZ6raUHjOu50UHRuFnadunR2jlJzln/
4uz5qmp7a23rrMux1tRrz6Jeexb12rOo155FvfYs6rVnUa89x95Yp0S99jR7a702wkbfenZjkiNHXh+R5KY
NLgMAAAAAY2x0UPTxJEdV1QOr6vuSnJzkwg0uAwAAAABjbOitZ621O6vquUnel2RTkte31q7eyDLshfbWW/
TUa8+iXnsW9dqzqNeeRb32LOq1Z1GvPcfeWKdEvfY0e2u91l21tssjggAAAAD4HrTRt54BAAAAsJsSFAEAA
ACQRFC07qrqyVXVquqHJ7w/V1Vr+pN9VfWkqjp6Lac54XMWrduCYc9dizJV1Zaq+qWR11ur6rWrne4Sn/
mvquotVfUPVXVNVf1VVZ1eVe+ZMPzdda2q66vqkDHDnFlVL1zPci9lQr3+zQZ99tj5sobTv6uqLh/
527KCaZxWVfdfh+Itpwzz9biqqt5dVfeaZXnW20h9r66qT1XVr1bVXrOfmrbNrKoXVNU9R17/1e687KdtS6
rqo7Mo37Sq6j4jbcb/rqp/
7t1fq6prppzGs6vqmb37vKp6Su9e8339SlTV7Qten1ZVfzCr8qxU347eOPJ6c1XdOmm/
vMS0jquqx69tCddeVf1abxuv6OvlT0wYbuJxUV8Prx1Zz5+yVsdnq1VVv1NVLxh5/
b6qOnfk9Wuq6ldnUrhFrOW62Mdf0fKoqm0LP3NP3qdu9HY53zb27xmtql4x8t4hVfWdhW1ln6dvXtDvwqp6
xsjrP66q/7JOZV7TbaavQw9f42Iuy7jj9/ljh9591Sqn36rqNSOvX1hVZy4xzt379e81e0RjsYc7JcmHM/
zC20Z5UpJl7WSqaiUPNp+6bq21/9Bam+pAewlbktwdFLXWtrfWnrcG0x2rqirJO5LMtdYe1Fo7Osl/S3K/
SeOspq4rXA4r+Zxl12sP863W2nEjf9evYBqnJZlpUJQd9Tg2yVeSPGfG5Vlv8/
U9JsnPJHl8kl9fONBGbSfrYNo28wVJ7g6KWmuPb619bf2KtXLTtCVVtSlJWmszPQBdSmvty/
NtRpLXJfmd3n1cku8uNX5VbW6tva619obVlmV+nu1uFm57026L67DNfjPJsVW1f3/9M0n+eYXTOi5DWzO1j
W6DquphSX4+yUNaaw9O8tgkN4wbdorjoqeP7Bv/
Yg2Pz1bro0keniQ9zDgkyTEj7z88yUeWmsgM9g9ruS6u5fFyMuU+dTd1XGa3Xf5jhu1t3lOT7PTjS1X1Ixm
+Rz+qqr5/5K3nJXl5Vd2rhy4/keR316hcC63JNjNi2/
z0prUO29sux+9rfOxwR5JfqGWcrJ60X9+Dj0WnJihaR1V1QJJHJHlW+heDqtq/hjOvV1TVW5Ps3/
ufUVWvHhn3tKr6/d79y1V1aU9W/+f8AWRV3V5VZ/VE+2NVdb/eKD0xyW/24R9UI2cyeyp+/chn/
HlVvTvJ+6vq+6vq9VX18ar6ZFWdtMy6beuf9RdV9ZmqelP/EpEFZbi9ql5VVZdV1d9U1UP7+/9YVU/
sw2ypqr+rqk/0v/lG4pVJfrLX7Vdq5AxKVR1cVe/s8/ZjVfXg3v/MXq/
5z1hOsPSYJN9prb1uvkdr7fIkf5fkgKXqumCe/VoNZ/L+JskPjfSfq6rfqKoPJnl+VR1fVR/
s8+d9VXXYyHCv6uvCZ6vqJ5dRj2nr9eGq+s0armC5sqqe1j97Wy/
TBf2zX1lVT+9lubKqHtSHO7Sq3tbXoY9X1SN6//tU1fv7evU/
k8zPq1dU1fNH5sVZy1w+U6mqA6rq4r4uXTm/bvf17NM1nPG5updx/xquAtia5E19Xdu/
ql7a63RVVZ0zsryfV8NVFFfUsG3fo6o+V1WH9vfvUVXX1eqvoLokyeF9msf1dfyKqnpHVd2795+r4QzTh3q
9fryq3t7L8z9G5sc7+/p1dVWdPtJ/lzal979f/5xP9b/
5A5OxbdNaaK3dkuT0JM+twcL2arFl+pkazspeVcO2+diq+kifDw/
twz20qj7a18mPVtUPLVKcVavxbeamqvqtXv4rquo/9fX//
kk+UFUf6MNdP7/+1HBG+Kr+94KROu+yHq9nfUZMaks2VdUHqurPklzZyzl/
xnZV7cmMbBo3f2vX9vvMWuJq0ar62aq6pK+7f97Xjfnl/NKq+nCGLyYbqqoe0LepK/r/
H+z9z6uq3+7r46vGvF6sPbp73qxDkd+b5Am9+5Qkb+6fO7ENrqqn9m3nUzW0k9+X5OVJntbbsafVhGOhMW3
QG2vkOKm3NU9ch3omyWFJvtRauyNJWmtfaq3dVEMb/
9Fen0ur6gdqzJUli6nd5Gq3DF9o54/1jklyVZLbqureVbVvkh9J8rgavx9e73VtKWPXxV62ndqEXvYtfT37
y77srqodx1ujx8sn9nbiU1V1ce+3on3XmH3qflX1J73N/WRVPaZPf5f9Uu8/uh/aWlVzI/
U7v7eL11fVL1TVq/v4f11V+/Thpj62nbBdjq33Om2X30ry6ZHt4mlJLlgwzC8leWOS92f43jU/n6/
P8Ctbr05ydpLntta+s8zPn9Y020wmzPeFx65bkjw7ya/0ef6TNfmY/sy+/b0/yRtqdd+zllQLroTt/
U6r4Vj23VX1+ap6bg3HR5+sYX908ITJ3Zlh+fzKmGlO2gfevQ3vBm3Nxmqt+VunvyS/nOR/
9e6PJnlIkl9N8vre78EZVtitSQ5Nct3IuO9N8sgMG/
m7k+zT+5+d5Jm9uyX5d7371Un+e+8+L8lTRqY1l2Rr7z4kyfW9+7QkNyY5uL/+jSS/3LvvleSzSb5/
GXXbluTrSY7IEEJekuSRY8rQkvxc735HhkZ2nyQ/muTy3v+eSfbr3Ucl2d67tyV5z0g57n6d5PeT/Hrv/
qmRaZ3Zy7hvr/+X5+fnFMvweRnOKi/sP21dr++feXyGL0v3THJgkuuSvHBk+LN79z69rIf210/
LjvVlLslrevfjk/zNKtbNSfX6xSQXJdmU4YqAL2Q4QN2W5Gu9e98MZ8te1sd5fpLf7d1/
NjIffjDJp3v3a5O8tHc/
oa8Dh2S4QuwTvf89kvxDkvuswbZ3V5LL+987kmxOcuDINnBdhrBqS4Zt8Lj+3gXZsQ3cvRz764NHut+YHdv
eTUn2nd9u+v9fT/KC3v2zSd62wnrc3v9vSvLnSU7sr69I8uje/fKR+T+X5FUjy+WmkWV24/
y8zY5tfv8MBxbz/Se1KW8dqc+mJAdlkbZpFcv
t9jH9vtrXxdOyc3u11DL9t32duizJ6/t7JyV5Zx/nwCSbe/
djV7qMllG3cW3mGUneNlKO+bpdn+SQkXGvz87tyPcnOSDDGc4fyyLr8Xr/
ZfE28ptJHjhmfd6WVbQnG1SvM7OjjZ44fzPSfo8Z77z0fXEfbmtfjh9K37cm+a/
Z0TZen+RF61yv0bbx8gxt/B/0996d5NTe/
e9HtpXzkrwnyaYJrxdrj85ep3rcnuEY6i+S7Nfrsi07jgfGtsEZtp/De/e9+v/
T5udBfz32WCi7tkGPHplHByX5fPq2vA71PaDX8bMZ2tpHJ/m+DFc+/Hgf5sAM7eLd82HMdOaSXDuy/
O+TBfu6Wf71beAHk/zHDF9aX5HheOcRfbuZtB9et3VtDdbFM9PbhP76qgxtyi8m+eOR/
geN1GX+e8EN6W3oyHo3dt81brln8X3qf07yJ73fD2doC/bLFPulXr65kfp9ODuO4/8lOx/
jPykrOLbNrtvlpHqfljXYLrNj/
7SlL6MnJvmtDMf5F48pz2eTPCBD+3Lhgmnt0+fnm2a8zVyyyHwfd+x6ZnZeVycd05+Z4dhq/5HXK/
qeNaY+Ox2/j1s2I8v9uiQ/kGFb+XqSZ/f3fie9/
Z+wvR7Y59tBSV6Y5Mz+3qR94N3zJTNsa2bxt9dfMjVjp2TH5YZv6a+PyvClOa21K6rqit59a09hT0jyuQxX
nHwkw60mxyf5eA0nTvZPckuf5rczHKwlwwb7Myso40Wtta/07p9N8sTaceZjv/SGYcq6/
WWSS1trNyZJVV2eYaP+8IJxv53kr3v3lUnuaK19p6qu7MMnQyP7B1V1XIZGY5pn5zwyw443rbW/
reEqloP6e3/ZhjNxd1TVLRl2kjdOMc3FTFPXeT+ZocH7lz78hQvef2v//0NJjk1yUV/em5LcPDLc2/v/
y7JjXq2lRyZ5c2vtriRf7In5jyf5RpKPt9Zu7uX/
hwwBXzIsw8f07scmObqXPUkOrKofSPKoJL+QJK21v6yqr/
bu66vqy1X1YxmWySdba19eg3p8qw23jKSXd58kv1FVj8pwC8nh2XFrzOfbcAVEsvh8fUxVvShD2Hdwhi/
p787wJelNVfXOJO/sw74+ybsybCP/PsmfrLAe+4+sW5dlWC8OyrBT/
2Af5vwMIdK8+XXryiRXjyyzf0xyZIYd+POq6sl9uCMztEtfzuQ25aeSPDNJ+rrx9RruwZ/
UNq2lGukeba8qiy/
T+atYrk5ycWutLWhjDkpyflUdlSEg22cdyj5qXJv5r5O8rrV2Z5KM1G2SR2ZoR76ZJFX19gxty4WZfj3eSJ
e21j4/4b0VtyettdvWq8CLWGz+vnWXoSc7IcOt4R/p9fq+DAfzK5nWSixsG0/
L8KUvSR6W3k5n+BL+6pHx/
rxv+zu9nqI9Wrf69GOoLRm2pb9a8PakNvgjSc6rqguyY3+60KRjoWSkDWqtfbCq/
rCq7pthvr1tfltea62126vq+Azb+2MyzNezktzcWvt4H+YbSTKyvUzy9Nba9vkXUwy/keavkHh4kt/
O0K4/PMOXwI9m8n44Wf9tZ6Il1sVJrkzyW1X1qgwBz98teP+EJB+ab0NH9g+r3XfNL/
BHZjjBmtbaZ6rqnzIcaz82y9svJcl7R47jN2XnY/wtWZtj28XqvR7b5V9nCF2+mAXrVlX9eJJbW2v/
VFU3Jnl9Vd27tfbVPsiDM8znH66qe7TWlrx1eRUW22b+OUN7Nm6+jzt2XWjSMX0yhGPfGhl2rb5n7bSPWsI
H+vHAbVX19exoC67MsAzGaq19o6rekOFE12gdFtsHjppZW7PRBEXrpKruk+HL1bFV1TJsnC3JJ/v/
cd6a5P9M8pkMXwZaDVvn+a21l4wZ/juttflp3ZXJy/PO7LjNcL8F731ztNhJfrG1du3kmi1at7/KcO/
nvEllGi33d+fHaa19t3bc7/krGRrnH+1l//8WK9NI+Rea/5xpyjXO1UmeMuG95U5z0nJPdiyHyvDl/
mFLfOZy6jDOpHotdsQ4Wt/vjrz+7khZ7pHkYQt2HvMHopPqf26GMwP/KsPB/
Xp4eoYzDsf3g5nrs2NbWLgcd7llp6r2y3AWd2tr7YYaHnw3P/4TMgRhT0zy/1TVMX2YL1bVT2W4P/
3pKyz3t1prx/UvY+/JEByfv8Q4o8tl4TLbXFXbMuz8H9Za+5caLh+fr8u0bUoyrCuT2qY1UVX/
updjPoAaba+mXaaT1tVXZDjIeHI/wJ9b6/
LPW6TNvCyLtwu7TGqR95Zcj9fJYm3kNyf0T1bRnszIYvN3sXouVBm+1Jwy4f3lTGu9ja6bC8s1bTnXuz4XZ
jjrvy3D1TFJkkltcGvt2TU8BPoJSS7vJ6MWGnss1MdbWJ839mmfnCGQWjc9qJtLMte/kD8nS7QfVfW+DF/
YtrfW/sN6lm+NzD9z5d9muKrjhgxXvnwjw/HBuRm/H05mv+2MXRez8zF40svcWvtsD/8en+T/
rar3t9ZePjJcZfzyXfG+a8E+ddL+ZNLnLvZdYvQ4fuEx/uaszbHtYvVe8+2ytfbtqrosw/p3TJJ/N/
L2KRlCoOv76wMznKg+t4ZnBZ2d5BkZrvA5I8kfrqQMU1psm/
nbDFdQjpvvuxy7jhlmsWP6hfN8pd+zVmPR44iqOjI7wqPXtZFb5DOcRPhEFj+RO6l9nXVbs2E8o2j9PCXJG
1prD2itbWmtHZnh8sdPpB+wVNWx2TnxfHuGSzRPyY608uIkT+nJeGp4Ds8Dlvjs2zJcijfv+gxn/
ufLNcn7kvynHk6lX+WxnLo9colyLcdBGc6UfTdDYzv/7JOFdRv1oeyYt9sy3M//jVWW42+T7FtV//
d8j34m4dHLnM6Hkjy5hmfd/EB23uGMujbJoTU8uDJVtc+Exnu1JtXrqxnuCd9Uw/
MdHpXk0mVM9/1JnjsyzeN65+iy+bkk9x4Z5x1JTsxw5dL7ll2T6RyU5JYeKDwmw+XCSxld1+YPir5Uw/
NE5n/J6B5JjmytfSDJizLcpnBAH/
bcJH+a5IIFZ+KXrbX29QxnPl6Y4bLur9aOZ1Q9I8kHJ407xkFJvtpDoh/
OcNZyKRdnONiZf37BgVlZ2zS1vv69LsOl3uN21itZpgvHn3/
g6GkrLuh0FtsfPHs+IK8d99RPauc+lORJVXXPGh6e+eQMz0ubpbVqI8eZ1J7syT6W5BFV9X8kSV+WG/
Jrk1P4aHY8aP3pmXyF7N1627Sa9mi1Xp/
k5fNXEC6wSxtcVQ9qrf19a+2lSb6U4YrKhdvbtMdCyXAb3guSpLV29SLDrUpV/VC/
kmLecRmu9r5/395Sw/OJdvpy1lp7XBseCLsnhETJcHXEzyf5Smvtrn6VyL0ynOmfv/Jup/
3wbmTSunh9hluNU1UPSfLA3n3/JP/SWvvTDAHTQxaMd0mSR1fV/
PDz+4cV7bvG7FNHj8v+TYar5q7N0O6O2y9dnx3fJX5x2s/
tVnJsu3C7XE69z8vabJevSfJf28iV7v2476lJHtz351sy3NY+H/7/
xySfa63NZXjcyIv6vF8vi20zb82Y+b7IsevCeb5H74Nbaze0HQ/Fft2C976S4TbyZ430XvY+cG8nKFo/
p2T4AjzqbRkuqTyghlvOXpSRL+H9ksVrkjygtXZp73dNkv+e4QFtV2R4fsxhS3z2W5L8lxoe6PWgDDugM2r
4ecHFHqj7igyXcl5Rw88PvmKZdfulMcOu1NlJTq2qj2W4FHY+vb0iyZ01PNhv4YPIzkyytc+nVyY5dbWF6D
vTJyf5mRp++vnq/jk3LXM6n8jQYF+eYV6N/XLXWvt2hoOfV1XVp/rwa/
5LQYvU688yzONPZfgC+KLW2v9exqSfl74Mavg56Wf3/i/L8MsQn8hwGewXRsry7SQfyBoEKot4Uy/
X9gyN/2emGOe8JK+r4davO5L8cYbLWd+Z5ON9mE1J/rSf3f1khme1fK2/
d2GGHe9KbzvbSWvtkxmWy8kZ1u3f7Ov6cRmeCzKtv85wpuWKDNv4x6YY5/kZLvm/
MsNVMMessG1ayv7Vf8o3yd9kOEh52YRhV7JMR706w1ncj2RHEL1eJrWZ98+wLVzRt/f5NvScJO+t/
jDreb0dOS/DfuPvk5zb14uZWas2coJJ7ckeq7V2a4YvOW/u283HMjwfZHfwvCT/Vy/
XMzL9gzpX0x6tSmvtxtba7014e1wb/
Js1PGT3qgxflD+VYf9zdG97npbpj4XSWvtihsBmTdr5RRyQ4baba/p8PjrJSzM8c+T3e/
txUXa90mNPc2WG49SPLej39dbalzJ+P7xbWGRdfFuSg/uxxBkZnm2TDFeAXNr7/1qS/zE6Um8rTk/
y9r58508gL2fftdg+9ewMD+m/sk/
7tDbcOnRuxu+XXpbk96rq7zJcMTK1FR7bLtwup673Wm2XrbWrW2sLr+J+VJJ/bq2N/
rLdh3pZH5DhuXMv7OPflOT3MvkWprWw2DZzS8bP90nHru/OcFL78h7+73X74AVek52/
F690H7jXqvEnagE2Rj+z8YkkT22tfW7W5VkrNfxaxu+01lbz63QArMBGtMFVdc8MX8oe0q+uAmbMdglrwxV
FwMxU1dEZfrXg4r0sJHpxhrOI6/b8HgDG24g2uKoem+FKxt/
3ZRR2D7ZLWDuuKAIAAAAgiSuKAAAAAOgERQAAAAAkERQBAAAA0AmKAAAAAEgiKAIAAACg+/
8BKiNUteWTQaEAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 1440x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(20,7))\n",
"generlist = movies['genres'].apply(lambda generlist_movie :
str(generlist_movie).split(\"|\"))\n",
"geners_count = {}\n",
"\n",
"for generlist_movie in generlist:\n",
" for gener in generlist_movie:\n",
" if(geners_count.get(gener,False)):\n",
" geners_count[gener]=geners_count[gener]+1\n",
" else:\n",
" geners_count[gener] = 1 \n",
"geners_count.pop(\"(no genres listed)\")\n",
"plt.bar(geners_count.keys(),geners_count.values(),color='m')"
]
},
{
"cell_type": "markdown",
"id": "74d49ff3",
"metadata": {},
"source": [
"### Inference"
]
},
{
"cell_type": "markdown",
"id": "e3f14bf0",
"metadata": {},
"source": [
"The two genres that are mostly prominent are:\n",
"- Drama\n",
"- Comedy"
]
},
{
"cell_type": "markdown",
"id": "d0e98aca",
"metadata": {},
"source": [
"### Distribution of users rating"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "ebe4b1ee",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"D:\\program_files\\anaconda3\\lib\\site-packages\\seaborn\\
distributions.py:2619: FutureWarning: `distplot` is a deprecated function and will
be removed in a future version. Please adapt your code to use either `displot` (a
figure-level function with similar flexibility) or `histplot` (an axes-level
function for histograms).\n",
" warnings.warn(msg, FutureWarning)\n"
]
},
{
"data": {
"image/png":
"iVBORw0KGgoAAAANSUhEUgAAAYIAAAEGCAYAAABo25JHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIH
ZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/
YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAu40lEQVR4nO3deXiU9bn/8fedfU/
IHpJAWMK+KAQQ3MAq4tJ6TqtWrbXa9lhP6+nm6WJ/p9vp6VnaU6/
T1qp1q0uLVmtrXXAXFWTfIYRAyAIhIQuBbJCEZO7fH5lgDJNkksyTSZj7dV25SGaemeeeAPOZ7/
J8v6KqGGOMCVxB/
i7AGGOMf1kQGGNMgLMgMMaYAGdBYIwxAc6CwBhjAlyIvwsYqOTkZM3JyfF3GcYYM6ps3bq1VlVTPN036oIg
JyeHLVu2+LsMY4wZVUSkrLf7rGvIGGMCnAWBMcYEOMeCQEQiRGSTiOwUkXwR+amHY0REfiMiRSKyS0TmOVW
PMcYYz5wcI2gFLlPVJhEJBdaKyGuquqHbMVcBue6vRcCD7j+NMcYME8daBNqpyf1jqPur58JG1wFPuY/
dACSISIZTNRljjDmbo2MEIhIsIjuAauAtVd3Y45BM4HC3n8vdtxljjBkmjgaBqnao6nlAFrBQRGb1OEQ8Pa
znDSJyp4hsEZEtNTU1DlRqjDGBa1hmDanqCeA9YEWPu8qB7G4/ZwEVHh7/
sKrmqWpeSorH6yGMMcYMkpOzhlJEJMH9fSRwObCvx2EvAbe5Zw9dANSraqVTNRljjDmbk7OGMoAnRSSYzsB
5TlVfEZG7AFT1IWAVcDVQBJwE7nCwHmOMH6zceOis225ZNM4PlZjeOBYEqroLON/
D7Q91+16BrzlVgzHGmP7ZlcXGGBPgLAiMMSbAWRAYY0yAsyAwxpgAZ0FgjDEBzoLAGGMCnAWBMcYEOAsCY4
wJcBYExhgT4CwIjDEmwFkQGGNMgLMgMMaYAGdBYIwxAc6CwBhjApwFgTHGBDgLAmOMCXAWBMYYE+AsCIwxJ
sBZEBhjTICzIDDGmABnQWCMMQHOgsAYYwKcBYExxgQ4CwJjjAlwFgTGGBPgLAiMMSbAORYEIpItIqtFpEBE
8kXkGx6OWSoi9SKyw/31I6fqMcYY41mIg8/
dDtyjqttEJBbYKiJvqereHsetUdVrHazDGGNMHxxrEahqpapuc3/
fCBQAmU6dzxhjzOAMyxiBiOQA5wMbPdy9WER2ishrIjJzOOoxxhjzESe7hgAQkRjgBeCbqtrQ4+5twHhVbR
KRq4EXgVwPz3EncCfAuHHjnC3YGGMCjKMtAhEJpTME/qSqf+15v6o2qGqT+/
tVQKiIJHs47mFVzVPVvJSUFCdLNsaYgOPkrCEBHgMKVPW+Xo5Jdx+HiCx013PMqZqMMcaczcmuoQuBzwO7R
WSH+7YfAOMAVPUh4Hrgn0WkHTgF3KSq6mBNxhhjenAsCFR1LSD9HHM/
cL9TNRhjjOmfXVlsjDEBzoLAGGMCnAWBMcYEOAsCY4wJcBYExhgT4CwIjDEmwFkQGGNMgLMgMMaYAGdBYIw
xAc6CwBhjApwFgTHGBDgLAmOMCXAWBMYYE+AsCIwxJsBZEBhjTIBzfM9iY8zZVm485PH2WxbZntxm+FmLwB
hjApwFgTHGBDgLAmOMCXAWBMYYE+AsCIwxJsBZEBhjTICzIDDGmABnQWCMMQHOgsAYYwKcBYExxgQ4x4JAR
LJFZLWIFIhIvoh8w8MxIiK/
EZEiEdklIvOcqscYY4xnTq411A7co6rbRCQW2Coib6nq3m7HXAXkur8WAQ+6/
zTGGDNMHGsRqGqlqm5zf98IFACZPQ67DnhKO20AEkQkw6majDHGnG1YxghEJAc4H9jY465M4HC3n8s5OyyM
McY4yPEgEJEY4AXgm6ra0PNuDw9RD89xp4hsEZEtNTU1TpRpjDEBy9EgEJFQOkPgT6r6Vw+HlAPZ3X7OAip
6HqSqD6tqnqrmpaSkOFOsMcYEKCdnDQnwGFCgqvf1cthLwG3u2UMXAPWqWulUTcYYY87m5KyhC4HPA7tFZI
f7th8A4wBU9SFgFXA1UAScBO5wsB5jjDEeOBYEqroWz2MA3Y9R4GtO1WCMMaZ/
dmWxMcYEOAsCY4wJcBYExhgT4CwIjDEmwFkQGGNMgLMgMMaYAGdBYIwxAc6CwBhjApwFgTHGBDgLAmOMCXB
eBYGIvCAi14iIBYcxxpxjvH1jfxC4BTggIv8tItMcrMkYY8ww8ioIVPVtVf0cMA8oBd4SkXUicod7zwFjjD
GjlNddPSKSBNwOfBnYDvyazmB4y5HKjDHGDAuvlqEWkb8C04CngU922zzmzyKyxanijDHGOM/b/
QgeVdVV3W8QkXBVbVXVPAfqMsYYM0y87Rr6Dw+3rfdlIcYYY/
yjzxaBiKQDmUCkiJzPRzuOxQFRDtdmjDFmGPTXNXQlnQPEWUD3Degb6dx/
2BhjzCjXZxCo6pPAkyLyGVV9YZhqMsYYM4z66xq6VVX/
COSIyLd73q+q93l4mDHGmFGkv66haPefMU4XYowxxj/66xr6vfvPnw5POcYYY4abt4vO/
UJE4kQkVETeEZFaEbnV6eKMMcY4z9vrCJaragNwLVAOTAG+41hVxhhjho23QdC1sNzVwDOqWudQPcYYY4aZ
t0tMvCwi+4BTwFdFJAVoca4sY4wxw8XbZai/DywG8lT1NNAMXNfXY0TkcRGpFpE9vdy/VETqRWSH+
+tHAy3eGGPM0HnbIgCYTuf1BN0f81Qfxz8B3N/
PMWtU9doB1GCMMcbHvF2G+mlgErAD6HDfrPTxJq+qH4hIzhDrM8YY4zBvWwR5wAxVVR+ff7GI7AQqgH9V1X
xPB4nIncCdAOPGjfNxCcYYE9i8nTW0B0j38bm3AeNVdS7wW+DF3g5U1YdVNU9V81JSUnxchjHGBDZvWwTJw
F4R2QS0dt2oqp8a7Ind1yV0fb9KRB4QkWRVrR3scxpjjBk4b4PgJ74+sXuvgypVVRFZSGfr5Jivz2OMOdvK
jYc83n7LIut6HQpPv9fR8Dv1KghU9X0RGQ/
kqurbIhIFBPf1GBF5BlgKJItIOfBj3BemqepDwPXAP4tIO53XJ9zkwBiEMcaYfng7a+if6BysTaRz9lAm8B
Dwid4eo6o39/Wcqno/
ndNLjTHG+JG3g8VfAy4EGgBU9QCQ6lRRxhhjho+3QdCqqm1dP7gvKrNuHGOMOQd4GwTvi8gP6NzE/
grgeeBl58oyxhgzXLwNgu8DNcBu4CvAKuDfnCrKGGPM8PF21pBLRF4EXlTVGmdLMsYYM5z6bBFIp5+ISC2w
DygUkRpbKdQYY84d/
XUNfZPO2UILVDVJVROBRcCFIvItp4szxhjjvP6C4DbgZlUt6bpBVYuBW933GWOMGeX6C4JQT2v/
uMcJQj0cb4wxZpTpLwjaBnmfMcaYUaK/
WUNzRaTBw+0CRDhQjzHGmGHWZxCoap8LyxljjBn9vL2gzBhjzDnKgsAYYwKcBYExxgQ4CwJjjAlwFgTGGBP
gLAiMMSbAWRAYY0yAsyAwxpgAZ0FgjDEBzoLAGGMCnAWBMcYEOAsCY4wJcBYExhgT4CwIjDEmwDkWBCLyuI
hUi8ieXu4XEfmNiBSJyC4RmedULcaYkeNw3UmON9u+ViOJky2CJ4AVfdx/FZDr/
roTeNDBWowxI8ChY8089P5BPv/4RlpOd/i7HOPmWBCo6gdAXR+HXAc8pZ02AAkikuFUPcYY/
zrd4eKFbUeIDAtmz5EGfvJSvr9LMm7+HCPIBA53+7ncfdtZROROEdkiIltqamqGpThjjG9tLD5GTVMrn83L
5p8unsCzmw9zuO6kv8sy+DcIxMNt6ulAVX1YVfNUNS8lJcXhsowxTthf3UR6XAS5abHckJcNwPriY36uyoB
/
g6AcyO72cxZQ4adajDEO6nAph46dJCc5GoDc1BiSY8JYf9CCYCTwZxC8BNzmnj10AVCvqpV+rMcY45AjJ07
R1uFigjsIRITFk5JZd7AWVY8dAWYYhTj1xCLyDLAUSBaRcuDHQCiAqj4ErAKuBoqAk8AdTtVijPGvktpmgD
NBALBkUhIv76yguLaZSSkxjp175cZDHm+/ZdE4x8452jgWBKp6cz/3K/
A1p85vjBk5SmqbSIkJJyb8o7ecJZOSAFh38JijQWD6Z1cWG2Mc5VKl7NjJj7UGAMYlRpEWF862suN+qsx0s
SAwxjiqrrmN1nYX2YmRH7tdRJieEUfh0UY/
VWa6WBAYYxxV3dACQGpsxFn3TU2LpaimifYO13CXZbqxIDDGOKqqsRWA1Ljws+6bkhZLW7uLMruwzK8sCIw
xjqpqaGFMVCjhIcFn3Tc1PRaA/dY95FeOzRoyZqBsmt+5qbqh1WO3EMDk1BhEYN/
RRq6abUuN+Yu1CIwxjmnvcFHT1Eqah24hgIjQYHKSotlfZS0Cf7IgMMY4pvTYSTpcSmqc5xYBwJS0GAotCP
zKgsAY45gD7jf4tD6CYGpaLKW1zbY/
gR9ZEBjjZ6faOjjW1OrvMhxRWNWIACkxnruGACanxeLSj5ahMMPPgsAYP+pwKX9YV8J9b+3n5Z0V59yn4uK
aZhKiQgkL6f2tZkJS5xXHpRYEfmNBYIwfrTlQQ/nxU0xJi2V98TF+/
36xv0vyqdJjzST30RoAyEmOAqDkmAWBv1gQGOMn9adO805BNbMz4/
nCkhwmp8bw3JbDuFznxrLMqkpJTTNJMWF9HhcbEUpyTDglNRYE/mJBYIyf7K1soEOVy6enATB//
BiOnDjFunNks5ZjzW00trb32yIAmJgcTam1CPzGgsAYP9lX2UByTBgpsZ1vlDMy4oiPDOW5LYf7eeTo0NXn
nxTdfxDkJEdRUmvLTPiLBYExftB6uoPi2mampceduS00OIhPzs3gzb1HaW0f/
YPGxe4gSO6nawggJzma2qZWGltOO12W8cCCwBg/
OFDdRIdLmZYR+7HbL5qcQstpF3uO1PupMt8prW0mJEhIiOo/
CCYmd80cslaBP1gQGOMHhUcbiQwNZnzixzdrWZAzBoCNJXX+KMunSmqbGZcYRXCQ9Hts16b2NnPIPywIjPG
D0mPNTEiOPutNMikmnMmpMWw+R4Kg565kvekKRJs55B8WBMYMs+PNbRxrbiN7TKTH+xdOSGRL6XE6RvE0Up
erc3vKHC+DIDIsmLHxETZzyE8sCIwZZjvKTwCQnRjl8f5FExJpbG2noLJhGKvyrarGFk6d7vA6CKCze8iWm
fAP24/
AmG487Yng6/0Qth86gQCZvbQIFuQkArC5tI5ZmfE+Pfdw6XpDn5gcTdkx7waAJyRH88quSifLMr2wFoExw2
z7oeOkxUV43LELYGxCJGlx4ewqH70zh7pm/
wykRTAhOZr6U6c53tzmVFmmFxYExgwjl0vZefhEr91CXWZnxrPL3YU0GpXUNhEeEkRGH8tP95STZDOH/
MWCwJhhVFzbTENLe68DxV1mZyZQXNtMU2v7MFXmWyW1J8lJiibIi6mjXSak2Mwhf7EgMGYYdV0oltVfiyAr
DlXYWzE6B4xLjzWfWVXUW9ljoggSbOaQHzgaBCKyQkQKRaRIRL7v4f6lIlIvIjvcXz9ysh5j/
G3PkXrCQ4L63KgFODNIPBq7hzpcyqFjJ5mQHDOgx4WFBJE1JurM0hRm+Dg2a0hEgoHfAVcA5cBmEXlJVff2
OHSNql7rVB3GjCR7KuqZnhHX79W2qbERpMdFjMqlJipOnKKtw8WEAbYIoHPA+FzboKax5TSxEaH+LqNPTrY
IFgJFqlqsqm3As8B1Dp7PmBHN5VLyjzQwKzOu/4OB2Vnx7HIoCKobWnhx+xH+8GEJhUd92/3U9Ym+a/
B3ILqCQHX0XkzX5ciJUzy6tpg5P32TR9cUj+jX5GQQZALd19Mtd9/
W02IR2Skir4nITE9PJCJ3isgWEdlSU1PjRK3GOO7w8ZM0trYza6x31wbMzoynpLbZ5ytynmxr56kNZew4fI
KjDS2s3HSII8dP+ez5uz7Rdw3+DkROUhTNbR3UNI7uPZxPtrbz2NpiqhpaWTQhkf94tYDfvFPk77J65WQQe
Gr79ozEbcB4VZ0L/
BZ40dMTqerDqpqnqnkpKSm+rdKYYbLnSOcnb28vEpudGY8q5Pt4wPgXrxdS19zGbUvGc/
eyyUSHhfDHjWWc7nD55PlLapuJDgvudxzEk4kpneMKB0f5zKHVhdW0nnbxpYsmsPLLF3DN7AweeK9oxAack
0FQDmR3+zkLqOh+gKo2qGqT+/
tVQKiIJDtYkzF+s6eintBgITfNu0HUrsDw5ThBSW0zT64v5YKJiUxMjiE2IpRPz8ui/
tRpn13AdrCmiYkpMYh4P3W0y+TUzt9NUU2TT2rxh7rmNjYU1zF//BjS4yIIChLuWT6F0x0uHv+wxN/
leeRkEGwGckVkgoiEATcBL3U/QETSxf2vRUQWuus5N/bpM6aHPUfqmZIW2+sVxT2lxIaTER/
h0yuMn9tymCARlk5NPXPbpJRoUmPDWX+w1if92EXVTV6HXU8Z8RFEhwVzsHr0BsHGkmMoH21BCp0tnatnZ/
D0+jLqT428zXccCwJVbQfuBt4ACoDnVDVfRO4Skbvch10P7BGRncBvgJt0JI+oGDNIqkp+RYPX4wNdZmfG+
6xF0N7h4i9by1k2NZW4brNYRITFk5KoqG9ha9nxIZ2jseU0lfUtZz7ZD5SIMDk1hgPVjUOqw19c2nnl+JS0
WOIiPz5T6M5LJtLU2s6q3SNvPSVHryNQ1VWqOkVVJ6nqz923PaSqD7m/
v19VZ6rqXFW9QFXXOVmPMf5SWd9CXXOb1zOGuszOjHdfjTz0T5GrC2uoaWzlswuyz7rv/
OwxhIcE8efNQ9svucj9ST43NbafI3s3KTXmzPOMNiXuK8fPy044677ZmfHkJEXx6ghcWM+uLDZmGHR9qp85
wNVEZ2d1Hp9/ZOgDxn/
bXk5yTDjLpp494SIsJIjpGXG8VVBF+xAGjQ+cCYLBtQigc5ygqqHVJ+E33HYcPkFYSNDH9qLuIiJcMyeDdQ
drOdY0sgaNLQiMGQZ7KhoIEpju4Q2iL7PdwbH7yIkhnb+1vYP3C2tYPjONkGDP/
+1njo3jxMnTQ9oms6i6ibCQoH4X1evL5K6ZQ6OsVXC6w0V+RT0zM+IIC/H8O752zlhcCq/
nHx3m6vpmQWDMMMg/Us/k1Bgiw7wbKO6SFBNOZkIku4fYIthQXEdzWweXT0/t9Zjc1FgiQ4N5bc/
guy4OVDUyKSXGq32Ke60jrbNbabR1D20uraPltIsZY3sP+2npsUxMiR5x4wQWBMYMgz0V9QMeKO4yKzOO3U
Ncc+idgioiQ4NZMqn32dlhIUEsnZrCG/
lVuAa5TeaB6qZBDxR3yR4TSVhw0KgLgncLqgkOkjMtGk9EhOUz0tlYXOfzCwWHwoLAGIdVN7ZQ1dA64PGBL
nOyEig9dnLQ0w5Vlbf3VnFRbjIRoX23SFbMSqemsfXMdpoDcbKtnfLjp4Y0PgAQEhzExJToM+MNo8W7+6qZ
mBxNeD+/48umpdLuUtYcqB2myvpnQWCMw7oGimf10WXQl64Ly/
IHOY20oLKRivoWrug2r703S6ekEhwkvFNQNeDz7K/qfOOeMshrCLqbnhFHfoVvps26VFl/
sJZXd1Ww5kDNkAbDe1Nc00RxbTPT0vufLTVvXALxkaG8U1Dt8zoGy4LAGIdtKztBcJCcmQE0UB8NGA/
ujfHtgipEYNm03scHusRHhbIwJ5G39w78Taqr+2p2VsKAH9vTrMx4qhpaqW5sGdLznGxrZ+XGQ7y8q5LNZc
d5bc9RnlhfSuvpjiHX2N27+zp/
X1O9mAwQEtzZBfdeYfWgu+B8zYJgFFi58dBZX2b02HboODMy4ogKG9yq74nRYWQmRA56JdJ3Cqo4LzuBlFj
v1v75xPRUCqsaOVzn3abzXXaV15MUHcbYeO+3p+xNV+tpqNNmf/
JSPgWVDVw7J4MfXzuD6+dnUVrbzJ+3HPbpaqDv7qtmSloMidFhXh1/2bRUjjW3sXOE7DdhQWBGlA6X8n5hN
T97ZS//8/o+XtxxhNZ23356G07tHS52Hj7BvHEJQ3qeOVmDu8K4qqGFneX1H1vuoD9XzOg89u0Bdg/
tPlLP7Kz4Qa0x1NNMH6yztO5gLc9tKefi3BSWTEpGRJg3bgwrZqaz72gjb/
hoCmdDy2k2ldRx2TTvf8eXTkkhSD5qSfibBYEZMVyqPL2hlDf2VjEuMYrsxCg2ldTx+cc2jagZFgNRWNVIc
1sH88aPGdLzzM6Kp+zYSeqa2wb0uK43moEEwfikaCanxgwoCE61dbC/
qpE5gxwQ7ykmPISJydGD7g5r73Dxb3/bw/
ikKD7RY8rs4knJZMRH8JOX9tLsgz2h1+yvpd2lZ52nLwlRYeSNTxwx4wQWBGbEWL2vmv1VTVw7J4PbFo/
nloXj+GxeNltK6/
j3l3tubDc6bDt0AoB544YWBIsmJAKwsXhgazK+tbeKrDGRAx7AvXx6GhuL67y+undvZQMu9c34QJeZmfGDX
oL7pZ0VFNc28/+unk5ojwvogoOET84Zy9GGFp7ZNPRu1nf2VZEQFcr5HpaV6MuyaansrWygst53e0EMlgWB
GRG2HTrOu/uqOT87gcUTk850L8zNTuCuSyfx/
NbyQc1k8bftZcdJiQ0na0zkkJ5nTlYCUWHBrB9AEDS1trP2QC1XzkwfcHfN5dM7pzi+X+jdRlBdA8VzBjkg
7snszDiOnDg14FaQy6U88N5BpqXH9toSykmO5oKJiTyypnhIXY8dLuW9whqWTknp9Yrt3nS1IFbv8/9mWxY
Exu9Ulf98tYCY8BA+NXfsWW9a37g8l2npsfzwxT20+Hi2h5NUlY0ldeSNHzPkfvPQ4CAW5CSy7qD3QbB6Xz
VtHS6unJk+4POdP24MidFhXofvzvJ6UmLDSYsb+kBxl9mZCQBsPzSwFVHf3FtFUXUT/
7x0EkF9XOH81aWTqWpo5W/bjgy6xk0lddQ1t7F8EL/j3NQYssZEjogPOBYExu/
e3VfNlrLjXDY91ePFOOEhwfzokzOoqG/hjxvKHKnhZFs7j60t4fkth/
n7jiMcOTH05vrBmiaOnDjFxbm+2VVv8aQkiqqbvJ5S+Ub+UZJjwpg/
iPGJ4CBh2dRUVhf2P+9eVfmwqPZM95WvnD8ugfCQID4s8j78VJUH3itifFIU18zO6PPYi3OTmZUZx+8/
KKZjkNM4X99TSURo53TQgRIRLp+expqiWpp8MFYxFBYExq86XMovXi8kJymKvPG9v5EsmZTMxbnJ3L+6yOe
rUhZUNvDJ367lZ6/s5WBNE9sOHed3q4t4fU/
lkKYYvufuVrlkim823VsyKQmA9V60ClpOd7B6XzVXzEgb9Lo/V85Mo/
7UadYU9X0F7L6jjVQ3tnLpFN9uIxsRGszCCYl82M/
5u1tbVMuu8nruunRSv101IsJXl06mpLZ5UOsruVzK6/
lHuXRKyqCnBl8zJ4O2dpffWwUWBKZfTl7H8PcdRyisauSe5VP7fcP63oppnDh5mkc+KPbZ+Q/
WNHHTwxtobGln5ZcX8f2rpvP9FdNZkJPIBwdqeXFHxaDD4P39NUxOjSFrzOBX4uxu5th44iJCeH9//33K7x
VW09zWwYpZfX8q7svSqakkRIXywtbyPo/
rqucSHwcBwIWTkymsaqS6wbtW0P3vFpEeF8Gn52V6dfyVM9OZmBzNA6sPDvjvefvhE1Q1tHLVEH7H88eNIS
0u3O97FFgQGL9pbe/gvrf2Myszrt9mPHRebXrtnAweXVMy5CtOoXNv2dv/
sImQIOEvdy1hyeTOT+6RYcH8w3ljuXRKCptL6/
jDh6UDfu5TbR1sLKnz6afk4CBh+cx03sqv6nes5M+bD5MeF8FFkwffGgkLCeJTc8fy5t6qPtc5er+whmnps
T4dH+jSVf+HB/t
vFWwprWNjSR3/dMlEr7cDDQ4S7rp0EnsrG7wK2O5e3llBWHAQlw1g2mhPQUHCVbMyeG9/
jV+7hywIjN+s3HiI8uOn+O6V0/oc1OvunuVTOd3h4v53i4Z0blXlu3/ZRVV9K4/dvoBxSR//
1C4iXDEjjekZcfx8VQGbBrhG/7qDtbS1u3z+KflTc8fS2NrOe4W9zz8/Wt/C+/
truH5+1pCWgwb49Lws2tpdvS6b3NTazpayOi4dRB+5N2ZkxDEmKtSrBdoeeO8gidFh3Lzw7B3Y+vIP52eSE
R/BA+8d9PoxLac7+Nv2I1w5K/
1j234ORlf30Jt+3KPAgmCQbNmHoWlqbef+d4tYMimJi3O9/9Q6ITmazy7IZuXGQ5Qdax70+VduOsTbBVV87
6ppHrcVBAgS4Yb5WWSPieSbz26n/qT3YxN/
2VpOYnQYiycmDbpGT5ZMSiI5JoyXdlb0ce7DuBRuzBvYG6Inc7PimZIWwxMflnpcF+eVnRWc7lA+MYCragc
iKEhYNi2Vt/KrONnW+yfm/Ip63t1XzRcvzBlwf31YSBBfvngim0rq2FrmXeC/
tqeS+lOnBxw6nswfN4YJydH8yY/vIRYExi8eXVPMseY2vrti2oCnVn79E7mEBAv3vbV/UOcuqm7iZ6/
s5eLcZO5YktPnsRGhwfz6pvOpbmzl3r/
t8qofubaplbf2VvHp8zN73alqsEKCg7h6dgbvFFRz4uTZ8+tPtrXz5PoyLpycdFYrZzBEhK8tm0xhVSOreg
youlzKI2uKmZERx4KcoV0w15dbFo6jsbWdl3sJP1Xlf98oJDY8hM8vzhnUOW5emM2YqFB+8453Lc1nNh4mJ
ynKJ0EfFCR8btE4tpYdp6By6FuSDqoGv5zVDEhbu4t9RxvYUlrHjsMnBr0u/
UhRWX+Khz8o5qpZ6b1+Gu9LWlwEX7xwAn/
fUTHgtWja2l1849ntRIYG86sb5nrVJTU3O4F7lk9l1e6jPL+l74FTgL9tO0K7Sz1uEu8Ln1s0nrYOF79bff
ab1mNrSqhpbOXbV0zx2fmunTOW3NQY/u/tAx+bZvne/moO1jRz5yUTfbK+UG/mjx/
DlLSYXj8xv11QzerCGr5xeS7xkYPrpokKC+GrSyfz/v4aVvfR7QawtayOTaV13LJonM9e9/
XzswgPCXJsenR/LAhGsOqGFv7txd38x6t7eWp9GX/
dfoTnthzmf17fx80Pb2BL6eD3lvWnf395Ly5VfnD19EE/x1cunURSdBg/+NvuAa0v/5+rCsivaOB/
PjOH1AEMbn7lkoksmZTEj1/
K73PnrNb2Dv64sYx54xLObLnoa1PTY7l+XhZPriv72AqhR+tb+P0HxVw5M435fUzFHajgIOGe5VMoqm7ih3
/fg6pS29TKf67aR0Z8BNfMGfysGW+ICJ9bNJ5d5fVs6HFldUPLaf79lXympMXwhX5ad/
35wpIcJiZH87OX99LW7vnflKryn6v2kRobzq0XjB/
S+bpLiArjuvPG8pet5X5ZcsKCYARSVZ7fcpjLfvU+z246zHnZCXzxwgl858qp3L1sMstnpHGguonrH1rPvX
/dNaoWZHtrbxWv7TnKv1yWO6QNzuMjQ/
npdTPZVV7Po2tLvHrMK7sqeGJdKXdcmDPgK0GDgoT7bjyPyLBgvvzk5l6XPXh0TQllx07y9U/
kDuj5B+qe5VMJCoK7n9lOdUMLNY2tfO7RDbhU+e6KaT4/34pZGXx16SRWbjzEzY9s4IaH1lN+/CS/
umHuWWv5OOEz87PITozkW3/eceZ339bu4q6nt1J5ooWf/
+PsIdcRFhLEjz45g+LaZv7rtQKPx6zafZStZcf51hVTBn3tQG/+5bJcVOFXbw6uy3MofPtKzJAdb27j3r/
u5vX8oyyckMgvPjPnY8sKjImCsQmR/N9N5/Hrdw7wyAfFfLC/lv/5zBwuGsCga1/aO1xsKq1j/
cFjlB07SeHRRmLCQ0iLCyc3bfDTBA8dO8k9z+1gRkYc/3TxxCHXec3sDF6eWcGv3ixkTlZ8n/
vxbiw+xj3P7WTeuATuvWpwLZH0+AgeuS2PWx7ZwB1PbObxL+SRFPPRGv/
FNU389t0DXDUrnaVTBz+l0Nta/u+z5/OtP+/g0l++R1uHi7DgIJ64YwGT+tgzdyi+c+VUQoKEtwqqCRJ4/
PYFff7OfSkmPIQHbpnPZx5cxy2PbOBT541l1e5K9hxp4L4b57IgxzctoKVTU7njwhz+8GEp09PjuLFb997e
iga+98IuZmTEccP8LJ+cr7vsxCi+sGQ8j64t4fYlOWd2phsOFgReqm5sYVvZcfZXNXGsqZUD1U1EhYWQER/
B+KQon3w6eH9/Dd95fifHT7Zx71XT+PLFEwkOEo/ry0SFhXDvVdO5cmY6//
r8Tm59bCO3XjCOe6+aTnT44GqpbWrlz5sP86cNZVTUtxAcJGQmRHK6w0VF/
Sm2HjoOe46SNSaSiNAgrpmT4fV87brmNu58egsAD9063yeDqCLCL66fy/
UPruMrT29l5Zcv8LgL2NoDtdz1x61kJ0bxyG15Qzr3/PFj+M3N5/Mvz2znU/d/yA+vncGSyUlsLTvOPc/
tJCI0mB9eO2MoL8trK2alk5O8hCfXlZEUHcaKWemOvnmICN9ePpVvL5/q2Dn6Mjsrnl/
fdB7/+2Yhv3i9kAnJ0fz6pvO47jzvLh7z1g+unk7h0Ua++8Iudh+p5x/
OH8v+qiZ+9eZ+YsJDeOz2vAEvMOetu5fl8uKOCu5euY2/333RoMc8BsqCoA8VJ06xanclr+3pbA52iYsIob
XdRau7HzFIOlczPO1e4Ct9gDs01Ta18svXC/
nzlsNMSYvhD3csYOZY7/5Dzxs3hlVfv5hfvVnIo2tLeK+whl9eP5fFk7yfzbC7vJ4/
fFjCK7sqaetwcdHkZH547Qwuyk0mNiL0zNTYEyfb2FvZwMbiOr793E5+/moBNy7I5paF4/
rs5imtbeZLT26m/PgpHr4tzyezWbrER4byxBcXcsOD6/
jMg+v49vIpfDYvmzHRYZQfP8kTH5by2IclTE6J4ekvLfrYJ/jBunJmOn+5azH//
Mdt3PXHrWdun5AczeO3L2BswtBWGh2Iaelx/NenZw/
b+fztqtkZrJiVTmV9C+lxEV5ffzIQocFBPH77An75RiGPrS3hafcA7pyseP73hrlkxDv39xsfFcqDn5vHzY
9s4O6V23jo1vmD/mA3EI6eQURWAL8GgoFHVfW/e9wv7vuvBk4Ct6vqNidr6s/hupO8vucoq/
ZUst29lvz0jDjuuWIKF+UmMz0jjojQYFZuPERbu4vK+lMUHm0kv7KBH7+Uz49fymf+
+DFcPTuDy6enMi4xyuPMAlXlYE0Tz246zLObD9NyuoOvXDKRb10xhQgPC6/1JSI0mP93zQyunJnOd/
6yi5sf2cCyqSnctjiHJZOTPH5qr2ls5Z2CKp7fWs7WsuNEhwVz88JsPr84h8mpnrsWEqLCWDIpmcUTk8hJj
uaJdaX8/
v2DPPT+QZZNTWXFzHTycsYwNiGSDpdyoLqJV3ZW8NT6MsJDg3jqiwtZ5ON59QCZCZG88vWL+c7zO/nv1/
bxyzcKiQgJormtAxG4cX42P/7UDJ/26c7JSuD97yxlTVEt+UfqmZwaw0W5KcQMw3/
aQCcijodtV8vu9iU5FFU3ER0ewoKcoa8i6428nER+/o+z+f4Lu/
j0A+v41Y1zHe8mcuxfrYgEA78DrgDKgc0i8pKqdt9h5Cog1/21CHjQ/acjVJXWdhen2jpobmunqqGVo/
UtlB8/yc7yE2w/
dILK+s6lC2aOjeM7V07l6tkZTEiO9vh8YSFBjE+KZnxSNMtnprNwQiKv76nk1d1H+dkre/
nZK3tJiwtnanocmQmRxEaE0Hq6g6MNLeytbOBw3SmCg4RrZmfw9U/
k9voG7K28nERWff1iHllTzJPrSrnjic1EhQUzNT2WzIRIQoKEE6dOU1LbTNmxztkmOUlR/
PDaGdyQl+X1FZIiwoWTk7lwcjIVJ07xzKZDPLflsMdt94Kk88rN762Y5sgSBF0So8N49At55Fc08Gb+UZpa
O0iJDeeTczN8ttZPTyHBQSybmsoyh8cDjP9ku3fKG2435mWTER/BvzyznWt/
u5Ylk5K4bFoqy6alOjIG5OTHl4VAkaoWA4jIs8B1QPcguA54Sjuv0tkgIgkikqGqPl+B6dVdlXxtZe+Njaw
xkeTlJDJvXAKXTUtlfJLnN/+
+TE6N4e7Lcrn7slxKaptZe6CGrWXHOVDdxN6Keppa2wkPCSYpJoxZY+O585JJLJ+R5tM3yMiwYL7+iVzuvG
Qi6w8e473CagqrGtlb0UBbh4uEqFCmp8dx04JxXDIlmRkZcUP6lDM2IZJ7lk/
l21dMobCqkT1HGjhaf4rQ4CDGJkRy0eRkxni5ofdQiQizMuOHdZDNGKdcnJvCB99dxtPry3hhWzn/
8WoBNU2tg57s0BcZyjK7fT6xyPXAClX9svvnzwOLVPXubse8Avy3qq51//wO8D1V3dLjue4E7nT/
OBUo7HZ3MuD9OrWjXyC9Xnut565Aer0j5bWOV1WPi0I52SLw9DGzZ+p4cwyq+jDwsMeTiGxR1byBlzc6BdL
rtdd67gqk1zsaXquTV4KUA92vsc8Cei4W4s0xxhhjHORkEGwGckVkgoiEATcBL/
U45iXgNul0AVDvxPiAMcaY3jnWNaSq7SJyN/AGndNHH1fVfBG5y33/
Q8AqOqeOFtE5ffSOQZzKY5fROSyQXq+91nNXIL3eEf9aHRssNsYYMzrYonPGGBPgLAiMMSbAjeogEJEVIlI
oIkUi8n1/1+MkEXlcRKpFZI+/a3GaiGSLyGoRKRCRfBH5hr9rcoqIRIjIJhHZ6X6tP/
V3TU4TkWAR2e6+juicJiKlIrJbRHaIyJb+H+Efo3aMwL2ExX66LWEB3NxjCYtzhohcAjTReSX2LH/
X4yQRyQAyVHWbiMQCW4F/OBf/bt3rbUWrapOIhAJrgW+o6gY/l+YYEfk2kAfEqeq1/
q7HSSJSCuSp6ki4oKxXo7lFcGYJC1VtA7qWsDgnqeoHwOjckmyAVLWya/
FBVW0ECgDfrjU8Qminri3PQt1fo/
PTmRdEJAu4BnjU37WYj4zmIMgEDnf7uZxz9M0ikIlIDnA+sNHPpTjG3VWyA6gG3lLVc/a1Av8HfBfwfn/
R0U2BN0Vkq3upnBFpNAeBV8tTmNFLRGKAF4BvqmqDv+txiqp2qOp5dF5Zv1BEzsmuPxG5FqhW1a39HnzuuF
BV59G50vLX3F28I85oDgJbnuIc5u4vfwH4k6r+1d/1DAdVPQG8B6zwbyWOuRD4lLvf/
FngMhH5o39LcpaqVrj/rAb+RmeX9ogzmoPAmyUszCjkHkB9DChQ1fv8XY+TRCRFRBLc30cClwP7/
FqUQ1T1XlXNUtUcOv+/vquqt/
q5LMeISLR7sgMiEg0sB0bkrL9RGwSq2g50LWFRADynqvn+rco5IvIMsB6YKiLlIvIlf9fkoAuBz9P5iXGH+
+tqfxflkAxgtYjsovPDzVuqes5PqwwQacBaEdkJbAJeVdXX/
VyTR6N2+qgxxhjfGLUtAmOMMb5hQWCMMQHOgsAYYwKcBYExxgQ4CwJjjAlwFgTGDIGIfFNEorr9vKrrugBj
RgubPmpMP9wXuImqnrU+zmhZXdKYvliLwBgPRCTHvR/
CA8A24DER2dJ9zwAR+Towls4Lwla7bysVkeRuj3/E/
Zg33VcOIyILRGSXiKwXkV8Gwh4TZmSzIDCmd1Pp3P/
hfOAeVc0D5gCXisgcVf0NnetbLVPVZR4enwv8TlVnAieAz7hv/
wNwl6ouBjqcfhHG9MeCwJjelXXbIOZGEdkGbAdmAjO8eHyJqu5wf78VyHGPH8Sq6jr37St9WK8xgxLi7wKM
GcGaAURkAvCvwAJVPS4iTwARXjy+tdv3HUAknpdPN8avrEVgTP/
i6AyFehFJo3Nt+S6NQKy3T6Sqx4FGEbnAfdNNPqvSmEGyFoEx/
VDVnSKyHcgHioEPu939MPCaiFT2Mk7gyZeAR0Skmc79B+p9Wa8xA2XTR40ZZiIS07VPsYh8H8hQ1W/
4uSwTwKxFYMzwu0ZE7qXz/18ZcLt/
yzGBzloExhgT4Gyw2BhjApwFgTHGBDgLAmOMCXAWBMYYE+AsCIwxJsD9f8p/
DYu4kEmnAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"sns.distplot(ratings[\"rating\"]);"
]
},
{
"cell_type": "markdown",
"id": "352222c7",
"metadata": {},
"source": [
"### Inference"
]
},
{
"cell_type": "markdown",
"id": "94a7db7c",
"metadata": {},
"source": [
"Rating 4 has been given by most users"
]
},
{
"cell_type": "markdown",
"id": "0c424357",
"metadata": {},
"source": [
"### Distribution based on year"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "2589b254",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"First 5:\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>userId</th>\n",
" <th>movieId</th>\n",
" <th>rating</th>\n",
" <th>timestamp</th>\n",
" <th>year</th>\n",
" <th>month</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>66719</th>\n",
" <td>429</td>\n",
" <td>595</td>\n",
" <td>5.0</td>\n",
" <td>1996-03-30 00:06:55</td>\n",
" <td>1996</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>66716</th>\n",
" <td>429</td>\n",
" <td>588</td>\n",
" <td>5.0</td>\n",
" <td>1996-03-30 00:06:55</td>\n",
" <td>1996</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>66717</th>\n",
" <td>429</td>\n",
" <td>590</td>\n",
" <td>5.0</td>\n",
" <td>1996-03-30 00:06:55</td>\n",
" <td>1996</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>66718</th>\n",
" <td>429</td>\n",
" <td>592</td>\n",
" <td>5.0</td>\n",
" <td>1996-03-30 00:06:55</td>\n",
" <td>1996</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>66712</th>\n",
" <td>429</td>\n",
" <td>432</td>\n",
" <td>3.0</td>\n",
" <td>1996-03-30 00:06:55</td>\n",
" <td>1996</td>\n",
" <td>3</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" userId movieId rating timestamp year month\n",
"66719 429 595 5.0 1996-03-30 00:06:55 1996 3\n",
"66716 429 588 5.0 1996-03-30 00:06:55 1996 3\n",
"66717 429 590 5.0 1996-03-30 00:06:55 1996 3\n",
"66718 429 592 5.0 1996-03-30 00:06:55 1996 3\n",
"66712 429 432 3.0 1996-03-30 00:06:55 1996 3"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ratings_df=ratings.copy()\n",
"ratings_df['timestamp'] =
ratings_df['timestamp'].apply(datetime.fromtimestamp)\n",
"ratings_df['year'] = ratings_df['timestamp'].dt.year\n",
"ratings_df['month'] = ratings_df['timestamp'].dt.month\n",
"ratings_df = ratings_df.sort_values('timestamp')\n",
"print('First 5:')\n",
"display(ratings_df.head())"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "fd4d11d3",
"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># of Ratings</th>\n",
" </tr>\n",
" <tr>\n",
" <th>year</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1996</th>\n",
" <td>6040</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1997</th>\n",
" <td>1916</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1998</th>\n",
" <td>507</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1999</th>\n",
" <td>2439</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2000</th>\n",
" <td>10061</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" # of Ratings\n",
"year \n",
"1996 6040\n",
"1997 1916\n",
"1998 507\n",
"1999 2439\n",
"2000 10061"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png":
"iVBORw0KGgoAAAANSUhEUgAAAZIAAAEWCAYAAABMoxE0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIH
ZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/
YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAA3JUlEQVR4nO3deXhU5dn48e+djYQACUlYQ9g3kZ2AgEu1iq
C1FXdsXWtLXfpzaatF376tb9XWrba1tVqte2uValVcEQVFEYGwhNVA2MMSwpIQIAlZ7t8f5wwOYZJMMmuS+
3Ndc+XMc5Z55jDMPc8uqooxxhjTVDGRzoAxxpjmzQKJMcaYgFggMcYYExALJMYYYwJigcQYY0xALJAYY4wJ
iAUS0+KJSBcRmS8ipSLyhzC83g9E5KNQv44x0cICiYlaIrJYRAaISF8RWRbApaYDe4EOqvpzH6/
zgogcFZFDIrJfROaIyGA/
89hbRFRE4jxpqvovVT03gPwa06xYIDFRSUTigV5APjAGCCSQ9ALWav2jbx9W1XZAJrADeDaA12vWvINiBF4
7NlKvbZrOAomJVkP55ss/mwYCiYhMFJElIlLi/
p3opr8AXAvc5ZY4zqnvOqpaBswERnpd+zsislxEDorIdhG51+uU+e7fYvf6E0TkOhH5wut8FZEbRWSDiBwQ
kSdERNx9sSLyBxHZKyKbReSn3iUc91qb3Gq5zSLygzre/
70i8rqIvOYeu0xERnjt7y4ib4hIkXudW32c+08ROQhcV+vaY0Wk0DvAiMglIrLC3Y4RkRkislFE9onITBFJ
8zr2PyKy2/23mS8iJ3vte0FEnhSR90XkMHBWff8+Jkqpqj3sETUP4HqgGDgClLvbVUCpu93HxzlpwAHgaiA
OuNJ9nu7ufwG4v57XPLYfSAZeBnK99p8JDMP54TUcKASmuvt6AwrEeR1/
HfCF13MF3gVSgZ5AETDF3XcjsBboAXQEPvZcz83LQWCQe2w34OQ63sO9QCVwKRAP/
ALY7G7HAEuBXwMJQF9gEzC51rlT3WOTfFx/LXCe1/
M3gZ+727cDX7nvoQ3wd+DfXsf+EGjv7vsTsKLWvS8BTnVfOzHSn0F7NP4R8QzYwx6+HsDnOKWCnsAKQOo59
mpgca20hcB17rY/gcQTtGrcL+Dh9Rz/J+CP7ra/
geQ0r+czgRnu9lzgJ177zqkVSIqBS3x9udfK073AV17PY4BdwOnAKcC2WsffDTzvde78Bq7/
S+Bf7nYaTqDv5j5fB5ztdWw3NzDF+bhOqvv+Urzu/UuR/
rzZI7CHVW2ZqCEiaSJSLCIlwETgUyAPGAQcEJHb6zi1O7C1VtpWnPYOfz2qqqk4gaHMfU1Pvk4RkXlutVAJ
TikioxHXBtjttX0EaOdudwe2e+07tq2qh4Er3NfbJSLvNdAJwPvcGqDAvX4voLt7b4tFpBi4B+ji69w6/
BP4roi0Ay4HPlfVXe6+XsCbXtdeB1QDXdyquwfdaq+DwBb3HO/719BrmyhngcREDVXd736Z/
wT4h7v9IfBdVU1V1T/
VcepOnC8zbz1xGs0bm4dtwG3An0UkyU1+BZgFZKlqCvAUIJ5TGvsatezCqRLyyKqVn9mqOgnnV/
7XwDP1XOvYuSIS4153J84X9Wb3Hnoe7VX1fO+Xqi+TqroDp5R3EU4J8GWv3dtxqr28r5/
onvN94EKcklYKTqCGb+5fg69top8FEhONvHtpjcKp36/
P+8BAEfm+iMSJyBXAEJx2iUZT1Tk4X8DT3aT2wH5VLReRcThfjh5FONVhfZvyWjjVXLeJSKaIpOJUIQHHxr
98T0SSgQrgEM4v/
bqMEZGL3Ubx291zvgIWAwdF5JcikuSWEoaKyNhG5vUl4C6c9qI3vdKfAh4QkV5uvjuJyIXuvvZuPvYBbYHf
NfI1TTNggcREozHAMhFJB6pV9UB9B6vqPuAC4Oc4X1h3AReo6t4A8vAITk+vNsDNwG9FpBSnwXqm12sfAR4
AFrhVO+Mb+TrPAB8BK4HlOEGxCidgxLjvaSewH/
iWm5e6vI1TFebpeHCxqlaqajXwXZw2p804Y2r+gVNCaIw3caux3Go3jz/jlNg+cu/
RVzjtMuAEn604pcO17j7TwoiqlSqNiRYich7wlKrWrqpr6Lx7gf6qelVIMvbN62zE6RzwcShfxzQvViIxJo
Lcqqbz3Sq5TOA3HF9tFDVE5BKc9oy5kc6LiS4hCyQikuX2dFknImtE5DY3/
V4R2SEiK9zH+V7n3C0i+SKSJyKTvdLHiMgqd9/
jXoO52rgDsPJFZJGI9A7V+zEmRAT4P5zqqOU4PZ5+HdEc+SAinwJPAre4PcKMOSZkVVsi0g2nn/
kyEWmP02A6Fafr4CFVfbTW8UOAfwPjcLosfgwMVNVqEVmM05PmK5w65MdV9QMRuRmnv/
+NIjINuEhVrwjJGzLGGONTyEokqrpLVZe526U4v7Tq69d/
IfCqqlao6macOZbGuQGpg6ouVCfqvYQTkDznvOhuvw6c7SmtGGOMCY+wTM7mVjmNAhbhTIXwUxG5BsjBmWb
hAE6Q8e7RUeCmVbrbtdNx/24HUNUqd7BYOk6vFO/
Xn47blTM5OXnM4MF+TexqjDHGtXTp0r2q2snXvpAHEnck7BvA7ap6UESeBO7DabS7D/
gDzlw8vkoSWk86Dez7JkH1aeBpgOzsbM3JyWns2zDGmFZNRGrPHnFMSHttiTMV+Bs4c/
T8F0BVC1W12m2wewanTQSckob3qF7PqNwCjh/560k/
7hx3EFYKTn97Y4wxYRLKXluCs6bDOlV9zCu9m9dhFwGr3e1ZwDS3J1YfYADORHy7gFIRGe9e8xqcgVeec65
1ty8F5qoNjDHGmLAKZdXWqTija1d51i3AmSjuShEZiVMFtQVnXiVUdY2IzMQZ/
VqF083QMx3ETTizhCYBH7gPcALVyyKSj1MSmRbC92OMMcaHVjey3dpIjDGm8URkqapm+9pnI9uNMcYExAKJ
McaYgFggMcYYExALJMYYYwJigcQYY0xALJAYY4wJiAUSY4wxAbFAYowxJiAWSIwxxgTEAokxxpiAWCAxxhg
TEAskxhhjAmKBxBhjTEAskBhjjAmIBRJjjDEBsUBijDEmIBZIjDHGBMQCiTHGmIBYIDHGGBMQCyTGGGMCYo
HEGGNMQCyQGGOMCYgFEmOMMQGxQGKMMSYgFkiMMcYExAKJMcaYgFggMcYYExALJMYYYwJigcQYY0xALJAYY
4wJiAUSY4wxAbFAYowxJiAWSIwxxgTEAokxxpiAWCAxxhgTkJAFEhHJEpF5IrJORNaIyG1uepqIzBGRDe7f
jl7n3C0i+SKSJyKTvdLHiMgqd9/jIiJuehsRec1NXyQivUP1fowxxvgWyhJJFfBzVT0JGA/
cIiJDgBnAJ6o6APjEfY67bxpwMjAF+JuIxLrXehKYDgxwH1Pc9BuAA6raH/
gj8FAI348xxhgfQhZIVHWXqi5zt0uBdUAmcCHwonvYi8BUd/
tC4FVVrVDVzUA+ME5EugEdVHWhqirwUq1zPNd6HTjbU1oxxhgTHmFpI3GrnEYBi4AuqroLnGADdHYPywS2e
51W4KZlutu10487R1WrgBIg3cfrTxeRHBHJKSoqCtK7MsYYA2EIJCLSDngDuF1VD9Z3qI80rSe9vnOOT1B9
WlWzVTW7U6dODWXZGGNMI4Q0kIhIPE4Q+Zeq/tdNLnSrq3D/7nHTC4Asr9N7ADvd9B4+0o87R0TigBRgf/
DfiTHGmLqEsteWAM8C61T1Ma9ds4Br3e1rgbe90qe5PbH64DSqL3arv0pFZLx7zWtqneO51qXAXLcdxRhjT
JjEhfDapwJXA6tEZIWbdg/
wIDBTRG4AtgGXAajqGhGZCazF6fF1i6pWu+fdBLwAJAEfuA9wAtXLIpKPUxKZFsL3Y4wxxgdpbT/
gs7OzNScnJ9LZMMaYZkVElqpqtq99NrLdGGNMQCyQGGOMCYgFEmOMMQGxQGKMMSYgFkiMMcYExAKJMcaYgF
ggMcYYExALJMYYYwJigcQYY0xALJAYY4wJiAUSY4wxAbFAYowxJiAWSIwxxgTEAokxxpiAWCAxxhgTEAskx
hhjAmKBxBhjTEAskBhjjAmIBRJjjDEBsUBijDEmIBZIjDHGBMQCiTHGmIBYIDHGGBMQCyTGGGMCYoHEGGNM
QCyQGGOMCYgFEmOMMQGxQGKMMSYgFkiMMcYExAKJMcaYgDQqkIhIRxEZHqrMGGOMaX4aDCQi8qmIdBCRNCA
XeF5EHgt91owxxjQH/pRIUlT1IHAx8LyqjgHOCW22jDHGNBf+BJI4EekGXA68G+L8GGOMaWb8CSS/
BWYD+aq6RET6AhsaOklEnhORPSKy2ivtXhHZISIr3Mf5XvvuFpF8EckTkcle6WNEZJW773ERETe9jYi85qY
vEpHejXjfxhhjgqTBQKKq/1HV4ap6s/t8k6pe4se1XwCm+Ej/o6qOdB/vA4jIEGAacLJ7zt9EJNY9/
klgOjDAfXiueQNwQFX7A38EHvIjT8YYY4IsrqEDRORxH8klQI6qvl3Xeao6vxGlhAuBV1W1AtgsIvnAOBHZ
AnRQ1YVuXl4CpgIfuOfc657/
OvBXERFVVT9f0xhjTBD4U7WVCIzEqc7aAAwH0oAbRORPTXjNn4rISrfqq6Oblgls9zqmwE3LdLdrpx93jqp
W4QS3dF8vKCLTRSRHRHKKioqakGVjjDF18SeQ9Ae+rap/UdW/4PTYOgm4CDi3ka/
3JNAPJzDtAv7gpouPY7We9PrOOTFR9WlVzVbV7E6dOjUqw8YYY+rnTyDJBJK9nicD3VW1GqhozIupaqGqVq
tqDfAMMM7dVQBkeR3aA9jppvfwkX7cOSISB6QA+xuTH2OMMYHzJ5A8DKwQkedF5AVgOfCoiCQDHzfmxdxux
B4XAZ4eXbOAaW5PrD44jeqLVXUXUCoi493eWtcAb3udc627fSkw19pHjDEm/
BpsbFfVZ0XkfZzSgwD3qKqnVHBnXeeJyL+BM4EMESkAfgOcKSIjcaqgtgA/
cV9jjYjMBNYCVcAtbokH4CacHmBJOI3sH7jpzwIvuw3z+3F6fRljjAkz8edHvIhkAr3wCjyqOj+E+QqZ7Ox
szcnJiXQ2jDGmWRGRpaqa7WufP91/HwKuANYANW6yAs0ykBhjjAmuBgMJzriNQe4YD2OMMeY4/
jS2bwLiQ50RY4wxzZM/JZIjOL22PsGru6+q3hqyXBljjGk2/Akks9yHMcYYcwJ/uv+
+GI6MGGOMaZ7qDCQiMlNVLxeRVfiYekRVbcldY4wx9ZZIbnP/
XhCOjBhjjGme6uy15U5PAnCzqm71fgA3hyd7xhhjop0/3X8n+Ug7L9gZMcYY0zzV10ZyE07Jo6+IrPTa1R5
YEOqMGWOMaR7qayN5BWeCxN8DM7zSS1XVpms3xhgD1BNIVLUEZ9XBKwFEpDPOaontRKSdqm4LTxaNMcZEsw
bbSETkuyKyAdgMfIYz/fsH9Z5kjDGm1fCnsf1+YDywXlX7AGdjbSTGGGNc/
gSSSlXdB8SISIyqzsNZc90YY4zxa66tYhFph7P+yL9EZA/
OKobGGGOMXyWSC4Ey4A7gQ2AjNtrdGGOMq8FAoqqHVbVaVavcCRw/
Ah4KfdaMMcY0B3UGEhEZLiIfichqEblfRLqIyBvAx8Da8GXRGGNMNKuvRPIMzqDES4AiYBnOaon9VfWPYci
bMcaYZqC+xvY2qvqCu50nIr8AZqhqdeizZYwxprmoL5AkisgoQNznh4DhIiIAqros1JkzxhgT/
eoLJLuAx7ye7/Z6rsC3Q5UpY4wxzUd9c22dFc6MGGOMaZ78GUdijDHG1MkCiTHGmIDUN47kVPdvm/
BlxxhjTHNTX4nkcffvwnBkxBhjTPNUX6+tShF5HsgUkcdr71TVW0OXLWOMMc1FfYHkAuAcnG6+S8OTHWOMM
c1Nfd1/9wKvisg6Vc0NY56MMcY0I/
702tonIm+KyB4RKRSRN0SkR8hzZowxplnwJ5A8D8wCugOZwDtumjHGGOPXComdVdU7cLwgIreHKD8mAt5av
oNHZuexs7iM7qlJ3Dl5EFNHZUY6W8aYZsKfEkmRiFwlIrHu4ypgX0MnichzbnXYaq+0NBGZIyIb3L8dvfbd
LSL5IpInIpO90seIyCp33+OeSSNFpI2IvOamLxKR3o165wZwgsjd/13FjuIyFNhRXMbd/
13FW8t3RDprxphmwp9A8kPgcpxJG3cBl7ppDXkBmFIrbQbwiaoOAD5xnyMiQ4BpwMnuOX8TkVj3nCeB6cAA
9+G55g3AAVXtD/
wRW7WxSR6ZnUdZ5fErA5RVVvPI7LwI5cgY09z4s9TuNlX9nqp2UtXOqjpVVbf6cd58YH+t5AuBF93tF4GpX
umvqmqFqm4G8oFxItIN6KCqC1VVgZdqneO51uvA2Z7SivHfzuKyRqUbY0xt4Z5rq4uq7gJw/
3Z20zOB7V7HFbhpme527fTjzlHVKqAESPf1oiIyXURyRCSnqKgoSG+lZeiemtSodGOMqS1aJm30VZLQetLr
O+fERNWnVTVbVbM7derUxCy2THdOHkRszPG3Mik+ljsnD4pQjowxzU24A0mhW12F+3ePm14AZHkd1wPY6ab
38JF+3DkiEgekcGJVmmnA1FGZdO3wzbycGe0S+P3Fw6zXljHGbw0GEhH5ldd2oDMBzwKudbevBd72Sp/
m9sTqg9Oovtit/
ioVkfFu+8c1tc7xXOtSYK7bjmIaobyymt0HK7hqfE9E4KrxvSyIGGMapb5p5O8SkQk4X9Iefs8ELCL/
do8fJCIFInID8CAwSUQ2AJPc56jqGmAmsBb4ELhFVT1diW4C/
oHTAL8R+MBNfxZIF5F84Ge4PcBM46zZeZDqGuX0AZ0Y2j2FLzc22LPbGGOOU9+AxDzgMqCviHwOrMP54h6k
qg32DVXVK+vYdXYdxz8APOAjPQcY6iO93M2fCUDu9mIARmalMrF/Os99sZkjR6tom+DPWFVjjKm/
ausAcA9OSeBMvlmfZIaIfBnifJkwWVlQTJcObejSIZGJ/
TKorFZythyIdLaMMc1IfYFkCvAe0A94DBgHHFbV61V1YjgyZ0JvZUEJI3qkAjC2d0fiY8Wqt4wxjVJnIFHV
e1T1bGAL8E+carBOIvKFiLwTpvyZECopq2TT3sOMyEoFoG1CHKOyOvLlxr2RzZgxplnxp/
vvbFVdoqpPAwWqehpwfYjzZcJgVUEJwLESCcCEfums3lFCyZHKCOXKGNPc+DNFyl1eT69z0+wnawuQW1AMw
LAeKcfSJvZLp0Zh0War3jLG+KdRAxJtpcSWJXd7MX0ykklJij+WNqpnRxLjY6ydxBjjN+vj2YqtLChhfN+0
49IS4mIY2zvN2kmMiULRunZQtMy1ZcKs8GA5uw+WM9yrfcRjYr8M1hceoqi0IvwZM8b4FM1rB1kgaaU8AxE
9Pba8ndrfmUTZSiXGRI9oXjvIAkkrlVtQTFyMcHL3DifsO7l7Cu0T41ho7STGRI1oXjvIAkkrtbKghEFd25
MYH3vCvtgYYXzfdGtwNyaKpLaN95keDWsHWSBphVSV3O3FPttHPE7tl862/
UfYvv9I+DJmjPHpxS+3cOBIJbWWDiJWhF+cOzAymfJigaQV2rLvCAfLqxjhNX6kton9MwCsesuYCFJV/
jp3A7+ZtYZJQ7rw0CXDyUxNQoD2iXFUq5JfdCjS2bTuv63RSncgoq+Gdo8BnduR0a4NX27cy+Vjs+o8zhgT
GqrKgx98zd/
nb+KiUZk8fOlw4mNjuCw769j+e95cxRPzNtK1QyJXT+gdsbxaIGmFVmwvJjE+hgGd29V5jIgwsV86CzbuQ1
Vx1hUzxoRDdY3yv2+v5pVF27hqfE9+
+72hxNSq1xIR7rtwKEWlFfx61ho6tU9kytCuEcmvVW21QisLShiWmUJcbP3//
BP7pVNUWsHGKCg6G9NaVFbXcMdrK3hl0TZuOrMf9114YhDxiIuN4S9XjmZkViq3vrqcJVsis9q4BZJWprK6
htU7SuptaPeY2M9pJ7HeW6H11vIdnPrgXPrMeI9TH5wbFQPMTGSUV1Zz48tLmZW7k7umDOKXUwY3WBuQlBD
Ls9eOpUdqEj96MYcNhaVhyu03LJC0MusLS6moqqm3fcSjZ3pbenRMYkG+DUwMlWgerWzC61BFFdc/
v4S5eXu4b+pQbj6zv9/npiUn8OIPx5EQF8O1zy1md0l5CHN6IgskrUzuds/
U8XX32PI2sV86X23aT3WNhjJbrVY0j1Y24VN85Cg/+MciFm/
Zz2OXj+Dq8b0afY2stLY8f91YSsoque75xRwsD99SEBZIWpmVBcWkto2nZ1pbv46f2C+DkrJK1u06GOKctU
7RPFrZhMeeg+Vc8fevWLfzIE/+YDQXjerR5GsNzUzhqavHkL/
nENNfyqGiqrrhk4LAem21MrkFTvuIv72wJvZz5t1akL+XoZn+lWKM/
7qnJrHDR9CIhtHKpmFNnY3X+7yYGCFG4IXrx3GqO34rEKcP6MSjl43g9tdW8POZuTw+bVSdjfXBYiWSVqTs
aDXrC0v9rtYC6Nwhkf6d21mDe4jcOXnQCaOVReAXkyI/WtnUr7HtW9U1ysHySl74cjO/
fGPlsfOqa5QYkaDOtj11VCZ3nzeYd1fu4oH31wXtunWxEkkrsmZnCdU1etzSuv6Y2C+d15cWcLSqhoQ4+
+0RTFlpSdQodEiMo7S8itS28Rw4UkmltUlFvbrat2b8dyWvLy2gtKKKQ+WVHKqo4lB5FYeP1l3NVFFVwyOz
84K6tsj0M/qyq6ScZ7/YzL5DFSzZciBk65hYIGlFVrhTxw/
PalwV1cR+Gby0cCu5BcWM7Z3W8AnGL6rKI7PzyGjXhvl3nUnbhDhUlUufWsjDs/
M4b1hX2if6nqjPRF5d7VjllTWUVVaTmhRPj9Qk2rWJo11iHO3axNE+MY773/
NdQgh2u5iI8OsLhrBi2wHeWrHzWLqn5AQELZhYIGlFVhaU0D0lkc7tExt13vi+aYjAl/
n7LJAE0YL8fXy1aT+/+e4Q2iY4/xU9//kvfGIBT8zbyIzzBkc4l6YudbVvZaYm8cZNE+s87/
kFW8LWLhYTI+zxUWXm6RkYrEBi9RR+aCkDxnIL6p/
xty6pbRM4uXsHW+gqiJzSyNd0T0nk+6f0PG7fiKxULhndg+e+2MzWfYcjlEPTkDsnDyIh9vgGrqT4WO6cPK
jB85JqLd/gz3lNtauOMSXBLAFZIGlASxkwVnzkKFv3HWl0tZbHqf0yWL6tmLJ66nmN/
+asLSS3oITbzhlAm7gT14T55ZRBxMcKD9RRDWIib+qoTIb3SEEEBKck8vuLhzX4K3/qqEx+f/
GwY7P4+nteU9VV0glmCciqthpQ34CxUP3Dh8LKAmcg4sgmlEgAJvRL5+/zN5GzdT+nD+gUxJxFp6Z26/
RHTY3yh4/W0ycjmUtG+x4z0LlDIjef1Z9HZuexIH9vULqFmuCqqq4hv+gwF43M5LErRjbq3KmjMsP2/
XHn5EHc/
d9Vx32PBbsEZCWSBrSUAWOeNdqHNqLrr7exvdOIi5FW0Q041KXQd1buJK+wlDsmDax34swbTutDVloSv31n
LVXVNUF5bRM8OVsPUHykkklDukQ6K/UKRwnISiQNaCkDxnILSujXKZkOTewFlNwmjlE9U/
myFcy7FcpSaGV1DX+cs57BXdtzwbBu9R6bGB/L/5x/Ejf+cxn/
XrK9SdNmmND5eG0hCbExnDEw+kvooS4BWYmkAb4axhLjY0LWMBYKqkpuQXGjx4/
UNqFfBqt2lFBSFr45fCIhlKXQ15cWsGXfEX5x7iC/RhtPPrkr4/um8dhHeZQcadn3vTlRVeasK2Ri/
3SS29jvcQskDfAuFnpclp3VrNpHdh8sp6i0wq8Zf+szsV86NQqLN0dmzYNw6Zbiu3t0oKXQ8spqHv9kAyO
zUjn7pM5+neN0Bz6ZkrJK/vTJ+oBe3wTPhj2H2LrvSNRXa4WLBRI/
TB2VyYIZ32bT784nMzWJzUXNq0ump31keBPbRzxG9UwlMT6mxU8rP6R7hxPSBLjlrH4BXfeVRdvYVVLOXZM
HNWrFySHdOzBtXE9eXriV/
D3hX2vCnGjO2kIAzjnJAglYIGmUmBjhsuweLNi4l+37j0Q6O37LLSghLkY4qduJX5CN0SYulrG901jYghvc
83aX8mleEeN6dzzWOJnRLoEYgf8u29Hk7s+HK6p4Yl4+E/
ulM7EJPbB+PmkgSQmx3PeudQeOBnPWFjKiRwpdOjRucG9LFZFAIiJbRGSViKwQkRw3LU1E5ojIBvdvR6/
j7xaRfBHJE5HJXulj3Ovki8jjEoaFxS/LzgKcuu7mYmVBMSd160Bi/
InjFRprQr908gpLgzrBXLSoqVHueXMV7RPjeOrqbBbM+DabH/wOOb+axF++P5ql2w7w//
69rEk9qF74cgv7Dh/
lF01sW0tv14bbzh7AZ+uLmPf1niZdwwTHnoPlrNhebNVaXiJZIjlLVUeqarb7fAbwiaoOAD5xnyMiQ4BpwM
nAFOBvIuL5RnwSmA4McB9TQp3pzNQkTuufwetLC5rFYk81NcrK7SUBV2t5nOouv7twU8srlby6ZDtLtx7gf
74zhLTkhOP2nT+sG7/93sl8vG4P//
PmalT9/7cvOVLJU59t5JyTOjO6Z8eGT6jDNRN60zcjmfveXcvRKusOHCmfuIH8HAskx0RT1daFwIvu9ovAV
K/0V1W1QlU3A/nAOBHpBnRQ1YXq/
K9+yeuckLpibBY7isuaRVvB5n2HKa2oCrih3ePk7h1onxjHwhY2Xcqe0nIe/GAd4/
umcclo3x0prp7Qm1u/3Z/Xcrbzh4/8b/h+
+vONlJZX8bNJgfX0S4iL4X8vGMKmvYd5aeGWgK5lmm7O2kKy0pIY1KV9pLMSNSIVSBT4SESWish0N62Lqu4
CcP96urVkAtu9zi1w0zLd7drpJxCR6SKSIyI5RUVFAWd+0pAupLaNZ2bO9oYPjjBPQ3ugXX894mJjOKVPeo
sbmHj/u+sor6zhgYuG1dsQfsekgVw5Lou/zsvnxS+3NHjdotIKnvtiC98d0d1nI35jnTW4M98a2Ik/
f7KBfYdaXvWit2ic4+5wRRVf5O9l0kldG9VhoqWLVCA5VVVHA+cBt4jIGfUc6+tfS+tJPzFR9WlVzVbV7E6
dAh881CYulqkjM/loTSEHDh8N+HqhtLKghLYJsfTv3C5o1zy1fzpb9x2h4EDz6XBQn8/
WFzErdyc3n9WPfp3qv08iwn0XDmXSkC7c+84a3l25s97j//ZpPkera7jjnAFBy+//
XnASZUer+cOcltsdOFrnuPt8w16OVtVwzhD/
um+3FhEJJKq60/27B3gTGAcUutVVuH89LYoFQJbX6T2AnW56Dx/pYXHF2CyOVtfw1orI/
0qqT25BMUMzU4gN4lKbE912kpZQKik7Ws2v3lpF34xkbjrTv+69cbEx/OXKUWT36sjPXsutc7T/juIy/
vXVNi4d3YO+DQSoxujfuT1XT+jFq4u3sW7XwaBdN5rUN7tAJM1ZW0hKUjzjbDmF44Q9kIhIsoi092wD5wKr
gVnAte5h1wJvu9uzgGki0kZE+uA0qi92q79KRWS821vrGq9zQu6kbh0Y3iOF15Zsb1TDazgdraphzc6DjVp
a1x8Du7Qjo11Ci+gG/Je5G9i+v4wHLhrmcxbeuiTGx/
KPa8bSO6Mt019eyuodJSde+5MNANwaxNKIx+1nDyQxLoYLn1gQVVU/
wRKNc9xVVdcw9+tCvj24c71zpLVGkbgbXYAvRCQXWAy8p6ofAg8Ck0RkAzDJfY6qrgFmAmuBD4FbVNXzU+U
m4B84DfAbgQ/C+UYuy87i692lrN4Rnb8K1xeWcrSqJmgN7R4iwoR+GSzI3xu1QdQfebtLeXr+Ji4d04MJ/
dIbfX5K23he/OE4OiTGcd3zS9i275uqvs17D/
OfpQV8/5Sex82KECzz8vZQWaMcraqJqqqfYOmWGprZBQKxbFsxB45U2iBEH8I+SYyqbgJG+EjfB5xdxzkPA
A/4SM8BhgY7j/763oju3P/uWl7L2cawHsMilY06rQhyQ7u3if3SeSd3JxuLDge1/
SVcvMeM3HP+SU2+TreUJF66YRyXPrWQa55bxA2n9+GpTzexo7gMAfp2Sg5epr08MjuPyurjg3hZZTX3zlpD
Stt4uqck0T010edSvaGcIj9YTh+QwWtLjh+rFcrFn/wxZ+1uEmJj+Nag6J+kMdxstrEApCTFc/
6wbry9Yie/+s6QoAz4C6aVBcWkJSfQo2Pwf8VNdH/
BL9y4NyyBJNhffp4xI49eNuKEMSON1b9ze567biyXP/Ulv357DZ5CmgK/f/9rOiTGB/2Luq4qnuKySq5/
fsmx5+0T48hMTaJbSiLdU5MoPnKUj9YWHgtCoVi/
O1DlldV8lreXXmlJVNUoO4qdFf5uOrNvxPKoqsxZW8iEfum0s0kaT2AVfQG6PDuL0vIqPli9K9JZOUGuOxA
xFN0Ul209QKwI//v2mpDXzwe7B48/
Y0Yaa3TPjqQkJVC7pi9UDcR1VfF07ZDIGzdN5C9XjuLu8wZz8ahMenRsy57SCt5ftYv3Vu32WZKJdCO2txe
+3MLug+U8dOkIFsw4m1X3nktacgKLIjhZ6MaiQ2zZd8QGIdbBQmuATumTRs+0tsxcUsBFo3yvdhcJR45WsW
FPKVOGdg36td9avoN73lxNtYbnV+1DH34d1PVB/
B0z0lj76+gKHooG4rpWvZtx3mDG9OrImF6+R9D3mfGezz7y0bJQW8mRSv42L5+zBnVifF+n1Ns+MZ5bzurP
fe+u5YsNezltQPhXi/zInaRxkrWP+GQlkgDFxAiXZ/
dg4aZ9bN0XPbMCr95xkBqFEU1co70+dXXNvP+94E3dcbiiilm5O/
nJyznsKin3ecyO4rJGv15jxow0VjjWxvZo6qp3deWlrqnzw+3JzzZSWlHFXVMGH5f+A7fTwkMffh2RDh5z1
hYyvEcKXaPkPkUbCyRBcOmYLGIE/
pMTPRM5fjN1fGrQr13Xr9e9h44y6rcf8eOXcnj5q62NniH5yNEq3lu5i5v+uZTR983h1n8vZ/
m2YpLb1N32dMbD83hm/iYOVVQ1eP1jY0Y6+T9mpDF8LYIWygZiz/IGmx/
8DgtmfNuv0pmvPAJkpSVFvAfe7pJynl+wmakjM0+YqToxPpbbzxnAqh0lfLB6d1jztafUmaTRemvVzaq2gq
BrSiLfGtiJ15cWcMekgUEd/
NdUuQXFZKYmkdGuTdCvXdfyw2nJCUwZ2pX564uOrdfQJyOZbw3sxBkDMxjfN52P1hQe12h+
+zkDaNcmjndX7WLuuj2UVVaT0a4NV4zN4oLh3cnu1ZFZuTt9VOPEcPWEXqwsKOGB99fxl7kbuHpCL66b2Id
O7X2/Z8+YkVenj2/UmBF/eb7Io7lHlK88Du3entlr9/
DkZxu5+cz+Ecvbnz5eT40qP5s00Of+i0f34On5m3h0dh7nDukStrEcc9ftQRWb7bceFkiC5PLsLG761zLmb
yjirEGRnz4ht6A4JNVaUHf9/K8vGMLUUZmoKpv2Hmb++iI+W1/
Eq0u28cKXW4gVpyeTZ9LkHcVl3Pn6SgDSkxO4eHQmFwzvzrg+accF44a+oJdvO8DfP9vE3z7dyD8+38xl2T
2Yfno/eqa3Pa63lwLjenc8VvceCqFeGzsYaudRVbnt1RU8/
GEevdKS+c7w+teSD4X8PYeYmbOdayf2Jiutrc9jYmOEX0wexE9eXsrrSwuYNq5nWPI2Z20hPTomMbirTdJY
FwskQXL2SV1IT05g5pLtEQ8k+w8fZfv+Mq46pVdIrt/QF7uI0K9TO/p1asf1p/
ahvLKanC0HuPGfORyqOHFhqIx2CXx199n1/
sKs7wt6VM+OPHX1GDYWHeKZ+ZuYuaSAVxZtY3iPFNbtKqXCqx1l5Y4S3lq+I+q/
7MNJRHj40uHsKC7jZzNX0D01kVEBTHffFI/OzqNtQhw/
Pav+EtG5Q7owMiuVP328gamjMkPe5f7IUWeSxivH9bRJGuthbSRBkhAXw0WjMvl4XWHEZ2XNLSgGQtM+4tG
Y+vnE+FhOG5DBYR9BBGDfoaNBqabo16kdD14ynM9/eRY/
PqMvudtLjgsiAOWVNVHV1TVaJMbH8vTVY+jSIZEfv5QT1hVAl207wIdrdvPj0/
uS3kBVrIjwyymD2X2wPCxT6X+
+YS8VVTWca9Va9bJAEkSXj82islp5M8LTVKzcXoIIDAvyHFuBClevpi4dErn7vLpHq0dLV9dok96uDc9dN5
ajVTX88IUlHCyvDPlrqioPffA1Ge0S+NHpffw6Z0K/
dM4Y2Ikn5m2kpCy0eZyztpAOiXGM7WOTNNbHAkkQDezSnpFZqczMiexEjisLiunfqV3UjcANd6+mcHbHbSn
6d27HU1eNYfPew9zyr2VUNmFZ4cb4dH0Rizbv5/99ewDJjfi83jV5ECVllTwzf1PI8lZdo8z9eg9nDe5MvE
3SWC+7O0F2xdgs1hceOjbPVbipKrkFxSGt1mqqpo59aKpwB66WYmL/
DH538TA+37CX38xaE7IfRTU1ysMf5tEzrS1XNrLhfGhmChcM78azX2xmT6nvcUaBWrbtAPsPH7XeWn6Irp+
sLcAFw7vx23fWMjNne9gbLAF2lpSz99BRRoaox1agwtmrqTl0x41Wl2dnsXnvYZ78dCN90pP58Rl9g/
4as3J3sm7XQf48bSQJcY3/TfuLcwfx4erd/
HVuPr+9MPhzt85ZW0h8rPCtgTZJY0MskARZ+0RnIsd3cnfxvxcMoW1CeG9xKAciNkfNoTtutLrz3EFs23eE
332wjp7pbZl8cvCm26moqubRj/
I4uXsHvju8e5Ou0TsjmSvGZvHKom386LS+9Ez33W24qT5eW8j4vuk+Z1A2x7OqrRC4YmwWhyqqeH9VeEfgv
rV8B3e54zJu+ufSFrM2hYmMmBjhD5ePYESPVG5/dQWrCk5cvKupXlm0jYIDZdw1ZTAxAQzgvfXsAcTFCo/
NCW5PvPw9h9i097D11vKTBZIQGNu7I30zkpm5ZHvYXtMzQ65nqpCdJeUtaqEjExmJ8bE8c002ackJfP+ZhZ
zyu48DXpHxUEUVf52bz4S+6ZwR4ASMXTokcv2pfXg7dydrdwZvgTnPzAxn27QofrFAEgIiwmXZWSzesp9NR
YfC8prRusa1af46tW/DVeN7UlpRTeHBioCn8n9m/ib2HT7KjPMGB2WQ341n9KN9mzge/Sh4n/
WP1xUyNLOD9fDzkwWSELlkdCaxMcJ/loZnIsdoXOPatBz//
GrbCWlN+aFSVFrBM59v4vxhXYO2BHRK23huOrM/c7/
ew+IgrFlSVFrBsm0HmHRS8JdgaKkskIRI5w6JDO7ajr9/
tjHgqoCGVFbX1NnrxX5RmWCo6wfJjuIyPs3bQ3WNf12E/zp3AxVVNfzi3OB2wb5uYm86t2/
Dw0GYZn7u14WowjlDIj9nXnNhgSRE3lq+gw2Fh6hRgrKqX33uf3ctFVU1xMceX01gYyZMsNT1gyRG4Lrnl3
DaQ3P5w0d5bNtX99Qq2/Yd4ZXF27g8O4u+QV4LJikhltvOGUDO1gPM/
XpPQNeas3YPmalJDKk1lb2pmwWSEHlkdh5Hw7Ck6SuLtvHiwq38+PQ+PHLpiLAN9jOtS12DOx++ZDh/
+8FoBnVtzxPz8jnjkXlMe3ohby4voOyo02b31vIdnPrgXM54ZB6V1crgrsENIh6XZ2eRkRzPT15e2uRagLK
j1XyRX8SkIV1sksZGsHEkIRKONouvNu3j12+v5sxBnZhx3knExogFDhMSDQ3uPH9YN3aVlPHG0gJm5hRwx2
u5/LrNGob26MCyrcXHTZ754Ad5pCQlBP2z+t7KXZSUV1FV0/QloD/
fUER5ZY0tYtVIFkhCpK7Fn4K1VOf2/Ue46Z9L6ZXelsevHBUVi2mZlq2hwZ3dUpL46bcHcPOZ/
Vm8ZT8zl2znvz5KBJ6SebADySOz86j0UQvw8IdfN/
hannVrdhSXIUDhQeuk0hgWSELE1+JP4MyFtaukjG4pTW8EP1RRxY9ezKG6RvnHtWPpYCNvTRSJiRHG901nf
N903ly+A19N36HoTVhnLUBJOWc8PI9e6W3pnZ5Mr/S29MlIpld6MllpSXywavdx/
1cV+NVba4iNibESvp8skISIr6qA743ozstfbeXiv33JC9ePY1ATVlyrqVHueG0F+UWHeOH6sfTJSA521o0J
mrpK5qHoTVjXa7VvE8eIrFS27jvMWyt2UFpedWyfCMQgVKvv9kwLJP6xQBJCvqoCLhjRjeufX8KlT33J368
ew8R+jRvZ+9ic9cxZW8hvvjuE0wfYZHImutW1LHMoehPW9Vr3TR167P+hqnLgSCVb9h1m677DbNl7hD9/
ssHn9WwMlv+s11aYndw9hTdvOZUuHRK57rklzMrd6fe5s3J38td5+Uwbm8V1E3uHLpPGBEk4lw7w57VEhLT
kBEb37MhFo3pwx6SBZNq6NQGTSC7AFAnZ2dmak5MT6WxQcqSSH7+Uw+It+7nn/
MH8+PS+9XY3XFVQwqVPfcnwHin860fjmzTttjHmRJ556mqXZKz7/
PFEZKmqZvvaZ99GEZLSNp6XbhjHd4Z143fvf83/
vbO2ztHBew6W8+OXcsho14YnrxpjQcSYIAr3gmstkbWRRFBifCx/
uXIUXTok8tyCzRQeLOePV4wk0WvgV3llNdNfXsrB8kpev3EiGe3aRDDHxrRMtm5NYCyQRFhMjPDr7w6he2o
i97+3jqLSRVw8OpMn5m1kZ3EZifGxlFVW89RVoxnS3aZsMMZEHwskUeJHp/ela0oit/
17OUu3HjjW976sspq4GKG8sqbe840xJlKssj2KXDC8Ox2TE04YwFVVo7auiDEmalkgiTL7Dh31mW592o0x0
coCSZSpq+
+69Wk3xkSrZh9IRGSKiOSJSL6IzIh0fgJV13Tdtq6IMSZaNevGdhGJBZ4AJgEFwBIRmaWqayObs6ZraLpuY
4yJNs06kADjgHxV3QQgIq8CFwLNNpCA9Wk3xjQvzT2QZALbvZ4XAKfUPkhEpgPT3aeHRKSpXaAygL1NPLel
snvim92XE9k9OVFzuie96trR3AOJr8mpTphnRFWfBp4O+MVEcuqaa6a1snvim92XE9k9OVFLuSfNvbG9AMj
yet4D8H86XWOMMQFr7oFkCTBARPqISAIwDZgV4TwZY0yr0qyrtlS1SkR+CswGYoHnVHVNCF8y4OqxFsjuiW
92X05k9+RELeKetLr1SIwxxgRXc6/
aMsYYE2EWSIwxxgSk1QcSEXlORPaIyGqvtBEislBEVonIOyLSwU1PEJHn3fRcETnT65wEEXlaRNaLyNcick
n4303gRCRLROaJyDoRWSMit7npaSIyR0Q2uH87ep1ztztFTZ6ITPZKf0BEtovIoUi8l2AK8n1plZ8VEUl3j
z8kIn+tda0W8VkJ8j1pPp8TVW3VD+AMYDSw2ittCfAtd/uHwH3u9i3A8+52Z2ApEOM+/z/
gfnc7BsiI9Htr4v3oBox2t9sD64EhwMPADDd9BvCQuz0EyAXaAH2AjUCsu2+8e71DkX5fUXZfWutnJRk4Db
gR+Guta7WIz0qQ70mz+ZxEPAPR8AB61wokB/
mmI0IWsNbdfgK4yuu4T4Bx7vZ2IDnS7yUE9+ZtnLnM8oBublo3IM/
dvhu42+v42cCEWtdo1l8Owb4vrfWz4nXcdbW/NFvqZyWQe9KcPietvmqrDquB77nbl/
HNoMdc4EIRiRORPsAYIEtEUt3994nIMhH5j4h0CWuOQ0BEegOjgEVAF1XdBeD+7ewe5muamhY9UVgg96WVf
1ZalUDuSXP7nFgg8e2HwC0ishSneOpZbeo5nC+EHOBPwJdAFc54nB7AAlUdDSwEHg1znoNKRNoBbwC3q+rB
+g71kdZi+5QH4b605s9KqxGEe9KsPicWSHxQ1a9V9VxVHQP8G6d+G1WtUtU7VHWkql4IpAIbgH3AEeBN9xL
/wWl3aZZEJB7nP8G/VPW/bnKhiHRz93cD9rjprWaamiDdl9b8WWkVgnRPmtXnxAKJDyLS2f0bA/
wKeMp93lZEkt3tSUCVqq5Vp0LzHeBM9xJn00ynshcRAZ4F1qnqY167ZgHXutvX4tT9etKniUgbt7pvALA4X
PkNl2Ddl1b+WWnxgnVPmt3nJNKNNJF+4JQ4dgGVOL8ibwBuw+ltsR54kG8a3nvjNJqtAz4GenldpxcwH1iJ
0wjfM9LvrYn34zScKpiVwAr3cT6Q7r6vDe7fNK9z/gen1JYHnOeV/rB7T2vcv/
dG+v1FyX1pzZ+VLcB+4JD7mRjSkj4rQb4nzeZzYlOkGGOMCYhVbRljjAmIBRJjjDEBsUBijDEmIBZIjDHGB
MQCiTHGmIBYIDHGGBMQCyTGNEMiEhvpPBjjYYHEmBATkfs861K4zx8QkVtF5E4RWSIiK0Xk/
7z2vyUiS931LKZ7pR8Skd+KyCJgQpjfhjF1skBiTOg9izs9hjvtzjSgEGfalHHASGCMiJzhHv9DdeZ5ywZu
FZF0Nz0ZZ7mDU1T1izDm35h6xUU6A8a0dKq6RUT2icgooAuwHBgLnOtuA7TDCSzzcYLHRW56lpu+D6jGmQz
QmKhigcSY8PgHzuJFXXGWIzgb+L2q/
t37IHGWbz4HZxGsIyLyKZDo7i5X1eow5dcYv1nVljHh8SYwBackMtt9/
NBdtwIRyXRnnU4BDrhBZDDOErTGRDUrkRgTBqp6VETmAcVuqeIjETkJWOjMPM4h4CrgQ+BGEVmJM2vwV5HK
szH+stl/
jQkDt5F9GXCZqm6IdH6MCSar2jImxERkCJAPfGJBxLREViIxxhgTECuRGGOMCYgFEmOMMQGxQGKMMSYgFki
MMcYExAKJMcaYgPx/paRgz5bRjnoAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"year_counts=ratings_df[['year','rating']].groupby(['year']).count()\n",
"year_counts = year_counts.rename(index=str, columns={'rating': '# of
Ratings'})\n",
"year_counts = year_counts.reset_index()\n",
"year_counts = year_counts.set_index('year', drop=True)\n",
"display(year_counts[0:5])\n",
"year_counts['# of Ratings'].plot(style='o-')\n",
"plt.ylabel('# of Ratings')\n",
"plt.title('# of Ratings per year')\n",
"plt.ylim([0, 25000])\n",
"plt.gca().grid(which='minor')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "283dad7f",
"metadata": {},
"source": [
"## DATASET SIZE AND ITS VALUES"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "c5f93a51",
"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>userId</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>10</th>\n",
" <th>...</th>\n",
" <th>601</th>\n",
" <th>602</th>\n",
" <th>603</th>\n",
" <th>604</th>\n",
" <th>605</th>\n",
" <th>606</th>\n",
" <th>607</th>\n",
" <th>608</th>\n",
" <th>609</th>\n",
" <th>610</th>\n",
" </tr>\n",
" <tr>\n",
" <th>movieId</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>4.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>4.0</td>\n",
" <td>NaN</td>\n",
" <td>4.5</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>4.0</td>\n",
" <td>NaN</td>\n",
" <td>4.0</td>\n",
" <td>3.0</td>\n",
" <td>4.0</td>\n",
" <td>2.5</td>\n",
" <td>4.0</td>\n",
" <td>2.5</td>\n",
" <td>3.0</td>\n",
" <td>5.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>4.0</td>\n",
" <td>NaN</td>\n",
" <td>4.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>4.0</td>\n",
" <td>NaN</td>\n",
" <td>5.0</td>\n",
" <td>3.5</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>5.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>3.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>5.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>3.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 610 columns</p>\n",
"</div>"
],
"text/plain": [
"userId 1 2 3 4 5 6 7 8 9 10 ... 601 602
603 \\\n",
"movieId ...
\n",
"1 4.0 NaN NaN NaN 4.0 NaN 4.5 NaN NaN NaN ... 4.0 NaN
4.0 \n",
"2 NaN NaN NaN NaN NaN 4.0 NaN 4.0 NaN NaN ... NaN 4.0
NaN \n",
"3 4.0 NaN NaN NaN NaN 5.0 NaN NaN NaN NaN ... NaN NaN
NaN \n",
"4 NaN NaN NaN NaN NaN 3.0 NaN NaN NaN NaN ... NaN NaN
NaN \n",
"5 NaN NaN NaN NaN NaN 5.0 NaN NaN NaN NaN ... NaN NaN
NaN \n",
"\n",
"userId 604 605 606 607 608 609 610 \n",
"movieId \n",
"1 3.0 4.0 2.5 4.0 2.5 3.0 5.0 \n",
"2 5.0 3.5 NaN NaN 2.0 NaN NaN \n",
"3 NaN NaN NaN NaN 2.0 NaN NaN \n",
"4 NaN NaN NaN NaN NaN NaN NaN \n",
"5 3.0 NaN NaN NaN NaN NaN NaN \n",
"\n",
"[5 rows x 610 columns]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data = pd.pivot(index = 'movieId',columns = 'userId', data = ratings,values
='rating')\n",
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "68ecea01",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Shape of frames: \n",
" Rating DataFrame(100836, 4)\n",
" Movies DataFrame(9742, 3)\n"
]
}
],
"source": [
"print(\"Shape of frames: \\n\"+ \" Rating DataFrame\"+ str(ratings.shape)+\"\\
n Movies DataFrame\"+ str(movies.shape))"
]
},
{
"cell_type": "markdown",
"id": "775b81d6",
"metadata": {},
"source": [
"## MERGING THE 2 DATAFRAMES AND GROUPING THEM BY EITHER ONE TO PLOT GRAPHS"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "cdfda262",
"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>movieId</th>\n",
" <th>title</th>\n",
" <th>genres</th>\n",
" <th>userId</th>\n",
" <th>rating</th>\n",
" <th>timestamp</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>Adventure|Animation|Children|Comedy|Fantasy</td>\n",
" <td>1</td>\n",
" <td>4.0</td>\n",
" <td>964982703</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>Toy Story (1995)</td>\n",
" <td>Adventure|Animation|Children|Comedy|Fantasy</td>\n",
" <td>5</td>\n",
" <td>4.0</td>\n",
" <td>847434962</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" movieId title
genres \\\n",
"0 1 Toy Story (1995) Adventure|Animation|Children|Comedy|Fantasy
\n",
"1 1 Toy Story (1995) Adventure|Animation|Children|Comedy|Fantasy
\n",
"\n",
" userId rating timestamp \n",
"0 1 4.0 964982703 \n",
"1 5 4.0 847434962 "
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"merge_ratings_movies = pd.merge(movies, ratings, on='movieId', how='inner')\
n",
"merge_ratings_movies.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "075b1395",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(100836, 5)"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"merge_ratings_movies = merge_ratings_movies.drop('timestamp', axis=1)\n",
"merge_ratings_movies.shape"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "8d4cd7d8",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Ankita Sahoo\\AppData\\Local\\Temp\\
ipykernel_19000\\1683866132.py:1: FutureWarning: ['title', 'genres'] did not
aggregate successfully. If any error is raised this will raise in a future version
of pandas. Drop these columns/ops to avoid this warning.\n",
" ratings_grouped_by_users =
merge_ratings_movies.groupby('userId').agg([np.size, np.mean])\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 tr th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe thead tr:last-of-type th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr>\n",
" <th></th>\n",
" <th colspan=\"2\" halign=\"left\">movieId</th>\n",
" <th colspan=\"2\" halign=\"left\">rating</th>\n",
" </tr>\n",
" <tr>\n",
" <th></th>\n",
" <th>size</th>\n",
" <th>mean</th>\n",
" <th>size</th>\n",
" <th>mean</th>\n",
" </tr>\n",
" <tr>\n",
" <th>userId</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>232</td>\n",
" <td>1854.603448</td>\n",
" <td>232</td>\n",
" <td>4.366379</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>29</td>\n",
" <td>70350.275862</td>\n",
" <td>29</td>\n",
" <td>3.948276</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" movieId rating \n",
" size mean size mean\n",
"userId \n",
"1 232 1854.603448 232 4.366379\n",
"2 29 70350.275862 29 3.948276"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ratings_grouped_by_users =
merge_ratings_movies.groupby('userId').agg([np.size, np.mean])\n",
"ratings_grouped_by_users.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "61a02a88",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot:xlabel='userId'>"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png":
"iVBORw0KGgoAAAANSUhEUgAAAlwAAAFGCAYAAAC/uUHQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIH
ZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/
YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAZ6klEQVR4nO3dfbAldX3n8ffHGYP4jGEgZGbIEBezAqsQRi
RF4uIaAUMi6Mo67q7gRh1FdE2iSQ3GKjVbk6JWxWhKqMIFhRJlUePCrqCZEMWYVWEgyNNInA0II0/
jM1GXyPDdP7pHzk4u83TP75x7et6vqlO3z+90n/7+6Evfz3T/
ujtVhSRJktp5zLQLkCRJGjoDlyRJUmMGLkmSpMYMXJIkSY0ZuCRJkhozcEmSJDW2eNoF7Mi++
+5bK1asmHYZkiRJO3Tdddd9u6qWbNu+4APXihUrWL9+/
bTLkCRJ2qEk35yr3VOKkiRJjRm4JEmSGjNwSZIkNWbgkiRJaszAJUmS1JiBS5IkqTEDlyRJUmMGLkmSpMYM
XJIkSY0ZuCRJkhozcEmSJDW24J+luLtWrPnMRNd3x1knTnR9kiRpdniES5IkqTEDlyRJUmMGLkmSpMYMXJI
kSY0ZuCRJkhozcEmSJDVm4JIkSWrMwCVJktSYgUuSJKkxA5ckSVJjBi5JkqTGDFySJEmNGbgkSZIaM3BJki
Q1tsPAlWR5ks8n2ZDkliRv7tvfmeRbSW7oX781ssyZSTYmuS3J8SPtRya5qf/
sA0nSpluSJEkLx+KdmOch4C1VdX2SJwHXJVnXf/
a+qnrP6MxJDgFWAYcCvwj8VZJnVNUW4FxgNfAV4ArgBODK8XRFkiRpYdrhEa6quqeqru+nHwA2AEu3s8hJw
CVV9WBV3Q5sBI5KcgDw5Kr6clUVcBFw8nw7IEmStNDt0hiuJCuAI4Cv9k1vTHJjkguS7NO3LQXuGllsU9+2
tJ/
etl2SJGnQdjpwJXki8Cng96rqh3SnB58OHA7cA7x366xzLF7baZ9rXauTrE+yfvPmzTtboiRJ0oK0U4EryW
PpwtbFVfUXAFV1X1VtqaqHgQ8BR/WzbwKWjyy+DLi7b182R/s/
U1XnVdXKqlq5ZMmSXemPJEnSgrPDQfP9lYTnAxuq6uyR9gOq6p7+7UuAm/
vpy4GPJTmbbtD8wcA1VbUlyQNJjqY7JXkq8Ofj68qeY8Waz0x0fXecdeJE1ydJ0tDszFWKxwCvBG5KckPf9
jbgFUkOpzsteAfwOoCquiXJpcCtdFc4ntFfoQhwOvARYG+6qxO9QlGSJA3eDgNXVX2JucdfXbGdZdYCa+do
Xw8ctisFSpIkzTrvNC9JktSYgUuSJKkxA5ckSVJjBi5JkqTGDFySJEmNGbgkSZIaM3BJkiQ1ZuCSJElqzMA
lSZLUmIFLkiSpMQOXJElSYwYuSZKkxgxckiRJjRm4JEmSGjNwSZIkNWbgkiRJaszAJUmS1JiBS5IkqTEDly
RJUmMGLkmSpMYMXJIkSY0ZuCRJkhozcEmSJDVm4JIkSWrMwCVJktSYgUuSJKkxA5ckSVJjBi5JkqTGDFySJ
EmNGbgkSZIaM3BJkiQ1ZuCSJElqbPG0C5C2tWLNZya6vjvOOnGi65Mk7Xk8wiVJktSYgUuSJKkxA5ckSVJj
Bi5JkqTGDFySJEmNGbgkSZIa22HgSrI8yeeTbEhyS5I39+1PS7IuyTf6n/uMLHNmko1Jbkty/
Ej7kUlu6j/7QJK06ZYkSdLCsTNHuB4C3lJVzwSOBs5IcgiwBriqqg4Grurf03+2CjgUOAE4J8mi/
rvOBVYDB/evE8bYF0mSpAVph4Grqu6pquv76QeADcBS4CTgwn62C4GT+
+mTgEuq6sGquh3YCByV5ADgyVX15aoq4KKRZSRJkgZrl8ZwJVkBHAF8Fdi/qu6BLpQB+/
WzLQXuGllsU9+2tJ/etl2SJGnQdjpwJXki8Cng96rqh9ubdY622k77XOtanWR9kvWbN2/
e2RIlSZIWpJ0KXEkeSxe2Lq6qv+ib7+tPE9L/vL9v3wQsH1l8GXB3375sjvZ/
pqrOq6qVVbVyyZIlO9sXSZKkBWlnrlIMcD6woarOHvnocuC0fvo04LKR9lVJ9kpyEN3g+Gv6044PJDm6/85
TR5aRJEkarMU7Mc8xwCuBm5Lc0Le9DTgLuDTJq4E7gVMAquqWJJcCt9Jd4XhGVW3plzsd+AiwN3Bl/
5IkSRq0HQauqvoSc4+/AnjBoyyzFlg7R/
t64LBdKVCSJGnWead5SZKkxgxckiRJjRm4JEmSGjNwSZIkNWbgkiRJaszAJUmS1JiBS5IkqTEDlyRJUmM7c
6d5SWO0Ys1nJrq+O846caLrkyT9cx7hkiRJaszAJUmS1JiBS5IkqTEDlyRJUmMGLkmSpMYMXJIkSY0ZuCRJ
khozcEmSJDVm4JIkSWrMwCVJktSYgUuSJKkxA5ckSVJjBi5JkqTGDFySJEmNGbgkSZIaM3BJkiQ1ZuCSJEl
qzMAlSZLUmIFLkiSpMQOXJElSYwYuSZKkxgxckiRJjRm4JEmSGjNwSZIkNWbgkiRJaszAJUmS1JiBS5IkqT
EDlyRJUmMGLkmSpMYMXJIkSY3tMHAluSDJ/UluHml7Z5JvJbmhf/
3WyGdnJtmY5LYkx4+0H5nkpv6zDyTJ+LsjSZK08OzMEa6PACfM0f6+qjq8f10BkOQQYBVwaL/
MOUkW9fOfC6wGDu5fc32nJEnS4OwwcFXVF4Hv7uT3nQRcUlUPVtXtwEbgqCQHAE+uqi9XVQEXASfvZs2SJE
kzZT5juN6Y5Mb+lOM+fdtS4K6ReTb1bUv76W3bJUmSBm93A9e5wNOBw4F7gPf27XONy6rttM8pyeok65Os3
7x5826WKEmStDDsVuCqqvuqaktVPQx8CDiq/
2gTsHxk1mXA3X37sjnaH+37z6uqlVW1csmSJbtToiRJ0oKxW4GrH5O11UuArVcwXg6sSrJXkoPoBsdfU1X3
AA8kObq/OvFU4LJ51C1JkjQzFu9ohiQfB44F9k2yCXgHcGySw+lOC94BvA6gqm5JcilwK/AQcEZVbem/
6nS6Kx73Bq7sX5IkSYO3w8BVVa+Yo/n87cy/Flg7R/
t64LBdqk6SJGkAvNO8JElSYwYuSZKkxgxckiRJjRm4JEmSGjNwSZIkNWbgkiRJaszAJUmS1JiBS5IkqTEDl
yRJUmMGLkmSpMZ2+GgfSdoVK9Z8ZqLru+OsEye6PknaHR7hkiRJaszAJUmS1JiBS5IkqTHHcEnSLnCMmqTd
4REuSZKkxgxckiRJjRm4JEmSGnMMlyQJcHya1JJHuCRJkhozcEmSJDVm4JIkSWrMMVySpD2CY9Q0TR7hkiR
JaszAJUmS1JiBS5IkqTEDlyRJUmMGLkmSpMYMXJIkSY0ZuCRJkhozcEmSJDVm4JIkSWrMO81LkjQA3kl/
YfMIlyRJUmMGLkmSpMYMXJIkSY0ZuCRJkhpz0LwkSVrwZv2iAI9wSZIkNbbDwJXkgiT3J7l5pO1pSdYl+Ub
/c5+Rz85MsjHJbUmOH2k/MslN/
WcfSJLxd0eSJGnh2ZkjXB8BTtimbQ1wVVUdDFzVvyfJIcAq4NB+mXOSLOqXORdYDRzcv7b9TkmSpEHaYeCq
qi8C392m+STgwn76QuDkkfZLqurBqrod2AgcleQA4MlV9eWqKuCikWUkSZIGbXfHcO1fVfcA9D/
369uXAneNzLepb1vaT2/bLkmSNHjjHjQ/17is2k773F+SrE6yPsn6zZs3j604SZKkadjdwHVff5qQ/
uf9ffsmYPnIfMuAu/
v2ZXO0z6mqzquqlVW1csmSJbtZoiRJ0sKwu4HrcuC0fvo04LKR9lVJ9kpyEN3g+Gv6044PJDm6vzrx1JFlJ
EmSBm2HNz5N8nHgWGDfJJuAdwBnAZcmeTVwJ3AKQFXdkuRS4FbgIeCMqtrSf9XpdFc87g1c2b8kSZIGb4eB
q6pe8SgfveBR5l8LrJ2jfT1w2C5VJ0mSNADeaV6SJKkxA5ckSVJjBi5JkqTGDFySJEmNGbgkSZIaM3BJkiQ
1ZuCSJElqzMAlSZLUmIFLkiSpMQOXJElSYwYuSZKkxgxckiRJjRm4JEmSGjNwSZIkNWbgkiRJaszAJUmS1J
iBS5IkqTEDlyRJUmMGLkmSpMYMXJIkSY0ZuCRJkhozcEmSJDVm4JIkSWrMwCVJktSYgUuSJKkxA5ckSVJjB
i5JkqTGDFySJEmNGbgkSZIaM3BJkiQ1ZuCSJElqzMAlSZLUmIFLkiSpMQOXJElSYwYuSZKkxgxckiRJjRm4
JEmSGjNwSZIkNWbgkiRJamxegSvJHUluSnJDkvV929OSrEvyjf7nPiPzn5lkY5Lbkhw/
3+IlSZJmwTiOcD2/qg6vqpX9+zXAVVV1MHBV/54khwCrgEOBE4Bzkiwaw/
olSZIWtBanFE8CLuynLwROHmm/pKoerKrbgY3AUQ3WL0mStKDMN3AV8JdJrkuyum/bv6ruAeh/
7te3LwXuGll2U98mSZI0aIvnufwxVXV3kv2AdUm+vp15M0dbzTljF95WAxx44IHzLFGSJGm65nWEq6ru7n/
eD3ya7hThfUkOAOh/3t/PvglYPrL4MuDuR/
ne86pqZVWtXLJkyXxKlCRJmrrdDlxJnpDkSVungeOAm4HLgdP62U4DLuunLwdWJdkryUHAwcA1u7t+SZKkW
TGfU4r7A59OsvV7PlZVn01yLXBpklcDdwKnAFTVLUkuBW4FHgLOqKot86pekiRpBux24KqqfwCePUf7d4AX
PMoya4G1u7tOSZKkWeSd5iVJkhozcEmSJDVm4JIkSWrMwCVJktSYgUuSJKkxA5ckSVJjBi5JkqTGDFySJEm
NGbgkSZIaM3BJkiQ1ZuCSJElqzMAlSZLUmIFLkiSpMQOXJElSYwYuSZKkxgxckiRJjRm4JEmSGjNwSZIkNW
bgkiRJaszAJUmS1JiBS5IkqTEDlyRJUmMGLkmSpMYMXJIkSY0ZuCRJkhozcEmSJDVm4JIkSWrMwCVJktSYg
UuSJKkxA5ckSVJjBi5JkqTGDFySJEmNGbgkSZIaM3BJkiQ1ZuCSJElqzMAlSZLUmIFLkiSpMQOXJElSYwYu
SZKkxiYeuJKckOS2JBuTrJn0+iVJkiZtooErySLgg8CLgEOAVyQ5ZJI1SJIkTdqkj3AdBWysqn+oqn8CLgF
OmnANkiRJEzXpwLUUuGvk/aa+TZIkabBSVZNbWXIKcHxVvaZ//0rgqKp60zbzrQZW929/
BbhtYkXCvsC3J7i+SRpy38D+zTr7N7uG3Dewf7Nu0v37papasm3j4gkWAN0RreUj75cBd287U1WdB5w3qaJ
GJVlfVSunse7Whtw3sH+zzv7NriH3DezfrFso/
Zv0KcVrgYOTHJTk54BVwOUTrkGSJGmiJnqEq6oeSvJG4HPAIuCCqrplkjVIkiRN2qRPKVJVVwBXTHq9u2Aq
pzInZMh9A/s36+zf7Bpy38D+zboF0b+JDpqXJEnaE/
loH0mSpMYMXJIkSY0ZuCRJkhozcI1I8oZp1zBuSVYmeUmS30nyL6ddT0tD2n5JDkzy1H56RZKXJTlsymU1N
bDtlyTPTfLS/v+/5ybJtOvSzhny9kvyc6N9SfL8JG9J8qJp1jVOC3X/
OfGrFBeKJH+wbRNwZpLHAVTV2ZOvanyS/GvgvcD3gSOBvwX2SfJT4JVVddd2Fl/
whrz9kqwBXgc8mOQ9wFvptt+7kpw/
y33bauDb7zjgHOAbwLf65mXAv0jyhqr6y6kVNwZJVgLvpuvbmcAFdM/J/
XtgdVX93RTLm7ehbz+6+2EeC3wvyR8CL6G7c8AfJHleVZ05zeLmayHvP/
fYwAW8i+6X7Ba6nT109wZ70tQqGq8/A46rqs1JDgLOrqpjkrwQOB84bqrVzd+Qt98rgUOAxwN3AL/
cb8cnAF8FZjaMjBjy9ns/8JtVdcdoY///4RXAM6dR1BidA7wDeCrwv4Hfr6oXJnlB/
9mvTbG2cRj69ltUVd/rp18O/EZV/STJWcD1dCF6li3Y/eeefErxULod/
BOAd1fVu4DvVdW7+ulZt6iqNvfTdwK/BFBV6xjGA8OHvP22VNVP6I5O/gT4DkBV/
WiaRY3ZkLffYrrHmG3rW8BjJ1xLC4+tqiur6uNAVdUn6SauAh433dLGYujb74cjp9e+zSPbbDHDyAQLdv+5
xx7hqqo7gZclOQlYl+R9065pzNYnOR+4CjgJ+AJAksfT/aGbaQPfftcn+RhdGLkKuDDJZ4F/
A9w61crGZODb7wLg2iSXAFtP3S+ne5TZ+VOranz+b3/a7SlAJTm5qv5HP4xhy5RrG4ehb7/
XAxcn+RpwP93fiquBZwF/OtXKxmPB7j+98Sk/
CyHvAp5bVc+bdj3jkOSxwGvpDq1+je4xSluS7A3sV1XfnGqBYzS07ZdkMXAKUMAn6cbH/Hu6I5UfXAj/
UhunoW0/gCTPpPuHzlK6U6abgMurauYDc5JnA/
8VeBj4feB04FTgbroxXH87xfLGIskhwIsZ4PYDSLKIbljJM3jkiN7nqur706xrHObYfz4XeAULYP9p4JJmQ
JL9qur+adchJXku8PWq+kH/D7gzgV+lG4/3p1X1g6kWKC1QQzhfO3ZJrpx2DfOV5IlJ/
iTJzUl+kGRzkq8kedW0axuHJNcneXuSp0+7lnFL8rRtX8A1Sfbpp2fekLff9gxh30J3ym3rUYL3013ocBbw
Y+DD0ypqXNLdSufzST6aZHmSdUm+n+TaJEdMu775SvKUJGcl+XqS7/
SvDX3bU6dd33wlec5C3X577BiuJL/6aB8Bh0+wlFYuBj4NnAD8O7rz2ZcAb0/
yjKp62zSLG4N96K6S+nySe4GPA/+9qu6ealXj8W1g21O+S+muICrglyde0fgNdvvtAfuWx1TVQ/
30yqra2t8vJblhSjWN09CvwrwU+Gvg2Kq6FyDJLwCnAZ8AXjjF2sbhgyzQ7bfHnlJMsgW4mkcuSR91dFXtP
eGSxirJ16rq2SPvr62q5yR5DHBrVc30TVCTXL91R5/kN+jO0b8U2AB8vKoWxNPhd0eStwK/
CfxhVd3Ut91eVQdNt7LxGfj2G/q+5RPAFVX14SQfphsXsz7JM4CLq+o5Uy5xXpL8XVUd0U/
fWVUHzvXZrEpyW1X9yq5+NisW8vbbY49w0e3YX1dV39j2gyQzfVPQ3o+S/
HpVfSnJ7wDfBaiqh5Nh3DF5q6r6G+BvkryJ7l9nLwdm9g92Vb2nv0Lqff3v4jvojmwN0tC2H8Pft7wGeH+S
t9Mdjf1y36+7+s9m3dCvwvxmkj8CLqyq+wCS7A+8ikeuypxlC3b77cmB6508+hi2N02wjlZOBz7U/
6vzZuB3AZIsoTvkOuv+ftuGqtoCfLZ/zbSq2gSckuTFwDq6m/gNyZC33zsZ8L6lHxT/
qiRPoju9vRjYtPWP9wC8nkeuwjweOL0/
knc3sHqahY3Jy4E1wNV90CrgPuByuuEns26u7fcRuvuovXaKde25pxTnkuSiqjp12nW0kOTX6W4vcPMAHk0
xp6Fuv/
5KsIuq6pRp1zJO6Z7tuRT4alX940j7CVU1s6Grv4pvQ1X9cOQqviPo7gHkVXwzoN+GD1fVtUkOpRsLu6Gqr
phyafO2zVWmj6cLX4O6yjTdbVl+kQW2b9ljA1eSy7dtAp5PN5iQqnrxxIsaoyTXVNVR/fRrgDfSDaI/
DvifVXXWNOubryFvvzn6Bt1N+2a+b1v1pw/fSHf67XDgzVV1Wf/Zz8Z3zaIktwDPrqqHkpxHd/
XeJ4EX9O0vnWqB2q4k7wBeRHfkbh3dP1SvphtX+bmqWjvF8uZtjt/PHwGfYiC/n0n+M/
AG4OsssH3LnnxKcTldov9vdIdUA6yke+DzEIw+guJ1wAure57Ue4Cv0F3GPcuGvP2W0R0NGe3bcxhG37ZaD
RxZVf+YZAXwySQrqur9zD3YfJYM/Sq+oXsZ3R/qvYB7gWX90cp30z2Lb6YDF8P//
XwtXb8W3L5lT74P15HAdcAfAz+oqi8AP6mqq6vq6qlWNh6PSXffpp+nO5K5GX72PKmHtr/
oTBjy9lvJcPu21aKth/qre0jwscCLkpzN7Aeum5P8p376a0lWAvTjKX86vbK0kx6qqi1V9WPg/
1TVDwGqez7fw9MtbSyG/vu5YPcte+wRrqp6mO4qsE/
0P+9jWP89nkL3Rzt0V2r8QlXdm+SJzP4ftEFvvyH3bcS9SQ6vqhsA+n+N/jbdTTX/
1VQrm7+hX8U3dP+U5PF94Dpya2OSpzCMwDX0388Fu2/
ZY8dwbSvJicAxA7gh6Hb1gyT3r6rbp13LOA15+w2xb0mW0R1JuHeOz46pYTyPb6hX8Q1akr2q6sE52vcFDt
h6b7xZN9Tfz4W8bzFwSZIkNbYnj+GSJEmaCAOXJElSYwYuSRqRZEWSmx/
lsy9svapLknaFgUuSekmGdjWopAXCnYukmdXf2PB/VdVh/
fu3Ak+ke1j76+nuOXdrVa1K8gTgz+kuDV8MvLOqLkvyKuBE4HHAE+ifO9p/397Ah4FD6O6Kv/
dkeiZpaAxckoZoDXBQVT2Y5Kl92x8Df11Vv9u3XZPkr/rPfg14VlV9tw9xW50O/
LiqnpXkWcD1kylf0tB4SlHSEN0IXJzkP/LIkxWOA9b0jy/5At0RrQP7z9ZV1Xfn+J7nAR8FqKob++
+VpF1m4JI0yx7i/9+PPa7/eSLwQfpHQPVjswL826o6vH8dWFUb+vl/
tJ11eLNCSfNm4JI0y+4D9kvy80n2An6bbr+2vKo+D/wR8FS6cV2fA96UJABJjtiJ7/8i8B/
6+Q8DnjX2HkjaIziGS9LMqqqfJvkT4KvA7cDXgUXAR/tn3wV4X1V9P8l/
Af4MuLEPXXfQBbTtORf4cJIbgRuAa1r0Q9Lw+WgfSZKkxjylKEmS1JiBS5IkqTEDlyRJUmMGLkmSpMYMXJI
kSY0ZuCRJkhozcEmSJDVm4JIkSWrs/wGMzu862nspTwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 720x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"ratings_grouped_by_users['rating']
['size'].sort_values(ascending=False).head(10).plot(kind='bar', figsize = (10,5))"
]
},
{
"cell_type": "markdown",
"id": "338623bf",
"metadata": {},
"source": [
"### Movies with high average rating"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "d3e78409",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Ankita Sahoo\\AppData\\Local\\Temp\\
ipykernel_19000\\3835205093.py:1: FutureWarning: ['title', 'genres'] did not
aggregate successfully. If any error is raised this will raise in a future version
of pandas. Drop these columns/ops to avoid this warning.\n",
" ratings_grouped_by_movies =
merge_ratings_movies.groupby('movieId').agg([np.mean], np.size)\n"
]
},
{
"data": {
"image/png":
"iVBORw0KGgoAAAANSUhEUgAAAdAAAAFlCAYAAABbWrnGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIH
ZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/
YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAgCUlEQVR4nO3de5hddX3v8ffHoNBEE2wDNCdBB2mKAlGQEW
sVa8FUvAHeWjyo0NLmeK3VUhse7619DvVS0ePRY0TkUkUplXqJCpQDYi1eJpCQBEQQU0jABkqJYI5o4Hv+2
GvKdpyQyZrZe0+Y9+t59rP3/
v1+a63vmocnH35rrb1WqgpJkrRzHjboAiRJ2hUZoJIktWCASpLUggEqSVILBqgkSS0YoJIktbDboAuYLubP
n19DQ0ODLkOSNI2sWrXqjqraa7w+A7QxNDTEyMjIoMuQJE0jSf5te30ewpUkqQUDVJKkFgxQSZJaMEAlSWr
BAJUkqQUDVJKkFvwZS2Ptpi0MLV856DIkSZO04bTn92U7zkAlSWrBAJUkqQUDVJKkFgxQSZJa6FmAJjkzye
Yk68bpOyVJJZnffB9K8v+SrG5e/6dr7B8kuSbJ+iTv7Wp/
bJJLm77Lkywas425STYl+Uiv9lGSNHP1cgZ6FnD02MYk+wJLgZvHdP2gqg5pXq9uxv4a8D7gqKo6CNgnyVH
N+PcD51TVE4G/Av7nmPX9NfD1qdoZSZK69SxAq+oK4M5xuj4IvAWoCazmccD3q+r25vs/
Ay9pPh8IXNp8vgw4dnShJIcB+wAX73zlkiTtWF/
PgSY5BthUVWvG6d4vydVJvp7kiKbtRuDxzSHe3YDjgH2bvjU8EKYvAh6V5NeSPAz4APAXE6hnWZKRJCP3bd
0yiT2TJM00fQvQJLOBtwLvGKf7NuAxVXUo8GbgM0nmVtV/
Aq8BPgd8A9gAbGuWOQX4nSRXA78DbGr6Xgt8papu2VFNVbWiqoaranjW7HmT2j9J0szSzzsR7Q/
sB6xJArAIuCrJ4VX1I+BegKpaleQHwG8CI1X1JeBL0JkxAvc1424FXty0PxJ4SVVtSfI04IgkrwUeCTwiyT
1VtbyP+ypJeojrW4BW1Vpg79HvSTYAw1V1R5K9gDur6r4kjwMWAzc14/
auqs1JHk1ndvn7Tfv8Zpn7gVOBM5vtnNC1jZOabRiekqQp1cufsZwHXAkckGRjkpMfZPgzgWuSrAEuAF5dV
aMXIH0oybXAN4HTqur7TfuzgOuTfJ/OBUN/
04v9kCRpPKmayMWwD327L1hcC048fdBlSJImaSpvJp9kVVUNj9fnnYgkSWrBAJUkqQWfB9pYsnAeI316hpw
kadfnDFSSpBYMUEmSWjBAJUlqwQCVJKkFA1SSpBYMUEmSWjBAJUlqwQCVJKkFA1SSpBYMUEmSWjBAJUlqwQ
CVJKkFA1SSpBYMUEmSWjBAJUlqweeBNtZu2sLQ8pWDLkOSNEkb+vRsZ2egkiS1YIBKktSCASpJUgsGqCRJL
Uy7AE2yZ5ILknwvyXVJnpbkZUnWJ7k/yXDX2Eck+VSStUnWJHlW0z47ycpmHeuTnDao/
ZEkPTRNuwAFPgR8raoeDzwJuA5YB7wYuGLM2D8BqKolwFLgA0lG9+n9zToOBZ6e5Ln9KF6SNDNMq5+xJJkL
PBM4CaCqfgb8DLir6R+7yIHApc3YzUnuAoar6jvAZaPrSHIVsKjnOyBJmjGm2wz0ccDtwKeSXJ3kjCRzHmT
8GuDYJLsl2Q84DNi3e0CSPYEX0gStJElTYboF6G7Ak4GPVdWhwE+A5Q8y/
kxgIzACnA78K7BttDPJbsB5wIer6qaxCydZlmQkych9W7dM2U5Ikh76pluAbgQ2VtW3m+8X0AnUcVXVtqp6
U1UdUlXHAnsCN3QNWQHcUFWnb2f5FVU1XFXDs2bPm5IdkCTNDNMqQKvqR8AtSQ5omo4Crt3e+OZq2znN56X
Atqq6tvn+HmAe8Gc9LVqSNCNNq4uIGm8APp3kEcBNwB8meRHwv4C9gJVJVlfVc4C9gYuS3A9sAl4JkGQR8F
bge8BVzcVHH6mqM/
q+N5Kkh6RpF6BVtRoYHtN8YfMaO3YDcMA47RuBX7pkV5KkqTKtDuFKkrSrMEAlSWrBAJUkqYVpdw50UJYsn
MdInx7CKkna9TkDlSSpBQNUkqQWDFBJklowQCVJasEAlSSpBQNUkqQWDFBJklowQCVJasEAlSSpBQNUkqQW
DFBJklowQCVJasEAlSSpBQNUkqQWDFBJklrweaCNtZu2MLR85aDLkCRN0oY+PdvZGagkSS0YoJIktWCASpL
UggEqSVILPQvQJGcm2ZxkXVfbrya5JMkNzfujm/
alSVYlWdu8H9m1zGFN+41JPpwkTftjklyW5Ook1yR53pjtz02yKclHerWPkqSZq5cz0LOAo8e0LQcurarFw
KXNd4A7gBdW1RLgRODcrmU+BiwDFjev0XW+DTi/
qg4Fjgc+OmZbfw18fUr2RJKkMXoWoFV1BXDnmOZjgbObz2cDxzVjr66qW5v29cAeSXZPsgCYW1VXVlUB54w
uAxQwt/k8DxhdniSHAfsAF0/
lPkmSNKrf50D3qarbAJr3vccZ8xLg6qq6F1gIbOzq29i0AbwLeEWSjcBXgDcAJHkY8AHgL3ZUTJJlSUaSjN
y3dUu7PZIkzUjT6iKiJAcBfwv8j9GmcYZV8/5y4KyqWgQ8Dzi3Cc/
XAl+pqlt2tL2qWlFVw1U1PGv2vMnvgCRpxuj3nYj+PcmCqrqtOTy7ebQjySLgQuBVVfWDpnkjsKhr+UU8cK
j2ZJrzoVV1ZZI9gPnA04AjkrwWeCTwiCT3VNVyJEmaIv2egX6RzkVCNO9fAEiyJ7ASOLWqvjk6uDnMe3eS3
2quvn3V6DLAzcBRzfJPAPYAbq+qE6rqMVU1BJwCnGN4SpKmWi9/
xnIecCVwQJKNSU4GTgOWJrkBWNp8B3g98BvA25Osbl6j50dfA5wB3Aj8APhq0/7nwJ8kWQOcB5zUXGgkSVL
Pxczp2H3B4lpw4umDLkOSNElTeTP5JKuqani8vml1EZEkSbsKA1SSpBZ8HmhjycJ5jPTpGXKSpF2fM1BJkl
owQCVJasEAlSSpBQNUkqQWDFBJklowQCVJasEAlSSpBQNUkqQWDFBJklowQCVJasEAlSSpBQNUkqQWDFBJk
lowQCVJasEAlSSpBQNUkqQWfKB2Y+2mLQwtXznoMiRJk7ThtOf3ZTvOQCVJasEAlSSpBQNUkqQWehagSc5M
sjnJuq62X01ySZIbmvdHN+1Lk6xKsrZ5P7Jpn51kZZLvJVmf5LSudT0zyVVJtiV5aVf77yZZ3fX6aZLjerW
fkqSZqZcz0LOAo8e0LQcurarFwKXNd4A7gBdW1RLgRODcrmXeX1WPBw4Fnp7kuU37zcBJwGe6N1BVl1XVIV
V1CHAksBW4eIr2SZIkoIcBWlVXAHeOaT4WOLv5fDZwXDP26qq6tWlfD+yRZPeq2lpVlzVjfgZcBSxqvm+oq
muA+x+kjJcCX62qrVOwS5Ik/
Zd+nwPdp6puA2je9x5nzEuAq6vq3u7GJHsCL6Qzc52o44Hz2pUqSdL2TavfgSY5CPhb4PfGtO9GJwg/
XFU3TXBdC4AlwEUPMmYZsAxg1ty9WlYtSZqJ+j0D/
fcm2EYDbvNoR5JFwIXAq6rqB2OWWwHcUFWn78S2fh+4sKp+vr0BVbWiqoaranjW7Hk7sWpJ0kzX7wD9Ip2L
hGjevwD/dXh2JXBqVX2ze4Ek7wHmAX+2k9t6OR6+lST1SC9/
xnIecCVwQJKNSU4GTgOWJrkBWNp8B3g98BvA27t+frJ3Myt9K3AgcFXT/
sfN+p+SZCPwMuDjSdZ3bXsI2Bf4eq/2T5I0s/XsHGhVvXw7XUeNM/
Y9wHu2Mz7bWf93aa7IHadvA7Bwx1VKktSOdyKSJKkFA1SSpBYMUEmSWphWvwMdpCUL5zHSp2fISZJ2fc5AJ
UlqwQCVJKkFA1SSpBYMUEmSWjBAJUlqwQCVJKkFA1SSpBYMUEmSWjBAJUlqwQCVJKkFA1SSpBYMUEmSWjBA
JUlqwQCVJKkFA1SSpBZ8Hmhj7aYtDC1fOegyJEmTtKFPz3Z2BipJUgsGqCRJLRigkiS1YIBKktTCtAvQJHs
muSDJ95Jcl+RpSd7XfL8myYVJ9uwaf2qSG5Ncn+Q5Xe1/
k+SWJPcMZEckSQ9p0y5AgQ8BX6uqxwNPAq4DLgEOrqonAt8HTgVIciBwPHAQcDTw0SSzmvV8CTi8z7VLkma
IaRWgSeYCzwQ+CVBVP6uqu6rq4qra1gz7FrCo+Xws8NmqureqfgjcSBOaVfWtqrqtv3sgSZopHvR3oEnWAr
W9/mZGOJUeB9wOfCrJk4BVwBur6iddY/
4I+FzzeSGdQB21sWmbkCTLgGUAs+buNYmyJUkzzY5moC8AXgh8rXmd0Ly+AlzQg3p2A54MfKyqDgV+Aiwf7
UzyVmAb8OnRpnHWsd3A/
6WBVSuqariqhmfNnte+aknSjPOgM9Cq+jeAJE+vqqd3dS1P8k3gr6a4no3Axqr6dvP9ApoATXIinUA/
qqqqa/y+XcsvAm6d4pokSfolEz0HOifJM0a/JPltYM5UF1NVPwJuSXJA03QUcG2So4G/
BI6pqq1di3wROD7J7kn2AxYD35nquiRJGmui98I9GTgzyehxzrvonIvshTcAn07yCOAm4A+B7wK7A5ckAfh
WVb26qtYnOR+4ls6h3ddV1X0ASd4L/HdgdpKNwBlV9a4e1SxJmmHywNHQCQzuXCWbqtrSu5IGY/
cFi2vBiacPugxJ0iRN5c3kk6yqquHx+nZ0Fe6bt9MOQFX93aSrkyRpF7SjQ7iP6ksVkiTtYnZ0Fe67+1WIJ
Em7kgldRJTkN4GPAftU1cFJnkjnitj39LS6PlqycB4jfXoIqyRp1zfRn7F8gs79Z38OUFXX0LkHrSRJM9JE
A3R2VY39feW2cUdKkjQDTDRA70iyP81t8pK8FPBG7ZKkGWuiN1J4HbACeHySTcAPgVf0rCpJkqa5CQVoVd0
EPDvJHOBhVXV3b8uSJGl629GNFF5RVX8/9oYK3khBkjTT7WgGOnrDeG+oIElSlx3dSOHjzcePVtXtfahHkq
RdwkSvwv3XJBcnOTnJo3takSRJu4AJBWhVLQbeBhwErEry5SRehStJmrEmOgOlqr5TVW8GDgfuBM7uWVWSJ
E1zEwrQJHOTnJjkq8C/0rmJwuE9rUySpGlsojdSWAP8E/
BXVXVl78qRJGnXMNEAfVxVVZJHJXlkVd3T06okSZrmJnoO9KAkVwPrgGuTrEpycA/
rkiRpWpvoDHQF8OaqugwgybOatt/
uTVn9t3bTFoaWrxx0GZKkSdrQp2c7T3QGOmc0PAGq6nIeuEuRJEkzzkRnoDcleTtwbvP9FXSeyCJJ0ow00R
noHwF7Af8IfB6YD5zUo5okSZr2Jhqg+wP7NuMfDhwFXNGroiRJmu4mGqCfBs4EXgy8oHm98MEWSHJmks1J1
o3Td0qSSjK/
+X54ktXNa02SF3WNvTzJ9V39ezftJyW5vav9j7uW+dsk65rXH0xwHyVJmrCJngO9vaq+tJPrPgv4CHBOd2O
SfYGlwM1dzeuA4aralmQBsCbJl6pqW9N/QlWNjLONz1XV68es//
nAk4FDgN2Bryf5alX9eCfrlyRpuyYaoO9McgZwKXDvaGNVfX57C1TVFUmGxun6IPAW4AtdY7d29e8B1ATrG
s+BwNeb8N2WZA1wNHD+JNYpSdIvmOgh3D+kM6M7ms6h2xfSOYy7U5IcA2yqqjXj9D01yXpgLfDqrtknwKea
w7RvT5Ku9pckuSbJBc3MFjq3HXxuktnNIeLfpXP+drx6liUZSTJy39YtO7s7kqQZbKIz0CdV1ZLJbCjJbOC
twO+N119V36Zzx6MnAGc3h11/Sufw7aYkj6JzFfAr6RwW/
hJwXlXdm+TVdJ4Oc2RVXZzkKXRuen87cCWwbTvbXEHnhhDsvmDxZGa9kqQZZqIz0G8lOXCS29of2I/
O+c0NwCLgqiS/3j2oqq4DfgIc3Hzf1LzfDXyG5ikwVfUfVTV6OPkTwGFd6/
ibqjqkqpYCAW6YZO2SJP2Cic5AnwGcmOSHdM6BBqiqeuJEN1RVa4G9R783ITpcVXck2Q+4pbmI6LHAAcCGJ
LsBezZjHk7nsPE/
N8svqKrbmtUdA1zXtM9qlvmPJE8EnghcPNE6JUmaiIkG6NE7u+Ik5wHPAuYn2Qi8s6o+uZ3hzwCWJ/
k5cD/w2iY05wAXNeE5i054fqJZ5k+bc6rb6Dzg+6Sm/eHAN5pTpT8GXjHmfKokSZOWKk/
9Qecc6IITTx90GZKkSZrKm8knWVVVw+P1TfQcqCRJ6mKASpLUwkTPgT7kLVk4j5E+PUNOkrTrcwYqSVILBq
gkSS0YoJIktWCASpLUggEqSVILBqgkSS0YoJIktWCASpLUggEqSVILBqgkSS0YoJIktWCASpLUggEqSVILB
qgkSS0YoJIkteDzQBtrN21haPnKQZchSZqkDX16trMzUEmSWjBAJUlqwQCVJKkFA1SSpBZ6FqBJzkyyOcm6
cfpOSVJJ5jffD0+yunmtSfKirrGXJ7m+q3/vpv2ZSa5Ksi3JS8es/
2tJ7kry5V7tnyRpZuvlDPQs4OixjUn2BZYCN3c1rwOGq+qQZpmPJ+m+QviEqjqkeW1u2m4GTgI+M8623we8
crI7IEnS9vQsQKvqCuDOcbo+CLwFqK6xW6tqW/N1j+6+B1n/hqq6Brh/
nL5Lgbvb1C1J0kT09RxokmOATVW1Zpy+pyZZD6wFXt0VqACfag7fvj1J+lWvJEnb07cATTIbeCvwjvH6q+r
bVXUQ8BTg1CR7NF0nVNUS4IjmNWWHZpMsSzKSZOS+rVumarWSpBmgnzPQ/YH9gDVJNgCLgKuS/
Hr3oKq6DvgJcHDzfVPzfjed852HT1VBVbWiqoaranjW7HlTtVpJ0gzQtwCtqrVVtXdVDVXVELAReHJV/
SjJfqMXDSV5LHAAsCHJbl1X6j4ceAGdC44kSRqoXv6M5TzgSuCAJBuTnPwgw59BZ2a6GrgQeG1V3QHsDlyU
5BpgNbAJ+ESz/qck2Qi8jM5Vu+u7tv0N4B+Ao5ptP2fKd1CSNKP17GbyVfXyHfQPdX0+Fzh3nDE/
AQ7bzvLfpXMYeLy+I3amVkmSdpZ3IpIkqQUDVJKkFgxQSZJa8IHajSUL5zHSp4ewSpJ2fc5AJUlqwQCVJKk
FA1SSpBYMUEmSWjBAJUlqwQCVJKkFA1SSpBYMUEmSWjBAJUlqwQCVJKkFA1SSpBYMUEmSWjBAJUlqwQCVJK
kFA1SSpBZ8Hmhj7aYtDC1fOegyJEmTtKFPz3Z2BipJUgsGqCRJLRigkiS1YIBKktRCzwI0yZlJNidZN07fK
Ukqyfzm++FJVjevNUle1DX2sCRrk9yY5MNJ0rS/
umlfneRfkhzYtczXktyV5Mu92j9J0szWyxnoWcDRYxuT7AssBW7ual4HDFfVIc0yH08yeoXwx4BlwOLmNbr
Oz1TVkmaZ9wJ/
17W+9wGvnKodkSRprJ4FaFVdAdw5TtcHgbcA1TV2a1Vta77uMdqXZAEwt6qurKoCzgGOa5b5cdc654xZ36X
A3VO2M5IkjdHX34EmOQbYVFVrmiOx3X1PBc4EHgu8sqq2JVkIbOwathFY2LXM64A3A48AjmxRzzI6s1tmzd
1rZxeXJM1gfbuIKMls4K3AO8brr6pvV9VBwFOAU5PsAWS8oV3L/O+q2h/
4S+BtO1tTVa2oquGqGp41e97OLi5JmsH6eRXu/sB+wJokG4BFwFVJfr17UFVdB/wEOJjOjHNRV/
ci4NZx1v1ZmkO7kiT1Q98CtKrWVtXeVTVUVUN0wvHJVfWjJPuNXjSU5LHAAcCGqroNuDvJbzVX374K+EIzb
nHX6p8P3NCvfZEkqWfnQJOcBzwLmJ9kI/DOqvrkdoY/A1ie5OfA/cBrq+qOpu81dK7o/
RXgq80L4PVJng38HPhP4MSubX8DeDzwyGbbJ1fVRVO4e5KkGa5nAVpVL99B/
1DX53OBc7czboTO4dyx7W98kHUfMeFCJUlqwTsRSZLUggEqSVILPg+0sWThPEb69Aw5SdKuzxmoJEktGKCS
JLVggEqS1IIBKklSCwaoJEktGKCSJLVggEqS1IIBKklSCwaoJEktGKCSJLVggEqS1IIBKklSCwaoJEktGKC
SJLVggEqS1IIBKklSCz5Qu7F20xaGlq8cdBmSpEnacNrz+7IdZ6CSJLVggEqS1IIBKklSCz0L0CRnJtmcZF
1X268muSTJDc37o7v6Tk1yY5Lrkzynq/3ypm1189q7aT8pye1d7X/
ctcxjklyc5Lok1yYZ6tV+SpJmpl7OQM8Cjh7Tthy4tKoWA5c230lyIHA8cFCzzEeTzOpa7oSqOqR5be5q/
1xX+xld7ecA76uqJwCHA93LSJI0aT0L0Kq6ArhzTPOxwNnN57OB47raP1tV91bVD4Eb6QTfTmvCeLequqSp
456q2tpmXZIkbU+/
z4HuU1W3ATTvezftC4FbusZtbNpGfao5TPv2JOlqf0mSa5JckGTfpu03gbuSfD7J1UneN2Y2K0nSpE2Xi4g
yTls17ydU1RLgiOb1yqb9S8BQVT0R+GcemNnu1ow7BXgK8DjgpHE3mixLMpJk5L6tW6ZiPyRJM0S/A/
TfkywAaN5Hz01uBPbtGrcIuBWgqjY173cDn6E5tFtV/
1FV9zbjPwEc1rWuq6vqpqraBvwT8OTxiqmqFVU1XFXDs2bPm5o9lCTNCP0O0C8CJzafTwS+0NV+fJLdk+wH
LAa+k2S3JPMBkjwceAGwrvm+oGu9xwDXNZ+/Czw6yV7N9yOBa3u0P5KkGapnt/
JLch7wLGB+ko3AO4HTgPOTnAzcDLwMoKrWJzmfTtBtA15XVfclmQNc1ITnLDqHaj/
RbOJPkxzTjL+T5jBts9wpwKXN+dJVXctIkjQlUlU7HjUD7L5gcS048fRBlyFJmqSpvBduklVVNTxe33S5iE
iSpF2KASpJUgsGqCRJLfg80MaShfMY6dMz5CRJuz5noJIktWCASpLUggEqSVILBqgkSS0YoJIktWCASpLUg
gEqSVILBqgkSS0YoJIktWCASpLUggEqSVILBqgkSS0YoJIktWCASpLUggEqSVILPg+0sXbTFoaWrxx0GZKk
SdrQp2c7OwOVJKkFA1SSpBYMUEmSWjBAJUlqYSABmuRNSdYnWZfkvCR7JDkkybeSrE4ykuTwMcs8Jsk9SU4
ZZ31fTLJuzNjLklyd5Jokz+vHfkmSZo6+B2iShcCfAsNVdTAwCzgeeC/
w7qo6BHhH873bB4GvjrO+FwP3jGl+G3B+VR3arPujU7kPkiQN6hDubsCvJNkNmA3cChQwt+mf17QBkOQ44C
ZgffdKkjwSeDPwnjHr3+66JEmaCn3/HWhVbUryfuBm4P8BF1fVxUluAS5q+h4G/DZAkjnAXwJLgbGHb/
8a+ACwdUz7u4CLk7wBmAM8e7xakiwDlgHMmrvX5HdOkjRjDOIQ7qOBY4H9gP8GzEnyCuA1wJuqal/
gTcAnm0XeDXywqu4Zs55DgN+oqgvH2czLgbOqahHwPODcJL+0r1W1oqqGq2p41ux5U7ODkqQZYRB3Ino28M
Oquh0gyefpzDZPAN7YjPkH4Izm81OBlyZ5L7AncH+SnwL3AYcl2UBnP/ZOcnlVPQs4GTgaoKquTLIHMB/
Y3PO9kyTNCIMI0JuB30oym84h3KOAETrnKX8HuBw4ErgBoKqOGF0wybuAe6rqI03Tx5r2IeDLTXiObuMo4K
wkTwD2AG7v4T5JkmaYQZwD/
XaSC4CrgG3A1cCK5v1DzYVFP6U5N9nSnwOfSPImOhcUnVRVNbnKJUl6QMyVjt0XLK4FJ54+6DIkSZM0lTeT
T7KqqobH6/NORJIktWC
ASpLUggEqSVILPlC7sWThPEb69BBWSdKuzxmoJEktGKCSJLVggEqS1IIBKklSCwaoJEktGKCSJLVggEqS1I
L3wm0kuRu4ftB17CLmA3cMuohdgH+nifNvNTH+nSZmKv9Oj62qvcbr8EYKD7h+ezcM1i9KMuLfasf8O02cf
6uJ8e80Mf36O3kIV5KkFgxQSZJaMEAfsGLQBexC/
FtNjH+nifNvNTH+nSamL38nLyKSJKkFZ6CSJLVggAJJjk5yfZIbkywfdD3TVZIzk2xOsm7QtUxnSfZNclmS
65KsT/LGQdc0HSXZI8l3kqxp/k7vHnRN01mSWUmuTvLlQdcynSXZkGRtktVJRnq6rZl+CDfJLOD7wFJgI/
Bd4OVVde1AC5uGkjwTuAc4p6oOHnQ901WSBcCCqroqyaOAVcBx/
jf1i5IEmFNV9yR5OPAvwBur6lsDLm1aSvJmYBiYW1UvGHQ901WSDcBwVfX897LOQOFw4MaquqmqfgZ8Fjh2
wDVNS1V1BXDnoOuY7qrqtqq6qvl8N3AdsHCwVU0/1XFP8/XhzWtm/x/
9diRZBDwfOGPQtegBBmjnH7Zbur5vxH/sNEWSDAGHAt8ecCnTUnNYcjWwGbikqvw7je904C3A/
QOuY1dQwMVJViVZ1ssNGaCQcdr8v2BNWpJHAv8I/FlV/
XjQ9UxHVXVfVR0CLAIOT+KpgTGSvADYXFWrBl3LLuLpVfVk4LnA65pTTz1hgHZmnPt2fV8E3DqgWvQQ0ZzT
+0fg01X1+UHXM91V1V3A5cDRg61kWno6cExzbu+zwJFJ/
n6wJU1fVXVr874ZuJDOabqeMEA7Fw0tTrJfkkcAxwNfHHBN2oU1F8d8Eriuqv5u0PVMV0n2SrJn8/
lXgGcD3xtoUdNQVZ1aVYuqaojOv0//t6peMeCypqUkc5oL90gyB/g9oGe/GpjxAVpV24DXAxfRudjj/
KpaP9iqpqck5wFXAgck2Zjk5EHXNE09HXglnZnC6ub1vEEXNQ0tAC5Lcg2d/5G9pKr8iYYmYx/
gX5KsAb4DrKyqr/
VqYzP+ZyySJLUx42egkiS1YYBKktSCASpJUgsGqCRJLRigkiS1YIBKktSCASpJUgsGqCRJLfx/
BgYve3CqbIAAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 504x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"ratings_grouped_by_movies =
merge_ratings_movies.groupby('movieId').agg([np.mean], np.size)\n",
"ratings_grouped_by_movies = ratings_grouped_by_movies.drop('userId', axis=1)\
n",
"ratings_grouped_by_movies['rating']
['mean'].sort_values(ascending=False).head(10).plot(kind='barh', figsize=(7,6));"
]
},
{
"cell_type": "markdown",
"id": "c68d10e3",
"metadata": {},
"source": [
"### Movies with low average rating"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "d47e44a6",
"metadata": {},
"outputs": [
{
"data": {
"image/png":
"iVBORw0KGgoAAAANSUhEUgAAAcMAAAEvCAYAAAA5AKonAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIH
ZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/
YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAArY0lEQVR4nO3de5xVZfn38c9XQBANRZEeBH8NGEogE+JASm
YoimSmpmYqgafCylPmIdBMS1N7NFOzMkvUlJ+aqL8nD4WZEYkWv0EQEDTUEAdNBIskTxyu54+1ZtwMc9gz7
NPs/X2/
XvOave51r7XuBbov1lr3ui5FBGZmZpVsq2IPwMzMrNgcDM3MrOI5GJqZWcVzMDQzs4rnYGhmZhXPwdDMzCp
e52IPIF969eoVVVVVxR6GmZmViLlz566KiJ2bWle2wbCqqora2tpiD8PMzEqEpJebW+fbpGZmVvHydmUoaS
pwGLAyIvZM2y4FvgK8kXa7MCIekTQeOD9j82pgeETMz9jfb4AB9ftqzcIVa6ia/
PAWn4eZdUzLrvpssYdgHUg+rwxvA8Y10f6jiBiW/
jwCEBHT6tuACcCyRoHwKGBtHsdqZmYVLG9XhhExS1JVOzY9HrirfkHSdsA3gUnAr3MzOjOztlm3bh11dXW8
++67xR6KtaJbt27069ePLl26ZL1NMSbQnCFpIlALnBsR/2y0/ovAERnLlwE/
BN4u0PjMzDZTV1fHhz70IaqqqpBU7OFYMyKC1atXU1dXR//+/
bPertATaH4G7AYMA14jCXINJH0CeDsiFqXLw4CPRsQD2exc0iRJtZJqN7y9JpfjNrMK9+6777LTTjs5EJY4
Sey0005tvoIvaDCMiNcjYkNEbAR+AYxs1OU4Mm6RAvsCe0taBjwB7C5pZgv7vzkiaiKiplP37XM7eDOreA6
EHUN7/p4KGgwl9clY/
DywKGPdVsAXgLvr2yLiZxGxS0RUAfsBf4uI0YUZrZlZ8Uji3HPPbVi+5ppruPTSS/N6zKqqKo4+
+uiG5enTp3PSSSfl9ZilIp+vVtwFjAZ6SaoDLgFGp7c+A1gGnJaxyf5AXUS8lIvjD+27PbWeWm1mHVTXrl2
5//77mTJlCr169SrYcWtra3n22WcZMmRIwY5ZCvJ2ZRgRx0dEn4joEhH9IuKWiJgQEUMjojoiDo+I1zL6z4
yIfVrY37Js3zE0M+voOnfuzKRJk/
jRj3602bqXX36ZMWPGUF1dzZgxY1i+fDkAJ510EmeddRajRo1iwIABTJ8+vWGbq6+
+mhEjRlBdXc0ll1zS7HHPO+88rrjiis3a33zzTY488kiqq6vZZ599WLBgAQCXXnopp5xyCqNHj2bAgAHccM
MNDdvceeedjBw5kmHDhnHaaaexYcOGdv955Jsz0JiZlajTTz+dadOmsWbNphMCzzjjDCZOnMiCBQsYP348Z
511VsO61157jSeeeIKHHnqIyZMnA/Doo4+ydOlS5syZw/z585k7dy6zZs1q8pjHHnssTz/
9NC+88MIm7Zdccgl77bUXCxYs4IorrmDixIkN65577jlmzJjBnDlz+O53v8u6detYsmQJ99xzD7Nnz2b+/
Pl06tSJadOm5eqPJufKNjepmVlH16NHDyZOnMgNN9zANtts09D+1FNPcf/
99wMwYcIELrjggoZ1Rx55JFtttRWDBw/m9ddfB5Jg+Oijj7LXXnsBsHbtWpYuXcr++++/
2TE7derE+eefz5VXXslnPvOZhvYnnniC++67D4ADDzyQ1atXNwTpz372s3Tt2pWuXbvSu3dvXn/
9df7whz8wd+5cRowYAcA777xD7969c/nHk1MOhmZmJewb3/
gGw4cP5+STT262T+bsya5duzZ8joiG31OmTOG0007bbNumTJgwgSuvvHKT54b1+2rquJnH7NSpE+vXryciO
PHEE7nyyiuzOmax+TapmVkJ23HHHTn22GO55ZZbGtpGjRrF3XcnE+
+nTZvGfvvt1+I+DjnkEKZOncratUlWyxUrVrBy5UoAxowZw4oVKzbp36VLF8455xyuu+66hrb999+/
4TbnzJkz6dWrFz169Gj2mGPGjGH69OkNx3nzzTd5+eVmi0YUnYOhmVmJO/
fcc1m1alXD8g033MCtt95KdXU1d9xxB9dff32L248dO5YTTjiBfffdl6FDh3LMMcfw1ltvsXHjRl544QV23
HHHzbY59dRTWb9+fcPypZdeSm1tLdXV1UyePJnbb7+9xWMOHjyYyy+/nLFjx1JdXc3BBx/
Ma6+91uI2xaSmLn1zsuO2Va04GLgK2Bp4Hzg/Ih5Pt9kauJHkNY2NwEURcV9rx+/
aZ2D0OfG6XJ6SmXUgua5asWTJEj72sY/ldJ/FtmjRIqZOncq1115b7KHkXFN/X5LmRkRNU/
3z+czwNpIg9qtG7T+KiGsata0CPhcRr0raE5gB9E3XXUQSUHdPX8zf/
J8wZmbWZnvuuWdZBsL2KImqFRExL2PxWaCbpK4R8R5wCjAo7beRJHCamZnlTDGeGZ4haYGkqZJ6NrH+aGBe
RLwnaYe07TJJT0u6V9KHm9uxE3WbmVl7lFrViiHAD/
ggTVtnoB8wOyKGA08BjW+xNnCibjMza4+SqVohqR/
wADAxIl5Mm1eT1DGsL+F0LzC8gEM2M7MKUBJVK9LboQ8DUyJidn2HSKa6PkgykxRgDLC4EGM1M7PKUSpVK8
4APgpcLOnitG1sRKwEvgXcIek6klcymk/DkMFVK8ys3LzzzjuMGzeOxx9/
nE6dOmW93RVXXMGFF17YsDxq1CiefPLJfAyxoA466CDuvfdeevZsavpJ2+TtPcNiq6mpidra2mIPw8zKROP
31qomP5zT/
WfzXuRPfvIT1q9fz9lnn71J+4YNG1oMjtttt11D9plycvvtt1NXV8dFF1202bq2vmfoDDRmZh3EtGnTOOKI
I4AkJdoBBxzACSecwNChQ4EkSffee+/
NkCFDuPnmmwGYPHky77zzDsOGDWP8+PFAEhzr9zF69GiOOeYYBg0axPjx4xtykD7yyCMMGjSI/
fbbj7POOovDDjusxbHNnDmTT3/60xx77LHsvvvuTJ48mWnTpjFy5EiGDh3Kiy8mU0HeeOMNjj76aEaMGMGI
ESOYPTt5MjZnzhxGjRrFXnvtxahRo3j+
+ecBuO222zjqqKMYN24cAwcO3CQp+eGHH85dd92Vkz9bJ+o2M+sA3n//
fV566SWqqqoa2ubMmcOiRYvo378/AFOnTmXHHXfknXfeYcSIERx99NFcddVV3HjjjcyfP7/J/
c6bN49nn32WXXbZhU9+8pPMnj2bmpoaTjvtNGbNmkX//v05/vjjsxrjM888w5IlS9hxxx0ZMGAAX/
7yl5kzZw7XX389P/7xj7nuuus4++yzOeecc9hvv/
1Yvnw5hxxyCEuWLGHQoEHMmjWLzp0789hjj3HhhRc2VMmYP38+8+bNo2vXruyxxx6ceeaZ7LrrrvTs2ZP33
nuP1atXs9NOO23Rn6+DoZlZB7Bq1Sp22GGHTdpGjhzZEAghyVn6wAPJ5PtXXnmFpUuXthokRo4cSb9+/
QAYNmwYy5YtY7vttmPAgAEN+z7++OMbrjRbMmLECPr0SeZJ7rbbbowdOxaAoUOH8sc//
hGAxx57jMWLP5gH+e9//5u33nqLNWvWcOKJJ7J06VIksW7duoY+Y8aMYfvtk9flBg8ezMsvv8yuu+4KQO/
evXn11VcdDM3MKsE222zDu+++u0nbtttu2/B55syZPPbYYzz11FN0796d0aNHb9a/
Kc2VX2qPzH1ttdVWDctbbbVVQ9LvjRs38tRTT21SnxHgzDPP5IADDuCBBx5g2bJljB49usUx1nv33Xc321d
75O2ZYZphZqWkRRltl0paIWl+
+nNo2r6TpD9KWivpxkb7+WKaseZZSf83X+M1MytlPXv2ZMOGDc0GuDVr1tCzZ0+6d+/
Oc889x1/+8peGdV26dNnkSqs1gwYN4qWXXmLZsmUA3HPPPQ3r5syZs0mV+7YaO3YsN974wdd8/
e3bNWvW0LdvkpL6tttuy2pfEcE//
vGPTW4dt1epJOp+F7gY2DP9AZIgCVwN7B0Rb0i6XdKYiPhDawdfuGJNzmd7mVnHkeuqFaVg7NixPPHEExx0
0EGbrRs3bhw33XQT1dXV7LHHHuyzzz4N6yZNmkR1dTXDhw9vqEnYkm222Yaf/
vSnjBs3jl69ejFyZEN+FJYvX75FV2I33HADp59+OtXV1axfv57999+fm266iQsuuIATTzyRa6+9lgMPPDCr
fc2dO5d99tmHzp23PJTl9dWKNFH3Q41KOK1tIhjW9z8JqImIM9LlEcCVEXFQujwB2Dcivt7asV3CyayylWM
Jp3nz5nHttddyxx135P1Ya9euZbvttiMiOP300xk4cCDnnHMO559/
PhMmTKC6ujrvY2jN2WefzeGHH86YMWM2W9cRXq1oLVF3pheAQZKqJHUGjgR2zfsIzcxK0F577cUBBxzAhg0
b8n6sX/
ziFwwbNowhQ4awZs0aTjstyZFy9dVXl0QghKQEVVOBsD1KKlF3YxHxT+BrwD3An0my1qxvrr+rVphZuTvll
FPalH2mvc455xzmz5/
P4sWLmTZtGt27d8/7MdvqK1/5Ss72VTKJulvY5sGI+ERE7As8Dyxtoa+rVpiZWZuVRKLuVrbpnf7uCXwd+G
V+Rmdm1rJyTV9Zbtrz91QqibqRtAzoAWwt6UiSRN2LgeslfTzt9r2I+Fs2x3eibjPLpW7dujVkOpFU7OFYM
yKC1atX061btzZtl7dgGBFN5e+5pYX+VW3Yj5lZQfXr14+6ujreeOONYg/
FWtGtW7eGrDrZcgYaM7MsdOnSZZPUZ1ZeXLXCzMwqnoOhmZlVPAdDMzOreA6GZmZW8fL5asVU4DBgZX1u0o
x155Ek4N45IlZJOhi4CtgaeB84PyIel/
Qhkswz9foBd0bEN1o7vhN1m1W2ckzUbflT8KoVknYFDgaWZzSvAj4XEa9K2hOYAfSNiLdIUrfVbzsXuD+PY
zYzswqUt9ukETELeLOJVT8CLiB58b6+77yIeDVdfBboJqlr5kaSBgK92fRK0czMbIsVOh3b4cCKiHimhW5H
A/
Mi4r1G7ccD94TzIZmZWY4V7KV7Sd2Bi4CxLfQZAvygmT7HARNaOcYkYBJApx47t3usZmZWWQp5Zbgb0B94J
s1D2g94WtL/
AZDUD3gAmBgRL2ZumOYm7RwRc1s6gKtWmJlZexTsyjAiFpI88wMaEnPXpLNJdwAeBqZExOwmNj8euKsQ4zQ
zs8pT0KoVEdFcou4zgI8CF0u6OG0bGxEr08/
HAoe25fiuWmFmZtkqdNWKzPVVGZ8vBy5voe+A3I3MzMxsU85AY2ZmFc/
B0MzMKp6DoZmZVTwHQzMzq3h5C4aSpkpaKWlRE+vOkxSSeqXLB0uaK2lh+vvAjL5bS7pZ0t8kPSfp6HyN2c
zMKlNJJ+pO111EUvlid0lbATtmc3BXrTCrbK5aYW2Rz1crZkmqamJVfaLu/5fRd17G+oZE3Wl+0lOAQWm/
jSSB08zMLGdKOlF3mpkG4DJJT0u6V9KH8z5QMzOrKAULhhmJur/TQp/
6RN2npU2dSXKYzo6I4cBTwDUtbD9JUq2k2g1vr8nZ2M3MrLyVeqLu1cDbaTvAvcDw5g7gRN1mZtYeBQuGEb
EwInpHRFWaiq0OGB4R/2guUXdau/BBkhynAGOAxYUas5mZVYZ8vlpxF8ltzT0k1Uk6tYXumYm656c/
9RUuvgVcKmkBST3Dc/
M1ZjMzq0wq18LxNTU1UVtbW+xhmJlZiZA0NyJqmlrnDDRmZlbxHAzNzKziORiamVnFczA0M7OK52BoZmYVL
2+5SSVNBQ4jSbK9Z9p2GXAEsBFYCZyUJufuAvyS5IX6zsCvIuLKdJsvkmSu6QQ8HBEXZHN8J+o2M+s4ip1Y
PZ9XhrcB4xq1XR0R1RExDHiID1KzfQHoGhFDgb2B0yRVSdoJuBoYExFDgA9LGpPHMZuZWQXKWzCMiFnAm43
a/p2xuC1Q/5JjANtK6gxsA7wP/BsYAPwtIt5I+z1GksjbzMwsZ/JZz7BJkr4PTATWAAekzdNJbp+
+BnQHzomINyUFMCgtBVUHHAlsXegxm5lZeSv4BJqIuCgidgWmkaRhAxgJbAB2IUnmfa6kARHxT+BrwD3An4
FlwPrm9u2qFWZm1h7FnE3633xwy/
ME4HcRsS4iVgKzgRqAiHgwIj4REfsCzwNLm9uhq1aYmVl7FLq478CMxcOB59LPy4EDldgW2Kd+XX3Cbkk9g
a+TzDo1MzPLmXy+WnEXSemlXpLqgEuAQyXtQfJqxcvAV9PuPwFuBRYBAm6NiAXpuuslfTz9/L2I+Fs2xx/
ad3tqizxV18zMOoa8BcOIOL6J5lua6buW5PWKbPdjZmaWM85AY2ZmFc/
B0MzMKp6DoZmZVTwHQzMzq3gOhmZmVvFKpWrFSODm+k2BSyPigXSbrYEbSV7T2AhcFBH3tXZ8V60wq2zFro
JgHUupVK1YBNSk7eOAn6dJuyEp37QyInYHBgN/
yuOYzcysAuXzPcNZaYLtzLYmq1ZExNsZ7d34oJoFwCnAoLTfRmBVPsZrZmaVq+DPDCV9X9IrwHg+uDJE0ic
kPQssBL4aEesl7ZCuvkzS05LulfThFvbtRN1mZtZmpVK1goj4a1rAdwQwRVI3kivXfsDsiBgOPAVc08K+na
jbzMzarFSqVjSIiCXAf4A9gdXA28AD6ep7geGFGqCZmVWGkqhaIal//
YQZSR8B9gCWRUQAD5LMJAUYAywu2IDNzKwilErViv2AyZLWpeu+HhH1E2W+Bdwh6TrgDeDkbI7vqhVmZpYt
JRdf5aempiZqa2uLPQwzMysRkuZGRE1T65yBxszMKp6DoZmZVTwHQzMzq3gOhmZmVvHyFgwlTZW0UtKijLb
LJC2QNF/So5J2SdtHpm3zJT0j6fMZ28yU9HzG+t75GrOZmVWmvM0mlbQ/
sBb4VUbVih71+UklnQUMjoivSuoOvJ+mYOsDPAPski7PBM6LiDZNDe3aZ2D0OfG6HJ6RmXUkrlphjRVlNml
EzALebNTWbKLuiFiftjdO1G1mZpZXeXvpvjmSvg9MBNYAB2S0fwKYCnwEmJARHAFulbQBuA+4PMr15UgzMy
uKUk/UDTA+IoYCn0p/
JjS3b1etMDOz9ij1RN1ExIr091vpNiOb26GrVpiZWXuUdKJuSZ0l9UrbuwCHAYswMzPLoZJO1C1pW2BGGgg
7AY8Bv8jm+E7UbWZm2XKibjMzqwhO1G1mZtYCB0MzM6t4DoZmZlbxHAzNzKziORiamVnFy+erFVNJ3gtcmZ
Go+zLgCJLXJ1YCJ0XEq5IOBq4CtgbeB86PiMfTbY4HLiTJV/
oq8KWIWNXa8ReuWEPV5Idzf2JmHYQTVZtlL59XhrcB4xq1XR0R1RExDHgI+E7avgr4XJp27UTgDoD0Rfzrg
QMiohpYQEYKNzMzs1wolaoV8yLi1bT9WaCbpK6A0p9tJQnoQXJ1aGZmljMlU7Uiw9HAvIh4L+3/
NWAhSb7SpcDpBRqqmZlViJKpWgEgaQjwA+C0dLkL8DVgL2AXktukU5rbt6tWmJlZe5RM1QpJ/
YAHgIkR8WLaPAwgIl5Maxj+GhjV3A5dtcLMzNqjVKpW7AA8DEyJiNkZfVYAgyXtnC4fDCwpwFDNzKyCtPjM
UNJC0kkuTUlneDa3bVuqVpwBfBS4WNLFadvY9LWL7wKz0ooWLwMnZXFerlphZmZZa7FqRVpbED6YtHJH+ns
88HZEfC+PY9sirlphZmaZWqpa0eKVYUS8nO7gkxHxyYxVkyXNBko2GJqZmWUr22eG20rar35B0iiS9wTNzM
w6vGzfMzwVmCqpformv4BT8jIiMzOzAssqGEbEXODjknqQPGf0S3xmZlY2WptN+s1m2gGIiGtb2DZXibq3B
m4kmZm6EbgoIu7L/
hTNzMxa1tqV4Ye2YN+3kQSxX2W0XR0RFwNIOoskUfdX+SBR96uS9gRmAH3TbS4iCai7S9oK2DGbg7tqhZkV
k6uGdCytzSb9bnt3HBGzJFU1ams2UXdGe0Oi7jQ/6SnAoLTfRpLAaWZmljNZzSaVtLukP0halC5XS/
p2ew4o6fuSXiF5V/
E7TXRpSNSdZqYBuEzS05LulfTh9hzXzMysOdm+WvELkgTZ6wAiYgFwXHsO2JZE3SRXrv2A2RExHHgKuKa5f
TtRt5mZtUe2wbB7RMxp1LZ+C4+dTaLu1cDbaTvAvcDw5nboRN1mZtYe2QbDVZJ2I33GJ+kY4LW2HqytibrT
ShUPkswkBRgDLG7rcc3MzFqS7Uv3pwM3A4MkrQD+DnyppQ1ylKh7JfAt4A5J1wFvACdnOWYzM7OstJioe7P
O0rbAVhHxVv6GlBtO1G1mZpnanahb0pci4s7GL99n89K9mZlZR9HabdL6ZNxb8vK9mZlZSWvtpfufpx9/
GhFvFGA8ZmZmBZftbNInJT0q6VRJPfM6IjMzswLLKhhGxEDg28AQYK6khyS1OJvUzMyso2jTbFIASb2Aa4H
xEdGphX65qloxE+gDvJPuuv6VixZ17TMw+px4XZvOzcysnDhZ+KZamk2abW7SHpJOlPRb4EmSF+5HtrLZbc
C4Rm1XR0R1RAwDHuKD3KT1VSuGAicCdzTabnxEDEt/Wg2EZmZmbZHtS/
fPAP8DfC8inspmgxxWrTAzM8urbIPhgIgISR+StF1ErG3vASV9H5gIrAEOaKJLQ9WKjLZbJW0A7gMuj7be2
zUzM2tBtrNJh0iaBywCFkuamxbhbbM2Vq2A5BbpUOBT6c+E5vbtqhVmZtYe2QbDm4FvRsRHIuK/
gHPTti2RTdUKImJF+vutdJtmn1W6aoWZmbVHtsFw24j4Y/
1CRMzkg+w0WWtr1QpJndPZq0jqQjI7dVFbj2tmZtaSbJ8ZvpRWk6if5fklksoVzcpF1QrgP8CMNBB2Ah4jK
TTcqqF9t6fW04rNzCwLWb1nmGad+S7wSUDALODSiPhXXke3BVy1wszMMm3xe4bAbsCuaf8uJEV2Z+VmeGZm
ZsWV7W3SacB5JM/
rNuZvOGZmZoWXbTB8IyIezOtIzMzMiiTbYHiJpF8CfwAaXoaPiPvzMiozM7MCyvaZ4cnAMJJco59Lfw5raQ
NJUyWtlLQoo+0ySQskzU9LQu2Sth+cvsi/MP19YBP7+03mvszMzHIl29mkC9MsMNnvWNofWAv8KqNqRY/
6/KSSzgIGR8RXJe0FvJ5WsNgTmBERfTP2dRRwDFBdv6/
WuGqFmXUUri5RGLmYTfoXSYPbctCImAW82ait2UTdEfFq2t6QqDsd/HbAN4HL23J8MzOzbGX7zHA/
4ERJfyd5ZiggIqK6rQdsR6Luy4AfAm+39VhmZmbZyDYYNq5L2G4RcRFwkaQpJJlnLqlfl5Goe2y6PAz4aES
c07gcVFMkTQImAXTqsXOuhmxmZmUuq2AYES/n4dj/
TZKP9BJoNlH3vsDekpaRjLW3pJkRMbqZcd5MmkC8a5+BLvNkZmZZyfaZYU60NVF3RPwsInaJiCqSW7V/
ay4QmpmZtVe2t0nbLBeJuiNiZb7GZ2ZmVi+rVys6IifqNjOzTLl4tcLMzKxsORiamVnFczA0M7OK52BoZmY
Vz8HQzMwqXj5frZhKUtliZUai7i8AlwIfA0ZGRG1G/2rg50APklcvRkTEu5J+B/RJx/
pn4PSI2NDa8ReuWEPV5Idze1Jm1mE4+bW1RT6vDG9j8zRui4CjgFmZjZI6A3cCX42IISTvJ65LVx8bER8H9
gR2Br6QvyGbmVklytuVYUTMapxPNCKWAEhq3H0ssCAinkn7rc7Ypr7SRWdga9JKF2ZmZrlSKs8MdwdC0gxJ
T0u6IHOlpBnASuAtYHoxBmhmZuWrVIJhZ5Lco+PT35+XNKZ+ZUQcQvLcsCtwYHM
7kTRJUq2k2g1vr8nzkM3MrFyUSjCsA/
4UEasi4m3gEWB4ZoeIeBf4DXBEczuJiJsjoiYiajp13z6vAzYzs/
JRKsFwBlAtqXs6mebTwGJJ20nqAw2TbA4lrXRhZmaWK4WuWvEm8GOSWaEPS5ofEYdExD8lXQv8L8kEmUci4
mFJHwZ+I6kr0Al4HLgpm+MP7bs9tZ5abWZmWXDVCjMzqwiuWmFmZtYCB0MzM6t4DoZmZlbxHAzNzKziORia
mVnFy9urFS2RdA7wZZLXKBYCJwO3A3ukXXYA/
hURw9L+U4BTgQ3AWRExo7VjuGqFWWVz1Qpri4IHQ0l9gbOAwRHxjqRfA8dFxBcz+vwQWJN+HgwcBwwBdgEe
k7R7NmWczMzMslGs26SdgW3SrDLdgVfrVygpaXEscFfadARwd0S8FxF/
B14ARhZ4vGZmVsYKHgwjYgVwDbAceA1YExGPZnT5FPB6RCxNl/
sCr2Ssr0vbNuNE3WZm1h4FD4aSepJc7fUnue25raQvZXQ5ng+uCgE2K35IMzUNnajbzMzaoxi3SQ8C/
h4Rb0TEOuB+YBQ0JOM+Crgno38dsGvGcj8ybquamZltqWIEw+XAPmmFCgFjgCXpuoOA5yKiLqP/
b4DjJHWV1B8YCMwp6IjNzKysFXw2aUT8VdJ04GlgPTAPuDldfRyb3iIlIp5NZ5wuTvufns1MUletMDOzbLl
qhZmZVQRXrTAzM2uBg6GZmVU8B0MzM6t4DoZmZlbxihIMJe0gabqk5yQtkbSvpI9LekrSQkkPSuqR9u0i6f
a0fUmatNvMzCxnilK1Arge+F1EHCNpa5L8pL8HzouIP0k6BTgfuBj4AtA1IoZK6g4slnRXRCxr6QCuWmFW2
Vy1wtqiGOnYegD7A7cARMT7EfEvkvJNs9JuvweOTj8HScq2zsA2wPvAvws5ZjMzK2/
FuE06AHgDuFXSPEm/lLQtsAg4PO3zBT5IwTYd+A9JUu/
lwDUR8WaBx2xmZmWsGMGwMzAc+FlE7EUS6CYDpwCnS5oLfIjkChCSck0bSJJ69wfOlTSgqR27aoWZmbVHMY
JhHVAXEX9Nl6cDwyPiuYgYGxF7k6RkezFdfwLJ88V1EbESmA00mUHAVSvMzKw9ilHP8B/
AK5L2SJvGkEyK6Q0gaSvg28BN6frlwIFKbAvsAzxX4GGbmVkZK9Zs0jOBaelM0peAk4GJkk5P198P3Jp+/
kn6eRFJbcNbI2JBawdwom4zM8uWE3WbmVlFcKJuMzOzFjgYmplZxXMwNDOziudgaGZmFc/
B0MzMKl6xXq1AUiegFlgREYdJuockPynADsC/
ImJY2rca+DnQA9gIjIiId1vavxN1m1U2J+q2tihaMATOBpaQBDgi4ov1KyT9EFiTfu4M3AlMiIhnJO0ErCv
8cM3MrFwVq55hP+CzwC+bWCfgWJKUbABjgQUR8QxARKyOiA2FGquZmZW/
Yj0zvA64gOSWZ2OfAl6PiKXp8u5ASJoh6WlJFxRojGZmViGKUc/
wMGBlRMxtpsvxfHBVCMmt3P2A8envz0sa08y+XbXCzMzarBhXhp8EDpe0DLibJAn3ndDwfPAo4J6M/
nXAnyJiVUS8DTxCUgJqM65aYWZm7VGMqhVTIqJfRFQBxwGPR8SX0tUHAc9FRF3GJjOAaknd02D5aWBxQQdt
ZmZlrZizSZtyHJveIiUi/inpWuB/
gQAeiYhW35lw1QozM8tWUYNhRMwEZmYsn9RMvztJXq8wMzPLOWegMTOziudgaGZmFc/
B0MzMKp6DoZmZVbyiBUNJnSTNk/
RQunyPpPnpzzJJ8zP6TpH0gqTnJR1SrDGbmVl56giJugeTvHIxBNgFeEzS7q3lJ3XVCrPK5qoV1hYdIVH3E
cDdEfFeRPwdeAEYWaixmplZ+esIibr7Aq9krK9L28zMzHKiIyTqVhN9opl9O1G3mZm1WUdJ1L1rxnI/
4NWmduxE3WZm1h4dIVH3b4DjJHWV1B8YCMwp6KDNzKysdYRE3c9K+jVJpYr1wOmudG9mZrmkiCYfv3V4NTU
1UVtbW+xhmJlZiZA0NyJqmlrnDDRmZlbxHAzNzKziORiamVnFczA0M7OK52BoZmYVr2ivVkjqBNQCKyLisI
z284CrgZ0jYpWkrYGfAzUk6dvOjoiZre3fibrNKpsTdVtblEzVCgBJuwIHA8sz+n0FICKGSuoN/
FbSiIhoKq+pmZlZm5Va1YofkSTwznz5cTDwB4CIWAn8i+Qq0czMLCdKpmqFpMNJbpk+06jvM8ARkjqn6dj2
ZtNcpWZmZluk4LdJM6tWSBqdtnUHLgLGNrHJVOBjJM8XXwaeJEnL1tS+JwGTADr12DnXQzczszJVjGeG9VU
rDgW6kTwzvAPoDzyT1PalH/C0pJER8Q/
gnPqNJT0JLN1sryRVK4CbAbr2GVieeebMzCznCh4MI2IKMAUgvTI8LyKOzuyTlneqSWeTdifJofofSQcD6y
NicWFHbWZm5azUqlY0pTcwQ9JGYAUwIZuNhvbdnlpPrTYzsywUNRim7wvObKK9KuPzMmCPQo3JzMwqjzPQm
JlZxXMwNDOziudgaGZmFc/B0MzMKp6DoZmZVbxiZKDpBswCuqbHnx4Rl0j6AnApSbaZkRFRm/Y/
GLgK2Bp4Hzg/
Ih5v7TiuWmFmVh4KUYGkGK9WvAccGBFrJXUBnpD0W2ARcBRJuaZMq4DPRcSrkvYEZgB9CzpiMzMra8XIQBP
A2nSxS/oTEbEEIE3Hltl/Xsbis0A3SV0j4r0CDNfMzCpAsUo4dZI0H1gJ/D4i/
prlpkcD85oLhJImSaqVVLvh7TU5Gq2ZmZW7ogTDiNgQEcNIEnKPTG9/
tkjSEOAHwGkt7PfmiKiJiJpO3bfP2XjNzKy8FXU2aUT8iyQd27iW+qXFgB8AJkbEi/
kfmZmZVZKCB0NJO0vaIf28DXAQ8FwL/
XcAHgamRMTsQozRzMwqi5L5LAU8oFQN3A50IgnGv46I70n6PPBjYGfgX8D8iDhE0rdJSj5l1jAcGxErWzpO
TU1N1NbW5uMUzMysA5I0NyJqmlxX6GBYKA6GZmaWqaVg6Aw0ZmZW8RwMzcys4jkYmplZxXMwNDOzilesDDR
TJa2UtCij7R5J89OfZWmGGiR1kXS7pIWSlkiaUowxm5lZ+SpGom6A24AbgV/VN0TEF+s/S/
ohUJ9P7QtA14gYKqk7sFjSXRGxrKUDuGqFWWUrRKUDKx9FCYYRMUtSVVPrlGTqPhY4sL47sK2kzsA2JGWc/
l2IcZqZWWUoxWeGnwJej4j6l+ynA/
8BXgOWA9dExJvFGpyZmZWfUgyGxwN3ZSyPBDYAuwD9gXMlDWhqQ1etMDOz9iipYJjeCj0KuCej+QTgdxGxL
k3BNhtoMoOAq1aYmVl7lFQwJE3aHRF1GW3LgQOV2BbYhxYSe5uZmbVVUSbQSLoLGA30klQHXBIRtwDHsekt
UoCfALcCiwABt0bEgtaOMbTv9tR6NpmZmWWhWLNJj2+m/
aQm2taSvF5hZmaWF6V2m9TMzKzgHAzNzKzilW09Q0lvAc8Xexw50gtYVexB5FA5nU85nQuU1/
mU07lAeZ1Psc7lIxGxc1MripWOrRCeb66IY0cjqbZczgXK63zK6VygvM6nnM4Fyut8SvFcfJvUzMwqnoOhm
ZlVvHIOhjcXewA5VE7nAuV1PuV0LlBe51NO5wLldT4ldy5lO4HGzMwsW+V8ZWhmZpaVDh0MJY2T9LykFyRN
bmK9JN2Qrl8gaXgxxpmtLM5nfHoeCyQ9KenjxRhnNlo7l4x+IyRtkHRMIcfXVtmcj6TRkuZLelbSnwo9xmx
l8d/Z9pIelPRMei4nF2Oc2ZA0VdJKSYuaWd/RvgNaO5+O9B3Q4rlk9CuN74CI6JA/
QCfgRWAAsDXwDDC4UZ9Dgd+S5DTdB/hrsce9heczCuiZfv5MqZ5PNueS0e9x4BHgmGKPewv/bnYAFgP/
lS73Lva4t+BcLgR+kH7eGXgT2LrYY2/
mfPYHhgOLmlnfYb4DsjyfDvEdkM25pH1K5jugI18ZjgReiIiXIuJ94G7giEZ9jgB+FYm/
ADtI6lPogWap1fOJiCcj4p/
p4l+AfgUeY7ay+bsBOBO4D1hZyMG1QzbncwJwf0QsB4ik3FgpyuZcAviQJAHbkQTD9YUdZnYiYhbJ+JrTkb
4DWj2fDvQdkM3fDZTQd0BHDoZ9gVcyluvStrb2KRVtHeupJP/
iLUWtnoukvsDngZsKOK72yubvZnegp6SZkuZKmliw0bVNNudyI/
Ax4FVgIXB2RGwszPByriN9B7RVKX8HtKrUvgM6cgYaNdHWeGpsNn1KRdZjlXQAyf8I+
+V1RO2XzblcB3wrIjYkFyAlLZvz6QzsDYwBtgGekvSXiPhbvgfXRtmcyyHAfOBAYDfg95L+HBH/
zvPY8qEjfQdkrQN8B2TjOkroO6AjB8M6YNeM5X4k/5Jta59SkdVYJVUDvwQ+ExGrCzS2tsrmXGqAu9P/
CXoBh0paHxH/U5ARtk22/62tioj/
AP+RNAv4OFBqwTCbczkZuCqShzovSPo7MAiYU5gh5lRH+g7ISgf5DshGSX0HdOTbpP8LDJTUX9LWJIWBf9O
oz2+AiemMsn2ANRHxWqEHmqVWz0fSfwH3AxNK8IojU6vnEhH9I6IqIqqA6cDXSzQQQnb/
rf0/4FOSOkvqDnwCWFLgcWYjm3NZTnKFi6QPA3sALxV0lLnTkb4DWtWBvgNaVWrfAR32yjAi1ks6A5hBMiN
pakQ8K+mr6fqbSGYoHQq8ALxN8i/
ekpTl+XwH2An4afqvqfVRYsluIetz6TCyOZ+IWCLpd8ACYCPwy4hocUp5MWT5d3MZcJukhSS3Gb8VESVZLU
HSXcBooJekOuASoAt0vO8AyOp8OsR3AGR1LiXFGWjMzKzideTbpGZmZjnhYGhmZhXPwdDMzCqeg6GZmVU8B
0MzM6t4DoZmZlbxHAzNzKziORiamVnF+/8iU9C5LyIZBwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 504x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"low_rated_movies_filter = ratings_grouped_by_movies['rating']['mean']< 1.5\n",
"low_rated_movies = ratings_grouped_by_movies[low_rated_movies_filter]\n",
"low_rated_movies.head(20).plot(kind='barh', figsize=(7,5));"
]
},
{
"cell_type": "markdown",
"id": "aa455a12",
"metadata": {},
"source": [
"## PREPROCESSING"
]
},
{
"cell_type": "markdown",
"id": "0d446909",
"metadata": {},
"source": [
"### REMOVING NOISE "
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "eb8a59ee",
"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>rating</th>\n",
" </tr>\n",
" <tr>\n",
" <th>movieId</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>215</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>110</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>52</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>49</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" rating\n",
"movieId \n",
"1 215\n",
"2 110\n",
"3 52\n",
"4 7\n",
"5 49"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"numberOf_user_voted_for_movie = pd.DataFrame(ratings.groupby('movieId')
['rating'].agg('count'))\n",
"numberOf_user_voted_for_movie.head()"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "6942a742",
"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>rating</th>\n",
" </tr>\n",
" <tr>\n",
" <th>userId</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>232</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>29</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>39</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>216</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>44</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" rating\n",
"userId \n",
"1 232\n",
"2 29\n",
"3 39\n",
"4 216\n",
"5 44"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"numberOf_movies_voted_by_user = pd.DataFrame(ratings.groupby('userId')
['rating'].agg('count'))\n",
"numberOf_movies_voted_by_user.head()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "46e9aa33",
"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>userId</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>10</th>\n",
" <th>...</th>\n",
" <th>601</th>\n",
" <th>602</th>\n",
" <th>603</th>\n",
" <th>604</th>\n",
" <th>605</th>\n",
" <th>606</th>\n",
" <th>607</th>\n",
" <th>608</th>\n",
" <th>609</th>\n",
" <th>610</th>\n",
" </tr>\n",
" <tr>\n",
" <th>movieId</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>4.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>4.0</td>\n",
" <td>NaN</td>\n",
" <td>4.5</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>4.0</td>\n",
" <td>NaN</td>\n",
" <td>4.0</td>\n",
" <td>3.0</td>\n",
" <td>4.0</td>\n",
" <td>2.5</td>\n",
" <td>4.0</td>\n",
" <td>2.5</td>\n",
" <td>3.0</td>\n",
" <td>5.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>4.0</td>\n",
" <td>NaN</td>\n",
" <td>4.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>4.0</td>\n",
" <td>NaN</td>\n",
" <td>5.0</td>\n",
" <td>3.5</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>5.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>3.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>5.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>3.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 610 columns</p>\n",
"</div>"
],
"text/plain": [
"userId 1 2 3 4 5 6 7 8 9 10 ... 601 602
603 \\\n",
"movieId ...
\n",
"1 4.0 NaN NaN NaN 4.0 NaN 4.5 NaN NaN NaN ... 4.0 NaN
4.0 \n",
"2 NaN NaN NaN NaN NaN 4.0 NaN 4.0 NaN NaN ... NaN 4.0
NaN \n",
"3 4.0 NaN NaN NaN NaN 5.0 NaN NaN NaN NaN ... NaN NaN
NaN \n",
"4 NaN NaN NaN NaN NaN 3.0 NaN NaN NaN NaN ... NaN NaN
NaN \n",
"5 NaN NaN NaN NaN NaN 5.0 NaN NaN NaN NaN ... NaN NaN
NaN \n",
"\n",
"userId 604 605 606 607 608 609 610 \n",
"movieId \n",
"1 3.0 4.0 2.5 4.0 2.5 3.0 5.0 \n",
"2 5.0 3.5 NaN NaN 2.0 NaN NaN \n",
"3 NaN NaN NaN NaN 2.0 NaN NaN \n",
"4 NaN NaN NaN NaN NaN NaN NaN \n",
"5 3.0 NaN NaN NaN NaN NaN NaN \n",
"\n",
"[5 rows x 610 columns]"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "7be3d987",
"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>userId</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>10</th>\n",
" <th>...</th>\n",
" <th>601</th>\n",
" <th>602</th>\n",
" <th>603</th>\n",
" <th>604</th>\n",
" <th>605</th>\n",
" <th>606</th>\n",
" <th>607</th>\n",
" <th>608</th>\n",
" <th>609</th>\n",
" <th>610</th>\n",
" </tr>\n",
" <tr>\n",
" <th>movieId</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>4.5</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>3.0</td>\n",
" <td>4.0</td>\n",
" <td>2.5</td>\n",
" <td>4.0</td>\n",
" <td>2.5</td>\n",
" <td>3.0</td>\n",
" <td>5.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>5.0</td>\n",
" <td>3.5</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 610 columns</p>\n",
"</div>"
],
"text/plain": [
"userId 1 2 3 4 5 6 7 8 9 10 ... 601 602
603 \\\n",
"movieId ...
\n",
"1 4.0 0.0 0.0 0.0 4.0 0.0 4.5 0.0 0.0 0.0 ... 4.0 0.0
4.0 \n",
"2 0.0 0.0 0.0 0.0 0.0 4.0 0.0 4.0 0.0 0.0 ... 0.0 4.0
0.0 \n",
"3 4.0 0.0 0.0 0.0 0.0 5.0 0.0 0.0 0.0 0.0 ... 0.0 0.0
0.0 \n",
"4 0.0 0.0 0.0 0.0 0.0 3.0 0.0 0.0 0.0 0.0 ... 0.0 0.0
0.0 \n",
"5 0.0 0.0 0.0 0.0 0.0 5.0 0.0 0.0 0.0 0.0 ... 0.0 0.0
0.0 \n",
"\n",
"userId 604 605 606 607 608 609 610 \n",
"movieId \n",
"1 3.0 4.0 2.5 4.0 2.5 3.0 5.0 \n",
"2 5.0 3.5 0.0 0.0 2.0 0.0 0.0 \n",
"3 0.0 0.0 0.0 0.0 2.0 0.0 0.0 \n",
"4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"5 3.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"\n",
"[5 rows x 610 columns]"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.fillna(0,inplace = True)\n",
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "a43aeabe",
"metadata": {},
"outputs": [
{
"data": {
"image/png":
"iVBORw0KGgoAAAANSUhEUgAAA7gAAAEGCAYAAABPZjl3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIH
ZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/
YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABJ+ElEQVR4nO3dfXRcd33v+89XD46UEFkOMVwpD8TYhlY5Ja
HWDTTYFKcnIXEfRHNaapLm5LasldN7wi29tnICNagcp16LHGT3tCelrXtLS7k2Tk5rzuQWQ+NF3BKfQDhyw
QErhDhxioNEHohlBWLZlvy9f2i2MhrtvWfPw54nvV9eWh7t2TPzm71nj/Z3/76/78/
cXQAAAAAANLqWWjcAAAAAAIBKIMAFAAAAADQFAlwAAAAAQFMgwAUAAAAANAUCXAAAAABAU2irdQPKcfHFF/
sVV1xR62YAAAAAAFJw6NChl9x9edL1GzrAveKKKzQyMlLrZgAAAAAAUmBm/
1rM+qQoAwAAAACaAgEuAAAAAKApEOACAAAAAJoCAS4AAAAAoCkQ4AIAAAAAmgIBbooyoxmt27lOq4ZXad3O
dcqMZmrdJAAAAABoWg09TVA9y4xmtOWhLTo1fUqSNDY5pi0PbZEkDfQN1LJpAAAAANCU6MFNyfDB4bngNnB
q+pSGDw7XqEUAAAAA0NwIcFMyPjle1HIAAAAAQHkIcFPS09VT1HIAAAAAQHkIcFMyuHZQnW2d85Z1tnVqcO
1gjVoEAAAAAM2NIlMpCQpJDR8c1vjkuHq6ejS4dpACUwAAAACQEnpwAQAAAABNgR7clDBNEAAAAABUFz24K
WGaIAAAAACoLgLclDBNEAAAAABUFwFuSpgmCAAAAACqiwA3JUwTBAAAAADVRZGplDBNEAAAAABUFz24AAAA
AICmQA9uSpgmCAAAAACqix7clDBNEAAAAABUFwFuSpgmCAAAAACqK7UA18w6zOwbZnbYzI6Y2X/OLr/
IzPab2VPZ/5flPOajZnbUzJ40s/
em1bZqYJogAAAAAKiuNHtwT0u6zt2vknS1pBvN7J2SPiLpK+6+WtJXsr/
LzPokbZR0paQbJX3azFpTbF+qmCYIAAAAAKortQDXZ/04+2t79sclDUj6bHb5ZyW9L3t7QNIedz/
t7sckHZV0TVrtS9tA34C23bBNvV29Mpl6u3q17YZtFJgCAAAAgJSkWkU52wN7SNIqSX/
q7o+Z2RvdfVyS3H3czN6QXf0SSV/
Pefhz2WX5z3mHpDsk6fLLL0+z+WUb6BsgoAUAAACAKkm1yJS7z7j71ZIulXSNmf2bmNUt7ClCnnOnu/
e7e//y5csr1FIAAAAAQKOrShVld5+Q9E+aHVv7vJn1SFL2/
xeyqz0n6bKch10qaawa7QMAAAAANL40qygvN7Pu7O1OSf9W0nclPSjp9uxqt0vKZG8/
KGmjmZ1nZiskrZb0jbTaBwAAAABoLmmOwe2R9NnsONwWSQ+4+z+Y2dckPWBmH5T0fUm/
LknufsTMHpA0Kmla0p3uPpNi+wAAAAAATcTcFwxzbRj9/f0+MjJS62YAAAAAAFJgZofcvT/
p+lUZgwsAAAAAQNoIcAEAAAAATYEAFwAAAADQFAhwU5YZzWjdznVaNbxK63auU2Y0U/
hBAAAAAICiEeCmKDOa0ZaHtmhsckwu19jkmLY8tGVBkEsQDAAAAADlI8BN0fDBYZ2aPjVv2anpUxo+ODz3e
9IgGAAAAAAQjwA3ReOT4wWXJwmCAQAAAACFEeCmqKerp+DyJEEwAAAAAKAwAtwUDa4dVGdb57xlnW2dGlw7
OPd7kiAYAAAAAFAYAW6KBvoGtO2Gbert6pXJ1NvVq203bNNA38DcOkmCYAAAAABAYW21bkCzG+gbmBfQht0
vzY7FHZ8cV09XjwbXDsY+BgAAAACwEAFuHSgUBAMAAAAACiNFGQAAAADQFAhwAQAAAABNgQAXAAAAANAUCH
ABAAAAAE2BABcAAAAA0BQIcAEAAAAATYEAFwAAAADQFAhwAQAAAABNgQA3RZnRjNbtXKdVw6u0buc6ZUYzt
W4SAAAAADSt1AJcM7vMzA6Y2RNmdsTMPpxd/
gkz+4GZfSv7syHnMR81s6Nm9qSZvTettlVDZjSjLQ9t0djkmFyusckxbXloC0EuAAAAAKQkzR7caUmb3f2n
Jb1T0p1m1pe974/c/
erszz5Jyt63UdKVkm6U9Gkza02xfakaPjisU9On5i07NX1KwweHa9QiAAAAAGhuqQW47j7u7v+Svf2KpCck
XRLzkAFJe9z9tLsfk3RU0jVptS9t45PjRS0HAAAAAJSnKmNwzewKSW+X9Fh20YfM7HEz+4yZLcsuu0TS8Zy
HPaeQgNjM7jCzETMbefHFF9Nsdll6unqKWg4AAAAAKE/
qAa6ZvU7S30v6PXeflPRnklZKulrSuKTtwaohD/cFC9x3unu/u/
cvX748nUZXwODaQXW2dc5b1tnWqcG1gzVqEQAAAAA0t7Y0n9zM2jUb3O5y972S5O7P59z/
l5L+Ifvrc5Iuy3n4pZLG0mxfmgb6BiTNjsUdnxxXT1ePBtcOzi0HAAAAAFRWagGumZmkv5L0hLvvyFne4+7
BQNRflfSd7O0HJe02sx2SeiWtlvSNtNpXDQN9AwS0AAAAAFAlafbgvkvSbZK+bWbfyi77fUkfMLOrNZt+/
Kyk/
yBJ7n7EzB6QNKrZCsx3uvtMiu2risxohl5cAAAAAKgCc18wzLVh9Pf3+8jISK2bESozmtHWh7dqYmpi3vLO
tk5tu2EbQS4AAAAAFGBmh9y9P+n6VamivNhkRjPa8tCWBcGtxFy4AAAAAJCWyBRlM7so7oHu/
nLlm9Mchg8O69T0qcj7mQsXAAAAACovbgzuIc2OkzVJl0s6kb3dLen7klak3bhGVSiAZS5cAAAAAKi8yBRl
d1/h7m+W9I+SftndL3b310v6JUl7q9XARhQXwDIXLgAAAACkI8kY3P/
d3fcFv7j7lyT9fHpNanyDawfV2da5YPmyjmUUmAIAAACAlCSZJuglM/
uYpP9XsynLvynpR6m2qsEFASzTAwEAAABA9RScJihbbOoPJL1bswHuVyVtrYciU/
U8TRAAAAAAoDzFThNUsAc3G8h+2Mxe5+4/Lqt1i1BmNENPLgAAAABUQcExuGZ2rZmNShrN/
n6VmX069ZY1gWA+3LHJMblcY5Nj2vLQFmVGM7VuGgAAAAA0nSRFpv5I0nuVHXfr7oc1m66MAsLmwz01fUrD
B4dr1CIAAAAAaF5JAly5+/
G8RTMptKXpjE2OJV6eGc1o3c51WjW8Sut2rqOXFwAAAACKlKSK8nEzu1aSm9kSSb8r6Yl0m9UcWq1VM77wW
kCrtc77PUhlDnp7g1RmSYzXBQAAAICEkvTg/
o6kOyVdIuk5SVdL+o8ptqkpZEYzocGtpAXLSWUGAAAAgPIl6cF9q7vfmrvAzN4l6X+m06TGF/
TIRunt6p33+/
jkeOh6UcsBAAAAAAsl6cH9bwmXISusRzZgMo1Njs0bZ9vT1RO6btRyAAAAAMBCkT24ZvZzkq6VtNzMNuXc1
SWpNfxRkOJ7Xl0uaf4428G1g/
PG4EpSZ1unBtcOpttQAAAAAGgicT24SyS9TrNB8IU5P5OSfi39pjWupD2vwTjbgb4Bbbthm3q7emUy9Xb1a
tsN2ygwBQAAAABFMHePX8HsTe7+r2Z2oSR39x9Xp2mF9ff3+8jISK2bsUB+VeQ4JtPRwaNVaBUAAAAANBYz
O+Tu/UnXT1Jk6kIz+6aki7Iv8JKk2939OyW2sekFPa/
DB4c1Pjmunq4enTpzSiemTixYl3G2AAAAAFAZSYpM7ZS0yd3f5O5vkrQ5uwwxDv3gkJ5/5Xm5XM+/
8rx+evlPq7Otc946ueNsM6MZrdu5TquGV80rQAUAAAAASCZJD+4F7n4g+MXd/
8nMLkixTQ1vaP+Qdh3eNff7jM/o0eOPSpJarVUzPqPerl4Nrh3UQN/
AgpTm3AJUjMMFAAAAgGSS9OA+Y2YfN7Mrsj8fk3Ss0IPM7DIzO2BmT5jZETP7cHb5RWa238yeyv6/
LOcxHzWzo2b2pJm9t/
S3VVt7Ht8Ted+Mz0iSTp15bXxu2LRCQQEqAAAAAEAySQLc35a0XNJeSV+QdLGk30rwuGlJm939pyW9U9KdZ
tYn6SOSvuLuqyV9Jfu7svdtlHSlpBslfdrMGnI6oiCIjXNi6oS2PLRFmdFM5LRC+ctJYwYAAACAaElSlK9w
998t9ondfVzSePb2K2b2hKRLJA1Iek92tc9K+idJd2eX73H305KOmdlRSddI+lqxr11rQRpyIUEvbU9Xj8Y
mxxbcn1uAijRmAAAAAIiXpAd3h5l918zuMbMrS3kRM7tC0tslPSbpjdngNwiC35Bd7RJJx3Me9lx2Wf5z3W
FmI2Y28uKLL5bSnNRtfNvGxOuOTY5pcO1gbAEqiTRmAAAAACikYIDr7us12+P6oqSdZvbt7DjcRMzsdZL+X
tLvuftk3KphLx/Snp3u3u/u/cuXL0/
ajKraev1WXXvZtYnWbbVWDfQNaNsN29Tb1SuTqberV9tu2DavZzZpGjMAAAAALFZJUpTl7j+U9CdmdkDSf5
I0JOkPCz3OzNo1G9zucve92cXPm1mPu4+bWY+kF7LLn5N0Wc7DL5W0MG+3QXzuNz6nzGhGwweHQ9OPA0Eq8
0DfQGyqcZI0ZgAAAABYzAr24JrZT5vZJ8zsO5Luk/SoZoPPQo8zSX8l6Ql335Fz14OSbs/
evl1SJmf5RjM7z8xWSFot6RuJ30kdGugb0PoV62WhndOzert6Ez1XkjRmAAAAAFjMkozB/
WtJJyTd4O4/7+5/5u4vFHqQpHdJuk3SdWb2rezPBkmflHS9mT0l6frs73L3I5IekDQq6cuS7nRPUKmpjmVG
M9p1eJd8Yaa1JMlkGpscS1QROSyN+eYrb9bwwWGqKgMAAACAJHMPD74aQX9/
v4+MjNS6GZHW3LdGE1MTidbtbOtcMO42Tn5V5VKeAwAAAADqmZkdcvf+pOsn6cFFiZIGt1LxFZGjqipvfXg
rc+UCAAAAWJQSFZlCdRRTETlq3YmpibnAmrlyAQAAACwmRfXgmlmLmXWl1Zhmc377+UWtX0xF5KTrMlcuAA
AAgMUiSRXl3WbWZWYXaLYA1JNmdlf6TWt8UeOb26297IrIYVWVozBXLgAAAIDFIEkPbp+7T0p6n6R9ki7Xb
HVkFJA/RjZw1s/
Oq4jc3dGtjrYObd63OfG42bCqyss6loWuy1y5AAAAABaDJGNw282sXbMB7n3uftbMGrf0cpUM7R+KvX+gb0
ADfQMLqiEXM242eI5AVGVl5soFAAAAsBgk6cH9c0nPSrpA0lfN7E2SJtNsVKPLjGa0+/
DuyPtze1qjqiGXMm42rFeXaYMAAAAALBaxPbhm1iLpeXe/JGfZ9yWtT7thjWz44LBc0Z3cH7/
u43O3o8bHljpuNr9XFwAAAAAWi9geXHc/
J+lDecvc3adTbVWDiwtOTTZvrG3U+FjGzQIAAABAcZKMwd1vZoOS7pf0k2Chu7+cWqsaXE9Xj8Ymx0LvC3p
2g7G2N195s/
Ye2TsvTbnd2nXqzCmtGl6lpR1LZTJNTE2op6tHg2sH6aEFAAAAgBBJxuD+tqQ7JX1V0qHsz0iajWp0SYs6n
Zo+pQPHDiyoqCyTTkydkMs1MTUxdzsIipNUWQYAAACAxcai5mptBP39/
T4yUp+x9srhlYnWM5mODh6d+33dznWRvb+B3q5ePXLHI2W1DwAAAADqnZkdcvf+pOsX7ME1s/
PN7GNmtjP7+2oz+6VyGrkYtFprovVarGVej2yS4lKlFqACAAAAgGaWJEX5ryWdkXRt9vfnJP1hai1qEhvft
jHRejM+My/tOElxKQpQAQAAAMBCSQLcle7+XySdlSR3PyXJUm1VE9h6/
Vatvmh1onVz570dXDuozrbOyHU72zoTj/EFAAAAgMUkSRXlM2bWKc2W/
zWzlZJOp9qqJpAZzejoy0cLr5gVpB0HFZKHDw5rfHKcKsoAAAAAkFCSAPcPJH1Z0mVmtkvSuyT9H2k2qhkM
HxyemxIoidy044G+gbkgNjOa0fDBYU1MTVS6iQAAAADQVAoGuO6+38z+RdI7NZua/
GF3fyn1ljW4YgpBRaUdZ0Yz2vLQlrk5coNpgiTRiwsAAAAAeZJUUX6XpCl3/6Kkbkm/
b2ZvSrthjW5px9LY+1utVSZTb1evtt2wLTRgHT44PBfcBnLH6wIAAAAAXpMkRfnPJF1lZldJukvSZyT9raS
fT7Nhjc5i6nB1tnVGBrW5onqBmSYIAAAAABZKUkV52t1d0oCkP3H3P5Z0YbrNanxxY2aTBLdS9HRATBMEAA
AAAAslCXBfMbOPSvpNSV80s1ZJ7YUeZGafMbMXzOw7Ocs+YWY/
MLNvZX825Nz3UTM7amZPmtl7S3kz9SQqCO3t6k08fjZsyiCmCQIAAACAcEkC3N/
Q7LRAH3T3H0q6RNKnEjzubyTdGLL8j9z96uzPPkkysz5JGyVdmX3Mp7OBdMOqRHA60DegbTdsU29Xb+x43c
xoRut2rtOq4VVat3OdMqOZirwHAK/hOAMAAKh/Saoo/1DSjpzfv6/
ZMbiFHvdVM7siYTsGJO1x99OSjpnZUUnXSPpawsfXnfz5bEudwzZ3yqAwVFoG0sdxBgAA0BiSVFF+xcwmsz
9TZjZjZifLeM0Pmdnj2RTmZdlll0g6nrPOc9llYe25w8xGzGzkxRdfLKMZ6RvoG9Dg2kH1dPVobHJMm/
dt1srhlVo5vFL99/VXpAeISstA+jjOAAAAGkPBANfdL3T3ruxPh6R/
J+lPS3y9P5O0UtLVksYlbc8uDys57BHt2enu/
e7ev3z58hKbUR1D+4e0ad8mjU2OSZI85y2dmDqhwX2DZQe5VFoG0sdxli7SvwEAQKUkGYM7j7v/
D0nXlfJi7v68u8+4+zlJf6nZNGRptsf2spxVL5U0Vspr1IvMaEa7Du+KXeeczmnrw1vLeh0qLQPp4zhLT5D
+PTY5JpfPpX8T5AIAgFIkSVG+Oefn18zsk4roXU3wXLlng78qKaiw/
KCkjWZ2npmtkLRa0jdKeY16kTR1cWJqQrfdf1vJvReDawfV3jK/qHV7SzuVloEKoqJ5ekj/
BgAAlVSwyJSkX865PS3pWc0WhYplZp+X9B5JF5vZc5L+QNJ7zOxqzQbIz0r6D5Lk7kfM7AFJo9nXuNPdZ5K
+iXoUpCUn8ejxR+c9rujiNfmXG0q6/AAgSqWKxmEh0r8BAEAlmXvjRkP9/
f0+MjJS62aEesv2t2imjBi9t6tXj9zxSMH11u1cFxpMJ308ANQS32EAACCOmR1y9/6k6xc9BhfJlBPcSsl7
L+j9ANDISP8GAACVRICbklZrLevxSzuWJhqXS/EbAI1soG9A227Ypt6uXplMvV292nbDNtK/
AQBASSJTlM3sw+7+x2b2Lnf/
n1VuVyL1nKK8cnhlyY9tt3bJpLPnzs5b9rrzXqeJqYl54/+CCqS5RVo62zo5QQQAAADQ8CqZovxb2f//
W3lNWnyKnd7i2suundd78brzXjcvuJWks35WJ6ZOLJhGI7f3Q5rtOT41fUp3fekurRxeyZySAAAAABaNuAD
3CTN7VtJbzezxnJ9vm9njVWpfQyp2eotnTz47rzLrxNREwcfkTqMx0DcwN44tGPsb/
M+ckgAAAAAWi9gqymb2v0n6R0m/kn+fu/
9riu1KpF5TlMtJT+5s61RHW4dOTJ0ouK7JdHTwqKToSqQBKpICAAAAaDQVraLs7j9096skjUu6MPszVg/
BbT0rp8DUqelTcvmCqqJhcgtJFaqaPD45rsxoJlHhKgAAAABoRAWrKJvZz0t6StKfSvq0pO+Z2bvTblgjK3
eKoJNTJ+dVFe3u6FZ7S/u8dUym9SvWz/1eqGry0o6l2vLQFo1Nji0YxwsAAAAAzSDJNEE7JN3g7j/
v7u+W9F5Jf5RusxpbUPCpVD1dPRroG9Ajdzyio4NHdehDh/T+n3m/TDa3jsu1+/
BuDe0fkhQ+l2Sgs61TJptXaVmaP44XAAAAABpdkgC33d2fDH5x9+9Jao9Zf9GLCzaTuGLpFQuWHTh2QK754
6Vdrl2Hd2lo/1BoNWVJc3NKRhWuKpTaDAAAAACNoi3BOiNm9leSPpf9/VZJh9JrUuML5p/
dtG9TSY9/9PijGto/
pK3Xb51bFldAavfh3VpzyRoN9A1Ezn07fHA49DkKpTYDAAAAQKNI0oP7f0o6Iul3JX1Y0qik30mzUc1goG+
grFTlPY/
vmfd7S8yucnnBVOOwXuXOtk4Nrh0suY0AAAAAUE8KBrjuftrdd7j7ze7+q+7+R+5+uhqNa3S5RaCKlV+o6p
zOxa4/
NjkWWzAqN4XZZHOpy1E9vqgNKl0DAAAApUuSoowSZEYz+vzhz5f8+FKmGtry0BZJigxa41KYUXuZ0Yy2PLR
lrhhYUOlait6nAAAAAF6TJEUZJRg+OFyw1zXOxrdtnPd7d0d3wcdQFbmxDR8cptI1AAAAUAZ6cFMSVxQqiQ
PHDmho/
5AOHDug8clxLe1Yqha1FAyaxyfHlRnNaPjgsMYnx9XT1aPBtYP0ADaAqIrWVLoGAAAAkimpB9fM7qh0Q5pJ
JcZNjk2OadfhXRqbHJPLNTE1kahHeGnHUm15aMvc44I0V8Zy1r+oitZUugYAAACSKTVF2SraiiZTq5TSzrZ
OmYw01wa1WCtdU1gLAAAAlVJSgOvuf1HphjSTWqSUtlqrtt2wTRNTE6H3k+Za/
xZjpeugsBYZB5XHhQMAALAYFQxwzexSM/
uCmb1oZs+b2d+b2aXVaFyjqnZKaWdbpz5106c00DdAmmuDG+gb0CN3PKKjg0f1yB2PNHVwKzVPYa16Cya5c
AAAABarJD24fy3pQUk9ki6R9P9llyHCFUuvqOrrdbR1zN1erGmuaEzNUFirHoPJZrlwAAAAUKwkAe5yd/
9rd5/O/vyNpOWFHmRmnzGzF8zsOznLLjKz/Wb2VPb/
ZTn3fdTMjprZk2b23pLeTZ34+vGvV+R5Vl+0OtF8uCemTsydUC/
GNFfURiV6LZsh46Aeg8lmuHAAAABQiiQB7ktm9ptm1pr9+U1JP0rwuL+RdGPeso9I+oq7r5b0lezvMrM+SR
slXZl9zKfNEkR2daqc+W9zPTf5nGZ8JtG6uSfUiy3NFdVXqV7LZsg4qMdgshkuHAAAAJQiSYD725LeL+mHk
sYl/Vp2WSx3/6qkl/MWD0j6bPb2ZyW9L2f5Hnc/7e7HJB2VdE2CtjW1/
F6hQuidQbVUqteyGTIO6jGYrNSFg3obWwwAAFBIW6EV3P37kn6lQq/
3Rncfzz7vuJm9Ibv8Ekm5eb3PZZctkJ2D9w5JuvzyyyvUrMZhMvV09WhscmzBfS7Xup3rNLh2sKECBDSeSv
ZaDvQNNPTndXDtoLY8tGVewF/rXuhgew4fHNb45Lh6unqK/
l4IeumD9xX00uc+PwAAQL2JDHDNbCjmce7u91SwHWHz6nrEC+
+UtFOS+vv7Q9dpZsGJav4JdSDsJDQzminrRBfIF3WRZTGlwOYeV0s7lqqjrUMTUxN1c4yVe+Egrpe+1u8NA
AAgSlyK8k9CfiTpg5LuLvH1njezHknK/
v9Cdvlzki7LWe9SSQvPnhtEb1dvas99QdsFcyeeUQWoclNFM6MZ3f3lu+eNlbz7y3eTaoiyNMPY2XLkj0Ge
mJrQ1PSUtm/
Y3jTj3utxbDEAAEAhkQGuu28PfjTbY9op6bck7ZH05hJf70FJt2dv3y4pk7N8o5mdZ2YrJK2W9I0SX6PmBt
cOqiXR8ObiPfXyU3M9Z3EFqIKT0Hsevkdnz52dd9/
Zc2d1z8OV7IDHYlPpsbONNtazHisnV1o9ji0GAAAoJHYMrpldJGmTpFs1WxTqZ939RJInNrPPS3qPpIv
N7DlJfyDpk5IeMLMPSvq+pF+XJHc/YmYPSBqVNC3pTveE5YPr0EDfgD76jx/
V6ZnTNWtDcBJ6Yip8d0UtB5Kq1NjZRhzrWa+9m5UcjlCPY4sBAAAKiRuD+ylJN2u29/
Zn3P3HxTyxu38g4q5fiFh/
m6RtxbxGvRraP1TT4JaTUDSSRhzrWY9jkCt9oaAShaoAAACqLa4Hd7Ok05I+JmmL2VwdKNNskamulNvWsPY
8vqfqr7msY1logZvujm5NTE0sWL+7o7u6DQQi1GtvaJx67N1M40JBo1e4BgAAi09kgOvu6QwiXQTixsaWo0
UtOqdzofd1LunUyIdGFiwfum5Id3/
pbp3118bhtlu7hq6LK5KNaqC69ax67A0tpB57NxvxQgEAAEClFZwHF/
Wjo71Dr559NfS+qJPYejwRR2OOO01LPfaGJlFvvZuNeKEAAACg0uilbSBRwa0UfxI70DegR+54REcHjzbNF
CaNbjFU4S3GeW3nzd1uUcvctoiqplxM1eVGq9BcqsU+dRMAAIBED25TMJkG1w7GprySDltfSCedld+TLWku
DT+qV7uY3u/F1FNOtgYAAIBk7l7rNpSsv7/
fR0YWjjuttZXDK1N53u6Obp2ePj0vGDCZbrnqFq25ZE1omue2G2YLU+ffFzxu6/
VbU2kr4q3buS40nVSSert6myowibu4ErcdAr1dvXrkjkfmfo96TP56xa4LAACA+mNmh9y9P+n6pCg3kF986
y9q2w3b1NvVK5Opu6NbnW2d2nV4lzbt2xSZ8hqWDuty7T68u2nTNetdWDppIOhlbIZ9E/
Sgjk2OyeUL3luSHuv8dYrp/V7sPeWLJT273rDdAQCoHQLcFJzffn4qz3vg2IG58bTbN2zXT07/RK9OR4/
LlWZP5KN6yFy+aMd81tpA38DcxYowUeNxG+3EudBY4yQFkPLXiXpM2PJi1m02hS4uIB1sdwAAaosANwVLWp
ek8ry5gerwweF5U/9E6enqUau1Rt6/
WHqy6lFwscJkoffn75tGOnEOAvGoiyvBe4vryZbmF0nKfc78bRZVTGkxF16ikFltsN2L02gX7QAA9Y8ANwU
np06m9txD+2fnr00SmAbFp+Lm5V0MPVn1LmkvY1onzpU+wcwNxKME7y23JztIu1/
WsUwmU29Xr7bdsE0DfQMLntPlc0Fu7nr58p8/bt1qqsZJ/WJPz66VWm/
3RgoYG+miHQCgcVBFOQXdHd06MXUilefefXi3tl6/
NXLOy1yu2QJivV29oesGATBqK+k8sGmcOKdRZTgsEM+V/
96SzCcbNY48SbGoepuvtlqVnZkXNz1xhdNqud0brWp43EW7emwvAKAx0IObgiCwTOu5Vw2v0qtnXlVLgt23
5aEtWr9i/
YI0zaCKMicRtZe0lzGN8aRp9ArHBdyl9qDWuleskqqVwppmenYj9RJWWqFex1qmxTdaenQzHdcAgPpBgJuC
iamJVJ/f5ZqYmpibLzTOqelTOnDswIIAavuG7UwRVEeC8bhHB4/
qkTseCQ0A0zhxTuMEMyrgDnpbw+aqLRQspV0sqpoBW7VO6qMunEgq670u9rTSQkFkLdPiGy1gXMxF4AAA6S
FFeREYnxyvuzRNFC/
Yf1GpkaVII50yacq1FJ5SuXnfZh36waF5F2CKec5iZEYz2vrw1nkXpdJO66xmCmv+cV+JFNbFnlaaJIis1f
dto6Wlp3VcAwAWN3pwF4F6PblB8ZL09BYjrFfYZBqbHCu5J7OYHqykczSn0SsWBHthGRdppnU2egpro/
USVlo99zo2WtXwei0CBwBobOae3njRtPX39/vIyEitm7HAyuGVtW7CPLdedavWXLKmoj1/
KCyuEE09CdoZTL+TO4a8s60z1RPOVcOrIsesRxWQqtR2jZvGSJoN9I8OHi36eZOo1WcjansX816jtluSgl/
NIL8XXEr/
OClGo3zvAACQlJkdcvf+xOsT4FbebfffpkePP1rrZszp7ujW6enTdXtC1oxKOQmu9YlpLQKXuCAzLOiqZHA
RF1xLjRmwFfoMVWIf13uAVw21PlbBPgCAxaTYAJcU5RR87jc+V+smzDMxNdFQlTWbQbGpoGGFezbt26T+
+/
qrVrynFqmng2sH5+azzReW8lnKdo0qqFQopbRe0zqjFCr+lBnN6NUzry54XFwKa9j2q1ZaadS+q4cKzpUeK
oDiLPZCZwCAeBSZWsQKzaOL0hUbLEbNHXti6kTV5rGsRYGagb4BHfrBIe0+vHtBanRY0JVku0alXAcXDe55
+B59/LqPa3DtoDbv2xzai9vd0d1wQUuh4D+/
11WSlnUs08ev+3joey1UkKrc7RPXAxf12od+cEh7j+xtmHlekY7FXugMABCPHtwU1NtV5Kj5cluttcotWTy
KLUQT10tard72WhWo2Xr9Vm3fsD1Rj2Ch7ZrbsyOFz0mde9HglqtuWdCD3NnWqaHrhhK3vx56FKX44D/
qAkrnks7IgCDNOVUL9cBFvfaex/fUfTZKvXweaintbdBIhc74PABA9RHgpuCeh+
+pdRPmdHd0R86XO+MzVW7N4jG4dlDtLe3zlrW3tEcGi4V6Satx4lap1NNSTujyUz6l8LlaCwXh9zx8T2ggl
y8IiooJrqPea72kSsYF/4UCgrB9VmoQkWT/
Fwqeo14j6jurXgKbevo81Eox26DU4K+eK1nn4vMAALVRkwDXzJ41s2+b2bfMbCS77CIz229mT2X/
X1aLtlXCiakTtW7CnF986y/q/PbzQ+/
r7eqtcmsWmfzOw4h6RlFjI3Mt7VhamTYVUO7Ywkqc0MU9R1wQnhnNFHXsBUFROe85zV7OYsUF/
3EBQdT27u7ojnxMlKT7v1DwHPUaUVknaQQ2pQRfaXweGq0HMOk2KOe7olLZJmlv23r6fgCAxaSWPbjr3f3q
nIpYH5H0FXdfLekr2d9Rpr1H9urVswuDp1ZrbbgiOo1k+OCwzvrZecvO+tnIk7ywuVhzvXL6lbo/
sZXCe1CLPaErdFIYFZAWe9JYiaConlIl44L/
uIAganu7vOggIukJfaEeuKj2bnzbxqqk0ZcafFX689CIPYBJt0E5wV8lsk2qsW3r6fsBABaTekpRHpD02ez
tz0p6X+2a0jyi0jVJT05XOSd5YWZ8pu6v+sf1oBZzQlfqSWExr1GpoKjeUiWjgv+4gCBqu52cOll0EBG373
J7y1498+qCFP7cfRLV3q3Xb9XNV94815Pbaq26+cqbK15YqNTgq9Kfh0bsAUy6DcoN/
srNNqnGtq2374diNVr2AAAEalVF2SU9ZGYu6S/
cfaekN7r7uCS5+7iZvSHsgWZ2h6Q7JOnyyy+vVnuLklu5tZ7d/
eW7JVF9NA1LO5ZG9squGl41VzW2EoFfvYg7MQxSYZPMW1lqNeeox3W2deq8tvPm9kdc5eBiDa4dDJ0Ttpzg
Oa35PaMqH8dt72KrJUc919KOpfO208TUhNqtXcs6lmliaiL0fYa9dmY0o71H9s5doJvxGe09sldrLllT0e+
xUoOvSn8eGrEHMOk2qEXV9lzV2LbrV6zXrsO7QpfXu0JV1AGgntWqB/
dd7v6zkm6SdKeZvTvpA919p7v3u3v/8uXL02thGRohuJWks+cWpsyiMqLmdvXsv+BkobO9M3S9MElO/
Gp5xT3uxHD9ivW6+8t3z0sHvPvLd4e2r9TxdetXrF+w3dutXdPnpuddbJiankrwbpKp9JywtUhJrWT17Kjn
MtmC3rKzfladSzrn9cAV+vxWq0ez1J63Sn8eGrEHMOk2KOZzl8b3WjW27YFjB4paXk8aMXsAAAI1CXDdfSz
7/wuSviDpGknPm1mPJGX/f6EWbVtsmAs3HYXG1EqzJwth46PDxFVgDtR6vF7UiWF3R7f2PblPZ8/
ljUk+d1aD+wYXtK+UICHo2cu9uGQytbe1L3jdSk51s27nOm3et1mStH3D9rkxraWeiKd1UhkXIFQyKAueK7
dAVUdbR6LU9SSf36jvq0r1ugXbKZhDOVfSoD8Y8xxUrx4+OFzyMVirqbvKlSR9OOnnLq3vtWps20bsgQ9Et
XFscox0ZQB1z9yr29toZhdIanH3V7K390vaKukXJP3I3T9pZh+RdJG7/6e45+rv7/
eRkZH0G12klcMra92EouzYsIOUowoLTpJLlZvmnjSlNuo1e7t656beKaSY9Nj8ddevWK+9R/
bOC9BMpluuuiU0TS/Q2dZZVi+XVNr27u3qLfg+o7ZHfvqeNNtbLNO8gLrY97ZqeFVoBojJdHTwaFHvL/
c9hKWMlrvNi3m9qGEbuZ/NQp/fzGhGm/
dtLvg8abS7t6s3cap4pbd3OcdkpdLba6kS32tS+LaRlOr2qlTba6HQd2qa3yEAkM/
MDuUUJi68fg0C3DdrttdWmh0DvNvdt5nZ6yU9IOlySd+X9Ovu/
nLcc9VrgPuW7W9pqCJOjfDHttaKPXEMO8ktVrWCo+C9Bb1Wuc8R1Yaok/
i397xdXzv+tQXPUWg7lPsZjHrvUZK8z6j3ePOVN2vP43uKOsaTBkhpnBBX+yQ76vUKbfNCn9+4592+YXvZJ
9qV2k61CmqqfSGjWipx0adW22Zo/1Doxb1br7pVW6/
fmtrrVkKSv2GcOwColmID3KqnKLv7M+5+VfbnSnffll3+I3f/BXdfnf0/
NritZxvftrHWTShKI6RL1VIpKXIDfQPzqr2WotjU1FLGlOW+N2nh+PGoNkSl0j56/
NHQ54gakxwo9jOYn3IbNWdrlLA23vWlu+bt06j3uPvw7qIvYCVNqwxLmzRZWUVpqp0mGfW8QU9o2PzF63au
i7xAEXx+4563EkFKpbZTrVI7m3XMZNT3l8u1cnil3rL9LRraPxT7HLXaNo08Bjc3hTwK5w4A6lU9TRPUNI6
9fKzWTShKscHBYlPKyVFmNKMHHn+g7J78scmxyBPi/CBv/
Yr1RQdHSaYpCjuJKfbExuWzKbwRiinsEnbB4cenf7xg2plCQXW+GZ+ZF4TGBVSlyP3MRI2JDS6M5Lbd5dp7
ZK+G9g+VVGin2oWKop436O3JLyqVe4ElX+6YyLjnTbPdxW6nuO/TNMfFN/
J4zzhhF31yzfiMdh3eFRvklrNtyilw1ej7JBhLHXWM1XOxMwCLGwFuCh49/
mitm1CURqn6XCulnKRsfXirzvrZyPsDnW2dBU/
Qw06Iw4K8vUf26u09by8qOEpyohV2ElPsRZHujm7de9O9oY8rtrBLWFB+1s/
qgiUXzOshLOVznRuEpnHyFswHG5cRcODYgdAe5t2Hd5dUaCesunSahYqKKd4Td4Elv+hQJYoC5QcrucdFob
l5kyr0uUur57ARKy4nkV+MKsqex/
dE3lfqtim3wFWz7JNGLXYGYPEiwIVOTp2sdRPqWiknKUmqKEuzFWYfueMR7diwI7KXIuyEOKpX+bHnHisqO
Cp0ohV1ElNs8PiTMz+RJB360CHt2LCjrIq9UUH5yamTeuSOR7R9w/
aCz5EfyIQ9f1S6cDl6unoKZgRE9WYmSR8PC+DCqkvffOXNkUW1yp2OpZiqzFH70mQLqu+WW+05LFjZdXjX3
O8TUxOSzxZ1M5k62zp1evq0Nu3blCgNNpDk+7SUHrxC+6acIKSY/
V6LqchyqzJHicuWKXXblJva3CyBYaWnv2pGtZyiD8BCbbVuAGqPFOV4g2sHQwuUVOIkJQiEgxOFTfs2ha6X
H/REnSBHneRFBUdh7y1J5dhiL4qcPXdWd33pLm3et7nsaqU9XT2hQWBPV0/
i4l4XLLlAr5x+JXR7tViLVg2vUk9Xj26+8mYdOHYgtlJ0UsFUT8G0QvlKCXrCptkJ2jY2Oabdh3cv2PcuDx
0DGPb4Tfs26Z6H70lUxTvXQN9AovXj9mU5zystLAx36sypgvstmJt3w1s3zCsOFKTBSipYHCjqPeWvE9fur
Q9vnftuWNaxTBveumHe5y64SPV33/47PfbcY5rxGbVaq95x6Tv07Mlni6oKHLbftzy0RZIWPLaYdQsJq8Ke
e6zlVizPXa9FLTqncwueL67eQdC2Yisml5tiXOrr1qNijr1Cmq3adyWPCwCVQQ8uSFEuoJSr1y0JD63cE92
BvoHIdGWTzbsiHHWCXEwP4/jkeOh7275hu54efDpy/sq4148z4zMVmccyrlckyZhiaTZA/
9RNnwrtNc9t594jezW4dnBu3OjW67fO217dHd2J93V7S7sG+gYqmraY+5iw9x51bIedoEdtuxNTJ1IbN5pW
D1dYb23UXLz5xifHtfvw7tD7opbnKjRmNO79De0f0qZ9m+ZlgJyYOqFdh3dFFnULLtLM+IwePf6o1q9YHzv
/
bL5ieimTrJukJ6tQb3rwHTG0f2jBelGiijuGzVeddNtU4lhNMifwYlLr+drT0KwF3oBGRoC7CMQV95FIUU6
i2JOUsB6GfGEnuoNrB0ODVJfP+2MZFRi0tSRPygh6PEu5kl7oJL6QU9OntPXh0qbJyA/
Kuzu61dHWoc37NieeC7enq2fB84T1AIVVV879LBz60CF94KoPJHrNV6dflVQ4qEtaeTv/
81NMD3DYCXrc45OkQ6eRzlzoNaLuT3qhI0xPV0/khQGXF3yvYZ/
PIO057uJYZjQTO190UnFjUcPEVX1Oum6wPGnwkmT/
nJo+pT2P71mw3jmdU2db59xx0mqtkdPuhLVn075N6r+vP9HntRIXYG67/zatHF4593Pb/
bclfmwzasZgsNGLiZWKtGzUMwLcReDem+6N7dlrtIIXtVDsF3lUT2yrtcae6A70DSTqdQsLDG6+8madPVe4
sJU0e5K2fsX6kq+kB69fTnr7xNREyX8QgyDzlqtu0cmpkzoxdaKoTIRgyhZJc8FqVHp3fnXlfMVO+VEoqIv
qibr2smsXPEbS3OeyxcK/zpMWmCr0PRCWDl2JXpioi0eFXiPu/nJOLE+diQ+8xibHtHnfZq0cXhn5XZB/
EWTkQyMLqkfnf5/c8/A9Jbc5V7GV2+OyQfLfW6EezY/t/1ho8JJ/MSvp/
ol6L6emT+mNF75ROzbs0Pc2fy8ybbzcrIRyx57edv9tC4pOPnr80UUd5NZ7MFhK0NYsxcQCpWZh5H8/E/
yilsy9cdNT+/
v7fWRkpNbNWGDl8MpaN2GeHRt26O4v3R1Z1bcRJp2vpbBxnZ1tnbEnOqU8JrBu57rQ3pNgmpViHyfNjrM+f
8n583pqhw8Ol/
Q6+TKjGd31pbtKmhIp7LWS9ipnRjPavG9zWSn2ufvkLdvfEvseorbLquFVidrQ3dGtQx86lKhdQ/
uHtOfxPXNjKze+beOCY3Ro/1DoGNt81152baJxmYXGL+e+/1I/o8WIeo3gsxz1WQ8uLsU9Nnfc5xef/
GLionBhkh7XgajvhkI9msHY+EJarVXf2/y9RG0J2hN1HOXvz7jvtUM/OBTbA71jw465bRT3XZX/
XuKOyULbvtCxWcnPa5i4c4GnB59O7XXrWTW+O0pV6t/
tcv7e15uk7yVuP0bVLWnE7YH6YWaH3L0/6fr04C4Cm/
dtjp2yphEmna+lqJSquBTbcq78l5oWF3cFfOi6oQW9ZJWaG3L44HDJ8/3mv1YxPYPDB4fLHj+emxpX6D1Eb
ZekV+mHrouuwpt/
tXvNJWv0vc3f09ODT4f2UGVGM4mCW0l69uSzidLr43rlk6ZDV7IXJioAmpiaiA2OxifHI4+h/ONg6/
Vby66MXWz6dtT3SZz2lnbdctUtieb8jcoAiBKXNTI2OTYvnTfue61QanShIRb5Ots6tfFtG2PXK5TaWujYD
DI5Vg2v0pr71qj/
vn56nFJWz5WlS02fbqYq00m3QdzfgGZMQ0fjoYryIlDoJLheUoPqVdT2CVJs4wKG3HTL4YPDiaoID/
QN6NAPDs3rwQub1iW/p7OtpS00RbmzrTO0Gml3R3do4Z1CY3PDKkYm7V3Kt7Rj6bz3Eha4BH8Y899/
pT63Y5NjGto/VLC3KOpkef2K9QXHTnZ3dC/
YB0s7lspkOjF1Yt72S1KBs5jgPjiJTzLOOlieX8U3v4pysdWPk4r7HCQVjK+WtGBbb963ea56eLBO0uJTcQ
pVs87dn6V8bt//M+/
XmkvW6ItPfjF2vRa1aM0la4p67sxoJvazf2LqhO7+8t069IND86ocB9NxBd9rhT6PY5Njc9+XYdWFo6oor7
lkTexnIm57hvUk5TLZ3PPm9uJTBTc99VxZupwLd5WsMl1LSbdB3N+Aek9Dx+JAinIK6i1FuZBlHcs08qH62
471ov++/
siT4CRpVVGpny1q0Qeu+kBo71yh9J6k0+FIrwUo+eu3W7tkmhcUd7Z16uYrb14wFU7u60elJpUS5J7fdr6W
tC0pmCJqsgVzYCZNc6yE9pZ23XvjvaEnMIXaEWw7SYn3mRT/
2UqaFi0t3C9xqWJJ09PSSMkr5jMdpd3ade9N9xbV1kp8X7daqz5106dij49gf5byuW23ds34TKLidcWkepa
zzcO+Pwop5zNSampr/
rRLgSTfV+WmzZKiXDnVmFqontOnqyXpNoj7Xq3U8CcgFynKKBrTBC2Um2IY18OT5EQ1qtDJOZ3TrsO7dNv9
t2ndznVaObxSb9n+Fm3at6lgek8xVWInpiZC1z/rZzV9bnru9/PbzldHW0fklCTB60ddhS3lc/
Tq9KuJxj+GVa8tt5JzMc6eO6tN+zZp5fBKrR5ePa/
AUNxV6VZrndt29zx8T1GBRNzzFtNTGjUHciD3s37Xl+5KlFpWiZS8/
DTeYrdPmLN+Vvc8fE+ilODgPZWboizNprff/aW71X9ff8GexlJSMc/
62UTBrZTsOylQTrXps362qOBWmt3um/
ZtKikF+IqlVxS1PDDQN6Ch64bmpd4v61iW6PtqbHKsrlOWa13IJ2kxonLbWK2pheo5fbpakm6DuL8B9bQda
32MoHbowU1Bo/XghvWOLWbF9GokKehSTG9bnNz9VMxz9nb1anxyvCJt6O3q1akzp0KD/
rjiPpWS3wOUtNBSmu0xM7169tWKP3dcZsXQ/
qGyp5TZsWGHpOS9yiZL1HOSpKelEr21cZL20D49+HTVvq9z92dcVki5iikyVanvplIU05tb6POeWygxN809
SL0Oy2LoaOsoah+U0vucZg9utQobhR3PkkJ7xVvUoqUdSzUxNTGXdh6XDZRUNXtWq9FTXI5qtK8Sr5GkUGL
amqn4F4rvwSXATUGjBbjFVHddDIpNISx0olKpVNrcP+Zr7luTqOfTZNq+YXvZ4xpzRaU2R1VSbW9p1/t/
5v164NsPFN3jEyb3ZLVFLYl7tkodJ1wrnW2dWnb+stCTjEp8pkoNziuR4lyN9PLert7Y8dFBIJj0WCpX7vd
s2gF+ENgVOrGsZpp/mCQBSpKLOcH3nJT8gk13R7dOTp0s6juh2IDqp7b/
VGiBx3Zr13c3fzfx84SpRtBX7uc06ju32DZGXYipp4vz1Qo8GyFgq5d2knLeXEhRRtHOTJ+pdRPqSjEnfHF
VTYPUmKAIU7nWr1g/
dzvp891y1S1zKUPt1l52G6TZ1MS2lja1Wquk2ZPprvO6tGnfptAT0bPnzmrP43sqEtxK81Nukwa3+Y9rBKe
mT0Wm5FWiWMep6VMl9TzHVcOMSwcOjoeVwyurElSNTY5p9+HdkffP+Iwyo5mKHJtJnJw6OXc7P72vkJYi/
1QHBaNmfEa7Du/S0P7wCt6V/
F4oRaHPcdJMBZdr+OBwUSnXxQa30muFspJqbwvftlHLi1GNQj7lpLBL0d+5+UXZCqWQRg3JaLGWukg9TTOF
upQhJLVWrSrKhT47ccdItdLry1Hr1290VFGGXp2ufHplIytUTTdX1JiSzGhm3tzDlQiu9h7ZqzWXrNFA30D
i1LpjLx977ReTKhXj5f7xmvEZPf+T52PXL3UaIbwmGL+4ad+moj6jaYg6cYgKXIMTvrR6LMMk6bFPUv03GE
tWbtuDk/GOtg6dnj6tczqnVmvVLVfdMpfKFyZuWEBSuw/vDu3FHe
gb0D0P35NaunQhYYFLqZW0iw3serp6StquQXVlqXAl4KgLSJUY0hBVxTb4nFWiFzGtqrdBpf78NOeo6tVR1
bCDY6aaVa/
DemrjArpy2pPfExr1HRGMFa92SnVUGnI1Lr4UqlYvRR8jSzuWFnxskudPU61fvxmQopyCRktRlqjomKuY/
Zc79itXMWmP7S3tiXs3g0nUN+3blLiNqy9arWdOPEOQiYoJPof50wmdnDpZVK96JRRz/
NTra0Sl2lcyrT73Oz73JL2exuCWkxJbTA0Ak+mWq27RA48/
EDtHfJTujm6dnj49r53Bc+b+Paj2GNx8paSF5n42pMpnvgRDVvLH5uYKSyHNbVeLtYT+PUs79TQq9TZuGqp
yUqhLGUIQzIQQNuVWKaJSr6OyK2696lYdOHagrNTgJOneUdumu6Nb5y85f256uJ+c+cmC4VRR4+9z21fr9O
Zav349WlxjcC+80EfWFDfnXzV8/fhjtW5CUUzSOy57R62bURdeevUlPf2jpxP/STeZ3nHZNQuWp/
kZaLUWzXh1gwgg0GotOq/tPL16tnq9sYtBBRMsQp3XtkSXLb1M0mxmRy2/
Q9pa2mSSps9Na0m2XReff7G+Of5NnS5hyEyrtWjFRSskJX9v57UtKem14pikla9fqYvPv1hS/
N+Bd1bgb+5Lr76k4yePZ4cZhV8MaWtpU2tLi05Pn5m7YHJe2xJ1dyzTxNQJnZk+M7cPpPQ/
G7ntiXNezuci32PHH4s8VlblbP8wudtsScxrSNKxE8/qhR+/
IJfLZGoxC902UReizmtborf3vD2yLYXEvc9iBN8tufs/
7H3nb5vujmV66ScvznvPwbH29I+eiRgXLbW2tM2boUGSWsz05oveHLqtc1+3taVN53xG53Jik+A1cx9byrZ
pb2nTm5a9SUd/FH5xKfdcOO75K3HsFhL1+ov5fN3+
+Z+LCnBJUUaDjUxMz2xw+0xR26PavR8mEdyipghu05H2N8np6TORJ3bVNnNueu79Bu168ccvlhRwmmzBye/
xk8djn+u8tiWp1J7w7GvHBVjFyD3xb7EWnfNzc4HKG173Bq1YdsXcaz0WEUxPn5vW9LmgfbNb/
fT0GT3/49eGlZyePqNjLx/L9oym+/dl5ty0ZhK8xOnpM3rm5WckSReff3FeMB8tGJYTFUjlBvDB+w5b/
9iJZ+dtI5drJqJDyOULLjy3WsvcRYNSLanQRRif+/+1/f/0j56e933QYrO1AILA8vT0Gb3w4+cXfC/
N+DkdP3k88tzHpQXB7bxG5MnfJ2GPDV4zdx+Vsm3O+Tm9cvrHkRcTl7QtmWtT1CVHy95fqWM8StT7C9qIwh
q7B5cU5YooZlqJZnXb/bfp0eOPFv24qBSk1cOrq56qCQCLXZAqvO/JfaFpiEHF5XLGHp/
ffn7sONodG3YkmqIqTpIU5FuvulWSYsdw15vujm6ZLPG2b7d2vf9t7y9qWrSoNM5CKb/
XXnatPvcbn1NmNFPUMKD8lPUWteidl71Tz558tqQ04dxx6FG9w402K4A0v3p4sWPtg+M6+KybTGamc0VekI
mqX1FMJfZWa9U5P7dgv0ZNqZU/
bVlwDATTaUVNpTe4b3DeeWSLWjS8obxx3Y1scaUoE+BWzGIeg1vunKJh264RPwMAgPK1t7Tr3hvvjQ2Sgvn
Jw05wKzHPdb1qsRZ1tHakXtwyLJioZUAYNeY8bD7hZrb6otW65rJrajp/
fZRbr7q16Ha1W7vuveleSdLdX7573njfoPp9ks6OZR3L9PHrPq6BvoGCF7eCGhhS4UJ3zaThA1wzu1HSH0t
qlfT/uPsno9YlwK2cxRzglru/
CHABAEAh1SiKh8bUbu1qb22vyMWfNmvTGy58Q8HgN2yO6SADpd409Dy4ZtYq6U8l3SSpT9IHzKyvtq0CAAA
AykNwiyhn/
WzFMhumfbrgvMxhwa0kbdq3qSnm3K2rAFfSNZKOuvsz7n5G0h5J9XcZAQAAAADqXDAvc664VOz8dRtRvQW4
l0g6nvP7c9llAAAAAIAiBXNbV3rdelVvAa6FLJt3icHM7jCzETMbefHFF6vULAAAAABoPD1dPamsW6/
qLcB9TlLuxGGXSppXQ9zdd7p7v7v3L1+
+vKqNa1ZdS7pq3YSG1dHaEbo8mL4BAAAAiNNi6YVknW2dc5WXAxbapzgrf91GVG8B7v+StNrMVpjZEkkbJT
1Y4zYVrZEqEnct6dI3f/ebtW5GTZW6vzpaO3Tk/z4Set/W67emFuS2VOiwXdaxjIsbAFBnKvUdj/
rT3tL+2m1rj1kTi4XJdOtVt2r4pmH1dvXKZOrt6tWODTu0Y8MO9Xb1Spqd+iqpNmub91z5U1RJ0tHBo6FBb
r1WUS5WPU4TtEHSf9XsNEGfcfdtUevW6zRBAAAAAIDyFTtNUFuajSmFu++TtK/
W7QAAAAAANBbyYAAAAAAATYEAFwAAAADQFAhwAQAAAABNgQAXAAAAANAU6q6KcjHM7EVJ/
1rrdhRwsaSXat0IxGIf1T/2UX1j/9Q/9lH9Yx/VP/ZR/
WMf1bdS98+b3H150pUbOsBtBGY2UkxZa1Qf+6j+sY/qG/un/rGP6h/7qP6xj+of+6i+VWv/
kKIMAAAAAGgKBLgAAAAAgKZAgJu+nbVuAApiH9U/9lF9Y//UP/ZR/WMf1T/
2Uf1jH9W3quwfxuACAAAAAJoCPbgAAAAAgKZAgAsAAAAAaAoEuCkxsxvN7EkzO2pmH6l1e5qdmV1mZgfM7A
kzO2JmH84u/4SZ/cDMvpX92ZDzmI9m98+TZvbenOVrzOzb2fv+xMwsu/w8M7s/u/
wxM7ui6m+0gZnZs9nt+i0zG8kuu8jM9pvZU9n/l+Wsz/
6pIjN7a85x8i0zmzSz3+MYqi0z+4yZvWBm38lZVpXjxsxuz77GU2Z2e5XecsOJ2EefMrPvmtnjZvYFM+vOL
r/CzE7lHE9/nvMY9lFKIvZRVb7b2EfJROyj+3P2z7Nm9q3sco6jKrPo8+z6/
Hvk7vxU+EdSq6SnJb1Z0hJJhyX11bpdzfwjqUfSz2ZvXyjpe5L6JH1C0mDI+n3Z/XKepBXZ/
dWave8bkn5Okkn6kqSbssv/o6Q/z97eKOn+Wr/vRvqR9Kyki/OW/RdJH8ne/oike9k/tf/
Jfof9UNKbOIZqvi/eLelnJX0nZ1nqx42kiyQ9k/1/
Wfb2slpvj3r8idhHN0hqy96+N2cfXZG7Xt7zsI+qu49S/25jH5W3j/Lu3y5pKHub46j6+yfqPLsu/
x7Rg5uOayQddfdn3P2MpD2SBmrcpqbm7uPu/i/Z269IekLSJTEPGZC0x91Pu/
sxSUclXWNmPZK63P1rPntU/a2k9+U85rPZ238n6ReCq04oWe42/
azmb2v2T+38gqSn3f1fY9ZhH1WBu39V0st5i6tx3LxX0n53f9ndT0jaL+nGSr+/
ZhC2j9z9IXefzv76dUmXxj0H+yhdEcdRFI6jGojbR9lt+X5Jn497DvZRemLOs+vy7xEBbjoukXQ85/
fnFB9soYKyKQ1vl/RYdtGHbDZN7DM5qRNR+
+iS7O385fMekz1xOSnp9Wm8hyblkh4ys0Nmdkd22RvdfVya/fKU9IbscvZPbW3U/
BMJjqH6Uo3jhr9jlfPbmu2lCKwws2+a2T+b2brsMvZRbaT93cY+qox1kp5396dylnEc1UjeeXZd/
j0iwE1HWI8E8zFVgZm9TtLfS/o9d5+U9GeSVkq6WtK4ZlNcpOh9FLfv2K/leZe7/6ykmyTdaWbvjlmX/
VMjZrZE0q9I+u/
ZRRxDjaOS+4R9VQFmtkXStKRd2UXjki5397dL2iRpt5l1iX1UC9X4bmMfVcYHNP+iK8dRjYScZ0euGrKsas
cRAW46npN0Wc7vl0oaq1FbFg0za9fsQbfL3fdKkrs/
7+4z7n5O0l9qNn1cit5Hz2l+Klnuvpt7jJm1SVqq5ClPi567j2X/f0HSFzS7L57PpqsEqUUvZFdn/
9TOTZL+xd2flziG6lQ1jhv+jpUpWwjllyTdmk3FUzZd70fZ24c0Oy7tLWIfVV2VvtvYR2XKbs+bJd0fLOM4
qo2w82zV6d8jAtx0/C9Jq81sRbY3ZKOkB2vcpqaWzdH/
K0lPuPuOnOU9Oav9qqSgOt+DkjZmK7atkLRa0jey6RWvmNk7s8/57yVlch5ze/
b2r0l6ODhpQTwzu8DMLgxua7YAy3c0f5vervnbmv1TG/OulHMM1aVqHDf/
KOkGM1uWTd28IbsMCZjZjZLulvQr7v5qzvLlZtaavf1mze6jZ9hH1Vel7zb2Ufn+raTvuvtcWivHUfVFnWe
rXv8eeR1U5mrGH0kbNFth7GlJW2rdnmb/
kbRWs+kKj0v6VvZng6TPSfp2dvmDknpyHrMlu3+eVLaCW3Z5v2b/0D0t6T5Jll3eodm0zaOarQD35lq/
70b50WxF8cPZnyPBMaHZsRVfkfRU9v+L2D813U/nS/qRpKU5yziGartPPq/ZdLyzmr2K/
cFqHTeaHTt6NPvzW7XeFvX6E7GPjmp2zFjw9yioDPrvst+BhyX9i6RfZh/VbB9V5buNfVT6Psou/
xtJv5O3LsdR9fdP1Hl2Xf49Cp4QAAAAAICGRooyAAAAAKApEOACAAAAAJoCAS4AAAAAoCkQ4AIAAAAAmgIB
LgAAAACgKRDgAgCQMjNzM/tczu9tZvaimf1Dic/
3O2b27wus8wkzGwxZfoWZfSfsMQAANLq2WjcAAIBF4CeS/o2Zdbr7KUnXS/pBqU/
m7n9esZYBANBE6MEFAKA6viTpF7O3PyDp88EdZnaRmf0PM3vczL5uZm8zsxYze9bMunPWO2pmb8ztnTWzlW
b2ZTM7ZGaPmNlP5b+wma0xs8Nm9jVJd6b6LgEAqCECXAAAqmOPpI1m1iHpbZIey7nvP0v6pru/TdLvS/
pbdz8nKSPpVyXJzN4h6Vl3fz7veXdK+r/
cfY2kQUmfDnntv5b0u+7+c5V8QwAA1BsCXAAAqsDdH5d0hWZ7b/fl3b1W0uey6z0s6fVmtlTS/
ZJ+I7vOxuzvc8zsdZKulfTfzexbkv5CUk/eOksldbv7P2cXfU4AADQpxuACAFA9D0oalvQeSa/
PWW4h67qkr0laZWbLJb1P0h/
mrdMiacLdr455Tcs+FwAATY8eXAAAquczkra6+7fzln9V0q2SZGbvkfSSu0+6u0v6gqQdkp5w9x/
lPsjdJyUdM7Nfzz7WzOyqvHUmJJ00s7XZRbdW9B0BAFBHCHABAKgSd3/
O3f845K5PSOo3s8clfVLS7Tn33S/pN5WXnpzjVkkfNLPDko5IGghZ57ck/
Wm2yNSpEpsPAEDds9mLwwAAAAAANDZ6cAEAAAAATYEAFwAAAADQFAhwAQAAAABNgQAXAAAAANAUCHABAAAA
AE2BABcAAAAA0BQIcAEAAAAATeH/BwYap6/af917AAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 1152x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"f, ax = plt.subplots(1,1, figsize=(16,4))\n",
"plt.scatter( numberOf_user_voted_for_movie.index,
numberOf_user_voted_for_movie, color='forestgreen')\n",
"plt.axhline(y=10, color='r')\n",
"plt.xlabel('MovieId')\n",
"plt.ylabel('No. of users voted')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "67266069",
"metadata": {},
"outputs": [
{
"data": {
"image/png":
"iVBORw0KGgoAAAANSUhEUgAAA7kAAAEGCAYAAACgpFJJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIH
ZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/
YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABB4klEQVR4nO3df5wldX3n+/
enpxu6B+3pcRm93fwIBFiTMQqRuSzGGVf0gjjJ2sb70EWJer3unTx8YNQrTdDMSlwIj+jSM4nZRG8mCZFsM
Cy7IY82CSgsYmTuNeqMUZFB4/
AjAbsjoDM2wvygZz73j1Onqa6uqlN1TtU5deq8no9HP7q7zjl1vnXOt76/
f5i7CwAAAACAOhjqdQAAAAAAACgKlVwAAAAAQG1QyQUAAAAA1AaVXAAAAABAbVDJBQAAAADUxnCvA1CWk08
+2c8444xeBwMAAAAAUIK9e/
c+6e4bosdrW8k944wztGfPnl4HAwAAAABQAjP7p7jjDFcGAAAAANQGlVwAAAAAQG1QyQUAAAAA1AaVXAAAA
ABAbVDJBQAAAADUBpVcAACAATa3b05bdm3R2bNna8uuLZrbN9frIAFAR2q7hRAAAADSze2b0/
Y7t+vQ0iFJ0vzivLbfuV2SNL1xupdBA4C20ZMLAAAwoGZ3zy5XcJsOLR3S7O7ZHoUIADpHJRcAAGBALSwu5
DoOAP2ASi4AAMCAmhyfzHUcAPoBlVwAAIABNbN5RmPDYyuOjQ2PaWbzTI9CBACdY+EpAACAAdVcXGp296wW
Fhc0OT6pmc0zLDoFoK9RyQUAABhg0xunqdQCqBWGKwMAAAAAaoNKLgAAAACgNqjkAgAAAABqg0ouAAAAAKA
2qOQCAAAAAGqDSi4AAAAAoDao5AIAAAAAaqO0Sq6ZnWZm95jZA2Z2v5m9Pzj+UTP7vpl9I/
jZGnrNh81sv5l918xeFzp+vpndFzz2e2ZmZYUbAAAAANC/yuzJXZJ0pbv/
rKQLJV1hZhuDx37H3c8Lfm6XpOCxyyS9RNKlkj5pZmuC539K0jZJ5wQ/
l5YYbgAAAADoW3P75rRl1xadPXu2tuzaorl9c70OUleVVsl19wV3/3rw91OSHpB0SspLpiXd4u5H3P1hSfs
lXWBmk5LG3f3L7u6S/
kzSG8sKNwAAAAD0q7l9c9p+53bNL87L5ZpfnNf2O7cPVEW3K3NyzewMST8v6SvBofea2bfM7EYzWx8cO0XS
o6GXPRYcOyX4O3o87n22mdkeM9vzxBNPFHkJAAAAAFB5s7tndWjp0Ipjh5YOaXb3bI9C1H2lV3LN7HmS/
lLSB9x9UY2hx2dJOk/
SgqQdzafGvNxTjq8+6L7L3Te5+6YNGzZ0GnQAAAAA6CsLiwu5jtdRqZVcMxtRo4J7s7vfJknu/
gN3P+buxyX9kaQLgqc/Jum00MtPlTQfHD815jgAAAAAIGRyfDLX8Toqc3Vlk/
Qnkh5w952h4+FP95clfTv4+7OSLjOzE83sTDUWmPqquy9IesrMLgzO+Q5JgzOgHAAAAAAymtk8o7HhsRXHx
obHNLN5pkch6r7hEs/9Sklvl3SfmX0jOPYbkt5qZuepMeT4EUm/Kknufr+Z3SppnxorM1/
h7seC171H0qcljUm6I/gBAAAAAIRMb5yW1Jibu7C4oMnxSc1snlk+PgissWBx/
WzatMn37NnT62AAAAAAAEpgZnvdfVP0eFdWVwYAAAAAoBuo5AIAAAAAaoNKLgAAAACgNqjkAgAAAABqg0ou
AAAAAKA2qOQCAAAAAGqDSi4AAAAAoDao5AIAAAAAaoNKLgAAAACgNqjkAgAAAABqg0ouAAAAAKA2qOQCAAA
AAGqDSi4AAAAAoDao5AIAAAAAaoNKLgAAAACgNqjkAgAAAABqg0ouAAAAAKA2qOQCAAAAAGqDSi4AAAAAoD
ao5AIAAAAAaoNKLgAAANCmuX1z2rJri86ePVtbdm3R3L65XgcJGHjDvQ4AAAAA0I/
m9s1p+53bdWjpkCRpfnFe2+/
cLkma3jjdy6ABA42eXAAAAKANs7tnlyu4TYeWDml292yPQgRAopILAAAAtGVhcSHXcQDdQSUXAAAAaMPk+G
Su4wC6g0ouAAAA0IaZzTMaGx5bcWxseEwzm2d6FCIAEgtPAQAAAG1pLi41u3tWC4sLmhyf1MzmGRadAnqMS
i4AAADQpumN01RqgYopbbiymZ1mZveY2QNmdr+ZvT84/
gIzu8vMvhf8Xh96zYfNbL+ZfdfMXhc6fr6Z3Rc89ntmZmWFGwAAAADQv8qck7sk6Up3/1lJF0q6wsw2SvqQ
pLvd/RxJdwf/K3jsMkkvkXSppE+a2ZrgXJ+StE3SOcHPpSWGGwAAAADQp0qr5Lr7grt/
Pfj7KUkPSDpF0rSkm4Kn3STpjcHf05Jucfcj7v6wpP2SLjCzSUnj7v5ld3dJfxZ6DQAAAAAAyxLn5JrZX0v
ypMfd/Q1Z38TMzpD085K+IulF7r4QnGPBzF4YPO0USX8fetljwbFng7+jx+PeZ5saPb46/
fTTswYPAAAAAFATaQtPzQa/3yTpf5H058H/
b5X0SNY3MLPnSfpLSR9w98WU6bRxD3jK8dUH3XdJ2iVJmzZtSqygAwAAAADqKbGS6+5/
J0lmdp27vyr00F+b2ZeynNzMRtSo4N7s7rcFh39gZpNBL+6kpMeD449JOi308lMlzQfHT405DgAAAADACln
m5G4ws59u/
mNmZ0ra0OpFwQrIfyLpAXffGXros5LeGfz9TklzoeOXmdmJwXucI+mrwdDmp8zswuCc7wi9BgAAAACAZVn2
yf2/JX3RzB4K/j9D0q9meN0rJb1d0n1m9o3g2G9I+pikW83s3ZL+WdKbJcnd7zezWyXtU2Nl5ivc/
VjwuvdI+rSkMUl3BD8AAAAAAKxgjQWLWzzJ7ERJPxP8+x13P1JqqAqwadMm37NnT6+DAQAAAAAogZntdfdN
0eMthyub2VpJV0l6r7t/U9LpZvZLJYQRAAAAAICOZJmT+6eSjkp6RfD/
Y5J+q7QQAQAAACnm9s1py64tOnv2bG3ZtUVz+1iuBcBzslRyz3L3/6zGfrVy90OK39YHAAAAKNXcvjltv3O
75hfn5XLNL85r+53bqegCWJalknvUzMYU7E1rZmdJqvycXAAAANTP7O5ZHVo6tOLYoaVDmt0926MQAaiaLK
srf1TS5ySdZmY3q7Fq8rvKDBQAAAAQZ2FxIddxAIOnZSXX3e80s72SLlRjmPL73f3J0kMGAAAAREyOT2p+c
T72OABI2VZXvtvdf+juf+vuf+PuT5rZ3d0IHAAAABA2s3lGY8NjK46NDY9pZvNMj0IEoGoSe3LNbFTSWkkn
m9l6PbfY1LikqS6EDQAAAFhheuO0pMbc3IXFBU2OT2pm88zycQBIG678q5I+oEaF9uuh44uS/
qDEMAEAAACJpjdOU6kFkCixkuvun5D0CTP7NXf/
L10MEwAAAAAAbcmyuvIfmtn7JL0q+P+Lkv7Q3Z8tLVQAAAAAALQhSyX3k5JGgt+S9HZJn5L0H8oKFAAAAAA
A7chSyf1f3f3c0P9fMLNvlhUgAAAAAADa1XILIUnHzOys5j9m9tOSjpUXJAAAAAAA2pOlJ/
cqSfeY2UNqbCP0U5LeVWqoAAAAAABoQ8tKrrvfbWbnSHqxGpXc77j7kdJDBgAAAABATi2HKwfzbz8o6Wl3/
yYVXAAAAABAVWWZk/sGNebg3mpmXzOzGTM7veRwAQAAAACQW8tKrrv/k7v/Z3c/
X9LbJL1M0sOlhwwAAAAAgJyyLDwlMztD0lsk/Xs1enV/
vcQwAQAAAADQlpaVXDP7iqQRSbdKerO7P1R6qAAAAAAAaEOWntx3uvt3Sg8JAAAAAAAdyjInlwouAAAAAKA
vZFldGQAAAACAvkAlFwAAAABQGy0ruWb2ZjN7fvD3fzSz28zs5eUHDQAAAACAfLL05H7E3Z8ys82SXifpJk
mfKjdYAAAAAADkl6WSeyz4/YuSPuXuc5JOKC9IAAAAAAC0J0sl9/
tm9oeS3iLpdjM7McvrzOxGM3vczL4dOvZRM/u+mX0j+NkaeuzDZrbfzL5rZq8LHT/
fzO4LHvs9M7N8lwgAAAAAGBRZKrlvkfR5SZe6+0FJL5B0VYbXfVrSpTHHf8fdzwt+bpckM9so6TJJLwle80
kzWxM8/1OStkk6J/iJOycAAAAAAJn2yX1G0uOSNgeHliR9L8PrviTpRxnDMS3pFnc/
4u4PS9ov6QIzm5Q07u5fdneX9GeS3pjxnAAAAACAAZNl2PFvSrpa0oeDQyOS/
ryD93yvmX0rGM68Pjh2iqRHQ895LDh2SvB39HhSWLeZ2R4z2/PEE090EEQAAAAAQD/
KMlz5lyW9QdLTkuTu85Ke3+b7fUrSWZLOk7QgaUdwPG6eraccj+Xuu9x9k7tv2rBhQ5tBBAAAAAD0qyyV3K
PBUGGXJDM7qd03c/
cfuPsxdz8u6Y8kXRA89Jik00JPPVXSfHD81JjjAAAAAACskqWSe2uwuvKEmf1fkv6nGhXU3II5tk2/
LKm58vJnJV1mZiea2ZlqLDD1VXdfkPSUmV0YrKr8Dklz7bw3AAAAAKD+hls9wd1nzexiSYuSXizpGne/
q9XrzOwvJL1a0slm9pik35T0ajM7T41e4Uck/WrwHveb2a2S9qmxsNUV7t7cn/
c9aqzUPCbpjuAHAAAAAIBVrDESuX42bdrke/
bs6XUwAAAAAAAlMLO97r4pejyxJ9fMdrv7ZjN7SisXezJJ7u7jJYQTAAAAAIC2JVZy3X1z8LvdlZQBAAAAA
OiqLPvkfsLMXtGNwAAAUBVz+
+a0ZdcWnT17trbs2qK5fax7CABAP8iyuvLXJX3EzPab2Q1mtmrMMwAAdTK3b07b79yu+cV5uVzzi/
Pafud2KroAAPSBlpVcd7/J3beqsaftP0r6uJl9r/
SQAQDQI7O7Z3Vo6dCKY4eWDml292yPQgQAALLK0pPbdLakn5F0hqTvlBIaAAAqYGFxIddxAADqog7TdbLMy
W323F4r6X5J57v7vys9ZAAA9Mjk+GSu4wAA1EFdputk6cl9WNIr3P1Sd7/
R3Q+WHCYAAHpqZvOMxobHVhwbGx7TzOaZHoUIAIDy1WW6TuIWQk3u/
v+Y2RvM7FXBob9z978uOVxAR+b2zWl296wWFhc0OT6pmc0zmt443etgAegTzfSCdAQAMEjqMl2nZSXXzH5b
jUWnbg4Ovc/MfsHdP1xqyIA2NYdZNFuhmsMsJFFABZDZ9MZp0gwAwECZHJ/U/
OJ87PF+kmW48i9KujgYqnyjpEuDY0Al1WWYBQAAANBNdZmuk3V15YnQ3+tKCAdQmLoMswAA9Jc6rEgKYLBN
b5zW9Zdcr6nxKZlMU+NTuv6S6/
tuZFPL4cqSflvSP5jZPZJM0qskMVQZlVWXYRYAgP7BVBkAdVGH6Tote3Ld/
S8kXSjptuDnFe5+S9kBA9pVl2EWAID+wVQZAKiOLD25krQh+L1G0i+Ymdz9tpLCBHSEVVEBAN3GVBkAqI4s
qyvfKOllku6XdDw47Gr06gKVVIdhFgCA/
sFUGQCojiw9uRe6+8bSQwIAANCnZjbPrJiTKzFVBgB6JUsl98tmttHd95UeGgAAgD7EVBkAqI4sldyb1Kjo
/oukI2qssOzu/
rJSQwYAANBHmCoDANWQpZJ7o6S3S7pPz83JBQAAAAD0sbl9c7UcgZKlkvvP7v7Z0kMCAAAAAOiKOu/
v3XKfXEnfMbPPmNlbzexNzZ/SQwYAAAAAKEWd9/
fO0pM7psZc3EtCx9hCCAAAAAD6VJ33925ZyXX3d3UjIAAAAACA7qjz/t5ZhisDANBVc/
vmtGXXFp09e7a27NqiuX1zvQ5SR+p2PQCA/
jezeUZjw2MrjtVlf+8sw5UBAOiaui2EUbfrAQDUQ5339zZ3j3/A7P3u/
gkze6W7/79dDlfHNm3a5Hv27Ol1MAAAOW3ZtSV2+NTU+JTu3XZvD0LUmbpdDzpX1y07AKDbzGyvu2+KHk8b
rtyci/tf2nzDG83scTP7dujYC8zsLjP7XvB7feixD5vZfjP7rpm9LnT8fDO7L3js98zM2gkPAKA/
1G0hjLpdDzrT7NmfX5yXy5d79hnCDgDFSavkPmBmj0h6sZl9K/
Rzn5l9K8O5Py3p0sixD0m6293PkXR38L/
MbKOkyyS9JHjNJ81sTfCaT0naJumc4Cd6TgBAjSQteNGvC2HU7XrQmTpv2QEAVZFYyXX3t0q6UNJ+Sf8u9P
NLwe9U7v4lST+KHJ6WdFPw902S3hg6fou7H3H3h4P3vMDMJiWNu/
uXvTGu+s9CrwGAnmARoXLVbSGMbl0P8bI/0LMPAOVLXXjK3f9F0rlmdoKkfx0c/
q67P9vm+73I3ReCcy+Y2QuD46dI+vvQ8x4Ljj0b/
B09DgA9wSJC5avbQhjduB7iZf+o85YdAFAVLVdXNrN/
q0YP6iOSTNJpZvbOoKe2KHHzbD3lePxJzLapMbRZp59+ejEhA4CQtKGGVCaKM71xulafZ9nXQ7zsHzObZ1Y
0SEj9PVIBAKooyz65OyVd4u7/1t1fJel1kn6nzff7QTAEWcHvx4Pjj0k6LfS8UyXNB8dPjTkey913ufsmd9
+0YcOGNoMIAMkYaohuyTP8mHjZP6Y3Tuv6S67X1PiUTKap8Sldf8n1NEYA6IpBmdqSZZ/cEXf/bvMfd/
9HMxtp8/0+K+mdkj4W/
J4LHf+Mme2UNKXGAlNfdfdjZvaUmV0o6SuS3qE2V3sGgCIw1BDdkHf4MfGyv9RtpAKA/
jBIU1uy9OTuMbM/MbNXBz9/JGlvqxeZ2V9I+rIaqzM/ZmbvVqNye7GZfU/SxcH/
cvf7Jd0qaZ+kz0m6wt2PBad6j6Q/
VmMxqgcl3ZHrCgGgQHVbFAnVlHcFXuIlAKCVQVrdPUtP7nskXSHpfWrMkf2SpE+2elGwOnOc1yY8/3pJ18c
c3yPp5zKEEwAKM7dvLnahoLotioRqyjv8mHgJAGhlkKa2tKzkuvsRNebl7iw/OADQe62G8zDUEGVrZ/
gx8RIAkGaQprZkGa4MAANlkIbzoJq6Pfx4UBYiAYBBNkhTW7IMVwaAgTJIw3k6kTSkG53r5vDjQVqIBAAG2
SBNbTH3xG1n+9qmTZt8z549vQ4GgD60ZdeW2OE8U+NTunfbvT0IUfVEK0ZSozWYrVD6D/
EdANCvzGyvu2+KHm9ruLKZbes8SABQTYM0nKddDOmuD0YuAOViOgD6Qd3iabvDla3QUABAhQzScJ52UTGqj
0FaiAToNqYDoB/UMZ621ZPr7n9YdEAAoEqmN07r3m33av/Mft277d6+TeTLklQBomLUfxi5AJSHUS/
oB3WMpy0ruWZ2qpn9lZk9YWY/MLO/
NLNTuxE4AEA1UTGqj+mN07r+kus1NT4lk2lqfIq51UBBGPWCflDHeJpluPKfSvqMpDcH//
9KcOzisgIFAKg2hnTXC3vsAuVgOgD6QR3jaZbhyhvc/U/
dfSn4+bSkDSWHCwBQcQzpBoB0jHpBr2VZUKqO8TRLT+6TZvYrkv4i+P+tkn5YXpAAAACA/seoF/
RS1gWl6hhPW+6Ta2anS/p9Sa+Q5JL+P0nvd/d/
Kj947WOfXAAAAACDahD2QW97n1x3/2d3f4O7b3D3F7r7G6tewQXqoG77lQEAAPJ3tKedeFPHBaWyShyubGb
XpLzO3f26EsIDQPXcrwwAgEFH/o52tBtv6rigVFZpPblPx/
xI0rslXV1yuNAmWgfroY77lQEAMOjI39GOduNNHReUyiqxJ9fddzT/NrPnS3q/
pHdJukXSjqTXoXdoHayPQR5eAiC7uX1ztVooBKg78ne0o914U8cFpbJKXV3ZzF4g6YOSLpd0k6SXu/
uBbgQM+aW18gxCZK6TQR5eAiAbGjaB/kP+jnZ0Em8GdR/
0xOHKZnaDpK9JekrSS939o1Rwq43WwfoY5OElALJh2CPQf8jf0Q7iTX5pc3KvlDQl6T9KmjezxeDnKTNb7E
7wkEdSaw6tg/1neuO0rr/kek2NT8lkmhqf0vWXXL+iJY7518Bgo2ET6D/
k72hHlniDlVruk9uvBnGf3OjQNanRysNNUD981wAGYf9DDAbmlj+H/B3Ip+19ctE/
aOUZHAxTRDvoHagXhq+hDpqVuvnFebl8eW75oKZP5O9AMVIXnkL/
GdTJ5YOm6sMUaZWvHhYpqp9BXjUT9VHHRTM7yQOrnr8D/YJKLtCHqrw6I5WpaqpjQRI0bKL/
1a1S12keWOX8HegnDFcecAxfLFa3Ps8qD1NkqFU11a0gCaAe6rZoZqd5YJXz97qg7DsYqOQOMObBFKubn2e
V519TmaqmuhUkAdRD3Sp1neaBVc7f64Cy7+BgdeUBxsqcxeLzbOBzqCZW7ARQVXVax4E8sNr4fuqH1ZWxCj
1uxeLzbKhbq3xdRHsHJkYnNDo8qitvv5LhWgB6anrjtO7ddq/
2z+zXvdvu7dsKrkQeWHWU1QYHldwBVofhi1WZVzG3b05DFn879dPnWQSGWlVXsyC5Y+sOHVk6ogOHDzBcCw
AKRB6YXzfLcnUo+yKbngxXNrNHJD0l6ZikJXffZGYvkPTfJJ0h6RFJb3H3A8HzPyzp3cHz3+fun2/1HoM4X
DnvcJ9+H75YlfDHhaOX4QFayTpcq05DCAEA3ZEn7+h2WS7L+5H39ZcqDle+yN3PCwXqQ5LudvdzJN0d/
C8z2yjpMkkvkXSppE+a2ZpeBLjK2plI3+
+tjVVZxTcuHJK0xtb01eeJwZFluBaLcwAA8sqbd3S7LNeq7EveVx+97Mnd5O5Pho59V9Kr3X3BzCYlfdHdX
xz04srdfzt43uclfdTdv5z2HoPWk1vHifStWtLOnj1brtXx12TaP7O/
a+GsSjiArLKkF3VMU4BuoScIgypv3lG1MhR5X/
+pWk+uS7rTzPaa2bbg2IvcfUGSgt8vDI6fIunR0GsfC46tYmbbzGyPme154oknSgp6NdVtIn2WlrSqzKuoS
jiArLIsjFK3NAXIooi5gfQE1VNV1gApUhnXlDfvqFoZiryvPnpVyX2lu79c0uslXWFmr0p5rsUci+1+dvdd
7r7J3Tdt2LChiHD2jaolEp3KMnylKisYViUcQFZZpirULU2pojoWmvtZUZXTqkylQXat7sU6NlyUdU15844
qlaFYRLReelLJdff54Pfjkv5K0gWSfhAMU1bw+/
Hg6Y9JOi308lMlrR5HMODiEokRG9Gho4e6VoAqssCWpSWtKnOKqxKOQUQloX2ttuyoUsGjjuIKmFfefqXOm
j2LuNwjRVVO6QnqL1kqe3VsuCjrmvLmHVUpQzXjwTE/
tuqxMvK+MssvlI0ahrv9hmZ2kqQhd38q+PsSSddK+qykd0r6WPC7+Y18VtJnzGynpClJ50j6arfDXXXNxKA
5B2jd6Do9ffRpHTh8QJKWE+3wc4sUXa2u0/
ebHJ+MnRMRbUmb3jhdicpkVcIxSIqOc1gpmqYwr7BYcQXM5rw04nJvFFU5zZp/
oRrSKnvN+6+ODRdlXVM7eUcVylDdXES0zPILZaPn9KIn90WSdpvZN9WorP6tu39OjcrtxWb2PUkXB//
L3e+XdKukfZI+J+kK95hmFqzomVl7wlo9e/zZFY+X2epYdIsgvUhopY4t61XTqrcX7WtVkCQud19RQ/
TJv/pLlspeHadvlHlN/Zh3JMWD43688PCXVX6Z2zenq+64irJRoOuVXHd/yN3PDX5e4u7XB8d/
6O6vdfdzgt8/Cr3menc/y91f7O53dDvM/
ajbrY5J551fnG9ruERVhq+gOqLDb+J6SqT+blmPYshR75X1HWQpSNYpLveDoiqn5F/
9JUtlr44NF62uKZr2XXPXNbXOj7rZkFFGGT1tuHWn5+5XXR+ujO7o9nCppPeTtGKOi5R9uEQVhq+gGuKG35
gsdtuBfm5ZD2PIUe+V+R3MbJ5
Zce44dYnLvdDOFj5FDtFvJ/9i26HeiLsXoxXYOk7fSLumuLTv5m/
evPzaOuZHWeJBU6f3ahll9KTh1kWcu1/1ZJ/cbhi0fXKjogmU1LhZy2pNjnu/
OEXtM1bXwkBdr6tTST230YpumXG829irr/fK/g6a93tco02d4nKcMtO6bud/
RejHMNcJee9KaaOlwuqWH2WJB0Xcq2Xc70n7DRdx7qpL2ieXSm6NdTvRDr9f0o0W3ty73fDVtTDQy+uqega
flnhPjU9VNtx55b2HUK6keFfGd1D1e7BIZad1/dhA1I9hRn2l5blhg5gfFXWvFp3mJ4Vrja3RDa+/
obb5iUQlF13WKhHopJCTdO6J0QmtPWFt3xYSe1XIyfpd9LIQPggFwG6PhkBrdYt3ValIl/
25drNxoij9GGbU16D25GZR1Xu1rh1AWSRVcnuyTy7qr9WCBp2sLJc0ef7g4YN9vVF7r7YoyPJdlLVpfFZ1X
PQjqtV8Gqn/
9urrd3WKd72+h8PKTuv6cSXcfgwz6isu7Yvq17SwU1W9V1nwbjUquRVSp8Jmq5utk0JO1oSk35ZM71XCmeW
76PV2PYOQeLeK+2Vcc5UqPlVUp3jX63s4rOy0rh8bJ/oxzFVWp/
JUL8SlfZefe3kt0sJOVfle7cetm8rE6soVUceVVNNWl5wYndCBwwdWHc9SyMmyKmlTPy2ZnmdlvyJlWeWvV
73MYXVfbTtthfKyhoSlVXzq/FnnUZd4V4V7uKnstK4fV8LtxzBLq4fAX3TmRbrn4Xt6eg11LE/
1Ql3SvqJluVerMjVk0FHJrYhBKmzO7ZvTT478ZNXxkaGRTIWcuATm0NFDbVeasyo70epmISd8LetG12lkaE
TPHn92+fFogbPbW1INopnNM/
rg7R+Mfazb+1v3U+MQsqnSPVxUWheXJkfPu2Prjp7loXnzjH6rVFR1m5lBKk+hN9LuVRpZqoPhyhUxSIXN2
d2zetafXXX8pBNOyrWH7szmGU2OTy6vRDsyNLLiOUX2DHRrWGdzqMmOrTskSVfefmXhQ62i13Lw8EHJpfWj
6xOHIcUNzxmxER06eojhYAWZ3jit9aPrYx8rc3/rst+PYYPVUMQQuyK/y06H1cWlyVffcbWu/
tzVudLpsuLnIEwFyLKOQC+GxPdLeYq0sZ6qNDVk0FHJrYiqTmQvQ1JG8+PDP858jnYqap3oZqJVduEo7lqe
9Wc1dsJYYoEzOj9nYnRCMunA4QN9VYAru1DR6fk/
8pqPdHWuT9lziwahoJ9Xrwq2nc4vzvpdduv6ktKx8IgUKT2dLjN+DkJBN2ulcWFxoavxvh/
KU53GPSrI1dUvjSyDgC2EKmKQlv4uYvuIbm/t0c0l4/
the41+3Fql7HusqPN3Oiw+7+ubz59fnNcaW6NjfkxT41OFDJXvx3hSpn5O59P2YDzux7VudJ2OLh3VM0vPr
Hi8rOvLuo+nlJy2lRk/q7rNSJGybjMzMTqhI0tHuhbv+
+E+6yTu9cP1DTLyve5jC6GKSGp9K3oVzyq38hXRe9TtlrJutgz3w/Ya/
dhSWXbPSqfnb96zV95+pSRpx9YduYdxttM70Bz6PzY8pmN+TJIK69Hqx3jSrixpbj/
37iV9Z8f82PJommgFVyrv+vKkV0nPzRM/8+ap/
dCb2Kms28yYLDbeX3XHVaWUTfphVfRO0sZ+Tkf6Sbvl6F6svlzlMn8vUcntoqQ5RJt+f5POnj1bs7tnNbN5
puOlv3sxRDDPDVZEBtStAkTzuuYX52WyFY+VlWj1w/Ya/
ViAK7vCldSjkeX8Rd2z7RZ+yio09WM8aUfW76/oOJgn3e20ENTJd1ZGo0aWCpaUnrZljZ/
t3J9V3makKFm3mTl4+GDs64/5sdLKJlXfSqWTtHGQGg97pZM8uduNLJ2Ete6VYyq5XZQ0h6joeY3dbuVrt/
eokwyo3QJE3kJh87okyeXLFd0yE60yCkfh657dPas3veRNHSXA/
ViAK7PCNbdvblUjSJ7zF3XP5i38hBtx8rwu7VzheytPPClzAaCyM/
Gs31+RcTBPultEI0rWSmWcMho1wgVJSbH33/
rR9alpW9b42c792Q+9iUWI5uXXXnztqrw97fsvumzSL4X2TvLQQWk87KWke/
7aL1yb6fVFNLJkjcvtlh8GYc0MKrldlKXAWESC3+1Wvl4MnWmnAJH3ho67Lpcvz6soq7BSxtD16HXfdv9tH
Y0aSAqjpEoVMMKZxDNHnyltBe7Z3bOJ8+
+ynL+oezZP4SfaiJPnfGnnCt9bkjLF5bIy27Iz8byNBEU2DuVJd9Oem7UgFb3n19iaTOEss/
GrWZCcGp+Kvf/
GThhruWVPlvjZ7v0ZLehK1Uofu6VVA0lRZZN+KrR3ks9XsZG5XxoXskqKkwcPH0xsSCzy+vPE5XbTp0EY9s
7CU12UdZGGThemqPOiTJ1IWzjlhtffsCpz6ZfraqVb8aHoxTCKWIApGp4RG9HzTnyeDh4+WOg+xGmL4Dw48
2Bi+JrXN2RDy/Nhw/
J+R3m+g1bpUZ7vrtM4VlYcbbVYUidx4Jq7rtFnvvmZ1MWP4sLfabxuypM+pcXPseGxtu7ZuLgWtX50vT7ym
o+U3ntZVFqd9N0UET8HfbGguX1zuuqOqwpJ55JUccGfou73bp23nTA0p3OF78Gqxe28n1da/
hiNT2Xc23nicrvxPi1fKGrxyW5h4akKyDrcq9MhJ91u5euXoTNpC6dEW8jm9s1pyOJvj3aHFna7lbPIoahZ
JLUKfvD2D+a+5iJa5JOmByweWWxrUac0SXGiOZQyKnp9cQW/
du7ZtN6BaBxMq+DmHT3QaU90u69vdV+1Wiyp3Z6euX1zLSu4Sd9fUXMF86S7Sc9dY2vabsmP21Zs7fDa5ce
LqOBmTTeLyIPS0pwi8tSq9Jr0qsdteuO0bnj9DaWWTao2V7XMnuVezzmOm84VlnekSLfCmmdOfZJofCrj3k
6Ks3H5drvpU1r6WOVREHlQye2iuEJBdPjkiI3o0NFDHSUIRQ13zZo4VXHoTJys84KaCWJRFY+0BLaoDCB6n
mvuuqawoahZpRUk8iaYRWQaeRo1OpX3Hoi7PqlR6eh0iHpc4ScuDibNIc47HL+IBqGk560bXZf6vnH31TV3
XbN8LySFK6ydwkjS8PSmtMaFouJdnjiX9Ny4NE5Kv5ej8/
ub0x6uec01Kz6TA4cPrFhYscyGrrIroUXkqVWogLVT2C8y/
pY9T7nXDe7Rz+q6L1xXiYaNMiTlYWHN+NXr4ePtzqlfP7o+9rEhG1pxDWkV0mjnSdZ7KSnOmmzV69q9r1p1
vNUhrjJcucfCQyjWja7T00efXrGZfdrwyiKGcya9Pu/
wi1ZhqcrQmrThdc2hbXmHNbeSdL6i9g6Mu67o0KGoLO+T5ztLG4oWlnXYWJl7+eYNS1Z5Pq8yhsKnvX/
SZ9HOELNWaVaec4XPefUdV+tZX3mekaERffzSj8eeI+s1ZZH3c281zKsZr8oeopr3Ho0+tznUMO0aoudIup
6kc4UVOQQ+ej0XnXmR7nn4nrbzmLKnp/R6KG07w4WT8sxmL72knufrYUXcb+2WVbIM32/
qtylPcbLsU93cdz2q28PHs97bcWnKbfffFvudhuNVWlmj+TxJucvUV95+ZWy4O/
n8ktLNpPD3S1xNGq5MJbdCsszZ7eSGaXXzZrlp27m50jIeqbuZZJaMvujCTpbMIC4ccfIUVNPO3+pzzlNYy
JO5S43PsdV3XdYcuGg4Ok282y0QFV3gbfV9taqUZQ1/1u86rkGo1We16fc36cDhA7Hhi85/
yhvnkwpb0ffp9PszmXZs3dGycaEqcwTjGinS8pG061lYXMiUzhXR0LVj646uzYFrhjkubsztm9O1X7h2eYu
ctCHaRTcc55Hlvt25dWeuefsjNiKZMsedtLAVWQbo5HydVJKzrrkitbcmQBU6CsLyXG9UNytOWRt3kr77N7
3kTbrlW7ekvr7V/
dWctpQ3Lzhr9qzY4+1+fu00UvYyr8qDSm4fyFoZynPDRDPhLOfupKKXpxKWpSczXKBtFlQ7nRDfqnU6Kbzt
LlaTNzNI+oyTEqislUup+IWAsvbgxmlVwCuiEFv0YiedVBCi52l1fXkKNa2+r6IqW+0unpflerOkOXkbVML
nmByfLKynMWn0xNvOfZuuvfi5LSaKbjBrNfqmVVoZF+48o4XSWvuzfL55rj0tzkr5C4xNSZ9hq7gVd3/
mHX2Q9Z4uukcyaWG7tOuT8jfQSv29GFda+tZqjnk7n5WUnu6vG10nk+nA4QOlL+yUtxLdblosFdsT2Wr0Sl
IYo59fOw140bzpg7d/
MDYczalBefOCohtJ0843s3mmUvdiXiw81QeyzhtZWFxInQPQHOvfvMGzVnCb55YaFdBWYZzbN6fzf/
98nTV7ls6aPUsv/d2X6urPXb1q/
kVSpnHw8MHUeRLRhQ2amXSn8zqa8xei13jg8AFtv3O7Ljrzoth5CnkXq2nOv4ib/
zg2PJY43yMpHiTNKyljK48s88fS5i5nkTbfI8sckyzzW5IWOzGZLjrzolzhjc5nO3j44Kphuu0u2hO9vrxz
59K+r7l9c3rm6DOrHssaH8Kfc9bGmmgczjInKst8ulbzwNL2Ks6y8F8n39+OrTtWVHClbOloVq3m9iellR+
8/
YPa9PublguHcYuxjZ0wtmoBm7j3S5L1881z7WnzbNud33rNXdfoytuvjP0Mw99pnOYemc174ao7rlpVwZUa
PZtp6VqWxYI6XZMg+t1lSaMPLR3S9ju3r0hTk+JvmjxzjKs2ZzUt7AcOH9DVn7s6MQ1OitcToxOp224llXm
aeUxzdEvSwk6tZMkn25mrHZcGJpVpwjpZryVvONPWvoiWJ9LSlKxzvdPyn3bmi7daayBaBm+m80mS0vD5xX
nN7p7Vm17yptrt601PboVkbRlLa8luGhse0+jwaOzwv1YmRie0eHhRx3V81WOXn3u5rr342sRW7DhZhgqGt
Zob21TW9iLNVq1OtndJmyc7NT6li868SH/73b9d1QCR1nKWZxuQqLwrnWZpQWz1/
UyMTmjtCWtThzGWMewm7hrjtnvJu51QJ1uA5W0lz7v1Td7RAlnjQzut9Xl7hJot5Vl6xludp9U0jPD3UHSc
bGo1nDqtpy9NOz2bYWlpRNw1Z41TSZ9vJyMdmpLum3bWTcgzx63dXrmmduJQkXGzk6GkYUMaii0HZNEqjWn
V85V0nUUP4w6f69DRQy3LTOF8rdVIgLyjVYoY9ZVlzYTod1NUj2HafZNlmlIrWae0ZAmPtPJz6LSXs9UUFi
nbFMOsaw3kHUmSlv6lhadfJPXkDvciMIjXjFitCgnNVpy0CHto6VBbw0gkpfb83nb/bTr/
lPN13Reuy1TBlRq9CnF7MSZVwpstW61ahDtdlTJta53pjdMrMqak1589e3Zswh3XguhyrbE1ml+cj91+pFW
hYGJ0IjGBn9k8k1hgkKTDS4cTH4sTl6ibbHmkQFpvitT4fq95zTXL15KUObW76mWrlVCj7nn4nlWf97P+7H
KY5hfndfUdV+u6L1y3otLbfK88BY/
oNUULP83WZ0mJ33XaytBx55jZPJO50UmSxk4Yazmcct3ousTGrrAsjQVpQ1mbxw8ePqgRG9H60fWJ50o6T7
iQc/
4p5ycWgsP3dVKhpJOVWLM0Cpx0wkltzcFLS6+yaI76iGuwi7vmtPMmNbaEP9+4a7jozIs0u3tWV95+ZWJcy
VKJiUufpOdWTm+GJXy+tHs4eq1Zh14nifs804aTS6sLwHnPG/
68ilqxud0KrvRcz6cUn86l9UIm3YPRxsrmSIXrvnBd7u2q4tLlERvRyNBI7EJ6TQcPH1wuI8Wl5eHpYaPDo
6uuKy3Nyfu9tcprkspyzVFrzXAXtfJ3qzJK895vrsqe9/
tKaoBormKcJ9+RVsbRpIpsOJzh+zfck572Gbp8VdkwPBQ9/HlIWhUnb7v/
ttiK5+zu2dSRJHHPb9Vwl1aG6lf05FZcWsaYVqnJKm8vazuiPaPhCkRay1YRPblp869atWq1mqMbtXZ4rU4
cPlEHDx/sqBcg/
N6t5n8NaUjrRtfp4OGDLeddRb+HZiKbVKEIx724+UBJjRTR3pQsLY5x8TxtDnbW+ZutekbSxC2s0krc/
Kp25gRnbdEPnyOpISFOUg9A3l7buHiadL9lrYTnHSGRtiBauMAZvj8nxyd1xroz9OVHv5w4z62dHqMs31uW
3ri0kSBx8qTj0QbH8AiT8DWmxad2eirjRlNEP+
+k+Ld+dL22vnjrih6Ni868qOMFYaLPb8qSPySJ60lpNTcw66iruPstbo71MT/WUQW1DNGwp/
WyxS2C1eo7SUsH8qwmOzE6oaeOPJWrXJQW31rF8fAinHniXNwaAHl7gotcs6FVGt/
pnOJW1xbX2Cplazxqpn2tFpErauGmpPt2yZdiv/
81tkaXveyyFelf2mcRlz5nHZ3SL6spR7HwVMXFJcRxw1mbsmRkcQs7hTVvznYz86yaQ57iKitpheK0BbOyJ
JBxhapmQpu1UDgyNKK3vPQticvIlylcWCpq+FmrIYvRTFPqfAuktNdf85prMi2MFs3AkoaV5S3cliFtOHpY
qyF5WcIfPkeeIZZxGW87cSxrJaUZ1jzhS1pcKRxfktKWPJXqsLRenCw91lm+gyyrp6ct8NTpMNq3nfu25UJ
+UsFTUurnl9RwmTY0NSmfac77zLN2RCvN+yJLw090ReympJVN417fvK6k+FhU+i2tjIdS/
GI2cZorxTYLynleW5Rwnpb03UyMTmjve/
euKhscPHRQzzy7em2BsOgIg73f3xs7aipNMz7kST9aDTeOruIb1+DfTnoV/
U7b+T53bt0pKb4yuHZkrX7r4t9quQBV3tFOTXFDvyXFduy0mzeFz9fq+e2WZfIu3FRkehCnk/
y9X1ZTjqKSWzGtKnGdituiZ93oOh1dOqpnlhoZRd6eyiyGNKTR4dHl94hK6jWQ0nsOm+c+ruOxPXxxPYFFm
hidWF7lsJuamUAR30+ezyXP9ab1uKbNu+pEq7linVYGuqHZOhuuDIdbj7OkEWPDY8u9k1klVdbanYfYqjcg
r+h31/y/1bzzcIGvzAJEOFzRRqFWlaq0nuK0PRmzat6LafG/
WYlICmurdKL5OafNfQ5LG81QponRiVy7CkTnvmWZnxl+r+jUomb8OP+U89tOA4vKy5K29CqqgTtPOJv5RNL
onre89C0tGwjL1Fw8KFpeWju8VoeXDrfVQ96sBOedY94Nzft27/
f36uZv3hz7nLiyV5aG3F4z2XI6kGWF8ahoha/Vlj5JDRjRdD7pcy5C2pzcVg3nnY5k6qXBq+Q+//m+5/
zzex2MWE8+86Qe+uFDOl5SIfzE4RN02rrTdPLak1e978M/eljHfGUivcaGdNw7D41JOutfnaVHf/
yojiwdzfT8Fz7vRTpz/
Rl6+MAjevwnP0gNQ1w419iQTj5pg558+olV11W0IZlk0vGa3jOdaH4PBw8f0NGlozph+ARNjK7vyvdSN0Nm
+ukX/LROXnuy/mHhHzLdS3nOLa2Mw2tsSGe+4MzM922cE4dPKDSc/
WTdieM6fOxwy+s3SeOh55pUeA5gkv7Naf9GkvT3j34l8Xkvet6L9IOf/KCD94mvRJtMZ/
2rRtx98pkn9ciBf9LS8aW236eXhmSF5NFDZpXJM0aGhvVT639quWyQFkfyKKoMMRTEq2p8Ws/
laz985ocdx+PhoWEd92Or0t6TT9rQ0b1YlDLSo34XTk+ffOZJPfjDB1M/
o+j9laVcW7SRoWEtHV9aLoNFy2Rp/zfrDXF1hWY5IVqvqAr7u7/
r74WnzOxSSZ+QtEbSH7v7x3ocpLY9+uNHS6nghm/IpPeNq3AUUQkJ3wAP/vDBTK9xSY8HiXuWhCAp7I//
5PGuZIvH5eQCCRrfw3Pf4ZGlo11P3LM4cfgEHV06WrlwhR1316M/
flQnrz1ZRzuoOK6xoVX3jPvqO+WYH9ejP35Up607rWUmnqSsSls/+PGRxUzPc0mLRxaXP6MyPqsThk9Y/
jut4eHxnzze0fskpbcu18M/elhPHflJ3zdwFZVHV6WCK0nPHl/
SQz96SJJ08tqTC2ucOubHNSTTkFlH33lZDf/tiuZrnYirJDfPXwXV+uTLkyefCqenj/
740ZavC99fUrZybZEsCIPUyJPDjSdHlo7qyaefiKmonrHqPHF1hWY5oaqV3CR90ZNrZmsk/
aOkiyU9Julrkt7q7vuSXlPl4cqdbk+QpNVY+nbft9VQpOhQqLxDb7qx+FUV3xvdt3PrzkKH55el3S0lwq/
Ps0Js8/3i5rFLnW0lgu6IW/
SsjKkCWXQ7XW3O4a5OH2C15V27IOv3GT5vO3NMsdKQhrRmaE2uxQ+rIm4IfxU087pW5eE829dFZd3WrUhZp
2hlmXObZWHPqkkarjzUi8C04QJJ+939IXc/KukWSdUdHN5CJ1tUJMmywXY772uylpnbcT+
+Yqx+3AbWaTotDMVtsJ6FyXTD629YTpB6aWJ0QmuH1y7/
v350faaN1ZHdxOjE8nY7eeJnFkmbwLerea+2G9bJ8clc2z803+/ai6/
Vjq07VmwIv3PrzlpUHtYOr9X60fXL13X5uZdnTjuK/
n6LtsbWrJoPO71xOjENaTfNzKqICu7a4bUr0sQkJtPM5plS8tWJ0YnC0wqpUdDsZb7TTBumN07r+kuuX77f
J0YnNDI0suK5Y8NjmfPJ8Hk//vqPFx/wSLiqmkc2P89OrB9dr9mts/r4pR8v5HzdMjY8pp1bd2rve/
dWMuzNdCItvYhLT/
OkLwuLCx1v4xXNr37htF9Y9Tk2/58an8qcR2cJV9K1lpHGlq1fKrmnSHo09P9jwbEVzGybme0xsz1PPPFE1
wKX18zmmcb2JAmaBbDmqpNSI8IPJXxd60fXZ1qKvVWBOe4Getu5b2uZuUUjfjjjlFoXqLI8npSZmUyXveyy
xOtqXlPStSVVepr75bU6FpVWeIkrMIUzhPs+cJ8enHlQD848qD3v3aOPvOYjidfV3E80XGCPPjdLxjIxOlF
IYSvpvTrJ3LJ83lk19+2Vnouf4furlaTrmBqf0oMzD66qGK4daV04TzIyNLLcYBW9l/
K8PilDil5LtIFseuO07t12r/bP7Ne92+7V9MbpzJlbWqVg/
ej62Hgap6jKp8m0c+tOPTjzoO77wH3a8949y9d17cXX6obX39AyPGPDY9qxdYcuP/
fyTGFqN6ztalZC4tL/uDRkbHgsNs1My5PyVoo7aXi8/NzLl7+v+z5wn3Zu3bkc/
9tJx9utCDXTjFaVwKa4/DkuDWveb63KAWUK38/
h+z1aMZkan1ouW2RpcIueN2u6NTU+let7apZ50vJIaWU+GW1IzqKde7ZV+pvl/
FPjU9rz3j3L+043v59uNIx0kk5Fy6Jlhb3dToBmg5iUXA4fGRqJTU/zNDhPjk9mzjOjZbmk/Oq//vv/
uqqcsWPrDj0486Du3XZv5s83S7jirjVLR1oV9ctw5TdLep27/4fg/
7dLusDdfy3pNVUeriytXl05bk+uIl7T6hxN0aXoo9v5pO3xl3Wvs6R9EuNW6oyeX1q9xH14ddO0/
YSzrBSXZVW86PL2adtvpO2Fl2fFulbXFffcrKu1Rr+7VkNVwyuQRsMT917ROLVudF3q8KWkfe7Cq4PHvb65
h2bStabdJ1lWME46f1rcb3cLo1b3dNJ31BTe8iFpT7+k+zxNnpUZpfQ43moV9fDnmnS9zc9JSt4HMWlLrLh
ri9tHMy78rT7/5vu6fHmF8mZ8zrp6cvg+SIrzaduytbq+tDQxbsuVtNWU8xyXVu9322qv7qzXkuVao/
Ekbgh+2ur/0feIS5Ol5Dwjy5ZYa4fX6tnjz2Ye4hkNb/
i91o2u0+LhxVXXmLT6ahat9k6Ppoet0o08W5A1rzd6T4e/8zzxKe57zHrPNuNxdHXh6Or4cXuhhv
O4pHwzT74STm+iu2fE7S2dtvp8q73rk4bEZi2/
tvp+o3uZR1dwjn6+ebd5ios7ecrU0biWdn9JrffobacMnyTv6slZzsfqyl1iZq+Q9FF3f13w/4clyd1/
O+k1Va/k9lreCJynstXO+2Y5f9VuurTwVCWseQsAnYQ7y2vbLZBkfY92w19G/
EuqPBV1D7XT8NFJPMxTGezkvHm/
06LSpnbDm+dzyNqYVkScLur6WjUU5j3eK+189r0OZzSNzHvPFdEwniWcaWHJk+aXlcZ0opt5YhENPXmuq52
4UdTn0U7+3+oawpXkIs6f9/2jn2HR15slPFW7f7ql3yu5w2osPPVaSd9XY+Gpt7n7/
UmvoZILAAAAAPWVVMntiy2E3H3JzN4r6fNqbCF0Y1oFFwAAAAAwmPqikitJ7n67pNt7HQ4AAAAAQHX1y+rK
AAAAAAC0RCUXAAAAAFAbVHIBAAAAALXRF6srt8PMnpD0T70OR4KTJT3Z60CgUogTiCJOIA7xAlHECUQRJxC
nrvHip9x9Q/
RgbSu5VWZme+KWusbgIk4gijiBOMQLRBEnEEWcQJxBixcMVwYAAAAA1AaVXAAAAABAbVDJ7Y1dvQ4AKoc4g
SjiBOIQLxBFnEAUcQJxBipeMCcXAAAAAFAb9OQCAAAAAGqDSi4AAAAAoDao5HaRmV1qZt81s/
1m9qFehwfdY2Y3mtnjZvbt0LEXmNldZva94Pf60GMfDuLJd83sdb0JNcpkZqeZ2T1m9oCZ3W9m7w+OEy8Gl
JmNmtlXzeybQZz4T8Fx4sSAM7M1ZvYPZvY3wf/EiQFnZo+Y2X1m9g0z2xMcI14MMDObMLP/
YWbfCcoWrxjkOEElt0vMbI2kP5D0ekkbJb3VzDb2NlTook9LujRy7EOS7nb3cyTdHfyvIF5cJuklwWs+GcQ
f1MuSpCvd/WclXSjpiuC7J14MriOSXuPu50o6T9KlZnahiBOQ3i/pgdD/
xAlI0kXufl5o71PixWD7hKTPufvPSDpXjTRjYOMEldzuuUDSfnd/
yN2PSrpF0nSPw4QucfcvSfpR5PC0pJuCv2+S9MbQ8Vvc/Yi7PyxpvxrxBzXi7gvu/
vXg76fUyIxOEfFiYHnDT4J/R4IfF3FioJnZqZJ+UdIfhw4TJxCHeDGgzGxc0qsk/
YkkuftRdz+oAY4TVHK75xRJj4b+fyw4hsH1IndfkBoVHkkvDI4TVwaMmZ0h6eclfUXEi4EWDEv9hqTHJd3l
7sQJ/
K6kX5d0PHSMOAGXdKeZ7TWzbcEx4sXg+mlJT0j602Bqwx+b2Uka4DhBJbd7LOYY+zchDnFlgJjZ8yT9paQP
uPti2lNjjhEvasbdj7n7eZJOlXSBmf1cytOJEzVnZr8k6XF335v1JTHHiBP19Ep3f7ka0+CuMLNXpTyXeFF
/w5JeLulT7v7zkp5WMDQ5Qe3jBJXc7nlM0mmh/0+VNN+jsKAafmBmk5IU/
H48OE5cGRBmNqJGBfdmd78tOEy8gIJhZl9UY64UcWJwvVLSG8zsETWmOb3GzP5cxImB5+7zwe/
HJf2VGkNNiReD6zFJjwWjfyTpf6hR6R3YOEElt3u+JukcMzvTzE5QY7L3Z3scJvTWZyW9M/
j7nZLmQscvM7MTzexMSedI+moPwocSmZmpMXfmAXffGXqIeDGgzGyDmU0Ef49J+t8kfUfEiYHl7h9291Pd/
Qw1yg1fcPdfEXFioJnZSWb2/Obfki6R9G0RLwaWu/
+LpEfN7MXBoddK2qcBjhPDvQ7AoHD3JTN7r6TPS1oj6UZ3v7/
HwUKXmNlfSHq1pJPN7DFJvynpY5JuNbN3S/pnSW+WJHe/
38xuVSNxWpJ0hbsf60nAUaZXSnq7pPuCOZiS9BsiXgyySUk3BStcDkm61d3/
xsy+LOIEViKdGGwvkvRXjbZSDUv6jLt/
zsy+JuLFIPs1STcHnWkPSXqXgrxkEOOEuddq+DUAAAAAYIAxXBkAAAAAUBtUcgEAAAAAtUElFwAAAABQG1R
yAQAAAAC1QSUXAAAAAFAbVHIBAKgIMzvDzL4dOfZRM5sp+ryhx75oZps6OT8AAFVCJRcAgBozs+FehwEAgG
6ikgsAQB8ws/eZ2T4z+5aZ3RIcO8nMbjSzr5nZP5jZdHD8/zCz/
25mfy3pzsh5xszsluA8/03SWPevBgCA8tC6CwBAf/iQpDPd/YiZTQTHtkv6grv/n8Gxr5rZ/
wwee4Wkl7n7j8zsjNB53iPpGXd/
mZm9TNLXuxN8AAC6g55cAACqw1OOf0vSzWb2K5KWguOXSPqQmX1D0hcljUo6PXjsLnf/
Ucy5XiXpzyXJ3b8VnBcAgNqgkgsAQHX8UNL6yLEXSHpS0i9K+gNJ50vaG8y1NUn/u7ufF/
yc7u4PBK97OuV9kirTAAD0PSq5AABUhLv/
RNKCmb1WkszsBZIulbRb0mnufo+kX5c0Iel5kj4v6dfMzILn/3yGt/
mSpMuD5/+cpJcVfBkAAPQUc3IBAKiWd0j6AzPbEfz/nyT9s6R7zGydGr23v+PuB83sOkm/K+lbQUX3EUm/
1OL8n5L0p2b2LUnfkPTVwq8AAIAeMndGLAEAAAAA6oHhygAAAACA2qCSCwAAAACoDSq5AAAAAIDaoJILAAA
AAKgNKrkAAAAAgNqgkgsAAAAAqA0quQAAAACA2vj/AZ9VgZz2JJT4AAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 1152x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"f, ax = plt.subplots(1,1, figsize=(16,4))\n",
"plt.scatter(numberOf_movies_voted_by_user.index,
numberOf_movies_voted_by_user, color='forestgreen')\n",
"plt.axhline(y=50, color='r')\n",
"plt.xlabel('UserId')\n",
"plt.ylabel('No. of movies voted')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "ada71e7f",
"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>userId</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>10</th>\n",
" <th>...</th>\n",
" <th>601</th>\n",
" <th>602</th>\n",
" <th>603</th>\n",
" <th>604</th>\n",
" <th>605</th>\n",
" <th>606</th>\n",
" <th>607</th>\n",
" <th>608</th>\n",
" <th>609</th>\n",
" <th>610</th>\n",
" </tr>\n",
" <tr>\n",
" <th>movieId</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>4.5</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>3.0</td>\n",
" <td>4.0</td>\n",
" <td>2.5</td>\n",
" <td>4.0</td>\n",
" <td>2.5</td>\n",
" <td>3.0</td>\n",
" <td>5.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>5.0</td>\n",
" <td>3.5</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 610 columns</p>\n",
"</div>"
],
"text/plain": [
"userId 1 2 3 4 5 6 7 8 9 10 ... 601 602
603 \\\n",
"movieId ...
\n",
"1 4.0 0.0 0.0 0.0 4.0 0.0 4.5 0.0 0.0 0.0 ... 4.0 0.0
4.0 \n",
"2 0.0 0.0 0.0 0.0 0.0 4.0 0.0 4.0 0.0 0.0 ... 0.0 4.0
0.0 \n",
"3 4.0 0.0 0.0 0.0 0.0 5.0 0.0 0.0 0.0 0.0 ... 0.0 0.0
0.0 \n",
"4 0.0 0.0 0.0 0.0 0.0 3.0 0.0 0.0 0.0 0.0 ... 0.0 0.0
0.0 \n",
"5 0.0 0.0 0.0 0.0 0.0 5.0 0.0 0.0 0.0 0.0 ... 0.0 0.0
0.0 \n",
"\n",
"userId 604 605 606 607 608 609 610 \n",
"movieId \n",
"1 3.0 4.0 2.5 4.0 2.5 3.0 5.0 \n",
"2 5.0 3.5 0.0 0.0 2.0 0.0 0.0 \n",
"3 0.0 0.0 0.0 0.0 2.0 0.0 0.0 \n",
"4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"5 3.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"\n",
"[5 rows x 610 columns]"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data_final =
data.loc[numberOf_user_voted_for_movie[numberOf_user_voted_for_movie >
10].index,:]\n",
"data_final = data_final.loc[:,
numberOf_movies_voted_by_user[numberOf_movies_voted_by_user >50].index]\n",
"data_final.head()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "952d9a7e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(9724, 610)"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data_final.shape"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "574d46b7",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(9724, 610)"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.shape"
]
},
{
"cell_type": "markdown",
"id": "790df0fc",
"metadata": {},
"source": [
"### REMOVING SPARSITY "
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "27a8fbb5",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.7333333333333334\n"
]
}
],
"source": [
"trial_sample = np.array([[0,0,3,0,0], [4,0,0,0,2], [0,0,0,0,1]])\n",
"sparsity = 1.0 - (np.count_nonzero(trial_sample) / float(trial_sample.size))\
n",
"print(sparsity)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "c81fbe53",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" (0, 2)\t3\n",
" (1, 0)\t4\n",
" (1, 4)\t2\n",
" (2, 4)\t1\n"
]
}
],
"source": [
"csr_sample = csr_matrix(trial_sample)\n",
"print(csr_sample)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "344324b4",
"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>userId</th>\n",
" <th>movieId</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>601</th>\n",
" <th>602</th>\n",
" <th>603</th>\n",
" <th>604</th>\n",
" <th>605</th>\n",
" <th>606</th>\n",
" <th>607</th>\n",
" <th>608</th>\n",
" <th>609</th>\n",
" <th>610</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>4.5</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>3.0</td>\n",
" <td>4.0</td>\n",
" <td>2.5</td>\n",
" <td>4.0</td>\n",
" <td>2.5</td>\n",
" <td>3.0</td>\n",
" <td>5.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>5.0</td>\n",
" <td>3.5</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 611 columns</p>\n",
"</div>"
],
"text/plain": [
"userId movieId 1 2 3 4 5 6 7 8 9 ... 601 602
\\\n",
"0 1 4.0 0.0 0.0 0.0 4.0 0.0 4.5 0.0 0.0 ... 4.0 0.0
\n",
"1 2 0.0 0.0 0.0 0.0 0.0 4.0 0.0 4.0 0.0 ... 0.0 4.0
\n",
"2 3 4.0 0.0 0.0 0.0 0.0 5.0 0.0 0.0 0.0 ... 0.0 0.0
\n",
"3 4 0.0 0.0 0.0 0.0 0.0 3.0 0.0 0.0 0.0 ... 0.0 0.0
\n",
"4 5 0.0 0.0 0.0 0.0 0.0 5.0 0.0 0.0 0.0 ... 0.0 0.0
\n",
"\n",
"userId 603 604 605 606 607 608 609 610 \n",
"0 4.0 3.0 4.0 2.5 4.0 2.5 3.0 5.0 \n",
"1 0.0 5.0 3.5 0.0 0.0 2.0 0.0 0.0 \n",
"2 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 \n",
"3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"4 0.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"\n",
"[5 rows x 611 columns]"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"csr_data = csr_matrix(data_final.values)\n",
"data_final.reset_index(inplace=True)\n",
"data_final.head()"
]
},
{
"cell_type": "markdown",
"id": "6628636d",
"metadata": {},
"source": [
"# "
]
},
{
"cell_type": "markdown",
"id": "bbc10ec8",
"metadata": {},
"source": [
"# MODELS"
]
},
{
"cell_type": "markdown",
"id": "8d025257",
"metadata": {},
"source": [
"# "
]
},
{
"cell_type": "markdown",
"id": "de22250a",
"metadata": {},
"source": [
"## MODEL1 : USER-BASED COLLABORATIVE FILTERING "
]
},
{
"cell_type": "markdown",
"id": "d835351d",
"metadata": {},
"source": [
"### (Memory based approach) "
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "38dabc9e",
"metadata": {},
"outputs": [],
"source": [
"#code"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "9ed13203",
"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>movieId</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>Adventure|Animation|Children|Comedy|Fantasy</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>Jumanji (1995)</td>\n",
" <td>Adventure|Children|Fantasy</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>Grumpier Old Men (1995)</td>\n",
" <td>Comedy|Romance</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>Waiting to Exhale (1995)</td>\n",
" <td>Comedy|Drama|Romance</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>Father of the Bride Part II (1995)</td>\n",
" <td>Comedy</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" movieId title \\\n",
"0 1 Toy Story (1995) \n",
"1 2 Jumanji (1995) \n",
"2 3 Grumpier Old Men (1995) \n",
"3 4 Waiting to Exhale (1995) \n",
"4 5 Father of the Bride Part II (1995) \n",
"\n",
" genres \n",
"0 Adventure|Animation|Children|Comedy|Fantasy \n",
"1 Adventure|Children|Fantasy \n",
"2 Comedy|Romance \n",
"3 Comedy|Drama|Romance \n",
"4 Comedy "
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"movies.head()"
]
},
{
"cell_type": "markdown",
"id": "cb825d83",
"metadata": {},
"source": [
"Cleaning the title"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "e77bcac5",
"metadata": {},
"outputs": [],
"source": [
"import re\n",
"\n",
"def clean_title(title):\n",
" #replace any non word or number characters\n",
" title = re.sub(\"[^a-zA-Z0-9 ]\", \"\", title)\n",
" return title\n"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "ee84a139",
"metadata": {},
"outputs": [],
"source": [
"movies[\"clean_title\"] = movies[\"title\"].apply(clean_title)\n"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "1b6b1ac4",
"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>movieId</th>\n",
" <th>title</th>\n",
" <th>genres</th>\n",
" <th>clean_title</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>Adventure|Animation|Children|Comedy|Fantasy</td>\n",
" <td>Toy Story 1995</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>Jumanji (1995)</td>\n",
" <td>Adventure|Children|Fantasy</td>\n",
" <td>Jumanji 1995</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>Grumpier Old Men (1995)</td>\n",
" <td>Comedy|Romance</td>\n",
" <td>Grumpier Old Men 1995</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>Waiting to Exhale (1995)</td>\n",
" <td>Comedy|Drama|Romance</td>\n",
" <td>Waiting to Exhale 1995</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>Father of the Bride Part II (1995)</td>\n",
" <td>Comedy</td>\n",
" <td>Father of the Bride Part II 1995</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9737</th>\n",
" <td>193581</td>\n",
" <td>Black Butler: Book of the Atlantic (2017)</td>\n",
" <td>Action|Animation|Comedy|Fantasy</td>\n",
" <td>Black Butler Book of the Atlantic 2017</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9738</th>\n",
" <td>193583</td>\n",
" <td>No Game No Life: Zero (2017)</td>\n",
" <td>Animation|Comedy|Fantasy</td>\n",
" <td>No Game No Life Zero 2017</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9739</th>\n",
" <td>193585</td>\n",
" <td>Flint (2017)</td>\n",
" <td>Drama</td>\n",
" <td>Flint 2017</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9740</th>\n",
" <td>193587</td>\n",
" <td>Bungo Stray Dogs: Dead Apple (2018)</td>\n",
" <td>Action|Animation</td>\n",
" <td>Bungo Stray Dogs Dead Apple 2018</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9741</th>\n",
" <td>193609</td>\n",
" <td>Andrew Dice Clay: Dice Rules (1991)</td>\n",
" <td>Comedy</td>\n",
" <td>Andrew Dice Clay Dice Rules 1991</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>9742 rows × 4 columns</p>\n",
"</div>"
],
"text/plain": [
" movieId title \\\n",
"0 1 Toy Story (1995) \n",
"1 2 Jumanji (1995) \n",
"2 3 Grumpier Old Men (1995) \n",
"3 4 Waiting to Exhale (1995) \n",
"4 5 Father of the Bride Part II (1995) \n",
"... ... ... \n",
"9737 193581 Black Butler: Book of the Atlantic (2017) \n",
"9738 193583 No Game No Life: Zero (2017) \n",
"9739 193585 Flint (2017) \n",
"9740 193587 Bungo Stray Dogs: Dead Apple (2018) \n",
"9741 193609 Andrew Dice Clay: Dice Rules (1991) \n",
"\n",
" genres \\\n",
"0 Adventure|Animation|Children|Comedy|Fantasy \n",
"1 Adventure|Children|Fantasy \n",
"2 Comedy|Romance \n",
"3 Comedy|Drama|Romance \n",
"4 Comedy \n",
"... ... \n",
"9737 Action|Animation|Comedy|Fantasy \n",
"9738 Animation|Comedy|Fantasy \n",
"9739 Drama \n",
"9740 Action|Animation \n",
"9741 Comedy \n",
"\n",
" clean_title \n",
"0 Toy Story 1995 \n",
"1 Jumanji 1995 \n",
"2 Grumpier Old Men 1995 \n",
"3 Waiting to Exhale 1995 \n",
"4 Father of the Bride Part II 1995 \n",
"... ... \n",
"9737 Black Butler Book of the Atlantic 2017 \n",
"9738 No Game No Life Zero 2017 \n",
"9739 Flint 2017 \n",
"9740 Bungo Stray Dogs Dead Apple 2018 \n",
"9741 Andrew Dice Clay Dice Rules 1991 \n",
"\n",
"[9742 rows x 4 columns]"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"movies\n"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "f8a37afb",
"metadata": {},
"outputs": [],
"source": [
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
"#Term Frequency (TF) and Inverse Document Frequency (DF)\n",
"#Document frequency is the number of documents containing a specific term.
Document frequency indicates how common the term is\n",
"#unigrams and bigrams\n",
"vectorizer = TfidfVectorizer(ngram_range=(1,2))\n",
"\n",
"tfidf = vectorizer.fit_transform(movies[\"clean_title\"])"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "60a908e4",
"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>movieId</th>\n",
" <th>title</th>\n",
" <th>genres</th>\n",
" <th>clean_title</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>Adventure|Animation|Children|Comedy|Fantasy</td>\n",
" <td>Toy Story 1995</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7355</th>\n",
" <td>78499</td>\n",
" <td>Toy Story 3 (2010)</td>\n",
" <td>Adventure|Animation|Children|Comedy|Fantasy|IMAX</td>\n",
" <td>Toy Story 3 2010</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2355</th>\n",
" <td>3114</td>\n",
" <td>Toy Story 2 (1999)</td>\n",
" <td>Adventure|Animation|Children|Comedy|Fantasy</td>\n",
" <td>Toy Story 2 1999</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3595</th>\n",
" <td>4929</td>\n",
" <td>Toy, The (1982)</td>\n",
" <td>Comedy</td>\n",
" <td>Toy The 1982</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4089</th>\n",
" <td>5843</td>\n",
" <td>Toy Soldiers (1991)</td>\n",
" <td>Action|Drama</td>\n",
" <td>Toy Soldiers 1991</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" movieId title \\\n",
"0 1 Toy Story (1995) \n",
"7355 78499 Toy Story 3 (2010) \n",
"2355 3114 Toy Story 2 (1999) \n",
"3595 4929 Toy, The (1982) \n",
"4089 5843 Toy Soldiers (1991) \n",
"\n",
" genres
clean_title \n",
"0 Adventure|Animation|Children|Comedy|Fantasy Toy Story
1995 \n",
"7355 Adventure|Animation|Children|Comedy|Fantasy|IMAX Toy Story 3
2010 \n",
"2355 Adventure|Animation|Children|Comedy|Fantasy Toy Story 2
1999 \n",
"3595 Comedy Toy The
1982 \n",
"4089 Action|Drama Toy Soldiers 1991
"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.metrics.pairwise import cosine_similarity\n",
"import numpy as np\n",
"\n",
"#search term\n",
"def search(title):\n",
" #cleaning the title\n",
" title = clean_title(title)\n",
" #turn serch term to vector\n",
" query_vec = vectorizer.transform([title])\n",
" #similarity between serach term and titles\n",
" similarity = cosine_similarity(query_vec, tfidf).flatten()\n",
" #5 most similiar titles\n",
" indices = np.argpartition(similarity, -5)[-5:]\n",
" #reverse result(most similiar is in the last)\n",
" #index movie data acoording to indices\n",
" results = movies.iloc[indices].iloc[::-1]\n",
" \n",
" return results\n",
"search(\"Toy Story\")"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "5ab4753a",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4b4ded379a404a55acfb2a25230256ec",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Text(value='Toy Story', description='Movie Title:')"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "52b3243b923142809a5673ec54071d47",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Output()"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import ipywidgets as widgets\n",
"from IPython.display import display\n",
"\n",
"movie_input = widgets.Text(\n",
" value='Toy Story',\n",
" description='Movie Title:',\n",
" disabled=False\n",
")\n",
"movie_list = widgets.Output()\n",
"\n",
"def on_type(data):\n",
" with movie_list:\n",
" movie_list.clear_output()\n",
" #new value of input\n",
" title = data[\"new\"]\n",
" if len(title) > 5:\n",
" display(search(title))\n",
"#call method on type\n",
"movie_input.observe(on_type, names='value')\n",
"\n",
"\n",
"display(movie_input, movie_list)"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "ae5e111a",
"metadata": {},
"outputs": [],
"source": [
"movie_id = 89745\n",
"\n",
"#def find_similar_movies(movie_id):\n",
"movie = movies[movies[\"movieId\"] == movie_id]"
]
},
{
"cell_type": "code",
"execution_count": 41,
"id": "8cd4362e",
"metadata": {},
"outputs": [],
"source": [
"#Using ratings\n",
"ratings = pd.read_csv(ratings_file)"
]
},
{
"cell_type": "markdown",
"id": "477e159a",
"metadata": {},
"source": [
"Considering similar users"
]
},
{
"cell_type": "code",
"execution_count": 42,
"id": "9ca26a2b",
"metadata": {},
"outputs": [],
"source": [
"#users who watched the movieid and greater than 5 rating(liked the same
movie)\n",
"similar_users = ratings[(ratings[\"movieId\"] == movie_id) &
(ratings[\"rating\"] > 4)][\"userId\"].unique()"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "aab8afbb",
"metadata": {},
"outputs": [],
"source": [
"#movies users who are similiar to us liked(other than provided)\n",
"similar_user_recs = ratings[(ratings[\"userId\"].isin(similar_users)) &
(ratings[\"rating\"] > 4)][\"movieId\"]"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "cc09d569",
"metadata": {},
"outputs": [],
"source": [
"#counts how many times each movie appears in dataset\n",
"#convert it to percentage\n",
"similar_user_recs = similar_user_recs.value_counts() / len(similar_users)\n",
"#movies greater than 10 percent liked\n",
"similar_user_recs = similar_user_recs[similar_user_recs > .10]"
]
},
{
"cell_type": "markdown",
"id": "53e7f3a8",
"metadata": {},
"source": [
"Considering all users"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "0fae7461",
"metadata": {},
"outputs": [],
"source": [
"#all the users who have watched the movies in the set and have given it high
ratings\n",
"all_users = ratings[(ratings[\"movieId\"].isin(similar_user_recs.index)) &
(ratings[\"rating\"] > 4)]"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "b6ebdfa3",
"metadata": {},
"outputs": [],
"source": [
"#percentage of all users who liked the movies\n",
"all_user_recs = all_users[\"movieId\"].value_counts() /
len(all_users[\"userId\"].unique())"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "d1125a55",
"metadata": {},
"outputs": [],
"source": [
"#dataframe with all and similiar users\n",
"rec_percentages = pd.concat([similar_user_recs, all_user_recs], axis=1)\n",
"rec_percentages.columns = [\"similar\", \"all\"]"
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "9f0b5aab",
"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>similar</th>\n",
" <th>all</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>89745</th>\n",
" <td>1.000000</td>\n",
" <td>0.045534</td>\n",
" </tr>\n",
" <tr>\n",
" <th>79132</th>\n",
" <td>0.615385</td>\n",
" <td>0.120841</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2571</th>\n",
" <td>0.615385</td>\n",
" <td>0.262697</td>\n",
" </tr>\n",
" <tr>\n",
" <th>112852</th>\n",
" <td>0.576923</td>\n",
" <td>0.047285</td>\n",
" </tr>\n",
" <tr>\n",
" <th>58559</th>\n",
" <td>0.576923</td>\n",
" <td>0.138354</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2951</th>\n",
" <td>0.115385</td>\n",
" <td>0.026270</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1222</th>\n",
" <td>0.115385</td>\n",
" <td>0.075306</td>\n",
" </tr>\n",
" <tr>\n",
" <th>58998</th>\n",
" <td>0.115385</td>\n",
" <td>0.021016</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1240</th>\n",
" <td>0.115385</td>\n",
" <td>0.057793</td>\n",
" </tr>\n",
" <tr>\n",
" <th>86377</th>\n",
" <td>0.115385</td>\n",
" <td>0.007005</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>241 rows × 2 columns</p>\n",
"</div>"
],
"text/plain": [
" similar all\n",
"89745 1.000000 0.045534\n",
"79132 0.615385 0.120841\n",
"2571 0.615385 0.262697\n",
"112852 0.576923 0.047285\n",
"58559 0.576923 0.138354\n",
"... ... ...\n",
"2951 0.115385 0.026270\n",
"1222 0.115385 0.075306\n",
"58998 0.115385 0.021016\n",
"1240 0.115385 0.057793\n",
"86377 0.115385 0.007005\n",
"\n",
"[241 rows x 2 columns]"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#prefer movies with a difference between similar and all\n",
"rec_percentages"
]
},
{
"cell_type": "code",
"execution_count": 49,
"id": "5196288e",
"metadata": {},
"outputs": [],
"source": [
"rec_percentages[\"score\"] = rec_percentages[\"similar\"] /
rec_percentages[\"all\"]"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "81f1c55a",
"metadata": {},
"outputs": [],
"source": [
"#sort in descending\n",
"#higher the score better the recommendation\n",
"rec_percentages = rec_percentages.sort_values(\"score\", ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 51,
"id": "1e68ef38",
"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>similar</th>\n",
" <th>all</th>\n",
" <th>score</th>\n",
" <th>movieId</th>\n",
" <th>title</th>\n",
" <th>genres</th>\n",
" <th>clean_title</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>8469</th>\n",
" <td>0.115385</td>\n",
" <td>0.005254</td>\n",
" <td>21.961538</td>\n",
" <td>112623</td>\n",
" <td>Dawn of the Planet of the Apes (2014)</td>\n",
" <td>Sci-Fi</td>\n",
" <td>Dawn of the Planet of the Apes 2014</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7850</th>\n",
" <td>0.115385</td>\n",
" <td>0.005254</td>\n",
" <td>21.961538</td>\n",
" <td>93721</td>\n",
" <td>Jiro Dreams of Sushi (2011)</td>\n",
" <td>Documentary</td>\n",
" <td>Jiro Dreams of Sushi 2011</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8301</th>\n",
" <td>0.192308</td>\n",
" <td>0.008757</td>\n",
" <td>21.961538</td>\n",
" <td>106642</td>\n",
" <td>Day of the Doctor, The (2013)</td>\n",
" <td>Adventure|Drama|Sci-Fi</td>\n",
" <td>Day of the Doctor The 2013</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8696</th>\n",
" <td>0.192308</td>\n",
" <td>0.008757</td>\n",
" <td>21.961538</td>\n",
" <td>122920</td>\n",
" <td>Captain America: Civil War (2016)</td>\n",
" <td>Action|Sci-Fi|Thriller</td>\n",
" <td>Captain America Civil War 2016</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7693</th>\n",
" <td>1.000000</td>\n",
" <td>0.045534</td>\n",
" <td>21.961538</td>\n",
" <td>89745</td>\n",
" <td>Avengers, The (2012)</td>\n",
" <td>Action|Adventure|Sci-Fi|IMAX</td>\n",
" <td>Avengers The 2012</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8151</th>\n",
" <td>0.230769</td>\n",
" <td>0.012259</td>\n",
" <td>18.824176</td>\n",
" <td>102125</td>\n",
" <td>Iron Man 3 (2013)</td>\n",
" <td>Action|Sci-Fi|Thriller|IMAX</td>\n",
" <td>Iron Man 3 2013</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8451</th>\n",
" <td>0.192308</td>\n",
" <td>0.010508</td>\n",
" <td>18.301282</td>\n",
" <td>112175</td>\n",
" <td>How to Train Your Dragon 2 (2014)</td>\n",
" <td>Action|Adventure|Animation</td>\n",
" <td>How to Train Your Dragon 2 2014</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8689</th>\n",
" <td>0.192308</td>\n",
" <td>0.010508</td>\n",
" <td>18.301282</td>\n",
" <td>122900</td>\n",
" <td>Ant-Man (2015)</td>\n",
" <td>Action|Adventure|Sci-Fi</td>\n",
" <td>AntMan 2015</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8395</th>\n",
" <td>0.307692</td>\n",
" <td>0.017513</td>\n",
" <td>17.569231</td>\n",
" <td>110102</td>\n",
" <td>Captain America: The Winter Soldier (2014)</td>\n",
" <td>Action|Adventure|Sci-Fi|IMAX</td>\n",
" <td>Captain America The Winter Soldier 2014</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8686</th>\n",
" <td>0.153846</td>\n",
" <td>0.008757</td>\n",
" <td>17.569231</td>\n",
" <td>122892</td>\n",
" <td>Avengers: Age of Ultron (2015)</td>\n",
" <td>Action|Adventure|Sci-Fi</td>\n",
" <td>Avengers Age of Ultron 2015</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" similar all score movieId \\\n",
"8469 0.115385 0.005254 21.961538 112623 \n",
"7850 0.115385 0.005254 21.961538 93721 \n",
"8301 0.192308 0.008757 21.961538 106642 \n",
"8696 0.192308 0.008757 21.961538 122920 \n",
"7693 1.000000 0.045534 21.961538 89745 \n",
"8151 0.230769 0.012259 18.824176 102125 \n",
"8451 0.192308 0.010508 18.301282 112175 \n",
"8689 0.192308 0.010508 18.301282 122900 \n",
"8395 0.307692 0.017513 17.569231 110102 \n",
"8686 0.153846 0.008757 17.569231 122892 \n",
"\n",
" title \\\n",
"8469 Dawn of the Planet of the Apes (2014) \n",
"7850 Jiro Dreams of Sushi (2011) \n",
"8301 Day of the Doctor, The (2013) \n",
"8696 Captain America: Civil War (2016) \n",
"7693 Avengers, The (2012) \n",
"8151 Iron Man 3 (2013) \n",
"8451 How to Train Your Dragon 2 (2014) \n",
"8689 Ant-Man (2015) \n",
"8395 Captain America: The Winter Soldier (2014) \n",
"8686 Avengers: Age of Ultron (2015) \n",
"\n",
" genres clean_title
\n",
"8469 Sci-Fi Dawn of the Planet of the Apes 2014
\n",
"7850 Documentary Jiro Dreams of Sushi 2011
\n",
"8301 Adventure|Drama|Sci-Fi Day of the Doctor The 2013
\n",
"8696 Action|Sci-Fi|Thriller Captain America Civil War 2016
\n",
"7693 Action|Adventure|Sci-Fi|IMAX Avengers The 2012
\n",
"8151 Action|Sci-Fi|Thriller|IMAX Iron Man 3 2013
\n",
"8451 Action|Adventure|Animation How to Train Your Dragon 2 2014
\n",
"8689 Action|Adventure|Sci-Fi AntMan 2015
\n",
"8395 Action|Adventure|Sci-Fi|IMAX Captain America The Winter Soldier 2014
\n",
"8686 Action|Adventure|Sci-Fi Avengers Age of Ultron 2015
"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#merge to get titles\n",
"#left index:movie id\n",
"rec_percentages.head(10).merge(movies, left_index=True, right_on=\"movieId\")"
]
},
{
"cell_type": "markdown",
"id": "a2fa7421",
"metadata": {},
"source": [
"Constructing the function,"
]
},
{
"cell_type": "code",
"execution_count": 52,
"id": "27b8fc88",
"metadata": {},
"outputs": [],
"source": [
"def find_similar_movies(movie_id):\n",
" similar_users = ratings[(ratings[\"movieId\"] == movie_id) &
(ratings[\"rating\"] > 4)][\"userId\"].unique()\n",
" similar_user_recs = ratings[(ratings[\"userId\"].isin(similar_users)) &
(ratings[\"rating\"] > 4)][\"movieId\"]\n",
" similar_user_recs = similar_user_recs.value_counts() / len(similar_users)\
n",
"\n",
" similar_user_recs = similar_user_recs[similar_user_recs > .10]\n",
" all_users = ratings[(ratings[\"movieId\"].isin(similar_user_recs.index)) &
(ratings[\"rating\"] > 4)]\n",
" all_user_recs = all_users[\"movieId\"].value_counts() /
len(all_users[\"userId\"].unique())\n",
" rec_percentages = pd.concat([similar_user_recs, all_user_recs], axis=1)\
n",
" rec_percentages.columns = [\"similar\", \"all\"]\n",
" \n",
" rec_percentages[\"score\"] = rec_percentages[\"similar\"] /
rec_percentages[\"all\"]\n",
" rec_percentages = rec_percentages.sort_values(\"score\", ascending=False)\
n",
" return rec_percentages.head(10).merge(movies, left_index=True,
right_on=\"movieId\")[[\"score\", \"title\", \"genres\"]]"
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "279af22a",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0606e3c1d46242519fa8bdacbf9479ae",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Text(value='Toy Story', description='Movie Title:')"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "63871f4558db4854bd839e5c6de0fc02",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Output()"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import ipywidgets as widgets\n",
"from IPython.display import display\n",
"\n",
"movie_name_input = widgets.Text(\n",
" value='Toy Story',\n",
" description='Movie Title:',\n",
" disabled=False\n",
")\n",
"recommendation_list = widgets.Output()\n",
"\n",
"def on_type(data):\n",
" with recommendation_list:\n",
" recommendation_list.clear_output()\n",
" #title from input widget\n",
" title = data[\"new\"]\n",
" if len(title) > 5:\n",
" results = search(title)\n",
" #highest result in forst row\n",
" movie_id = results.iloc[0][\"movieId\"]\n",
" display(find_similar_movies(movie_id))\n",
"\n",
"movie_name_input.observe(on_type, names='value')\n",
"\n",
"display(movie_name_input, recommendation_list)"
]
},
{
"cell_type": "markdown",
"id": "5edccc17",
"metadata": {},
"source": [
"# "
]
},
{
"cell_type": "markdown",
"id": "87f00c43",
"metadata": {},
"source": [
"## MODEL2 : KNN-BASED COLLABORATIVE FILTERING "
]
},
{
"cell_type": "markdown",
"id": "f5cfd5f3",
"metadata": {},
"source": [
"### (Model based approach) "
]
},
{
"cell_type": "code",
"execution_count": 54,
"id": "092ed58f",
"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>movieId</th>\n",
" <th>rating</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>215</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>110</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>52</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>49</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" movieId rating\n",
"0 1 215\n",
"1 2 110\n",
"2 3 52\n",
"3 4 7\n",
"4 5 49"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"numberOf_user_voted_for_movie = pd.DataFrame(ratings.groupby('movieId')
['rating'].agg('count'))\n",
"numberOf_user_voted_for_movie.reset_index(level = 0,inplace = True)\n",
"numberOf_user_voted_for_movie.head()"
]
},
{
"cell_type": "code",
"execution_count": 55,
"id": "8cb8987f",
"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>userId</th>\n",
" <th>rating</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>232</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>29</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>39</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>216</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>44</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" userId rating\n",
"0 1 232\n",
"1 2 29\n",
"2 3 39\n",
"3 4 216\n",
"4 5 44"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"numberOf_movies_voted_by_user = pd.DataFrame(ratings.groupby('userId')
['rating'].agg('count')) \n",
"numberOf_movies_voted_by_user.reset_index(level = 0,inplace = True)\n",
"numberOf_movies_voted_by_user.head()"
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "2eacac30",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(2121, 334)"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#code\n",
"data_final1 =
data.loc[numberOf_user_voted_for_movie[numberOf_user_voted_for_movie['rating'] >
10]['movieId'],:]\n",
"data_final1 =
data_final1.loc[:,numberOf_movies_voted_by_user[numberOf_movies_voted_by_user['rati
ng'] > 60]['userId']]\n",
"data_final1.shape"
]
},
{
"cell_type": "code",
"execution_count": 57,
"id": "c381d76e",
"metadata": {},
"outputs": [],
"source": [
"from scipy.sparse import csr_matrix\n",
"csr_data = csr_matrix(data_final1.values)\n",
"data_final1.reset_index(inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 58,
"id": "a74ed679",
"metadata": {},
"outputs": [],
"source": [
"from sklearn.neighbors import NearestNeighbors\n",
"knn = NearestNeighbors(metric='cosine', algorithm='brute', n_neighbors=20)\n",
"knn.fit(csr_data)\n",
"def get_movie_recommendation(movie_name):\n",
" n= 10\n",
" movie_list = movies[movies['title'].str.contains(movie_name)] \n",
" if len(movie_list): \n",
" movie_idx= movie_list.iloc[0]['movieId'] #movieId\n",
" movie_idx = data_final[data_final['movieId'] == movie_idx].index[0]
#userId acc to movieId\n",
" distances , indices =
knn.kneighbors(csr_data[movie_idx],n_neighbors=n+1) \n",
" #we are making a list of tuples containing (user_id,dist)\n",
" rec_movie_indices =
sorted(list(zip(indices.squeeze(),distances.squeeze())),key=lambda x: x[1])[1::1]\
n",
" recommend = []\n",
" recommend2 = []\n",
" for val in rec_movie_indices:\n",
" movie_idx = data_final.iloc[val[0]]['movieId']\n",
" idx = movies[movies['movieId'] == movie_idx].index\n",
" recommend.append(movies.iloc[idx]['title'].values[0])\n",
" recommend2.append(val[1]) \n",
" df1 = pd.DataFrame(recommend)\n",
" df2 = pd.DataFrame(recommend2)\n",
" df = pd.concat([df1,df2],axis = 'columns')\n",
" df.columns = ['Title','Distance']\n",
" df.set_index('Distance',inplace = True)\n",
" return df\n",
" else:\n",
" return \"No movies found. Please check your input\""
]
},
{
"cell_type": "code",
"execution_count": 59,
"id": "8a71c741",
"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>Title</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Distance</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0.306580</th>\n",
" <td>Interview with the Vampire: The Vampire Chroni...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.334422</th>\n",
" <td>Three Wishes (1995)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.347906</th>\n",
" <td>Rob Roy (1995)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.354764</th>\n",
" <td>Preacher's Wife, The (1996)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.355391</th>\n",
" <td>Postman, The (1997)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.360387</th>\n",
" <td>Big Bully (1996)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.361993</th>\n",
" <td>RoboCop 3 (1993)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.364585</th>\n",
" <td>Mad Love (1995)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.371235</th>\n",
" <td>Free Willy 2: The Adventure Home (1995)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.372366</th>\n",
" <td>Piano, The (1993)</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Title\n",
"Distance \n",
"0.306580 Interview with the Vampire: The Vampire Chroni...\n",
"0.334422 Three Wishes (1995)\n",
"0.347906 Rob Roy (1995)\n",
"0.354764 Preacher's Wife, The (1996)\n",
"0.355391 Postman, The (1997)\n",
"0.360387 Big Bully (1996)\n",
"0.361993 RoboCop 3 (1993)\n",
"0.364585 Mad Love (1995)\n",
"0.371235 Free Willy 2: The Adventure Home (1995)\n",
"0.372366 Piano, The (1993)"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"get_movie_recommendation(\"Toy Story\")"
]
},
{
"cell_type": "code",
"execution_count": 60,
"id": "77cdbf6a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Enter the number of movies you would love to watch from the above list of
recommendations\n",
"7\n",
"Enter the no of movies from the above list of recommendations that you would
say is irrelevant to your taste\n",
"9\n",
"F_score: 1.2727272727272725\n"
]
}
],
"source": [
"print(\"Enter the number of movies you would love to watch from the above list
of recommendations\")\n",
"p=int(input())\n",
"print(\"Enter the no of movies from the above list of recommendations that you
would say is irrelevant to your taste\")\n",
"ir=int(input())\n",
"\n",
"precision=p/10\n",
"recall=p/(10-ir)\n",
"F_score=(2*precision*recall)/(precision+recall)\n",
"print(\"F_score:\",F_score)"
]
},
{
"cell_type": "markdown",
"id": "50174382",
"metadata": {},
"source": [
"# "
]
},
{
"cell_type": "markdown",
"id": "b0f53b62",
"metadata": {},
"source": [
"## MODEL3 : SVD-BASED COLLABORATIVE FILTERING "
]
},
{
"cell_type": "markdown",
"id": "75ff09c5",
"metadata": {},
"source": [
"### (Model based approach) "
]
},
{
"cell_type": "code",
"execution_count": 61,
"id": "919c0509",
"metadata": {},
"outputs": [],
"source": [
"#specific preprocessing"
]
},
{
"cell_type": "code",
"execution_count": 62,
"id": "041c9eab",
"metadata": {},
"outputs": [],
"source": [
"data = pd.pivot(index = 'movieId',columns = 'userId', data = ratings,values
='rating')\n",
"\n",
"numberOf_user_voted_for_movie = ratings.groupby('movieId')
['rating'].agg('count')\n",
"numberOf_movies_voted_by_user = ratings.groupby('userId')
['rating'].agg('count')\n",
"data.fillna(0,inplace = True)\n",
"data_final =
data.loc[numberOf_user_voted_for_movie[numberOf_user_voted_for_movie >
10].index,:]\n",
"data_final = data_final.loc[:,
numberOf_movies_voted_by_user[numberOf_movies_voted_by_user >50].index]\n",
"\n",
"csr_data = csr_matrix(data_final.values)\n",
"data_final.reset_index(inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 63,
"id": "8389186a",
"metadata": {},
"outputs": [],
"source": [
"#code"
]
},
{
"cell_type": "markdown",
"id": "0004bc23",
"metadata": {},
"source": [
"### Making the model"
]
},
{
"cell_type": "code",
"execution_count": 64,
"id": "b2fee968",
"metadata": {},
"outputs": [],
"source": [
"from sklearn.utils.extmath import randomized_svd\n",
"\n",
"U, S, V = randomized_svd(csr_data, \n",
" n_components=15,\n",
" n_iter=5,\n",
" random_state=42)"
]
},
{
"cell_type": "code",
"execution_count": 65,
"id": "d9ce9bdd",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<2121x378 sparse matrix of type '<class 'numpy.float64'>'\n",
"\twith 72893 stored elements in Compressed Sparse Row format>"
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"csr_data"
]
},
{
"cell_type": "markdown",
"id": "59a66869",
"metadata": {},
"source": [
"### Making the recommendation function"
]
},
{
"cell_type": "code",
"execution_count": 66,
"id": "181c83a4",
"metadata": {},
"outputs": [],
"source": [
"movie_data = pd.read_csv(movies_file)\n",
"data = pd.read_csv(ratings_file)"
]
},
{
"cell_type": "code",
"execution_count": 67,
"id": "d62343b3",
"metadata": {},
"outputs": [],
"source": [
"#Computing the Singular Value Decomposition (SVD)\n",
"\n",
"#Function to calculate the cosine similarity (sorting by most similar and
returning the top N)\n",
"def top_cosine_similarity(data, movie_id, top_n=10):\n",
" index = movie_id - 1 # Movie id starts from 1 in the dataset\n",
" movie_row = data[index, :]\n",
" magnitude = np.sqrt(np.einsum('ij, ij -> i', data, data))\n",
" similarity = np.dot(movie_row, data.T) / (magnitude[index] * magnitude)\
n",
" sort_indexes = np.argsort(-similarity)\n",
" return sort_indexes[:top_n]\n",
"\n",
"# Function to print top N similar movies\n",
"def print_similar_movies(movie_data, movie_id, top_indexes):\n",
" print('Recommendations for {0}: \\n'.format(\n",
" movie_data[movie_data.movieId == movie_id].title.values))\n",
" for id in top_indexes + 1:\n",
" print((movie_data[movie_data.movieId == id].title.values)[0])"
]
},
{
"cell_type": "markdown",
"id": "5b5bbe60",
"metadata": {},
"source": [
"### Recommending"
]
},
{
"cell_type": "code",
"execution_count": 68,
"id": "29ed8768",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Recommendations for ['GoldenEye (1995)']: \n",
"\n",
"GoldenEye (1995)\n",
"It Takes Two (1995)\n",
"White Balloon, The (Badkonake sefid) (1995)\n",
"Drop Zone (1994)\n",
"Hunted, The (1995)\n",
"Once Were Warriors (1994)\n",
"Hoop Dreams (1994)\n",
"Pie in the Sky (1996)\n",
"Unzipped (1995)\n",
"Walk in the Clouds, A (1995)\n"
]
}
],
"source": [
"#k-principal components to represent movies, movie_id to find recommendations,
top_n print n results \n",
"k = 50\n",
"movie_id = 10 # (getting an id from movies.dat)\n",
"top_n = 10\n",
"sliced = V.T[:, :k] # representative data\n",
"indexes = top_cosine_similarity(sliced, movie_id, top_n)\n",
"\n",
"#Printing the top N similar movies\n",
"print_similar_movies(movie_data, movie_id, indexes)"
]
},
{
"cell_type": "markdown",
"id": "ec67ffd7",
"metadata": {},
"source": [
"### Evaluate Model"
]
},
{
"cell_type": "code",
"execution_count": 69,
"id": "ea330856",
"metadata": {},
"outputs": [],
"source": [
"from surprise import SVD\n",
"\n",
"from surprise.prediction_algorithms.matrix_factorization import SVD\n",
"from surprise import Dataset, Reader\n",
"from surprise.model_selection import cross_validate"
]
},
{
"cell_type": "code",
"execution_count": 70,
"id": "197f2055",
"metadata": {},
"outputs": [],
"source": [
"reader = Reader(line_format = 'user item rating', rating_scale=(0,5))"
]
},
{
"cell_type": "code",
"execution_count": 71,
"id": "4a418629",
"metadata": {},
"outputs": [],
"source": [
"data = Dataset.load_from_df(ratings[['userId', 'movieId', 'rating']], reader)"
]
},
{
"cell_type": "code",
"execution_count": 72,
"id": "4002ead2",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'test_rmse': array([0.87805135, 0.87266142, 0.88048053, 0.8679631 ,
0.87171627]),\n",
" 'test_mae': array([0.67614522, 0.67278488, 0.67296067, 0.66869141,
0.6697105 ]),\n",
" 'fit_time': (0.7626500129699707,\n",
" 0.7732770442962646,\n",
" 0.8324978351593018,\n",
" 0.8279340267181396,\n",
" 0.8171725273132324),\n",
" 'test_time': (0.14786338806152344,\n",
" 0.08284425735473633,\n",
" 0.0925283432006836,\n",
" 0.08990287780761719,\n",
" 0.0824429988861084)}"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"svd = SVD()\n",
"\n",
"# Run 5-fold cross-validation and then print results\n",
"cross_validate(svd, data, measures=['RMSE', 'MAE'])"
]
},
{
"cell_type": "markdown",
"id": "b89d6afb",
"metadata": {},
"source": [
"# "
]
},
{
"cell_type": "markdown",
"id": "9c054fa1",
"metadata": {},
"source": [
"## THANK YOU. "
]
}
],
"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.9.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

You might also like