├── README.md └── MovieLensDataAnalysis.ipynb /README.md: -------------------------------------------------------------------------------- 1 | # py-analysis-visualisation 2 | Data Analytics and Visualisation using Python 3 | 4 | You can get the movie-lens dataset used in this project at https://grouplens.org/datasets/movielens/100k/ 5 | -------------------------------------------------------------------------------- /MovieLensDataAnalysis.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "data": { 12 | "text/html": [ 13 | "
\n", 14 | "\n", 15 | " \n", 16 | " \n", 17 | " \n", 18 | " \n", 19 | " \n", 20 | " \n", 21 | " \n", 22 | " \n", 23 | " \n", 24 | " \n", 25 | " \n", 26 | " \n", 27 | " \n", 28 | " \n", 29 | " \n", 30 | " \n", 31 | " \n", 32 | " \n", 33 | " \n", 34 | " \n", 35 | " \n", 36 | " \n", 37 | " \n", 38 | " \n", 39 | " \n", 40 | " \n", 41 | " \n", 42 | " \n", 43 | " \n", 44 | " \n", 45 | " \n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | "
movieIdtitlegenres
01Toy Story (1995)Adventure|Animation|Children|Comedy|Fantasy
12Jumanji (1995)Adventure|Children|Fantasy
23Grumpier Old Men (1995)Comedy|Romance
34Waiting to Exhale (1995)Comedy|Drama|Romance
45Father of the Bride Part II (1995)Comedy
\n", 56 | "
" 57 | ], 58 | "text/plain": [ 59 | " movieId title \\\n", 60 | "0 1 Toy Story (1995) \n", 61 | "1 2 Jumanji (1995) \n", 62 | "2 3 Grumpier Old Men (1995) \n", 63 | "3 4 Waiting to Exhale (1995) \n", 64 | "4 5 Father of the Bride Part II (1995) \n", 65 | "\n", 66 | " genres \n", 67 | "0 Adventure|Animation|Children|Comedy|Fantasy \n", 68 | "1 Adventure|Children|Fantasy \n", 69 | "2 Comedy|Romance \n", 70 | "3 Comedy|Drama|Romance \n", 71 | "4 Comedy " 72 | ] 73 | }, 74 | "execution_count": 1, 75 | "metadata": {}, 76 | "output_type": "execute_result" 77 | } 78 | ], 79 | "source": [ 80 | "# relative paths to the movie lens data set for movies file and ratings file\n", 81 | "movies_path = './ml-latest-small/movies.csv'\n", 82 | "\n", 83 | "# import DataFrame from pandas package so that we can work with this tabular data\n", 84 | "import pandas as pd\n", 85 | "from pandas import DataFrame as df\n", 86 | "\n", 87 | "movies_df = pd.read_csv(movies_path)\n", 88 | "\n", 89 | "# now that we have a DataFrame lets peek into the data and see how it looks\n", 90 | "movies_df.head()" 91 | ] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "execution_count": 2, 96 | "metadata": { 97 | "collapsed": false 98 | }, 99 | "outputs": [ 100 | { 101 | "data": { 102 | "text/plain": [ 103 | "9125" 104 | ] 105 | }, 106 | "execution_count": 2, 107 | "metadata": {}, 108 | "output_type": "execute_result" 109 | } 110 | ], 111 | "source": [ 112 | "# now lets see how many movies are there in this data\n", 113 | "len(movies_df.index)" 114 | ] 115 | }, 116 | { 117 | "cell_type": "code", 118 | "execution_count": 3, 119 | "metadata": { 120 | "collapsed": false 121 | }, 122 | "outputs": [ 123 | { 124 | "data": { 125 | "text/plain": [ 126 | "(9125, 3)" 127 | ] 128 | }, 129 | "execution_count": 3, 130 | "metadata": {}, 131 | "output_type": "execute_result" 132 | } 133 | ], 134 | "source": [ 135 | "# we can also get high level information of the width and height of the data frame using shape property\n", 136 | "movies_df.shape" 137 | ] 138 | }, 139 | { 140 | "cell_type": "code", 141 | "execution_count": 4, 142 | "metadata": { 143 | "collapsed": false 144 | }, 145 | "outputs": [ 146 | { 147 | "name": "stdout", 148 | "output_type": "stream", 149 | "text": [ 150 | "1\n", 151 | "Toy Story (1995)\n", 152 | "Adventure|Animation|Children|Comedy|Fantasy\n" 153 | ] 154 | } 155 | ], 156 | "source": [ 157 | "# now we can access an element at a position using loc[x_pos][y_pos] syntax \n", 158 | "print movies_df.loc[0][0]\n", 159 | "print movies_df.loc[0][1]\n", 160 | "print movies_df.loc[0][2]" 161 | ] 162 | }, 163 | { 164 | "cell_type": "code", 165 | "execution_count": 5, 166 | "metadata": { 167 | "collapsed": false 168 | }, 169 | "outputs": [ 170 | { 171 | "data": { 172 | "text/html": [ 173 | "
\n", 174 | "\n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | "
movieIdtitlegenres
01Toy Story (1995)Adventure|Animation|Children|Comedy|Fantasy
12Jumanji (1995)Adventure|Children|Fantasy
23Grumpier Old Men (1995)Comedy|Romance
34Waiting to Exhale (1995)Comedy|Drama|Romance
45Father of the Bride Part II (1995)Comedy
\n", 216 | "
" 217 | ], 218 | "text/plain": [ 219 | " movieId title \\\n", 220 | "0 1 Toy Story (1995) \n", 221 | "1 2 Jumanji (1995) \n", 222 | "2 3 Grumpier Old Men (1995) \n", 223 | "3 4 Waiting to Exhale (1995) \n", 224 | "4 5 Father of the Bride Part II (1995) \n", 225 | "\n", 226 | " genres \n", 227 | "0 Adventure|Animation|Children|Comedy|Fantasy \n", 228 | "1 Adventure|Children|Fantasy \n", 229 | "2 Comedy|Romance \n", 230 | "3 Comedy|Drama|Romance \n", 231 | "4 Comedy " 232 | ] 233 | }, 234 | "execution_count": 5, 235 | "metadata": {}, 236 | "output_type": "execute_result" 237 | } 238 | ], 239 | "source": [ 240 | "# we can explicitly set the index column if our data has a unique identifier for each row using set_index\n", 241 | "movies_df.set_index('movieId')\n", 242 | "movies_df.head()" 243 | ] 244 | }, 245 | { 246 | "cell_type": "code", 247 | "execution_count": 6, 248 | "metadata": { 249 | "collapsed": false 250 | }, 251 | "outputs": [ 252 | { 253 | "data": { 254 | "text/html": [ 255 | "
\n", 256 | "\n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | "
movieIdtitlegenresgenres_arr
01Toy Story (1995)Adventure|Animation|Children|Comedy|Fantasy[Adventure, Animation, Children, Comedy, Fantasy]
12Jumanji (1995)Adventure|Children|Fantasy[Adventure, Children, Fantasy]
23Grumpier Old Men (1995)Comedy|Romance[Comedy, Romance]
34Waiting to Exhale (1995)Comedy|Drama|Romance[Comedy, Drama, Romance]
45Father of the Bride Part II (1995)Comedy[Comedy]
\n", 304 | "
" 305 | ], 306 | "text/plain": [ 307 | " movieId title \\\n", 308 | "0 1 Toy Story (1995) \n", 309 | "1 2 Jumanji (1995) \n", 310 | "2 3 Grumpier Old Men (1995) \n", 311 | "3 4 Waiting to Exhale (1995) \n", 312 | "4 5 Father of the Bride Part II (1995) \n", 313 | "\n", 314 | " genres \\\n", 315 | "0 Adventure|Animation|Children|Comedy|Fantasy \n", 316 | "1 Adventure|Children|Fantasy \n", 317 | "2 Comedy|Romance \n", 318 | "3 Comedy|Drama|Romance \n", 319 | "4 Comedy \n", 320 | "\n", 321 | " genres_arr \n", 322 | "0 [Adventure, Animation, Children, Comedy, Fantasy] \n", 323 | "1 [Adventure, Children, Fantasy] \n", 324 | "2 [Comedy, Romance] \n", 325 | "3 [Comedy, Drama, Romance] \n", 326 | "4 [Comedy] " 327 | ] 328 | }, 329 | "execution_count": 6, 330 | "metadata": {}, 331 | "output_type": "execute_result" 332 | } 333 | ], 334 | "source": [ 335 | "# now lets find out how many animation vs comedy movies exist in this dataset\n", 336 | "\n", 337 | "movies_df['genres_arr'] = movies_df['genres'].str.split('|')\n", 338 | "movies_df.head()" 339 | ] 340 | }, 341 | { 342 | "cell_type": "code", 343 | "execution_count": 7, 344 | "metadata": { 345 | "collapsed": false 346 | }, 347 | "outputs": [ 348 | { 349 | "name": "stdout", 350 | "output_type": "stream", 351 | "text": [ 352 | "# of animation movies 447\n", 353 | "# of romance movies 3315\n" 354 | ] 355 | } 356 | ], 357 | "source": [ 358 | "\n", 359 | "animation_df = movies_df[movies_df.genres_arr.map(lambda x: 'Animation' in x)]\n", 360 | "print '# of animation movies', len(animation_df.index)\n", 361 | "\n", 362 | "romance_df = movies_df[movies_df.genres_arr.map(lambda x: 'Comedy' in x)]\n", 363 | "print '# of romance movies', len(romance_df.index)" 364 | ] 365 | }, 366 | { 367 | "cell_type": "code", 368 | "execution_count": 8, 369 | "metadata": { 370 | "collapsed": false 371 | }, 372 | "outputs": [ 373 | { 374 | "name": "stdout", 375 | "output_type": "stream", 376 | "text": [ 377 | "# of masala movies 6\n" 378 | ] 379 | }, 380 | { 381 | "data": { 382 | "text/html": [ 383 | "
\n", 384 | "\n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | "
movieIdtitlegenresgenres_arr
344380True Lies (1994)Action|Adventure|Comedy|Romance|Thriller[Action, Adventure, Comedy, Romance, Thriller]
19742468Jumpin' Jack Flash (1986)Action|Comedy|Romance|Thriller[Action, Comedy, Romance, Thriller]
36994719Osmosis Jones (2001)Action|Animation|Comedy|Crime|Drama|Romance|Th...[Action, Animation, Comedy, Crime, Drama, Roma...
38424956Stunt Man, The (1980)Action|Adventure|Comedy|Drama|Romance|Thriller[Action, Adventure, Comedy, Drama, Romance, Th...
47026564Lara Croft Tomb Raider: The Cradle of Life (2003)Action|Adventure|Comedy|Romance|Thriller[Action, Adventure, Comedy, Romance, Thriller]
619334435Sholay (1975)Action|Adventure|Comedy|Musical|Romance|Thriller[Action, Adventure, Comedy, Musical, Romance, ...
\n", 439 | "
" 440 | ], 441 | "text/plain": [ 442 | " movieId title \\\n", 443 | "344 380 True Lies (1994) \n", 444 | "1974 2468 Jumpin' Jack Flash (1986) \n", 445 | "3699 4719 Osmosis Jones (2001) \n", 446 | "3842 4956 Stunt Man, The (1980) \n", 447 | "4702 6564 Lara Croft Tomb Raider: The Cradle of Life (2003) \n", 448 | "6193 34435 Sholay (1975) \n", 449 | "\n", 450 | " genres \\\n", 451 | "344 Action|Adventure|Comedy|Romance|Thriller \n", 452 | "1974 Action|Comedy|Romance|Thriller \n", 453 | "3699 Action|Animation|Comedy|Crime|Drama|Romance|Th... \n", 454 | "3842 Action|Adventure|Comedy|Drama|Romance|Thriller \n", 455 | "4702 Action|Adventure|Comedy|Romance|Thriller \n", 456 | "6193 Action|Adventure|Comedy|Musical|Romance|Thriller \n", 457 | "\n", 458 | " genres_arr \n", 459 | "344 [Action, Adventure, Comedy, Romance, Thriller] \n", 460 | "1974 [Action, Comedy, Romance, Thriller] \n", 461 | "3699 [Action, Animation, Comedy, Crime, Drama, Roma... \n", 462 | "3842 [Action, Adventure, Comedy, Drama, Romance, Th... \n", 463 | "4702 [Action, Adventure, Comedy, Romance, Thriller] \n", 464 | "6193 [Action, Adventure, Comedy, Musical, Romance, ... " 465 | ] 466 | }, 467 | "execution_count": 8, 468 | "metadata": {}, 469 | "output_type": "execute_result" 470 | } 471 | ], 472 | "source": [ 473 | "# now lets find the real masala movies which has Action and Romance and Comedy and Thriller :)\n", 474 | "masala_lambda = lambda x: set(['Romance','Comedy', 'Action', 'Thriller']).issubset(x)\n", 475 | "masala_movies = movies_df[movies_df.genres_arr.map(masala_lambda)]\n", 476 | "print '# of masala movies', len(masala_movies.index)\n", 477 | "masala_movies" 478 | ] 479 | }, 480 | { 481 | "cell_type": "code", 482 | "execution_count": 9, 483 | "metadata": { 484 | "collapsed": false 485 | }, 486 | "outputs": [ 487 | { 488 | "data": { 489 | "text/html": [ 490 | "
\n", 491 | "\n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | "
movieIdtitlegenresgenres_arrgenre_count
01Toy Story (1995)Adventure|Animation|Children|Comedy|Fantasy[Adventure, Animation, Children, Comedy, Fantasy]5
12Jumanji (1995)Adventure|Children|Fantasy[Adventure, Children, Fantasy]3
23Grumpier Old Men (1995)Comedy|Romance[Comedy, Romance]2
34Waiting to Exhale (1995)Comedy|Drama|Romance[Comedy, Drama, Romance]3
45Father of the Bride Part II (1995)Comedy[Comedy]1
\n", 545 | "
" 546 | ], 547 | "text/plain": [ 548 | " movieId title \\\n", 549 | "0 1 Toy Story (1995) \n", 550 | "1 2 Jumanji (1995) \n", 551 | "2 3 Grumpier Old Men (1995) \n", 552 | "3 4 Waiting to Exhale (1995) \n", 553 | "4 5 Father of the Bride Part II (1995) \n", 554 | "\n", 555 | " genres \\\n", 556 | "0 Adventure|Animation|Children|Comedy|Fantasy \n", 557 | "1 Adventure|Children|Fantasy \n", 558 | "2 Comedy|Romance \n", 559 | "3 Comedy|Drama|Romance \n", 560 | "4 Comedy \n", 561 | "\n", 562 | " genres_arr genre_count \n", 563 | "0 [Adventure, Animation, Children, Comedy, Fantasy] 5 \n", 564 | "1 [Adventure, Children, Fantasy] 3 \n", 565 | "2 [Comedy, Romance] 2 \n", 566 | "3 [Comedy, Drama, Romance] 3 \n", 567 | "4 [Comedy] 1 " 568 | ] 569 | }, 570 | "execution_count": 9, 571 | "metadata": {}, 572 | "output_type": "execute_result" 573 | } 574 | ], 575 | "source": [ 576 | "# now lets add another column to our dataframe which will count the number of genres for each movie\n", 577 | "counter_lambda = lambda x: len(x)\n", 578 | "movies_df['genre_count'] = movies_df.genres_arr.apply(counter_lambda)\n", 579 | "movies_df.head()" 580 | ] 581 | }, 582 | { 583 | "cell_type": "code", 584 | "execution_count": 11, 585 | "metadata": { 586 | "collapsed": false 587 | }, 588 | "outputs": [ 589 | { 590 | "data": { 591 | "image/png": "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\n1tT1K73HmyRPtvcUEdFtknCbB70jImLySGBERESVBEZERFRJYERERJUERkREVElgRERElQRGRERU\nSWBERESVBEZERFRJYERERJUERkREVElgRERElQRGRERUSWBERESVBEZERFRJYERERJUERkREVElg\nRERElQRGRERUSWBERESVBEZERFRJYERERJUERkREVElgRERElQRGRERUSWBERESVBEZERFRJYERE\nRJUERkREVElgRERElQRGRERUSWBERESVBEZERFRJYERERJVxCQxJ60m6SdKF5fkWkq6QtFDS5ZI2\n75j3eEmLJN0qad+O9t0lzZd0m6RTxqPuiIh4wnj1MD4ALOh4Pge4yvaOwDXA8QCSdgYOBnYC9gdO\nlaSyzGnAkbZnAbMk7TdOtUdEBOMQGJJmAq8HvtHRfCBwZpk+EzioTB8AnGd7pe3bgUXAbEnTgU1t\n31DmO6tjmYiIGAfj0cP4IvAxwB1t02wPANheDmxT2mcASzrmW1baZgBLO9qXlraIiBgnU7q5cklv\nAAZs/1JS3wizeoTXxmzu3LmPT/f19dHXN9KmIyLWPf39/fT3949pGdlr9bP6b1cufQ44DFgJPB3Y\nFLgA2APosz1Qdjf9wPZOkuYAtn1yWf4y4ERg8eA8pf0QYG/b7x9im+7me4qImIwkYVsjzdPVXVK2\nP2F7W9vPBQ4BrrH9duAi4PAy2zuB75fpC4FDJG0oaQfg+cD1ZbfV/ZJml4Pg7+hYJiIixkFXd0mN\n4PPA+ZKOoOk9HAxge4Gk82nOqFoBHN3RXTgGOAN4GnCJ7cvGveqIiHVYV3dJtSG7pCIixq71XVIR\nETF5JDAiIqJKAiMiIqokMCIiokoCIyIiqiQwIiKiSgIjIiKqJDAiIqJKAiMiIqokMCIiokoCIyIi\nqiQwIiKiSgIjIiKqJDAiIqJKAiMiIqokMCIiokoCIyIiqiQwIiKiSgIjIiKqJDAiIqJKAiMiIqok\nMCIiokoCIyIiqiQwIiKiSgIjIiKqJDAiIqJKAiMiIqokMCIiokoCIyIiqiQwIiKiSgIjIiKqJDAi\nIqJKAiMiIqokMCIiosqogSHpeZKmluk+ScdKekb3S4uIiF5S08P4HvCYpOcDXweeA5xbs3JJUyX9\nXNLNkn4j6XOlfQtJV0haKOlySZt3LHO8pEWSbpW0b0f77pLmS7pN0iljepcREfGU1QTGKtsrgX8C\n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\nHjNSD2M/4F+A5wH/HZgP/MV27UV7ERExiQzbw7D9CduvAW4HzqbZtbS1pJ9Iumic6ouIiB5Rc1rt\n5bZ/AfxC0vttv0LSVt0uLCIiesuoF+7Z/njH08NL293dKigiInrTmK70zp33IiLWXeM2llRERExs\nCYyIiKiSwIiIiCoJjIiIqJLAiIiIKgmMiIioksCIiIgqCYyIiKiSwIiIiCoJjIiIqJLAiIiIKgmM\niIioksCIiIgqCYyIiKiSwIiIiCoJjIiIqJLAiIiIKgmMiIioksCIiIgqCYyIiKiSwIiIiCoJjIiI\nqJLAiIiIKgmMiIioksCIiIgqCYyIiKiSwIiIiCoJjIiIqJLAiIiIKgmMiIio0tXAkPRNSQOS5ne0\nbSHpCkkLJV0uafOO146XtEjSrZL27WjfXdJ8SbdJOqWbNUdExNC63cM4HdhvtbY5wFW2dwSuAY4H\nkLQzcDCwE7A/cKoklWVOA460PQuYJWn1dUZERJd1NTBs/wS4b7XmA4Ezy/SZwEFl+gDgPNsrbd8O\nLAJmS5oObGr7hjLfWR3LRETEOGnjGMY2tgcAbC8HtintM4AlHfMtK20zgKUd7UtLW0REjKMpbRcA\neG2vcO7cuY9P9/X10dfXt7Y3ERExofX399Pf3z+mZdoIjAFJ02wPlN1Nd5X2ZcBzOuabWdqGax9W\nZ2BERMSTrf5let68eaMuMx67pFQegy4EDi/T7wS+39F+iKQNJe0APB+4vuy2ul/S7HIQ/B0dy0RE\nxDjpag9D0rlAH7ClpDuAE4HPA9+RdASwmObMKGwvkHQ+sABYARxte3B31THAGcDTgEtsX9bNuiMi\n4sm6Ghi23zrMS/sMM/9JwElDtN8IvHgtlhYREWOUK70jIqJKAiMiIqr0wmm1EeNsKk8MItCeadO2\nY/ny29suI6JaAiPWQY/Qhct/xmxgoP3QihiL7JKKiIgqCYyIiKiSwIiIiCoJjIiIqJLAiIiIKgmM\niIioksCIiIgqCYyIiKiSwIiIiCoJjIiIqJLAiIiIKgmMiIioksCIiIgqCYyIiKiSwIiIiCoJjIiI\nqJLAiIiIKgmMiIioksCIiIgqCYyIiKiSwIiIiCoJjIiIqJLAiIiIKgmMiIioMqXtAiLWXVOR1GoF\n06Ztx/Llt7daQ0wcCYyI1jwCuNUKBgbaDayYWLJLKiIiqiQwIiKiSgIjIiKqJDAiIqJKAiMiIqpM\n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\n", 592 | "text/plain": [ 593 | "" 594 | ] 595 | }, 596 | "metadata": {}, 597 | "output_type": "display_data" 598 | } 599 | ], 600 | "source": [ 601 | "# now lets analyze how many genres do various movies have by plotting a histogram of genres\n", 602 | "\n", 603 | "# introducing the matplotlib package which lets us plot charts, graphs in Python\n", 604 | "%matplotlib inline\n", 605 | "import matplotlib.pyplot as plt\n", 606 | "\n", 607 | "plt.hist(movies_df.genre_count)\n", 608 | "plt.title(\"Genres Histogram\")\n", 609 | "plt.xlabel(\"# of genres\")\n", 610 | "plt.ylabel(\"# of movies\")\n", 611 | "plt.axis([0, 9, 0, 5000])\n", 612 | "plt.show()" 613 | ] 614 | }, 615 | { 616 | "cell_type": "code", 617 | "execution_count": 12, 618 | "metadata": { 619 | "collapsed": false 620 | }, 621 | "outputs": [ 622 | { 623 | "name": "stdout", 624 | "output_type": "stream", 625 | "text": [ 626 | "{'Mystery': 543, 'Sci-Fi': 792, 'Crime': 1100, 'Drama': 4365, 'Animation': 447, 'IMAX': 153, 'Action': 1545, '(no genres listed)': 18, 'Comedy': 3315, 'Documentary': 495, 'Musical': 394, 'Romance': 1545, 'Horror': 877, 'Film-Noir': 133, 'War': 367, 'Fantasy': 654, 'Western': 168, 'Children': 583, 'Thriller': 1729, 'Adventure': 1117}\n" 627 | ] 628 | } 629 | ], 630 | "source": [ 631 | "# now lets see how many movies are there for each genre\n", 632 | "\n", 633 | "from collections import Counter\n", 634 | "\n", 635 | "flattened_genres = [item for sublist in movies_df.genres_arr for item in sublist]\n", 636 | "\n", 637 | "genre_dict = dict(Counter(flattened_genres))\n", 638 | "\n", 639 | "print genre_dict" 640 | ] 641 | }, 642 | { 643 | "cell_type": "code", 644 | "execution_count": 13, 645 | "metadata": { 646 | "collapsed": false 647 | }, 648 | "outputs": [ 649 | { 650 | "data": { 651 | "image/png": "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\nq4IDzczMqvA3UHh3cuvyAzwAAAAASUVORK5CYII=\n", 652 | "text/plain": [ 653 | "" 654 | ] 655 | }, 656 | "metadata": {}, 657 | "output_type": "display_data" 658 | } 659 | ], 660 | "source": [ 661 | "# now lets plot this genre distribution as a pie chart\n", 662 | "plt.pie(genre_dict.values(), labels=genre_dict.keys())\n", 663 | "plt.title('Genre distribution of movies')\n", 664 | "plt.show()" 665 | ] 666 | }, 667 | { 668 | "cell_type": "code", 669 | "execution_count": 14, 670 | "metadata": { 671 | "collapsed": false 672 | }, 673 | "outputs": [ 674 | { 675 | "data": { 676 | "text/plain": [ 677 | "" 678 | ] 679 | }, 680 | "metadata": {}, 681 | "output_type": "display_data" 682 | } 683 | ], 684 | "source": [ 685 | "# we can also save the plot as an image to share with other\n", 686 | "plt.savefig('./movie-genres-pie.png')" 687 | ] 688 | }, 689 | { 690 | "cell_type": "code", 691 | "execution_count": 17, 692 | "metadata": { 693 | "collapsed": false 694 | }, 695 | "outputs": [ 696 | { 697 | "data": { 698 | "text/plain": [ 699 | "[]" 700 | ] 701 | }, 702 | "execution_count": 17, 703 | "metadata": {}, 704 | "output_type": "execute_result" 705 | }, 706 | { 707 | "data": { 708 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAFPCAYAAABDFwWOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXmYHVW1t99fEuYhA0MaEiBMgYSpAQUVlFYggAMgChcV\nMRL8vAICKjJ4vQJeFVDUKIp4QQmgXESvV0VjGEyCioIIhCkIYUhIognz6EAw6/tj7cqp7pyhzunT\n6fJkvc9znj6numrV2lW71l577bV3ycwIgiAIOpchg61AEARBMLCEoQ+CIOhwwtAHQRB0OGHogyAI\nOpww9EEQBB1OGPogCIIOp7ChlzRE0l2SfpZ+ny1pkaQ70+fg3L5nSZon6QFJk3Lb95B0j6SHJE1t\nb1GCIAiCajTj0Z8C3N9n21fMbI/0mQEgaQJwFDABOAS4WJLS/t8CppjZeGC8pIP6p34QBEHQiEKG\nXtJY4K3AZX3/VWX3w4BrzOxVM5sPzAP2ktQFbGBmt6f9rgQOb0nrIAiCoDBFPfqvAp8E+k6jPUnS\nHEmXSRqeto0BFub2WZy2jQEW5bYvStuCIAiCAaShoZf0NmCpmc2htwd/MbCNmXUDS4AvD4yKQRAE\nQX8YVmCffYBDJb0VWAfYQNKVZnZsbp9LgevS98XAFrn/jU3bam1fCUmxAE8QBEELmNlKIfWGHr2Z\nfcrMtjSzbYCjgZlmdmyKuWccAdyXvv8MOFrSmpK2BrYD/mBmS4DnJe2VBmePBX5a57z9+px99tmD\nLqMMOoSMkDHQMsqgQ8jwTy2KePS1+KKkbmA5MB/4cDLQcyVdC8wFlgEnWEWDE4FpwNrAdEuZOgPB\n/PnzB11GGXQIGSFjoGWUQYeQUZ+mDL2Z3QzcnL4fW2e/84Dzqmy/A9ilSR2DIAiCfjD0nHPOGWwd\nVuLcc889p796jRgxgnHjxg2qjDLoEDJCxkDLKIMOIcM599xzOeecc87tu1314jqDhSQro15BEARl\nRhLWymDsvyqzZ88edBll0CFkhIyBllEGHUJGfTrW0JeBI444GklNf7q6xg226kEQdBARuhlAPIu0\nlXKobqpUEARBNVa70E0QBEHgdKyhL2OcbLB0CBkhYyBllEGHkFGfjjX0QRAEgRMx+gEkYvRBEKxK\nIkYfBEGwmtKxhr6McbLB0iFkhIyBlFEGHUJGfTrW0AdBEAROxOgHkIjRB0GwKokYfRAEwWpKxxr6\nMsbJBkuHkBEyBlJGGXQIGfXpWEMfBEEQOIVj9JKGAH8EFpnZoZJGAj8AtsLfMHWUmT2f9j0LOA54\nFTjFzG5I2/eg9xumTq1xrojRd0D5gyBYtbQjRn8K/nrAjDOBm8xsB2AmcFY60UTgKGACcAhwcXpH\nLMC3gClmNh4YL+mgpksSBEEQNEUhQy9pLPBW4LLc5sOAK9L3K4DD0/dDgWvM7FUzmw/MA/ZKLxPf\nwMxuT/tdmTum7ZQxTjZYOoSMkDGQMsqgQ8ioT1GP/qvAJ+kdhxhtZksBzGwJsGnaPgZYmNtvcdo2\nBliU274obQuCIAgGkIYxeklvAw4xs5Mk9QAfTzH6Z81sZG6/p81sI0kXAb83s6vT9suA6cAC4Dwz\nm5S27wucbmaHVjlnxOg7oPxBEKxaasXohxU4dh/gUElvBdYBNpB0FbBE0mgzW5rCMk+k/RcDW+SO\nH5u21dpelcmTJ694Oe6IESPo7u6mp6cHqHRryv67Qva7p+BvlzHY+sfv+B2/y/179uzZTJs2DaD+\ny8TNrPAH2A/4Wfr+ReCM9P0M4Pz0fSJwF7AmsDXwMJWew63AXoBwL//gGuex/jJr1qxBlwEYWAuf\nSvnLUI6QETLKrkPIcJLtWMmmFvHoa3E+cK2k4/CwzFHJQs+VdC2eobMMOCEpAHAivdMrZ/Tj/EEQ\nBEEBYq2bASRi9EEQrEpirZsgCILVlI419NmAxWDLKIMOISNkDKSMMugQMurTsYY+CIIgcCJGP4BE\njD4IglVJxOiDIAhWUzrW0JcxTjZYOoSMkDGQMsqgQ8ioT8ca+iAIgsCJGP0AEjH6IAhWJRGjD4Ig\nWE3pWENfxjjZYOkQMkLGQMoogw4hoz4da+iDIAgCJ2L0A0jE6IMgWJVEjD4IgmA1pWMNfRnjZIOl\nQ8gIGQMpoww6hIz6dKyhD4IgCJyI0Q8gEaMPgmBV0nKMXtJakm6TdJek+yV9IW0/W9IiSXemz8G5\nY86SNE/SA5Im5bbvIekeSQ9JmtquwgVBEAS1aWjozewfwJvNbHdgV+AtkvZJ//6Kme2RPjMAJE3A\nXys4ATgEuFju2gJ8C5hiZuOB8ZIOanN5VlDGONlg6RAyQsZAyiiDDiGjPoVi9Gb21/R1rXTMs+n3\nSl0E4DDgGjN71czmA/OAvSR1ARuY2e1pvyuBw1tVPAiCIChGoRi9pCHAHcC2wCVmdrqks4HJwPPA\nH4FPmNnzki4Cfm9mV6djLwOm4y8QP8/MJqXt+wKnm9mhVc4XMfoOKH8QBKuWfuXRm9nyFLoZC7xJ\n0n7AxcA2ZtYNLAG+3E6FgyAIgvYwrJmdzewFSb8AXmNmN+f+dSlwXfq+GNgi97+xaVut7VWZPHky\n48aNA2DEiBF0d3fT09MDVOJX9X7PmTOHU089tfD+1X5n2/pzvJP97in422Xkz93K+bPfU6dObfr6\n9f1dhusZ16Oc1yOu5+Bdj9mzZzNt2jSAFfayKmZW9wNsDAxP39cBfg3sD3Tl9vkYcHX6PhG4C1gT\n2Bp4mEqI6FZgLzy2Px04uMY5rb/MmjVr0GUABtbCp1L+MpQjZISMsusQMpxkO1ayqQ1j9JJ2Aa5I\nxnkIcJWZXSjpSqAbWA7MBz5sZkvTMWcBU4BlwClmdkPavicwDVgbmG5mp9Q4pzXS61+BiNEHQbAq\nqRWjjwlTA0gY+iAIViWr3aJmK8fJB0dGGXQIGSFjIGWUQYeQUZ+ONfRBEASBE6GbASRCN0EQrEpW\nu9BNEARB4HSsoS9jnGywdAgZIWMgZZRBh5BRn4419EFncsQRRyOp6U9X17jBVj0IBo2I0Q8gEaNv\nP3FNg6A2EaMPgiBYTelYQ1/GONlg6dBJMtpBWcrSKTLKoEPIqE/HGvogCILAiRj9ABLx5PYT1zQI\nahMx+iAIgtWUjjX0ZYyTDZYOnSSjHZSlLJ0ioww6hIz6dKyhD4IgCJyI0Q8gEU9uP3FNg6A2EaMP\ngiBYTWlo6CWtJek2SXdJul/SF9L2kZJukPSgpOslDc8dc5akeZIekDQpt30PSfdIekjS1IEpklPG\nONlg6dBJMtpBWcrSKTLKoEPIqE9DQ29m/wDebGa7A7sCb5G0D3AmcJOZ7QDMBM4CkDQROAqYABwC\nXCzvbwN8C5hiZuOB8ZIOamtpgiAIgpVoKkYvaV1gNjAZ+DGwn5ktldQFzDazHSWdib+g9oJ0zC+B\nc4AFwEwzm5i2H52O/0iV80SMvgPKPxDENQ2C2vQrRi9piKS7gCW4QZ8LjM5eBm5mS4BN0+5jgIW5\nwxenbWOARbnti9K2IAiCYAAZVmQnM1sO7C5pQ+B6ST2s7Fa11V2aPHky48aNA2DEiBF0d3fT09MD\nVOJX9X7PmTOHU089tfD+1X5n2/pzvJP97in422Xkz93K+bPfU6dObfr69f1dhuuZ/W7+elbOD511\nPcpQP+J6Dt71mD17NtOmTQNYYS+rYmZNfYD/BE4DHsC9eoAu4IH0/UzgjNz+M4C98/uk7UcD36px\nDusvs2bNGnQZgIG18KmUvwzlKJOMuKblk1EGHUKGk+r5Sja1YYxe0sbAMjN7XtI6wPXAucAk4Bkz\nu0DSGcBIMzszDcZ+Pxn3McCNwPZmZpJuBU4Gbgd+AXzdzGZUOac10utfgYgnt5+4pkFQm1ox+iKh\nm82AK1LmzBDgKjP7VYrZXyvpOHyg9SgAM5sr6VpgLrAMOCFntU8EpgFrA9OrGfkgCIKgvRRJr7zX\nzPYws93NbDczuzBtf8bMDjCzHcxskpk9lzvmPDPbzswmmNkNue13mNkuZra9mZ0yMEVyVo6TD46M\nMujQSTLaQVnK0ikyyqBDyKhPzIwNgiDocGKtmwEk4sntJ65pENQm1roJgiBYTelYQ1/GONlg6dBJ\nMtpBWcrSKTLKoEPIqE/HGvogCILAiRj9ABLx5PYT1zQIahMx+iAIgtWUjjX0ZYyTDZYOnSSjHZSl\nLJ0ioww6hIz6dKyhD4IgCJyI0Q8gEU9uP3FNg6A2EaMPgiBYTelYQ1/GONlg6dBJMtpBWcrSKTLK\noEPIqE/HGvogCILAiRj9ABLx5PYT1zQIahMx+iAIgtWUhoZe0lhJMyXdL+leSR9N28+WtEjSnelz\ncO6YsyTNk/SApEm57XtIukfSQ5KmDkyRnDLGyQZLh06S0Q7KUpZOkVEGHUJGfYq8YepV4ONmNkfS\n+sAdkm5M//uKmX0lv7OkCfjbpiYAY4GbJG2fYjHfAqaY2e2Spks6yMyub19xgiAIgr40HaOX9BPg\nImBf4CUz+3Kf/5+Jv6D2gvT7l8A5+OsGZ5rZxLT9aGA/M/tIlXNEjL4Dyj8QxDUNgtq0JUYvaRzQ\nDdyWNp0kaY6kyyQNT9vGAAtzhy1O28YAi3LbF6VtQRAEwQBS2NCnsM2PgFPM7CXgYmAbM+sGlgBf\nrnf8qqaMcbLB0qGTZLSDspSlU2SUQYeQUZ8iMXokDcON/FVm9lMAM3syt8ulwHXp+2Jgi9z/xqZt\ntbZXZfLkyYwbNw6AESNG0N3dTU9PD1C5CPV+z5kzp6n9q/3O6O/xkP3uKfjbZfRX/+z3nDlz+nV8\nWa5n9rv569n7/J12PQa7fsT17P17VV6P2bNnM23aNIAV9rIahWL0kq4EnjKzj+e2dZnZkvT9Y8Br\nzey9kiYC3wf2xkMzNwLbm5lJuhU4Gbgd+AXwdTObUeV8EaPvgPIPBHFNg6A2tWL0DT16SfsA7wPu\nlXQX/pR9CnivpG5gOTAf+DCAmc2VdC0wF1gGnJCz2icC04C1genVjHwQBEHQXhrG6M3sFjMbambd\nZra7me1hZjPM7Fgz2zVtP9zMluaOOc/MtjOzCWZ2Q277HWa2i5ltb2anDFShoJxxssHSoZNktIOy\nlKVTZJRBh5BRn5gZGwRB0OHEWjcDSMST209c0yCoTax1EwRBsJrSsYa+jHGywdKhk2S0g7KUpVNk\nlEGHkFGfjjX0QRAEgRMx+gEk4sntJ65pENQmYvRBEASrKR1r6MsYJxssHTpJRjsoS1k6RUYZdAgZ\n9elYQx8EQRA4EaMfQCKe3H7imgZBbSJGHwRBsJrSsYa+jHGywdKhk2S0g7KUpVNklEGHkFGfjjX0\nQRAEgRMx+gEk4sntJ65pENQmYvRBEASrKR1r6MsYJxssHTpJRjsoS1k6RUYZdAgZ9Wlo6CWNlTRT\n0v2S7pV0cto+UtINkh6UdL2k4bljzpI0T9IDkibltu8h6R5JD0ma2taSBEEQBFVpGKOX1AV0mdkc\nSesDdwCHAR8EnjazL0o6AxhpZmfm3hn7WvwF4DdReWfsbcBJZna7pOnA18zs+irnjBh9B5R/IIhr\nGgS1aTlGb2ZLzGxO+v4S8ABuwA8Drki7XQEcnr4fClxjZq+a2XxgHrBXajA2MLPb035X5o4JgiAI\nBoimYvSSxgHdwK3A6Ow9sWa2BNg07TYGWJg7bHHaNgZYlNu+KG0bEMoYJxssHTpJRjsoS1k6RUYZ\ndAgZ9Sls6FPY5kfAKcmz79sPjn5xEARBCRlWZCdJw3Ajf5WZ/TRtXipptJktTWGZJ9L2xcAWucPH\npm21tldl8uTJjBs3DoARI0bQ3d1NT08PUGntGv3OKLp/u3/nNEh/ewr+dhk9PT309PT0W5+8vHaU\nZ7CuZ6U8mT7N/u5dhk64HmWoH/09Pq5n9d95WbX2nz17NtOmTQNYYS+rUWjClKQrgafM7OO5bRcA\nz5jZBTUGY/fGQzM3UhmMvRU4Gbgd+AXwdTObUeV8MRjbAeUfCOKaBkFtWh6MlbQP8D7gLZLuknSn\npIOBC4ADJT0I7A+cD2Bmc4FrgbnAdOCEnNU+EfgO8BAwr5qRbxd9W8XBklEGHTpJRjsoS1k6RUYZ\ndAgZ9WkYujGzW4ChNf59QI1jzgPOq7L9DmCXZhQMgiAI+kesdTOARJih/cQ1DYLaxFo3QRAEqykd\na+jLGCcbLB06SUY7KEtZOkVGGXQIGfXpWEMfBEEQOBGjH0Aintx+4poGQW0iRh8EQbCa0rGGvoxx\nssHSoZNktIOylKVTZJRBh5BRn4419EEQBIETMfoBJOLJ7SeuaRDUJmL0QRAEqykda+jLGCcbLB06\nSUY7KEtZOkVGGXQok4xRo7qQ1PSnq2tcW/XIU2iZ4iAIgqAYzz67lFbCi0uXrhRxaRsRox9AIp7c\nfuKaBmVnMOtoxOiDIAhWUzrW0JclXlcGHTpJRjsoS1k6RUYZdCiTjHYQefRBEARBUzSM0Uv6DvB2\nYKmZ7Zq2nQ18iMp7Yj+VvS1K0lnAccCr+IvEb0jb9wCmAWsD083s1DrnjBh9B5R/IIhrGpSdf9UY\n/eXAQVW2f8XM9kifzMhPAI4CJgCHABfLSw3wLWCKmY0HxkuqJjMIgiBoMw0NvZn9Fni2yr+q5QId\nBlxjZq+a2XxgHrCXpC5gAzO7Pe13JXB4ayoXo1PidWUpR1lktIOylKVTZJRBhzLJaAdlitGfJGmO\npMskDU/bxgALc/ssTtvGAIty2xelbcG/CEcccXS/J4EEvWnlmsb1DFqhUB69pK2A63Ix+k2Ap8zM\nJH0O6DKz4yVdBPzezK5O+10GTAcWAOeZ2aS0fV/gdDM7tMb5IkZfsvKXpSxl0aMdtFaW8pUj6E0Z\nY/QtzYw1sydzPy8FrkvfFwNb5P43Nm2rtb0mkydPZty4cQCMGDGC7u5uenp6gEq3puy/K2S/ewr+\ndhmDrX+7ytNufZq/nr31j+sZvwfytzObVVE/Z8+ezbRp0wBW2MuqmFnDDzAOuDf3uyv3/WPA1en7\nROAuYE1ga+BhKr2GW4G98Nj+dODgOuez/jJr1qxBlwEYWAufSvnLUA6z8pSlLHoMXll6PxtlKEsZ\ndCiTjMGso0nGSja1oUcv6Wq86dlI0uPA2cCbJXUDy4H5wIeTdZ4r6VpgLrAMOCGdHOBEeqdXzmh0\n7iAIgqD/xFo3A0jEkyFi9LWJGH1nUsYYfcyMDYIg6HA61tCvPOA1ODLKoEMZygGdpUeUpVw6lElG\nO2i3Hh1r6IMgCAInYvQDSMSTIWL0tYkYfWcSMfogCIJgldOxhr5T4nWdUg7oLD2iLOXSoUwy2kHE\n6IMgCIKmiBj9ABLxZIgYfW0iRt+ZRIw+CIIgWOV0rKHvlHhdp5QDOkuPKEu5dCiTjHYQMfogCIKg\nKSJGP4BEPBkiRl+biNF3JhGjD4IgCFY5HWvoOyVe1ynlgM7SI8pSLh3KJKMdRIw+CIIgaIqI0Q8g\nEU+GiNHXJmL0nUk76mhX1ziWLl3Q0vlbitFL+o6kpZLuyW0bKekGSQ9Kul7S8Nz/zpI0T9IDkibl\ntu8h6R5JD0ma2lIJVjFdXeOQ1NSnq2vcYKsdBMG/OG7krYVPdYqEbi4HDuqz7UzgJjPbAZgJnAUg\naSJwFDABOAS4WN68AXwLmGJm44HxkvrKbCvtiHG1crFbbYVrEXHH9hPXtL0yyqBDmWSUkYaG3sx+\nCzzbZ/NhwBXp+xXA4en7ocA1Zvaqmc0H5gF7SeoCNjCz29N+V+aOCYIgCAaQQjF6SVsB15nZrun3\nM2Y2Kvf/Z8xslKSLgN+b2dVp+2XAdGABcJ6ZTUrb9wVON7NDa5yvFDH6/sZQI54MEaOvTcToO5N2\n1NF+yhiwPPqoeUEQBCVlWIvHLZU02syWprDME2n7YmCL3H5j07Za22syefJkxo0bB8CIESPo7u6m\np6cHqMTR6v2eM2cOp556auH9q/2ukP3uKfS7v8dnMnp6enrJalb/7PfUqVObvn7Vfrdanr5laPX8\n2e/mr2dv/dtxPcpQv8pSP8p0Pftbv9pxPZ3ZtFo/m6sfs4Fp6fc4amJmDT9Jwr253xcAZ6TvZwDn\np+8TgbuANYGtgYephIduBfYChIdzDq5zPusvs2bN6rcMwMCa/NDP43vLaEc5Bu9atL8sZdGjDPWr\nXXr0V0YZdCiTjHbU0X7KWMmmNozRS7o6NR0bAUuBs4GfAD/EvfQFwFFm9lza/yxgCrAMOMXMbkjb\n90xNz9rAdDM7pc45rZFeq4KI0VcoS1nKokc7iBh9Z1LGGH1MmKqvB2HonbKUpSx6tIMw9J1JGQ19\nxy6B0Cn5sJ2UG9xJekRZyqVDmWSUkY419EEQBIEToZv6ehChG6csZSmLHu2gHaGbVtZEGT16K5Ys\nmd/keYOilDF0E4a+vh6EoXfKUpay6NEO2mHoI85fPspo6Ds2dNMpsbZOijt2kh5lKUs7iBh9e2WU\nkY419EEQBIHTsaGbdsQuI3RToSxlKYse7SBCN51JGUM3HWvoy/AQhVGCMPS1KUMdDdpPGQ19hG5K\nTifFHTtJj7KUpR1EjL69MspIGPogCIIOJ0I3vY+K0E0NylKWsujRDspQR4P2E6GbIAiCYJUThr7k\ndFLcsZP0KEtZ2kHE6Nsro4yEoQ+CYNA54oijkdT0p6tr3GCr/i9BxOh7HxUx+hqUpSxl0aMdlKGO\nloW4rxAx+iAIgqBl+mXoJc2XdLekuyT9IW0bKekGSQ9Kul7S8Nz+Z0maJ+kBSZP6q/zqQCfFHTtJ\nj7KUpR2UIUbfDtqhx6hRXR0ZQuqvR78c6DGz3c1sr7TtTOAmM9sBmAmcBSBpInAUMAE4BLhY3j8J\ngiAoBc8+uxQPmTT3aXa5lVVNv2L0kh4DXmNmT+e2/QnYz8yWSuoCZpvZjpLOxF9ce0Ha75fAOWZ2\nWxW5TSvV7nVq2iEj4o4QMfralKGOloWy3NcSxNfbIaPtMXoDbpR0u6Tj07bRZrYUwMyWAJum7WOA\nhbljF6dtdUR3TosaBEEwWAzr5/H7mNlfJG0C3CDpQVZuhlpsbicD49L3EUA30JN+z05/+/5Ov1aK\n1dXav93H97Tl+ExGT09PL1k9Pb3lF/09depUuru7Wz6+ndcjX6ZW9Wn+evbWvx3XY86cOZx66qkt\nH9+b5srT/+tRqV/Q/+sR9auv/tm21o5v7nrMBqal3+Oq6JEws7Z8gLOBTwAP4F49QBfwQPp+JnBG\nbv8ZwN41ZBlYkx8sTxlktHZ8bxmzZs2y/tIOGWUpSzv0GDlydHPdRbDRo7fqpcfglaX99by/ZSnL\nfS2LHiWQQd9PyzF6SesCQ8zsJUnrATcA5wL7A8+Y2QWSzgBGmtmZaTD2+8DeeMjmRmB7q6KAx+ib\n1av9scuI0VcoS1kGL/7Z/ntShjpaFqJ+tVXGSjH6/oRuRgP/lwZOhwHfN7MbJP0RuFbSccACPNMG\nM5sr6VpgLrAMOKGakQ9608oLVCBeAB0EQYWWB2PN7DEz6zZPrdzFzM5P258xswPMbAczm2Rmz+WO\nOc/MtjOzCWZ2QzsK0Om4kS8cYVjxyTcOnZTnXBaiLO07vl2URY8yEjNjgyAIOpzSrnVThthlGWL0\nnRS7LIse7agbZXgncbtklIGoX22VEWvdBEE7aCWk1qlzPbq6xnXksgGdRBj61YCyxC7LokfQm/7e\nl3aMI7WDqF+1CUMfBEHQ4USMfgBllCBW18JxNaR1kB5lqBtlktFfop731qMEMiJGHwRBsLoRhn41\noCyxy7LoEfSmU+5Lp5RjIAhDHwRB0OFEjH4AZZQgVtfCcTWkdZAeZagbZZLRX6Ke99ajBDIiRh8E\nQbC6EYZ+NaAsscuy6BH0plPuS6eUYyAIQx8EQUdwxBFHxwzdGkSMfgBllCBWB7RnqeOIoZavfrVL\nRn8pSz0PGStkRIx+daQsU9SDctLKWjWrgxfcSaxyQy/pYEl/kvRQegNVsJoQMdRyEgu0dT6r1NBL\nGgJ8AzgI2Al4j6QdV6UOweAxZ86cwVYhCFZLVrVHvxcwz8wWmNky4BrgsFWsQzBIPPfcc413CoKg\n7axqQz8GWJj7vShtC4IgCAaIGIwNVhkXXHBhpL8FwSAwbBWfbzGwZe732LStCitlCDXEU5LKJqP5\n4ztbRvMsXbqgFGUpZ/0qi4yy1K+QUVXuqsyjlzQUeBDYH/gL8AfgPWb2wCpTIgiCYDVjlXr0ZvZP\nSScBN+Bho++EkQ+CIBhYSjkzNgiCIGgfMRgbBEHQ4ZTW0CvR4rFDJQ1p9fj+nj8YeNJ4T9AG0rOy\nTgn0KMUz10+7sa2k9QZTh2qUztBL2lDS3pZo4riNs+9m9k8zW54/vtkL1/f8ZaiAzZA9uAOhd39l\nStpe0nhJW0raTdKOktYteOwHwO9xf3RIstaRtEF/5bSbRtc3zTBH0hRJ+xY5psF5dgU+0sLx62e6\ntIP8M9eOepsasKYdgmbsTu5cmb7nA2s0e3w1HdrZ+K7q9MoibA18Q9I9wNfM7J6Cx50t6Wo8o+cI\nYDpwO3C7mf05XTgVuYmStgWOA/5gZj+Flm/+BGAC8BDwiJn9rQUZawI74IuMPA08bWavFDj0FEmX\nm9nS9DCqVeMoaSKwAT7B7c+tXIucrDOBjYC3AP/A02tfBpZKug2YbWbP1Dh2Q+AASf8GXAH8rMVr\nOsTMlgN7AIdL+m/g0ZQskP2v2nGfBXYE7gMeAf6Ujnu2WR1yMkcAE5OcJdBUXXsbcE/+mKJ1vA9b\nA5vmdBIwFFhe7VpIGprq0sXANGCmpGFm9mqT512hr6R3AF8ATjKzm1t83tYHXgssNLOHa93HBjIm\nAK8BFqTPE0XqWCrDEOAFYBSwYhp4s/ckGfjdgYMkPWlm35A0GnihlfoOJR2MlbQ98C5gY+BG4Ldm\n9nK9hzB37HjgYKA7fTbHK/EbzeyWOsdlFW5P3LvZCBhjZntJehuwrZl9vYDuQ5PBOA7YFn8YhwP/\nxBvWz5jZlU3ImYI3OmOBZ/CK9Dfgy2Z2Y53jvwhMAo42sz+lbcOB9YEzgP80s+cL6PElvOIasBbw\nCvAqcGbn6aG6AAAgAElEQVSzBi55V+8GZpnZE2nbGGA7YG/gQNyAnmdmVVfNkrQpfk0n4kZuupk9\nnf7X7AM1ATgd2AzPAPth7n8ryZL0RmB7fDb3lnj9XBNvqF4BTsuMdYPzZnVte2AKcAzwJzM7IHno\n69S7tzk51wLPApfjDcUTRcqdO36Ymb0q6TzgAOA84P8aXcOc/pcA3zKzu5s5bx1578Lv7RLg+2Z2\nfxMyNgEuAEbj92Zd4EXgHjM7tqCMzYDv4R75UNy5WYYv23J0Af23A34FzAUuwevnwqINYGbfJB0O\nHIk/b8+Z2fGSDgW6zOy/i8haCTMr7Qf4NF6RrwS2arDvh+v8bxSwRoPjh6S/JwNnAm8Avpu2HQNc\nWVDnTM4M3Hj9D/BmvAL/EHhNk3JmAXul7+vj3sbJQHcBGe9JehyVPl/HDelpBXUYiXs1e+Le75vx\nBviEFu/nmsCG6bN2jX3eAVxeQNaxwJ+Be4HD+1nPJgI/w9N+j2qw71BgHTzsuQmwW9L5VGDNJu/t\nJ4D/wBvk/87qMW48i1zL84CZwHeBbwMXAee0UP7JwPV47+ol4HG8t7JDg+vwaKof5wPvxJ2h/tyH\nIcAuwNnA1cBbmriW7wR+ndvehffu31NARubwvgO4Nrd9WNLnoIL6b4w7iZ8DbsbnDC3FIxNFjh+a\n/l6CO6sfzO4n8F/Al1q9tqUL3UjaD1/obBQwB3/4NgRukDQVuNT6tJDJi58CfFvS5sDJZnampGHA\nP61GKKAGY/CJXAcDv07bdsYrfkOs0uPYDLgj/X3azGZJ+nfgySblLARGSlrDzF4C/pg+NUldyDWA\n+3EP5/v4BLXPmNnJTcQtR+Ce7h195BeKp1ehB2807wFelLQY7+Iuxb3i583sOkm9vNmcpzMJN0pK\nZZuO95ROkHQw3kspdH2T3K2BrfCe0v8BFwJrSXodMNXMHu97jHkva13cOM/Dvb1WPdqtUxlej4eD\nwL3RRQWOXQZ8Hu9p7Y73Gjdv5uSSxpjZYjObhodgsu3jgX3wOlOPD+KOxzZ4r3MrSc+YWU8zeuTY\nDi/Li3hv+JeSbsIdi1rrIme9j1eBm5L+w8x7Vg17V4nsLR9rAC8nz/wJM3sBdyTubdRbTP9/StJl\neCTg02n7ZkDRwdnsmX8KdyYmAVelbdsDPy0oZyVKZeglrY1Xnplp01/MbGr630bAbXhstm9XaBf8\noQP3PHdP35fXuzl5cob1ItyrmgJcmOLB3cC5TZRjDeBr+M26BXhX6qbviXtLReWsjVfC84GfSHoS\nrwRPmtmsOoe+Hu8NrY97fRvjXms2Oa1R+CuLwR4InCOpG28s7jKzR83sry3GghcAv8ArcA/uPc4B\ntgCeAL6Mj6n8PX9Q7t7shVf25cBiM/tdTucHcCNZyNCneO6HgHHpuGuTXhvg3uF/AR/I7Z81Nlnv\nbE9gPPB3ScuBq83s7CLnzpXn5/gDfCjwkTQW8gbgnCJygLfihvYB4D4z+4WktYocKGkL4KOSPgNc\nSmXc4WHgcTO7vEEZ/ol7rTfnZK6D9wKbIh33IB72eBR3MD6PG+5Dge9IeqtVH5vKjPQuwGHpmblJ\n0lLgeWCp+Uq5dYuT/o7Cl0//PDBH0gv4ONIvzazGUi296sYUvNF7u6Tj8UZiLGkcpRG55+l8/FnY\nF3hY0gn4+NzNtY5tRCkMfc5o7ASsb7kYds7ovABcbGZ/rSJiNyo36/W48QDvCjY1IGNmiyT9GK8k\nh+Ld2Y9TMZJFZCzDu9NIOgdvPN4OfKBJ4zgMN7Br4IO6W+JlXYSHdGrxRuCbwMzseqWK91VJF1ga\nYK6jfzZo+3PcGO4MnAJsnWLqJ5jZJU2UI5P7IPCgpCNxz/4O3KM+MJ1npQHF9OAenfb9hpnVWuv4\nbCpecU1ysvcExprZe6uc8y48zNbr0PT3UDwG+yze6Mwseu6+mNkM+fsYXgF+iScPXATcWkf/7Hk4\nG792z+KOzX9I+omZnVbw3AslfQ6vW3Nx4/pv+NjUOpJuNrMzq5w/i0dvgdeJXYC7cQN9P5Vnrxn+\njjtTa5lZr16EpFnA+2sY+Xyj+SzeWG8DfDKVaz3gvcBj9U6eeyZvxh2z8XgDPBo31Dc0OD7T4Xjg\nNDwEtNTM/p7GP44H5teTkSHPAjsIHzu6Fb8fPwRu6HttmqLVmE87P1TibP8GXFhnv2E1tp8A/Ba/\nIXfjXuPHcQPxRrzxKKrLJnjoaG+88g9tpTx4a/xR3HNdL/c/NSlrNP4wbZLkjqRO7LTK8UOz64Zn\n7zwG7N6kDpvhA4TgIYKR/bzPdwFb9vnfTbjh7XvM1nhP7r6k++N4A/RfwOF4N7kVHT4KfCJ/T9K1\nGoL3xDarcdwN6TpeAhybtl0KHNCkHsOBt+XrBbBRE/r/jj4xcbyx2KvFezMKj/srlW/PGvtldenn\n6Xm9Bw973Ys7Vfu3cC8OAo5P37fCe9S75K7LZg3krEGfcR28Z7ZnM88v3gM+FtgjKyuwYcFjR+K9\nUYDbsvKl69Lwmc/VwTcBN+e2r9XK/ez7KYVHn2Md4KjUrZ6Jd/X/DCwyp+rotZldDFycwjtj8fDN\nODzVakd8ULJmjD3X9doPOAsPA22I37wNJP3BzBq+9jDnbZ2LG6i/ksYbUrbIaWZ2TQE5mT7vwrNU\n9sAr8z+AU83s+kYyMpI+yNOznsErUs1uaB89PoT3RP4CDJV0u7U66u+6LE/jJj8C/lvSt/FrtCcw\n3MxWik2b2WPA3ikb5Vh8fGII7ln/B55xMkUFMrL6MALYSdKuuLf1glV6Mn9Ln166p6//g3ej7wF2\nS+MGB+Chuobk9Hw98H7gF2n8ZZmk0ZIOMLMf1Do+p8dTwCHylOK/m/fcNqX4vc3X+cPxsan1cY/8\ns+be6ErhudwzONrMfiDpI2b2ziTzMgqOZWVqpL+H4z02gJPwHt7bJZ1qZo/QeKxgYz+9RlrKBDOz\nF3MyaytQ6aFsgydhbItfix3xe7QNHi5uxHJguqRvAmumcbJJwIt9r2EtVfAe7cbAPyS9FrjbzP5R\n4NiGlMLQ5yrvYjw3dzgej90P92jPAe6rFRfOKq15mt3TwN2SNrUm081w7/9BMzslGeYNcW/25YLH\nZ+U4APcWf5f0G44b/j83qc8ngE+b2cwk5wDgeEl/strph2vj3b3leNbB3sDa+L3eCVjXzHZudOLU\nNf8g8Fl8UGsL4ERJG5rZhU2WYwXJUHxePvHpoKTny3jK50ppjZLWNO+2H4N7TJemf10i6TQqXeJC\nE2xyde0F/CH+HPDnXDz2a2b2VJ3jL5cPZn8HH//4MHCGmRUN3WR67kslHJiVdz98QLKmoc9xMn5v\nNgaelvR64H6rE0vuQ3bOT+G9qSvwENKJwBclfdp8MLKiuDfSo/BG8EX5vAYkHYb3pN9Ac3U802F7\n4Hx5WuEwM+uWdCUeMnykViOe2/5aPHliHUnfxUNRf7Zi80YyA/smPDHgVNyBAL+276CAoTez5yV9\nDw8bLcLHG5bhDVdDcuVbns77HWCBpOdwZ+hi60caaykMfYZ57vCNKQ68Dm5oNyXF2Gq1jNlF6tM6\nX4QPmhU5b3aRbwG2T8bsCXyA8OEm9M/0Ow/YUtLjeKz/RTMrHLvM6TOMlDmQynaTpK/gFagWk/CK\n+Rgewvoj8D78eu7LygPZvcg9PLsBT5nZjPSvOfIsmc/h2SktkQYLt8QN9D24Z7oo3bdqDXlW1r8C\n3ZnXJkl4g/qt9P9mJ8f8CM9o2BpvxDbHe4MrNeq5epWl2l2IZ/t8vO8+jU6aMz4PAT0pRr8Qvy+7\nUyfWn9PjDfj9+RLeY9wC72nMqHVsFT1MnjSwvZkdlDvHyXiorFo92QZvYL4HHGxmr6QxqA/hed9z\nCnqvmQ7ZPbsB+DH+rL8zbZuANx75/Wodfx+VXvRncEO5qaSzrPhY0tZ4w7s/cGfath0N4vvJ8wZv\n4ObjMfod8Of2iWY9cjP7CZ54sRl+vbfEQ7f98uxLY+iTAXgv7tndamaT5WtGPGJmRT3qYbhh2J1U\nUXPhlHrnzh7SbfDW/EBJf8AHmP6Ce5KNRu4zWcPxcMcBuDF5AnhC0l+swCSYnJyh+AP1MUlXAEvk\nE7deMLN6XlM2uHYf8HMzu02e1bBFejDrTlnPPTwPAEMknY/HY5fgjUizvZKsPFkD8gE8H/9w4DAz\nu0vS0Sk89mgVfTLDcRaeiXCtpAfxe/0CaeCyGQOTeAH34uYB11v9GYdDcMP+JvzhR9JaZvYPeVbW\nlmb2pSbP/1M8hfEM4LHkzd4J/KTOMZn3uQ9e5HvxGHCrrIWHGz6L19WHcYO3rlVPeliGD5xeAawh\n6Yd443IV3lg3PSANYGZflPRLfB7CHak3/biZzW90bHp2H026rGNmp6ftW+I9lEbnzur7f+P25zhg\nqqQ34c/w1AYiJuOh1RfxAeFH8EZ8Q2BE6n0Xsh1J76l4PbjNfILnLXgj3i8GfWZsLlZ4CN49/xFw\nipn1SHovcKSZvbNO2GZ7vFL8I7dtO/zhm1nE0KdjhuFZA6filX083pqOxgfa6k49zpXjUNzTOxtP\naRyLe1wLzOw/C1ySvnI/jntta+JZAT+0PnntuX0zj28t3KC+D58T8E48lPTTotcjydsHX05iCB5W\n+ANwfpEHsI5u9+APxo+B/zKz2yX9Dvikmd3SyDOW57i/Ae+aNxzv6HNsdo/eiDc03bjn+DfckP+g\n2j1SZZbyZbgTclnuf1/A8/8vaEaX3PEH4THheXiKZM3Zxjn9T8F7q5fgDfITwDMtNHZI2hmvq0Nw\nT/Rp4PNmdkOf/fqG1PbAl7HYEE+NvBt/fppudOXzEjbFGx5wg/n3vqGjOsefjj+nb8bDgcKfuzm1\negNVZLwZD3kelOTMw3uvt1mDma3JKdsSj+vvjF/HzZJOB9a7p33krIM3LDvi9mckfj9mmdkxRWTU\nojQePX5xbsW7zg+mbcvx0AdUvKq+HAVcKun/4Ysz3Y+HKx6TtJGl6fEF2Aq408x+2aL+GevjBqNv\njnEzi3bNw8u6K24Qv5Y3zrViltkDljzNy/DMjLfj13SrFJKq+/CkBncG6UHBu6Ob4mMFRXtWK5F7\n+J+kMrknC2etj/dC6GNMssZhOH6fzwK+YmZfkS9+17A8fYuX/r6dSm/teipZPA+k8/ZqDHPfrwU+\nLunveCrki3ijVWggNleuNXGDsjM+YPg7fM5I3SUp+tzzF/D48evxsNZySd+0OuMLufPvjF/zJfjg\n6b/hzs0LwD+qXdN0H7rxRvEpvH6+ks5/Bt6T3Ndycxsa6JA1WgdQ8YofxePkr+BebJFlIEaSHBk8\nrPakPEVxqpm9qaAuI/H6vT/uaBYiHXcM3hNajNeJGVkdllSrZ1SV5Ex+OCd/Y5qYv1OPQTf0ucr7\nNJ4JMQVP1wL3Wm5rIOIyM3tC0s14WGFz/MZvCGwm6d/qhTpyD/VYPGb6v3ia2oN42OjPReOviTcA\nH0gezyw8Dv2gFZ9kdCces30tHlM/GFhXPlgI8MU6Hv3QVI6nklG+Dx/E/jU+oH100q8qKWa7r5n9\nUp7N8TQeo3wUz6FfaGa3N74ENeUPw2dgnpM27SDpWLxHVs3ryRr3E/C6eg0eryRtM+CCJu5Pts+u\n+PyEKbgXPVc+wSbToZYXeBMeunkD7s3uj0+umVlj/17kGuh34IOeT+Pe48Z4N//H1iAPPjUSo4GP\n4T3FMXhD3IUb6iIci0+0ehqftPYobvCfxBeX+7tVz1v/Bu4QPQz8Jh13Lf6MrkVzcwmyRvcj+JyP\nl/EGZDF+ba6F2k5N7p7vjDsjv6eSnbMFBVaQzMkYASyWZ2A9jDd2RXq9m+DJDnvg5f878KykJaks\n99JgFnsffbrwtNBn8B7NU+nZ3aqojFoMuqGHFRf8KvlrBncGNpT0Vvym/yztVmtAZqkk4WGF2/Ay\nrYsb+uENjHx+RcdFeFdtKzzdbxKwhaRLzKzIqHum3yX4Q7M9nhp5EjBOnjY3t5Ec3PCYJMNnt2aZ\nDpsm3eplVbwen6h1s6R8zHAObuTHNyjDMnzijfCQzc54ps4OuAe6jMpgWSusjfdyNsYN5pn4tfoo\n1B3QHA9chhvWLCY9Gm8QoXZvrxe5e3Q5bhTuBybKUyQPwjMdepF6E9vhDfAm+ODvDrgh+XAz8dcc\nr8MX7VpxPnmWU5FlabcFdjWzhVTK3xRmdnryFrOF2d6ED6iOxcMG2+FGfAWpR/qrdP7nceN6k1VJ\niS1Idi9G4GGfU/G1XB6Wp3xmE+NqJWBk2xficyuuxXtY4OmZK4331JGxB55xtwneu3ssGevHGoRd\nHjazY1KodBR+bbbFU7sPwp/dhoY+15hlz9wCfExuKO7QrFQvm6UUhj4Ztn/HjeT1eGrlS3hFejnb\np+9x6p2T/Akzexfe7furpL9R8dDqnffNwG/M83W/mZO9AT44u7TJstxHzrNJXuwYCj6UuXL+u5m9\nO31/LMk6gvpT/NfDDdA6eKO3Bp6d8WbcU/gV9WddrpEM13uAHc3sM+Rm4CZvsj8cjcfWvyrPoV8P\nj4s+BSvf41wj/CTuMb2ByrIEWVgLmsi4Sb2WBbhRuAJfGvff8WyJO6voMR5v+J/HZyj+EW88Hwc2\nljSvCWOXyX0Oz8HfBQ+fPJUMdz29s0ZwbTxM8wF8LabngZet+eyOp+TJDrvjzsPzeB05zaoPiv8V\nj+Ujz/rZDzhV0qO4N/2A9Vm6osH587NRDXfUPi/pBnzsZF6f/WrJmS/pf/Cw3hD5rOY78eybuigN\nqOM9+CX4vd4dH4TdHnf86o0DHStpOj7OMwqPAjxAGi9RwTWlcg7I43gSSRfeo1+GhxRnF5FTj0Ed\njE2GY0v8Ap9rZq/t8/8zrM4glyqDZCcC483z39c3s5ckfRB4k5l9sIEO0/Au/EO4YbwLr3S/x5c4\nbRjzzMlaCx/kO57KTM65wNx6PYvc8Rvg3eoD8Qo3BTdy9+K9lB+a2SE1js2nlp6Vjr8Jz9z5G5U1\nz2su/SrPVNgIDwssNLP/kDTKzJ6RZ2YsN7NzGl+JleTulfQ5Ae9xXGSVlNjPAH80s+m1PPp0XS/D\nG4qb8K7tEnyRtkLjBrm6siPwMTPLx0I3xGdi3tLnmPyyCEPxxmUi7vVunn5fa01m3MgHcN+I92b+\nghv+vwNX1CpP7v6+Bw93vITX2SfxRuumIj1G+cS5D+B1bG469/N4D2OpagzWy9P9Nscb5Sfwnt57\n8DDUevhcgu8Vvwornn+Zjyltgi+pMBafGXp5QRlfwRvrrI4/YgUXMZT0UbzhnI9fi2xQ+59JtyH1\nGi95ptTP8Xq9I96r/Cd+P17Fl+woOkaIpC+Z2Sdzv9cENu1Hr2kFg+3Rb4hX+A/hMcrP4h75Q7jx\n3x+PwdYafMwq5GgqXuFLadv2FJilZ2aTAeQr9u2VPq/DU63GyPO267aGOf2OwlPf7sVnbs7DR9Ev\nJTfIUodX8Xjv6/AH+d34w7UG3sWumdOf6Zi8sQ/J5yLsjQ+0XWtm1xU4/ya4ETkMn6gyBnhS0v14\nr6nVLuTL+ODf1nhI7ABJr+A9roOoeOZVSYbgWLwBewPwrDWRqprokvR2PPS0bmp8/ol7f/viZe6V\n9ZMMa/ZCjT1wI3IXQM6haOUtQJelz/a4o7M5vvxDzUYrp9P/SLoOf3Z2wI3b62g8lpXxPnzRrAdx\nI38L7txk8v9Zo8E9Mp1nh6TvnXjv5n/xe9gKB+P344Pmq45+Wp5a2TAtMu33Ir6UcTaf4fb0v2vx\nsFqjbJdszfm34oOevweel/Qy3pOvOwvczH6SjPFyPPW3i0q2TReVUFK9cqyDe+/7AIdK+lqSvQhv\nhC7EHZx+UQaPflPc0G+GhwnGk+Lr+AtHptXxMrKLPALPS16KTxIaChwCfNXMft33uNzxmZe3P+7l\nvb3FcmRyvow/OKPwNTa+LX+j0p+twMtGcvK2Ssc/Kmksfm3Ac5VrTgeXvxlrCH49JuG9i23x7t/F\nRbv3kt6Nd0HH4YOf4/AG6OfWRBZBTp5wQ38kHj7aJJVpBO7J/qivYcl5sBvhoacD8YbhPtzzesia\nSPNMhmEiPpHuWdwwjsKN/Z5Jh/P61rWcHrPxEM+j+MM3EbjEzApnaeRkros/2AtJ2TZ1xif6Hjsc\nj2dviRvb6ebLRBQ9dxd+TzfEBy0n4L24bCzoPKuSeSZf0nlNKuGFMbghWlrAoPaVtSM+GHwE3njm\nvdjT8XdPnFjLwUvG8XTcKRmJh9QexjOYnsZ7RtsX1GVL3BH7Hu5cbYvPCL/FzP5fneOyejERT5Bo\n1XZshNftE/H78T38Oj+B36fNzGxSK7LzDKpHbz6yv0jSVPPZjkPxQnblK281I584BbjGfCW+d+IN\nxml4mOPwzPuqp0L6O5KUA9wiWWUcjTc2OwPD5ZOTXkuxKe0VpcwWSDpG0mvwLuWdVlmzplZ4Yxwe\n71wDb+y+j6eKLbMqMddapPDRLsmA3Z9krZRy2IS87IFYH5ifypbFhIea2Z9SQ9CXbID1dLzCX4kb\nol3wbvLP8bTaQmvcWJrpnOpJ9paubXDv9JtUBu+W9znOlKb+J13fi3trZwHflDS9SOOnSjrh2/CG\naye8wfurfNzg+3hWSz0ZG+D39Ld4r3Ff4K2STjOzQqurWlqnPZVpLfx5G4k7VltRY0ndKo3J/L5l\nK3L+xDK8Z7A38Br53JNn8EZ8DGnl1zpl+BtwrqSf46myC/Ee5354b+CcRgrkdO4G/mpmV+X+dzO5\nWc8NWBNfgqIH71H8A38HRiEPOoV2rpFnfW2Ij5dk829+g/cy+s2gGvqc0Zol6X1mdr+kC4G1JU0z\ns9/UOXY8vnrgl5JB3Qm/6T/FjUSt5WzzZDdjLHBS8jRm4gZuAT6qXmRae7bP/8MNxVN4Xu938ZBL\n4RQrAPmaGY/jWSnP4QurvQTsbLXXMhmFx3ufwD3UCbjH9yf5gNkfzazmwHLuXuyGe1srBqvk+dPv\nxrOAmiWbzXkk/mDPxD2xk/HsoO+YWbXKnBmONfDc+ZuSQVwDfyCyQfpmlz54Dh8HydbCv8VyeeM1\n7vfm+Noun8HDDe9Lcihi5BNZY/ZOvOe6Dp548Ag+plMzvp67N7vgRuTc3P8m4zHqprKhUjjqVfxF\nGwcAPy7gGNWS1exS4I8A/yl/qcjv8GuxKx4e+1/S4GMtuTkj/Tfgp+bLi3xXaV0kFXtheX5exwj5\nON/NuKPWg/c0i7APHn7eEu9RPIqvnXSrFXit5Apl/MVEe+P1+8Z6PfdWaNsb3FsheUvr4SGk++UD\nTZvjXsVZyeuoxe5UvI+JeHfrt/hCT69QzCi9S55adxs+aeO3uFf+UdyD7C5altQF+5GZ/d183fVv\n4vMBDmnSox6JZ7x8Cp+FOQqP7/+wlpFPhuBO88Hst+MDZJ/BK93OePzxI41Onf5OJHlruVDP1unT\nCpncXYAZ8pmt2+JjIM/hcV/6Ppw5g3s97rXujg/6LTOzJearEzaniIdvforXsTfhHvTd8jGImpi/\naepM/CH8TvJu30jxNxhBxbCMx9d2GYnPr7gO9wLrhdWya7gp8Ip6v1xkGcUX3VtZsA/OXthKb60/\npGf7T7gXvjceTrsK+J01zt7JrseZuJOGpLOA6+Vr9RR2zpKTMRWvn8fgve+98RBf3eNTT/RivC79\nB95oj8d7oRMa6dCrQNKl+DP6MeB7km5Kn00bHFqIwR6MBe+qLZLP1ns/XtB5wHHmLy6uFbtcj8rD\n8Tbcy/tP84lJD+KedCM+ib8MJHt59hp4V+wQPIbcsDuc029Lcg+c+UpzhVeby8nZCb8eXVTuz+/x\nwd2qpEr3UXyG5G/M7CG8R7BiwLKRl5Pznu7Bl4o+GTdI6+KD4oXeklOFTO7d+EPwHtx7vF2+vEO9\nF7avhXvf++C9lGdxb2kBHhct1D3u4xG/ZLlJSSneu1mf/XodJ2kE7v3/Idf4PUJllcOG5K7v1bgh\nugd4g3x1wtfiPci6x5oP/nUDv5d0N97N3w5PD2yKnFe8EenFGq2G55o8b3aNd8Dj0U/h13IYXlce\nBr7YQEx2LXfEowH74L3Qs9NnJg0mb8nTqh81swXmS4P8AR8c/zYFX+id1RX5nATDXwv5XWsy1TU5\nd5PwRJBX8fGsjfGximZX4K3KoBt6M3tI/o7Qa/CXIj8o6TgqGTO1JsPMwNcpvxE3sudaZene/fEU\nyZqk0M+rKe6aLXO8DFiWHqJ/N7O6rXofRgF7SPo+Hj9eiE/CWljk4ckZmMeAr6bvf5Sn4nXROBPh\nfjyscFxqNJ/Br+FtuJG9jgL55mZ2q6QL8Fzid+CVL3tBe9PkPKdvyNdo+SHusWyEx4VvT/9foVuf\nMNJYMxsnn1A0Hu/ij8o8qoLGPgsfvYK//3Mb3EguM4/3PprXtcpxU3FDcn9qZP6EG5JWGr/LUzjs\nAjzz5gt4amLNFDpJe+IG8S/4wPov8Pj8JsDZqQfZFObjBaPw8l2Utq0Krz67pnsBs83sY8mp2Rw3\ntH+D+nH/dO+HpH1PwrNSTjaz38gHq2s2mkn2mvjKnyPkr4FcjIc55+DO44ukLL4GcjbAQ00v4c/7\nMOCfkv5qVd7OVYcN8N7Ms+bjlk/jSxTfWf+w4gyaoVfvBab+z8ymJo8a3BvNUvlqzYz7s6RTcWOw\ngDSxSf5y8GV4GKYeO5CL46du2BrpQq9LgSnU2aFJx2fx0fuReCV+E94qX4aHHwqRwjOLk06fw8NI\nN5NefFznuJnkpuKnkNhWeNzzcNxra7Q408ZU8rN78GyAh/EYaivZNqPx+PMF+JyAGfjkoGX4ANYH\nrPrLvLNruinu7WGVmaC/SrJbeWftAXgsezweG35M0l/wxa+qre+SGZrj8ZDWLnjI8NO4J7wzzc9O\nHSvpLXgd/wS+IFqjchyH9zSXUVkO9xZSY1X0xLln7hh8zCRb4uIp+ZIdN1iB+R79JAu7jMDr2ooB\nYqd70bcAABbxSURBVCrLAzeM+6dynISHKq9KRn47/1f9sF56xrNxqLF4iDbLAtoBr+uvKVCWHXE7\ncSzes9oYd8oKvRsh15j14A3WrvLU0Pvw3kYz6zjVP1fzz0p7kfRFvKDfsoKTJBrIWw/PJni23gOU\nvLr/AH5mfd6hKukMfALWlILn3BD3BJbjjafhqVI74avfFR5Ykad7fSDJmY0PojYdj24G+WSYT+Hp\ncvuRVlLEQ2mX44aw7ztUi8gdhXtp8/GFv4ZSCbm9CPzKqiwvkQuZHI33bp7Ec70X4l7tz6zBTNIa\n+gzHG4/t8HJuhcdS32++5G9ROWvg9fX4gvtn6bcfwXPOH8V7gCNx43CF1XhzlzwT7bX4vcne3fs9\n3JtfF/ibmZ1YUI/suv4Bvx9/w1NnN8PHYE63JsaT+kOKqX+SymzSBbixv8YaLO6WkzEUj6c/iDta\n2wMbW5+Jb1WO2x2PEjwGbNC3cavXm0j/3xFveMfj42mfK6JvHXmbpXJsh9vCLdL3j5pZ3QykwucY\nbEMPKy7cmbjXdCE+qNlsNkUr552CD4DchWc9DMVbaQFXmq9A2UjGtrjuh+EGfj7uLX7NWlvO97f4\n1PatcE+jC/d+ump4v/1GPqV9Br6Oy7nm4xzvBv6ftSGHN3ee9fExmSx/e4mZ/bDWgyWfLTkiHTMa\nN0bd+ODhH5v16pOBnoLPR/h5g30zozgWz7JZQCV8sgX+ur29Cp4386SvxfPep8kH2Ybjg4kLihhY\neXbMKWb2Dnn+9kb4M1xzrkg1XfDn64iixwwE6bquhae4bkVlhvxH69Xz3LXcHx+32gtfI+fHKWS5\nyGq/QD6TcSRu5Mfjz+6DeCMzD+8l/dbqZ6j9GJ+49xhus+bhPc178Ear8PLIOZnj8fX470u/18Nn\n5rbFySuLoc/emXkc7llOx2OZLaV7FTxn/m32h+IGNXs58iUFH7zNga/jsfisO78n3gUU8CFrYoJR\nqvy/MLPd+mzf2JpYiqFZ0sPfg1/7kXjq437AJimGms0ObVbuN/AH4na8hzAHXxOlUFnkg7E7kLJN\n8HDFunjec1PxZPkktPPwEN8bzGxv+ev3trNcDnWV43bF02aX4b2stfF48m/M7PwmdTgSdyZ+VqRe\n9G3IJH0SGGFmhQeBq8gcgmeXnIbHl+cA964qTz6nx5r4ooNNOS9ZXZSvMfMV/Ln7spldJ+n/8MHQ\nIrPAs3Bt1tDshBv+1wCfMrNZdY6bg/d2H8ZDxxPxeroN/vwfYwWXa07yLsBtTw/+3GUL6d3cLod3\nUAx9rlXeDo+b7owbhDl4fGw43sX/gpk1lYPeD52G4tejsEGTv13oSDN7d/6hTKGci4Ff1+qS15C3\nJh7vMzz3finwdGoEW4lJN408g+F9ePjof3Aj10q+emZcd8J7STvhD8IoPHTzKvDeWr2e5P1/Fm+E\nf4M/CAAnWRMzMXN17Uh83OTH+MDdOyUdiM+IfmvfXoWkCaTufbr+a+EhjpH4rNymUhqTUfk0Puby\nM9Iy2Phgfc2ln1Mc+h/46oxfw9ekaXb5h3z4KFsr5xY8u2Mb3EjNLhqKapWcc7U1Xs+nJB2exnPQ\n/7doiFDSbamx/iWeofcXSbcAUyxl0dU5dsW9lme8rIevcVPIKZO/PGeSVcmTl6eNLi/6vKRQ7ZV4\nw3upme2eens/M7PXFZFRhEEZjM1dhI3wGW3fxleKWw8fhDB56t0Z+KDRqtCplYyDHams7jgkPcxr\nmtkLKQSzZxEhqqS1vQN/AMBb9FcBk3RTM93zVki6Y/6Wp8fxlM598KyQ86i8AKYw5llQC/AeWuZN\njsDDFTtTJQ899xDuh08Q207+wvOtcAN1PJ4x0Szb4xlIm1JZwXM3Kim0fQfQrkq6PiRf8nkhntn0\nIN77e6TISXMN9C74QPCReObQeNyDe4X6k53m4nH96ficg4Mk/RE3jHcD1xV0TjInYSfcoK54WYo8\ne2Stqke1lyyD7n143T4bTxaYjd/TPwM/rNWDTEZ0E3zM5peSvoQ/g+vIlzZem8pLi2qSGv718OSJ\nsXgd+Ks81fUpM/tmrWOTc7oFnt2WTY58AnfKnkjHF1njJqsXu+L3+GEq2ULbkgaq28WgGHpJ78c9\nu9vwqeTP2sqv6vsNuVH4knIgcI+k0bmYXlZBt8Zj/0XIHsL34d3pbM2fjZOcfr0YuJACud6C+UDn\nVfKZi8dQYJGpgudYjqd9PkPj1MQRVDJa/mGednszfo0K53znnIrv4D2Eo4AfyBc425vK8hR9e0u/\nx+/Bb/DQ0xZ443QgMFrSkVZslcQsg2gMvsJk3zePNZrfUCubancKZlPl9AA3RrulcZkFpOUg2hUL\nLshEfMGwA/B49v+mGHX2vNS6r9nLyafhDsgH8Z7vCXijfW4Tvd5d8HvyHvw+b4Ff1+EFjnsQH1Df\nIR27C36Ph+LOQMMXkuf0vAdv8H+Oz5/ZCF9kreGCjM0wWOmVn8UN/a/xlmt9+evZFuIt46X1urMl\n4gzcC88Ggp7BK8GNuOf2noJyspt+BzDTPANkhSFUwXWt2415tlAr3nMvag221mCN1HW9D3iHfKG4\nGSmU8hYqbx9rCvMleM/H14jZDl8Y7AukHllf/czso/LU3xPx8NGl+BoqawCjCxr5PFsAH5SnnM4m\nGQszW9JMWC6FjOamz/eLnjzXKO6IG7QT8R7VE/iKjVc2M57UCjkd7qPSyLxGPjP5/aQ5FXXIXk7+\nfTyUNxMP994DnFmkZ5Pq0TK80ZhpuXTmguyLL7twTWqkN8R7iZslmU0tKWxmj0v6Jj72NBJvuG+i\nwHo9zTBYMfrX4Q/PGrhxW4x7r+Pwi3VmszHQMtDH23oj/jKUwuul4+MTL+Mx3N/iSyA083q20lJl\nYLHW4mxfxKfB/0S+UNsH8RDfRnhm0I9b8T5TaGrnJOcFUkNa0DiMw5fIWBPP8GhqtcYkY3c8FLYx\n6TWXeG/tE9YgHbC/yLONxuOvbHwxjX9sk7ZtB2xhBVM0+6lHtnZSFqtfEw/fjME95C/Xel6q1J89\n8Ou5Lh7yuZc0E71eoyl/t/RxePbUnngvYjbecM7Hx1/qHX9M2ucP/Rk3y12DS4CfmNkMeZrlEy2G\nkeufbzAMPawYhHgnvpLfrbgX/7Sk4VYwj7bTSIOXe+JeQzfeJXzRzLYZVMVaIDcIegb+wuS75amo\nGwD3W5VX8CWD9Dt8Ovhz2UOUDNNueDzz0oIx6fzDtCPenX6KShx0CL5E7korRqbBwmziy4FUZqHO\nB84xszmtPuSq5GA/iceH7x9oTzqFRT6fzvky7nU+io8zLF4Vz1vypD9uZh+SLzsx0nzS4wZ4D6nm\nuxZyMvIvJx+L2463405VoZeTJ0O/Lt7QZ9ktI3AnYFPgBGsy2y8b34LGb8Sqcuy78RntL+Ozxu8c\niPow2OvRZ+9CPQXPh51ivhLdaoOk3fAY+EJ88sZf+vy/2SVgS4V8GveR+MM5E59lOwNfl+jlPvvu\nCnzbzF6fvL1lOWO/Be75FBrgTsdkjc3x+KD/yXiDsSmet73EzK6t4i3+HI+TzsLXXbkz6VJkRdRq\negzFp+mfhme7PItPpKuby98uUk9zL9ygbYaXfxQ+eDkSHzv49gDrcAxwqJkdlYzbIVZwQmJOxm9Z\n+eXka6RtawH/ZQ1mk8ozcz6QNSypnq1BZX2rS62JVyL2l3T+3fH6NgIft/xBu736VR6jl3QQPggz\nH8+y2RcffLkcT7Na3RiPT7w4FF+x80/0nrzxGzyO+i9H8sTXNbNHUkhmmpldJOkOqg/wdpHKaj5N\nPd9l3xwPuTTT+GXG+yn8pesv4z2G3jut7O1cgIfO3oJ7WYuAufI1kO6jYKZLTvfX46mEJ+AN3Wvw\nZXpfNbMZBcrRX7ajsvRv1nCuh09C2wYPfQw0O+EDjuAh2oeSHmvjM8qXVbkPK1AbXk4uaQfcuX1Y\nlfWtXsFXBG1lfat+k85/m6Rn8TG9C/n/7Z19zJV1Gcc/FwLKSyLTEIQZyFBA2DDEXCm6fBnaCxZr\ng1ZNy/Wm5R9OgjasBtl01mZltia2lqnxT2Ea8yVNqZUGfyBu8ACKDgZTmBBNUEGv/vj+bs6tPg8+\n55z7Pvc5z7k+Gxs7z8Nz/4D7XOe6r5fvV5N384q8ThXN2BWoPLEXbWJ+u57/rIGGp7nhFPye4d3L\nG4tQg7cjAz2aQnjSzO5BQWVFKtm5974b8DjwKTNbiSSEd7r7nvQmX0StWdcvLZEcu9K1b0BZ+jNo\n2qNXo3SXD8JaZLmXBcWJNDbp4qgssNFruvtPmNk29IZuRaD/NAqMy8wss9jcisYKN3nfHgdFchlq\nRp+O/i/vBOhv9uzFmJOfiZ6mSD+nUX2rQjBJfNyEnuZfRr2K9fRjaqfua7W6dGOahT0FrcBfgm6A\nqaQZVOQM1ef68UDDmlzeaHdMmkJzgfXuvtG0/Xy+u3/dehmRTFnX9ah++hq6+aejhaF7XG5i9Uof\nbEcTUo6y6Y+i0cqzvQHNnHpJT7GL0QLaWtQf+A6SPri1Bdcf5bIrPA8lEuNR6WpM+v0Cr3+KqN4z\nDEZPZTNQoncFSmj2pF/HfN9bAebkVqC+VTOY2YdSU/xCarsFu12GLH0OKjR1zSpr9HlyWdOmTq5J\nN0LKWO8mt7yBlDWPubzRCZiMXcajkbTX0msj+pquSF8fgj78p6DH+peAzY3UTk1zyX9090sbOH5T\n5N+wZjYfLT69gcol22lQD6nOM4wBLnH3+3OvnYBq2iOBE72fNoQlna9f73uTP0Jv5uRD0b/rzz4o\n0Kef07S+VbOYfHH/i0bJt6CSdTY6eri3QYWmr9kugb4byU2FXICmIhahGzlb3njb3W+p8oyNkGuC\n3oFu5iUog3sWzW/36ZZV4Bmyf9sp6FH4JTS2+ip6Y+1y90K3D/s4x0nA66lUNRUFqZ50/VZIWixC\nzcd5pu3Rue6+vOzrFo0VYE6euyca1rdqFpOUxhJU1ZiMnjAfQ/fkIdRL6lN7qVEqNx7pcrIa7qlI\nsncXrWmMlUouM5uLGpHz0HLQYTPLtn/LPkMWRE9Adc/haAjAUTb7CNK9KYWUqV6JasmDzWy1u68x\nsz1oHHAiMjQpm8nUmqAfR1k8acTxraKnO8rCCzAnz+6JVK670xrQt2oWl/vUj8xsJlqKWoAa9LPR\nzshoJL9RKBHo24PxwI0mJ6F/oPLNZjTn3ZGPXCaJ4f2o/nicS3RqBGp+taIunpVNtrv74vTaaFQe\nm07SqimjHpr4JDIWuRe9z75rZp+hJjv9xDH+bJHMQ2v5oL/37wD8/ZIjHUujpd4qPuSspuNzMXqq\nW5u+9KhJFbPQaZuMCPQVkrtBH0clhVEo85yPJFgX0v56P32xF8kGPASMM22GXkXS8KhjRLJZfmVa\n1HoRzV9n1oo9UP+CSx2ci3YCfgtHSw+zgaW5N3cr+B6SkvgnqnFfao2JogXFkH24vAx8Ie14/Bv1\noj5L/Y5l/SJq9BVjsu87gDK9K1B9fiTa+ru80yaQcnXQ6eiDaxYqX5yFauQ/dal7tkp2+QxqpiVn\nISP5QcBFXqKQl5mtRZn0CnffaWa/QKqRfy/rmv08V16m43I03txxciMDAZOw3kUoKZqOpoeWeD+2\nhOu+VgT6arD32/dtQx34q5FZ83p3/3NlB2wQq+merwTu9WMYOLSSVI8dih6N57j790u+3ifQ6N+F\naBTwRLQHsBo91TwYmXR3YjVv5nHI7+E8tNcwGGkfFS5JEaWb6piEzD3uAma57PsWANPcfVm1R2uK\nrBzTgxqOLSf3VDEeiZhtSaOZh8zsIGoQl1o+cgmVHRUrSyO0E1EmPR81gyPQdxG9JHeZN/NUtPS1\noYwgD5HRV4aVZN/XLpjZy6hE8jfSJiqw1Uu0ROzlDF9FMst70PJVpo2y3t1v621hKwjKwlrkzdzr\ntSPQV48VaN/XLqRZ5cnosfQcVL54x91nVXCWk5ES6DS0ZLOuU6eZgs6lyuQuAn2FJK0NckscFyON\n7f3AT8p6jGsVJnXSt7LFpFY1YHPXvwWpEW7PvXYK8uGNGz+ojFYndxHo24xUx/sS8MtOm3XONWI/\nD3wTNZx2oHXvN4E17t6ScdE0XbLe3aemD9RBaHT1VmQO3rFlsaBzqSq5i2Zsm+EF2fdVRJY1XIO2\nX9chXZfxaLRxCLQss5+EXIR0MH0ADUYSAEda/XQRBNAab+beiIw+KBwz+z1wg5esiPgBZxiL9IP2\nIkncCWjdfJS7XxuN2KCbiEAfFIrJMedp1GxahcbHepCcQ2kLSu85Q168aikSEnsdjbPd7+49LdzM\nDYLKiUAfFEoSy7oMlU5GoU3fcUhy+eoWnmMQ0lsfjkpH2/w9No1B0C1EoA8KJxdkhyLp1ZPQvbal\nhdIH1yL3ntdQrf4gWi/vWjezoHsZVPUBgoFBCu7Z2NhvkEfpme6+BzVpd0CpImL5s4xDRtzT0Zzy\nD5D/7jVlXzsI2pEI9EHR/BgF+rzR+51ohOzoeFkZ5H72JGTT9zZy7NmYzvC59H1x3wddRYxXBoWQ\na2we7+7PmtmbSAYX1Jjdlr6vtIw+97NfAXab2Q+B+5LmzUL0lAH1m4sHQUcTmU1QGKkR+7SZ3YSs\n0g6bjLHxkr1R0/WzZZQXgJuBDwN3oK3DLSirh5rwWhB0BdGMDQohN9J4MrAMuAB5xI4FHnD3Va1o\nxJrZLOBjyHy7B1kzDnP3A2VeNwjamQj0QdPkgvxJ7r4/vfYRNL++Ian0tSLILwCuBw6jBalTgf8B\ni919VZnXDoJ2Jmr0QRFkJuc3J9nVDciT9T+Am1mPu+8r9QBm04DrgNvd/eHc61cBN5jZc+6+ucwz\nBEG7EjX6oAiyTH038FfgL2ic8Uakvb3SzGaUfIY5yGz5YTMbZmZDAJJL1yPIuavUqZ8gaFciow+a\nJleS+Row090PJ+u+p5AM6/PAcjP7SokyCNOANek8h+BdDlJvICs/UHITGjdBVxEZfVAIaUlpL5q2\nIc2w9wAXu/tdwOSStW4uA243s1vN7MtmNoXak8ZYZNVG7rUg6Boiow8Kwd13m9mvgXVmthVtwh4G\nVpvZRKRJXybno+bvDDTx8y3gbDPbhSSSz82OWvI5gqDtiKmboFCSPPAcZN33ors/YGYzgQnuvqaC\n84ygJmoW8/NBVxKBPmgJYfQRBNURgT4olDTVchwauTwSwT0IqicCfVAYkbUHQXsSgT5omjSzPhNZ\n9U0ENiEnpxeqPFcQBCLGK4OGycn9XgnchkxG/oCcpa4zszFVnS0IghqR0QcNkxlsm9ndwL/cfaWZ\nDUfOUncBj7n7PeHPGgTVEnP0QTNkwXsPafPU3Q8CB5NJeChGBkEbEBl90DTJ2ONBJDWwA3nEvgrc\n5O6vVHm2IAgi0AcFYmZzgHEou19dsuRBEAT9JEo3QVOY2UjgHOB04Aiy8XsOGI604IMgqJgI9EFD\nZI1Y4IvAN4CtqFY/FBgBPAQ8ELP1QVA9EeiDRsmC92xgqbs/amYnIqXIM5GVXxAEbUAE+qBRskA/\nBJhqZk8lX9YDyIhb3xTZfBBUTgT6oFEys6ZDwGJgvpntRc5SO4Gfu/uRCs8XBEEipm6CpjCz04AT\nUMnmNCSBcLK7L436fBC0BxHog7oxs3nAQmB5Xs8mad4cD7yd2fkFQVA9EeiDujGzYWja5gzgRWAt\nsDXL3s1sNHJ16nH3fZUdNAgCIAJ90CBJ02Y+yuynpJffQcqVzyNLv/vc/U/VnDAIgowI9EEhmNkE\nVKc/Hdjn7k9WfKQgCBIR6INSiEZsELQPEeiDIAgGOGE8EgRBMMCJQB8EQTDAiUAfBEEwwIlAHwRB\nMMCJQB8EQTDA+T+DRvswE8gFbAAAAABJRU5ErkJggg==\n", 709 | "text/plain": [ 710 | "" 711 | ] 712 | }, 713 | "metadata": {}, 714 | "output_type": "display_data" 715 | } 716 | ], 717 | "source": [ 718 | "# we can also plot a bar chart (with grid lines and slanted x axis labels for better readability)\n", 719 | "x = list(range(len(genre_dict)))\n", 720 | "plt.xticks(x, genre_dict.keys(), rotation=80)\n", 721 | "plt.bar(x, genre_dict.values())\n", 722 | "plt.grid()\n", 723 | "plt.plot()" 724 | ] 725 | }, 726 | { 727 | "cell_type": "code", 728 | "execution_count": 18, 729 | "metadata": { 730 | "collapsed": false 731 | }, 732 | "outputs": [ 733 | { 734 | "data": { 735 | "text/html": [ 736 | "
\n", 737 | "\n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | "
userIdmovieIdratingtimestamp
01312.51260759144
1110293.01260759179
2110613.01260759182
3111292.01260759185
4111724.01260759205
\n", 785 | "
" 786 | ], 787 | "text/plain": [ 788 | " userId movieId rating timestamp\n", 789 | "0 1 31 2.5 1260759144\n", 790 | "1 1 1029 3.0 1260759179\n", 791 | "2 1 1061 3.0 1260759182\n", 792 | "3 1 1129 2.0 1260759185\n", 793 | "4 1 1172 4.0 1260759205" 794 | ] 795 | }, 796 | "execution_count": 18, 797 | "metadata": {}, 798 | "output_type": "execute_result" 799 | } 800 | ], 801 | "source": [ 802 | "# now lets move onto the movie ratings data\n", 803 | "ratings_path = './ml-latest-small/ratings.csv'\n", 804 | "ratings_df = pd.read_csv(ratings_path)\n", 805 | "\n", 806 | "# lets see how the data looks\n", 807 | "ratings_df.head()" 808 | ] 809 | }, 810 | { 811 | "cell_type": "code", 812 | "execution_count": 22, 813 | "metadata": { 814 | "collapsed": false 815 | }, 816 | "outputs": [ 817 | { 818 | "name": "stdout", 819 | "output_type": "stream", 820 | "text": [ 821 | "# ratings 100004\n", 822 | "# movies 9066\n", 823 | "rating values [ 2.5 3. 2. 4. 3.5 1. 5. 4.5 1.5 0.5]\n" 824 | ] 825 | } 826 | ], 827 | "source": [ 828 | "# how many ratings do we have?\n", 829 | "print '# ratings', len(ratings_df.index)\n", 830 | "\n", 831 | "# how many different movies have been rated?\n", 832 | "print '# movies', len(ratings_df.movieId.unique())\n", 833 | "\n", 834 | "# what are the different ratings given by users?\n", 835 | "print 'rating values', ratings_df.rating.unique()\n" 836 | ] 837 | }, 838 | { 839 | "cell_type": "code", 840 | "execution_count": 23, 841 | "metadata": { 842 | "collapsed": false 843 | }, 844 | "outputs": [ 845 | { 846 | "data": { 847 | "text/plain": [ 848 | "3.5436082556697732" 849 | ] 850 | }, 851 | "execution_count": 23, 852 | "metadata": {}, 853 | "output_type": "execute_result" 854 | } 855 | ], 856 | "source": [ 857 | "# now lets find the average movie rating across all ratings\n", 858 | "\n", 859 | "# introducing the numpy package which is used to find various stats out of data\n", 860 | "import numpy as np\n", 861 | "\n", 862 | "# lets find average rating using the numpy's mean method\n", 863 | "np.mean(ratings_df.rating)" 864 | ] 865 | }, 866 | { 867 | "cell_type": "code", 868 | "execution_count": 24, 869 | "metadata": { 870 | "collapsed": false 871 | }, 872 | "outputs": [ 873 | { 874 | "data": { 875 | "text/plain": [ 876 | "4.0" 877 | ] 878 | }, 879 | "execution_count": 24, 880 | "metadata": {}, 881 | "output_type": "execute_result" 882 | } 883 | ], 884 | "source": [ 885 | "# lets find the median rating\n", 886 | "np.median(ratings_df.rating)" 887 | ] 888 | }, 889 | { 890 | "cell_type": "code", 891 | "execution_count": 25, 892 | "metadata": { 893 | "collapsed": false 894 | }, 895 | "outputs": [ 896 | { 897 | "data": { 898 | "text/plain": [ 899 | "3.0" 900 | ] 901 | }, 902 | "execution_count": 25, 903 | "metadata": {}, 904 | "output_type": "execute_result" 905 | } 906 | ], 907 | "source": [ 908 | "# lets find the 30th percentile rating \n", 909 | "np.percentile(ratings_df.rating, 30)" 910 | ] 911 | }, 912 | { 913 | "cell_type": "code", 914 | "execution_count": 26, 915 | "metadata": { 916 | "collapsed": false 917 | }, 918 | "outputs": [ 919 | { 920 | "data": { 921 | "text/plain": [ 922 | "ModeResult(mode=array([ 4.]), count=array([28750]))" 923 | ] 924 | }, 925 | "execution_count": 26, 926 | "metadata": {}, 927 | "output_type": "execute_result" 928 | } 929 | ], 930 | "source": [ 931 | "# lets find the most common rating given by users to movies (called mode of the data)\n", 932 | "from scipy import stats\n", 933 | "stats.mode(ratings_df.rating)" 934 | ] 935 | }, 936 | { 937 | "cell_type": "code", 938 | "execution_count": 27, 939 | "metadata": { 940 | "collapsed": false 941 | }, 942 | "outputs": [ 943 | { 944 | "data": { 945 | "image/png": "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\n", 946 | "text/plain": [ 947 | "" 948 | ] 949 | }, 950 | "metadata": {}, 951 | "output_type": "display_data" 952 | } 953 | ], 954 | "source": [ 955 | "# now lets plot a histogram of movie ratings to get an overall picture\n", 956 | "plt.hist(ratings_df.rating)\n", 957 | "plt.xticks([0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0])\n", 958 | "plt.xlabel('Rating')\n", 959 | "plt.ylabel('# of movies')\n", 960 | "plt.grid()\n", 961 | "plt.show()" 962 | ] 963 | }, 964 | { 965 | "cell_type": "code", 966 | "execution_count": 28, 967 | "metadata": { 968 | "collapsed": false 969 | }, 970 | "outputs": [ 971 | { 972 | "data": { 973 | "text/html": [ 974 | "
\n", 975 | "\n", 976 | " \n", 977 | " \n", 978 | " \n", 979 | " \n", 980 | " \n", 981 | " \n", 982 | " \n", 983 | " \n", 984 | " \n", 985 | " \n", 986 | " \n", 987 | " \n", 988 | " \n", 989 | " \n", 990 | " \n", 991 | " \n", 992 | " \n", 993 | " \n", 994 | " \n", 995 | " \n", 996 | " \n", 997 | " \n", 998 | " \n", 999 | " \n", 1000 | " \n", 1001 | " \n", 1002 | " \n", 1003 | " \n", 1004 | " \n", 1005 | " \n", 1006 | " \n", 1007 | " \n", 1008 | " \n", 1009 | " \n", 1010 | " \n", 1011 | " \n", 1012 | " \n", 1013 | " \n", 1014 | " \n", 1015 | " \n", 1016 | " \n", 1017 | " \n", 1018 | " \n", 1019 | " \n", 1020 | " \n", 1021 | " \n", 1022 | "
userIdmovieIdratingtimestamp
01312.51260759144
1110293.01260759179
2110613.01260759182
3111292.01260759185
4111724.01260759205
\n", 1023 | "
" 1024 | ], 1025 | "text/plain": [ 1026 | " userId movieId rating timestamp\n", 1027 | "0 1 31 2.5 1260759144\n", 1028 | "1 1 1029 3.0 1260759179\n", 1029 | "2 1 1061 3.0 1260759182\n", 1030 | "3 1 1129 2.0 1260759185\n", 1031 | "4 1 1172 4.0 1260759205" 1032 | ] 1033 | }, 1034 | "execution_count": 28, 1035 | "metadata": {}, 1036 | "output_type": "execute_result" 1037 | } 1038 | ], 1039 | "source": [ 1040 | "# now lets find the highest rated movies (highest average rating)\n", 1041 | "ratings_df.head()" 1042 | ] 1043 | }, 1044 | { 1045 | "cell_type": "code", 1046 | "execution_count": 29, 1047 | "metadata": { 1048 | "collapsed": false 1049 | }, 1050 | "outputs": [ 1051 | { 1052 | "data": { 1053 | "text/html": [ 1054 | "
\n", 1055 | "\n", 1056 | " \n", 1057 | " \n", 1058 | " \n", 1059 | " \n", 1060 | " \n", 1061 | " \n", 1062 | " \n", 1063 | " \n", 1064 | " \n", 1065 | " \n", 1066 | " \n", 1067 | " \n", 1068 | " \n", 1069 | " \n", 1070 | " \n", 1071 | " \n", 1072 | " \n", 1073 | " \n", 1074 | " \n", 1075 | " \n", 1076 | " \n", 1077 | " \n", 1078 | " \n", 1079 | " \n", 1080 | " \n", 1081 | " \n", 1082 | " \n", 1083 | " \n", 1084 | " \n", 1085 | " \n", 1086 | " \n", 1087 | " \n", 1088 | " \n", 1089 | " \n", 1090 | " \n", 1091 | " \n", 1092 | " \n", 1093 | " \n", 1094 | " \n", 1095 | " \n", 1096 | " \n", 1097 | " \n", 1098 | " \n", 1099 | " \n", 1100 | " \n", 1101 | " \n", 1102 | " \n", 1103 | " \n", 1104 | " \n", 1105 | " \n", 1106 | " \n", 1107 | " \n", 1108 | " \n", 1109 | " \n", 1110 | " \n", 1111 | " \n", 1112 | " \n", 1113 | " \n", 1114 | " \n", 1115 | "
movieIdrating
90651639495.0
7297711805.0
6629514715.0
6662526175.0
6704538875.0
6717542515.0
6726543285.0
6785555555.0
6836568695.0
6843570385.0
\n", 1116 | "
" 1117 | ], 1118 | "text/plain": [ 1119 | " movieId rating\n", 1120 | "9065 163949 5.0\n", 1121 | "7297 71180 5.0\n", 1122 | "6629 51471 5.0\n", 1123 | "6662 52617 5.0\n", 1124 | "6704 53887 5.0\n", 1125 | "6717 54251 5.0\n", 1126 | "6726 54328 5.0\n", 1127 | "6785 55555 5.0\n", 1128 | "6836 56869 5.0\n", 1129 | "6843 57038 5.0" 1130 | ] 1131 | }, 1132 | "execution_count": 29, 1133 | "metadata": {}, 1134 | "output_type": "execute_result" 1135 | } 1136 | ], 1137 | "source": [ 1138 | "ratings_view = ratings_df[['movieId', 'rating']]\n", 1139 | "ratings_view.groupby(['movieId'], as_index=False).mean().sort_values(by='rating', ascending=False).head(10)" 1140 | ] 1141 | }, 1142 | { 1143 | "cell_type": "code", 1144 | "execution_count": 30, 1145 | "metadata": { 1146 | "collapsed": false 1147 | }, 1148 | "outputs": [ 1149 | { 1150 | "data": { 1151 | "text/html": [ 1152 | "
\n", 1153 | "\n", 1154 | " \n", 1155 | " \n", 1156 | " \n", 1157 | " \n", 1158 | " \n", 1159 | " \n", 1160 | " \n", 1161 | " \n", 1162 | " \n", 1163 | " \n", 1164 | " \n", 1165 | " \n", 1166 | " \n", 1167 | " \n", 1168 | " \n", 1169 | " \n", 1170 | " \n", 1171 | " \n", 1172 | " \n", 1173 | " \n", 1174 | " \n", 1175 | " \n", 1176 | " \n", 1177 | " \n", 1178 | " \n", 1179 | " \n", 1180 | " \n", 1181 | " \n", 1182 | " \n", 1183 | " \n", 1184 | " \n", 1185 | " \n", 1186 | " \n", 1187 | " \n", 1188 | " \n", 1189 | " \n", 1190 | " \n", 1191 | " \n", 1192 | " \n", 1193 | " \n", 1194 | " \n", 1195 | " \n", 1196 | " \n", 1197 | " \n", 1198 | " \n", 1199 | " \n", 1200 | " \n", 1201 | " \n", 1202 | " \n", 1203 | " \n", 1204 | " \n", 1205 | " \n", 1206 | " \n", 1207 | " \n", 1208 | " \n", 1209 | " \n", 1210 | " \n", 1211 | " \n", 1212 | " \n", 1213 | " \n", 1214 | " \n", 1215 | " \n", 1216 | " \n", 1217 | " \n", 1218 | " \n", 1219 | " \n", 1220 | " \n", 1221 | " \n", 1222 | " \n", 1223 | " \n", 1224 | "
userIdmovieIdratingtimestamptitlegenresgenres_arrgenre_count
01312.51260759144Dangerous Minds (1995)Drama[Drama]1
17313.0851868750Dangerous Minds (1995)Drama[Drama]1
231314.01273541953Dangerous Minds (1995)Drama[Drama]1
332314.0834828440Dangerous Minds (1995)Drama[Drama]1
436313.0847057202Dangerous Minds (1995)Drama[Drama]1
\n", 1225 | "
" 1226 | ], 1227 | "text/plain": [ 1228 | " userId movieId rating timestamp title genres \\\n", 1229 | "0 1 31 2.5 1260759144 Dangerous Minds (1995) Drama \n", 1230 | "1 7 31 3.0 851868750 Dangerous Minds (1995) Drama \n", 1231 | "2 31 31 4.0 1273541953 Dangerous Minds (1995) Drama \n", 1232 | "3 32 31 4.0 834828440 Dangerous Minds (1995) Drama \n", 1233 | "4 36 31 3.0 847057202 Dangerous Minds (1995) Drama \n", 1234 | "\n", 1235 | " genres_arr genre_count \n", 1236 | "0 [Drama] 1 \n", 1237 | "1 [Drama] 1 \n", 1238 | "2 [Drama] 1 \n", 1239 | "3 [Drama] 1 \n", 1240 | "4 [Drama] 1 " 1241 | ] 1242 | }, 1243 | "execution_count": 30, 1244 | "metadata": {}, 1245 | "output_type": "execute_result" 1246 | } 1247 | ], 1248 | "source": [ 1249 | "# now lets merge/join the movies_df and ratings_df so that we can see the actual movie titles of top 10 movies\n", 1250 | "merged_df = pd.merge(ratings_df, movies_df, on='movieId')\n", 1251 | "merged_df.head()" 1252 | ] 1253 | }, 1254 | { 1255 | "cell_type": "code", 1256 | "execution_count": 31, 1257 | "metadata": { 1258 | "collapsed": false 1259 | }, 1260 | "outputs": [ 1261 | { 1262 | "data": { 1263 | "text/html": [ 1264 | "
\n", 1265 | "\n", 1266 | " \n", 1267 | " \n", 1268 | " \n", 1269 | " \n", 1270 | " \n", 1271 | " \n", 1272 | " \n", 1273 | " \n", 1274 | " \n", 1275 | " \n", 1276 | " \n", 1277 | " \n", 1278 | " \n", 1279 | " \n", 1280 | " \n", 1281 | " \n", 1282 | " \n", 1283 | " \n", 1284 | " \n", 1285 | " \n", 1286 | " \n", 1287 | " \n", 1288 | " \n", 1289 | " \n", 1290 | " \n", 1291 | " \n", 1292 | " \n", 1293 | " \n", 1294 | " \n", 1295 | " \n", 1296 | " \n", 1297 | " \n", 1298 | " \n", 1299 | " \n", 1300 | " \n", 1301 | " \n", 1302 | " \n", 1303 | " \n", 1304 | " \n", 1305 | " \n", 1306 | " \n", 1307 | " \n", 1308 | " \n", 1309 | " \n", 1310 | " \n", 1311 | " \n", 1312 | " \n", 1313 | " \n", 1314 | " \n", 1315 | " \n", 1316 | " \n", 1317 | " \n", 1318 | " \n", 1319 | " \n", 1320 | " \n", 1321 | " \n", 1322 | " \n", 1323 | " \n", 1324 | " \n", 1325 | " \n", 1326 | " \n", 1327 | " \n", 1328 | " \n", 1329 | " \n", 1330 | " \n", 1331 | " \n", 1332 | " \n", 1333 | " \n", 1334 | " \n", 1335 | " \n", 1336 | "
movieIdtitlerating
9065163949The Beatles: Eight Days a Week - The Touring Y...5.0
729771180Padre padrone (1977)5.0
662951471Amazing Grace (2006)5.0
666252617Woman on the Beach (Haebyeonui yeoin) (2006)5.0
670453887O Lucky Man! (1973)5.0
671754251Dorian Blues (2004)5.0
672654328My Best Friend (Mon meilleur ami) (2006)5.0
678555555Edge of Heaven, The (Auf der anderen Seite) (2...5.0
683656869Drained (O cheiro do Ralo) (2006)5.0
684357038To the Left of the Father (Lavoura Arcaica) (2...5.0
\n", 1337 | "
" 1338 | ], 1339 | "text/plain": [ 1340 | " movieId title rating\n", 1341 | "9065 163949 The Beatles: Eight Days a Week - The Touring Y... 5.0\n", 1342 | "7297 71180 Padre padrone (1977) 5.0\n", 1343 | "6629 51471 Amazing Grace (2006) 5.0\n", 1344 | "6662 52617 Woman on the Beach (Haebyeonui yeoin) (2006) 5.0\n", 1345 | "6704 53887 O Lucky Man! (1973) 5.0\n", 1346 | "6717 54251 Dorian Blues (2004) 5.0\n", 1347 | "6726 54328 My Best Friend (Mon meilleur ami) (2006) 5.0\n", 1348 | "6785 55555 Edge of Heaven, The (Auf der anderen Seite) (2... 5.0\n", 1349 | "6836 56869 Drained (O cheiro do Ralo) (2006) 5.0\n", 1350 | "6843 57038 To the Left of the Father (Lavoura Arcaica) (2... 5.0" 1351 | ] 1352 | }, 1353 | "execution_count": 31, 1354 | "metadata": {}, 1355 | "output_type": "execute_result" 1356 | } 1357 | ], 1358 | "source": [ 1359 | "# now lets find the titles of the top 10 movies to see if we are missing on some awesome movies!\n", 1360 | "titles_df = merged_df[['movieId', 'title', 'rating']]\n", 1361 | "titles_df.groupby(['movieId', 'title'], as_index=False).mean().sort_values(by='rating', ascending=False).head(10)" 1362 | ] 1363 | }, 1364 | { 1365 | "cell_type": "code", 1366 | "execution_count": 32, 1367 | "metadata": { 1368 | "collapsed": false 1369 | }, 1370 | "outputs": [ 1371 | { 1372 | "data": { 1373 | "text/plain": [ 1374 | "1" 1375 | ] 1376 | }, 1377 | "execution_count": 32, 1378 | "metadata": {}, 1379 | "output_type": "execute_result" 1380 | } 1381 | ], 1382 | "source": [ 1383 | "# these movies are not what we expected to be in the Top 10 movies list, something's wrong here\n", 1384 | "# lets check how many ratings have these movies received, lets take an example of movieId 163949\n", 1385 | "len(merged_df[merged_df['movieId'] == 163949].index)" 1386 | ] 1387 | }, 1388 | { 1389 | "cell_type": "code", 1390 | "execution_count": 33, 1391 | "metadata": { 1392 | "collapsed": false 1393 | }, 1394 | "outputs": [ 1395 | { 1396 | "data": { 1397 | "text/html": [ 1398 | "
\n", 1399 | "\n", 1400 | " \n", 1401 | " \n", 1402 | " \n", 1403 | " \n", 1404 | " \n", 1405 | " \n", 1406 | " \n", 1407 | " \n", 1408 | " \n", 1409 | " \n", 1410 | " \n", 1411 | " \n", 1412 | " \n", 1413 | " \n", 1414 | " \n", 1415 | " \n", 1416 | " \n", 1417 | " \n", 1418 | " \n", 1419 | " \n", 1420 | " \n", 1421 | " \n", 1422 | " \n", 1423 | " \n", 1424 | " \n", 1425 | " \n", 1426 | " \n", 1427 | " \n", 1428 | " \n", 1429 | " \n", 1430 | " \n", 1431 | " \n", 1432 | " \n", 1433 | " \n", 1434 | " \n", 1435 | " \n", 1436 | " \n", 1437 | " \n", 1438 | " \n", 1439 | " \n", 1440 | "
movieIdtitlerating
321356Forrest Gump (1994)341
266296Pulp Fiction (1994)324
284318Shawshank Redemption, The (1994)311
525593Silence of the Lambs, The (1991)304
232260Star Wars: Episode IV - A New Hope (1977)291
\n", 1441 | "
" 1442 | ], 1443 | "text/plain": [ 1444 | " movieId title rating\n", 1445 | "321 356 Forrest Gump (1994) 341\n", 1446 | "266 296 Pulp Fiction (1994) 324\n", 1447 | "284 318 Shawshank Redemption, The (1994) 311\n", 1448 | "525 593 Silence of the Lambs, The (1991) 304\n", 1449 | "232 260 Star Wars: Episode IV - A New Hope (1977) 291" 1450 | ] 1451 | }, 1452 | "execution_count": 33, 1453 | "metadata": {}, 1454 | "output_type": "execute_result" 1455 | } 1456 | ], 1457 | "source": [ 1458 | "# now lets only consider movies which have atleast 100 ratings and see how the top 10 movies change\n", 1459 | "temp_df = titles_df.groupby(['movieId', 'title'], as_index=False).count()\n", 1460 | "well_rated_df = temp_df[temp_df['rating'] > 100].sort_values(by='rating', ascending=False)\n", 1461 | "well_rated_df.head()" 1462 | ] 1463 | }, 1464 | { 1465 | "cell_type": "code", 1466 | "execution_count": 34, 1467 | "metadata": { 1468 | "collapsed": false 1469 | }, 1470 | "outputs": [ 1471 | { 1472 | "data": { 1473 | "text/html": [ 1474 | "
\n", 1475 | "\n", 1476 | " \n", 1477 | " \n", 1478 | " \n", 1479 | " \n", 1480 | " \n", 1481 | " \n", 1482 | " \n", 1483 | " \n", 1484 | " \n", 1485 | " \n", 1486 | " \n", 1487 | " \n", 1488 | " \n", 1489 | " \n", 1490 | " \n", 1491 | " \n", 1492 | " \n", 1493 | " \n", 1494 | " \n", 1495 | " \n", 1496 | " \n", 1497 | " \n", 1498 | " \n", 1499 | " \n", 1500 | " \n", 1501 | " \n", 1502 | " \n", 1503 | " \n", 1504 | " \n", 1505 | " \n", 1506 | " \n", 1507 | " \n", 1508 | " \n", 1509 | " \n", 1510 | " \n", 1511 | " \n", 1512 | " \n", 1513 | " \n", 1514 | " \n", 1515 | " \n", 1516 | " \n", 1517 | " \n", 1518 | " \n", 1519 | " \n", 1520 | " \n", 1521 | " \n", 1522 | " \n", 1523 | " \n", 1524 | " \n", 1525 | " \n", 1526 | " \n", 1527 | " \n", 1528 | " \n", 1529 | " \n", 1530 | " \n", 1531 | " \n", 1532 | " \n", 1533 | " \n", 1534 | " \n", 1535 | " \n", 1536 | " \n", 1537 | " \n", 1538 | " \n", 1539 | " \n", 1540 | " \n", 1541 | " \n", 1542 | " \n", 1543 | " \n", 1544 | " \n", 1545 | " \n", 1546 | " \n", 1547 | " \n", 1548 | " \n", 1549 | " \n", 1550 | " \n", 1551 | " \n", 1552 | " \n", 1553 | " \n", 1554 | " \n", 1555 | " \n", 1556 | " \n", 1557 | " \n", 1558 | " \n", 1559 | " \n", 1560 | " \n", 1561 | " \n", 1562 | " \n", 1563 | " \n", 1564 | " \n", 1565 | " \n", 1566 | " \n", 1567 | " \n", 1568 | " \n", 1569 | " \n", 1570 | " \n", 1571 | " \n", 1572 | " \n", 1573 | " \n", 1574 | " \n", 1575 | " \n", 1576 | " \n", 1577 | " \n", 1578 | " \n", 1579 | " \n", 1580 | " \n", 1581 | " \n", 1582 | " \n", 1583 | " \n", 1584 | " \n", 1585 | " \n", 1586 | " \n", 1587 | " \n", 1588 | " \n", 1589 | " \n", 1590 | " \n", 1591 | " \n", 1592 | " \n", 1593 | " \n", 1594 | " \n", 1595 | " \n", 1596 | " \n", 1597 | " \n", 1598 | " \n", 1599 | " \n", 1600 | " \n", 1601 | " \n", 1602 | " \n", 1603 | " \n", 1604 | " \n", 1605 | " \n", 1606 | "
movieIdtitlerating
62858Godfather, The (1972)4.487500
27318Shawshank Redemption, The (1994)4.487138
811221Godfather: Part II, The (1974)4.385185
1050Usual Suspects, The (1995)4.370647
43527Schindler's List (1993)4.303279
711193One Flew Over the Cuckoo's Nest (1975)4.256944
55608Fargo (1996)4.256696
25296Pulp Fiction (1994)4.256173
1172858American Beauty (1999)4.236364
14758559Dark Knight, The (2008)4.235537
63912Casablanca (1942)4.235043
721196Star Wars: Episode V - The Empire Strikes Back...4.232906
1284226Memento (2000)4.227273
12111Taxi Driver (1976)4.224576
701136Monty Python and the Holy Grail (1975)4.224138
21260Star Wars: Episode IV - A New Hope (1977)4.221649
59750Dr. Strangelove or: How I Learned to Stop Worr...4.209524
731197Princess Bride, The (1987)4.208589
791213Goodfellas (1990)4.202290
741198Raiders of the Lost Ark (Indiana Jones and the...4.193182
\n", 1607 | "
" 1608 | ], 1609 | "text/plain": [ 1610 | " movieId title rating\n", 1611 | "62 858 Godfather, The (1972) 4.487500\n", 1612 | "27 318 Shawshank Redemption, The (1994) 4.487138\n", 1613 | "81 1221 Godfather: Part II, The (1974) 4.385185\n", 1614 | "10 50 Usual Suspects, The (1995) 4.370647\n", 1615 | "43 527 Schindler's List (1993) 4.303279\n", 1616 | "71 1193 One Flew Over the Cuckoo's Nest (1975) 4.256944\n", 1617 | "55 608 Fargo (1996) 4.256696\n", 1618 | "25 296 Pulp Fiction (1994) 4.256173\n", 1619 | "117 2858 American Beauty (1999) 4.236364\n", 1620 | "147 58559 Dark Knight, The (2008) 4.235537\n", 1621 | "63 912 Casablanca (1942) 4.235043\n", 1622 | "72 1196 Star Wars: Episode V - The Empire Strikes Back... 4.232906\n", 1623 | "128 4226 Memento (2000) 4.227273\n", 1624 | "12 111 Taxi Driver (1976) 4.224576\n", 1625 | "70 1136 Monty Python and the Holy Grail (1975) 4.224138\n", 1626 | "21 260 Star Wars: Episode IV - A New Hope (1977) 4.221649\n", 1627 | "59 750 Dr. Strangelove or: How I Learned to Stop Worr... 4.209524\n", 1628 | "73 1197 Princess Bride, The (1987) 4.208589\n", 1629 | "79 1213 Goodfellas (1990) 4.202290\n", 1630 | "74 1198 Raiders of the Lost Ark (Indiana Jones and the... 4.193182" 1631 | ] 1632 | }, 1633 | "execution_count": 34, 1634 | "metadata": {}, 1635 | "output_type": "execute_result" 1636 | } 1637 | ], 1638 | "source": [ 1639 | "# now lets created a filtered df from merged_df which only has these movies and then find top 20 movies\n", 1640 | "filtered_df = merged_df[merged_df['movieId'].apply(lambda x: x in list(well_rated_df['movieId']))]\n", 1641 | "titles_df = filtered_df[['title', 'rating', 'movieId']]\n", 1642 | "titles_df.groupby(['movieId', 'title'], as_index=False).mean().sort_values(by='rating', ascending=False).head(20)" 1643 | ] 1644 | }, 1645 | { 1646 | "cell_type": "code", 1647 | "execution_count": null, 1648 | "metadata": { 1649 | "collapsed": false 1650 | }, 1651 | "outputs": [], 1652 | "source": [ 1653 | "# Great, so far we have seen how to extract various stats from our datasets using NumPy, Pandas \n", 1654 | "# and visualize our data using Matplotlib, now lets do some predictive analytics..\n" 1655 | ] 1656 | }, 1657 | { 1658 | "cell_type": "code", 1659 | "execution_count": null, 1660 | "metadata": { 1661 | "collapsed": false 1662 | }, 1663 | "outputs": [], 1664 | "source": [ 1665 | "# now lets add a column called rating_year which depicts the year when the rating was given\n", 1666 | "import datetime\n", 1667 | "year_lambda = lambda x: int(datetime.datetime.fromtimestamp(x).strftime('%Y'))\n", 1668 | "merged_df['rating_year'] = merged_df['timestamp'].apply(year_lambda)\n", 1669 | "merged_df.head()" 1670 | ] 1671 | }, 1672 | { 1673 | "cell_type": "code", 1674 | "execution_count": null, 1675 | "metadata": { 1676 | "collapsed": false 1677 | }, 1678 | "outputs": [], 1679 | "source": [ 1680 | "# now lets create a new data frame which contains number of ratings given on each year\n", 1681 | "ratings_per_year = merged_df.groupby(['rating_year'])['rating_year'].count()\n", 1682 | "ratings_per_year.head()" 1683 | ] 1684 | }, 1685 | { 1686 | "cell_type": "code", 1687 | "execution_count": null, 1688 | "metadata": { 1689 | "collapsed": false 1690 | }, 1691 | "outputs": [], 1692 | "source": [ 1693 | "# now lets get some stats on number of ratings per year\n", 1694 | "\n", 1695 | "years = ratings_per_year.keys()\n", 1696 | "num_ratings = ratings_per_year.get_values()\n", 1697 | "print 'average ratings per year', np.mean(num_ratings)\n", 1698 | "print 'median ratings per year', np.median(num_ratings)\n", 1699 | "print '90% ratings per year', np.percentile(num_ratings, 90)" 1700 | ] 1701 | }, 1702 | { 1703 | "cell_type": "code", 1704 | "execution_count": null, 1705 | "metadata": { 1706 | "collapsed": false 1707 | }, 1708 | "outputs": [], 1709 | "source": [ 1710 | "# now lets scatter plot this data to visualize how ratings are spead across years\n", 1711 | "plt.scatter(years, num_ratings)\n", 1712 | "plt.title('# of rating across years')\n", 1713 | "plt.xlabel('Year')\n", 1714 | "plt.ylabel('# of ratings')\n", 1715 | "plt.show()" 1716 | ] 1717 | }, 1718 | { 1719 | "cell_type": "code", 1720 | "execution_count": null, 1721 | "metadata": { 1722 | "collapsed": false 1723 | }, 1724 | "outputs": [], 1725 | "source": [ 1726 | "# now lets try to build a linear regression model using which we will predict how many ratings we get each year\n", 1727 | "from scipy import stats\n", 1728 | "slope, intercept, r_value, p_value, std_err = stats.linregress(years, num_ratings)\n", 1729 | "print 'Generated linear model is y = ' + str(slope) + ' * x + ' + str(intercept)" 1730 | ] 1731 | }, 1732 | { 1733 | "cell_type": "code", 1734 | "execution_count": null, 1735 | "metadata": { 1736 | "collapsed": false 1737 | }, 1738 | "outputs": [], 1739 | "source": [ 1740 | "# now lets use the slope and intercept to create a predict function which will predict num_ratings given a year\n", 1741 | "def predict_num_ratings(year):\n", 1742 | " return slope * year + intercept\n", 1743 | "\n", 1744 | "predicted_ratings = predict_num_ratings(years)" 1745 | ] 1746 | }, 1747 | { 1748 | "cell_type": "code", 1749 | "execution_count": null, 1750 | "metadata": { 1751 | "collapsed": false 1752 | }, 1753 | "outputs": [], 1754 | "source": [ 1755 | "# now lets plot our predicted values along side the actual data to see how well we did\n", 1756 | "plt.scatter(years, num_ratings)\n", 1757 | "plt.plot(years, predicted_ratings, c='r')\n", 1758 | "plt.show()" 1759 | ] 1760 | }, 1761 | { 1762 | "cell_type": "code", 1763 | "execution_count": null, 1764 | "metadata": { 1765 | "collapsed": false 1766 | }, 1767 | "outputs": [], 1768 | "source": [ 1769 | "# now lets see how good our prediction is by calculating the r-squared value\n", 1770 | "r_square = r_value ** 2\n", 1771 | "print 'Linear Model r_square value', r_square" 1772 | ] 1773 | }, 1774 | { 1775 | "cell_type": "code", 1776 | "execution_count": null, 1777 | "metadata": { 1778 | "collapsed": true 1779 | }, 1780 | "outputs": [], 1781 | "source": [ 1782 | "# thats a poor model r_square ranges from 0 to 1, the close to 1 the better the model accuracy" 1783 | ] 1784 | }, 1785 | { 1786 | "cell_type": "code", 1787 | "execution_count": null, 1788 | "metadata": { 1789 | "collapsed": false, 1790 | "scrolled": true 1791 | }, 1792 | "outputs": [], 1793 | "source": [ 1794 | "# now lets try a polynomial function instead of a linear function and see if that fits better\n", 1795 | "polynomial = np.poly1d(np.polyfit(years, num_ratings, 3))\n", 1796 | "plt.scatter(years, num_ratings)\n", 1797 | "plt.plot(years, polynomial(years), c='r')\n", 1798 | "plt.show()" 1799 | ] 1800 | }, 1801 | { 1802 | "cell_type": "code", 1803 | "execution_count": null, 1804 | "metadata": { 1805 | "collapsed": false 1806 | }, 1807 | "outputs": [], 1808 | "source": [ 1809 | "# now lets calculate the r-square for this polynomial regression\n", 1810 | "\n", 1811 | "from sklearn.metrics import r2_score\n", 1812 | "r2 = r2_score(num_ratings, polynomial(years))\n", 1813 | "print 'Polynomial Model r_square value', r2" 1814 | ] 1815 | }, 1816 | { 1817 | "cell_type": "code", 1818 | "execution_count": null, 1819 | "metadata": { 1820 | "collapsed": false 1821 | }, 1822 | "outputs": [], 1823 | "source": [ 1824 | "# now we can predict how many ratings we expect in any year using our polynomial function\n", 1825 | "print polynomial(2017) \n", 1826 | "print polynomial(2018) " 1827 | ] 1828 | }, 1829 | { 1830 | "cell_type": "code", 1831 | "execution_count": null, 1832 | "metadata": { 1833 | "collapsed": true 1834 | }, 1835 | "outputs": [], 1836 | "source": [ 1837 | "# awesome, now lets implement another important ML technique 'Classification'\n" 1838 | ] 1839 | } 1840 | ], 1841 | "metadata": { 1842 | "kernelspec": { 1843 | "display_name": "Python 2", 1844 | "language": "python", 1845 | "name": "python2" 1846 | }, 1847 | "language_info": { 1848 | "codemirror_mode": { 1849 | "name": "ipython", 1850 | "version": 2 1851 | }, 1852 | "file_extension": ".py", 1853 | "mimetype": "text/x-python", 1854 | "name": "python", 1855 | "nbconvert_exporter": "python", 1856 | "pygments_lexer": "ipython2", 1857 | "version": "2.7.11" 1858 | } 1859 | }, 1860 | "nbformat": 4, 1861 | "nbformat_minor": 0 1862 | } 1863 | --------------------------------------------------------------------------------