{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction to Non-Personalized Recommenders" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The recommendation problem\n", "\n", "Recommenders have been around since at least 1992. Today we see different flavours of recommenders, deployed across different verticals: \n", "\n", "- Amazon\n", "- Netflix\n", "- Facebook\n", "- Last.fm.\n", "\n", "What exactly do they do?\n", "\n", "### Definitions from the literature\n", "\n", "*In a typical recommender system people provide recommendations as inputs, which\n", "the system then aggregates and directs to appropriate recipients.* -- Resnick\n", "and Varian, 1997\n", "\n", "*Collaborative filtering simply means that people collaborate to help one\n", "another perform filtering by recording their reactions to documents they read.*\n", "-- Goldberg et al, 1992\n", "\n", "*In its most common formulation, the recommendation problem is reduced to the\n", "problem of estimating ratings for the items that have not been seen by a\n", "user. Intuitively, this estimation is usually based on the ratings given by this\n", "user to other items and on some other information [...] Once we can estimate\n", "ratings for the yet unrated items, we can recommend to the user the item(s) with\n", "the highest estimated rating(s).* -- Adomavicius and Tuzhilin, 2005\n", "\n", "*Driven by computer algorithms, recommenders help consumers\n", "by selecting products they will probably like and might buy\n", "based on their browsing, searches, purchases, and preferences.* -- Konstan and Riedl, 2012" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Notation\n", "\n", "- $U$ is the set of users in our domain. Its size is $|U|$.\n", "- $I$ is the set of items in our domain. Its size is $|I|$.\n", "- $I(u)$ is the set of items that user $u$ has rated.\n", "- $-I(u)$ is the complement of $I(u)$ i.e., the set of items not yet seen by user $u$.\n", "- $U(i)$ is the set of users that have rated item $i$.\n", "- $-U(i)$ is the complement of $U(i)$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Goal of a recommendation system\n", "\n", "$ \\newcommand{\\argmax}{\\mathop{\\rm argmax}\\nolimits} \\forall{u \\in U},\\; i^* = \\argmax_{i \\in -I(u)} [S(u,i)] $\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Problem statement\n", "\n", "The recommendation problem in its most basic form is quite simple to define:\n", "\n", "```\n", "|-------------------+-----+-----+-----+-----+-----|\n", "| user_id, movie_id | m_1 | m_2 | m_3 | m_4 | m_5 |\n", "|-------------------+-----+-----+-----+-----+-----|\n", "| u_1 | ? | ? | 4 | ? | 1 |\n", "|-------------------+-----+-----+-----+-----+-----|\n", "| u_2 | 3 | ? | ? | 2 | 2 |\n", "|-------------------+-----+-----+-----+-----+-----|\n", "| u_3 | 3 | ? | ? | ? | ? |\n", "|-------------------+-----+-----+-----+-----+-----|\n", "| u_4 | ? | 1 | 2 | 1 | 1 |\n", "|-------------------+-----+-----+-----+-----+-----|\n", "| u_5 | ? | ? | ? | ? | ? |\n", "|-------------------+-----+-----+-----+-----+-----|\n", "| u_6 | 2 | ? | 2 | ? | ? |\n", "|-------------------+-----+-----+-----+-----+-----|\n", "| u_7 | ? | ? | ? | ? | ? |\n", "|-------------------+-----+-----+-----+-----+-----|\n", "| u_8 | 3 | 1 | 5 | ? | ? |\n", "|-------------------+-----+-----+-----+-----+-----|\n", "| u_9 | ? | ? | ? | ? | 2 |\n", "|-------------------+-----+-----+-----+-----+-----|\n", "```\n", "\n", "*Given a partially filled matrix of ratings ($|U|x|I|$), estimate the missing values.*\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Challenges\n", "\n", "#### Availability of item metadata\n", "\n", "Content-based techniques are limited by the amount of metadata that is available\n", "to describe an item. There are domains in which feature extraction methods are\n", "expensive or time consuming, e.g., processing multimedia data such as graphics,\n", "audio/video streams. In the context of grocery items for example, it's often the\n", "case that item information is only partial or completely missing. Examples\n", "include:\n", "\n", "- Ingredients\n", "- Nutrition facts\n", "- Brand\n", "- Description\n", "- County of origin\n", "\n", "#### New user problem\n", "\n", "A user has to have rated a sufficient number of items before a recommender\n", "system can have a good idea of what their preferences are. In a content-based\n", "system, the aggregation function needs ratings to aggregate.\n", "\n", "#### New item problem\n", "\n", "Collaborative filters rely on an item being rated by many users to compute\n", "aggregates of those ratings. Think of this as the exact counterpart of the new\n", "user problem for content-based systems.\n", "\n", "#### Data sparsity\n", "\n", "When looking at the more general versions of content-based and collaborative\n", "systems, the success of the recommender system depends on the availability of a\n", "critical mass of user/item iteractions. We get a first glance at the data\n", "sparsity problem by quantifying the ratio of existing ratings vs $|U|x|I|$. A\n", "highly sparse matrix of interactions makes it difficult to compute similarities\n", "between users and items. As an example, for a user whose tastes are unusual\n", "compared to the rest of the population, there will not be any other users who\n", "are particularly similar, leading to poor recommendations.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Flow chart: the big picture\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAvYAAAM2CAYAAACdfscgAACth0lEQVR42uy9d7AdxbW3ff+3XVBl\nrsu4bIOxjW1uvTbX5Cww0USBSSJIJBtjgsjBCJFzTkJCApFB5JxzDhJIJAMmmxyds+etp79vzdtn\nzo4n7n3O81StOmdP6JnpXt3zm57VPf9ViIiIiIhI1/NfZoGIiIiIiMJeREREREQU9iIiIiIiorAX\nERERERGFvYiIiIiIwl5ERERERBT2IiIiIiKisBcREREREYW9iIiIiIjCXkREREREFPYiIiIiIqKw\nFxERERERhb2IiIiIiMJeREREREQU9iIiIiIiorAXERERERGFvYiIiIiIwl5ERERERBT2IiIiIiKi\nsBcRERERke4R9v/1X/+laZqmaZqmaaPGFPaapmmapmmaprDvfGEvIiIiIjKiw2YU9iIiIiIiCnuF\nvYiIiIiIwl5hLyIiIiKisFfYi7TEIYccUneAzQ9/+MNi9913L5599lkzahD561//Wiy11FLFFlts\nUfz73/9ue/977rmneOeddwYkrcHwo7DBOqdOvOaRXndyn6vHlVde2dQnnnnmmWErPxGFvcJeZMSx\nyy67pHrwpS99qVhrrbV6WH4DfvLJJ82sQeLPf/5zsdhii/VJ2MyaNSuVzyOPPFKK3EUWWaRYaaWV\nin/9619D7kfDJeyH85pHW92p+lx/hX1//F9EFPYKe5GM3Xbbra74QDCddNJJaf24ceO86Q4S//jH\nP1IPb1+EzXXXXVcKpOAPf/hD8fvf/35Y/OjRRx8dljwczmsebXWnls81EvbNHmzIq776v4go7BX2\nIi2KE3j77bfT+vXXX79Hb+hrr71W7LrrrsWPf/zjZDvssEPx4osv9tp/7ty5xb777ltuN3HixF7b\nPf/8873Seu6558r1//znP4tJkyYVU6ZMKe699950Lmy37rrrFg8//HBaf8QRRxRf//rX0/LDDjus\n+NOf/tTvfVu91vwYTzzxRLHaaqslobLGGmsU5513Xi+xQhjDhhtumNJaZ511Ug8oPc5VYXPbbbcV\nO++8c3lctiU9jgfTp08vll122VQ+rD/jjDPSQ8Lhhx9eHH/88T3SaiePW7mGdv0opy/5tc0226Tz\n5npvuummYurUqcXee++dRCHp5dfcbvqt+vJQ150HHnggXfdXvvKVtB3+e+655xbHHntseZ0HHXRQ\n+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\nDc0UltX54InXrX7cKcJtcjGG4Mlh8GG+DSICYRPHil65euKcKTSr4jxCIPqzb9DsWusdo9Zy8pP4\n4DwtHngQUvl2iPlqvhG7HVNjhlhCwITYDWFT61z6msf1llehV7oVYR9vB9o5FqFJ+TVy3vxddNFF\ny1CofL9202/Vl4e67kQPfdhmm23WS9gjiglry7fDp3/+85/36Tp58GJAar4NeZb39Fd9Lh+UXkvY\ntzKPfV98NogQtzwkKQakV99miCjsFfYiUgduoh988EGa4aJRLDLziNPDzHb1vlLJNqRFfG8nvjZv\n9VpbhfjlmB2kWb6RJ/XyLchnnWmUXifncRVCMnhgQLhVrxVhWZ1FqJPKd6DrDtfcaOpRZp0hvXwW\noP4cF7HONp999lm/fK6/dJvPiijsFfYiIlJH2EevMLHmCDsEXry1qA6qHem0Ot5BRERhLyIiHUe9\nEB967OuFgIxU4k0Fg0Gdk11EFPYKexGRroPZVyZNmpR66plznRlPiC0fbRCOxZiVm266qWloloiI\nwl5ERERERGGvsBcRERERUdgr7EVEREREFPYKexERERERhb2IiIiIiMK+24W9pmmapmmapo0GU9hr\nmqZpmqZpmsLeUBwR/VdE3xX9V8RQHCuniP4r+q6I/iuisLdyihVURN8V0X9F31XYj1r+8pe/FO+/\n/37xzjvvFH/605/MEG8uIvquiP4r+q7Cvpt4+eWXi1133bXXQIt99923+OCDD8rt/vrXvxZLLbVU\nscUWWxT//ve/e/0eLO655570sCH6b195+OGHU7595StfKd59992a2+y///41Bxx96UtfKjbbbLPi\nyiuv7OHnN998c1o/c+ZMM7iLffeQQw6pO9jshz/8YbH77rsXzz77bEfmaaNzDxus9nmo2n/9d+Cp\n19ZRnnvuuWfx9NNPD/k9e7T5k8LeyjloXHPNNWWeIHoOOOCAYq+99uohahD+8Oc//7lYbLHFegj7\nRRZZpFhppZWKf/3rX4NyfrNmzUrn8cgjj1hY+m+f+M9//lPssssuZd5Nmzat5nb5NvWMh13SA4Q+\ny8466ywzuYt9N8qdtm6ttdbqYXnZP/nkkx177sMl7Ae7/dd/h89v+tqu9fWeXdUXorBXGPWBOXPm\nlDc0nrBDsMDf/va34sgjj0zrabj/+c9/poacHqy84v3hD38ofv/73w/aOV533XXpHJ555hkLTP/t\n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\nC/sPP/xQ6wBT2Ivov5aDeaawF9F/FfYKe9tese0Vy0Fhr1OIKOwV1Qp7EdtesRwU9jqFWEG7Xth/\n8MEHWgeYwl5E/7UczDOFvYj+q7BX2Nv2im2vWA4Ke51CZLQL+/fff1/rAFPYi+i/loN5prAX0X8V\n9gp7216x7RXLQWGvU4go7BXVCnsR216xHBT2OoVYQbte2L/33ntaB5jCXkT/tRzMM4W9iP6rsFfY\n2/aKba9YDgp7nUJktAv7d999V+sAU9iL6L+Wg3mmsBfRfxX2CnvbXrHtFctBYa9TiCjsFdUKexHb\nXrEcFPY6hVhBu17Yv/POO3Xt1VdfLRZbbLHyesO23HLL4rnnnmu4b1/tvvvuKxZddNHirbfeGvC0\nH3zwwWKZZZYp3n777abbXnDBBcWLL77Y8rm2k3YtU9iL6L+Wg3mmsBfRfwdV2C+00ELFnXfeWcye\nPbt46qmnivvvv79Yf/31i7Fjx/ZZxDay3/zmN0nQDsZDw2OPPZYeVJqd9xtvvFF88YtfTOfS6rmS\nL62krbAX0X8tB/NMYS+i/w6KsP/d735X1377298WiyyySPHyyy/3WD5jxozUO/3mm2+m3wh/eq7J\nky222KJ49tlny21vvPHGYqmllkrrxo0bV66rt88TTzxR7LHHHqkXfK+99iouvvjiMq3bbrstpcFx\nGx0zt0svvbRYYIEFkm211VbFGmuskdJudA677LJLWsZDDW8m6L1nf5Ytvvjixa233trrXOmx/8EP\nfpD+R9wfccQRpZ8cffTR5THrmcJeRP+1HMwzhb2I/juowh5xe+2116YeaUJPLrvssrRs++23T9vM\nmTMn5cXxxx9fPPnkk8W2226bRD+93gjfWPfII48Uyy23XBLmjfbhGCGQTz/99LRPiOIdd9yx2Hff\nfRvun5//vffem7Y799xzi7vuuiuJ+BD2jdJA8C+44ILFrFmz0sME211yySVpu9122618qMnPNRf2\nV155Zdr/oYceKm644Ya0PyJdYS+i/1oO5pnCXsRGbdCEPb3L9eyVV15JYrUaY7///vunXny2mTJl\nShL69HY///zz6QGAbRC1CPOll146iWC2RejTA99onwceeCAdk30I/2E5gvqll15KveaI6Ub75+fP\n8UPI8xuhHOfTKI3XXnstval44YUX0jnzYMP+XPNFF11UppGfa/4/aXOuPAQRrkMI0+uvv94wrxX2\nIvqv5WCeKexF9N9BFfYI3GeeeSb9vvnmm9N1n3zyyeU255xzTi/hHz3UZ555ZrHzzjv3SrfRPrlA\nRpATz8/2iGt63BHIjfavCvvDDz+8/B296qTdKI24bkQ/xzv44IN7bMPDQiNhzz677757uf16662X\nHk4U9iL6b7fD/SDCEkVhb+UUK2gXCnsEblWU33HHHaV4JlyGEBYMUXvdddelffJQGralB57e/pNO\nOqnuPrlAZh9i5H/0ox8VP/3pT4tTTjml6TGrwn6jjTYqf99zzz1l2o3SiOumx57ed8JqCOVhG9Jo\n1mNPDz09/YQyIc5ZPmnSJIW9iP7b9cycOTOVAW2rKOytnGIF7TBhj+iuZ4SeIHDnzZtXLkMEr7DC\nCsWSSy6ZQlYQ+OQFITbMooP45vfTTz9d3H333en/q6++OqVF7/3qq69exq3X2ifEN8fheITJfPOb\n30yz1NDrzbJGx8zPP94wXH/99Wnqyo033jgdn7QbpUH4DMe8/PLL0/IYQEw+/OQnP0nr+J2fK6E8\n8f8xxxyTtpk7d27ajvyi179RXrcr7DmOba/Y9spQM2bMmFQGp556qpmhsLdyihW024U9Ru801z91\n6tT0m7+RJwjwK664otw2X4fYffjhhxvug0CmRzyEPbb33nunWWsiPKfZMXPj5pOH0YSwb5QGx2GQ\nb1wj5x3bMXiXbZk6Mz/X/H8eRgi/iX1WXXXVXnnYV2HPW4W4sdr2im2vDCWMcYoy6Gvngr6rsBfx\n5jKIwh4ROxBG+AphLDT29da1s09/j5kbDyj02LebBvvF/0x7Sc9+O+dHzz/WyraNhP3nn3+eXn8v\nvPDCPR5SbHvFtleGCtoh4urJ/wkTJpghCnsrp1hBR7Kw1/pntYT9eeedVxx66KHF/PPPX/ocM/ko\n7MW2V4YSOj5C1NMeIfJFYW/lFCuowl5rQdgzsJeQobx3ngHE559/fr/9z7ZXbHulVZgBh975yHdE\nPctEYW/lFCtohwr7mBVGG16jLAi1+T//5//0EPQbbrhh+tBWLf/TNE0bKmNsj3H1CnuFvVhBR7iw\nJ3adaR0V5/0X9l/+8pd73Ejnm2++Yo899kjTbCrsNU0baqOzgR57Bs2Kwl5hL1bQLhD2iMa+2j77\n7JPy4fvf/34S9/1JayAt5ppnsGtf05g+fXqarrLWOgbcLrvsssXmm2/er2PkFuVBXD299F/4whd6\n3GDHjx9f9twbiiO2vSL6rsJeRP8dMGHPjDFMA8kUkcz80imiHuMLszxs9FV0c21MackUlbXW33rr\nraUPMPXnQAr7GDhLvu600069ZsJZZZVVFPZi2yui7yrsRfTfgRP2fKAq5n+/5ZZbimuvvbb47ne/\nm5Ztttlm6curIbLXWGONYuutty4WWGCBHkKYdauttlrxq1/9Ku238sorp2X19qt3DOzCCy9M22Fb\nbrll+pAUwp50ttpqq1Lkk07+mzTjWpgrnw9U8SGtmHefgWLVa99+++2Lo446Kr2xYI79wRD2+XSX\nTHUZc9c73aXY9uq/ou8q7EX035rCnq/H9sX4UBKi/tJLLy1uuOGGlB98cZUPNW2wwQbFt771rfLr\nrKxDTB977LFpzvhII9YRZsIHn3bYYYe6+8VXZGsdI74iO2XKlNSbjvhH2BMedOedd5ahQhwz//3Q\nQw/1SJPwGsQ9DyoLLrhgcckll6T08+tG6LMPDwx8QZft6Nnvaz6GtfKBKuJc8xkqbHvFtldEYW/l\nFNF/+y3sX3rppSSsiUM/5ZRTyh5y1vExJwaCIv4R6PxPT3g1jVhHGvl+CNjqfo2OUV3HsqWWWiqJ\n97vvvruHsM9/s19sxzq+ikvveH5t1XOeMWNG+UDBF2Z5iCAufiiEfcBg275+IMa2V2x7RRT2Vk6R\nESrsEcN9sRdeeCEJ3Dlz5hSnnnpqceCBB/ZYh+BFYCOkCWlhWTWNENkMRs33u/LKK3vt1+gYJ598\ncnHIIYfUTLd6jPw3aRLH3uja8uU8AKy99tq9QmLWW2+9JPT7mpdYO8Letldse0X0XYW9iP47KMIe\nYU0IS74OUR7Cnl7xENZVYc92TJmZ70e4THW/RsdgHaE5se72228vxTthOjwAhPDO17Ef4TcIdtYR\nDkTcPG8JuDbCbvLz5U0C5X711Ven0B3i9S+//PK0jHNW2IvY9ooo7EWsoF0t7K+//vqUH7NmzUrL\nJ0+eXMaeV3vMq8Ke/U477bQ0sw77Idb5v7pfo2PEOgQ3v8eOHZtCc9g3xDgCfPbs2UnIxzpEfp4m\nvfesIwSH87j44otTWE6c76RJk8p981785ZZbrthzzz0V9iK2vSIKexEr6PAJe4RpX4z4coQ9Ypnf\nhLVEvhD7jthm+V133ZV63ukxr6aBeGdbziP2Y0Bqvf3qHQM78cQTe4THIMDZFxG+1157lctXXHHF\nch37nXXWWeU6xDwPAuzD2wGWERYU18uDxtSpU3tdxznnnFN89atf7XNeYgp7Ef1X9F2FvYj+OyzC\nvp7Yp8e81e0R78sss0wS2YS/9PcYjdYxGw9Wax299bWOT3oDmT8KexH9V/Rdhb2IN5dBE/b0Tg+X\nMTXld77znRR6M5zn0QmmsBfRf0XfVdiL6L9dK+zpQUe8jnZRr7AX0X9F31XYi+i//Rb2hMFow28K\nexH9V/Rdhb2I/quwV9jb9optr4jC3soporBXVCvsRWx7RRT2Vk6xgna9sGeedm34TWEvov+Kvquw\nF9F/FfYKe9tese0VUdhbOUVGu7Bnqklt+E1hL6L/ir6rsBfRfxX2CnvbXrHtFVHYWzlFFPaKaoW9\niG2viMLeyilW0K4X9i+++KLWAaawF9F/Rd9V2Ivovwp7hb1tr9j2iijsrZwio13Yv/DCC1oHmMJe\nRP8VfVdhL6L/KuwV9ra9YtsrorC3cooo7BXVCnsR214Rhb2VU6ygXS/sn3/+ea0DTGEvov+Kvquw\nF9F/FfYKe9tese0VUdhbOUVGu7B/7rnntA4whb2I/iv6rsJeRP9V2CvsbXvFtldEYW/lFFHYK6oV\n9iK2vSIKeyunWEG7Xtg/++yzWgeYwl5E/xV9V2Evov8q7BX2tr1i2yuisLdyiox2YT9v3jytA0xh\nL6L/ir6rsBfRfxX2CnvbXrHtFVHYWzlFRruwnzt3rtYBprAX0X9F31XYi+i/CnuFvW2v2PaKKOyt\nnCKjXdhrnWUKexH9V/Rdhb2I/jsqhX2UhcLetldse0UU9lZOEf33/2fy5Mm9hGWnW5RFt513q6bv\niui/ou8q7EX0X4W9wt62V2x7RRT2Vk6R0ei/06ZN6zqLsujGc29mCnsR/Vf0XYW9iP5rWYj5Jfqv\niMLeyimi/1oW5peI/iuisLdyihVULAvzS0T/FVHYi3hzEcvC/BLRf0XfVdiL6L+WhZhfov+KKOyt\nnCL6r2VhfonovyIKeyunWEHFsjC/RPRfEYW9iDcXsSzMLxH9V/Rdhb2I/mtZiPkl+q+Iwt7KKaL/\nWhbml4j+K6Kwt3KKFVQsC/NLRP8VUdiLWEHFsjC/RPRf0XcV9iL6r2VhRphfov+KKOytnCL6r2Vh\nfonovyIKeyunWEHFsjC/RPRfEYW9lVOsoGJZmF8i+q/ouwp7Ef3XsrAszC/Rf0UU9lZOEf3XsjC/\nRPRfEYW9lVOsoGaEZWF+iei/Igp7K6dYQcWyML9E9F/RdxX2IvqvWBbml+i/Igp7K6eI/mtZmF8i\n+q+Iwt7KKVZQ/deyML9E9F8Rhb2VU6ygYlmYXyL6r+i7CnsR/VcsC/NL9F8Rhb2VU0T/tSzML/NL\n9F8Rhb2VU0T/tSzMLxH9V0Rhb+UUK6hYFuaXiP4r+q7CXkT/FcvC/BL914wQfVdhL6L/WhZifon+\nK6Kwt3KK6L+Whfklov+KKOytnGIFFcvC/BLRf0XfVdiLeHMRy8L8Ev1X/xV9V2Evov9aFmJ+if4r\norC3corov5aF+SWi/4oo7K2cYgUVy8L8EtF/Rd9V2It4cxHLwvwS0X9F31XYi+i/loWYX6L/iijs\nrZwi+q9lYX6J6L8iCnsrp1hBxbIwv0T0XxGFvYg3F7EszC8R/Vf0XYW9iP5rWYj5JfqviMLeyimi\n/1oW5peI/iuisLdyihVULAvzS0T/FVHYi3hzEcvC/BLRf0XfVdiL6L+WhZhfov+KKOytnCL6r2Vh\nfonovyIKeyunWEHFsjC/RPRfEYW9iDcXsSzMLxH9V/Rdhb2I/mtZiPkl+q+Iwt7KKaL/Whbml4j+\nK6Kwt3KKFVQGm5kzZ5Z538wmTJhghum7ov+KKOytnCL6b6cy//zztyTs33jjDTNL3xX9V0Rhb+UU\n0X87lUMPPTTl/SqrrNJr3UILLWRvvb4r+q+Iwt7KKaL/dgOff/55mf+vv/56ufzee++1t17fFf1X\nRGFv5RTRf7sJeuTJ//Hjx5fL6MFn2ZgxY8wgfVf0XxGFvZVTRP/tBuiRjzL47LPPUs99/L7vvvvM\nIH1X9F8Rhb2VU0T/7RbomacMJk+enHru+X/hhRc2Y/Rd0X9FFPZWThH9t5ugZ54ymG+++cryYDpM\n0XdF/xVR2Fs5RfTfLoMe+igLpsEUfVf0XxGFvZVTRP/tQvIPVjENpnS/7y6xxBLaCDfbXrHtVdiL\nKI6kJvHBKqbBFIW9prAXUdh7cxEZdf6rwBh5omckCXtmO9JGlinsRd2gsBdR2CvsFfajUNh/+umn\n2ggzhb2oGxT2Igp7e0btzVTYawp7tYOoGxT2IvqvAmr0iB6FvdYNPs63J8JuuukmtYOoGxT2Ivqv\nAmpkip5p06aV1q7oGUnC/pNPPtFGmEXZ4te5qR1E3aCwF9F/FVCKHoW9prAXUdgrjET0XwWUwr6T\n/fLjjz/WRpgp7EXdoLAXUdgroBQ9CntNH1c7iLpBYS+i/yqgFPYKe01hL6KwVxiJKOw1hf2w+OVH\nH32kjTBT2Iu6QWEvorBXQCl6FPYDam+//XbxP//zP2VehG211VbFSy+9NGDHefzxx4tll122+OCD\nD4bEhx5++OHie9/7XvH+++8r7EUU9gojEYW9prDvDL/88MMPB83eeuutYqGFFiruvffeYt68ecXc\nuXOTKN5www2LTTbZJAnjgTgOaS622GIDll4ze/XVV4vbbrttSI7VF1PYi7pBYS+isO9iAaUNrehR\n2Lcu7L/97W8Xr7/+eo/lF1xwQephf++994qnnnqqGD9+fCnKn3zyyfI36zbddNPi0EMPTXm50kor\nFffdd1+v4zz22GM9hD0PEvSos8+4cePS24HY9pJLLin++7//O6373//93+Kuu+5KyznWOuusU0yY\nMCGtv/766+se++mnny722muvls5x1qxZKb0vfvGLxSmnnFJsscUWvfJDYS+isLdyihVUYa8p7Dte\n2NNjT/4+8sgjqWf9yiuvTMt22mmnmr3t+W9CbMjD7bbbLu2/7bbbFmuttVavnvlc2D/33HNpn5NP\nPjm9IUCo8xDx7rvvJsHNOsQ26yZOnFg+YMSx2B4BzsNBvWO3eo4PPfRQWnfuuecWDzzwQHrYQOS/\n/PLLCnsRhb3CXqygCntNYT+wfklc+mDZm2++mQRwNcb+oIMOSr3WbPPoo4+mbRDX1d8I9gUWWCD1\nuLMuBHxsG5bvg4jmweE3v/lN8corrySxzTGfeOKJ1NNOWbMPx7/ssstKYV/rWPWO3eo5Tpkypdh4\n443L8+TBIt92sExhL+oGhb2Iwr6LBZQ2tKJHYd+6sCcU5/nnn0+/77jjjpQnp59+ek1RXv3N/+z/\nzjvv1Ny2VhrTp0/v9SCB3X777SmdyZMn91i+5pprlsfigYBzjjTrHbvVc9x///2Lo446qjzP6kOA\nwl5EYa+wFyuowl5T2A+YXxIyMlj2xhtvJNFL73kso0edfLnnnnvS7wcffLBYdNFFkzDmNyErCGNC\nZ+htjzAa1vE71uXHyZefddZZxfLLL5/Sw373u9+l8uUcpk2bVnzta18r7r///rScY0X6tY5V79jV\n/+ttx7lsvfXW5XlyrQj7PD8GwxT2om5Q2Iso7LtYQGlDK3oU9n0X9gjeFVdcsVh66aWTuCZEhny6\n7rrrihdffDGJcnrRqwK6VWEfsfGXX355mm6TtwP8JvYeoc35cF6c0+qrr5566QnLaXas/DcCvZbI\nr25H7z3Hvvjii9Og4MUXX1xhL6KwVxiJFVRhrynsR4awx0LwzpgxI4WsHHDAAWV+rbLKKj2EfaNe\n9FzY58tJN9JjNpprrrkmLUdcI+RjHcdl/ezZs1vqsa/Vu99svxtuuKE8D2boIT944FDYiyjsFfZi\nBR1Fwh5RVGvgIeLghRde6DjBfNFFF6XZPhT23SXsEdadYMwNjw1UesTKE8uOwK6uw08R14N9TTxQ\nHHnkkeU58Js6TYjQYB5XYS/qBoW9iMK+wwQU4QH0Lt59991pNo85c+akmOANNtggzbQx2OKgHWNa\nQ3okEUydck6DKXoU9lorxpSa8RaCaTDztxQKexGFvcJerKCjTNjz2r7ai3n++ecXyyyzTIpP5jfC\nn8GH5NOWW26ZevNjW+KMielFdO+zzz7Fz3/+8/RAQFwzQiMeDpiLO/9dL016HpnlI8rl2GOPTfvs\nuuuu6TcPIsRJx/E5ztprr50+OMR5cJxG53vzzTen2GvWMegw1t1yyy099uErpgr7gfFLylQbPCO2\nn7dZM2fOTLPiDMUxFfaiblDYiyjsO0xAvfbaa0koM6iQnnoMoc6yHXbYIW3zzDPPpPw58cQTU5ww\nAhrRTw86M3+wjq988kEd9iN2OWYDISSA/0kn/90ozauvvjrNKkIc8Y033pi2Q3Tz9U6W8/Ehtotr\n4LhsQxonnXRSOad4rbSJf451CCAGUW611VZlGrF87Nix6YEnP85Qix6FvdbJprAXdYPCXkRh34HC\nvlaM/YEHHph68dlm6tSpSbAzTzgDFJmtg20YnHjmmWcmIU+POtsyj3f09PNFzFzY578bpck6et6v\nuOKK9PEfQoQQ2DFfecQ058Ke7el5b+V84/zY9qmnniouvfTSXtfx29/+NqV56623KuwV9n0y6k9f\nHwwV9iIKe4WRiMK+T8Iesfzss8+m37fddlvKi1NPPbXchnm5a32MB9GLID7kkEPKbXPx3kjYN0oT\nMTRx4sRy2frrr5963uNcQ8Dnx0TIs77Z+Z599tnFLrvs0isfWJ5fB2kRlqOwHxi/jPneWzUexngA\nY/Bpu/vWM77ISpniX/zmLRMhXYNxLD4aRbng73G8TjXe0HGuvBGLZTzYMm0mH9qqt5/CXtQNCnsR\nhX2HCSh6FRdZZJHUux3L6PEmP+688870+4wzzkghKwiU6Dlnej32Yd0aa6xR7ktoDmIGkcT/uZBC\nWMW6RmkygJeQGcQ18fDsg+iOc6UXvpEIbHa+rOPhgm15G8B0hKecckoKycnzhYcFQoD6IpYU9v3z\ny9yPBkrA4jeUAf8zGxRjQljGsXKf6K+RNr7D7DT4USeL+vi41vbbb18suOCCqY7we9NNN011jWtR\n2Iso7EUU9l0s7BFTK6ywQrHUUkslUUxPHvlDyAo3enrz+c3g0oixJ0af2WoYjIrQJ42YRxyBw+A+\nxFOsa5Qmg2URRuzD+XEuCHvCclg+a9asdF65sM9FYKO0ebiI8yXtX/7yl+mcEPD5cqYPROhwTQr7\n/vslYrGW0WtOyBPXQA8xb0hYTpn+4Ac/SA9m/KYsY4D2CSecUGy22WYpJIt1jMOIQc9bbLFFelhj\nOf631lprpQHb7HvttdcWe+yxR0qTtzYxEJuHR/5OmjSpPA8eaiONddZZJ+3Hug033DD5109+8pNy\njnp8Ma6Hnm7qTcwpTzqtnh9jQyId1m2zzTbl9bMufuPnRxxxRFn2Rx99dLkdx8uPxZu4ZsfCqFvk\nN+NRSI9teEtWr9wwhb2oGxT2Igr7YRJQ9QwhgrBHROfLIy6dsJZq6AyChQGssW019AWhHAJkv/32\nK5evvPLK5bpGaRIeQfhNrFt11VWTQCE9etVZdv311/c41xgcW+ucGp0vgg7Rw3K+GBrLETaEJbWb\nnwMpeka6sEeEcu6XXHJJekOz2267pXJEKOfCPr7yOmXKlHK2I8oHnw0/Pf7445NYZdBz9DTHOsQs\nDwM8NESaHJsHNx4S42EPUcsA7x133LFYbrnl0naRBjM93XPPPUn0x2DxCy+8MP3Pw21+XTwohM9x\nzFbPLx5UMM4pf7DJf5Mu504IWnyYCt/iTVcci/wkXfKz2bHCIp8x0h0KH1c7iLpBYS+i/w6gsG/H\nCI0hvh2BXV1HLzcPCYiXXJBEbyDWbpr19uNY/T3fWFcrbXrp+5tXCvuefkkZVI1pSulF53/ynOka\nmYYUYY/Axo/4n3EcG220Ubkfohxhz8Pe6aef3uNBEsHKOvIaMRvbsS5Pk/JHYOMDbIcQj+1idid8\nr5pGfi4ck7dJHCu/rjztds4vt/xcq795wGG/yy67LIUSMQCcaWtZznmTHm/g4m0aDwCNjhVGGXAM\ntiPNetuFKexF3aCwF1HYD4OAGkqjV5MeVXoJh/tchtMU9s39EjF68MEH93rbUxX2fBvh8MMPL/fL\nRSpCmxCaWIcYx//Ia9IIgV4VxyxDfJMGy/mf86mmX02jejw+5FYV9nna7Zxfq8Ke89x9993LPFtv\nvfVSD/0555xTc9B4s2OF7bzzzum62Y5Qo8gPhb2Iwl5EYT9KhT29lPSojmZRr7BvzS/pYSakhJh1\nRCQPhbV67On1HjduXLkfISN5j32+LsZhhJiN9OoJe/y1ul1V2OfrOF4u1AkZayTs2zm/3LjG/AGZ\nvIlzpzedtx28ISMdlnNOHIsQIvbByFPGjNS6jqoRWhRhRfGtB0J2FPYiCnsRK+goFvaawr6WX8YM\nRbmddtppSQATAsLAZnqJv/nNb6bfCEwEKwIVUco18jVkwmR+9KMfJeHNPsSzs46PmrEfPfs8LDBO\nI0+D44U45jchLByLqR6J28+343iRfjUNzpm3DHEN9JYzODa/Ls6D62r3/HIjfIb9rrrqqpQOgn31\n1VdP2x5zzDHp3OfOnZvSJByIc7rjjjvSPhdffHEKKWOmJ34zWLfRsXhQiC88xzIeEkLo1yo7TGEv\n6gaFvYjCfhgEVLcY8cfEJ3fzNQyk6OlU3+WrwQPhl4h0BGpcw7777pti3fnyL4KSHuYQogjjGAjN\nbC8I5/gAFOEu+aBnZjiKryLnaeS/6bmmJ519GDSdbxfCnt78ahpMl5oLe0JxGgn7ds4vN86P/Ij9\nVlpppVLYEz/PA0U+uDyOFVPVRl7xkbdGx+I4P/3pT1N6ed1j+cYbb5z2qVcnFfaiblDYiyjsFfY1\nLWbPoVeREAKFfef6LscbM2ZMMXPmzJb9EqFYz2Ja03rrEaeHHXZYKcj5HX4S2yCm6QVvdJxaxn7t\n7tMX6+v58WYBa2cd4T6E30R+DZYp7EXdoLAXUdgPsrAfCpEy0EasMD23TONHr303XsNgiJ5OFvZh\nCy+8cPpOwOeffz5ofhkx3/Ra850E/meg6Ejwk9Hu42oHUTco7EX03wEUUPTqEfcbecCHmaInlIF3\nSy65ZFq+5ZZbppheljOH/He/+920fPPNN08xuiwnLnjNNddMH9Ih5IBBiMwFn28baYQh5OMYhA6w\nfTvpRzqsQ/TFubMufje6xnrn1+hYCvv/9w2A+H/++ecvJk6cmPJ6MB44iRMnxn7GjBltl4WmsBdR\n2CvsxQo6KoQ9YQ0M5iOumDnF4+M08dXY4447LgkpBu8h7mNu7FjOlzgj3jnWIYZZn2/7+OOPp+XE\n7FbDLohRRtQzkBFh0Gr6xEBHGjEAMgR7/rveNUZPcK3za3Qshf3/OyZie5VVVunRiz9hwoT0QaXc\nL2OmFm3kmMJe1A0KexGF/SAL+3ZvzgwcpEear38yKC+m0SO8IgbOsR1CnynxWM4gvugJR/CyP0IZ\nMcf/9HpH2oTYMNiSwX3MSkI+I7Dzc8inB2wn/dyYHhAhH+eb/653jY3Or9GxWhU9teYUH0mWQ37z\n5dZ8PXH4CnuFvdpB1A0KexH9d4iEPQJ3t912K/Ng3XXXTbOSMN3dL37xi17bs/zXv/51+ZtQGkJZ\nEN6IO4Qyy1h39tln1xSEbJunyfYIe0R0O+m3KuzrXWOj82t0LIV97/rCg9jkyZOL+eabr8c24Zes\nHyyL+e950zLcabWz//Tp05PPD2beDKYp7EXdoLAXUdgPsrBv9+ZMCMojjzySZtcgpv773/9+cdBB\nB6U5sJdddtkkjNmOXm6m3+OjNUw3GPvHfODExVdFTaSBsMbomWfaQnrI83MgjW9961tpOfu0mn5u\nfOSIBwCOw28+ksW1sG2za6x1fv0VeKMlFIfY92pPPfH2hOPkvbqDKTAJ2Yqy7m9a+FF/0mp1f2bJ\nIfyMN0UKe7WDqBsU9iL674AI+6OOOioJ5zlz5iThu/zyyyfRizAmT5iphuU///nP0weEENj58kMP\nPTTFrzNlIWI4FzW33npr2vbCCy9MQuakk05KvxkMW0/YE2/favq5xUeMiKdHbCLYOV+2rXeNjc6v\n0bEU9v/fMaux9cyQQ3nlM+Q080sGwxLyxP58eIryD7E+duzYVE6so8wor9iPMmM/jLEfUdbV9BlT\nEYOzeWDENxodt1rutfbn3LbaaqtyG3wvflf3r3ecnXfeOS2LUDDmto9B3Jtttll5nrnxkE3+Rn4f\nccQRDc8zlufp8oAe+bvGGmukAeacH9fQyjko7EUU9iIK+w4W9vQYEpqSx0XHDX3KlCnlcgQIYoDl\n8VXK+OAON/N6YQh5GvRQXnbZZb3OIRf27aafi56999673G/FFVcsxV6r15ifnz32zY8Ztvjii9ed\n0z7ygfKpGkKS/Rm7wRuVXXbZpVhqqaXSm5MY74DwpBc8xDtvVuILq5QdYh8xGuvy9OPrrXyplcHQ\nPOwhehsdl0HXCHPSqrd/vA2K4+W/8/0bHYd1PLAy7oMPdcVx2I6HBLbjYTO/HnyTfQgTiw928Qaq\n3nlGHsZyPqZFPSPdWMex+OIsabZyDrkp7EXdoLAXUdgPsrCvdxNuZgwqxarLEd0I7upyPrZDL3or\naUcaiORWz6ed9Fu5jlausZ3za2ajQdhvtNFG5ew3ffFLBC1vZqJsmGEHMYkoRnh++ctfTg9grI+e\ncNYRQhUPbaxD3MZ+efpsly/neDyANDpuLszr7Z9vw/L8d/5/o+MwdgORTYw9X6aNN0r4IWmQv+Rt\nfj1sR55cdNFFaaA540QQ3vXOs5pP1Cf2J7+q+dvqOSjsRRT2Igr7LhD22sDaSBb2ET/fjl8iLquG\nuD3ggAN69P4jRKPnHOHLNmwbgpl1J598cnHIIYeU6eTr8vSZYWmnnXZq+7iRVr39q8fLf+f/NzoO\nsz1xfQhpRHWtwckI8Op5/+pXvyrX//SnP00ivt55svzAAw8sf3NM3m6QLueJkGcZ61o9h9wU9qJu\nUNiLKOwHWdjXuwlrQ2sjWdgPlF+eccYZKbSEcBpE6+23394jJCb+ryXsCSuJdNivlrBnuxgczW96\nuPfZZ5+0vNFx8+PU2p9yRCDTW149fr5/o+sLYU/veByH9DC2pacf0Z9fD1POEnbDvsTOcxyEe73z\n5PsLhOTkwh4xH8I+z99Wz0FhL6KwF1HYK+wV9gr7XoaYRNwiOBGQq666ahKehK006hWPAdzEmTN+\ngkG20ROep4+QZrtZs2alY9CrzXYMkm7luPX2j/h0Pqg2e/bscqB2rQeDeschlIb/L7744jS9KukR\nPkNYGDNP8ZuBrvn18MVk9mFwN2ny0TiEfb3zRMDny5mOlAcN8qyavzEeoNk5KOxFFPYiCvsRKuyj\nZ08hr7Bv5pcxpWhuxG8jVOMa9tprrzSAmUHaDJiNwZtsW/194okn9gpxiXW58RGyfAA4x2znuLX2\nRwyzT3WgNvvk+zc6DmnQmx4zQOXHYRsG1VavhXh4wm/yWYkQ+fXOMz40F8uJqeehqFZ+VtOodw65\nKexF3aCwF1HYD4OAateYxYP8uPnmm8tl9DD+8Ic/TNMPxrLNN9889QYOxDGrVkt4tGvTpk1LYqjW\nOnoll1lmmWLTTTft1zEGU/SMdGGfC1bKo908pueb3udm29FbXcsPWj1uvf2pE1iz/Rsdh2uoHgfR\n3yi9esetd56t5lM756CwF3WDwl5EYd8lwp6b+rbbblt89atfTaEG/N54441TWAGz1YRY4DfrB0PY\n0+NIqEBfRTfnSa9jPWHPQ0uUO1P9Kew73y+1zjKFvagbFPYiCvtBFlCI8IEwevgQ1sxnfdhhh6XX\n+MzAEesZEEiPN7G6xA7/8pe/THm40korleEKCObVV1+9GDduXNqf2OSrrrqq+M53vpO2/dnPfpYG\nBEaaTAfIdhhhCquttloK9SEd5jHn/5jjPP9NKAPXTpq8RXjyySfTB7X4/Y1vfCOFK1Svj5ldDj/8\n8BQeseeeew5YvoUp7AfHL7XOMYW9qBsU9iIK+y4SUPFl1ogDztchihnMR8gM6+nhR/hvv/32Zc9+\nrEPYH3300eUgQb4Eizhff/31y23jWMT50puO+A9hf9ttt6WHjBDy+e/44mykycMG4p4vfPLGgTm/\nST8/dwYyxhzdDBpkuwg/UNgr7DWFvYjC3sopVtCOEFAxXd1AGB/PQUDTg840e/lUeMzIgRjnq5us\nRyyzjun7+E1PfqyjB511DHgMsZ5vy+wm1XX07C+55JIpNpkvjXIe/M+6/Df7xXasQ+jPmDGjDBWK\n88qN2PuYrYRr5CHi3HPPHdC8U9gPnl8281nKdaiON5pNYS/qBoW9iMK+iwTUjjvumIQ34Sxjxowp\nBRNCnWV8ybIquhnUh1C+4oor0jq2YxnrmP6PD/ZE+rFtCPtJkyaV63goiHQbCXvS5Dyr507aiPd4\nqMgfStZaa61eH+JZd911U8++wr57hX3MVINvDGRZ9tfw1/zhsy82derUNJ6l1jrqZQwE788xFPYi\nCnsrp1hBR6iAolebPGGObKbni3AX1jH3NqE3IVpC5Ieg5jfhMlVBg3jfbLPNeohvtg1hT2hOrONt\nQIh3/ucBIMRavo79EDXR0084EAIPEVSrx543CRFaROgO8fuXXnppWsY5K+y7U9jzhgZfoizjQbJT\nDD/LH0z7cm1f+MIXar59wgg7Cz/AvxX2Igp7hZFYQUeIsEfg9tcIuyE/jjjiiHJZzBuO0GdgKqEr\nLEe8s5yec8Q9ve4h9Nn2e9/7XhLkbHvNNdekbRFfDM5lW+LbESyxjukz+b3hhhum0Bz2DTHOvNqP\nP/54EvKxLj6sE2nSe886hD3nwdSdCKO4DqbrjH1jGYKLjwztscceA5J/mMJ+4P2ykf34xz9O+YAA\nZiwHD24xSHuTTTZJD3xshy8x5zyDryNkLNLgf95M7bzzzuVAcER5vf3qHQM777zzyoHgjPnIfZk0\nwv+qv/H/uBYegvF3PjgVA8H5YFT12sePH58GuDMIfOLEiYOe1wPp42oHUTco7EX030EWUISqrLPO\nOj0EMeIXsY3oQGA88sgjpbBHvIQY4X/ENusQ9vTY5yKaB4D8gznXXnttuS6+dhkWYohjI1hi+Qor\nrNBDnJ9xxhnlOs4NscQ+CKr4QijbIfx50JgyZUqvaz777LPTQ4bCvjuFPWMyEPUXXnhh+ZDI4G58\nIQZp48/xIIqY5g0UD5GRRqzbZptt0luq7bbbru5+8fXbWseIh80zzzwz9abHQPAYJJ4/7Oa/Gcyd\np8kDLOKeBxV8s/qQijHjE/vwAIJ/xRS1CnsRhb3CXqygI0DYI2gH2xAT8T/hK0svvXSK882XNzIE\nNoKq3XXMXBMf+6m1H/H0tZYPRZ5UTWE/tH5J+M3CCy+cfJAHRKZgjYdC/ImHSMQ/D5v8T094NY1Y\nF34c+zHeo7pfo2NU19GzzwMudYT6gpDn/6g/8Zv9YjvWIfSnT5/e49qq50zsPet4Q0bd4CGCMLpu\n8XG1g6gbFPYi+u8wC/vcYmpKehKHQ0B3qinsh9YvmQ0HgYvwJmxsv/3267EOH0V0I6R5q8OyahpV\n0R37XXbZZb32a3QMBPrBBx/c44Eh0m0k7Elzhx12aHht+XIeHNZcc82aA8GHoj4q7EXdoLAXUdiP\nMGHPlJWECijmFfaN/BIROpiGHyJ+H3vsseL4449PM8Tk6xDl9JwT+kKvOMK3mgbrQrzn+xFaU92v\n0TFYt95665XrKHfEO/vGgzA97NV17Bdvv1jH1K3EzRNXz7XxRio/X94kRKgZ34zA+G4Dyzjnwc5z\nhb2oGxT2Igr7LhdQ2tCJHoV934Q9syzFYGuW03tO7DmhLBHTXkvY03vOfieddFIK4WI/xDr/V/dr\ndIxYh+Dm9wYbbJBCc9g3xDgCnK8uI+RjHf6Rp0nvPetietmZM2emsJw43wMPPLDcN5bxUMBA8N13\n311hL6KwV9iLFVRhrynsu1vY8xtxng/SRmxHr3y9HnuEfXUgOGVWb796x8COO+64HuExIcAR3sy+\nFMuXX375HuL89NNP7zEQnF549mEQLcsIC4rr5UGDQd/V62DQLg8ZCnsRhb3CXqygXS7sEQHa8JvC\nfvj9EvFLj3mr2yPe6UEnTIbwl/4eo9E6Zq7B6u1HPH2t5SPNx9UOom5Q2Ivovwp7hb3CfsCNqSm/\n/e1vp3AXfVhhL6Kwt3KKFVQBpSnsa/gloSadbvSg812FbjjXTjCFvagbFPYiCnsFlKJHYa/p42oH\nUTco7EX0XwWUwl5hrynsRRT2CiORUSDsGfinDb8p7PVLfVztIOoGhb2I/quAUvQo7DWFvYjCXmEk\norBXcCjsO88vmWlGG1mmsBd1g8JeRGGvgFL0KOw1fVztIOoGhb2I/quAUtgr7DWFvYjCXmEkMgqE\n/bx587QOMIW9fqmPqx1E3aCwF9F/FVCKHoW9prAXUdgrjERGu7CfO3eu1gGmsNcv9XG1g6gbFPYi\n+q8CStGjsNcU9iIKe4WRyGgX9lpnmcJeH9DH1Q6iblDYi+i/CiiFvcK+yyzKQx9XO4i6QWEvov8O\nKJMnT+5109WG1/Tdke2XUR76uNpB1A0KexH9VwGl6FHYK+wV9iIKe4WRiP7bk2nTpmkdZAr7ke+X\nUR76uNpB1A0KexH9V0TftTzMLxGFvZVTRP8VfVcsD/NLRGFv5RQrqBkh+q5YHuaXiMLeyilWUBF9\n1/KwPMwv0XcV9iL6r4i+a3mYXyIKeyuniP4r+q5YHuaXiMLeyilWUP1X9F2xPMwvEYW9lVOsoCL6\nrlge5pfouwp7Ef1XRN+1PMwvEYW9lVNE/xV9V9+1PMwvEYW9lVNE/xV9VywP80tEYW/lFCuoiL4r\nlof5Jfquwl5E/xXRdy0P88uMEH1XYS+i/4rou5aH+SWisLdyiui/ou+K5WF+iSjsrZxiBRXRd8Xy\nML9E31XYi3hzEdF3LQ/zy/wSfVdhL6L/iui7lof5JaKwt3KK6L+i74rlYX6JKOytnGIFFdF3xfIw\nv0TfVdiLeHMR0XctDzG/RN9V2IvovyL6ruVhfoko7K2cIvqv6LtieZhfIgp7K6dYQUX0XbE8zC8R\nhb2INxcRfdfyEPNL9F2FvYj+K6LvWh7ml4jC3sopov+KviuWh/klorC3cooVVETfFcvD/BJR2It4\ncxHRdy0PMb9E31XYi+i/Ivqu5WF+iSjsrZwi+q/ou2J5mF8iCnsrp1hBRfRdsTzMLxGFvYg3FxF9\n1/IQ80v0XYW9iP4rou9aHuaXiMLeyimi/4q+K5aH+SWisLdyihVURN8Vy8P8ElHYi3hzEdF3LQ8x\nv0TfVdiL6L8i+q7lYX6JKOytnCL6r+i7YnmYXyIKeyunWEFF9F2xPMwvEYW9iBVURN+1PMT8En1X\nYS+i/4rou5aH+SWisLdyiui/ou+K5WF+iSjsrZxiBRXRd8XyML9EFPZWTrGCiui7loflYX6Jvquw\nF9F/RfRdy8P8ElHYWzlF9F/Rd8XyML9EFPZWTrGC6r+i74rlYX6JKOytnGIFFdF3xfIwv0TfVdiL\n6L8i+q7lYX6JKOytnCL6r+i7MuTMnDmzzP9mNmHCBDNM/xV9V2Evov+K6Ludyvzzz9+SsH/jjTfM\nLP1X9F2FvYj+K6LvdiqHHnpoyv9VVlml17qFFlrI3nr9V/Rdhb2I/iui73YDn3/+eVkGr7/+ern8\n3nvvtbde/xV9V2Evov+K6LvdBD3ylMH48ePLZfTgs2zMmDFmkP4r+q7CXkT/FdF3uwF65KMcPvvs\ns9RzH7/vu+8+M0j/FX1XYS+i/4rou90CPfOUw+TJk1PPPf8vvPDCZoz+K/quwl5E/xXRd7sJeuYp\nh/nmm68sE6bDFP1X9F2FvYj+K6Lvdhn00Ed5MA2m6L+i7yrsRfRfEX23C8k/WMU0mKL/ir6rsBfR\nf0X03S4lPljFNJii/4q+q7AX0X9FRo3vLrHEEloHmv4rorC3cooVVETfVdgr7G17xbZXYS+i/4qM\nVmHP/O/a8JvCXkRhb+UUK6iIvtsvYf/pp59qHWAKexGFvZVTrKAi+q7CfgQJ+2nTppV200036b8i\nCnsRxZGIvtuasP/kk0+0DrAoD8R8bvqviMJeRHEkou8q7BX2tr1i26uwF9F/RUaLsP/444+1DjCF\nvYjC3sopVlARfVdhr7C37RXbXoW9iP4rorBXVCvsRRT23lxE9F/Rd7te2H/00UdaB5jCXkRhb+UU\nK6iIvquwV9jb9optr8JeRP8VGe3C/sMPP9Q6wBT2Igp7K6dYQUX0XYW9wt62V2x7FfYi+q+Iwl5R\nrbAXUdh7cxHRf0Xf7Xph/8EHH2gdYAp7EYW9lVOsoCL6rsJeYW/bK7a9CnsR/VdktAv7999/X+sA\nU9iLKOytnGIFFdF3h13Yv/HGG8Vii/3f9s481ooqT8B/TzRpE01GJ3HfO1EnPSAC2iIoaqPiaCsC\n7o3QaivaTNsqCoroBAFBUWlABUF2BIFhBwUUWQXZlMUdt15sdUz6n/6jJt/JnEq9++6977713vve\n9yUnUHvVqd+p+u55p875eZonMfXp0yf54IMPStrHtGnTkgMHDij2ir2IYm/hFAuoiLFbTrE//vjj\nkzfffDN5//33kx07diRvv/12ctVVVyXXXHNN8vXXXxfd/tChQ8nhhx+eHDx4ULFX7EUUewunWEBF\njN2GiP0333zT6PTpp58mJ598cvLxxx/XmD958uSkQ4cOyZdffhmm16xZk5x22mkh33r37h1q85n/\nu9/9Lszjx8Hq1auTm2++Ofnqq6/Css2bN6fTW7ZsSS677LLklltuSY466qhkwYIFya9//etk6NCh\nYfvzzz8//LjIPb/c7dhnoXMhLVmyJDn33HPDshtvvDFdtnTp0hrb7Nq1q0nyj6TYiyj2Fk6xgIoY\nuxUh9kj5woULQ039+vXrk9mzZ4d5/fr1C+vs3Lkz5NeoUaOS7du3B8lG+qmtR7L/7d/+LZk3b17y\n1ltvhWY9UezZV5x+9913wz7YdvTo0WE7pm+99dZwXCS8e/fu6bYx5W63cePGgueybdu2dBk/ADp1\n6hT2G/cR5/OXCH7MsI1iL6LYWzhFjF8xdssu9jSTaWz65JNP8raxf+ihh0ItPutMmDAhiP7evXuT\nffv2BRFnHST7888/D5K8f//+5J133gn7opaf7bLTGzZsCDXu1KCzLN90dtuYctcrdi7PP/98+lcG\n1kX0Z8yYEebHHw3M/+ijj8I+ly1b1iR5qNiLKPYWTrGAihi7FSH2iPnu3bvD9PLly0PejB07Nl1n\n4sSJtcSfhBjH7RHvYmLP/xFy1o/L2O6LL76otW72/HK3K3YuL774YnLXXXfVukbmDxkypMY10yxH\nsRdR7C2cIsavGLutTuxjjXhWnmkzzzQ13jRroekKCRlftGhR2CZuT409TW8QZtZhu3Xr1tUQ+2xt\ner7pQmKfXa/YucRlsWaej4H5y8OYMWOSvn371rhmfiwo9iKKvYVTxPgVY7cixB6BbWyiuc1JJ50U\nmrbEeQhz586dk/bt24emNgg++UWzFnrRoTafaT5ApTccJHnOnDlps5j58+cne/bsCZJ9ySWXhP2x\nDHHn/xyjrumYcucXO5e1a9eG/7/xxhvhuu68885wfD6czc4fPnx4cswxx4QuOpsiDxV7EcXewikW\nUBFjtyLFnkRNOXk0adKkMM2/Md/o3nLu3LlhPjXpfKDKfD7AfeCBB9L1fvnLX9YQ+/iRaxT2YtNZ\nsc+dX+hccpfxg2PTpk1hPs1x4nza169YsaJJ8k+xF1HsLZxiARUxdhst9kh1SyaasNDkBcnOXcYP\nhPh/avFJ5TqXuCzfOVJL39TnotiLKPYWTrGAihi7VSX2JsVeRLG3cIoFVMTYbQaxjx+QmsqbFHsR\nxd7CKRZQEWNXsVfsffaKz17FXsT4FVHsq1eGaevOqLeKvc9e8dmr2IsYvyJtXuzpw70aU+w558wz\nzwxyX63XEZNiL6LYWzjFAipi7LY5sadnmuOOOy6ZN29eqLWvdqlX7EUUewunWEBFjN1Giz2DR9Un\nMaDTsGHD0utnoCZqzFnG4E3t2rUL83v37p3s3LkzzKdv+lNPPTXM79WrV7Jt27Ywn37uu3fvntx0\n002hX3j6m1++fHmNdeM+YmJ02ngM+p9n/frsP+6HZfSdH8+dZXG62DUWOr9ixyolKfYiir2FUyyg\nIsZui4r97Nmzw4ir69evTxYsWBDyYNGiRcnGjRvD/0eMGBGktmPHjkHu161bV2N+z549w2BW1LrH\nZcgwy7Prbt68Ocw/99xzw7rZc1i8eHGQ+lmzZgX5LXX/9Esf97FmzZq0GU/udKFr3Lp1a8HzK3Ys\nxV5EsbdwigVUxNitOLFn9FVqpGfMmBHkFdlFbJ999tkguVGUGa116tSpYf7FF18casGZ/+GHH4bt\nkXNkmP/v2rUr3TdNbKgF3717d/LWW2+FPM6t/f7oo4+CvO/Zs6de+8+mtWvX1hD77HShayx2fsWO\npdiLKPYWTrGAihi7zS72CHF9ElJ9zz33pNffo0ePIPHPPfdcMmDAgFrrM3/w4MHpNE1paMpCDThi\njCgzj2WIc9xvNrFudp+sj9gj2PXZfzaxDJFnhNnc6ULXWOz8ih2rlKTYiyj2Fk6xgIoYuy0q9lu2\nbAnNbhBY2rYjw4j12LFjk/POOy9to04tNz3XjBw5MjTJyYo3AhxlmFr+KNdxH9SOkxDs+fPnB4Ev\nJPZsU+r+s4mmN/wA4DhMr169OhX7uq4x3/kVO5ZiL6LYWzjFAipi7Da72CPi9UlPPvlkEOft27cn\n+/btSzp16pQ8/PDDyapVq0J+zJ07N8zv379/0q1btyDG2fmPPfZYaL9OM5o333wzOeOMM4Iks+9l\ny5aFdWnCQ283o0ePDtN8DJs9B/Zz4oknJu+//35oclPq/rOJ9vNsR3v6HTt2BGHnfFm30DUWO79i\nxyolKfYiir2FUyygIsZui4o9bchpmhKvv0uXLkGMWTZ+/Ph0PmJM23Pm01wmzqcdOsLKfGQ4fnwa\n95/dBx/Izpw5s9Y5ZMW+vvuPiZr1QYMGpdudf/75qdiXeo3Z8yt2LMVeRLG3cIoFVMTYrTixj4mP\nSkm582m+QtOUfDK+d+/ekvYd94F8l3o+9dl/KddRyjXW5/wUexHF3sIpFlARY7dZxR45NZU/KfYi\nir2FUyygIsauYq/Y++wVn72KvYjxK9LWxT728GIqb1LsRRR7C6dYQEWM3aoRe3qSoX26Iq/Yiyj2\nFk6xgIoYuxUo9nT/SF4sXbo0nUd3k2effXboJjLOu+GGG5I5c+Y0ixjTL3379u2TgwcPNngfkyZN\nCj3t5FvGDxK6xLz++usbdQzFXkSxt3CKBVTE2G0WsWeQpcYmRPfmm29Ojj766OS9994L09dcc03o\nkvLDDz8M69BjDdMsb4pj5qa1a9eGfuT5q0BDtuc86b6Sbi3zLV+yZEl6zxmMqqnPX7EXUewtnGIB\nFTF2yy72pN27dwex7tu3b/L4448nRx55ZPLuu++my5cvX5506NAh9Pd+0UUXJXfeeWfIvwsuuCBZ\nt25dKucXX3xx2AfbI9Cvv/56csopp4R1r7vuumTTpk3pPqdMmRLWI/HXAPqhR+zZT58+fVLJZz/Z\n6Xnz5oVrZ5+9evUKA0wNGDAg7X8/34+P2267LXniiSdC3/e///3vFXsRxd7CKWL8irFbWWJP7XpT\npTgyaxwJNrts2LBhyfDhw5PVq1eH5dTwb9iwIbn99tvTmv24DAl/6qmnkkWLFoVpRoLlB8GVV16Z\nrhuP9cILL4TadOS/a9euockMPyL4kcH/OXZ2Oo44G/fJjw3knhFs+YvDtGnTwv6z584ItGzDDwaa\nG7EeNftNmXeKvYhib+EUC6iIsVsxYs+IrQg0NehIe5xPTXnHjh2DYCPvLI9izEBPTNNGPi6jBp1l\no0ePDrLO9tl158+fX2sZNfu0sUfeV61aVUPss9NsF9djGaPjvvLKK2EgKn405BN22t7HHxRcIz8i\nXnrpJcVeRLG3cIoYv2LsVo7YI8ZNlfr16xfE+9hjj026dOkSZJn5W7duDfP4oHblypVBshkplmU0\n4UGUZ8+eHZaxHvNY9swzzyQPPvhguv+4LhI/atSo5NFHH02XRXlnv7nHyE6zT84z99zZN/LOuWbn\n8wPg0ksvTe93TD169Aii31R5p9iLKPYWTrGAihi7FSH2EydODPmxYsWKUAsem7uw7LXXXgtNb6Jk\nR8mPQs00tfksa9euXSrkyDu90GTlm3Wj2NM0Jy6jaU6Ud/7PD4Ao3tllbEfzG4SdZfxlgTbztKtH\n7Gl2k70u/pIQmxbRdIf2+jNmzAjzOGfFXkSxt3CKGL9i7LYasUeOyQs+Lo3zaPLCPGSdD1NpzhJr\n1pk/ZsyY0FPOkCFDgqzz/9ya9gULFoR1Z86cGaSedWP79rgM4Wb66quvDk1z2DbKOAK+ZcuWIPJx\nWWybH/dJ7T3LEHrOg647418aSIMHD063zdbi07Ro4MCBir2IYm/hFDF+xditDLFHUhubaKpy+eWX\nBzmP8xDhnj17Jr/4xS+CMNNDDvORd5rrMJ/84/98kMoyavupsaemPe6HpjMxr1kXoY/LRo4cWaN5\nDALOthz7vvvuS+d37tw5XcZ248aNS5dxbvwQYBs+omXerFmzwnq0pz/99NOT8ePH17rmF198MfzI\naIr8Iyn2Ioq9hVMsoCLGbtnFvq5EM5f4f+SdGnQkOzu/WKJmnVr5+i5jsClSoe34SDff/JbIE8Ve\nRLG3cIoFVMTYbVKxp6a6JVPsmpLa/ZY+diUnxV5EsbdwigVUxNitKrGnBp3+6ZV5xV5EsbdwigVU\nxNitYrE3KfYiir2FUyygIsZuM4g9bd1N5U+KvYhib+EUC6iIsavYK/Y+e8Vnr2IvYvyKtHWxp892\nU/mTYi+i2Fs4xQIqYuwq9oq9z17x2avYixi/Ioq9Uq3Yiyj2vlxEjF8xdqte7OlP3lT+pNiLKPYW\nTrGAihi7ir1i77NXfPYq9iLGr0hbF/s9e/aYKiAp9iKKvYVTLKAixq5ir9j77BWfvYq9iPErotgr\n1Yq9iGLvy0XE+BVjt+rFfvfu3aYKSIq9iGJv4RQLqIixq9gr9j57xWevYi9i/Iq0dbHftWuXqQKS\nYi+i2Fs4xQIqYuwq9oq9z17x2avYixi/Im1d7Hfu3GmqgKTYiyj2Fk6xgIoYu4q9Yu+zV3z2KvYi\nxq9IWxd7U2UlxV5EsbdwigVUxNhtk2If74Ni77NXfPYq9iLGr4ix+/8MHTq0llhWeor3odrOu9Rk\n/Ioo9iLKkYixq9gr9j57xWevYi9i/Iq0xdidOHFi1aV4H6rx3OtKir2IYi+iHIkYu94HMd/E2FXs\nRYxfEWPX+2C+iSj2Fk4R41eMXfE+mG8iir2FUyygIsaueB/MNxHFXsQC2uI4oE5lJmPXZ4iYb2Ls\nKvYixq9ir9j77PUZYr6JKPYWTpG2Kvbff/+9qQKSYu8zRMw3MXYVexHjt1Fi//e//91UAUmx9xki\n5psYu4q9iPGr2LcisW+JQX589voMMd9EFHsLp0grFPvvvvvOVAEp3g9kPpuMXZ8hYr6JsavYixi/\nir1i77PXZ4j5JqLYWzhF2orY/+1vfzNVQFLsfYaI+SbGrmIvYvwq9oq9z16fIeabiGJv4RRR7JVq\nxV58hphvIoq9hVMsoFUv9n/9619NFZAUe58hYr6JsavYixi/ir1i77PXZ4j5JqLYWzhF2rrY/+Uv\nfzFVQFLsfYaI+SbGrmIvYvwq9oq9z16fIeabiGJv4RRR7JVqxV58hphvIoq9hVMsoFUv9n/+859N\nFZAUe58hYr6JsavYixi/ir1i77PXZ4j5JqLYWzhF2rrYf/vtt6YKSIq9zxAx38TYVexFjN8WF/vP\nPvss+fnPf57mQUx9+vRJPvjgg2YR3/Xr1yennXZa8tVXXyn2Pnt9hphvZoQYu4q9iPHbVGJ//PHH\nJ2+++Wby/vvvJzt27Ejefvvt5Kqrrkquueaa5Ouvv25y8T148GCybNkya+yNXZ8h5pv5JsauYi9i\n/OYT+2+++abe6dNPP01OPvnk5OOPP64xf/LkyUmHDh2SL7/8MkyvWbMm1LKTT7179w61+XHdJUuW\nJOeee25YduONN6bLCm2zbdu25L777gs19oMGDUpmzJiR7mvlypVhHxy32DFj2rJlS3LZZZclt9xy\nS3LUUUclmzdvbtC5Ll26tMY2u3btalB+khR7nyFivomxq9iLGL9lEXtq7BcuXBhq6mkmM3v27DCv\nX79+YZ2dO3eG/Bk1alSyffv2INFI/6FDh4Kkx2VIdadOnYIwF9uGY9D8B7F//vnnwzb8n2Pdcccd\nyR//+Mei22fP/9133w3rsXz06NHJxo0b632ucR9xPn+p4MdO7rEUe/E+mG8iir2IL5cWEXuazdQ3\nffLJJ3nb2D/00EOhFp91JkyYEER/7969yb59+8IPANZBohHzWLPPusgzNfDFtnnnnXfCMdmG5j/M\nR8I/+uijUOuO+BfbPnv+GzZsCNtQ897Qc2V+9+7dw48L5sfzoLlQQ/JUsfcZIuabGLuKvYjxWxax\np3Z69+7dYXr58uUhL8aOHZuuM3HixFriT0J8X3zxxeSuu+6qtd9i22TFHpmmPT/r81cDmsN88cUX\nRbfPHod9IfJcR0PPlflDhgypkSech2Iv3gfzTUSxF7GAVp3YxxrvrByvXr06TMfmMjRNISHeixYt\nCttkm9KwLjXw1PaPGTOm4DZZsWebWbNmJf/+7/+e9OjRI3n22WfrPGau2Gdr4Rt6rn379q2RJ/xY\nUOzF+2C+iSj2IhbQsog9wlrfRHObk046KTRdifMQ4s6dOyft27dPPv/88yD45A/NVuhFh9p8pvnA\ndO3ateH/b7zxRtjXnXfemVxyySXJqlWrCm6zbt26IPYch+PRZAaRPvzww0OTHOYVO2b2/Glqk91X\nQ86VD2ez84cPH54cc8wxyYEDBxqUp4q9zxAx38TYVexFjN+KEHsSNeHkyaRJk8I0/8Z8QsDnzp2b\nrptdhqBv2rSp6DbIePygNe7jD3/4Q+iNJjbPqeuYWbHP3VdDzpXmOHE+7etXrFjRoPxU7H2GiPkm\nxq5iL2L8NlrskeLmTDRRoUkLEl1oWX22aewxm/pc+ZFDLX1j80mx9xki5psYu4q9iPFb0WJvUuzF\n+2C+iSj2Ir5cWkDs4wejpvImxd5niJhvYuwq9iLGr2Kv2PvsrTLiWAz07CTGrxi7ir2I8dvmxZ62\n7YyCq9j77K02pkyZEu7B1VdfbWYYv2LsKvYixm/TiD19tldjeuCBB0L+n3nmmUHuq/U6Yqqv2COG\nPnurly5duqSDuonxK8auYi9i/LZZsacnmuOOOy6ZN29eqLWvdqkvVex/+OGHIPQnnHBCo2LPZ295\niWMjkBg3QYxfMXYVexHjt0nEnsGk6pMQkWHDhqXXz8BM1JizjMGa2rVrF+bTv/zOnTvD/IULFyan\nnnpqmN+rV69k27ZtYT793nfv3j256aabQj/w9C+/fPnyGuvGfcS0f//+9Bj0N8/69dl/3A/Lbrzx\nxvTcWRani11jofMrdqxSUjGx53wee+yx5IgjjkjPSbGvTvhxRrt68v/WW281Q4xfMXYVexHjt3xi\nP3v27DDC6vr165MFCxaEPFi0aFGycePG8P8RI0YEqe3YsWOQe0aMzc7v2bNnGNyKWve4DBlmeXbd\nzZs3h/nnnntuWDd7DosXLw5SP2vWrCC/pe6ffujjPtasWZM248mdLnSNW7duLXh+xY7VULF/7rnn\ngvxlZf5nP/uZYl+l8AMtSj0/0pB8MX7F2FXsRYzfsok9o61SIz1jxowgr8guYvvss88GyY2izOis\nU6dODfMvvvjiIDXM//DDD8P2yDkyzP937dqV7psmNtSC7969O3nrrbdCHufWfn/00UdB3vfs2VOv\n/WcTzSGyYp+dLnSNxc6v2LHqK/aPPPJIctZZZ9UQeka8HTp0aPL9998r9lUGPeBkf6Ah9cwT41eM\nXcVexPhtUrFHiOuTkOp77rknvf4ePXoEiad2ecCAAbXWZ/7gwYPTaZrS0JSFGnDEGFFmHssQ56zM\nxsS62X2yPmKPYNdn/9nEMkSeEWVzpwtdY7HzK3asUhL3grbz//qv/1pj3+ecc04yefLkvLFnqr7E\nR7O2q9cdxNhV7EV8uVSE2G/ZsiU0u0FgaduODCPW9O5x3nnnpW3UqeWm55qRI0eGJjlZ8UaAowxT\nyx/lOu6D2nESgj1//vwg8IXEnm1K3X820fSGHwAch+nVq1enYl/XNeY7v2LHKlXsjzzyyOSwww6r\n0exmzJgxoZZesa/exA82auz5q5D47BVjV7EX8eXSbGKPiNcnPfnkk0Gct2/fnuzbty/p1KlT8vDD\nDyerVq0K+TF37twwv3///km3bt2CGGfn8xEo7ddpRvPmm28mZ5xxRpBk9r1s2bKwLk146O1m9OjR\nYZqPYbPnwH5OPPHE0JyBJjel7j+baD/PdrSn37FjRxB2zpd1C11jsfMrdqxSUrwfnM8dd9xRo+Ye\nwR84cGBYryliz2ev+OwVUewtnCKKfWhDTtOUbNMCxJhl48ePT+cjxrQ9Zz7NZeJ82qHTjpz5yHD8\n+DTuP7sPPpCdOXNmrXPIin199x8TNeuDBg1Ktzv//PNTsS/1GrPnV+xY9RH77Mez999/f9rfeUy3\n3HKLYi8+e41fMXYVexHjt/FiHxMflZJy59N8haYp+WR87969Je077gP5LvV86rP/Uq6jlGusz/k1\nROxjd5c04cjtHUexF5+9IsauYi9i/NYQe+TUVP5UygBVtMW/77770v7sffaKz14Rxd7CKWL8KvZV\nKPaROAKtz17x2Sui2Fs4RYzfVCRjDy+m8qb6iL3PXvHZa/yKsavYixi/ZRV7epKhfboir9iLGL9i\n7Cr2IsZvBYo93T+SF0uXLk3n0d3k2WefHbqJjPNuuOGGZM6cOc0ixvRL3759++TgwYMN3sekSZNC\nTzv5lvGDhC4xr7/++kYdQ7EXMX7F2FXsRXy5NIvYM8hSYxOie/PNNydHH3108t5774Xpa665JnRJ\n+eGHH4Z16LGGaZY3xTFzEz3H0I88fxVoyPacJ91X0q1lvuVLlixJ7zmDUTX1+Sv2IsavGLuKvYjx\nW3axJ+3evTuIdd++fZPHH388jKL67rvvpsuXL1+edOjQIfT3ftFFFyV33nlnyL8LLrggWbduXSrn\nF198cdgH2yPQr7/+enLKKaeEda+77rpk06ZN6T75gJT1SPw1gH7oEXv206dPn1Ty2U92et68eeHa\n2WevXr3CAFMDBgxI+9/P9+PjtttuS5544onQ9/3vf/97xV7EZ6+IYm/hFAtoZYk9tetNleLIrHEk\n2OyyYcOGJcOHD09Wr14dllPDv2HDhuT2229Pa/bjMiT8qaeeShYtWhSmGQmWHwRXXnllum481gsv\nvBBq05H/rl27hiYz/IjgRwb/59jZ6TjibNwnPzaQe0aw5S8O06ZNC/vPnjsj0LINPxhobsR61Ow3\nZd4p9iLGrxi7ir2I8VsxYs+IrQg0NehIe5xPTXnHjh2DYCPvLI9izEBPTNNGPi6jBp1lo0ePDrLO\n9tl158+fX2sZNfu0sUfeV61aVUPss9NsF9djGaPjvvLKK2EgKn405BN22t7HHxRcIz8iXnrpJcVe\nxGeviGJv4RQLaOWIPWLcVKlfv35BvI899tikS5cuQZaZv3Xr1jCPD2pXrlwZJJuRYllGEx5Eefbs\n2WEZ6zGPZc8880zy4IMPpvuP6yLxo0aNSh599NF0WZR39pt7jOw0++Q8c8+dfSPvnGt2Pj8ALr30\n0lqjvvbo0SOIflPlnWIvYvyKsavYixi/FSH2EydODPmxYsWKUAsem7uw7LXXXgtNb6JkR8mPQs00\ntfksa9euXSrkyDu90GTlm3Wj2NM0Jy6jaU6Ud/7PD4Ao3tllbEfzG4SdZfxlgTbztKtH7Gl2k70u\n/pIQmxbRdIf2+jNmzAjzOGfFXsRnr4hib+EUC2irEXvkmLzg49I4jyYvzEPW+TCV5iyxZp35Y8aM\nCT3lDBkyJMg6/8+taV+wYEFYd+bMmUHqWTe2b4/LEG6mr7766tA0h22jjCPgW7ZsCSIfl8W2+XGf\n1N6zDKHnPOi6M/6lgTR48OB022wtPk2LBg4cqNiL+OwVUewtnGIBrQyxR1Ibm2iqcvnllwc5j/MQ\n4Z49eya/+MUvgjDTQw7zkXea6zCf/OP/fJDKMmr7qbGnpj3uh6YzMa9ZF6GPy0aOHFmjeQwCzrYc\n+7777kvnd+7cOV3GduPGjUuXcW78EGAbPqJl3qxZs8J6tKc//fTTk/Hjx9e65hdffDH8yGiK/CMp\n9iLGrxi7ir2I8Vt2sa8r0cwl/h95pwYdyc7OL5aoWadWvr7LGGyKVGg7PtLNN78l8kSxFzF+xdhV\n7EWM3yYVe2qqWzLFrimp3W/pY1dyUuxFjF8xdhV7EeO3qsSeGnT6p1fmFXsR41eMXcVexPitYrE3\nKfYixq8Yu4q9iC+XZhB72rqbyp8UexHjV4xdxV7E+FXsFXufveKzV0Sxt3CKtHWxp892U/mTYi9i\n/Iqxq9iLGL+KvWLvs1d89ooo9hZOEcVeqVbsRXz2iij2Fk6xgFa92NOfvKn8SbEXMX7F2FXsRYxf\nxV6x99krPntFFHsLp0hbF/s9e/aYKiAp9iLGrxi7ir2I8avYK/Y+e8Vnr4hib+EUUeyVasVexGev\niGJv4RQLaNWL/e7du00VkBR7EeNXjF3FXsT4VewVe5+94rNXRLG3cIq0dbHftWuXqQKSYi9i/Iqx\nq9iLGL+KvWLvs1d89ooo9hZOkbYu9jt37jRVQFLsRYxfMXYVexHjV7FX7H32is9eEcXewinS1sXe\nVFlJsRcxfsXYVexFjN82KfbxPij2PnvFZ6+IYm/hFDF+/5+hQ4fWEstKT/E+VNt5l5qMXRHjV4xd\nxV7E+FXsFXufveKzV0Sxt3CKtMX4nThxYtWleB+q8dzrSoq9iPErxq5iL2L8eh/EPBPjV0Sxt3CK\nGL/eB/NMxPgVUewtnGIBFe+DeSZi/Ioo9iK+XMT7YJ6JGL9i7Cr2Isav90HMMzF+RRR7C6eI8et9\nMM9EjF8Rxd7CKRZQ8T6YZyLGr4hiL2IBFe+DeSZi/Iqxq9iLGL/eBzHPxPgVUewtnCLGr/fBPBMx\nfkUUewunWEDF+2CeiRi/Ioq9iAVUvA/mmYjxK8auYi9i/HofzAjzTIxfEcXewili/HofzDMR41dE\nsbdwigVUvA/mmYjxK6LYWzjFAireB/NMxPgVY1exFzF+vQ/eB/NMjF8Rxd7CKWL8eh/MMxHjV0Sx\nt3CKBdT49T6YZyLGr4hib+EUC6h4H8wzEeNXjF3FXsT4Fe+DeSbGr4hib+EUMX69D+aZiPErothb\nOEWMX++DeSZi/Ioo9hZOsYCK98E8EzF+xdhV7EWMX/E+mGdi/IoYu4q9iPHrfTDPzDMxfkUUewun\niPHrfTDPRIxfEcXewlk627ZtS956661kwoQJIfXv379eKW7HPtiXGL/eBzHPxPgVUewtnM3M/v37\nkxkzZgQhv+KKK5L/+I//aJbEvjkGx+KYYvx6H8wzEeNXRLG3cDaCn376Kcj1oEGDkgsvvDCvhPfq\n1SsZOHBgMm7cuJCWLVuWvP322yUl1o3bsQ/2le8YHJtz4Fw4JzF+vQ/mmYjxK6LYWzhLYPHixaHG\nPFewr7/++uThhx9O5syZk2zfvj353//932ZJ7JtjcCyOmXsenBvnKMav98E8EzF+RRR7C2cOX3/9\ndTJq1KhaNfO333578sorryQHDhxoNpGvK3FszoFzya3J55w5d/Hl4n0wz0SMXxHFvk0XTj5YpZlL\nVph/9atfJS+//HLy1VdfJT/++GNFJc6Jc+Mcs+fMNfjxrS8X74N5JmL8iij2ba5wUsudK/TUiC9Z\nsqTiZL5Q4lxza/G5Jmvwfbl4H8wzEeNXRLFv9YWTj0+HDh1aQ4Zpy07vM9Ui9LmJc+castfENfqh\nrS8X74N5JmL8iij2rbJw0ld8tg39vffem+zbty/54YcfWkXiWrimbBt8rtkC6svF+2CeiRi/Iop9\nqyic1Fxne7mhffratWtbjdDnJq4t2wafa2/Ltfe+XLwP5pmI8Sui2LeCwkkzlWwt/UsvvZQcOnQo\n+f7771t14hq51mztfVsd7MqXS8szZcqUNN/rSrfeeqsZZuyK8Sui2Fs4i5NtS08N9tatW1u90Ocm\nrjlbe0+eWEClJTjiiCNKEvvPPvvMzDJ2xfgVUewtnPnJbXrz0EMPJV988UXy97//vU0mrp08aKtN\nc3y5lIfHHnss5Dt/Lcrl+OOPt7be2BXjV0Sxt3DWLfW9e/cOAvvLX/4ymTlzZpsV+txEXpAn5A15\n1Fbk3pdLeeB7j5j3n376aTqfD7qtrTd2xfgVUewtnEXJtqdHYLds2aLQ5yTyJMp9W2l378ulfFAj\nT97fcsst6TzijnldunQxg4xdMX5FFHsLZ3Gpp005Avvdd9+Z8iTyJra7bwty78ulfFAjH/Ofbz6o\nuY/T9N4kxq4YvyKKvYWzBoy0GqX+uuuuSz7//HMFvo5EHpFXUe5b82i1vlzKCzXz5D8fblNzz/9P\nOOEEM8bYFeNXRLG3cNYk26YeUaWG8G9/+5uphEReRblvzW3ufbmUF2rmyf+f/exn6b2gO0wxdsX4\nFVHsLZx5pZ5243v27FHY65nIs9jmvlevXq1S7n25lB9q6ON9oBtMMXbF+BVR7C2cBaV+8+bNinoD\nE3nXmuXel0v5yQ5YRTeYYuyK8Sui2Fs4UwYNGpRK/aZNm5K//vWvpkYk8jDK/cCBAy2g0uTEAavo\nBlOMXTF+RRR7C2dg1KhR6WBLa9asUcybKJGXMV+ffvppC2iFEO+JqbKSsSti/Iqxq9g3ksWLF6cv\n1unTpyd/+ctfTE2YyNOYv2+88YYFVLE3KfYixq8Yu4p905Ptq/6JJ55QxJspkbfkcadOnZK9e/da\nQCtE7OkH3lT+pNiLGL9i7Cr2jST7sSyjWSrgzZvIY/L6iiuuCDJjAS2/2DtycmUkxV7E+BVjV7Fv\nJLFdPR947tq1K/nzn/9sasZEHsePaflQ2QKq2Jtqiv3EiRPT9D//8z/GrojxK8auYl8K27Ztq9Hu\nW/FumURex3yfP3++BbTMYu+IyZWR4v1A5rPJ2BUxfsXYVexLgOYgvEgfeOCB5NtvvzW1YCLPyXu+\nbWDaAqrYK/aKvYjxK8auYt8gJkyYkDbB+eijj5TtFk7keWySc9dddyX/+Mc/LKBlEnsHU6uMpNiL\nGL9i7Cr2DeDrr7+u0RTkm2++aZakwBdPCxYsSO/DjBkzLKCKvWKv2IsYv2LsKvb1Y+jQoWkvOM0l\n9abSUuwl58Ybb0wOHjzoy0WxV+wVexHjV4xdxb40srX1K1euVK7LnLgH8X48//zzVdUkp7WIvaMj\nV0ZS7EWMXzF2Fft6EmvradeN5JvKn7gX8S8oy5Yt8+Wi2Cv2ir2I8SvGrmJfnGxt/Y4dO5TqCknc\ni3hfxo0blxw6dMiXSwuKvQOnVUZS7EWMXzF2Fft6EAejoob4q6++MlVQirX2/Dtz5kxfLoq9Yq/Y\nixi/Yuwq9vn56aefQp/pvDiXL1+uTFdY4p5wbzp16hRG3KyGD2kVe5NiL+KzV0SxL0PhXLx4cXhp\nXn755Yp0hSbuDfdo+PDhyfTp05N//vOfvlxaQOwdDbkykmIvYvyKsavYl0jv3r3DS/PFF19Mvvzy\ny6KJwZPOPPPM9PxIZ511VjJ37tx0nbfeeis57bTTks8//7zO/eVLb7/9dtKhQ4fkiy++aND2LZGa\n4hynTJmSfPDBByWty73hHvXo0SN57bXXKr7WXrE3KfYiPntFFPsWLpzZj2b37dtXktgff/zxoZb/\nnXfeCYL73HPPhXOdPHlyWOfDDz8MyxsqvGvXrg0/HipZ7Ddu3Nioc/z000+Tww8/PORVKetzb+J9\nQuwrva19axF7B0urjKTYixi/Yuwq9iXAqKbxw0x6XKkrUVN80kknhZrm7HxqlBF+lm/evDm59957\nQ4094vvEE0+k1/Pkk0+G+e+++27SrVu35J577gnzaeOPLLOv9evXB2lmPaap2T7qqKPCeuecc06y\ndOnSMP/+++8P/bvHc3jzzTeTq6++OkhznFfsOCzr3r17ctNNN4X9b9iwIfwg4a8NrNurV69k+/bt\n6b5oAsN6pL59+yaXXHJJei3sI54v+8lOL1q0KGnfvn3YZ58+fZLdu3eH/GaaPGO6lLyPH9EOHjw4\nefXVVyu6hxzF3qTYi/jsFVHsW7hwDho0KG2GUx+xz5VRZBbhZT5NcaKY00TnmGOOCTX7CxcuDNfE\nC5lp/n/bbbcl27ZtS+64446wX6Q8K/arVq0K61FLvXXr1iDo5557bvLZZ58l48ePT7fhHP7rv/4r\nGThwYI3zKnacuAwJHzlyZLJixYow/fTTT4fr4UdCXJcfDSybNGlSOCfkP4p99no5ZnaaHznZfXbs\n2DHIPYNPkS+zZ8+u8UOkWIrNcfhRMX/+/Iru116xNyn2Ij57RRT7Fiyc9IYTX5jvvfdeo8QeSY5i\nnxVz5Jv5NB2hOQlyHaWa+bHmf//+/WGa5j3Z7bds2ZIsWLAgrHPgwIFk2rRpQexZtnPnzpBHbMN5\nUfuNdOc7r3zHyZ4zy2hShKzzV4bsughE7jLmxfPI/QtDdprt4nos43r4kfLJJ5/k/ctHscQ9ivdr\n3rx5YT+VOhptaxF7R0CujKTYixi/Yuwq9nVAzTIvy2uvvTYIaykJuUZId+3aVWM+NdpIMPPXrVsX\nxJZadQSWZjnxevj4E7nNrhP3e+qppwaJz92epifZj3UvvvjidDuay9AHP7XtnBfrZ8+rruMcd9xx\nYR7LGADqkUceqXGtrItAPPvss8njjz+eLovyzn5zj5GdZp+//e1vS87HuhL3invGXxhojkMbfV8u\nir1ib+yKGL9i7LZxsY+DUg0dOrTeYr93794a82nvTs00Yp0VW5rP0ByFGnXarzMfeY5Szce4cb9M\n82Mjuz3NT2iysnr16rDvNWvWpE1x2I6mPrS7R/Bpy597vnUdJ7sv5J1mMtlrZd0o9jTNics4j3iO\n/KjhBwB/ichdxnY0v4nfG/AXiz/+8Y/Jnj178uZjXYl7xT27++67Q9OmOXPm+HJpRrF39OPKSIq9\niPErxq5iXwf9+/cPL0vkEPEsJdE8BdmdNWtWqCVHLu+7775wrkg260SxRXSfeuqpsP77778ftmWQ\nJWrgkWq2oUYb6R42bFgq4LFXHLZHjBFgtqV2u2vXrmE9pjkWzXuQavZF05rc8y31OKy7ZMmSsO7r\nr78e9s+6/KiguUxc9sYbb4Tpa665JvzlINtWn+uneRAiH5fxgyS7zwEDBoRlCD3nQROljz/+uOT8\n517Fv7IgNtTaV2JzHMXepNiL+OwVUexbsHDGlyW16vUR+9x+7JF1PgKN6yDM1IQjttRMX3HFFem6\nF110UZBfhJumO+3atQvz+T8SnLs9beER4Lg9H8jSTSQ928TjDRkyJAg/Nfr5xL6U48T1+QEQj8W6\nCH1cNnbs2FpNgtiWmnnOK86/4IIL0mVs96c//SldxrVwTWzDXweYx4ewpeY/9yorOS+//HI4ji8X\nxV6xN3ZFjF8xdtuo2MeXJRJaqlQ2JlGzTsrKPzXbUf7r2p518tVsI8j8cOAj3Xzb1fc4JJrg0Ha9\nvstyrzGbaIrER7r59lffvOSexf7s+VFADzu+XJpH7B31uDKSYi9i/Iqxq9gXgbbevChvvvnmIMct\nnag1pwkNst7QfSxfvjzkEc1lkPbmOk6lJe4Z946/LiA39K/vy6XlxZ6Y+vnPf17jrzgkRnImHksR\n1vgBdDXKdhx9mR6bil1LU1yjYi9i/Iqxq9gXYcKECeFFSTOWcsgpNduIeWP2QQ04/crTy05zHqfS\nEveMe8cYBLE5znfffefLpRnEvpRRmOlilR/KNJPiL0RXXnll8p//+Z91jkpc39GHKy1lR4gudC1N\ndY2KvYjxK8auYl+E2CPOiBEjwsvXVD2JexZ7xqnUdvZtRez5sJvmVNn53A9qsmk2xXQc0Iz8uOGG\nG8IPUuZnRx/mQ3QGSos/BuJoxkzzPcmll14a/lLDdx98iM3H048++mjYvnPnzuEYueeXux37LHQu\n1LpnR4jmo/d47ELnRY19FPvstfDXingOufOzIztz/B07dij2IsaviGLfWGKPOLwcleXqStyzbM84\n9KzDXy18uTS92Nc1WBvCyncO1F7TheqMGTPCvNtvvz0dVCyOPEyNPlIcP9jOjj5Mk7FCoxcXGiEZ\nYee4jEQcR0HON+py3C5O5zuXQiNEFxtVOTsQW6GRlLPz2bbQyM51Dc6m2IsYv2LsKvYliD01aPQm\nk5vosrJ9+/ahVjLf8mx66aWXQneWxdbhBU9bd2SoPvtuylSu45aaSslHEvcsK/aV+AFtWxH73B6i\nSIxTQC0+6/BRN6JPzThdnMbuV+kZKTv6cLHRi3NHSM43nd0232jQdZ1LoRGii51X9v+FRlLOzi82\nsrNiL2L8irGr2DcCepIpJva8tM8444w6JZiXM21o6cKy2HosZ7RX/k9zgFL23dSp1GsqRyo1H7Ni\n361bt1RwJk6c6MulDGKPtPJjjOk41sEzzzyTrpPt6jSbuGdxe0S7LoFGyFk/LsvWdOduG1PudsXO\nhX1lR4jm+UCtfqlin72WfHnE/Oeffz40H8ouo1mOYi9i/Ioo9k0kLllhnDp1anLkkUeGRM8eiGOU\n4KVLl6YDQV133XXJ9u3bw/zf/va3af/stJel1pntmXf22WcnixYtCutRK/i73/0u7I+a8yjY9Czy\n2GOPpdfLoFD5xLvQfpELPlR8+OGH0z71OddSrimmYudAbXjsA582wfG6+ZGSzQ+awsTzoVaS5hEc\nk1rRQnmXTbn5WGj/MeWKDl1fFoOPbn251L98lDIKMwOnxXnUfHPdNJeJoxnH7lZJMXbYJjuKc7HR\ni3NHSM43HdfNHXU5d2TlQudSaITous4r/r/QiNTZ+cVGdq5rxGXFXsT4FWNXsS9BXJBaUmy3i5gs\nW7YsvMyRYF70mzZtSj+oo20s0kqTFmqZqaWkDS1iiWyz3pQpU8J6fDjHerzAaSqCzMemOPH/tElm\newRi3rx5YXtkI54XCTEutF/2xbIbb7wx/CUA+Y7nXeyasvsvdA6xTTLXTVvm8847L+w/HjPOv+qq\nq5ITTzwx5EdcRh7993//d9hnobzLnkM2H8mrQvuP6+eKDjX2+XrGYaTcLl26tPiDvq2KPZLLx6z8\nGIxN0MgH7iv3bcyYMWGaH280eYmjOMdmMcQf+4ujF+cKdD6RLyb22fnFzoVY5Vz4ixHXxTUg9vwg\nL+W8stfCdcdzyM6Pzwc+/uUYcWRnesxR7EWMXzF2FfsmFHuaD8TabKYRWwQUCaa/dF7OfAhIswM+\n9OPc+BiOFzfSyXwkYM6cOWF7esB45ZVX0n1kZT77f/ZNzfa0adOCONALR6701rVftqcWnOXZfRe7\npuz+C50D22fX5zwmT55ca780M2B7JDr3fIrlXfYcsvlYbP+FxD7b5eUPP/wQfgSdcMIJNZpc+HKp\nf/moaxTmKPa5ox1z7TR9yR15mOZWSG4cXC2OPozsFhq9OHeE5Lqm840AHecVOpdCI0QXG1U5u/9C\nIynnzi82snOxpNiLGL9i7Cr2JYgL8kgaPXp06B89TkdBpmYt+zLOJkSZP7EjpIgrcvrggw/WWAdB\nZR8Ibdxf9v9sQ7eNcf3LL788CHQ8D1Jd++X4rMO62X0Xu6bc/ec7B2o077jjjhrrkpj/0EMPpdPk\nwSmnnBLyg+Mj8sxjWbG8y+4zm4/F9h/n5RN7fpDQpOiII45Ij0Mba8W+ecS+PimOPIzoFht9uNjo\nxS1xLoWOX+p5FRpJOTu/2OjNir2I8SvGrmLfRGJPk484zaBOWUGmX25qKEm84OkeDwmNQsqf8+n1\n4uijjw7NXuLAULHJTCGxp19smrywH2r0mJ+VWlJd+43/zyf2ha4pu/9C5xCvGxFiPcSZ2kv6ke/V\nq1cN8Ubmo9hnz6dY3uUTe/KRbQrtP5/Y8+OBbwuyPxzOOeec8NeFcj3oFXtTUybFXsT4FWNXsa+H\n2Me+q2lLy5/g6WM61orH3j4QRWra6BObaT62oxkC0km7XeYjp4go4sqf81nGn/lp755P7BkUh3X4\neI/taMObK/aIbqH9ZveVK/bFrim7/0LnwA8BtqcPbuZTe8/2CHZ2/tChQ8MPD46Rez7F8i57Dtl8\npFlGof3niv1ZZ51VQ+h79uwZmvnkiyVT/RL525pGLK7mpNiLGL9i7Cr2JYg9tdExMRptVmy6du0a\naplZRld1cf5hhx0WBJT5CCwflDKfdY499th0vfvvvz+sS08xfNgaPxrN/p8a6l/96lfpNhdeeGEQ\n7Ox5Iaql7Jd1c6eLXVNMxc4he92cA+fC/PjhIYn27/yIyHf8YnmXTdl85HuCQvuPKd6/7LXRZnrg\nwIG1RqFV0hV7xV4xEuVIRLFvY2JPooaYmuHc+XEZH4UiofmWZUWZ2ul8+yiUqLEmFVunIfut65pK\nOYd43Q3db115Vygfi+0/3j8+JKaW/l/+5V9qSOktt9yS1tzbFKfh5cORjisjKfYixq8Yu4p9EejT\nnRclPa0gm6bqSdwz7l2PHj1SwaGP8MGDB9fqCYe/Pij2rVfs6U6VnmnoKYm/FtGlK021GrNPxozg\nB6ViL6IciSj2VVI4+/fvr9hXudhfe+21NfqxZxnQ1WXsu97uLlu32MdvOhB7/trE9x+N2R8xRJMu\n9qXYiyhHIop9lYn99OnTleUqS9yzYmIfoZ/xW2+9VbFvhNjnjhBczpRvFOTsKM7Z0Z2LjRZdbLTm\n7AjIlXTtir2I8SvGrmJfhAkTJoQXJaObxq4YTdWRuGfcu0GDBhUV+wgfHyL4vlyqV+zjCLCMEMsA\nWNlRkKPY0xQn/p9el+L6dOcaRzwmRuJoyIzWTI0/zfLigGgIPqPB8uNRsRdRjkQU+yoTe9plK8vV\nlbhnuWL/6quvpiPP+nJpOrHPjg5czlRoFORiIzoXGvG42GjN2RGQK+Xa8420rNiLGL9i7Cr2GbZt\n2xZelNTaxVElTdWRuGfcO+QtW2Ov2LdesR87dmwYRyF3fiGxz3axmk18n8F6yDs/EnP38cEHH4Rl\nUfoVexHlSESxr4LCyUudF+UFF1xQNUKLgND8APlgmlrIOE03mI888kiabwzqFNejD/hTTjklzKdd\n+qZNm9L90QSBpgjUYFZLPnDPuHeTJk1S7NuI2FNjT/MbmsswTQwzCjKjMecT+7h+/C6D8s6Ix7Fd\nfrb2P5/YW2OvGIlyJKLYV1nhjC9LPqZDjCs9MYrr6aefHvp3z52eOnVqGJ2VEW5nzpyZDvTEtfF/\nRpflY1Ikng8Qd+/enY4syzyWV0MecD35JIemOL5cmr5sZEcHLmcqNAryypUr05GOs6M7FxvxuNho\nzdkRkCvl2rMjLSv2IsavGLuKfQFizzjTpk2rCqmldjIr9tlpRmql1p0Bm2hmhAAj78xnxNiNGzcm\nW7ZsCduQrwgRssQ21H5Ww/WTuFe5PeKQEDhfLq1X7EkvvPBCmq/INz9UkfL4UWz2/7nr04UlH8RG\nkc+ul52m1j6OgKzYiyhHIop9FRXO+AEt3d5Vu9gj8bGrPtJll10WxIe2yfnaGtMsge2RfpodVIvY\nc69yP5ylG0R+qPhyaXqxr+8ox82dCo2C3NgRj4uNgFwJSbEXMX7F2FXs64AeMnhZ0qc1bWsrPfEi\nP/nkk4PEM7148eIg9nv27AldANKNH5JOcwXm/+EPf0hGjBgRRuZkGxJNDWbMmBFq8BF7rp/tq+H6\nSdwrzpmmFVFuaHrEXyN8ubR+sW+rSbEXMX7F2FXs6+Cnn35KX5hbt26teKmlVpo8oTkKfXMj7Bdd\ndFEQcz6Wpfad+Tt27AgfDiL29ALCNnxounPnztCvN9N0Fxhr/KtF7LlH8X7NmzcvlZuXX345jM7p\ny6Xpxd4B0SojKfYixq8Yu4p9CfDhKC/MP/3pT+HP75WcEPB77703zRtGzOzSpUuoieejQJrfxGX0\nHIPks122Oc5hhx0W2qMzn8F4uHa2r/RrJ3GPON8ePXrUkBvEvpJ6xFHsTYq9iM9eEcW+DIWTZim8\nMOlloxrklsTHsaT6LKOJDh/J8uOgWq4zN3GP4qBildwjjmJvUuxFfPaKKPZlKJxff/11+tKk1hvx\nNVVe4t7E+0RXhJX84WxrEntHOq6MpNiLGL9i7Cr2JRKb44wfP16JrtDEvcnXDAfJr7T29Yq9SbEX\n8dkrotiXqXDG5jj0uKJEV2aKveHka4bz448/+nJpJrGvltGIW3tS7EWMXzF2FfsSyfaOw4iVsWtI\nU2Uk7km+3nBIjK7ry0WxV+yNXRHjV4xdxT6F7iJ5cQ4cOFCZrrDEPeHe/OY3v6nVDId++X25KPaK\nvbErYvyKsavYp2TbsTLQE8JoKn/iXsT7Ql/81dAMpzWJfbWMSNzak2IvYvyKsavY15P+/fuHlyd9\nxSvVlZG4F9yTa6+9tobQLFy4MFmwYIEvF8VesTd2RYxfMXYV+9rQ/7u19pVZWz9u3LhatfWHDh3y\n5dLMYl8NIxK3haTYixi/Yuwq9g0g1tr369cv2blzp6mMiXuQr7aeNH36dF8uir1ib+yKGL9i7Cr2\nhckOWDV79mwFu0yJvM83IFX8aJbmCb5cFHvF3tgVMX7F2FXsizJq1KjwEu3evbuSXaZE3nMP7r77\n7loyg/T/85//9OXSAmK/d+9eUwUkxV7E+BVjV7FvIPRrf+GFF4YX6bBhwxTtFk7kOXnfqVOnWv3W\nU1tPF5i+XBR7xV6xFzF+xdhV7Eti8eLF6cuU/yvcLZOy+T58+PC8besrvba+NYm9ox5XRlLsRYxf\nMXYV+0YSP6SlWcjGjRsV72ZO5HFsgpPvg1lq6w8ePOjLRbFX7BV7EeNXjF3Fvn5km+TYS07L9YKT\nrwkO/dYvW7bMl4tir9gr9iLGrxi7in3DyPZtP3LkSAW8mRJ5W6jPetLLL7+cfPfdd75cWljs+Z7B\nVP6k2IsYv2LsKvZNxIQJE+wCs4W6thw0aFAteZk5c2ZVfDCr2JsUexGfvSKKfRUUToSTF+v555/v\nx7RN/LEseUre9u3bt5a40ARn0aJFVfHBbGsUe0dAroyk2IsYv2LsKvZNCO3te/fu7ce0zfSxbI8e\nPWq1qydNnTo1+fHHHy2gir1ir9iLGL9i7Cr2TSv38WPaq6++WrlvpNSTh4U+lo294Hz22WcW0DKK\nvbFaGUmxFzF+xdhV7JuB/fv3K/dNLPWTJk3K266e9Sygir1JsRcxfsXYVexbRO5tc9/wNvWFpH7u\n3LmhXb0FtPxib6qspNiLGL9i7Cr2zST3sc29cl9/qadNfT6p52NZxL7aPpZV7E2KvYjPXhHFvooL\nJ23ue/Xqpdw3QOrztalH6qv1Y9m28HIZOnRorXtmKm8ydkWMXzF2FftmlHv7uc/fT31bknrF3qTY\ni/jsFVHsq7RwZuWe9MILLyj0/5/Ii5gvhaSepjfTp09vNVLfWl8uEydONFVQUuxFjF8xdhX7ZpT7\nIUOGpBLbr1+/Nt1jDtdOHsT8+M1vflNQ6qtxACpfLuLLRcT4FVHsW3nhfPrpp0NvL3Egq7bY7p5r\njgNPkRd333133mYErVXqfbmIsSti/Ioo9q2kcO7duzfp2rVrWls9cuTINlF7zzVyrfG6u3Xrlrfn\nm9Yu9b5cxNgVMX5FFPtWVDi///775Lrrrkslt7XX3mdr6UnXXntt3qY3pJdffjlZuXJlq5V6Xy5i\n7IoYvyKKfSssnGPHjk06duyYCu+9996brFmzptUIPdfCNcXro+nN8OHD8wo9Pd+MHz++qkeU9eUi\nxq6I8Sui2Lfhwvnxxx+Hj0ej/NL1IzJczc1zOHeuIXZjSaItfaFa+vnz54fuLL/99lsLqIixK2L8\niij21cs//vGP0EXdlVdeWUvwq6kGP9bQZ4WeZjeF2tLHpje0pycPLKAixq6I8Sui2Fc9tCmnpnvY\nsGHJ5ZdfXmOo+D59+lR0//ecG+eYPWf6pR83blxBoecDWaSea27N7el9uYixK2L8iij2bbRwMhAT\n0vvkk0/WaKITP7J98MEHK2IEW86Bc8l+FBv7pC8m9KRXX301XGNrGnTK+BVjV8T4FVHsLZx5OXjw\nYDJ58uRkxIgRyaBBg0L3kFmBprkLgzxRW94SzXU4BsfimNmmNrHrSs6xWJOb2OyGa+LaLKC+XMTY\nFTF+RRT7NlM4aaLy3nvvBWGmlhvJp0Y8V/Kj6NMchlp0+ounRr0hws82bMs+2Bf7zBX5KPOcC+sV\nk3l6u+HcuQaupa01u/HlIsauiPErothbOFP4sHTHjh1BjvnIll5k+P/gwYPDx6n5RL+pE8fgWByz\nrpr52NMN58q6nHtb+jjW+BVjV8T4FVHsLZxFobabZiwzZ84M7dipCY8ijUBTe06TmL59+wYJp9/4\n+go827At+2Bf7LMUkc+2n+fcOEfO1Rp641eMXRHjV0Sxt3AW4bvvvku2bNkSBnWi7TpCTS15qQLe\nVIljcmzOgXPhnDg3MX7F2BUxfkUUewtnPWFgJ4R6zpw5ofkLCdGm1rypRZ59su94HI7JsdvK4FLG\nrxi7xq4YvyKKvYWzRaALSSSbD1VXrlwZ5Jua9CjiDU1xH+yTfXOMttpdpfErxq6I8Sui2Fs4ywIf\nrtI85tChQ8mBAwfqldiGbf341fgVMXbF+BVR7C2cIsavGLsixq+IYm/hFAuoiLErYvyKsavYi/hy\nETF2xfg1fsXYVexFjF8RY1eMXxHF3sIpYvyKsSti/Ioo9hZOsYCKGLsixq8Yu4q9iC8XEWNXxPgV\nY1exFzF+RYxdMX5FFHsLp4jxK8auiPErothbOMUCKmLsihi/Ioq9iC8XEWNXxPgVY1exFzF+RYxd\nMX5FFPsWvECTyWQymUwmk6ktJMXeZDKZTCaTyWRS7CtX7EVERERERLEXEREREVHsRUREREREsRcR\nEREREcVeREREREQUexERERERxV5ERERERBR7ERERERFR7EVERERERLEXERERERHFXkREREREsRcR\nEREREcVeREREREQUexERERERUexFRERERBR7ERERERFR7EVERERERLEXERERERHFXkRERESk9fF/\nYPl9GgY8LikAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.core.display import Image \n", "Image(filename='/Users/chengjun/GitHub/cjc2016/figure/recsys_arch.png')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The CourseTalk dataset: loading and first look\n", "\n", "Loading of the CourseTalk database.\n", "\n", "The CourseTalk data is spread across three files. Using the `pd.read_table`\n", "method we load each file:\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user_idcourse_idrating
0115
1215
2315
3415
4515
5615
6715
7815
8915
91015
\n", "
" ], "text/plain": [ " user_id course_id rating\n", "0 1 1 5\n", "1 2 1 5\n", "2 3 1 5\n", "3 4 1 5\n", "4 5 1 5\n", "5 6 1 5\n", "6 7 1 5\n", "7 8 1 5\n", "8 9 1 5\n", "9 10 1 5" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "unames = ['user_id', 'username']\n", "users = pd.read_table('/Users/chengjun/GitHub/cjc2016/data/users_set.dat',\n", " sep='|', header=None, names=unames)\n", "\n", "rnames = ['user_id', 'course_id', 'rating']\n", "ratings = pd.read_table('/Users/chengjun/GitHub/cjc2016/data/ratings.dat',\n", " sep='|', header=None, names=rnames)\n", "\n", "mnames = ['course_id', 'title', 'avg_rating', 'workload', 'university', 'difficulty', 'provider']\n", "courses = pd.read_table('/Users/chengjun/GitHub/cjc2016/data/cursos.dat',\n", " sep='|', header=None, names=mnames)\n", "\n", "# show how one of them looks\n", "ratings.head(10)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user_idusername
01patrickdijusto1
12natalya_ivanova
23justineittreim
34ronmay
45paulstock
\n", "
" ], "text/plain": [ " user_id username\n", "0 1 patrickdijusto1\n", "1 2 natalya_ivanova\n", "2 3 justineittreim\n", "3 4 ronmay\n", "4 5 paulstock" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show how one of them looks\n", "users[:5]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
course_idtitleavg_ratingworkloaduniversitydifficultyprovider
01An Introduction to Interactive Programming in ...4.97-10 hours/weekRice UniversityMediumcoursera
12Modern & Contemporary American Poetry4.95-9 hours/weekUniversity of PennsylvaniaEasy/mediumcoursera
23A Beginner's Guide to Irrational Behavior4.97-10 hours/weekDuke UniversityMediumcoursera
34Design: Creation of Artifacts in Society4.95-10 hours/weekUniversity of PennsylvaniaMediumcoursera
45Greek and Roman Mythology4.98-10 hours/weekUniversity of PennsylvaniaMediumcoursera
\n", "
" ], "text/plain": [ " course_id title avg_rating \\\n", "0 1 An Introduction to Interactive Programming in ... 4.9 \n", "1 2 Modern & Contemporary American Poetry 4.9 \n", "2 3 A Beginner's Guide to Irrational Behavior 4.9 \n", "3 4 Design: Creation of Artifacts in Society 4.9 \n", "4 5 Greek and Roman Mythology 4.9 \n", "\n", " workload university difficulty provider \n", "0 7-10 hours/week Rice University Medium coursera \n", "1 5-9 hours/week University of Pennsylvania Easy/medium coursera \n", "2 7-10 hours/week Duke University Medium coursera \n", "3 5-10 hours/week University of Pennsylvania Medium coursera \n", "4 8-10 hours/week University of Pennsylvania Medium coursera " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "courses[:5]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using `pd.merge` we get it all into one big DataFrame." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user_idcourse_idratingtitleavg_ratingworkloaduniversitydifficultyproviderusername
0115.0An Introduction to Interactive Programming in ...4.97-10 hours/weekRice UniversityMediumcourserapatrickdijusto1
1215.0An Introduction to Interactive Programming in ...4.97-10 hours/weekRice UniversityMediumcourseranatalya_ivanova
2315.0An Introduction to Interactive Programming in ...4.97-10 hours/weekRice UniversityMediumcourserajustineittreim
3415.0An Introduction to Interactive Programming in ...4.97-10 hours/weekRice UniversityMediumcourseraronmay
4515.0An Introduction to Interactive Programming in ...4.97-10 hours/weekRice UniversityMediumcourserapaulstock
5615.0An Introduction to Interactive Programming in ...4.97-10 hours/weekRice UniversityMediumcourseraboyarsky
66114.5Functional Programming Principles in Scala4.85-7 hours/weekEcole Polytechnique Federale de LausanneMedium/hardcourseraboyarsky
76124.0Gamification4.84-8 hours/weekUniversity of PennsylvaniaEasy/mediumcourseraboyarsky
86195.0M101P: MongoDB for Developers4.7TBANaNMediumNoneboyarsky
96215.06.002x: Circuits and Electronics4.712 hours/week.MITMedium/hardedxboyarsky
106325.0Internet History, Technology, and Security4.63-5 hours/weekUniversity of MichiganEasycourseraboyarsky
116334.0Web Development4.6Self-pacedNaNEasy/mediumudacityboyarsky
126935.0CS-169.1x: Software as a Service4.2TBAUC BerkeleyMediumedxboyarsky
1361085.0Human-Computer Interaction4.110-12 hours/weekStanford UniversityEasy/mediumcourseraboyarsky
1461342.0Web Intelligence and Big Data3.93-4 hours/weekIndian Institute of Technology DelhiMediumcourseraboyarsky
1561414.0Coding the Matrix: Linear Algebra through Comp...3.87-10 hours/weekBrown UniversityMedium/hardcourseraboyarsky
1661454.0Game Theory3.85-7 hours/weekStanford UniversityMediumcourseraboyarsky
1761982.0Software Testing2.9Self-pacedNaNEasyudacityboyarsky
18715.0An Introduction to Interactive Programming in ...4.97-10 hours/weekRice UniversityMediumcourserabarak
19815.0An Introduction to Interactive Programming in ...4.97-10 hours/weekRice UniversityMediumcourseraalexjeffrey
20915.0An Introduction to Interactive Programming in ...4.97-10 hours/weekRice UniversityMediumcourseracelsoagustinhernandezdiaz
211015.0An Introduction to Interactive Programming in ...4.97-10 hours/weekRice UniversityMediumcourseravadimsolomonik
2210145.0An Introduction to Operations Management4.85-7 hours/weekUniversity of PennsylvaniaMediumcourseravadimsolomonik
2310355.0Model Thinking4.54-8 hours/weekUniversity of MichiganEasy/mediumcourseravadimsolomonik
2410495.0Fantasy and Science Fiction: The Human Mind, O...4.58-12 hours/weekUniversity of MichiganMediumcourseravadimsolomonik
2510874.0Networked Life4.2In sessionUniversity of PennsylvaniaEasy/mediumcourseravadimsolomonik
26101425.0Social Network Analysis3.85-7 hours/week (8-10 if completing additional ...University of MichiganMediumcourseravadimsolomonik
27101881.0Computational Investing, Part I3.28-12 hours/weekGeorgia Institute of TechnologyMediumcourseravadimsolomonik
281113.5An Introduction to Interactive Programming in ...4.97-10 hours/weekRice UniversityMediumcourseraCrunchyCookie
291215.0An Introduction to Interactive Programming in ...4.97-10 hours/weekRice UniversityMediumcourseraskywalking
.................................
274319881883.0Computational Investing, Part I3.28-12 hours/weekGeorgia Institute of TechnologyMediumcourseraalanwilliams
274419891881.0Computational Investing, Part I3.28-12 hours/weekGeorgia Institute of TechnologyMediumcourseraLyon
274519901881.5Computational Investing, Part I3.28-12 hours/weekGeorgia Institute of TechnologyMediumcourserafernandomontenegro
274619911884.5Computational Investing, Part I3.28-12 hours/weekGeorgia Institute of TechnologyMediumcourseralemic
274719921885.0Computational Investing, Part I3.28-12 hours/weekGeorgia Institute of TechnologyMediumcourseraandreamitchell
274819931894.5CB22x: The Ancient Greek Hero3.1TBAHarvard UniversityEasy/mediumedxmegkawento
274919941890.5CB22x: The Ancient Greek Hero3.1TBAHarvard UniversityEasy/mediumedxanonymous
275019951892.0CB22x: The Ancient Greek Hero3.1TBAHarvard UniversityEasy/mediumedxanonymous
275119961895.0CB22x: The Ancient Greek Hero3.1TBAHarvard UniversityEasy/mediumedxanonymous
275219971904.0Introduction to Systems Biology3.16-8 hours/weekMount Sinai School of MedicineMedium/hardcourseraanonymous
275319981921.0Property and Liability: An Introduction to Law...3.02-4 hours/weekWesleyan UniversityEasy/mediumcourseraecholearning
275419991933.0Physics3.0Self-pacedNaNMediumkhanacademyanonymous
275520001963.0Poetry: What It Is, and How to Understand It3.0Self-pacedNaNMediumudemymarcianuffer
275620011973.0Principles of Obesity Economics2.93-5 hours/weekJohns Hopkins UniversityEasycourserairvwiswall
275720021983.5Software Testing2.9Self-pacedNaNEasyudacityivandutoit
275820032001.0Introduction to Logic2.85-7 hours/weekStanford UniversityMediumcourserallewellynfalco1
275920042004.5Introduction to Logic2.85-7 hours/weekStanford UniversityMediumcourseraanonymous
276020052001.5Introduction to Logic2.85-7 hours/weekStanford UniversityMediumcourseracaleesarya
276120062001.0Introduction to Logic2.85-7 hours/weekStanford UniversityMediumcourseranathanhall
276220072005.0Introduction to Logic2.85-7 hours/weekStanford UniversityMediumcourseravaleria
276320082052.0Preparation for Introductory Biology: DNA to O...2.48-10 hours/weekUC IrvineHardcourserastuartwilloughby
276420092071.5Computer Architecture2.25-8 hours/weekPrinceton UniversityHardcourserajonsnow
276520102120.5HTML5 Game Development1.8Self-pacedNaNMediumudacityanonymous
276620112123.0HTML5 Game Development1.8Self-pacedNaNMediumudacityflorianschaetz
276720122121.0HTML5 Game Development1.8Self-pacedNaNMediumudacityanonymous
276820132121.0HTML5 Game Development1.8Self-pacedNaNMediumudacityanonymous
276920142130.5A New History for a New China, 1700-2000: New ...1.43-4 hours/weekThe Hong Kong University of Science and Techno...Medium/hardcourserachihchengyuan1
277020152130.5A New History for a New China, 1700-2000: New ...1.43-4 hours/weekThe Hong Kong University of Science and Techno...Medium/hardcourserakj
277120162141.0Sports and Society1.33-5 hours/weekDuke UniversityEasycourseradebbie
277220172140.5Sports and Society1.33-5 hours/weekDuke UniversityEasycourserakuba
\n", "

2773 rows Ă— 10 columns

\n", "
" ], "text/plain": [ " user_id course_id rating \\\n", "0 1 1 5.0 \n", "1 2 1 5.0 \n", "2 3 1 5.0 \n", "3 4 1 5.0 \n", "4 5 1 5.0 \n", "5 6 1 5.0 \n", "6 6 11 4.5 \n", "7 6 12 4.0 \n", "8 6 19 5.0 \n", "9 6 21 5.0 \n", "10 6 32 5.0 \n", "11 6 33 4.0 \n", "12 6 93 5.0 \n", "13 6 108 5.0 \n", "14 6 134 2.0 \n", "15 6 141 4.0 \n", "16 6 145 4.0 \n", "17 6 198 2.0 \n", "18 7 1 5.0 \n", "19 8 1 5.0 \n", "20 9 1 5.0 \n", "21 10 1 5.0 \n", "22 10 14 5.0 \n", "23 10 35 5.0 \n", "24 10 49 5.0 \n", "25 10 87 4.0 \n", "26 10 142 5.0 \n", "27 10 188 1.0 \n", "28 11 1 3.5 \n", "29 12 1 5.0 \n", "... ... ... ... \n", "2743 1988 188 3.0 \n", "2744 1989 188 1.0 \n", "2745 1990 188 1.5 \n", "2746 1991 188 4.5 \n", "2747 1992 188 5.0 \n", "2748 1993 189 4.5 \n", "2749 1994 189 0.5 \n", "2750 1995 189 2.0 \n", "2751 1996 189 5.0 \n", "2752 1997 190 4.0 \n", "2753 1998 192 1.0 \n", "2754 1999 193 3.0 \n", "2755 2000 196 3.0 \n", "2756 2001 197 3.0 \n", "2757 2002 198 3.5 \n", "2758 2003 200 1.0 \n", "2759 2004 200 4.5 \n", "2760 2005 200 1.5 \n", "2761 2006 200 1.0 \n", "2762 2007 200 5.0 \n", "2763 2008 205 2.0 \n", "2764 2009 207 1.5 \n", "2765 2010 212 0.5 \n", "2766 2011 212 3.0 \n", "2767 2012 212 1.0 \n", "2768 2013 212 1.0 \n", "2769 2014 213 0.5 \n", "2770 2015 213 0.5 \n", "2771 2016 214 1.0 \n", "2772 2017 214 0.5 \n", "\n", " title avg_rating \\\n", "0 An Introduction to Interactive Programming in ... 4.9 \n", "1 An Introduction to Interactive Programming in ... 4.9 \n", "2 An Introduction to Interactive Programming in ... 4.9 \n", "3 An Introduction to Interactive Programming in ... 4.9 \n", "4 An Introduction to Interactive Programming in ... 4.9 \n", "5 An Introduction to Interactive Programming in ... 4.9 \n", "6 Functional Programming Principles in Scala 4.8 \n", "7 Gamification 4.8 \n", "8 M101P: MongoDB for Developers 4.7 \n", "9 6.002x: Circuits and Electronics 4.7 \n", "10 Internet History, Technology, and Security 4.6 \n", "11 Web Development 4.6 \n", "12 CS-169.1x: Software as a Service 4.2 \n", "13 Human-Computer Interaction 4.1 \n", "14 Web Intelligence and Big Data 3.9 \n", "15 Coding the Matrix: Linear Algebra through Comp... 3.8 \n", "16 Game Theory 3.8 \n", "17 Software Testing 2.9 \n", "18 An Introduction to Interactive Programming in ... 4.9 \n", "19 An Introduction to Interactive Programming in ... 4.9 \n", "20 An Introduction to Interactive Programming in ... 4.9 \n", "21 An Introduction to Interactive Programming in ... 4.9 \n", "22 An Introduction to Operations Management 4.8 \n", "23 Model Thinking 4.5 \n", "24 Fantasy and Science Fiction: The Human Mind, O... 4.5 \n", "25 Networked Life 4.2 \n", "26 Social Network Analysis 3.8 \n", "27 Computational Investing, Part I 3.2 \n", "28 An Introduction to Interactive Programming in ... 4.9 \n", "29 An Introduction to Interactive Programming in ... 4.9 \n", "... ... ... \n", "2743 Computational Investing, Part I 3.2 \n", "2744 Computational Investing, Part I 3.2 \n", "2745 Computational Investing, Part I 3.2 \n", "2746 Computational Investing, Part I 3.2 \n", "2747 Computational Investing, Part I 3.2 \n", "2748 CB22x: The Ancient Greek Hero 3.1 \n", "2749 CB22x: The Ancient Greek Hero 3.1 \n", "2750 CB22x: The Ancient Greek Hero 3.1 \n", "2751 CB22x: The Ancient Greek Hero 3.1 \n", "2752 Introduction to Systems Biology 3.1 \n", "2753 Property and Liability: An Introduction to Law... 3.0 \n", "2754 Physics 3.0 \n", "2755 Poetry: What It Is, and How to Understand It 3.0 \n", "2756 Principles of Obesity Economics 2.9 \n", "2757 Software Testing 2.9 \n", "2758 Introduction to Logic 2.8 \n", "2759 Introduction to Logic 2.8 \n", "2760 Introduction to Logic 2.8 \n", "2761 Introduction to Logic 2.8 \n", "2762 Introduction to Logic 2.8 \n", "2763 Preparation for Introductory Biology: DNA to O... 2.4 \n", "2764 Computer Architecture 2.2 \n", "2765 HTML5 Game Development 1.8 \n", "2766 HTML5 Game Development 1.8 \n", "2767 HTML5 Game Development 1.8 \n", "2768 HTML5 Game Development 1.8 \n", "2769 A New History for a New China, 1700-2000: New ... 1.4 \n", "2770 A New History for a New China, 1700-2000: New ... 1.4 \n", "2771 Sports and Society 1.3 \n", "2772 Sports and Society 1.3 \n", "\n", " workload \\\n", "0 7-10 hours/week \n", "1 7-10 hours/week \n", "2 7-10 hours/week \n", "3 7-10 hours/week \n", "4 7-10 hours/week \n", "5 7-10 hours/week \n", "6 5-7 hours/week \n", "7 4-8 hours/week \n", "8 TBA \n", "9 12 hours/week. \n", "10 3-5 hours/week \n", "11 Self-paced \n", "12 TBA \n", "13 10-12 hours/week \n", "14 3-4 hours/week \n", "15 7-10 hours/week \n", "16 5-7 hours/week \n", "17 Self-paced \n", "18 7-10 hours/week \n", "19 7-10 hours/week \n", "20 7-10 hours/week \n", "21 7-10 hours/week \n", "22 5-7 hours/week \n", "23 4-8 hours/week \n", "24 8-12 hours/week \n", "25 In session \n", "26 5-7 hours/week (8-10 if completing additional ... \n", "27 8-12 hours/week \n", "28 7-10 hours/week \n", "29 7-10 hours/week \n", "... ... \n", "2743 8-12 hours/week \n", "2744 8-12 hours/week \n", "2745 8-12 hours/week \n", "2746 8-12 hours/week \n", "2747 8-12 hours/week \n", "2748 TBA \n", "2749 TBA \n", "2750 TBA \n", "2751 TBA \n", "2752 6-8 hours/week \n", "2753 2-4 hours/week \n", "2754 Self-paced \n", "2755 Self-paced \n", "2756 3-5 hours/week \n", "2757 Self-paced \n", "2758 5-7 hours/week \n", "2759 5-7 hours/week \n", "2760 5-7 hours/week \n", "2761 5-7 hours/week \n", "2762 5-7 hours/week \n", "2763 8-10 hours/week \n", "2764 5-8 hours/week \n", "2765 Self-paced \n", "2766 Self-paced \n", "2767 Self-paced \n", "2768 Self-paced \n", "2769 3-4 hours/week \n", "2770 3-4 hours/week \n", "2771 3-5 hours/week \n", "2772 3-5 hours/week \n", "\n", " university difficulty \\\n", "0 Rice University Medium \n", "1 Rice University Medium \n", "2 Rice University Medium \n", "3 Rice University Medium \n", "4 Rice University Medium \n", "5 Rice University Medium \n", "6 Ecole Polytechnique Federale de Lausanne Medium/hard \n", "7 University of Pennsylvania Easy/medium \n", "8 NaN Medium \n", "9 MIT Medium/hard \n", "10 University of Michigan Easy \n", "11 NaN Easy/medium \n", "12 UC Berkeley Medium \n", "13 Stanford University Easy/medium \n", "14 Indian Institute of Technology Delhi Medium \n", "15 Brown University Medium/hard \n", "16 Stanford University Medium \n", "17 NaN Easy \n", "18 Rice University Medium \n", "19 Rice University Medium \n", "20 Rice University Medium \n", "21 Rice University Medium \n", "22 University of Pennsylvania Medium \n", "23 University of Michigan Easy/medium \n", "24 University of Michigan Medium \n", "25 University of Pennsylvania Easy/medium \n", "26 University of Michigan Medium \n", "27 Georgia Institute of Technology Medium \n", "28 Rice University Medium \n", "29 Rice University Medium \n", "... ... ... \n", "2743 Georgia Institute of Technology Medium \n", "2744 Georgia Institute of Technology Medium \n", "2745 Georgia Institute of Technology Medium \n", "2746 Georgia Institute of Technology Medium \n", "2747 Georgia Institute of Technology Medium \n", "2748 Harvard University Easy/medium \n", "2749 Harvard University Easy/medium \n", "2750 Harvard University Easy/medium \n", "2751 Harvard University Easy/medium \n", "2752 Mount Sinai School of Medicine Medium/hard \n", "2753 Wesleyan University Easy/medium \n", "2754 NaN Medium \n", "2755 NaN Medium \n", "2756 Johns Hopkins University Easy \n", "2757 NaN Easy \n", "2758 Stanford University Medium \n", "2759 Stanford University Medium \n", "2760 Stanford University Medium \n", "2761 Stanford University Medium \n", "2762 Stanford University Medium \n", "2763 UC Irvine Hard \n", "2764 Princeton University Hard \n", "2765 NaN Medium \n", "2766 NaN Medium \n", "2767 NaN Medium \n", "2768 NaN Medium \n", "2769 The Hong Kong University of Science and Techno... Medium/hard \n", "2770 The Hong Kong University of Science and Techno... Medium/hard \n", "2771 Duke University Easy \n", "2772 Duke University Easy \n", "\n", " provider username \n", "0 coursera patrickdijusto1 \n", "1 coursera natalya_ivanova \n", "2 coursera justineittreim \n", "3 coursera ronmay \n", "4 coursera paulstock \n", "5 coursera boyarsky \n", "6 coursera boyarsky \n", "7 coursera boyarsky \n", "8 None boyarsky \n", "9 edx boyarsky \n", "10 coursera boyarsky \n", "11 udacity boyarsky \n", "12 edx boyarsky \n", "13 coursera boyarsky \n", "14 coursera boyarsky \n", "15 coursera boyarsky \n", "16 coursera boyarsky \n", "17 udacity boyarsky \n", "18 coursera barak \n", "19 coursera alexjeffrey \n", "20 coursera celsoagustinhernandezdiaz \n", "21 coursera vadimsolomonik \n", "22 coursera vadimsolomonik \n", "23 coursera vadimsolomonik \n", "24 coursera vadimsolomonik \n", "25 coursera vadimsolomonik \n", "26 coursera vadimsolomonik \n", "27 coursera vadimsolomonik \n", "28 coursera CrunchyCookie \n", "29 coursera skywalking \n", "... ... ... \n", "2743 coursera alanwilliams \n", "2744 coursera Lyon \n", "2745 coursera fernandomontenegro \n", "2746 coursera lemic \n", "2747 coursera andreamitchell \n", "2748 edx megkawento \n", "2749 edx anonymous \n", "2750 edx anonymous \n", "2751 edx anonymous \n", "2752 coursera anonymous \n", "2753 coursera echolearning \n", "2754 khanacademy anonymous \n", "2755 udemy marcianuffer \n", "2756 coursera irvwiswall \n", "2757 udacity ivandutoit \n", "2758 coursera llewellynfalco1 \n", "2759 coursera anonymous \n", "2760 coursera caleesarya \n", "2761 coursera nathanhall \n", "2762 coursera valeria \n", "2763 coursera stuartwilloughby \n", "2764 coursera jonsnow \n", "2765 udacity anonymous \n", "2766 udacity florianschaetz \n", "2767 udacity anonymous \n", "2768 udacity anonymous \n", "2769 coursera chihchengyuan1 \n", "2770 coursera kj \n", "2771 coursera debbie \n", "2772 coursera kuba \n", "\n", "[2773 rows x 10 columns]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coursetalk = pd.merge(pd.merge(ratings, courses), users)\n", "coursetalk" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "user_id 1\n", "course_id 1\n", "rating 5\n", "title An Introduction to Interactive Programming in ...\n", "avg_rating 4.9\n", "workload 7-10 hours/week\n", "university Rice University\n", "difficulty Medium\n", "provider coursera\n", "username patrickdijusto1\n", "Name: 0, dtype: object" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coursetalk.ix[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Collaborative filtering: generalizations of the aggregation function\n", "\n", "#### Non-personalized recommendations\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Groupby\n", "\n", "The idea of groupby is that of *split-apply-combine*:\n", "\n", "- split data in an object according to a given key;\n", "- apply a function to each subset;\n", "- combine results into a new object." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " To get mean course ratings grouped by the provider, we can use the pivot_table method:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['__call__',\n", " '__class__',\n", " '__closure__',\n", " '__code__',\n", " '__defaults__',\n", " '__delattr__',\n", " '__dict__',\n", " '__doc__',\n", " '__format__',\n", " '__get__',\n", " '__getattribute__',\n", " '__globals__',\n", " '__hash__',\n", " '__init__',\n", " '__module__',\n", " '__name__',\n", " '__new__',\n", " '__reduce__',\n", " '__reduce_ex__',\n", " '__repr__',\n", " '__setattr__',\n", " '__sizeof__',\n", " '__str__',\n", " '__subclasshook__',\n", " 'func_closure',\n", " 'func_code',\n", " 'func_defaults',\n", " 'func_dict',\n", " 'func_doc',\n", " 'func_globals',\n", " 'func_name']" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dir(pivot_table)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "provider\n", "None 4.562500\n", "coursera 4.527835\n", "edx 4.491620\n", "codecademy 4.450000\n", "udacity 4.241071\n", "udemy 4.200000\n", "open2study 4.083333\n", "khanacademy 4.000000\n", "novoed 3.281250\n", "mruniversity 3.250000\n", "Name: rating, dtype: float64" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pandas import pivot_table\n", "mean_ratings = pivot_table(coursetalk, values = 'rating', columns='provider', aggfunc='mean')\n", "mean_ratings.order(ascending=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's filter down to courses that received at least 20 ratings (a completely arbitrary number);\n", "To do this, I group the data by course_id and use size() to get a Series of group sizes for each title:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "title\n", "14.73x: The Challenges of Global Poverty 2\n", "2.01x: Elements of Structures 2\n", "3.091x: Introduction to Solid State Chemistry 3\n", "6.002x: Circuits and Electronics 10\n", "6.00x: Introduction to Computer Science and Programming 21\n", "7.00x: Introduction to Biology - The Secret of Life 3\n", "8.02x: Electricity and Magnetism 3\n", "8.MReVx: Mechanics ReView 1\n", "A Beginner's Guide to Irrational Behavior 147\n", "A Crash Course on Creativity 5\n", "dtype: int64" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ratings_by_title = coursetalk.groupby('title').size()\n", "ratings_by_title[:10]" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Index([u'6.00x: Introduction to Computer Science and Programming',\n", " u'A Beginner's Guide to Irrational Behavior',\n", " u'An Introduction to Interactive Programming in Python',\n", " u'An Introduction to Operations Management',\n", " u'CS-191x: Quantum Mechanics and Quantum Computation',\n", " u'CS188.1x Artificial Intelligence', u'Calculus: Single Variable',\n", " u'Computing for Data Analysis',\n", " u'Critical Thinking in Global Challenges', u'Cryptography I'],\n", " dtype='object', name=u'title')" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "active_titles = ratings_by_title.index[ratings_by_title >= 20]\n", "active_titles[:10]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The index of titles receiving at least 20 ratings can then be used to select rows from mean_ratings above:\n" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "title\n", "14.73x: The Challenges of Global Poverty 4.250000\n", "2.01x: Elements of Structures 4.750000\n", "3.091x: Introduction to Solid State Chemistry 4.166667\n", "6.002x: Circuits and Electronics 4.800000\n", "6.00x: Introduction to Computer Science and Programming 4.166667\n", "7.00x: Introduction to Biology - The Secret of Life 4.666667\n", "8.02x: Electricity and Magnetism 4.333333\n", "8.MReVx: Mechanics ReView 5.000000\n", "A Beginner's Guide to Irrational Behavior 4.874150\n", "A Crash Course on Creativity 3.500000\n", "A History of the World since 1300 4.318182\n", "A Look at Nuclear Science and Technology 3.000000\n", "A New History for a New China, 1700-2000: New Data and New Methods, Part 1 0.500000\n", "AIDS 5.000000\n", "Aboriginal Worldviews and Education 4.333333\n", "Algorithms 4.250000\n", "Algorithms, Part I 4.555556\n", "Algorithms, Part II 4.500000\n", "Algorithms: Design and Analysis, Part 1 4.777778\n", "Algorithms: Design and Analysis, Part 2 4.500000\n", "An Introduction to Interactive Programming in Python 4.915652\n", "An Introduction to Operations Management 4.785714\n", "An Introduction to the U.S. Food System: Perspectives from Public Health 5.000000\n", "Animal Behaviour 4.500000\n", "Applied Cryptography 4.666667\n", "Archaeology's Dirty Little Secrets 4.928571\n", "Artificial Intelligence Planning 3.250000\n", "Artificial Intelligence for Robotics 4.333333\n", "Astrobiology and the Search for Extraterrestrial Life 3.928571\n", "Automata 4.000000\n", " ... \n", "Sports and Society 0.666667\n", "Stat2.1X: Introduction to Statistics: Descriptive Statistics 4.642857\n", "Stat2.2x: Introduction to Statistics: Probability 5.000000\n", "Stat2.3x: Introduction to Statistics: Inference 4.500000\n", "Statistics One 3.909091\n", "Synapses, Neurons and Brains 4.600000\n", "Teaching Adult Learners (WPTrain) 2.500000\n", "Technology Entrepreneurship Part 1 2.900000\n", "Technology Entrepreneurship Part 2 0.500000\n", "The Ancient Greeks 4.550000\n", "The Eurozone Crisis 3.250000\n", "The Fiction of Relationship 5.000000\n", "The Hardware/Software Interface 3.857143\n", "The Language of Hollywood: Storytelling, Sound, and Color 4.800000\n", "The Massey Method: Learn Spanish from a Former NSA Agent 4.000000\n", "The Modern World: Global History since 1760 4.775862\n", "The Modern and the Postmodern 4.777778\n", "The Science of Gastronomy 4.000000\n", "The Social Context of Mental Health and Illness 4.333333\n", "Think Again: How to Reason and Argue 3.815789\n", "Useful Genetics Part 1 4.500000\n", "VLSI CAD: Logic to Layout 4.500000\n", "Vaccine Trials: Methods and Best Practices 5.000000\n", "Vaccines 3.750000\n", "Web Development 4.625000\n", "Web Intelligence and Big Data 3.802326\n", "Women and the Civil Rights Movement 5.000000\n", "Writing for the Web (WriteWeb) 5.000000\n", "Writing in the Sciences 4.000000\n", "jQuery 4.250000\n", "Name: rating, dtype: float64" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mean_ratings = coursetalk.pivot_table('rating', columns='title', aggfunc='mean')\n", "mean_ratings" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By computing the mean rating for each course, we will order with the highest rating listed first.\n" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "title\n", "An Introduction to Interactive Programming in Python 4.915652\n", "Modern & Contemporary American Poetry 4.901515\n", "Design: Creation of Artifacts in Society 4.879581\n", "A Beginner's Guide to Irrational Behavior 4.874150\n", "Greek and Roman Mythology 4.864198\n", "Calculus: Single Variable 4.854167\n", "CS188.1x Artificial Intelligence 4.833333\n", "Machine Learning 4.830000\n", "Functional Programming Principles in Scala 4.822581\n", "Gamification 4.796296\n", "An Introduction to Operations Management 4.785714\n", "The Modern World: Global History since 1760 4.775862\n", "Programming Languages 4.770833\n", "CS-191x: Quantum Mechanics and Quantum Computation 4.727273\n", "Cryptography I 4.700000\n", "Discrete Optimization 4.695652\n", "Introduction to Computer Science 4.687500\n", "Learn to Program: Crafting Quality Code 4.585714\n", "Model Thinking 4.578125\n", "Internet History, Technology, and Security 4.541667\n", "Fantasy and Science Fiction: The Human Mind, Our Modern World 4.522727\n", "Learn to Program: The Fundamentals 4.303571\n", "6.00x: Introduction to Computer Science and Programming 4.166667\n", "Critical Thinking in Global Challenges 3.961538\n", "Web Intelligence and Big Data 3.802326\n", "Computing for Data Analysis 3.187500\n", "Introduction to Finance 3.086957\n", "Introduction to Data Science 3.060000\n", "Name: rating, dtype: float64" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mean_ratings.ix[active_titles].order(ascending=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To see the top courses among Coursera students, we can sort by the 'Coursera' column in descending order:\n" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
providerNonecodecademycourseraedxkhanacademymruniversitynovoedopen2studyudacityudemy
title
14.73x: The Challenges of Global PovertyNaNNaNNaN4.250000NaNNaNNaNNaNNaNNaN
2.01x: Elements of StructuresNaNNaNNaN4.750000NaNNaNNaNNaNNaNNaN
3.091x: Introduction to Solid State ChemistryNaNNaNNaN4.166667NaNNaNNaNNaNNaNNaN
6.002x: Circuits and ElectronicsNaNNaNNaN4.800000NaNNaNNaNNaNNaNNaN
6.00x: Introduction to Computer Science and ProgrammingNaNNaNNaN4.166667NaNNaNNaNNaNNaNNaN
7.00x: Introduction to Biology - The Secret of LifeNaNNaNNaN4.666667NaNNaNNaNNaNNaNNaN
8.02x: Electricity and MagnetismNaNNaNNaN4.333333NaNNaNNaNNaNNaNNaN
8.MReVx: Mechanics ReViewNaNNaNNaN5.000000NaNNaNNaNNaNNaNNaN
A Beginner's Guide to Irrational BehaviorNaNNaN4.87415NaNNaNNaNNaNNaNNaNNaN
A Crash Course on CreativityNaNNaNNaNNaNNaNNaN3.5NaNNaNNaN
\n", "
" ], "text/plain": [ "provider None codecademy \\\n", "title \n", "14.73x: The Challenges of Global Poverty NaN NaN \n", "2.01x: Elements of Structures NaN NaN \n", "3.091x: Introduction to Solid State Chemistry NaN NaN \n", "6.002x: Circuits and Electronics NaN NaN \n", "6.00x: Introduction to Computer Science and Pro... NaN NaN \n", "7.00x: Introduction to Biology - The Secret of ... NaN NaN \n", "8.02x: Electricity and Magnetism NaN NaN \n", "8.MReVx: Mechanics ReView NaN NaN \n", "A Beginner's Guide to Irrational Behavior NaN NaN \n", "A Crash Course on Creativity NaN NaN \n", "\n", "provider coursera edx \\\n", "title \n", "14.73x: The Challenges of Global Poverty NaN 4.250000 \n", "2.01x: Elements of Structures NaN 4.750000 \n", "3.091x: Introduction to Solid State Chemistry NaN 4.166667 \n", "6.002x: Circuits and Electronics NaN 4.800000 \n", "6.00x: Introduction to Computer Science and Pro... NaN 4.166667 \n", "7.00x: Introduction to Biology - The Secret of ... NaN 4.666667 \n", "8.02x: Electricity and Magnetism NaN 4.333333 \n", "8.MReVx: Mechanics ReView NaN 5.000000 \n", "A Beginner's Guide to Irrational Behavior 4.87415 NaN \n", "A Crash Course on Creativity NaN NaN \n", "\n", "provider khanacademy mruniversity \\\n", "title \n", "14.73x: The Challenges of Global Poverty NaN NaN \n", "2.01x: Elements of Structures NaN NaN \n", "3.091x: Introduction to Solid State Chemistry NaN NaN \n", "6.002x: Circuits and Electronics NaN NaN \n", "6.00x: Introduction to Computer Science and Pro... NaN NaN \n", "7.00x: Introduction to Biology - The Secret of ... NaN NaN \n", "8.02x: Electricity and Magnetism NaN NaN \n", "8.MReVx: Mechanics ReView NaN NaN \n", "A Beginner's Guide to Irrational Behavior NaN NaN \n", "A Crash Course on Creativity NaN NaN \n", "\n", "provider novoed open2study \\\n", "title \n", "14.73x: The Challenges of Global Poverty NaN NaN \n", "2.01x: Elements of Structures NaN NaN \n", "3.091x: Introduction to Solid State Chemistry NaN NaN \n", "6.002x: Circuits and Electronics NaN NaN \n", "6.00x: Introduction to Computer Science and Pro... NaN NaN \n", "7.00x: Introduction to Biology - The Secret of ... NaN NaN \n", "8.02x: Electricity and Magnetism NaN NaN \n", "8.MReVx: Mechanics ReView NaN NaN \n", "A Beginner's Guide to Irrational Behavior NaN NaN \n", "A Crash Course on Creativity 3.5 NaN \n", "\n", "provider udacity udemy \n", "title \n", "14.73x: The Challenges of Global Poverty NaN NaN \n", "2.01x: Elements of Structures NaN NaN \n", "3.091x: Introduction to Solid State Chemistry NaN NaN \n", "6.002x: Circuits and Electronics NaN NaN \n", "6.00x: Introduction to Computer Science and Pro... NaN NaN \n", "7.00x: Introduction to Biology - The Secret of ... NaN NaN \n", "8.02x: Electricity and Magnetism NaN NaN \n", "8.MReVx: Mechanics ReView NaN NaN \n", "A Beginner's Guide to Irrational Behavior NaN NaN \n", "A Crash Course on Creativity NaN NaN " ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mean_ratings = coursetalk.pivot_table('rating', index='title',columns='provider', aggfunc='mean')\n", "mean_ratings[:10]" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "title\n", "An Introduction to Interactive Programming in Python 4.915652\n", "Modern & Contemporary American Poetry 4.901515\n", "Design: Creation of Artifacts in Society 4.879581\n", "A Beginner's Guide to Irrational Behavior 4.874150\n", "Greek and Roman Mythology 4.864198\n", "Calculus: Single Variable 4.854167\n", "Programming Languages 4.850000\n", "Machine Learning 4.830000\n", "Functional Programming Principles in Scala 4.822581\n", "Gamification 4.796296\n", "Name: coursera, dtype: float64" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mean_ratings['coursera'][active_titles].order(ascending=False)[:10]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "Now, let's go further! How about rank the courses with the highest percentage of ratings that are 4 or higher ? % of ratings 4+\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's start with a simple pivoting example that does not involve any aggregation. We can extract a ratings matrix as follows:\n" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
title14.73x: The Challenges of Global Poverty2.01x: Elements of Structures3.091x: Introduction to Solid State Chemistry6.002x: Circuits and Electronics6.00x: Introduction to Computer Science and Programming7.00x: Introduction to Biology - The Secret of Life8.02x: Electricity and Magnetism8.MReVx: Mechanics ReViewA Beginner's Guide to Irrational BehaviorA Crash Course on CreativityA History of the World since 1300A Look at Nuclear Science and TechnologyA New History for a New China, 1700-2000: New Data and New Methods, Part 1AIDSAboriginal Worldviews and Education
user_id
1NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
5NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
6NaNNaNNaN5NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
7NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
8NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
9NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
10NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
11NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
12NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
13NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
14NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
15NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", "
" ], "text/plain": [ "title 14.73x: The Challenges of Global Poverty \\\n", "user_id \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "5 NaN \n", "6 NaN \n", "7 NaN \n", "8 NaN \n", "9 NaN \n", "10 NaN \n", "11 NaN \n", "12 NaN \n", "13 NaN \n", "14 NaN \n", "15 NaN \n", "\n", "title 2.01x: Elements of Structures \\\n", "user_id \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "5 NaN \n", "6 NaN \n", "7 NaN \n", "8 NaN \n", "9 NaN \n", "10 NaN \n", "11 NaN \n", "12 NaN \n", "13 NaN \n", "14 NaN \n", "15 NaN \n", "\n", "title 3.091x: Introduction to Solid State Chemistry \\\n", "user_id \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "5 NaN \n", "6 NaN \n", "7 NaN \n", "8 NaN \n", "9 NaN \n", "10 NaN \n", "11 NaN \n", "12 NaN \n", "13 NaN \n", "14 NaN \n", "15 NaN \n", "\n", "title 6.002x: Circuits and Electronics \\\n", "user_id \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "5 NaN \n", "6 5 \n", "7 NaN \n", "8 NaN \n", "9 NaN \n", "10 NaN \n", "11 NaN \n", "12 NaN \n", "13 NaN \n", "14 NaN \n", "15 NaN \n", "\n", "title 6.00x: Introduction to Computer Science and Programming \\\n", "user_id \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "5 NaN \n", "6 NaN \n", "7 NaN \n", "8 NaN \n", "9 NaN \n", "10 NaN \n", "11 NaN \n", "12 NaN \n", "13 NaN \n", "14 NaN \n", "15 NaN \n", "\n", "title 7.00x: Introduction to Biology - The Secret of Life \\\n", "user_id \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "5 NaN \n", "6 NaN \n", "7 NaN \n", "8 NaN \n", "9 NaN \n", "10 NaN \n", "11 NaN \n", "12 NaN \n", "13 NaN \n", "14 NaN \n", "15 NaN \n", "\n", "title 8.02x: Electricity and Magnetism 8.MReVx: Mechanics ReView \\\n", "user_id \n", "1 NaN NaN \n", "2 NaN NaN \n", "3 NaN NaN \n", "4 NaN NaN \n", "5 NaN NaN \n", "6 NaN NaN \n", "7 NaN NaN \n", "8 NaN NaN \n", "9 NaN NaN \n", "10 NaN NaN \n", "11 NaN NaN \n", "12 NaN NaN \n", "13 NaN NaN \n", "14 NaN NaN \n", "15 NaN NaN \n", "\n", "title A Beginner's Guide to Irrational Behavior \\\n", "user_id \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "5 NaN \n", "6 NaN \n", "7 NaN \n", "8 NaN \n", "9 NaN \n", "10 NaN \n", "11 NaN \n", "12 NaN \n", "13 NaN \n", "14 NaN \n", "15 NaN \n", "\n", "title A Crash Course on Creativity A History of the World since 1300 \\\n", "user_id \n", "1 NaN NaN \n", "2 NaN NaN \n", "3 NaN NaN \n", "4 NaN NaN \n", "5 NaN NaN \n", "6 NaN NaN \n", "7 NaN NaN \n", "8 NaN NaN \n", "9 NaN NaN \n", "10 NaN NaN \n", "11 NaN NaN \n", "12 NaN NaN \n", "13 NaN NaN \n", "14 NaN NaN \n", "15 NaN NaN \n", "\n", "title A Look at Nuclear Science and Technology \\\n", "user_id \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "5 NaN \n", "6 NaN \n", "7 NaN \n", "8 NaN \n", "9 NaN \n", "10 NaN \n", "11 NaN \n", "12 NaN \n", "13 NaN \n", "14 NaN \n", "15 NaN \n", "\n", "title A New History for a New China, 1700-2000: New Data and New Methods, Part 1 \\\n", "user_id \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "5 NaN \n", "6 NaN \n", "7 NaN \n", "8 NaN \n", "9 NaN \n", "10 NaN \n", "11 NaN \n", "12 NaN \n", "13 NaN \n", "14 NaN \n", "15 NaN \n", "\n", "title AIDS Aboriginal Worldviews and Education \n", "user_id \n", "1 NaN NaN \n", "2 NaN NaN \n", "3 NaN NaN \n", "4 NaN NaN \n", "5 NaN NaN \n", "6 NaN NaN \n", "7 NaN NaN \n", "8 NaN NaN \n", "9 NaN NaN \n", "10 NaN NaN \n", "11 NaN NaN \n", "12 NaN NaN \n", "13 NaN NaN \n", "14 NaN NaN \n", "15 NaN NaN " ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# transform the ratings frame into a ratings matrix\n", "ratings_mtx_df = coursetalk.pivot_table(values='rating',\n", " index='user_id',\n", " columns='title')\n", "ratings_mtx_df.ix[ratings_mtx_df.index[:15], ratings_mtx_df.columns[:15]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's extract only the rating that are 4 or higher." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
title14.73x: The Challenges of Global Poverty2.01x: Elements of Structures3.091x: Introduction to Solid State Chemistry6.002x: Circuits and Electronics6.00x: Introduction to Computer Science and Programming7.00x: Introduction to Biology - The Secret of Life8.02x: Electricity and Magnetism8.MReVx: Mechanics ReViewA Beginner's Guide to Irrational BehaviorA Crash Course on CreativityA History of the World since 1300A Look at Nuclear Science and TechnologyA New History for a New China, 1700-2000: New Data and New Methods, Part 1AIDSAboriginal Worldviews and Education
user_id
1NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
5NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
6NaNNaNNaN5NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
7NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
8NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
9NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
10NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
11NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
12NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
13NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
14NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
15NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", "
" ], "text/plain": [ "title 14.73x: The Challenges of Global Poverty \\\n", "user_id \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "5 NaN \n", "6 NaN \n", "7 NaN \n", "8 NaN \n", "9 NaN \n", "10 NaN \n", "11 NaN \n", "12 NaN \n", "13 NaN \n", "14 NaN \n", "15 NaN \n", "\n", "title 2.01x: Elements of Structures \\\n", "user_id \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "5 NaN \n", "6 NaN \n", "7 NaN \n", "8 NaN \n", "9 NaN \n", "10 NaN \n", "11 NaN \n", "12 NaN \n", "13 NaN \n", "14 NaN \n", "15 NaN \n", "\n", "title 3.091x: Introduction to Solid State Chemistry \\\n", "user_id \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "5 NaN \n", "6 NaN \n", "7 NaN \n", "8 NaN \n", "9 NaN \n", "10 NaN \n", "11 NaN \n", "12 NaN \n", "13 NaN \n", "14 NaN \n", "15 NaN \n", "\n", "title 6.002x: Circuits and Electronics \\\n", "user_id \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "5 NaN \n", "6 5 \n", "7 NaN \n", "8 NaN \n", "9 NaN \n", "10 NaN \n", "11 NaN \n", "12 NaN \n", "13 NaN \n", "14 NaN \n", "15 NaN \n", "\n", "title 6.00x: Introduction to Computer Science and Programming \\\n", "user_id \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "5 NaN \n", "6 NaN \n", "7 NaN \n", "8 NaN \n", "9 NaN \n", "10 NaN \n", "11 NaN \n", "12 NaN \n", "13 NaN \n", "14 NaN \n", "15 NaN \n", "\n", "title 7.00x: Introduction to Biology - The Secret of Life \\\n", "user_id \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "5 NaN \n", "6 NaN \n", "7 NaN \n", "8 NaN \n", "9 NaN \n", "10 NaN \n", "11 NaN \n", "12 NaN \n", "13 NaN \n", "14 NaN \n", "15 NaN \n", "\n", "title 8.02x: Electricity and Magnetism 8.MReVx: Mechanics ReView \\\n", "user_id \n", "1 NaN NaN \n", "2 NaN NaN \n", "3 NaN NaN \n", "4 NaN NaN \n", "5 NaN NaN \n", "6 NaN NaN \n", "7 NaN NaN \n", "8 NaN NaN \n", "9 NaN NaN \n", "10 NaN NaN \n", "11 NaN NaN \n", "12 NaN NaN \n", "13 NaN NaN \n", "14 NaN NaN \n", "15 NaN NaN \n", "\n", "title A Beginner's Guide to Irrational Behavior \\\n", "user_id \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "5 NaN \n", "6 NaN \n", "7 NaN \n", "8 NaN \n", "9 NaN \n", "10 NaN \n", "11 NaN \n", "12 NaN \n", "13 NaN \n", "14 NaN \n", "15 NaN \n", "\n", "title A Crash Course on Creativity A History of the World since 1300 \\\n", "user_id \n", "1 NaN NaN \n", "2 NaN NaN \n", "3 NaN NaN \n", "4 NaN NaN \n", "5 NaN NaN \n", "6 NaN NaN \n", "7 NaN NaN \n", "8 NaN NaN \n", "9 NaN NaN \n", "10 NaN NaN \n", "11 NaN NaN \n", "12 NaN NaN \n", "13 NaN NaN \n", "14 NaN NaN \n", "15 NaN NaN \n", "\n", "title A Look at Nuclear Science and Technology \\\n", "user_id \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "5 NaN \n", "6 NaN \n", "7 NaN \n", "8 NaN \n", "9 NaN \n", "10 NaN \n", "11 NaN \n", "12 NaN \n", "13 NaN \n", "14 NaN \n", "15 NaN \n", "\n", "title A New History for a New China, 1700-2000: New Data and New Methods, Part 1 \\\n", "user_id \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "5 NaN \n", "6 NaN \n", "7 NaN \n", "8 NaN \n", "9 NaN \n", "10 NaN \n", "11 NaN \n", "12 NaN \n", "13 NaN \n", "14 NaN \n", "15 NaN \n", "\n", "title AIDS Aboriginal Worldviews and Education \n", "user_id \n", "1 NaN NaN \n", "2 NaN NaN \n", "3 NaN NaN \n", "4 NaN NaN \n", "5 NaN NaN \n", "6 NaN NaN \n", "7 NaN NaN \n", "8 NaN NaN \n", "9 NaN NaN \n", "10 NaN NaN \n", "11 NaN NaN \n", "12 NaN NaN \n", "13 NaN NaN \n", "14 NaN NaN \n", "15 NaN NaN " ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ratings_gte_4 = ratings_mtx_df[ratings_mtx_df>=4.0]\n", "# with an integer axis index only label-based indexing is possible\n", "\n", "ratings_gte_4.ix[ratings_gte_4.index[:15], ratings_gte_4.columns[:15]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now picking the number of total ratings for each course and the count of ratings 4+ , we can merge them into one DataFrame." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
gte_4total
title
14.73x: The Challenges of Global Poverty22
2.01x: Elements of Structures22
3.091x: Introduction to Solid State Chemistry23
6.002x: Circuits and Electronics1010
6.00x: Introduction to Computer Science and Programming1521
7.00x: Introduction to Biology - The Secret of Life33
8.02x: Electricity and Magnetism23
8.MReVx: Mechanics ReView11
A Beginner's Guide to Irrational Behavior146147
A Crash Course on Creativity25
\n", "
" ], "text/plain": [ " gte_4 total\n", "title \n", "14.73x: The Challenges of Global Poverty 2 2\n", "2.01x: Elements of Structures 2 2\n", "3.091x: Introduction to Solid State Chemistry 2 3\n", "6.002x: Circuits and Electronics 10 10\n", "6.00x: Introduction to Computer Science and Pro... 15 21\n", "7.00x: Introduction to Biology - The Secret of ... 3 3\n", "8.02x: Electricity and Magnetism 2 3\n", "8.MReVx: Mechanics ReView 1 1\n", "A Beginner's Guide to Irrational Behavior 146 147\n", "A Crash Course on Creativity 2 5" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ratings_gte_4_pd = pd.DataFrame({'total': ratings_mtx_df.count(), 'gte_4': ratings_gte_4.count()})\n", "ratings_gte_4_pd.head(10)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
gte_4totalgte_4_ratio
title
14.73x: The Challenges of Global Poverty221.000000
2.01x: Elements of Structures221.000000
3.091x: Introduction to Solid State Chemistry230.666667
6.002x: Circuits and Electronics10101.000000
6.00x: Introduction to Computer Science and Programming15210.714286
7.00x: Introduction to Biology - The Secret of Life331.000000
8.02x: Electricity and Magnetism230.666667
8.MReVx: Mechanics ReView111.000000
A Beginner's Guide to Irrational Behavior1461470.993197
A Crash Course on Creativity250.400000
\n", "
" ], "text/plain": [ " gte_4 total gte_4_ratio\n", "title \n", "14.73x: The Challenges of Global Poverty 2 2 1.000000\n", "2.01x: Elements of Structures 2 2 1.000000\n", "3.091x: Introduction to Solid State Chemistry 2 3 0.666667\n", "6.002x: Circuits and Electronics 10 10 1.000000\n", "6.00x: Introduction to Computer Science and Pro... 15 21 0.714286\n", "7.00x: Introduction to Biology - The Secret of ... 3 3 1.000000\n", "8.02x: Electricity and Magnetism 2 3 0.666667\n", "8.MReVx: Mechanics ReView 1 1 1.000000\n", "A Beginner's Guide to Irrational Behavior 146 147 0.993197\n", "A Crash Course on Creativity 2 5 0.400000" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ratings_gte_4_pd['gte_4_ratio'] = (ratings_gte_4_pd['gte_4'] * 1.0)/ ratings_gte_4_pd.total\n", "ratings_gte_4_pd.head(10)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Functional Programming Principles in Scala 31 31 1.0\n", "Introduction to Computer Science 24 24 1.0\n", "Programming Languages 24 24 1.0\n", "Web Development 16 16 1.0\n", "6.002x: Circuits and Electronics 10 10 1.0\n", "Compilers 8 8 1.0\n", "Archaeology's Dirty Little Secrets 7 7 1.0\n", "How to Build a Startup 7 7 1.0\n", "Introduction to Sociology 7 7 1.0\n", "Stat2.1X: Introduction to Statistics: Descriptive Statistics 7 7 1.0\n" ] } ], "source": [ "ranking = [(title,total,gte_4, score) for title, total, gte_4, score in ratings_gte_4_pd.itertuples()]\n", "\n", "for title, total, gte_4, score in sorted(ranking, key=lambda x: (x[3], x[2], x[1]) , reverse=True)[:10]:\n", " print title, total, gte_4, score" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's now go easy. Let's count the number of ratings for each course, and order with the most number of ratings.\n" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "title\n", "An Introduction to Interactive Programming in Python 575\n", "Design: Creation of Artifacts in Society 191\n", "A Beginner's Guide to Irrational Behavior 147\n", "Modern & Contemporary American Poetry 132\n", "An Introduction to Operations Management 98\n", "Greek and Roman Mythology 81\n", "Critical Thinking in Global Challenges 65\n", "Gamification 54\n", "Machine Learning 50\n", "Web Intelligence and Big Data 43\n", "dtype: int64" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ratings_by_title = coursetalk.groupby('title').size()\n", "ratings_by_title.order(ascending=False)[:10]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Considering this information we can sort by the most rated ones with highest percentage of 4+ ratings." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "An Introduction to Interactive Programming in Python 572 575 0.994782608696\n", "Design: Creation of Artifacts in Society 190 191 0.994764397906\n", "A Beginner's Guide to Irrational Behavior 146 147 0.993197278912\n", "Modern & Contemporary American Poetry 130 132 0.984848484848\n", "An Introduction to Operations Management 96 98 0.979591836735\n", "Greek and Roman Mythology 80 81 0.987654320988\n", "Critical Thinking in Global Challenges 47 65 0.723076923077\n", "Gamification 52 54 0.962962962963\n", "Machine Learning 48 49 0.979591836735\n", "Web Intelligence and Big Data 26 43 0.604651162791\n" ] } ], "source": [ "for title, total, gte_4, score in sorted(ranking, key=lambda x: (x[2], x[3], x[1]) , reverse=True)[:10]:\n", " print title, total, gte_4, score" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally using the formula above that we learned, let's find out what the courses that most often occur wit the popular MOOC An introduction to Interactive Programming with Python by using the method \"x + y/ x\" . For each course, calculate the percentage of Programming with python raters who also rated that course. Order with the highest percentage first, and voilá we have the top 5 moocs." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user_id123456789101112131415
title
14.73x: The Challenges of Global PovertyNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2.01x: Elements of StructuresNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3.091x: Introduction to Solid State ChemistryNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
6.002x: Circuits and ElectronicsNaNNaNNaNNaNNaN5NaNNaNNaNNaNNaNNaNNaNNaNNaN
6.00x: Introduction to Computer Science and ProgrammingNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
7.00x: Introduction to Biology - The Secret of LifeNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
8.02x: Electricity and MagnetismNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
8.MReVx: Mechanics ReViewNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
A Beginner's Guide to Irrational BehaviorNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
A Crash Course on CreativityNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
A History of the World since 1300NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
A Look at Nuclear Science and TechnologyNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
A New History for a New China, 1700-2000: New Data and New Methods, Part 1NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
AIDSNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
Aboriginal Worldviews and EducationNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", "
" ], "text/plain": [ "user_id 1 2 3 4 5 6 \\\n", "title \n", "14.73x: The Challenges of Global Poverty NaN NaN NaN NaN NaN NaN \n", "2.01x: Elements of Structures NaN NaN NaN NaN NaN NaN \n", "3.091x: Introduction to Solid State Chemistry NaN NaN NaN NaN NaN NaN \n", "6.002x: Circuits and Electronics NaN NaN NaN NaN NaN 5 \n", "6.00x: Introduction to Computer Science and Pro... NaN NaN NaN NaN NaN NaN \n", "7.00x: Introduction to Biology - The Secret of ... NaN NaN NaN NaN NaN NaN \n", "8.02x: Electricity and Magnetism NaN NaN NaN NaN NaN NaN \n", "8.MReVx: Mechanics ReView NaN NaN NaN NaN NaN NaN \n", "A Beginner's Guide to Irrational Behavior NaN NaN NaN NaN NaN NaN \n", "A Crash Course on Creativity NaN NaN NaN NaN NaN NaN \n", "A History of the World since 1300 NaN NaN NaN NaN NaN NaN \n", "A Look at Nuclear Science and Technology NaN NaN NaN NaN NaN NaN \n", "A New History for a New China, 1700-2000: New D... NaN NaN NaN NaN NaN NaN \n", "AIDS NaN NaN NaN NaN NaN NaN \n", "Aboriginal Worldviews and Education NaN NaN NaN NaN NaN NaN \n", "\n", "user_id 7 8 9 10 11 12 \\\n", "title \n", "14.73x: The Challenges of Global Poverty NaN NaN NaN NaN NaN NaN \n", "2.01x: Elements of Structures NaN NaN NaN NaN NaN NaN \n", "3.091x: Introduction to Solid State Chemistry NaN NaN NaN NaN NaN NaN \n", "6.002x: Circuits and Electronics NaN NaN NaN NaN NaN NaN \n", "6.00x: Introduction to Computer Science and Pro... NaN NaN NaN NaN NaN NaN \n", "7.00x: Introduction to Biology - The Secret of ... NaN NaN NaN NaN NaN NaN \n", "8.02x: Electricity and Magnetism NaN NaN NaN NaN NaN NaN \n", "8.MReVx: Mechanics ReView NaN NaN NaN NaN NaN NaN \n", "A Beginner's Guide to Irrational Behavior NaN NaN NaN NaN NaN NaN \n", "A Crash Course on Creativity NaN NaN NaN NaN NaN NaN \n", "A History of the World since 1300 NaN NaN NaN NaN NaN NaN \n", "A Look at Nuclear Science and Technology NaN NaN NaN NaN NaN NaN \n", "A New History for a New China, 1700-2000: New D... NaN NaN NaN NaN NaN NaN \n", "AIDS NaN NaN NaN NaN NaN NaN \n", "Aboriginal Worldviews and Education NaN NaN NaN NaN NaN NaN \n", "\n", "user_id 13 14 15 \n", "title \n", "14.73x: The Challenges of Global Poverty NaN NaN NaN \n", "2.01x: Elements of Structures NaN NaN NaN \n", "3.091x: Introduction to Solid State Chemistry NaN NaN NaN \n", "6.002x: Circuits and Electronics NaN NaN NaN \n", "6.00x: Introduction to Computer Science and Pro... NaN NaN NaN \n", "7.00x: Introduction to Biology - The Secret of ... NaN NaN NaN \n", "8.02x: Electricity and Magnetism NaN NaN NaN \n", "8.MReVx: Mechanics ReView NaN NaN NaN \n", "A Beginner's Guide to Irrational Behavior NaN NaN NaN \n", "A Crash Course on Creativity NaN NaN NaN \n", "A History of the World since 1300 NaN NaN NaN \n", "A Look at Nuclear Science and Technology NaN NaN NaN \n", "A New History for a New China, 1700-2000: New D... NaN NaN NaN \n", "AIDS NaN NaN NaN \n", "Aboriginal Worldviews and Education NaN NaN NaN " ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "course_users = coursetalk.pivot_table('rating', index='title', columns='user_id')\n", "course_users.ix[course_users.index[:15], course_users.columns[:15]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, let's get only the users that rated the course An Introduction to Interactive Programming in Python" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ratings_by_course = coursetalk[coursetalk.title == 'An Introduction to Interactive Programming in Python']\n", "ratings_by_course.set_index('user_id', inplace=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, for all other courses let's filter out only the ratings from users that rated the Python course." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user_id123456789101112131415
title
14.73x: The Challenges of Global PovertyNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2.01x: Elements of StructuresNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3.091x: Introduction to Solid State ChemistryNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
6.002x: Circuits and ElectronicsNaNNaNNaNNaNNaN5NaNNaNNaNNaNNaNNaNNaNNaNNaN
6.00x: Introduction to Computer Science and ProgrammingNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
7.00x: Introduction to Biology - The Secret of LifeNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
8.02x: Electricity and MagnetismNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
8.MReVx: Mechanics ReViewNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
A Beginner's Guide to Irrational BehaviorNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
A Crash Course on CreativityNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
A History of the World since 1300NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
A Look at Nuclear Science and TechnologyNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
A New History for a New China, 1700-2000: New Data and New Methods, Part 1NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
AIDSNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
Aboriginal Worldviews and EducationNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", "
" ], "text/plain": [ "user_id 1 2 3 4 5 6 \\\n", "title \n", "14.73x: The Challenges of Global Poverty NaN NaN NaN NaN NaN NaN \n", "2.01x: Elements of Structures NaN NaN NaN NaN NaN NaN \n", "3.091x: Introduction to Solid State Chemistry NaN NaN NaN NaN NaN NaN \n", "6.002x: Circuits and Electronics NaN NaN NaN NaN NaN 5 \n", "6.00x: Introduction to Computer Science and Pro... NaN NaN NaN NaN NaN NaN \n", "7.00x: Introduction to Biology - The Secret of ... NaN NaN NaN NaN NaN NaN \n", "8.02x: Electricity and Magnetism NaN NaN NaN NaN NaN NaN \n", "8.MReVx: Mechanics ReView NaN NaN NaN NaN NaN NaN \n", "A Beginner's Guide to Irrational Behavior NaN NaN NaN NaN NaN NaN \n", "A Crash Course on Creativity NaN NaN NaN NaN NaN NaN \n", "A History of the World since 1300 NaN NaN NaN NaN NaN NaN \n", "A Look at Nuclear Science and Technology NaN NaN NaN NaN NaN NaN \n", "A New History for a New China, 1700-2000: New D... NaN NaN NaN NaN NaN NaN \n", "AIDS NaN NaN NaN NaN NaN NaN \n", "Aboriginal Worldviews and Education NaN NaN NaN NaN NaN NaN \n", "\n", "user_id 7 8 9 10 11 12 \\\n", "title \n", "14.73x: The Challenges of Global Poverty NaN NaN NaN NaN NaN NaN \n", "2.01x: Elements of Structures NaN NaN NaN NaN NaN NaN \n", "3.091x: Introduction to Solid State Chemistry NaN NaN NaN NaN NaN NaN \n", "6.002x: Circuits and Electronics NaN NaN NaN NaN NaN NaN \n", "6.00x: Introduction to Computer Science and Pro... NaN NaN NaN NaN NaN NaN \n", "7.00x: Introduction to Biology - The Secret of ... NaN NaN NaN NaN NaN NaN \n", "8.02x: Electricity and Magnetism NaN NaN NaN NaN NaN NaN \n", "8.MReVx: Mechanics ReView NaN NaN NaN NaN NaN NaN \n", "A Beginner's Guide to Irrational Behavior NaN NaN NaN NaN NaN NaN \n", "A Crash Course on Creativity NaN NaN NaN NaN NaN NaN \n", "A History of the World since 1300 NaN NaN NaN NaN NaN NaN \n", "A Look at Nuclear Science and Technology NaN NaN NaN NaN NaN NaN \n", "A New History for a New China, 1700-2000: New D... NaN NaN NaN NaN NaN NaN \n", "AIDS NaN NaN NaN NaN NaN NaN \n", "Aboriginal Worldviews and Education NaN NaN NaN NaN NaN NaN \n", "\n", "user_id 13 14 15 \n", "title \n", "14.73x: The Challenges of Global Poverty NaN NaN NaN \n", "2.01x: Elements of Structures NaN NaN NaN \n", "3.091x: Introduction to Solid State Chemistry NaN NaN NaN \n", "6.002x: Circuits and Electronics NaN NaN NaN \n", "6.00x: Introduction to Computer Science and Pro... NaN NaN NaN \n", "7.00x: Introduction to Biology - The Secret of ... NaN NaN NaN \n", "8.02x: Electricity and Magnetism NaN NaN NaN \n", "8.MReVx: Mechanics ReView NaN NaN NaN \n", "A Beginner's Guide to Irrational Behavior NaN NaN NaN \n", "A Crash Course on Creativity NaN NaN NaN \n", "A History of the World since 1300 NaN NaN NaN \n", "A Look at Nuclear Science and Technology NaN NaN NaN \n", "A New History for a New China, 1700-2000: New D... NaN NaN NaN \n", "AIDS NaN NaN NaN \n", "Aboriginal Worldviews and Education NaN NaN NaN " ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "their_ids = ratings_by_course.index\n", "their_ratings = course_users[their_ids]\n", "course_users[their_ids].ix[course_users[their_ids].index[:15], course_users[their_ids].columns[:15]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By applying the division: number of ratings who rated Python Course and the given course / total of ratings who rated the Python Course we have our percentage." ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [], "source": [ "course_count = their_ratings.ix['An Introduction to Interactive Programming in Python'].count()\n", "sims = their_ratings.apply(lambda profile: profile.count() / float(course_count) , axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ordering by the score, highest first excepts the first one which contains the course itself." ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "title\n", "Cryptography I 0.006957\n", "Machine Learning 0.006957\n", "CS-169.1x: Software as a Service 0.005217\n", "Python 0.005217\n", "Introduction to Computer Science 0.005217\n", "Human-Computer Interaction 0.005217\n", "Computational Investing, Part I 0.005217\n", "Learn to Program: Crafting Quality Code 0.005217\n", "Web Development 0.005217\n", "Gamification 0.005217\n", "dtype: float64" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sims.order(ascending=False)[1:][:10]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 }