diff --git a/Data-X HW0 Sp18.ipynb b/Data-X HW0 Sp18.ipynb new file mode 100644 index 0000000..cceab11 --- /dev/null +++ b/Data-X HW0 Sp18.ipynb @@ -0,0 +1,593 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Homework 0\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this homework you will complete a couple of simple exercises in order to show your understanding with Python. If these exercises are challenging or new to you, you may want to reconsider taking the class and/or brush up on your Python skills. For the following exercises you are not allowed to use any Python packages (i.e. Numpy, Pandas, etc.)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Lists" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create an empty Python list called 'a' in the cell below." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = []\n", + "a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Store all values between 1-100 (inclusive) with increments of 3 (i.e. 1, 4, 7...) in 'a'." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85, 88, 91, 94, 97, 100]\n" + ] + } + ], + "source": [ + "a = list(range(1,101,3))\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create another list called 'a2' with numbers from 2-46 (inclusive) with increments of 0.5 (i.e. 2, 2.5, 3...)." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0, 10.5, 11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5, 15.0, 15.5, 16.0, 16.5, 17.0, 17.5, 18.0, 18.5, 19.0, 19.5, 20.0, 20.5, 21.0, 21.5, 22.0, 22.5, 23.0, 23.5, 24.0, 24.5, 25.0, 25.5, 26.0, 26.5, 27.0, 27.5, 28.0, 28.5, 29.0, 29.5, 30.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 38.5, 39.0, 39.5, 40.0, 40.5, 41.0, 41.5, 42.0, 42.5, 43.0, 43.5, 44.0, 44.5, 45.0, 45.5, 46.0]\n" + ] + } + ], + "source": [ + "a2 = list(range(4,93,1))\n", + "a2 = [x/2 for x in a2]\n", + "print(a2) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Double every even integer element from list 'a'. Store the results back in 'a'." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 8, 7, 20, 13, 32, 19, 44, 25, 56, 31, 68, 37, 80, 43, 92, 49, 104, 55, 116, 61, 128, 67, 140, 73, 152, 79, 164, 85, 176, 91, 188, 97, 200]\n" + ] + } + ], + "source": [ + "for i,x in enumerate(a):\n", + " if x%2 == 0:\n", + " a[i] = a[i] * 2\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Add all numbers in 'a' except for the 2nd and 21st elements (the 2nd element here means the element at list index 1)." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2532\n" + ] + } + ], + "source": [ + "asum=0\n", + "for i,x in enumerate(a):\n", + " if i!=1 and i!=20:\n", + " asum = asum + a[i]\n", + "print(asum) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Calculate the mean of 'a'." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2601\n" + ] + }, + { + "data": { + "text/plain": [ + "76.5" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "total = 0\n", + "for i,x in enumerate(a):\n", + " total = total + x\n", + "print(total)\n", + "mean = total/len(a)\n", + "mean" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Strings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create an empty list called 'b'." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n" + ] + } + ], + "source": [ + "b = list()\n", + "print(b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Store the words in the sentence below as elements into the list 'b'. \n", + "\n", + "'I am so excited about Data-X. It is important to be able to work with data.'" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['I', 'am', 'so', 'excited', 'about', 'Data-X.', 'It', 'is', 'important', 'to', 'be', 'able', 'to', 'work', 'with', 'data.']\n" + ] + } + ], + "source": [ + "complete_sentence = 'I am so excited about Data-X. It is important to be able to work with data.'\n", + "b = complete_sentence.split()\n", + "print(b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Return the count of the occurences of the lower-case letter 'e' in the list 'b'." + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I*am*so*excited*about*Data-X.*It*is*important*to*be*able*to*work*with*data.\n", + "4\n" + ] + } + ], + "source": [ + "b_full = ('*'.join(b))\n", + "print(b_full)\n", + "b_e = b_full.count('e')\n", + "print(b_e)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Replace every lower- or upper-case letter 'i' in the list b with a '1'." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['I', '*', 'a', 'm', '*', 's', 'o', '*', 'e', 'x', 'c', 'i', 't', 'e', 'd', '*', 'a', 'b', 'o', 'u', 't', '*', 'D', 'a', 't', 'a', '-', 'X', '.', '*', 'I', 't', '*', 'i', 's', '*', 'i', 'm', 'p', 'o', 'r', 't', 'a', 'n', 't', '*', 't', 'o', '*', 'b', 'e', '*', 'a', 'b', 'l', 'e', '*', 't', 'o', '*', 'w', 'o', 'r', 'k', '*', 'w', 'i', 't', 'h', '*', 'd', 'a', 't', 'a', '.']\n", + "['I', 'am', 'so', 'excited', 'about', 'Data-X.', 'It', 'is', 'important', 'to', 'be', 'able', 'to', 'work', 'with', 'data.']\n", + "['1', 'am', 'so', 'exc1ted', 'about', 'Data-X.', '1t', '1s', '1mportant', 'to', 'be', 'able', 'to', 'work', 'w1th', 'data.']\n" + ] + } + ], + "source": [ + "b2 = list(b_full)\n", + "print(b2)\n", + "for i,x in enumerate(b2):\n", + " if x == 'i' or x== 'I':\n", + " b2[i] = '1'\n", + "\n", + " if x == '*':\n", + " b2[i] = ' '\n", + "print(b)\n", + "b_full = (''.join(b2))\n", + "b = b_full.split(' ')\n", + "print(b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Append the string \"This is the end of the first HW.\" to the list 'b'." + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['This', 'is', 'the', 'end', 'of', 'the', 'first', 'HW']\n", + "['1', 'am', 'so', 'exc1ted', 'about', 'Data-X.', '1t', '1s', '1mportant', 'to', 'be', 'able', 'to', 'work', 'w1th', 'data.', 'This', 'is', 'the', 'end', 'of', 'the', 'first', 'HW']\n" + ] + } + ], + "source": [ + "ns = \"This is the end of the first HW\"\n", + "ns1 = ns.split(' ')\n", + "print(ns1)\n", + "for x in ns1:\n", + " b.append(x)\n", + "print(b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Print 'b' as ONE string backwards (starting with \"WH tsrif...\")." + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 am so exc1ted about Data-X. 1t 1s 1mportant to be able to work w1th data. This is the end of the first HW\n", + "\n", + "WH tsrif eht fo dne eht si sihT .atad ht1w krow ot elba eb ot tnatropm1 s1 t1 .X-ataD tuoba det1cxe os ma 1\n" + ] + } + ], + "source": [ + "b_3 = (' '.join(b))\n", + "print(b_3)\n", + "b = b_3[::-1]\n", + "print (type(b))\n", + "print(b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Dictionaries" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Put the following in a dictionary called 'codes':\n", + "\n", + "Keys: 1001, 1002, 1003, 1004, 1005 \n", + "Values: 'Alpha', Beta, 'Gamma, 'Delta', 'Tau'\n", + "\n", + "then traverse the dictionary by its keys and change every value to be all lower case." + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{1001: 'alpha', 1002: 'beta', 1003: 'gamma', 1004: 'delta', 1005: 'tau'}" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "codes=dict([(1001,'Alpha'),(1002,'Beta'),(1003,'Gamma'),(1004,'Delta'),(1005,'Tau')])\n", + "list(codes.keys())\n", + "codes1= {k:v.lower() for k, v in codes.items()}\n", + "codes1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Delete 'alpha' from the dictionary." + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{1002: 'beta', 1003: 'gamma', 1004: 'delta', 1005: 'tau'}\n" + ] + } + ], + "source": [ + "for k,v in codes1.items():\n", + " if v =='alpha':\n", + " del codes1[k]\n", + "print(codes1)\n", + "#del codes[1001]\n", + "#codes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sets" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create a set called 'c' with the all the odd numbers less than 10." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{1, 3, 5, 7, 9}\n" + ] + } + ], + "source": [ + "c = {1,3,5,7,9}\n", + "print(c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create another set called 'd' with elements 2, 5, 10, 30." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{2, 10, 5, 30}\n" + ] + } + ], + "source": [ + "d = {2,5,10,30}\n", + "print(d)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Find the union between sets 'c' and 'd' and store this in a new set called 'e'." + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{1, 2, 3, 5, 7, 9, 10, 30}\n" + ] + } + ], + "source": [ + "e = c|d\n", + "print(e)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Find the intersection between sets 'c' and 'd'." + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{5}\n" + ] + } + ], + "source": [ + "print(c&d)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Data-X HW1 Sp18.ipynb b/Data-X HW1 Sp18.ipynb new file mode 100644 index 0000000..ba23cb0 --- /dev/null +++ b/Data-X HW1 Sp18.ipynb @@ -0,0 +1,3950 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Homework 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this homework, you will get a chance to do some exercises with Numpy, Pandas, and Matplotlib to show us your understanding with this libraries. \n", + "\n", + "If you have questions, Google! Additionally you can ask your peers questions on Piazza and/or go to Office Hours.\n", + "\n", + "This homework is due **Thursday Feb. 8th, 2018 at 11:59 PM**. Please upload your .ipynb to your private repo on Github. Additionally, submit a pdf on bCourses and in the comment section include a link to your private repo.\n", + "\n", + "This homework is long, please start early!" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## NumPy Basics" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create two numpy arrays (`a` and `b`). `a` should be all integers between 10-19 (inclusive), and `b` should be ten evenly spaced numbers between 1-7. Print the results below." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a: [10 11 12 13 14 15 16 17 18 19]\n", + "b: [ 1. 1.66666667 2.33333333 3. 3.66666667 4.33333333\n", + " 5. 5.66666667 6.33333333 7. ]\n" + ] + } + ], + "source": [ + "a = np.arange(10,20)\n", + "b = np.linspace(1,7,10)\n", + "\n", + "print(\"a: \", a)\n", + "print(\"b: \", b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For `a` and `b` above do the follow and print out the results.\n", + "\n", + "1. Square all the elements in both arrays (element-wise). \n", + "2. Add both the squared arrays (e.g. [1,2] + [3,4] = [4,6]). \n", + "3. Sum the elements with even indices of the added array. \n", + "4. Take the square root of the added array (element-wise square root)." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1. [100 121 144 169 196 225 256 289 324 361] [ 1. 2.77777778 5.44444444 9. 13.44444444\n", + " 18.77777778 25. 32.11111111 40.11111111 49. ]\n", + "2. [ 101. 123.77777778 149.44444444 178. 209.44444444\n", + " 243.77777778 281. 321.11111111 364.11111111 410. ]\n", + "3. 1105.0\n", + "4. [ 10.04987562 11.12554618 12.22474721 13.34166406 14.47219556\n", + " 15.61338457 16.76305461 17.91957341 19.08169571 20.24845673]\n" + ] + } + ], + "source": [ + "asq= a**2\n", + "bsq=b**2\n", + "#############################\n", + "#c=len(b)\n", + "#d=len(a)\n", + "#diff=c-d\n", + "#zero=np.zeros(diff)\n", + "#newa=np.append(a**2,zero)\n", + "#print(newa)\n", + "two = asq+bsq\n", + "#############################\n", + "evensum=0\n", + "for i in range(len(two)):\n", + " if i%2==0:\n", + " evensum=evensum+two[i]\n", + " three=evensum\n", + "############################\n", + "four = np.sqrt(two)\n", + "############################\n", + "print(\"1. \",asq,bsq)\n", + "print(\"2. \",two)\n", + "print(\"3. \",three)\n", + "print(\"4. \",four)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Append `b` to `a`. Reshape the appended array so that it is a 5x4, 2D-array and store the results in a variable called `m`. Print `m`." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "m: [[ 10. 11. 12. 13. ]\n", + " [ 14. 15. 16. 17. ]\n", + " [ 18. 19. 1. 1.66666667]\n", + " [ 2.33333333 3. 3.66666667 4.33333333]\n", + " [ 5. 5.66666667 6.33333333 7. ]]\n" + ] + } + ], + "source": [ + "m = np.append(a,b).reshape(5,4)\n", + "\n", + "print(\"m: \", m)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Extract the second and the third column of the matrix `m`. Store the resulting 5x2 matrix in a new variable called `m2`. Print `m2`." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "m2: [[ 11. 12. ]\n", + " [ 15. 16. ]\n", + " [ 19. 1. ]\n", + " [ 3. 3.66666667]\n", + " [ 5.66666667 6.33333333]]\n" + ] + } + ], + "source": [ + "m2 = m[:,1:3].reshape(5,2)\n", + "\n", + "print(\"m2: \", m2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Take the dot product of `m2` and `m` store the results in a matrix called `m3`. Print `m3`.\n", + "Note that dot product of two matrices $A\\cdot B = A^T B$" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "m3: [[ 697.33333333 748.11111111 437.88888889 482.33333333]\n", + " [ 402.22222222 437.88888889 454.55555556 489.88888889]]\n" + ] + } + ], + "source": [ + "m3 = np.dot(m2.T,m)\n", + "\n", + "print(\"m3: \", m3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Round the `m3` matrix to two decimal points. Store the result in place and print the new `m3`." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "m3: [[ 697.33 748.11 437.89 482.33]\n", + " [ 402.22 437.89 454.56 489.89]]\n" + ] + } + ], + "source": [ + "m3 = m3.round(decimals=2)\n", + "\n", + "print(\"m3: \", m3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sort the `m3` array so that the highest value is at the top left, the next highest value to the right of the highest, and the lowest value is at the bottom right. Print the sorted `m3` array." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sorted m3: [[ 748.11 697.33 489.89 482.33]\n", + " [ 454.56 437.89 437.89 402.22]]\n" + ] + } + ], + "source": [ + "sorted_m3 = np.sort(m3,axis=None)[::-1].reshape(m3.shape)\n", + "print(\"sorted m3: \", sorted_m3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## NumPy and Masks" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create an array called `f` where there are 100 equally-spaced values from 0 to pi, inclusive.\n", + "Take the sin of the array `f` (element-wise) and store that in place. Print `f`." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "f: [ 0.00000000e+00 3.17279335e-02 6.34239197e-02 9.50560433e-02\n", + " 1.26592454e-01 1.58001396e-01 1.89251244e-01 2.20310533e-01\n", + " 2.51147987e-01 2.81732557e-01 3.12033446e-01 3.42020143e-01\n", + " 3.71662456e-01 4.00930535e-01 4.29794912e-01 4.58226522e-01\n", + " 4.86196736e-01 5.13677392e-01 5.40640817e-01 5.67059864e-01\n", + " 5.92907929e-01 6.18158986e-01 6.42787610e-01 6.66769001e-01\n", + " 6.90079011e-01 7.12694171e-01 7.34591709e-01 7.55749574e-01\n", + " 7.76146464e-01 7.95761841e-01 8.14575952e-01 8.32569855e-01\n", + " 8.49725430e-01 8.66025404e-01 8.81453363e-01 8.95993774e-01\n", + " 9.09631995e-01 9.22354294e-01 9.34147860e-01 9.45000819e-01\n", + " 9.54902241e-01 9.63842159e-01 9.71811568e-01 9.78802446e-01\n", + " 9.84807753e-01 9.89821442e-01 9.93838464e-01 9.96854776e-01\n", + " 9.98867339e-01 9.99874128e-01 9.99874128e-01 9.98867339e-01\n", + " 9.96854776e-01 9.93838464e-01 9.89821442e-01 9.84807753e-01\n", + " 9.78802446e-01 9.71811568e-01 9.63842159e-01 9.54902241e-01\n", + " 9.45000819e-01 9.34147860e-01 9.22354294e-01 9.09631995e-01\n", + " 8.95993774e-01 8.81453363e-01 8.66025404e-01 8.49725430e-01\n", + " 8.32569855e-01 8.14575952e-01 7.95761841e-01 7.76146464e-01\n", + " 7.55749574e-01 7.34591709e-01 7.12694171e-01 6.90079011e-01\n", + " 6.66769001e-01 6.42787610e-01 6.18158986e-01 5.92907929e-01\n", + " 5.67059864e-01 5.40640817e-01 5.13677392e-01 4.86196736e-01\n", + " 4.58226522e-01 4.29794912e-01 4.00930535e-01 3.71662456e-01\n", + " 3.42020143e-01 3.12033446e-01 2.81732557e-01 2.51147987e-01\n", + " 2.20310533e-01 1.89251244e-01 1.58001396e-01 1.26592454e-01\n", + " 9.50560433e-02 6.34239197e-02 3.17279335e-02 1.22464680e-16]\n" + ] + } + ], + "source": [ + "f = np.sin(np.linspace(0,np.pi,100))\n", + "\n", + "print(\"f: \", f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use a 'mask' and print an array that is True when `f` >= 1/2 and False when `f` < 1/2.\n", + "Print an array sequence that has only those values where `f` >= 1/2." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 0.51367739 0.54064082 0.56705986 0.59290793 0.61815899 0.64278761\n", + " 0.666769 0.69007901 0.71269417 0.73459171 0.75574957 0.77614646\n", + " 0.79576184 0.81457595 0.83256985 0.84972543 0.8660254 0.88145336\n", + " 0.89599377 0.909632 0.92235429 0.93414786 0.94500082 0.95490224\n", + " 0.96384216 0.97181157 0.97880245 0.98480775 0.98982144 0.99383846\n", + " 0.99685478 0.99886734 0.99987413 0.99987413 0.99886734 0.99685478\n", + " 0.99383846 0.98982144 0.98480775 0.97880245 0.97181157 0.96384216\n", + " 0.95490224 0.94500082 0.93414786 0.92235429 0.909632 0.89599377\n", + " 0.88145336 0.8660254 0.84972543 0.83256985 0.81457595 0.79576184\n", + " 0.77614646 0.75574957 0.73459171 0.71269417 0.69007901 0.666769\n", + " 0.64278761 0.61815899 0.59290793 0.56705986 0.54064082 0.51367739]\n" + ] + } + ], + "source": [ + "mask = f>=0.5\n", + "print(f[mask])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## NumPy and 2 Variable Prediction" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let `x` be the number of miles a person drives per day and `y` be the dollars spent on buying car fuel per day.\n", + " \n", + "We have created 2 numpy arrays each of size 100 that represent `x` and `y`. \n", + "`x` (number of miles) ranges from 1 to 10 with a uniform noise of (0, 1/2). \n", + "`y` (money spent in dollars) will be from 1 to 20 with a uniform noise (0, 1). \n", + "\n", + "Run the cell below." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x = [ 1.34683976 1.12176759 1.51512398 1.55233174 1.40619168\n", + " 1.65075498 1.79399331 1.80243817 1.89844195 2.00100023\n", + " 2.3344038 2.22424872 2.24914511 2.36268477 2.49808849\n", + " 2.8212704 2.68452475 2.68229427 3.09511169 2.95703884\n", + " 3.09047742 3.2544361 3.41541904 3.40886375 3.50672677\n", + " 3.74960644 3.64861355 3.7721462 3.56368566 4.01092701\n", + " 4.15630694 4.06088549 4.02517179 4.25169402 4.15897504\n", + " 4.26835333 4.32520644 4.48563164 4.78490721 4.84614839\n", + " 4.96698768 5.18754259 5.29582013 5.32097781 5.0674106\n", + " 5.47601124 5.46852704 5.64537452 5.49642807 5.89755027\n", + " 5.68548923 5.76276141 5.94613234 6.18135713 5.96522091\n", + " 6.0275473 6.54290191 6.4991329 6.74003765 6.81809807\n", + " 6.50611821 6.91538752 7.01250925 6.89905417 7.31314433\n", + " 7.20472297 7.1043621 7.48199528 7.58957227 7.61744354\n", + " 7.6991707 7.85436822 8.03510784 7.80787781 8.22410224\n", + " 7.99366248 8.40581097 8.28913792 8.45971515 8.54227144\n", + " 8.6906456 8.61856507 8.83489887 8.66309658 8.94837987\n", + " 9.20890222 8.9614749 8.92608294 9.13231416 9.55889896\n", + " 9.61488451 9.54252979 9.42015491 9.90952569 10.00659591\n", + " 10.02504265 10.07330937 9.93489915 10.0892334 10.36509991]\n", + "y= [ 1.6635012 2.0214592 2.10816052 2.26016496 1.96287558\n", + " 2.9554635 3.02881887 3.33565296 2.75465779 3.4250107\n", + " 3.39670148 3.39377767 3.78503343 4.38293049 4.32963586\n", + " 4.03925039 4.73691868 4.30098399 4.8416329 4.78175957\n", + " 4.99765787 5.31746817 5.76844671 5.93723749 5.72811642\n", + " 6.70973615 6.68143367 6.57482731 7.17737603 7.54863252\n", + " 7.30221419 7.3202573 7.78023884 7.91133365 8.2765417\n", + " 8.69203281 8.78219865 8.45897546 8.89094715 8.81719921\n", + " 8.87106971 9.66192562 9.4020625 9.85990783 9.60359778\n", + " 10.07386266 10.6957995 10.66721916 11.18256285 10.57431836\n", + " 11.46744716 10.94398916 11.26445259 12.09754828 12.11988037\n", + " 12.121557 12.17613693 12.43750193 13.00912372 12.86407194\n", + " 13.24640866 12.76120085 13.11723062 14.07841099 14.19821707\n", + " 14.27289001 14.30624942 14.63060835 14.2770918 15.0744923\n", + " 14.45261619 15.11897313 15.2378667 15.27203124 15.32491892\n", + " 16.01095271 15.71250558 16.29488506 16.70618934 16.56555394\n", + " 16.42379457 17.18144744 17.13813976 17.69613625 17.37763019\n", + " 17.90942839 17.90343733 18.01951169 18.35727914 18.16841269\n", + " 18.61813748 18.66062754 18.81217983 19.44995194 19.7213867\n", + " 19.71966726 19.78961904 19.64385088 20.69719809 20.07974319]\n" + ] + } + ], + "source": [ + "# seed the random number generator with a fixed value\n", + "np.random.seed(500)\n", + "\n", + "x=np.linspace(1,10,100)+ np.random.uniform(low=0,high=.5,size=100) #purpose of this command????\n", + "y=np.linspace(1,20,100)+ np.random.uniform(low=0,high=1,size=100)\n", + "print ('x = ',x)\n", + "print ('y= ',y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Find the expected value of `x` and the expected value of `y`." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(5.7825325415879227, 11.012981683344968)" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "##### ignore\n", + "expx=np.mean(x)\n", + "expy=np.mean(y)\n", + "expx, expy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Find the variance for `x` and `y`." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "7.03332752948\n", + "30.1139035755\n" + ] + } + ], + "source": [ + "##### ignore\n", + "varx=np.var(x)\n", + "vary=np.var(y)\n", + "print(varx)\n", + "print(vary)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Find the co-variance of `x` and `y`." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 7.10437124, 14.65774383],\n", + " [ 14.65774383, 30.41808442]])" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "##### ignore\n", + "covar=np.cov(x,y)\n", + "covar" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Assume that the number of dollars spent on car fuel is only linearly dependent on the miles driven.\n", + "Write code that uses a linear predictor to calculate a predicted value of `y` for each `x`. \n", + "\n", + "i.e. $y_{predicted} = f(x) = mx + b.$" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (, line 1)", + "output_type": "error", + "traceback": [ + "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m1\u001b[0m\n\u001b[1;33m y_predicted =\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "source": [ + "y_predicted =" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Predict `y` for each value in `x`, put the error into an array called $y_{error}$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "y_error = np.array(y-y_predicted)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Write code that calculates the root mean square error (RMSE)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "rmse = " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pandas" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Reading a File" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Read in a CSV file called 'data3.csv' into a dataframe called df.\n", + "\n", + "Data description\n", + "* Data source: http://www.fao.org/nr/water/aquastat/data/query/index.html\n", + "* Data, units\n", + " * GDP, current USD (CPI adjusted)\n", + " * NRI, mm/yr\n", + " * Population density, inhab/km^2\n", + " * Total area of the country, 1000 ha = 10km^2\n", + " * Total Population, unit 1000 inhabitants\n", + "\n", + "Display the first 10 lines of the dataframe." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "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", + "
AreaArea IdVariable NameVariable IdYearValueSymbolMd
0Argentina9.0Total area of the country4100.01962.0278040.0ENaN
1Argentina9.0Total area of the country4100.01967.0278040.0ENaN
2Argentina9.0Total area of the country4100.01972.0278040.0ENaN
3Argentina9.0Total area of the country4100.01977.0278040.0ENaN
4Argentina9.0Total area of the country4100.01982.0278040.0ENaN
5Argentina9.0Total area of the country4100.01987.0278040.0ENaN
6Argentina9.0Total area of the country4100.01992.0278040.0ENaN
7Argentina9.0Total area of the country4100.01997.0278040.0ENaN
8Argentina9.0Total area of the country4100.02002.0278040.0ENaN
9Argentina9.0Total area of the country4100.02007.0278040.0ENaN
\n", + "
" + ], + "text/plain": [ + " Area Area Id Variable Name Variable Id Year \\\n", + "0 Argentina 9.0 Total area of the country 4100.0 1962.0 \n", + "1 Argentina 9.0 Total area of the country 4100.0 1967.0 \n", + "2 Argentina 9.0 Total area of the country 4100.0 1972.0 \n", + "3 Argentina 9.0 Total area of the country 4100.0 1977.0 \n", + "4 Argentina 9.0 Total area of the country 4100.0 1982.0 \n", + "5 Argentina 9.0 Total area of the country 4100.0 1987.0 \n", + "6 Argentina 9.0 Total area of the country 4100.0 1992.0 \n", + "7 Argentina 9.0 Total area of the country 4100.0 1997.0 \n", + "8 Argentina 9.0 Total area of the country 4100.0 2002.0 \n", + "9 Argentina 9.0 Total area of the country 4100.0 2007.0 \n", + "\n", + " Value Symbol Md \n", + "0 278040.0 E NaN \n", + "1 278040.0 E NaN \n", + "2 278040.0 E NaN \n", + "3 278040.0 E NaN \n", + "4 278040.0 E NaN \n", + "5 278040.0 E NaN \n", + "6 278040.0 E NaN \n", + "7 278040.0 E NaN \n", + "8 278040.0 E NaN \n", + "9 278040.0 E NaN " + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv(\"data3.csv\")\n", + "df.head(n=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Display the column names." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Area', 'Area Id', 'Variable Name', 'Variable Id', 'Year', 'Value',\n", + " 'Symbol', 'Md'],\n", + " dtype='object')" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.columns" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Data Preprocessing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create a mask of NAN values (i.e. apply `.isnull` on the dataframe). Inspect the mask for 'True' values, they denote NANs. \n", + "*Hint: You will notice that the last 8 rows and the last column ('Other') have NAN values. You can also use df.tail() to see the last row.*\n", + "\n", + "Remove the bottom 8 rows from the dataframe because they contain NAN values. Also remove the column 'Other'." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "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", + "
AreaArea IdVariable NameVariable IdYearValueSymbol
385United States of America231.0National Rainfall Index (NRI)4472.01981.0949.2E
386United States of America231.0National Rainfall Index (NRI)4472.01984.0974.6E
387United States of America231.0National Rainfall Index (NRI)4472.01992.01020.0E
388United States of America231.0National Rainfall Index (NRI)4472.01996.01005.0E
389United States of America231.0National Rainfall Index (NRI)4472.02002.0938.7E
\n", + "
" + ], + "text/plain": [ + " Area Area Id Variable Name \\\n", + "385 United States of America 231.0 National Rainfall Index (NRI) \n", + "386 United States of America 231.0 National Rainfall Index (NRI) \n", + "387 United States of America 231.0 National Rainfall Index (NRI) \n", + "388 United States of America 231.0 National Rainfall Index (NRI) \n", + "389 United States of America 231.0 National Rainfall Index (NRI) \n", + "\n", + " Variable Id Year Value Symbol \n", + "385 4472.0 1981.0 949.2 E \n", + "386 4472.0 1984.0 974.6 E \n", + "387 4472.0 1992.0 1020.0 E \n", + "388 4472.0 1996.0 1005.0 E \n", + "389 4472.0 2002.0 938.7 E " + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mask = df.isnull()\n", + "newdf=df.head(-8)\n", + "del newdf['Md']\n", + "newdf.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All the columns in our dataframe are not required for analysis. Drop these columns: `Area Id`, `Variable Id`, and `Symbol` and save the new dataframe as `df1`. " + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "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", + "
AreaVariable NameYearValue
0ArgentinaTotal area of the country1962.02.780400e+05
1ArgentinaTotal area of the country1967.02.780400e+05
2ArgentinaTotal area of the country1972.02.780400e+05
3ArgentinaTotal area of the country1977.02.780400e+05
4ArgentinaTotal area of the country1982.02.780400e+05
5ArgentinaTotal area of the country1987.02.780400e+05
6ArgentinaTotal area of the country1992.02.780400e+05
7ArgentinaTotal area of the country1997.02.780400e+05
8ArgentinaTotal area of the country2002.02.780400e+05
9ArgentinaTotal area of the country2007.02.780400e+05
10ArgentinaTotal area of the country2012.02.780400e+05
11ArgentinaTotal area of the country2014.02.780400e+05
12ArgentinaTotal population1962.02.128800e+04
13ArgentinaTotal population1967.02.293200e+04
14ArgentinaTotal population1972.02.478300e+04
15ArgentinaTotal population1977.02.687900e+04
16ArgentinaTotal population1982.02.899400e+04
17ArgentinaTotal population1987.03.132600e+04
18ArgentinaTotal population1992.03.365500e+04
19ArgentinaTotal population1997.03.583400e+04
20ArgentinaTotal population2002.03.788900e+04
21ArgentinaTotal population2007.03.997000e+04
22ArgentinaTotal population2012.04.209500e+04
23ArgentinaTotal population2015.04.341700e+04
24ArgentinaPopulation density1962.07.656000e+00
25ArgentinaPopulation density1967.08.248000e+00
26ArgentinaPopulation density1972.08.913000e+00
27ArgentinaPopulation density1977.09.667000e+00
28ArgentinaPopulation density1982.01.043000e+01
29ArgentinaPopulation density1987.01.127000e+01
...............
360United States of AmericaPopulation density1972.02.214000e+01
361United States of AmericaPopulation density1977.02.317000e+01
362United States of AmericaPopulation density1982.02.430000e+01
363United States of AmericaPopulation density1987.02.549000e+01
364United States of AmericaPopulation density1992.02.678000e+01
365United States of AmericaPopulation density1997.02.834000e+01
366United States of AmericaPopulation density2002.02.995000e+01
367United States of AmericaPopulation density2007.03.132000e+01
368United States of AmericaPopulation density2012.03.202000e+01
369United States of AmericaPopulation density2015.03.273000e+01
370United States of AmericaGross Domestic Product (GDP)1962.06.050000e+11
371United States of AmericaGross Domestic Product (GDP)1967.08.620000e+11
372United States of AmericaGross Domestic Product (GDP)1972.01.280000e+12
373United States of AmericaGross Domestic Product (GDP)1977.02.090000e+12
374United States of AmericaGross Domestic Product (GDP)1982.03.340000e+12
375United States of AmericaGross Domestic Product (GDP)1987.04.870000e+12
376United States of AmericaGross Domestic Product (GDP)1992.06.540000e+12
377United States of AmericaGross Domestic Product (GDP)1997.08.610000e+12
378United States of AmericaGross Domestic Product (GDP)2002.01.100000e+13
379United States of AmericaGross Domestic Product (GDP)2007.01.450000e+13
380United States of AmericaGross Domestic Product (GDP)2012.01.620000e+13
381United States of AmericaGross Domestic Product (GDP)2015.01.790000e+13
382United States of AmericaNational Rainfall Index (NRI)1965.09.285000e+02
383United States of AmericaNational Rainfall Index (NRI)1969.09.522000e+02
384United States of AmericaNational Rainfall Index (NRI)1974.01.008000e+03
385United States of AmericaNational Rainfall Index (NRI)1981.09.492000e+02
386United States of AmericaNational Rainfall Index (NRI)1984.09.746000e+02
387United States of AmericaNational Rainfall Index (NRI)1992.01.020000e+03
388United States of AmericaNational Rainfall Index (NRI)1996.01.005000e+03
389United States of AmericaNational Rainfall Index (NRI)2002.09.387000e+02
\n", + "

390 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " Area Variable Name Year \\\n", + "0 Argentina Total area of the country 1962.0 \n", + "1 Argentina Total area of the country 1967.0 \n", + "2 Argentina Total area of the country 1972.0 \n", + "3 Argentina Total area of the country 1977.0 \n", + "4 Argentina Total area of the country 1982.0 \n", + "5 Argentina Total area of the country 1987.0 \n", + "6 Argentina Total area of the country 1992.0 \n", + "7 Argentina Total area of the country 1997.0 \n", + "8 Argentina Total area of the country 2002.0 \n", + "9 Argentina Total area of the country 2007.0 \n", + "10 Argentina Total area of the country 2012.0 \n", + "11 Argentina Total area of the country 2014.0 \n", + "12 Argentina Total population 1962.0 \n", + "13 Argentina Total population 1967.0 \n", + "14 Argentina Total population 1972.0 \n", + "15 Argentina Total population 1977.0 \n", + "16 Argentina Total population 1982.0 \n", + "17 Argentina Total population 1987.0 \n", + "18 Argentina Total population 1992.0 \n", + "19 Argentina Total population 1997.0 \n", + "20 Argentina Total population 2002.0 \n", + "21 Argentina Total population 2007.0 \n", + "22 Argentina Total population 2012.0 \n", + "23 Argentina Total population 2015.0 \n", + "24 Argentina Population density 1962.0 \n", + "25 Argentina Population density 1967.0 \n", + "26 Argentina Population density 1972.0 \n", + "27 Argentina Population density 1977.0 \n", + "28 Argentina Population density 1982.0 \n", + "29 Argentina Population density 1987.0 \n", + ".. ... ... ... \n", + "360 United States of America Population density 1972.0 \n", + "361 United States of America Population density 1977.0 \n", + "362 United States of America Population density 1982.0 \n", + "363 United States of America Population density 1987.0 \n", + "364 United States of America Population density 1992.0 \n", + "365 United States of America Population density 1997.0 \n", + "366 United States of America Population density 2002.0 \n", + "367 United States of America Population density 2007.0 \n", + "368 United States of America Population density 2012.0 \n", + "369 United States of America Population density 2015.0 \n", + "370 United States of America Gross Domestic Product (GDP) 1962.0 \n", + "371 United States of America Gross Domestic Product (GDP) 1967.0 \n", + "372 United States of America Gross Domestic Product (GDP) 1972.0 \n", + "373 United States of America Gross Domestic Product (GDP) 1977.0 \n", + "374 United States of America Gross Domestic Product (GDP) 1982.0 \n", + "375 United States of America Gross Domestic Product (GDP) 1987.0 \n", + "376 United States of America Gross Domestic Product (GDP) 1992.0 \n", + "377 United States of America Gross Domestic Product (GDP) 1997.0 \n", + "378 United States of America Gross Domestic Product (GDP) 2002.0 \n", + "379 United States of America Gross Domestic Product (GDP) 2007.0 \n", + "380 United States of America Gross Domestic Product (GDP) 2012.0 \n", + "381 United States of America Gross Domestic Product (GDP) 2015.0 \n", + "382 United States of America National Rainfall Index (NRI) 1965.0 \n", + "383 United States of America National Rainfall Index (NRI) 1969.0 \n", + "384 United States of America National Rainfall Index (NRI) 1974.0 \n", + "385 United States of America National Rainfall Index (NRI) 1981.0 \n", + "386 United States of America National Rainfall Index (NRI) 1984.0 \n", + "387 United States of America National Rainfall Index (NRI) 1992.0 \n", + "388 United States of America National Rainfall Index (NRI) 1996.0 \n", + "389 United States of America National Rainfall Index (NRI) 2002.0 \n", + "\n", + " Value \n", + "0 2.780400e+05 \n", + "1 2.780400e+05 \n", + "2 2.780400e+05 \n", + "3 2.780400e+05 \n", + "4 2.780400e+05 \n", + "5 2.780400e+05 \n", + "6 2.780400e+05 \n", + "7 2.780400e+05 \n", + "8 2.780400e+05 \n", + "9 2.780400e+05 \n", + "10 2.780400e+05 \n", + "11 2.780400e+05 \n", + "12 2.128800e+04 \n", + "13 2.293200e+04 \n", + "14 2.478300e+04 \n", + "15 2.687900e+04 \n", + "16 2.899400e+04 \n", + "17 3.132600e+04 \n", + "18 3.365500e+04 \n", + "19 3.583400e+04 \n", + "20 3.788900e+04 \n", + "21 3.997000e+04 \n", + "22 4.209500e+04 \n", + "23 4.341700e+04 \n", + "24 7.656000e+00 \n", + "25 8.248000e+00 \n", + "26 8.913000e+00 \n", + "27 9.667000e+00 \n", + "28 1.043000e+01 \n", + "29 1.127000e+01 \n", + ".. ... \n", + "360 2.214000e+01 \n", + "361 2.317000e+01 \n", + "362 2.430000e+01 \n", + "363 2.549000e+01 \n", + "364 2.678000e+01 \n", + "365 2.834000e+01 \n", + "366 2.995000e+01 \n", + "367 3.132000e+01 \n", + "368 3.202000e+01 \n", + "369 3.273000e+01 \n", + "370 6.050000e+11 \n", + "371 8.620000e+11 \n", + "372 1.280000e+12 \n", + "373 2.090000e+12 \n", + "374 3.340000e+12 \n", + "375 4.870000e+12 \n", + "376 6.540000e+12 \n", + "377 8.610000e+12 \n", + "378 1.100000e+13 \n", + "379 1.450000e+13 \n", + "380 1.620000e+13 \n", + "381 1.790000e+13 \n", + "382 9.285000e+02 \n", + "383 9.522000e+02 \n", + "384 1.008000e+03 \n", + "385 9.492000e+02 \n", + "386 9.746000e+02 \n", + "387 1.020000e+03 \n", + "388 1.005000e+03 \n", + "389 9.387000e+02 \n", + "\n", + "[390 rows x 4 columns]" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df1 = newdf.drop(['Area Id','Variable Id','Symbol'],axis=1)\n", + "\n", + "df1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Display all the unique values in your new dataframe for these columns: `Area`, `Variable Name`, and `Year`. \n", + "\n", + "Note the Countries and the Metrics (ie.recorded variables) represented in your dataset.\n", + "*Hint: Use .unique( ) method.*" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Argentina' 'Australia' 'Germany' 'Iceland' 'Ireland' 'Sweden'\n", + " 'United States of America']\n", + "[ 1962. 1967. 1972. 1977. 1982. 1987. 1992. 1997. 2002. 2007.\n", + " 2012. 2014. 2015. 1963. 1970. 1974. 1978. 1984. 1990. 1964.\n", + " 1981. 1985. 1996. 2001. 1969. 1973. 1979. 1993. 1971. 1975.\n", + " 1986. 1991. 1998. 2000. 1965. 1983. 1988. 1995.]\n", + "['Total area of the country' 'Total population' 'Population density'\n", + " 'Gross Domestic Product (GDP)' 'National Rainfall Index (NRI)']\n" + ] + } + ], + "source": [ + "print(newdf['Area'].unique())\n", + "print(newdf['Year'].unique())\n", + "print(newdf['Variable Name'].unique())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Convert the `Year` column string values to pandas datetime objects, where only the year is specified. \n", + "*Hint: df1['Year'] = pd.to_datetime(pd.Series(df1['Year']).astype(int),format='%Y').dt.year*\n", + "\n", + "Run df1.tail() to see part of the result." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "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", + "
AreaVariable NameYearValue
385United States of AmericaNational Rainfall Index (NRI)1981949.2
386United States of AmericaNational Rainfall Index (NRI)1984974.6
387United States of AmericaNational Rainfall Index (NRI)19921020.0
388United States of AmericaNational Rainfall Index (NRI)19961005.0
389United States of AmericaNational Rainfall Index (NRI)2002938.7
\n", + "
" + ], + "text/plain": [ + " Area Variable Name Year Value\n", + "385 United States of America National Rainfall Index (NRI) 1981 949.2\n", + "386 United States of America National Rainfall Index (NRI) 1984 974.6\n", + "387 United States of America National Rainfall Index (NRI) 1992 1020.0\n", + "388 United States of America National Rainfall Index (NRI) 1996 1005.0\n", + "389 United States of America National Rainfall Index (NRI) 2002 938.7" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df1['Year'] = pd.to_datetime(pd.Series(df1['Year']).astype(int),format='%Y').dt.year\n", + "df1.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Extracting Statistics" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create a dataframe 'dftemp' to store rows where the `Area` is `Iceland`." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "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", + "
AreaVariable NameYearValue
166IcelandTotal area of the country196210300.0
167IcelandTotal area of the country196710300.0
168IcelandTotal area of the country197210300.0
169IcelandTotal area of the country197710300.0
170IcelandTotal area of the country198210300.0
171IcelandTotal area of the country198710300.0
172IcelandTotal area of the country199210300.0
173IcelandTotal area of the country199710300.0
174IcelandTotal area of the country200210300.0
175IcelandTotal area of the country200710300.0
\n", + "
" + ], + "text/plain": [ + " Area Variable Name Year Value\n", + "166 Iceland Total area of the country 1962 10300.0\n", + "167 Iceland Total area of the country 1967 10300.0\n", + "168 Iceland Total area of the country 1972 10300.0\n", + "169 Iceland Total area of the country 1977 10300.0\n", + "170 Iceland Total area of the country 1982 10300.0\n", + "171 Iceland Total area of the country 1987 10300.0\n", + "172 Iceland Total area of the country 1992 10300.0\n", + "173 Iceland Total area of the country 1997 10300.0\n", + "174 Iceland Total area of the country 2002 10300.0\n", + "175 Iceland Total area of the country 2007 10300.0" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dftemp = df1[(df1['Area'] == \"Iceland\")]\n", + "#dftemp = df1.where(df1['Area'] == 'Iceland') ...... where command keeps array size same so not used here\n", + "dftemp.head(10)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Print the years when the National Rainfall Index (NRI) was `> 950` or `< 900` in Iceland using the dataframe you created in the previous question." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "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", + "
AreaVariable NameYearValue
214IcelandNational Rainfall Index (NRI)1967816.0
215IcelandNational Rainfall Index (NRI)1971963.2
216IcelandNational Rainfall Index (NRI)19751010.0
218IcelandNational Rainfall Index (NRI)1986968.5
219IcelandNational Rainfall Index (NRI)19911095.0
220IcelandNational Rainfall Index (NRI)1997993.2
\n", + "
" + ], + "text/plain": [ + " Area Variable Name Year Value\n", + "214 Iceland National Rainfall Index (NRI) 1967 816.0\n", + "215 Iceland National Rainfall Index (NRI) 1971 963.2\n", + "216 Iceland National Rainfall Index (NRI) 1975 1010.0\n", + "218 Iceland National Rainfall Index (NRI) 1986 968.5\n", + "219 Iceland National Rainfall Index (NRI) 1991 1095.0\n", + "220 Iceland National Rainfall Index (NRI) 1997 993.2" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nri = dftemp[(dftemp['Variable Name'] == \"National Rainfall Index (NRI)\")]\n", + "nri = nri[(nri.Value>950) |(nri.Value<900) ]\n", + "nri.head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Get all the rows of df1 (from the preprocessed data section of this notebook) where the `Area` is `United States of America` and store that into a new dataframe called `df_usa`. Set the indices of the this dataframe to be the `Year` column. \n", + "*Hint: Use .set_index()*" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "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", + "
AreaVariable NameValue
Year
1962United States of AmericaTotal area of the country962909.0
1967United States of AmericaTotal area of the country962909.0
1972United States of AmericaTotal area of the country962909.0
1977United States of AmericaTotal area of the country962909.0
1982United States of AmericaTotal area of the country962909.0
\n", + "
" + ], + "text/plain": [ + " Area Variable Name Value\n", + "Year \n", + "1962 United States of America Total area of the country 962909.0\n", + "1967 United States of America Total area of the country 962909.0\n", + "1972 United States of America Total area of the country 962909.0\n", + "1977 United States of America Total area of the country 962909.0\n", + "1982 United States of America Total area of the country 962909.0" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_usa = df1[(df1['Area'] == \"United States of America\")].set_index('Year')\n", + "df_usa.head(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pivot the dataframe so that the unique `Variable Name` entries become the column entries. The dataframe values should be the ones in the `Value` column. Do this by running the lines of code below." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "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", + "
Variable NameGross Domestic Product (GDP)National Rainfall Index (NRI)Population densityTotal area of the countryTotal population
Year
19626.050000e+11NaN19.93962909.0191861.0
1965NaN928.5NaNNaNNaN
19678.620000e+11NaN21.16962909.0203713.0
1969NaN952.2NaNNaNNaN
19721.280000e+12NaN22.14962909.0213220.0
\n", + "
" + ], + "text/plain": [ + "Variable Name Gross Domestic Product (GDP) National Rainfall Index (NRI) \\\n", + "Year \n", + "1962 6.050000e+11 NaN \n", + "1965 NaN 928.5 \n", + "1967 8.620000e+11 NaN \n", + "1969 NaN 952.2 \n", + "1972 1.280000e+12 NaN \n", + "\n", + "Variable Name Population density Total area of the country Total population \n", + "Year \n", + "1962 19.93 962909.0 191861.0 \n", + "1965 NaN NaN NaN \n", + "1967 21.16 962909.0 203713.0 \n", + "1969 NaN NaN NaN \n", + "1972 22.14 962909.0 213220.0 " + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_usa=df_usa.pivot(columns='Variable Name',values='Value')\n", + "df_usa.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Rename the corresponding columns to ['GDP','NRI','PD','Area','Population']." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "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", + "
Variable NameGDPNRIPDAreaPopulation
Year
19626.050000e+11NaN19.93962909.0191861.0
1965NaN928.5NaNNaNNaN
19678.620000e+11NaN21.16962909.0203713.0
1969NaN952.2NaNNaNNaN
19721.280000e+12NaN22.14962909.0213220.0
1974NaN1008.0NaNNaNNaN
19772.090000e+12NaN23.17962909.0223091.0
1981NaN949.2NaNNaNNaN
19823.340000e+12NaN24.30962909.0233954.0
1984NaN974.6NaNNaNNaN
19874.870000e+12NaN25.49962909.0245425.0
19926.540000e+121020.026.78962909.0257908.0
1996NaN1005.0NaNNaNNaN
19978.610000e+12NaN28.34962909.0272883.0
20021.100000e+13938.729.95963203.0288471.0
20071.450000e+13NaN31.32963203.0301656.0
20121.620000e+13NaN32.02983151.0314799.0
2014NaNNaNNaN983151.0NaN
20151.790000e+13NaN32.73NaN321774.0
\n", + "
" + ], + "text/plain": [ + "Variable Name GDP NRI PD Area Population\n", + "Year \n", + "1962 6.050000e+11 NaN 19.93 962909.0 191861.0\n", + "1965 NaN 928.5 NaN NaN NaN\n", + "1967 8.620000e+11 NaN 21.16 962909.0 203713.0\n", + "1969 NaN 952.2 NaN NaN NaN\n", + "1972 1.280000e+12 NaN 22.14 962909.0 213220.0\n", + "1974 NaN 1008.0 NaN NaN NaN\n", + "1977 2.090000e+12 NaN 23.17 962909.0 223091.0\n", + "1981 NaN 949.2 NaN NaN NaN\n", + "1982 3.340000e+12 NaN 24.30 962909.0 233954.0\n", + "1984 NaN 974.6 NaN NaN NaN\n", + "1987 4.870000e+12 NaN 25.49 962909.0 245425.0\n", + "1992 6.540000e+12 1020.0 26.78 962909.0 257908.0\n", + "1996 NaN 1005.0 NaN NaN NaN\n", + "1997 8.610000e+12 NaN 28.34 962909.0 272883.0\n", + "2002 1.100000e+13 938.7 29.95 963203.0 288471.0\n", + "2007 1.450000e+13 NaN 31.32 963203.0 301656.0\n", + "2012 1.620000e+13 NaN 32.02 983151.0 314799.0\n", + "2014 NaN NaN NaN 983151.0 NaN\n", + "2015 1.790000e+13 NaN 32.73 NaN 321774.0" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_usa=df_usa.rename(columns={'Gross Domestic Product (GDP)':'GDP'})\n", + "df_usa=df_usa.rename(columns={'National Rainfall Index (NRI)':'NRI'})\n", + "df_usa=df_usa.rename(columns={'Population density':'PD'})\n", + "df_usa=df_usa.rename(columns={'Total area of the country':'Area'})\n", + "df_usa=df_usa.rename(columns={'Total population':'Population'})\n", + "df_usa" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Print the output of `df_usa.isnull().sum()`. This gives us the number of NAN values in each column. Replace the NAN values by 0, using `df_usa=df_usa.fillna(0)`. Print the output of `df_usa.isnull().sum()` again." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of NAN values before: Variable Name\n", + "GDP 7\n", + "NRI 11\n", + "PD 7\n", + "Area 7\n", + "Population 7\n", + "dtype: int64\n", + "Number of NAN values after: Variable Name\n", + "GDP 0\n", + "NRI 0\n", + "PD 0\n", + "Area 0\n", + "Population 0\n", + "dtype: int64\n" + ] + } + ], + "source": [ + "print(\"Number of NAN values before: \", df_usa.isnull().sum())\n", + "df_usa=df_usa.fillna(0)\n", + "print(\"Number of NAN values after: \", df_usa.isnull().sum())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Calculate and print all the column averages and the column standard deviations." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---averages---\n", + "Variable Name\n", + "GDP 4.620895e+12\n", + "NRI 4.092737e+02\n", + "PD 1.670158e+01\n", + "Area 6.103147e+05\n", + "Population 1.615134e+05\n", + "dtype: float64\n", + "---SD---\n", + "Variable Name\n", + "GDP 6.088656e+12\n", + "NRI 4.935515e+02\n", + "PD 1.355462e+01\n", + "Area 4.789482e+05\n", + "Population 1.313805e+05\n", + "dtype: float64\n" + ] + } + ], + "source": [ + "print('---averages---')\n", + "print(df_usa.mean())\n", + "print('---SD---')\n", + "print(df_usa.std())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the `df_usa` dataframe, multiply the `Area` by 10 (so instead of 1000 ha, the unit becomes 100 ha = 1km^2). Store the result in place." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "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", + "
Variable NameGDPNRIPDAreaPopulation
Year
19626.050000e+110.019.939629090.0191861.0
19650.000000e+00928.50.000.00.0
19678.620000e+110.021.169629090.0203713.0
19690.000000e+00952.20.000.00.0
19721.280000e+120.022.149629090.0213220.0
19740.000000e+001008.00.000.00.0
19772.090000e+120.023.179629090.0223091.0
19810.000000e+00949.20.000.00.0
19823.340000e+120.024.309629090.0233954.0
19840.000000e+00974.60.000.00.0
19874.870000e+120.025.499629090.0245425.0
19926.540000e+121020.026.789629090.0257908.0
19960.000000e+001005.00.000.00.0
19978.610000e+120.028.349629090.0272883.0
20021.100000e+13938.729.959632030.0288471.0
20071.450000e+130.031.329632030.0301656.0
20121.620000e+130.032.029831510.0314799.0
20140.000000e+000.00.009831510.00.0
20151.790000e+130.032.730.0321774.0
\n", + "
" + ], + "text/plain": [ + "Variable Name GDP NRI PD Area Population\n", + "Year \n", + "1962 6.050000e+11 0.0 19.93 9629090.0 191861.0\n", + "1965 0.000000e+00 928.5 0.00 0.0 0.0\n", + "1967 8.620000e+11 0.0 21.16 9629090.0 203713.0\n", + "1969 0.000000e+00 952.2 0.00 0.0 0.0\n", + "1972 1.280000e+12 0.0 22.14 9629090.0 213220.0\n", + "1974 0.000000e+00 1008.0 0.00 0.0 0.0\n", + "1977 2.090000e+12 0.0 23.17 9629090.0 223091.0\n", + "1981 0.000000e+00 949.2 0.00 0.0 0.0\n", + "1982 3.340000e+12 0.0 24.30 9629090.0 233954.0\n", + "1984 0.000000e+00 974.6 0.00 0.0 0.0\n", + "1987 4.870000e+12 0.0 25.49 9629090.0 245425.0\n", + "1992 6.540000e+12 1020.0 26.78 9629090.0 257908.0\n", + "1996 0.000000e+00 1005.0 0.00 0.0 0.0\n", + "1997 8.610000e+12 0.0 28.34 9629090.0 272883.0\n", + "2002 1.100000e+13 938.7 29.95 9632030.0 288471.0\n", + "2007 1.450000e+13 0.0 31.32 9632030.0 301656.0\n", + "2012 1.620000e+13 0.0 32.02 9831510.0 314799.0\n", + "2014 0.000000e+00 0.0 0.00 9831510.0 0.0\n", + "2015 1.790000e+13 0.0 32.73 0.0 321774.0" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_usa['Area'] = df_usa['Area']*10\n", + "df_usa" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create a new column in `df_usa` called `GDP/capita` and populate it with the calculated GDP per capita. Round the results to two decimal points. Store the result in place." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\lenovo\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:16: RuntimeWarning: invalid value encountered in true_divide\n", + " app.launch_new_instance()\n" + ] + }, + { + "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", + "
Variable NameGDPNRIPDAreaPopulationGDP/capita
Year
19626.050000e+110.019.939629090.0191861.03153.32
19650.000000e+00928.50.000.00.0NaN
19678.620000e+110.021.169629090.0203713.04231.44
19690.000000e+00952.20.000.00.0NaN
19721.280000e+120.022.149629090.0213220.06003.19
19740.000000e+001008.00.000.00.0NaN
19772.090000e+120.023.179629090.0223091.09368.37
19810.000000e+00949.20.000.00.0NaN
19823.340000e+120.024.309629090.0233954.014276.31
19840.000000e+00974.60.000.00.0NaN
19874.870000e+120.025.499629090.0245425.019843.13
19926.540000e+121020.026.789629090.0257908.025357.88
19960.000000e+001005.00.000.00.0NaN
19978.610000e+120.028.349629090.0272883.031551.98
20021.100000e+13938.729.959632030.0288471.038132.08
20071.450000e+130.031.329632030.0301656.048068.00
20121.620000e+130.032.029831510.0314799.051461.41
20140.000000e+000.00.009831510.00.0NaN
20151.790000e+130.032.730.0321774.055629.11
\n", + "
" + ], + "text/plain": [ + "Variable Name GDP NRI PD Area Population GDP/capita\n", + "Year \n", + "1962 6.050000e+11 0.0 19.93 9629090.0 191861.0 3153.32\n", + "1965 0.000000e+00 928.5 0.00 0.0 0.0 NaN\n", + "1967 8.620000e+11 0.0 21.16 9629090.0 203713.0 4231.44\n", + "1969 0.000000e+00 952.2 0.00 0.0 0.0 NaN\n", + "1972 1.280000e+12 0.0 22.14 9629090.0 213220.0 6003.19\n", + "1974 0.000000e+00 1008.0 0.00 0.0 0.0 NaN\n", + "1977 2.090000e+12 0.0 23.17 9629090.0 223091.0 9368.37\n", + "1981 0.000000e+00 949.2 0.00 0.0 0.0 NaN\n", + "1982 3.340000e+12 0.0 24.30 9629090.0 233954.0 14276.31\n", + "1984 0.000000e+00 974.6 0.00 0.0 0.0 NaN\n", + "1987 4.870000e+12 0.0 25.49 9629090.0 245425.0 19843.13\n", + "1992 6.540000e+12 1020.0 26.78 9629090.0 257908.0 25357.88\n", + "1996 0.000000e+00 1005.0 0.00 0.0 0.0 NaN\n", + "1997 8.610000e+12 0.0 28.34 9629090.0 272883.0 31551.98\n", + "2002 1.100000e+13 938.7 29.95 9632030.0 288471.0 38132.08\n", + "2007 1.450000e+13 0.0 31.32 9632030.0 301656.0 48068.00\n", + "2012 1.620000e+13 0.0 32.02 9831510.0 314799.0 51461.41\n", + "2014 0.000000e+00 0.0 0.00 9831510.0 0.0 NaN\n", + "2015 1.790000e+13 0.0 32.73 0.0 321774.0 55629.11" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'''g = df_usa['GDP'].values\n", + "print(g)\n", + "p= df_usa['Population'].values\n", + "print(p)\n", + "for i,value in enumerate(p):\n", + " print(i,value,g[i])\n", + " if value!=0:\n", + " df_usa['GDP/capita']= (g[i]/value)\n", + " else:\n", + " df_usa['GDP/capita']=0\n", + "df_usa''' #want to know why this is not working\n", + "\n", + "\n", + "g = df_usa['GDP'].values\n", + "p= df_usa['Population'].values\n", + "df_usa['GDP/capita']= g/(p*1000)\n", + "df_usa.round(decimals=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create a new column in `df_usa` called `PD2` (i.e. population density 2). Calculate the population density. **Note: the units should be inhab/km^2**. Round the reults to two decimal point. Store the result in place." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\lenovo\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:3: RuntimeWarning: divide by zero encountered in true_divide\n", + " This is separate from the ipykernel package so we can avoid doing imports until\n", + "C:\\Users\\lenovo\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:3: RuntimeWarning: invalid value encountered in true_divide\n", + " This is separate from the ipykernel package so we can avoid doing imports until\n" + ] + }, + { + "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", + "
Variable NameGDPNRIPDAreaPopulationGDP/capitaPD2
Year
19626.050000e+110.019.939629090.0191861.03153.3219.930000
19650.000000e+00928.50.000.00.0NaNNaN
19678.620000e+110.021.169629090.0203713.04231.4421.160000
19690.000000e+00952.20.000.00.0NaNNaN
19721.280000e+120.022.149629090.0213220.06003.1922.140000
19740.000000e+001008.00.000.00.0NaNNaN
19772.090000e+120.023.179629090.0223091.09368.3723.170000
19810.000000e+00949.20.000.00.0NaNNaN
19823.340000e+120.024.309629090.0233954.014276.3124.300000
19840.000000e+00974.60.000.00.0NaNNaN
19874.870000e+120.025.499629090.0245425.019843.1325.490000
19926.540000e+121020.026.789629090.0257908.025357.8826.780000
19960.000000e+001005.00.000.00.0NaNNaN
19978.610000e+120.028.349629090.0272883.031551.9828.340000
20021.100000e+13938.729.959632030.0288471.038132.0829.950000
20071.450000e+130.031.329632030.0301656.048068.0031.320000
20121.620000e+130.032.029831510.0314799.051461.4132.020000
20140.000000e+000.00.009831510.00.0NaN0.000000
20151.790000e+130.032.730.0321774.055629.11inf
\n", + "
" + ], + "text/plain": [ + "Variable Name GDP NRI PD Area Population GDP/capita \\\n", + "Year \n", + "1962 6.050000e+11 0.0 19.93 9629090.0 191861.0 3153.32 \n", + "1965 0.000000e+00 928.5 0.00 0.0 0.0 NaN \n", + "1967 8.620000e+11 0.0 21.16 9629090.0 203713.0 4231.44 \n", + "1969 0.000000e+00 952.2 0.00 0.0 0.0 NaN \n", + "1972 1.280000e+12 0.0 22.14 9629090.0 213220.0 6003.19 \n", + "1974 0.000000e+00 1008.0 0.00 0.0 0.0 NaN \n", + "1977 2.090000e+12 0.0 23.17 9629090.0 223091.0 9368.37 \n", + "1981 0.000000e+00 949.2 0.00 0.0 0.0 NaN \n", + "1982 3.340000e+12 0.0 24.30 9629090.0 233954.0 14276.31 \n", + "1984 0.000000e+00 974.6 0.00 0.0 0.0 NaN \n", + "1987 4.870000e+12 0.0 25.49 9629090.0 245425.0 19843.13 \n", + "1992 6.540000e+12 1020.0 26.78 9629090.0 257908.0 25357.88 \n", + "1996 0.000000e+00 1005.0 0.00 0.0 0.0 NaN \n", + "1997 8.610000e+12 0.0 28.34 9629090.0 272883.0 31551.98 \n", + "2002 1.100000e+13 938.7 29.95 9632030.0 288471.0 38132.08 \n", + "2007 1.450000e+13 0.0 31.32 9632030.0 301656.0 48068.00 \n", + "2012 1.620000e+13 0.0 32.02 9831510.0 314799.0 51461.41 \n", + "2014 0.000000e+00 0.0 0.00 9831510.0 0.0 NaN \n", + "2015 1.790000e+13 0.0 32.73 0.0 321774.0 55629.11 \n", + "\n", + "Variable Name PD2 \n", + "Year \n", + "1962 19.930000 \n", + "1965 NaN \n", + "1967 21.160000 \n", + "1969 NaN \n", + "1972 22.140000 \n", + "1974 NaN \n", + "1977 23.170000 \n", + "1981 NaN \n", + "1982 24.300000 \n", + "1984 NaN \n", + "1987 25.490000 \n", + "1992 26.780000 \n", + "1996 NaN \n", + "1997 28.340000 \n", + "2002 29.950000 \n", + "2007 31.320000 \n", + "2012 32.020000 \n", + "2014 0.000000 \n", + "2015 inf " + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p=df_usa['Population'].values\n", + "a = df_usa['Area'].values\n", + "df_usa['PD2']=(p*1000)/a\n", + "df_usa.round(decimals=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Find the maximum value and minimum value of the 'NRI' column in the USA (using pandas methods). What years do the min and max values occur in?" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "max NRI: 1020.0 in year: [1992]\n", + "min NRI: 0.0 in year: [1962 1967 1972 1977 1982 1987 1997 2007 2012 2014 2015]\n" + ] + } + ], + "source": [ + "a=df_usa['NRI'].max()\n", + "b=df_usa.index[df_usa['NRI']==a].values\n", + "c=df_usa['NRI'].min()\n", + "d=df_usa.index[df_usa['NRI']==c].values\n", + "print('max NRI:',a,'in year:',b)\n", + "print('min NRI:',c,'in year:',d)\n", + "\n", + "#for value in df_usa['NRI'].values:\n", + "# if value !=0:\n", + "# c=value.min()\n", + "#print(c) ### for finding min value excluding zeros" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Matplotlib" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create a dataframe called `icecream` that has column `Flavor` with entries `Strawberry`, `Vanilla`, and `Chocolate` and another column with `Price` with entries `3.50`, `3.00`, and `4.25`. " + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "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", + "
FlavorPrice
0Strawberry3.50
1Vanilla3.00
2Chocolate4.25
\n", + "
" + ], + "text/plain": [ + " Flavor Price\n", + "0 Strawberry 3.50\n", + "1 Vanilla 3.00\n", + "2 Chocolate 4.25" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d={'Flavor':['Strawberry', 'Vanilla', 'Chocolate'],'Price':[3.50,3.00,4.25]}\n", + "icecream = pd.DataFrame(data=d)\n", + "icecream" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create a bar chart representing the three flavors and their associated prices." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.bar(icecream.Flavor, icecream.Price)\n", + "plt.ylabel('Price')\n", + "plt.xlabel('Flavor')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create 9 random plots. The top three should be scatter plots (one with green dots, one with purple crosses, and one with blue triangles. The middle three graphs should be a line graph, a horizontal bar chart, and a histogram. The bottom three graphs should be trignometric functions (one sin, one cosine, one tangent)." + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABI0AAAJCCAYAAABNpjdvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3Xt8lOWd///3JyciAgISREJoFBBF\nRajRGKw2iC222oJdu639fYtaW1rb7lLbfnfb7cLSprv6293q4pbW2irU3a72oAKrbrMWmeIhpnJW\ngVDUKMFAgpzFMGFyff9IJiZMEkBm7mtm7tfz8eCRTDKZ+33Hw0XeuQ7mnBMAAAAAAADQVY7vAAAA\nAAAAAEg/lEYAAAAAAABIQGkEAAAAAACABJRGAAAAAAAASEBpBAAAAAAAgASURgAAAAAAAEhAaQQA\nAAAAAIAElEYAAAAAAABIQGkEAAAAAACABHm+A/Rm2LBhrrS01HcMAEhLq1ev3uWcK/KdwyfGCQDo\nHeME4wQA9OZExoi0LY1KS0u1atUq3zEAIC2Z2Ru+M/jGOAEAvWOcYJwAgN6cyBjB8jQAAAAAAAAk\noDQCAAAAAABAAkojAABCxDnX52MAAAAgjtIIAICQiMyPqPr26s6iyDmn6turFZkf8RsMAJA2Ghul\nMWOkHTt8JwGQDiiNslDNthrd8cwdqtlW4zsKACBNOOfUsrdFtQtqO4uj6turVbugVi17W5hxBACQ\nJFVVSfX17W8BIG1PT8P7U7OtRtMenKZoLKqC3AItn7VcFSUVvmMBADwzM02/e7okqXZBrWoX1EqS\nyueUa/rd02VmPuMBANJAY6O0aJHU1tb+du5cacQI36kA+MRMoywTqY8oGosq5mKKxqKK1Ed8RwIA\npImuxVEchREAIK6qqr0wkqRYjNlGACiNsk5laaUKcguUa7kqyC1QZWml70gAgDQRX5LWVdc9jgAA\n4RWfZRSNtj+ORtsfs7cREG6URlmmoqRCy2ctV9XUKpamAQA6dd3DqHxOuea1zVP5nPJuexwBAMKr\n6yyjOGYbAQhsTyMzK5H0oKQRktok3eecWxDU9cOkoqSCsghAxmGcSC0zU+Hgwm57GMWXqhUOLmSJ\nGoC0xziRWsuWvTfLKC4alZYulRYu9JMJgH9BboR9RNK3nHNrzGygpNVm9pRzbmOAGQAA6YtxIsUq\n51fKOddZEMWLIwojABmCcSKFGhp8JwCQjgJbnuaca3TOrel4/4CkTZKKg7o+ACC9MU4E4+iCiMII\nQKZgnACA4HnZ08jMSiVNllTr4/oAgPTGOAEA6AvjBAAEI/DSyMwGSHpE0jecc/uP+txsM1tlZqua\nm5uDjgYASAOMEwCAvjBOAEBwAi2NzCxf7f+D/5Vz7tGjP++cu885V+acKysqKgoyGgAgDTBOAAD6\nwjgBAMEKrDSy9k0T7pe0yTl3V1DXBQBkBsYJAEBfGCcAIHhBzjS6XNLnJV1lZus6/nw8wOsDANIb\n4wQAoC+MEwAQsLygLuSce1YSR7QAAHrEOAEA6AvjBAAEz8vpaQAAAAAAAEhvlEYAAAAAAABIQGkE\nAAAAAACABJRGAAAAAAAASEBpBAAAAAAAgASURgAAAAAAAEhAaQQAAAAAAIAElEYAAAAAAABIQGkE\nAAAAAACABJRGAAAAAAAASEBpBADACXDO9fkYAAAAyBaURgAAHKfI/Iiqb6/uLIqcc6q+vVqR+RG/\nwQAAaaWxURozRtqxw3cSADg5lEY9qNlWozueuUM122p8RwEApAnnnFr2tqh2QW1ncVR9e7VqF9Sq\nZW8LM44AAJ2qqqT6+va3AJDJ8nwHSDc122o07cFpisaiKsgt0PJZy1VRUuE7FgAgSZxzMrNeH/fG\nzDT97umSpNoFtapdUCtJKp9Trul3Tz+u1wAAZL/GRmnRIqmtrf3t3LnSiBG+UwHA+8NMo6NE6iOK\nxqKKuZiisagi9RHfkQAASXKyy8u6FkdxFEYAkH1OZnlZVVV7YSRJsRizjQBktqwsjU5meVllaaUK\ncguUa7kqyC1QZWll8gMCAAKXjOVl8a/pqmsJBQDIDu93eVl8llE02v44Gm1/zN5GADJV1i1PO9nl\nZRUlFVo+a7ki9RFVllayNA0AssTJLi/rWjLFvyb+WGLGEQBki5NZXtZ1llFcfLbRwoXJzwoAqZZ1\nM42SsbysoqRC373iuxRGAJBlTmZ5mZmpcHBht5Jp+t3TVT6nXIWDCymMACBLnMzysmXL3ptlFBeN\nSkuXJi8fAAQp62YaxZeXxWcasbwMABDX2/Ky4y2OKudXdts4O14cURgBQHbobXnZ8c42amhIbT4A\nCFrWzTSKLy+rmlrFyWcAgE5HLy+b1zZP5XPKu+1xdDyOLogojAAge/S1vAwAwijrZhpJ7cURZREA\noKvelpdJYnkZAEBS38vL2JMIQBhlZWkEAEBPWF4GAOgLy8sAoLusW54GAEBfWF4GAAAAHB9KIwAA\nAAAAACSgNAIAAAAAAEACSiMAAAAAAAAkoDQCAAAAAABAAkojAAAAAAAAJKA0AgAAAAAAQILASiMz\ne8DMmszs5aCuCQDIHIwTmcc51+djAEgmxgkACF6QM40WS7omwOsBADLLYjFOZIzI/Iiqb6/uLIqc\nc6q+vVqR+RG/wQBks8VinMg4jY3SmDHSjh2+kwB4PwIrjZxzKyXtDup6SI6abTW645k7VLOtxncU\nAFmOcSJzOOfUsrdFtQtqO4uj6turVbugVi17W5hxBCAlGCcyU1WVVF/f/hZA5snzHQDpq2ZbjaY9\nOE3RWFQFuQVaPmu5KkoqfMcCAHhmZpp+93RJUu2CWtUuqJUklc8p1/S7p8vMfMYDAKSJxkZp0SKp\nra397dy50ogRvlMBOBFptRG2mc02s1Vmtqq5udl3nNCL1EcUjUUVczFFY1FF6iO+IwEIOcaJ9NG1\nOIqjMALgG+NEeqmqai+MJCkWY7YRkInSqjRyzt3nnCtzzpUVFRX5jhN6laWVKsgtUK7lqiC3QJWl\nlb4jAQg5xon0EV+S1lXXPY4AwAfGifQRn2UUjbY/jkbbH7O3EZBZ0qo0QnqpKKnQ8lnLVTW1iqVp\nAIBOXfcwKp9Trnlt81Q+p7zbHkcAgHDrOssojtlGQOYJrDQys4ck1Ugab2YNZnZrUNfG+1dRUqHv\nXvFdCiMAKcc4kTnMTIWDC7vtYTT97ukqn1OuwsGFLFEDkBKME5ll2bL3ZhnFRaPS0qV+8gB4fwLb\nCNs5d2NQ1wIAZB7GicxSOb9SzrnOgiheHFEYAUgVxonM0tDgOwGAZGB5GgAAeF+OLogojAAAALIL\npREAAAAAAAASUBoBAAAAAAAgAaURAAAAAAAAElAaAQAAAAAAIAGlEQAAAAAAABJQGgEAAAAAACAB\npREAAAAAAAASUBoBAAAAAAAgAaURAAAAAAAAElAaAQAAAAAAIAGlEQAAAAAAABJQGgEAAAAAACAB\npREAAAAAAAASUBoBAAAAAAAgAaURAAAAAAAAElAaAQAAAAAAIAGlEQAAAAAAABJQGgEAAAAAACAB\npREAAEAWc871+RgAAKA3lEYAAABZKjI/ourbqzuLIuecqm+vVmR+xG8wAEBaaWyUxoyRduzwnQTp\nhtIIyAI122p0xzN3qGZbje8oAJB2wjrTxjmnlr0tql1Q21kcVd9erdoFtWrZ2xKa7wMA4NiqqqT6\n+va3QFd5vgMAODk122o07cFpisaiKsgt0PJZy1VRUuE7FgCkhcj8iFr2tmj63dNlZp3FSeHgQlXO\nr/QdL6XMTNPvni5Jql1Qq9oFtZKk8jnlnd8PAED7LJsPfUh67jlpxAjfaYLX2CgtWiS1tbW/nTs3\nnN8H9IyZRsgKYZ5pE6mPKBqLKuZiisaiitRHfEcCgLTATJvuxVEchREAdBf2WTZVVe2FkSTFYuH9\nPqBnlEbIePGZNnNXzNW0B6eFrjiqLK1UQW6Bci1XBbkFqiyt9B0JANJCvDApn1Ou2gW1+kHOD1S7\noDZUM23iRVlXXfc4AoCwO3qWTdj29InffzTa/jgaDef3Ab2jNELGC/tMm4qSCi2ftVxVU6tYmgYA\nRwnzTJuuM6vK55RrXtu8zgKN4ggA2oV9lk3X+48L4/cBvaM0QsZjpk17cfTdK75LYQQARwnzTBsz\nU+Hgwm4zq+IzrwoHF4aiOAOAvjDLRlq27L37j4tGpaVL/eRB+mEjbGS8+EybSH1ElaWVFCcAAEmJ\nM22m3z2987EUjhlHlfMr5ZzrvM94cZTt9w0Ax6OvWTYLF/rJFLSGBt8JkO4ojZAVKkoqKIsAAN30\nNtNGUqhm2hx9n2G5bwA4lr5m2YSlNAKOJdDSyMyukbRAUq6kXzjn7gzy+gCA9MY4gWRjpg2QXRgn\nkEzMsgGOLbA9jcwsV9JCSR+TNEHSjWY2IajrAwDSG+MEjuXofYiOd18iZtoA2YFxAgCCF+RG2JdK\n2uqce805F5X0sKQZAV4fAJDeGCfQq8j8SLcNrOP7FUXmR/wGAxAkxgkcU2OjNGZMuDazBlIpyNKo\nWNK2Lo8bOj4GdKrZVqM7nrlDNdtqfEcBEDzGCfTIOaeWvS3djoqPb2jdsrclFCehAZDEOIHjUFUl\n1ddzZDyQLEHuadTTXPBuf8szs9mSZkvS6NGjg8iENFKzrUbTHpymaCyqgtwCLZ+1nM2tgXBhnECP\num5gXbugtvP0s64bXAMIBcYJ9KmxUVq0qP1EtEWLpLlzpREjfKcCMluQM40aJJV0eTxK0ltdn+Cc\nu885V+acKysqKgowGtJBpD6iaCyqmIspGosqUh/xHQlAsBgn0KuuxVEchREQOowT6FNVVXthJEmx\nGLONgGQIsjR6UdI4MzvLzAokfVbSsgCvjzRXWVqpgtwC5VquCnILVFla6TsSgGAxTqBX8SVpXXXd\n4whAKDBOoFfxWUbRaPvjaLT9MXsbAScnsOVpzrkjZvZ1SdVqPyLzAefcK0FdH+mvoqRCy2ctV6Q+\nosrSSpamASHDOIHedN3DKL4kLf5YYsYREBaME+hL11lGcfHZRgsX+skEZIMg9zSSc+5JSU8GeU1k\nloqSCsoiIMQYJ9ATM1Ph4MJuexjFl6oVDi6kMAJChHECvVm27L1ZRnHRqLR0KaURcDICLY0AAACO\nl3OusxCqnF+ptra2zsfx4ojCCAAgSQ0NvhMA2SnIPY0AAACOS2R+pNueRc45/e83/1eR+ZHO51AY\nAQAaG6UxY9i7CEgVSiN4VbOtRnc8c4dqttX4jgIASBPOObXsbVHtgtrO4ii+h1HL3hY2vwYAdKqq\nkurrOSkNSBWWp8Gbmm01mvbgNEVjURXkFmj5rOXsZwQA6LZnUe2C2s4Nr7vuaQQAQPzEtLa29rdz\n50ojRvhOBWQXZhrBm0h9RNFYVDEXUzQWVaQ+4jsSACBNdC2O4iiMAABddT0xLX5SGoDkojSCN5Wl\nlSrILVCu5aogt0CVpZW+IwEA0kR8SVpXXfc4AgCEW3yWUfzEtGi0/TF7GwHJRWkEbypKKrR81nJV\nTa1iaRoAoFPXPYzK55RrXts8lc8p77bHEQAg3LrOMopjthGQfOxpBK8qSiooiwAA3ZiZCgcXdtvD\nKL5UrXBwIUvUAABatuy9WUZx0ai0dKm0cKGfTEA2ojQCAABpp3J+pZxznQVRvDiiMAIASFJDg+8E\nQDiwPA0AAKSlowsiCiMAAIBgURoBAAAAAAAgAaURAAAAAAAAElAaAQAAAAAAIAGlEQAAAAAAABJQ\nGgEAAAAAACABpREAAAAAAAASUBoBAAAAAAAgAaURAAAAAAAAElAaAQAAAAAAIAGlEQAAAAAAABJQ\nGgEAAAAAACABpREAAAAAAAASUBoBAAAAAAAgAaURAAAAAAAAElAaAQAAAAAAIAGlEQAAAAAAABJQ\nGgEAAAAAACABpREAAAAAAAASUBoBAAAAAAAgQSClkZl92sxeMbM2MysL4poAgMzBOAEA6AvjBAD4\nEdRMo5clfUrSyoCuBwDILIwTAIC+ME4AgAd5QVzEObdJkswsiMsBADIM4wQAoC+MEwDgB3saAQAy\nhpnNNrNVZraqubnZdxwAQJphnACA5EraTCMz+4OkET186nvOuaXH+RqzJc2WpNGjRycrGgAgDSRj\nnHDO3SfpPkkqKytzSYwHAPCMcQIA0k/SSiPn3NVJeA3+Jw8AWSoZ4wQAIHsxTgBA+mF5GgAAAAAA\nABIEUhqZ2fVm1iCpQtITZlYdxHUBAJmBcQIA0BfGCQDwI6jT0x6T9FgQ1wIAZB7GCQBAXxgnAMAP\nlqcBAAAAAAAgAaURAAAAAAAAElAaAQAAAGnCOdfnYwAAgkRpBAAAAKSByPyIqm+v7iyKnHOqvr1a\nkfkRv8EAAGmlsVEaM0basSP116I0AgAAADxzzqllb4tqF9R2FkfVt1erdkGtWva2MOMIANCpqkqq\nr29/m2qBnJ4GAHhPzbYaReojqiytVEVJhe84AIA0YGaafvd0SVLtglrVLqiVJJXPKdf0u6fLzHzG\nAwCkicZGadEiqa2t/e3cudKIEam7HjONACBANdtqNO3BaZq7Yq6mPThNNdtqfEcCAKSJrsVRHIUR\nAKCrqqr2wkiSYrHUzzaiNAKAAEXqI4rGooq5mKKxqCL1Ed+RAABpIr4krauuexwBAMItPssoGm1/\nHI22P07l3kaURgAQoMrSShXkFijXclWQW6DK0krfkQAAaaDrHkblc8o1r22eyueUd9vjCAAQbl1n\nGcWlerYRexoBQIAqSiq0fNZy9jQCAHRjZiocXNhtD6P4UrXCwYUsUQMAaNmy92YZxUWj0tKl0sKF\nqbkmpREABKyipIKyCACQoHJ+pZxznQVRvDiiMAIASFJDQ/DXZHkaAAAAkCaOLogojAAAPlEaAQAA\nAAAAIAGlEQAAAAAAABJQGgEAEHJHn8rEKU0AAACQKI0AAAi1yPxIt+O848d+R+ZH/AYDAKSVxkZp\nzBhpxw7fSQAEidIoJGq21eiOZ+5QzbYa31EAAGnCOaeWvS2qXVDbWRxV316t2gW1atnbwowjAECn\nqiqpvr79LYDwyPMdAKlXs61G0x6cpmgsqoLcAi2ftZzjvgEAncd5S1LtglrVLqiVJJXPKeeYbwBA\np8ZGadEiqa2t/e3cudKIEb5TAQgCM41CIFIfUTQWVczFFI1FFamP+I4EAEgTXYujOAojAEBXVVXt\nhZEkxWLMNgLChNIoBCpLK1WQW6Bcy1VBboEqSyt9RwIApIn4krSuuu5xBAAIt/gso2i0/XE02v6Y\nvY2AcKA0CoGKkgotn7VcVVOrWJoGAOjUdQ+j8jnlmtc2T+VzyrvtcQQACLeus4zimG0EhAd7GoVE\nRUkFZREAoBszU+Hgwm57GMWXqhUOLmSJGgBAy5a9N8soLhqVli6VFi70kwlAcCiNAAAIscr5lXLO\ndRZE8eKIwggAIEkNDb4TAPCJ5WkAAITc0QURhREAAAAkSiMAAAAAAAD0gNIIAAAAAAAACSxdT0Yx\ns2ZJbxzjacMk7QogTroI2/1K3HNYhO2ek3G/H3DOFSUjTKZinOhR2O5X4p7DIGz3KzFOJAXjRI/C\ndr8S9xwGYbtf6eTv+bjHiLQtjY6Hma1yzpX5zhGUsN2vxD2HRdjuOWz361PYvtdhu1+Jew6DsN2v\nFM579iVs3+uw3a/EPYdB2O5XCvaeWZ4GAAAAAACABJRGAAAAAAAASJDppdF9vgMELGz3K3HPYRG2\new7b/foUtu912O5X4p7DIGz3K4Xznn0J2/c6bPcrcc9hELb7lQK854ze0wgAAAAAAACpkekzjQAA\nAAAAAJAClEYAAAAAAABIkNGlkZn9i5ltNrMNZvaYmQ32nSnVzOzTZvaKmbWZWVYfK2hm15hZnZlt\nNbPv+M6Tamb2gJk1mdnLvrMEwcxKzGyFmW3q+Hd6ju9MqWZmhWb2JzNb33HP3/edKdsxTjBOZBPG\nCcYJJB/jRPaOE2EbIyTGCcaJ1Mjo0kjSU5IucM5NlLRF0nc95wnCy5I+JWml7yCpZGa5khZK+pik\nCZJuNLMJflOl3GJJ1/gOEaAjkr7lnDtP0mWSvhaCf8aHJV3lnLtI0iRJ15jZZZ4zZTvGiSzFOBEK\njBOME0FgnMhCIR0jJMYJxokUyOjSyDn3v865Ix0PX5A0ymeeIDjnNjnn6nznCMClkrY6515zzkUl\nPSxphudMKeWcWylpt+8cQXHONTrn1nS8f0DSJknFflOllmt3sONhfscfTiNIIcaJrMY4keUYJxgn\ngsA4kbVCN0ZIjBNinEiJjC6NjvIFSf/jOwSSpljSti6PG5Tl/wMIMzMrlTRZUq3fJKlnZrlmtk5S\nk6SnnHNZf89phHEiuzBOhAjjBALCOJE9GCNChnEidfJS+eLJYGZ/kDSih099zzm3tOM531P71LRf\nBZktVY7nnkPAevgYv2nLQmY2QNIjkr7hnNvvO0+qOedikiZ17JnwmJld4JwLxbrzVGGc6IZxAlmH\ncYJx4mQxTnQTlnGCMSJEGCdSO06kfWnknLu6r8+b2U2SrpM0zTmXFf8jONY9h0SDpJIuj0dJestT\nFqSImeWr/X/wv3LOPeo7T5Ccc3vNLKL2def8MHASGCdCi3EiBBgnGCeSgXEilBgjQoJxIvXjREYv\nTzOzayT9raRPOucO+c6DpHpR0jgzO8vMCiR9VtIyz5mQRGZmku6XtMk5d5fvPEEws6L4qSxmdoqk\nqyVt9psquzFOZDXGiSzHOME4EQTGiazFGBECjBPBjBMZXRpJ+rGkgZKeMrN1Znav70CpZmbXm1mD\npApJT5hZte9MqdCxIeHXJVWrfUOz3zjnXvGbKrXM7CFJNZLGm1mDmd3qO1OKXS7p85Ku6vjvd52Z\nfdx3qBQ7U9IKM9ug9r/MPOWce9xzpmzHOME4kTUYJxgnkBKME1k4ToRxjJAYJxgnUsOyZAYmAAAA\nAAAAkijTZxoBAAAAAAAgBSiNAAAAAAAAkIDSCAAAAAAAAAkojQAAAAAAAJCA0ggAAAAAAAAJKI0A\nAAAAAACQgNIIAAAAAAAACSiNAAAAAAAAkIDSCAAAAAAAAAkojQAAAAAAAJCA0ggAAAAAAAAJKI0A\nAAAAAACQgNIIAAAAAAAACSiNAAAAAAAAkIDSCAAAAAAAAAnyfAfozbBhw1xpaanvGACQllavXr3L\nOVfkO4dPjBMA0DvGCcYJAOjNiYwRaVsalZaWatWqVb5jAEBaMrM3fGfwjXECAHrHOME4AQC9OZEx\nguVpAAAAAAAASEBpBAAAAAAAgASBlUZmVmhmfzKz9Wb2ipl9P6hrAwAAAEhPx/Nzgpn1M7Nfm9lW\nM6s1s9LgkwJA+AQ50+iwpKuccxdJmiTpGjO7LMDrAwAAAEg/x/Nzwq2S9jjnxkq6W9L/H3BGAAil\nwEoj1+5gx8P8jj8uqOsDYbfv3Vb9cUuz7xgAAADdHOfPCTMk/bLj/d9JmmZmFlBEAAitQE9PM7Nc\nSasljZW00DlXG+T1gTD7aeRV3fvHV/WHb16pscMH+o4DZL3S7zzhOwJ6UX/ntb4jADjKcfycUCxp\nmyQ5546Y2T5Jp0vaFWhQAAiZQEsj51xM0iQzGyzpMTO7wDn3cvzzZjZb0mxJGj16dJDRgKy3YnOT\nJGnJ2rf07enjPacBAAB4z7F+TpDU06yihFUL/Dzx/vj6RQclPpD+vJye5pzbKyki6ZqjPn6fc67M\nOVdWVFTkIxqQlbbvfVd1Ow8oN8e0ZN12OcfKUAAAkH56+zlBUoOkEkkyszxJp0na3cPX8/MEACRR\nkKenFXX85kBmdoqkqyVtDur6QJjFZxl9+cqz1bDnXa1+Y4/nRAAAAO2O8+eEZZJu6nj/BklPO34L\nBgApF+RMozMlrTCzDZJelPSUc+7xAK8PhFakrkklQ0/RV6eOVWF+jpas2+47EgAAQFyPPyeY2Q/M\n7JMdz7lf0ulmtlXSNyV9x1NWAAiVwPY0cs5tkDQ5qOsBaNfSGtNzW9/Wp8tGaUC/PH10wgg9vqFR\n8647XwV5XlaoAgAAdOrt5wTn3Lwu77dI+nSQuQAAnvY0AhCc2td3693WmKaOHy5Jmjl5pPYeatXK\nLc2ekwEAAAAA0hmlEZDlVmxuUr+8HFWMOV2SdMW4Ig09tUCPsUQNacbMCs3sT2a23sxeMbPv+84E\nAAAAhBmlEZDFnHNaUdekKWNOV2F+riQpPzdH1008U3/YuFMHWlo9JwS6OSzpKufcRZImSbrGzC7z\nnAkAAAAILUojIIu9vusdvfH2IU09d3i3j8+YVKzDR9pU/cpOT8mARK7dwY6H+R1/OBkHAAAA8ITS\nCMhiK+ra9y2K72cU98HRgzV6aH8tWcsSNaQXM8s1s3WSmtR+ek6t70wAAABAWFEaAVlsxeYmjR0+\nQCVD+3f7uJlp5qSRev7VXdq5v8VTOiCRcy7mnJskaZSkS83sgq6fN7PZZrbKzFY1N7OZOwAAAJBK\nlEZAlnrn8BHVvv62po4v6vHzMyYXq81J/73+rYCTAcfmnNsrKSLpmqM+fp9zrsw5V1ZU1PO/2wAA\nAACSg9IIyFLPbd2l1phL2M8obkzRAE0cdZqWcIoa0oSZFZnZ4I73T5F0taTNflMBAAAA4UVpBGSp\nFXVNGtAvT2UfGNrrc2ZMKtbL2/dra9OBAJMBvTpT0goz2yDpRbXvafS450wAAABAaFEaAVnIOacV\nm5v1obHDVJDX+3/mn7joTOWYtGQtS9Tgn3Nug3NusnNuonPuAufcD3xnAgAAAMKM0gjIQpt3HNCO\n/S26qpelaXHDBxbq8rHDtGTddjnHyeYAAAAAgPdQGgFZ6OnNTZKkD/eyCXZXMycVq2HPu1r9xp5U\nxwIAAAAAZBBKIyALReqadP7IQTpjUOExnzv9ghEqzM9hQ2wAAAAAQDeURkCW2XeoVavf2HPMpWlx\nA/rl6SMTRuiJDY2KHmlLcToAAAAAQKagNAKyzB//3Kw2J1WOP77SSJKunzxSew61auWW5hQmAwAA\nAABkkjzfAQAkV2Rzk4b0z9ekksHH/TVXjCvS0FMLtGTddl094YwUpgPCo/7Oa31HAAAAAE4KM42A\nLNLW5hTZ0qwPn1Ok3Bw77q+LtterAAAgAElEQVTLz83RtReeqac27tSBltYUJgQAAAAAZApKIyCL\nrG/Yq93vRDX1OPcz6mrm5GIdPtKm6ld2piAZAABAz8ysxMxWmNkmM3vFzOb08JxKM9tnZus6/szz\nkRUAwoblaUAWWVHXrByTrhxXdMJf+8HRgzV6aH8tWbtdN1w8KgXpAAAAenRE0recc2vMbKCk1Wb2\nlHNu41HPe8Y5d52HfAAQWsw0ArJIpK5Jk0cP0ZBTC074a81MMyeN1POv7lLT/pYUpAMAAEjknGt0\nzq3peP+ApE2Siv2mAgBIlEZA1mg60KINDfs0dfyJzzKKmzG5WG1OWrb+rSQmAwAAOD5mVippsqTa\nHj5dYWbrzex/zOz8Xr5+tpmtMrNVzc2cCgsAJyuw0uh41ioDeP/+WNf+F6PK8Se+n1HcmKIBmjjq\nNC1Ztz1ZsQAAAI6LmQ2Q9Iikbzjn9h/16TWSPuCcu0jSv0ta0tNrOOfuc86VOefKiore/y/SAADt\ngpxpFF+rfJ6kyyR9zcwmBHh9IKtF6po1fGA/nT9y0Em9zoxJxXp5+35tbTqQpGQAAAB9M7N8tRdG\nv3LOPXr0551z+51zBzvef1JSvpkNCzgmAIROYKURa5WB1GmNtWnllmZNHT9cZnZSr/WJi85UjklL\n1rJEDQAApJ61/+XlfkmbnHN39fKcER3Pk5ldqvafY94OLiUAhJOXPY16W6vMGmTg/Vn9xh4dOHxE\nU889+WnYwwcW6vKxw7R0/XY555KQDgAAoE+XS/q8pKvMbF3Hn4+b2VfM7Csdz7lB0stmtl7SPZI+\n6/iLCgCkXF7QF+xrrbJz7j5J90lSWVkZgwBwnFbUNSk/13T52OTM0p45qVjf+u16rXlzjy7+wNCk\nvCYAAEBPnHPPSupzqrRz7seSfhxMIgBAXKAzjY61VhnA+7Nic5MuKR2qgYX5SXm96ReMUGF+jh5b\ny4bYAAAAABBWQZ6edsy1ygBOXMOeQ9qy86CmnsSpaUcb0C9PH5kwQk9saFT0SFvSXhfoC6dsAgAA\nAOklyJlGPa5VDvD6QFaK1LXv/zX13OSVRpI0c9JI7TnUqpVb2F8MgeGUTQAAACCNBLan0fGsVQZw\n4lZsblLJ0FM0pujUpL7ulecUaUj/fC1Zt11XTzgjqa8N9MQ51yipseP9A2YWP2Vzo9dgAAAAQEh5\nOT0NQHK0tMb03Ku7NHX8cHWcQps0+bk5um7iSD21cacOtLQm9bWBY+GUTQAAAMA/SiMgg9W+vlst\nrW1JX5oWN3NysQ4faVP1KztT8vpAT451yqZzrsw5V1ZUVOQnIAAAABASlEZABluxuUn98nJUcfbp\nKXn9D44erNFD+2vpOk5RQzA4ZRMAAABIH5RGQIZyzunpzU2aMuZ0FebnpuQaZqYZk0bqua271LS/\nJSXXAOI4ZRMAAABIL5RGQIZ6fdc7enP3oZQtTYubMalYbU5atv6tlF4HEKdsAgAAAGklsNPTACTX\n05ubJElTx6e2NBo7fIAuLD5NS9e9pS9ecXZKr4Vw45RNAAAAIL0w0wjIUJG6Zo0dPkAlQ/un/Foz\nJxfrpe37tLXpYMqvBQAAAABID5RGQAZ65/AR1b7+tqaOD+b0qE9cdKZyTGyIDQAAAAAhQmkEZKBn\nt+5Sa8ylfD+juOEDC3X52GFasm67nHOBXBMAAAAA4BelEZCBInVNGtAvT2UfGBrYNWdOKta23e9q\nzZt7ArsmAAAAAMAfNsIGMoxzTis2N+tDY4epIC+43nf6BSP0vSUv6bG123VxgGUVACRb6XeeSNpr\n1d95bdJeCwAAIN0w0wjIMJsaD2jH/hZdFdDStLgB/fL0kQkj9MSGRrXG2gK9NgAAAAAgeJRGQIZZ\nUdckSfpwQJtgdzVz0kjtOdSqlVuaA782AADITmZWYmYrzGyTmb1iZnN6eI6Z2T1mttXMNpjZB31k\nBYCwoTQCMkykrknnjxykMwYVBn7tK88p0pD++XpsLaeoAQCApDki6VvOufMkXSbpa2Y24ajnfEzS\nuI4/syX9NNiIABBOlEZABtl7KKrVb+wJfGlaXH5ujq6bOFJPbdypAy2tXjIAAIDs4pxrdM6t6Xj/\ngKRNkoqPetoMSQ+6di9IGmxmZwYcFQBCh42wgQyy8s+71OakyvF+SiNJmjl5pP7jhTdU/cpO3XDx\nKG85AABA9jGzUkmTJdUe9aliSdu6PG7o+FjjUV8/W+0zkTR69Oj3nSOZG+afiLBtru/j+xy27zFw\nsrJuptHGt/Zr9oOrdCh6xHcUIOkim5s0pH++JpUM9pbhg6OHqGToKVq6jiVqAAAgecxsgKRHJH3D\nObf/6E/38CUu4QPO3eecK3POlRUVBb//IwBkm6wrjd7a+67+sGmn5jy8TrG2hHEEyFixNqfIlmZ9\n+Jwi5eb09PemYJiZZk4q1nNbd6lpf4u3HAAAIHuYWb7aC6NfOece7eEpDZJKujweJemtILIBQJhl\nXWl09YQz9A+fOF9PbdypHz6x0XccIGk2NOzV7neimuppP6OuZkwqVpuTlq3n72oAAODkmJlJul/S\nJufcXb08bZmkWR2nqF0maZ9zrrGX5wIAkiQr9zS6aUqp3tx9SPc/+7pKhvTXFz50lu9IwElbUdes\nHJOuHOd/qvXY4QN0YfFpWrruLX3xirN9xwEAAJntckmfl/SSma3r+NjfSRotSc65eyU9KenjkrZK\nOiTpFg85ASB0srI0kqS/+/h5athzSFVPbNSoIafoo+eP8B0JOCkrNjdp8ughGnJqge8okqQZk0bq\nh09s0tamgxo7fIDvOAAAIEM5555Vz3sWdX2Ok/S1YBIBAOICW55mZg+YWZOZvRzE9XJzTP/2mcma\nOGqw/vrhtVq/bW8QlwVSoulAi17avk9Tx/ufZRT3yYtGKsfEhtgAAAAAkKWC3NNosaRrAryeTinI\n1S9mlWnYgH669ZertG33oSAvDyTNH+uaJUmV4/3vZxQ3fFChLh87TEvWbVf7L/+AkxP0LxcAAAAA\n9C2w0sg5t1LS7qCuF1c0sJ8W33KJokdiumXxi9r3bmvQEYCTtqKuScMH9tP5Iwf5jtLNzEnF2rb7\nXa15c4/vKMgOixXwLxcAAAAA9C6tTk8zs9lmtsrMVjU3NyftdccOH6iffb5Mb7z9jr7yH6sVPdKW\ntNcGUq011qZntuzS1PHD1X64SPqYfsEIFebnaMlaTlHDyfP1ywUAAAAAPUur0sg5d59zrsw5V1ZU\nlNy9WyrGnK5/vmGial57W995dAPLaZAxVr+xRwcOH9HUc9NnP6O4Af3ydPV5Z+jxDW+pNUYZCwAA\nAADZJK1Ko1S7fvIoffMj5+jRNdt1z/KtvuMAx2XF5ibl55ouHzvMd5QeXT+5WHsOtWrlluTNDgR6\nk6oZqQAAAAAShao0kqS/umqsbrh4lO7+wxY9srrBdxzgmFbUNemS0qEaWJjvO0qPrjynSEP65+ux\ntZyihtRL5YxUAAAAAN0FVhqZ2UOSaiSNN7MGM7s1qGsflUP/dP2FmjLmdH3n0Q16/tVdPmIAx6Vh\nzyFt2XlQU9Po1LSj5efm6LqJI/WHTTt18PAR33EAAAAAAEkS5OlpNzrnznTO5TvnRjnn7g/q2kcr\nyMvRT//PxSo9/VR9+T9W6887D/iKAvRpRV378pup56ZvaSRJMyePVEtrm6pf3uE7CjJYuvxyAQAA\nAEC7PN8BfDntlHwtuuUSXf+T53XL4hf12FcvV9HAfr5jAd1ENjepZOgpGlN0qu8offrg6CEqGXqK\nlqzbrr+4eJTvOMhQzrkbfWdAONTfea3vCAAAABkhdHsadTVqSH/df1OZ3j4Y1Rd/+aLejcZ8RwI6\ntbTG9NyruzR1/HCZme84fTIzzZxUrOe27lLT/hbfcQAAAAAASRDq0kiSJo4arHtunKwN2/dpzsNr\nFWtzviMBkqQXXntbLa1tab80LW7GpGK1OWnZ+rd8RwEAAAAAJEHoSyNJ+siEM/QP103Q/27cqX98\nYpPvOIAkKVLXrH55Oao4+3TfUY7L2OEDdGHxaVq6jtIIAAAAALIBpVGHmy8/S1+4/Cw98NzrWvTc\n677jIOScc3p6c5OmjDldhfm5vuMctxmTRuql7fu0temg7ygAAAAAgJNEadTF9649Tx+dcIZ+8PhG\nPbVxp+84CLHXdr2jN3cf0lUZsjQt7pMXjVSOSUvXbfcdBQAAAABwkiiNusjNMS347GRNLD5Nf/3Q\nWm1o2Os7EkJqxeYmSVLl+MwqjYYPKtTlY4dpybrtco79wQAAAAAgk+X5DpBuTinI1S9uukTX/+Q5\nfWHxKi352hSNGtLfdyyETKSuWWOHD1DJ0Mz7d2/GpGJ9+7frtebNPbr4A0N9xwGABKXfeeJ9f239\nndcmMQkASTKzByRdJ6nJOXdBD5+vlLRUUnwPiUedcz8ILiEAhBczjXpQNLCfFt9yiaJHYrpl0Yva\n926r70gIkYOHj6j29bczbmla3PTzz1Bhfo6WrGVDbAAAcFwWS7rmGM95xjk3qeMPhREABITSqBdj\nhw/UvZ+/WPVvv6Pb/nO1okfafEdCSDy3dZdaY06V44t8R3lfBhbm6+rzztDjG95Sa4z/bgAAQN+c\ncysl7fadAwCQiNKoD1PGDNOdn5qo5199W9999CX2aEEgInVNGtAvT2UZvLTr+snF2nOoVSu3NPuO\nAgAAskOFma03s/8xs/N9hwGAsKA0Ooa/uHiUvnH1OD2ypkH//vRW33GQ5ZxzWrG5WVeMG6aCvMz9\nz/PKc4o0pH++lqxjiRoAADhpayR9wDl3kaR/l7Sktyea2WwzW2Vmq5qb+eUVAJyszP2pNEBzpo3T\npz5YrLue2qLH1jb4joMstqnxgHbsb9HUDDs17Wj5uTm6duKZemrjDh08fMR3HAAAkMGcc/udcwc7\n3n9SUr6ZDevlufc558qcc2VFRZm51B8A0gmnpx0HM9Odn5qoxr0t+pvfbdCIQaeoYszpvmMhC62o\na5KkjN3PqKvrJxfrP194U9Uv79BfXDzKdxwAIXcyJ6YB8MvMRkja6ZxzZnap2n/x/bbnWAAQCpRG\nx6kgL0f3fv5i3fDT5/Xl/1ilR786RWOHD/QdC1lmxeYmXVA8SMMHFfqOctI+OHqISoaeoiXrtlMa\nAThplD5A9jKzhyRVShpmZg2S/kFSviQ55+6VdIOk28zsiKR3JX3WsdkoAASC5Wkn4LRT8vXAzZeo\nIC9XNy96Uc0HDvuOhCyy91BUa97ck/FL0+LMTDMnFeu5rbvUdKDFdxwAAJCmnHM3OufOdM7lO+dG\nOefud87d21EYyTn3Y+fc+c65i5xzlznnnvedGQDCgtLoBJUM7a/7byrTroOH9cUHV+ndaMx3JGSJ\nlX/epTYnVWZJaSRJMyYVq81J/72+0XcUAAAAAMAJojR6Hy4qGax7PjtZGxr26hu/XqtYG7Nj01lb\nm1NbBvwzWrG5SUP652tSyWDfUZJm7PABurD4NC1Zu913FAAAAADACaI0ep8+ev4Izbtugqpf2al/\nenKT7zjoxYq6Jk39UUSfXPismvan7xKpWJvTH7c068PnFCk3x3zHSaoZk0bqpe37tLXpoO8oyABm\ndo2Z1ZnZVjP7ju88AAAAQJhRGp2EWy4/SzdPKdX9z76uxc+97jsOumjc965u+8/VumXRi8o102vN\n7+hTP31erzWnZ3GxoWGvdr8T1dRzs2dpWtwnLxqpHJOWrmO2EfpmZrmSFkr6mKQJkm40swl+UwEA\nAADhFWhplI2/QZ573QRdfd4Z+sHjG/WHjTt9xwm91libfr7yNU370R/19OYm/d/p4/X7b1yph2df\npnejMd1wb43WvrnHd8wEKzY3KcekK8cV+Y6SdMMHFeryscO0dN1b4qATHMOlkrY6515zzkUlPSxp\nhudMAAAAQGgFVhpl62+Qc3NM99w4SRcUn6a/emitXmrY5ztSaK2q361P/Puz+scnN+mys0/XH775\nYX1t6lgV5OVo4qjBeuS2KRrQL0+f+3mtVtQ1+Y7bzYq6Zk0ePURDTi3wHSUlZkwq1pu7D2nNm3t9\nR0F6K5a0rcvjho6PdTKz2Wa2ysxWNTc3BxoOAAAACJsgZxpl7W+Q+xfk6Rc3lWnoqQX6wi9fVMOe\nQ74jhcrud6L6299t0A331mj/u6362ecv1v03lalkaP9uzysddqoeuW2Kxgw/VV/85Sr9bnWDp8Td\nNR1o0Uvb92nq+OybZRQ3/fwzVJifw4bYOJaeNvTqNj3NOXefc67MOVdWVJS9/80AAAAA6SDI0uiY\nv0HOZMMHFmrxLZeopTWmLyx+UfvebfUdKeu1tTn9+sU3Ne1HET2ypkFfvvJsPfXND2v6+SNk1vNm\n0kUD++nh2RWqOPt0ffu36/WTyFbvS6Yide2zJbJxP6O4gYX5uvq8M/T4hrfUGmvzHQfpq0FSSZfH\noyS95SkLAAAAEHp5AV7rmL9BNrPZkmZL0ujRo4PIlFTjzhion/2fizXrgT/ptv9crcW3XKqCPPYa\nT4VNjfv190te1uo39ujS0qGqmnmBxo8YeFxfO6Bfnh64+RJ9+7fr9c+/r1PT/sOad90E5Xg6tSxS\n16ThA/tpwpmDvFw/KDMnFevxDY1auaVZ0847w3ccpKcXJY0zs7MkbZf0WUmf8xsJ6K70O0/4juBF\n/Z3X+o4AAAA8CLLROOZvkLNh2cGUscN0519M1POvvq27ntriO07WOXj4iH74+EZd9+/P6vVd7+hf\nbpioX3/5suMujOIK8nL0b5+ZpC9+6Cwtfr5ef/XwWh0+EktR6t61xtr0zJZdmjp+eK+zo7LFlecU\naUj/fC1Zx8QR9Mw5d0TS1yVVS9ok6TfOuVf8pgIAAADCK8iZRqH5DfINF4/S6jf26GcrX9WV44Zp\nythhviNlPOecfv/yDn3/vzdqx/4W3Xhpif5m+rkntXF0To7p76+boDMGFeofn9yktw8e1n2zyjSo\nMD+Jyfu2qn6PDhw+ktVL0+IK8nJ07cQz9bvVDTrQ0qqBAX6fkTmcc09KetJ3DgAAAAABzjQK22+Q\n5153ns4adqpu/8067Xkn6jtORnvz7UO6ZfGLuu1XazTk1AI9+tUpuuNTE5N20tiXrjxb//aZSVpV\nv0ef+dkLatrfkpTXPR6Ruibl55ouH3t6YNf06TNlo9XS2qZ7lv/ZdxQAAAAAwDEEuuGOc+5J59w5\nzrkxzrl/DPLaQetfkKd7Pju5/WSvRzZ432w5Ex0+EtM9y/+sj9z9R734+m7NvW6C/vvrl+uDo4ck\n/VozJxfrgZsv0Ztvv6Prf/K8Xm0+mPRr9GRFXZMuKR0amlk3F446TTdeWqL7n31dL2/f5zsOAAAA\nAKAP7NKcQhcUn6a/mX6u/nfjTj30p23H/gJ0em7rLn3s357RXU9t0dXnnaHl36rUrR86S3m5qftX\n9spzivTw7Aq1tMZ0w0+f19o396TsWpLUsOeQtuw8qKtCsDStq+9cc56GntpP3330JR3hJDUAAAAA\nSFtB7mkUSrd+6Cyt/HOzfvD4K7r0rCEaO/zENmwOm6b9LfrhE5u0bP1b+sDp/fXLL1yqD58T3Kbo\nF446TY/cNkU3LfqTPvfzWi38/ybrqnNTc9LXirpmSVLl+HCVRqf1z9f8T07Q1/9rrRY/X68vXnG2\n70gIobCegAUAAACcCGYapVhOjulHn75I/Qvy9FcPrfNyQlcmiLU5LX7udU370R/1+5d3aM60car+\nxpWBFkZxpcNO1e++MkVjhw/Qlx5crd+sSs0sscjmJpUMPUVjik5Nyeuns2svPFNTxxfprqe2qGHP\nId9xAAAAAAA9YKZRAIYPKtS/3DBRt/5ylf7l93X6++sm+I6UVtZv26vvLXlJL2/fryvGDdMPZlyg\ns4b5LVKKBvbTQ7Mv023/uVp/87sNaj5wWF+tHCMzS8rrt7TG9Nyru/SZspKkvWYmMTNVzbxAH7lr\npeYtfUX331QWyu8DAGQKZuf5UX/ntb4jAABCjplGAZl23hmaVfEB/eLZ17VyS7PvOGlh36FW/f2S\nlzTzJ8+paf9h/fhzk/XgFy71XhjFDeiXp/tvukQzJ43Uv1TXaf6yVxRrS86G5i+89rZaWttUGbL9\njLoaNaS/vvXRc/T05iY98VKj7zgAAMATM3vAzJrM7OVePm9mdo+ZbTWzDWb2waAzAkBYURoF6O8+\nfp7OOWOAvvmb9dp18LDvON445/TomgZNuyui/6p9UzdPKdXyb31Y100cmXazTQrycnTXX07Sl644\nS7+seUN//dBatbSe/BLDSF2zCvNzVHH26UlImblunlKqC4tP0/xlG7XvUKvvOAAAwI/Fkq7p4/Mf\nkzSu489sST8NIBMAQJRGgSrMz9WCz07W/pZW/e3vNsi55MxaySRbmw7oxp+/oG/+Zr1GDemvZV//\nkP7hE+en9ZHzOTmm7107Qd/7+Hl64qVG3bzoT9rf8v4LDuecnt7cpCljhqkwPzeJSTNPXm6O7vjU\nhdr9zmHd+fvNvuMAAAAPnHMrJe3u4ykzJD3o2r0gabCZnRlMOgAIN/Y0Cth5Zw7Sdz92rr7/3xv1\nHy+8oVkVpb4jBeLdaEz3PP1n/eKZ19S/IE//dP2F+uwlJcrJSa+ZRX350pVna/igfvr2b9frL++t\n0S+/cKnOGFR4wq/z2q539ObuQ/rSFWelIGXmuaD4NN36obP082de1/WTi3XpWUN9RwIAAOmlWFLX\nk0kaOj6WsL7dzGarfTaSRo8eHUg4ZBZfe7T52qMsbPfrSzZ/n5lp5MHNU0pVOb5IP3xik+p2HPAd\nJ+X+sHGnrr7rj/pp5FV98qJiLf/Wh/W58tEZVRjFzZhUrAduvkTbdh/Sp37yvF5tPnjCr7Fic5Mk\nqXJ8ePczOtrtHzlHxYNP0d899hInDAIAgKP19JfGHqfsO+fuc86VOefKioqCP4UXALINpZEHZqZ/\n/fRFGlSYl7Q9ctJRS2tMX/uvNfrig6vUvyBXv559mX70lxdp2IB+vqOdlCvGFenXX67Q4SMx3fDT\n57XmzT0n9PUr6po0bvgAlQztn6KEmad/QZ5+eP0F2tp0UPdGXvMdBwAApJcGSSVdHo+S9JanLAAQ\nKpRGngwb0E//+umLVLfzgO78n+zby6WlNaYvPbhKT2xo1Lc/eo6enHOFyrNo0+cLik/TI7dN0aBT\n8vW5n7+gpzfvPK6vO3j4iP70+m5NDfGpab2ZOn64PnHRSC1csVVbm058BhcAAMhayyTN6jhF7TJJ\n+5xzHL0KAAGgNPKocvxwfeHys7T4+frjLh0ywbvRmG795Yt6dusu/fNfTNTXrxqn/Nzs+1ftA6ef\nqkdum6JxwwfqSw+u1m9e3HbMr3lu6y61xpwqxzNduifzrpugwvwc/d1jL6mtLXwbxQMAEEZm9pCk\nGknjzazBzG41s6+Y2Vc6nvKkpNckbZX0c0lf9RQVAEIn+36SzzB/c814nTtioP7vbzeo6UCL7zgn\n7VD0iG5Z/Cc9/+rb+tcbLtJfXlJy7C/KYMMG9NPDsy/TlDH/j737Do+qyv84/v6mQkINhJYAoRcp\noQq2FVHXCoqgoCKuBdeylv2tir3srr2XVcFeQUEEFRULllXpvRMBIbQEAiG9nt8fGdwooU/mTjKf\n1/PkITP3ztxPLsmce7/3nHMbcMukxTz3zZr93hVvxso0akVH0CdJkz1XJL52NLef0YnZ6zL4YN6B\ni3AiIiJS9TnnRjjnmjrnIp1zic65V5xzLzrnXvQtd865a51zbZxzXZ1zc73OLCISKlQ08liNyHCe\nHdGD7IJi/vHB4irduyK7oJhLX53D7HUZPHVBMuf1SvQ6UkDERkfwyqg+nJPcjMemr+aeqcsoqeD/\n0TnHjFVpHN+uYbXseeUv5/duTt9Wcfz70xWkZxV4HUdERERERCRk6cw1CLRrXJs7z+rM96vTee2n\n9V7HOSxZ+UVc+ups5m3YydPDezA4OcHrSAEVFRHGE+cnc9UJrXnz51/523vz95rgfMWWLLbtLmCA\n7pq2X2FhxgPndiW/qJT7P1nudRwJEDMbZmbLzKzUzHp7nUdERERERFQ0ChoXH92Ckzs15uHPVrJs\nc6bXcQ7J7vwiLnl1Ngs37uK5ET04u3szryN5IizMuO2MTtx5ZiemLdnKqFdnk5lX9NvyGavSADSf\n0UFo26gW1wxow8eLNv+236qb3MJiryMEm6XAEOB7r4OIiIiIiEgZFY2ChJnxyNBu1IuJ5IbxC8kr\nLDnwi4JAZm4RI1+exdJNmTx/UU9O79rU60ieu+L41jw9PJn5G3ZywUs/szWzbK6qGSvT6JJQh0Z1\nanicsGq4+sQ2tImP5c7JS6tdgSUtK5+znv0vL/+w1usoQcM5t8I5t8rrHCIiIiIi8j8qGgWRuNgo\nnjg/mZS0bP71afAPy9mVW8hFr8xkxZYsXrioF38+qonXkYLG4OQEXru0LxszcjnvhZ+Y92sG8zfs\n1NC0QxAdEc6DQ7qxaVceT3652us4frM9u4ALx81ia2Y+3ZvX8zqOiIiIiIjIPqloFGSOa9eQ0Se0\n5p1ZG5i+bKvXcfYpI6eQC8fNYvW2bF4a2YuTOzf2OlLQOa5dQyZc1Z+C4lLOf2kmpQ4GdFTR6FD0\nbRXHiL7NeeW/61i6qWoN26xIRk4hF788i9Sdubx6aZ+Qu4uemX1lZksr+Bp8CO8x2szmmtnc9PT0\nyowrIiIiIhLyVDQKQv84tQNdEupw66TFbNud73WcvezILuDCcTNJSc9m3CW9VQjZjy4Jdfnw6mNo\nXr8mjetE0z1RPUsO1ZjTOhEXG81tHy6huKTU6ziHbVduWcFo3fYcXhnVh36tG3gdKeCccyc757pU\n8DXlEN5jrHOut3Oud3y85gcTEREREalMKhoFoaiIMJ4e3oP8olL+/v5CSiu4fbtX0rMKGDFuJuu2\n5/DqqD78qb1O2g6kRTeo8fkAACAASURBVIMYpt1wPB//7TjCw8zrOFVO3ZhI7h3UmSWbMnm9it5d\nMDOviJGvzCYlLZuxl/Tm2LYNvY4kIiIiIiJyQAEpGulWyoeuTXwt7jm7Mz+m7GBckEyWm7Y7n+Fj\nf2ZjRh6vXdqH49rpxPdgxURF0Ki2JsA+XGd2bcpJHRvxxJerSd2Z63WcQ7Ln7oIrt+7mpZG9VGjd\nBzM718xSgf7Ap2b2hdeZRERERERCXUSAtrPnVsovBWh71cIFfZrz3ep0Hpu+imPaNKRrYl3PsmzN\nzOfCcTPZujuf1//Sh6NDcGiNeMfMuH/wUZzyxPfcPWUZr4zqjVnw99rKLijm0ldns2xTJi9c3EtD\nOffDOTcZmByo7a1/6MxAbUqCUNKYT72OICIiIlIlBKSnkW6lfHjMjAeHdKVhrWhuGL/As9uOb8nM\nY/jYn9m2O583L+urgpF4IrF+DP93anu+WZnGp0u2eB3ngHILi7nstTksSs3k2RE9OEWTxYuIiIiI\nSBUTqJ5GB8XMRgOjAVq0aOFxmuBQLyaKJ85P5sKXZ3L/x8t56LxuAd1+6s5cLhw3i505hbx5+dH0\nalk/oNsXKe/SY5KYsnAz905dzvFt46kbE+l1pArlFZZw2etzmPtrBk8P78HpXZt6HUlEpFpT70ER\nEZHK4beeRv64lbLuilOx/m0acPWf2jB+zkamBbCHxcaMXC54aSY7cwt56woVjMR7EeFhPDikKxk5\nBTz0+Uqv41Qov6iEK9+cy6x1GTxxfjJnd2/mdSQREREREZHD4reeRs65k/31XrK3m05pz48p2xkz\naTHJzevRrF7NSt3erztyuHDcLLILinn3in6ezqckUl6XhLpcflwrxv2wjnN7JNC3VZzXkX6TX1TC\nVW/N48dftvPo0O6c0yPB60giIiIiIiKHLSBzGsmRiwwP4+nhPSgpddw0YSElpa7StrVuew7Dx84k\np7CYd644WgUjCTo3ndKehHo1uX3yEgqKS7yOA0BhcSnXvDOf71an89CQrgztleh1JBERERERkSMS\nkKKRbqXsH0kNY7lvcBdmrcvgxe9+qZRt/JKezfCxP1NQXMq7V/SjS4IKRhJ8YqIi+Ne5XUhJy+bF\nb9d6HYeiklKue3c+36xM41/ndOGCPpqTTUREREREqr5A3T1tsnMu0TkX7Zxr7Jz7cyC2Wx2d1zOB\ns7s344kvV7Ngw06/vndKWhbDx86kuMTx3pX96Nysjl/fX8SfBnRoxNndm/H8jBRS0rI9y1FcUsoN\n4xcwffk27ht0FBf3a+lZFhERkarKzE4zs1VmlmJmYypYfqmZpZvZQt/XFV7kFBEJNRqeVsWYGf86\npwtN6tTghvELyS4o9sv7rt5WVjByDsaP7keHJrX98r4ilenuszpTIzKM2ycvobQSh2zuS3FJKTe9\nv4hpS7Zy55mdGHVMUsAziIiIVHVmFg48D5wOdAZGmFnnClad4JxL9n29HNCQIiIhSkWjKqhuzUie\nGp5M6s5c7pmy7Ijfb8WW3QwfO5MwM8aP7ke7xioYSdUQXzua28/oxOx1GXwwb2NAt11S6rh54mI+\nXrSZMad35IrjWwd0+yIiItVIXyDFObfWOVcIjAcO+g7MIiJSeVQ0qqL6JMVx3UntmDQ/lamLNh/2\n+yzbnMmF42YSFR7GhKv607ZRLT+mFKl85/duTt9Wcfz70xWkZxUEZJulpY5bJy1m8oJN/OPU9vz1\nT20Csl0REZFqKgEof/Un1ffcH51nZovNbKKZNQ9MNBGR0KaiURV2/Ult6dmiHndMXsLGjNxDfv2S\n1EwuHDeLmpHhTLiqH60axlZCSpHKFRZmPHBuV/KLSvnnJ8srfXulpY47PlrCxHmp3DCwHded1K7S\ntykiIlLNWQXP/XHc+cdAknOuG/AV8EaFb2Q22szmmtnc9PR0P8cUEQk9KhpVYRHhYTw9vAc4uGnC\nQopLSg/6tQs37uLCl2dSKzqCCVf1p2UDFYyk6mrbqBbXDGjD1EWbmbEqrdK245zj7qlLeW/2Rq4d\n0IYbT1bBSERExA9SgfI9hxKB33Wld87tcM7t6VI8DuhV0Rs558Y653o753rHx8dXSlgRkVCiolEV\n1zwuhn+d24W5v+7k+Rm/HNRr5m/YyciXZ1EvJpIJV/WjeVxMJacUqXxXn9iGNvGx3Dl5KbmF/pkg\nvjznHPd9vJy3Z27gqhNa849TO2BW0YVREREROURzgHZm1srMooDhwNTyK5hZ03IPBwErAphPRCRk\nqWhUDQxOTuDcHgk8/fVq5q7P2O+6c9dncMkrs4mrFcWE0f1JrK+CkVQP0RHhPDikG5t25fHUV2v8\n+t7OOR6YtoLXf1rPZce2YszpHVUwEhER8RPnXDFwHfAFZcWg951zy8zsfjMb5FvtejNbZmaLgOuB\nS71JKyISWlQ0qibuH3wUCfVrcsP4hezOL6pwnVlrd3DJq7OJrx3NhNH9aVavZoBTilSuvq3iGNG3\nBS//sJalmzL98p7OOR75YhXjfljHqP4tueusTioYiYiI+Jlzbppzrr1zro1z7t++5+52zk31fX+b\nc+4o51x359wA59xKbxOLiIQGFY2qido1Inl6eA+27s7nzslLce73cwf+/MsOLn1tDk3r1mDC6H40\nqVvDo6QilWvMaR2Ji43mtg+XHNI8X/vy5JereeHbX7jw6BbcO+goFYxERERERCRkqGhUjfRsUZ8b\nB7Zj6qLNTF6w6bfnf0zZzl9en01i/ZqMH92fRnVUMJLqq25MJPcO6sySTZm88fOvR/Rez3y9hme+\nSeGC3s351+AuKhiJiIiIiEhIUdGomrlmQFv6JsVx95Rl/Lojh+9Wp3PZ63NIahDLe6P7EV872uuI\nIpXuzK5NOaljIx6fvorUnbmH9R7/+TaFJ75czZCeCTw4pCthYSoYVSYze9TMVprZYjObbGb1vM4k\nIiIiIhLqVDSqZsLDjCeHJxNmcNnrc7jyzbm0jq/Fu1f2o2EtFYwkNJgZ9w8+Cufg7inL9hqueSDj\nvl/LI5+vYnByMx4d2l0Fo8D4EujinOsGrAZu8ziPiIiIiEjIU9GoGkqoV5MHhnTll/Qc2jeuxXtX\nHk1cbJTXsUQCKrF+DP93anu+WZnGtCVbD/p1r/53Hf+etoIzuzXl8WHdCVfBKCCcc9N9d88BmAkk\neplHREREREQgwusAUjnO6taMxnVq0LFJbWrXiPQ6jognLj0miSkLN3PP1GUc17YhdWP2/7fw1s/r\nuf+T5Zx2VBOeuiCZiHDV1T1yGTChogVmNhoYDdCiRYtAZhIRERERCTkqGlVjfZLivI4g4qmI8DAe\nHNKVQc/9l4c+X8mDQ7ruc913Z23grinLOLlTI54Z0YNIFYz8zsy+AppUsOgO59wU3zp3AMXAOxW9\nh3NuLDAWoHfv3oc27lBEqrT1D53pdQQREZGQo6KRiFRrXRLqcvlxrRj3wzqG9EyosJj6/tyN3D55\nCQM6xPP8RT2JilDBqDI4507e33IzGwWcBQx0hzoRlYiIiIiI+J3OjESk2rvplPYk1KvJbR8uoaC4\n5HfLPpyfyq2TFnN8u4a8cHEvoiPCPUoZ2szsNOBWYJBz7vBueSciIiIiIn6lopGIVHsxURH869wu\npKRl8+K3a397fsrCTfzjg0X0b92AcZf0pkakCkYeeg6oDXxpZgvN7EWvA4mIiIiIhDoNTxORkDCg\nQyPO7t6M52ekcFb3pqzcksXf319E76Q4Xh6lgpHXnHNtvc4gIiIiIiK/p6KRiISMu8/qzHer0rjy\nzbls2JFLj+b1eO3SPsRE6aNQRERERETkjzQ8TURCRnztaG4/oxNr03PomliX1/7Sh9hoFYxERERE\nREQqEpCzJTN7FDgbKAR+Af7inNsViG2LiJR3QZ/mNKoTTZ+kOGrXiPQ6joh4QLduFxERETk4gepp\n9CXQxTnXDVgN3Bag7YqI/I6ZcVLHxioYiYiIiIiIHEBAikbOuenOuWLfw5lAYiC2KyIiIiIiIiIi\nh8eLOY0uAz6raIGZjTazuWY2Nz09PcCxRERERETEC2Z2mpmtMrMUMxtTwfJoM5vgWz7LzJICn1JE\nJPT4rWhkZl+Z2dIKvgaXW+cOoBh4p6L3cM6Ndc71ds71jo+P91c0EREREREJUmYWDjwPnA50BkaY\nWec/rHY5sNM51xZ4Eng4sClFREKT3ybCds6dvL/lZjYKOAsY6Jxz/tquiIiIiIhUaX2BFOfcWgAz\nGw8MBpaXW2cwcK/v+4nAc2ZmOq8QEalcARmeZmanAbcCg5xzuYHYpoiIiIiIVAkJwMZyj1N9z1W4\njm+u1EygQUDSiYiEMAtEcd7MUoBoYIfvqZnOub8e4DXpwK+HucmGwPbDfG11o31RRvuhjPbD/1T1\nfdHSORfS43iPsJ04WMH8exLM2SC48ynb4VG2w+dFvirTTpjZMODPzrkrfI9HAn2dc38rt84y3zqp\nvse/+NbZ8Yf3Gg2M9j3sAKzaz6aD/femMuhnDg36mUPDkfzMB91G+G142v74xh4f6msOu5Ezs7nO\nud6H+/rqRPuijPZDGe2H/9G+qPoCcTIUzL8nwZwNgjufsh0eZTt8wZ4vCKQCzcs9TgQ272OdVDOL\nAOoCGX98I+fcWGDswWw0FP9f9DOHBv3MoSFQP7MXd08TERERERHZYw7QzsxamVkUMByY+od1pgKj\nfN8PBb7RfEYiIpUvID2NREREREREKuKcKzaz64AvgHDgVefcMjO7H5jrnJsKvAK85Zv2IoOywpKI\niFSy6lo0OqguqSFC+6KM9kMZ7Yf/0b6QgxHMvyfBnA2CO5+yHR5lO3zBns9zzrlpwLQ/PHd3ue/z\ngWF+3mwo/r/oZw4N+plDQ0B+5oBMhC0iIiIiIiIiIlWL5jQSEREREREREZG9VLuikZmdZmarzCzF\nzMZ4nccLZtbczGaY2QozW2ZmN3idyUtmFm5mC8zsE6+zeMnM6pnZRDNb6fvd6O91Ji+Y2U2+v4ul\nZvaemdXwOpMEDzMb5vv9KDWzfd6NwszWm9kSM1toZnODLJsn7aCZxZnZl2a2xvdv/X2sV+LbbwvN\n7I8T3fo70373hZlFm9kE3/JZZpZUmXkOMdulZpZebl9dEaBcr5pZmpkt3cdyM7NnfLkXm1nPQOQ6\nhHwnmllmuf12d0XrVUKuAx57eb3vpGJm9qjv2GixmU02s3peZ6psB9ueVHWheF54oM/I6iYUz3vN\nrIaZzTazRb6f+b7K3ma1KhqZWTjwPHA60BkYYWadvU3liWLg/5xznYB+wLUhuh/2uAFY4XWIIPA0\n8LlzriPQnRDcJ2aWAFwP9HbOdaFssk1NpCnlLQWGAN8fxLoDnHPJAby96wGzedwOjgG+ds61A772\nPa5Inm+/JTvnBlVWmIPcF5cDO51zbYEngYcrK89hZAOYUG5fvRyIbMDrwGn7WX460M73NRp4IQCZ\nynud/ecD+KHcfrs/AJng4I69vN53UrEvgS7OuW7AauA2j/MEwqG0dVVSCJ8Xvs6BPyOrk1A87y0A\nTnLOdQeSgdPMrF9lbrBaFY2AvkCKc26tc64QGA8M9jhTwDnntjjn5vu+z6KsOJDgbSpvmFkicCYQ\nqIPtoGRmdYATKLvzCM65QufcLm9TeSYCqGlmEUAMsNnjPBJEnHMrnHOrvM5RkYPM5mU7OBh4w/f9\nG8A5AdruvhzMviifeSIw0MwsSLJ5wjn3PWV3ptqXwcCbrsxMoJ6ZNQ1MuoPK54mDPPbydN9JxZxz\n051zxb6HM4FEL/MEQjC3dX4UtJ+zlSlYPyMrSyie9/rakGzfw0jfV6VOVF3dikYJwMZyj1Op5r80\nB+Lrat8DmOVtEs88BdwClHodxGOtgXTgNSsbqveymcV6HSrQnHObgMeADcAWINM5N93bVFJFOWC6\nmc0zs9FehynHy3awsXNuC5QdxAGN9rFeDTOba2YzzawyC0sHsy9+W8d30pgJNKjETIeSDeA835CZ\niWbWPAC5DkZVONbq7+u2/5mZHRXoje/n2Ksq7LtQdxnwmdchxC/09xZiQum818qmX1kIpAFfOucq\n9WeOqMw390BFVwdD9vZwZlYLmATc6Jzb7XWeQDOzs4A059w8MzvR6zweiwB6An9zzs0ys6cpGzpy\nl7exAss3x8pgoBWwC/jAzC52zr3tbTIJJDP7CmhSwaI7nHNTDvJtjnXObTazRsCXZrbSd3XP62yV\n2g7uL98hvE0L375rDXxjZkucc7/4J+HvHMy+8Oq44WC2+zHwnnOuwMz+SlmPqJMqPdmBBfux1nyg\npXMu28zOAD6ibDhYQBzg2CvY9121dTCfrWZ2B2VDXd4JZLbK4qe2rirT31sICbXzXudcCZDsm4Nt\nspl1cc5V2jxW1a1olAqUvxKXSIgOPTGzSMr+cN5xzn3odR6PHAsM8h001gDqmNnbzrmLPc7lhVQg\ntVwVeiL7nm+kOjsZWOecSwcwsw+BYwAVjUKIc+5kP7zHZt+/aWY2mbJu8EdcNPJDtkptB/eXz8y2\nmVlT59wW35CbtH28x559t9bMvqXsqmBlFI0OZl/sWSfVN2S1LoHp1n/AbM65HeUejiNA8y0dhKA+\n1ip/suCcm2Zm/zGzhs657ZW97YM49grqfVedHeiz1cxGAWcBA51z1aKw4I+2rorT31uICOXzXufc\nLt+x1GmUzVVWKarb8LQ5QDsza2VmUZRNcFupd2YJRr75GF4BVjjnnvA6j1ecc7c55xKdc0mU/S58\nE6IFI5xzW4GNZtbB99RAYLmHkbyyAehnZjG+v5OBhOCE4HJkzCzWzGrv+R44lUpsqA+Rl+3gVGCU\n7/tRwF5Xss2svplF+75vSFlxv7I+iw5mX5TPPJSydiIQJ4wHzPaHuW4GETyfVVOBS6xMP8qG+W7x\nOtQeZtZkz7xUZtaXsmPdHft/lV+2ezDHXkG970KVmZ0G3AoMcs7lep1H/EbnhSEgFM97zSze18MI\nM6tJ2UXxlZW5zWrV08g5V2xm1wFfUHZXpFedc8s8juWFY4GRwBLfWEeA251z0zzMJN77G/COr+Fc\nC/zF4zwB5xuaN5Gy4QvFwAJgrLepJJiY2bnAs0A88KmZLXTO/dnMmgEvO+fOABpT1hUYytrRd51z\nnwdDNo/bwYeA983scsoKtMN8uXsDf3XOXQF0Al4ys1LKTuYfcs5VStFoX/vCzO4H5jrnplJ2oPmW\nmaVQ1sMoIHdTPMhs15vZIMo+qzKASwORzczeA04EGppZKnAPZZNs4px7EZgGnAGkALkEuC05iHxD\ngavNrBjIA4YHqBBY4bEX0KJcNk/3nezTc0A0ZUONAWY65/7qbaTKta/2xONYfhWq54UVfUY6517x\nNlWlCsXz3qbAG1Z2h8Aw4H3n3CeVuUGrJj0wRURERERERETEj6rb8DQREREREREREfEDFY1ERERE\nRERERGQvKhqJiIiIiIiIiMheVDQSEREREREREZG9qGgkIiIiIiIiIiJ7UdFIRERERERERET2oqKR\niIiIiIiIiIjsRUUjERERERERERHZi4pGIiIiIiIiIiKyFxWNRERERERERERkLyoaiYiIiIiIiIjI\nXlQ0EhERERERERGRvahoJCIiIiIiIiIie1HRSERERERERERE9qKikYiIiIiIiIiI7EVFIxERERER\nERER2UuE1wH2pWHDhi4pKcnrGCIiQWnevHnbnXPxXufwktoJEZF9UzuhdkJEZF8OpY0I2qJRUlIS\nc+fO9TqGiEhQMrNfvc7gNbUTIiL7pnZC7YSIyL4cShuh4WkiIiIiIiIiIrIXFY1ERERERERERGQv\nfikamdmrZpZmZkv3sdzM7BkzSzGzxWbW0x/bFRGRqkHthIiIiIhI1eOvnkavA6ftZ/npQDvf12jg\nBT9tV0REqobXUTshIiIiIlKl+GUibOfc92aWtJ9VBgNvOuccMNPM6plZU+fcFn9sXw4sLSufX3fk\nsmlnHpsz88gtKKGopJSiEkdsdDh1a0ZSPyaKlg1iaNe4NnVrRnodWUSqkWBqJ2asSuOH1dupFR1O\nTHQE9WpG0rJBLK0axtK4TjRm5u9NiojsU2mpY3NmHuu35/JrRg6784rJKSgmp7CYs7o1o1fL+l5H\nFBEJiJS0bNZsy+L0rk29jiLlBOruaQnAxnKPU33P/e5kwMxGU3aFmRYtWgQoWvW0fnsOX63YxvwN\nO1mwYRdbMvN/t9wMosLDiAgz8opKKHW/f32TOjXo1bI+x7ZtyHFtG9KiQUwA04tICApYO7Fiy27e\nn7uRnMJi3B8++2pHR9ArqT59W8XRv3UDuifWIyxMRSQR8Z/iklLm/bqTmWszmL1+B/N/3UVeUcnv\n1gkziI2KoHPTOiFZNDKzesDLQBfAAZcBq4AJQBKwHjjfObfTo4giUgle/2kdHy/aoqJRkAlU0aii\nI2631xPOjQXGAvTu3Xuv5bJ/GzNy+WBeKl8s3cqqbVkANI+rSZ+kOJKb16N1fCyJ9WvSrF5NYqL+\n919fWurIyi8mI7eQdduzWb0tm5VbdjNzbQafLik7X+vYpDbn9khgcHICTerW8OTnE5FqLWDtxDUn\ntuWaE9tSWurILy5hR3Yh63fksH57Dsu3ZDFnfQbfrloFQLO6NTija1PO7t6Mbol11QtJRA6Lc45Z\n6zL4ZPFmPl+6le3ZhZhBpyZ1OL93Ih2a1CGpYQxJDWKpHxNFjciwUP+8eRr43Dk31MyigBjgduBr\n59xDZjYGGAPc6mVIEfGvrPxi8v9QRBfvBapolAo0L/c4EdgcoG1Xa845ZqxK4+2ZG5ixKg0D+raK\n4+6zOnNK58Y0jztwD6GwMKNuTCR1YyJp1TCWkzo2/u29f0nP4fvV6Xy8eDMPfraShz5fycCOjRh9\nQhv6JNUP9QMaEfGfgLcTYWFGTFQEMXERNI+L4fh28b8t25FdwPdr0vl08Rbe+Hk9L/93Hd0S6/KX\nY5M4s2szoiJ081ERObDcwmI+nL+JN35az5q0bGpGhnNSp0ac2bUpx7ZtqOkAKmBmdYATgEsBnHOF\nQKGZDQZO9K32BvAtKhqJVCs5BcUUFJfinNN5ZhAJVNFoKnCdmY0HjgYyNZ/RkXHO8eXybTz11RqW\nb9lNo9rR/G1AW4b3bUGzejX9sg0zo22jWrRtVIvLjmvFuu05TJqXyjuzfuX8l36me/N6/G1AWwZ2\naqQ/ahE5UkHVTjSoFc25PRI5t0cimXlFTF24idd+Ws9NExbx4LSVXHdSW4b3aaHikYhUKLewmNd+\nXM/Y79eSmVdEl4Q6PDasO2d0bfK73t5SodZAOvCamXUH5gE3AI33tAvOuS1m1sjDjCJSCbILigEo\nLCklOiLc4zSyh19aLTN7j7LKf0MzSwXuASIBnHMvAtOAM4AUIBf4iz+2G6pmrd3B/Z8sZ9nm3SQ1\niOHxYd0ZlNyMyPDKPXlp1TCWf/y5A9cOaMuk+amM+2EtV7w5l6NbxXHbGZ1Ibl6vUrcvIlVXVW4n\n6taMZGT/JC46uiU/pGzn+W9SuHvKMsZ+v5abTm7PuT0SNO+RiABQVFLKOzN/5bkZv7A9u4CTOjbi\nmhPb0KulemcfggigJ/A359wsM3uasqFoB0VzpIpUXXuKRgXFKhoFE3/dPW3EAZY74Fp/bCuUbc3M\n54FpK5i6aDMJ9Wry+LDuDE5uRkQlF4v+qGZUOBf3a8kFfZozfvYGnv56Dec8/yNDeiZw55mdiYuN\nCmgeEQl+1aGdCAsz/tQ+nhPaNeT7Ndt59IuV/N8Hi3hn1q/8+9yudGpax+uIIuKhOeszuHPyUlZt\ny+LoVnG8NLInvVrGeR2rKkoFUp1zs3yPJ1JWNNq2566aZtYUSKvoxZojVaTqyikom8+ooKgUNI1u\n0FD/2CrAOce7szfwwKcrKCp1XD+wHVf/qQ01o7ytvkaGhzGyfxLn9kzkhW9TeOm7tXy7Kp27zurE\nOckJuqImItWS2f+KR5Pmb+KBaSs469n/ctmxSfzfqR2oEakrYyKhJDOviH9/upz356aSUK8mY0f2\n4pTOjXUcdJicc1vNbKOZdXDOrQIGAst9X6OAh3z/TvEwpohUgv/1NNJk2MFERaMgtyUzj1smLuaH\nNds5rm1DHji3Ky0aHHhy60CqFR3BzX/uyKDuCYz5cDE3TVjEJ4u28MjQbjSoFe11PBGRSmFmDO2V\nyMmdGvHw56sY98M6ZqxK56kLkumSUNfreCISAD//soP/e38h27IKuOpPrblhYDvNWeQffwPe8d05\nbS1lQ5bDgPfN7HJgAzDMw3wiUglyyg1Pk+ChVi2IfbFsKzd/sIiiEsc/Bx/FRUe3DOp5Mzo0qc3E\nvx7D6z+t5+HPVnL60z/w5AXJHNu2odfRREQqTb2YKB4c0pUzujbhHx8s4tz//MjfT+nAVSe0DurP\nbBE5fIXFpTw+fRVjf1hLUoNYJl19jOZ29CPn3EKgdwWLBgY6i4gERkmpI7ew3PA0CRq67UsQKiop\n5YFpK7jqrXm0bBDLZzccz8j+SVXi5CM8zLj8uFZ8dO2x1K4RwcWvzOLx6asoLdWQchGp3o5vF88X\nN57AqZ2b8PDnK7nizblk5hZ5HUtE/Gzb7nxGjJvJS9+vZUTfFnx6/XEqGImIHKGcwuLfvtfwtOCi\nolGQSc8q4KJxsxj7/VpG9mvJxKv7k9Qw1utYh6xzszp8/LfjGNozkWe/SeHKN+eyO18nTyJSvdWL\nieK5C3tw/+Cj+H51OoOe/y8rtuz2OpaI+MnsdRmc+UzZ3/WzI3rwwLldNRxNRMQP9gxNAw1PCzYq\nGgWRVVuzOOf5H1m8aRdPXZDMP8/pUqVvNRgTFcEjQ7vxz8FH8d3qdM55/kd+Sc/2OpaISKUyMy7p\nn8SEq/qRV1jCkP/8xPRlW72OJSJHaPzsDVw4bia1a0Qw+ZpjObt7M68jiYhUG9n5KhoFKxWNgsS3\nq9I474WfKCwpW7OtGQAAIABJREFU5f2r+nNOjwSvI/mFmTGyfxJvX3E0mblFnPfCT8xdn+F1LBGR\nSterZRyfXH8c7ZvU5qq35/Haj+u8jiQih8E5x6NfrGTMh0vo36YBH117LB2a1PY6lohItZJdvqdR\nkYanBRMVjYLA+3M3ctnrc2gRF8OUa4+lW2L1Gxffr3UDJl9zLPVjorjo5Vl8vlRX3UWk+mtUuwbj\nr+zHKZ0ac9/Hy7nv42Wa402kCikoLuHGCQt5fsYvDO/TnFcv7UPdmpFexxIRqXZyCv5XKFJPo+Ci\nopHHXv5hLbdMXMyxbRvywV/706xeTa8jVZoWDWKYdPUxdG5Wh6vfmcfbM3/1OpKISKWrGRXOCxf3\n4rJjW/Haj+v5+/sLKS7RwZBIsMsrLOHKN+cxZeFmbv5zBx4c0pXIcB06i4hUhmzNaRS0NHOfR5xz\nPD59Nc/NSOHMrk154oLuVXr+ooMVFxvFu1f047p353PnR0vJLyrhiuNbex1LRKRShYcZd5/dmQa1\nonj0i1XkFpbw7IU9QuJzX6Qq2p1fxBWvz2Xurxk8cl43zu/T3OtIIiLV2u+LRhqeFkx0ucQDzjke\nmLaC52akMKJvc54ZEVonDjWjwnlxZC/O7NqUf326gue+WeN1JBGRgLh2QFvuG3QU05dv44o35pJX\nqIMikWCzK7eQi8bNYv6GnTwzoocKRiIiAfC7u6cVqadRMFFPowDbUzAa98M6RvVvyb2DjsLMvI4V\ncJHhYTw9PJnoiDAem76aohLHTae09zqWiEilG3VMEjFR4dwyaTFXvjmXl0f1pkZk6Fw4EAlmmblF\nXPzKLFZvy2bsJb04qWNjryOJiIQEDU8LXioaBZAKRr8XER7GY8O6ExFuPP31GqIjw7jmxLZexxIR\nqXTDejfHzLh54iKuemseYy/pFVI9TkWC0e78Ii55dRart2bz0sheDOjYyOtIIiIhI6egmPAwo6TU\naXhakNHwtAB68svVjPthHZeoYPSbsDDjwSHdGJzcjEc+X8Ur/9UtqUUkNAztlciD53blu9XpXPP2\nfAp1VU3EM9kFxVz66myWbd7Nfy7qqYKRiEiAZRcUUys6gqjwMPU0CjIqGgXIyz+s5ZlvUji/dyL3\nqWD0O+FhxuPDunN6lyb885PlvDd7g9eRREQCYnjfFvzznC58vTKNf3ywiNJS53UkkZBTUFzCVW/N\nZVFqJs9d2IOTO2tImohIoO0pGkVHhGlOoyCj4WkB8MHcjfzr0xWc3qUJDw7ppoJRBSLCw3h6eA/y\n3prLHZOXEBcbxZ+PauJ1LBGRSjeyX0t25xXx6BeriIuN4p6zO6udEAmQklLHTRMW8mPKDh4b1p3T\nujT1OpKISEjK8RWNCopLNDwtyKinUSX7esU2bp20mOPbNeSp4cmEh+lEYF+iIsL4z0U96ZZYj7+9\nt4DZ6zK8jiQiEhDXnNiGy49rxes/refZb1K8jiMSEpxz3D1lKdOWbOWOMzoxtFei15FEREJWdkEx\nsdHhREeEa3hakFHRqBIt2riL695dQJeEurx4sSY5PRgxURG8emkfEuvX5Io35rBqa5bXkUREKp2Z\ncccZnRjSI4EnvlzN+3M2eh1JpNp7fkYK78zawF//1IYrT2jtdRz5AzMLN7MFZvaJ73ErM5tlZmvM\nbIKZRXmdUUT8J7ughNg9w9NUNAoqKhpVkg07crn8jTk0rB3FK6P6EButkYAHKy42ijcv60vNqHD+\n8tps0nbnex1JRKTShYUZDw/txvHtGnL75CX8d812ryOJVFtTFm7isemrGdIjgVtP6+B1HKnYDcCK\nco8fBp50zrUDdgKXe5JKRCpFTkExtWtEEBURRkGRhqcFExWNKsGu3EIufX02xaWO1//Sl/ja0V5H\nqnIS68fwyqg+7Mor4oo355JbWOx1JBGRShcZHsbzF/WkTXwtrn57nnpbilSCWWt3cPMHizm6VRwP\nntdVc4gFITNLBM4EXvY9NuAkYKJvlTeAc7xJJyKVIaegmNioCKIjNTwt2Kho5GdFJaVc8858UjPy\nGDuyN23ia3kdqcrqklCXZ4b3YMmmTG6asFB3FRKRkFCnRiSv/qUPNaPCuez1OaRlqbeliL+sTc9m\n9FvzaB5Xk7Eje2vqgOD1FHALsOfMsQGwyzm35ypiKpDgRTARqRzZ+cXlhqepp1EwUdHIz+77eBk/\n/bKDB4d0pW+rOK/jVHknd27MnWd25otl23j4i5VexxERCYiEejV59dI+ZOQUcvXb83XwJOIHu/PL\nei+HhxmvXdqXujGRXkeSCpjZWUCac25e+acrWLXCq4lmNtrM5prZ3PT09ErJKCL+5Zwjp7Ds7mma\n0yj4qGjkR2/9vJ63Z27gqj+15jzdgcNvLjs2iYuObsFL361lysJNXscREQmILgl1eWxYd+b9upM7\nJy/FOfW2FDlcJaWO699bwIYdubxwUU9aNIjxOpLs27HAIDNbD4ynbFjaU0A9M9szSWgisLmiFzvn\nxjrnejvnesfHxwcir4gcobyiEkod1KoRQXREOIUqGgUVFY385KdftnPvx8sZ2LERt/y5o9dxqhUz\n456zj6JvqzhumbiYJamZXkcSEQmIM7s15fqB7fhgXiqv/rje6zgiVdbDn6/k21Xp3D+4C0e3buB1\nHNkP59xtzrlE51wSMBz4xjl3ETADGOpbbRQwxaOIIuJn2QVlI09joyOIjlRPo2CjopEfbNqVx3Xv\nLqBVw1ieGp5MeJgmVPS3qIgw/nNRTxrWimb0W3NJzyrwOpKISEDcOLAdfz6qMf/+dLnuqCZyGD5a\nsImx36/lkv4tufDoFl7HkcN3K/B3M0uhbI6jVzzOIyJ+kp1fVjSqFR2uOY2CkIpGRyi/qIS/vjWP\nouJSXhrZi9o1ND6+sjSsFc1LI3uxM7eQa9+dT1GJKtAiUv2FhRlPnJ9M20a1uH78AjbtyvM6kkiV\nsXzzbsZ8uJi+reK466zOXseRQ+Sc+9Y5d5bv+7XOub7OubbOuWHOOV1BFKkmcgrKikSxUWXD0wqK\ndJ4XTFQ0OgLOOe78aClLNmXyxAXJulNaAHRJqMvD53Vj9roMHvlcE2OLSGiIjY7gxYt7UVRcytVv\nzyO/SFfgRA4kM7eIv749j7o1I3n+wp5EhuuwV0QkGO0ZnlY2p5GGpwUbv7SeZnaama0ysxQzG1PB\n8kvNLN3MFvq+rvDHdr327uwNTJyXyvUD23FK58ZexwkZg5MTGNW/JeN+WMe0JVu8jiMiByFU2wl/\nah1fi8fP787i1EzunbrM6zgiQa201HHjhAVsyczjPxf1Ir52tNeRRERkH34rGv02p5EujgWTIy4a\nmVk48DxwOtAZGGFmFfX/neCcS/Z9vXyk2/Xa0k2Z3Dd1OSe0j+fGge28jhNy7jizMz1a1OPmDxaR\nkpbtdRwR2Y9QbScqw6lHNeHaAW0YP2cj78/d6HUckaD1n29TmLEqnbvP6kyvlvW9jiMiIvuRU34i\n7PCynka6a2zw8EdPo75Aim+ccSFlt8Yc7If3DVqZeUVc/c48GtSK4qkLkgnTxNcBt2di7BqR4Vzz\nzjzyClWNFgliIddOVKa/n9KBY9o04O4pS1m1NcvrOCJB56dftvPEl6sZnNyMi/u19DqOiIgcwO97\nGoXjHBSVqGgULPxRNEoAyl/uTPU990fnmdliM5toZs39sF1POOe4+YNFbNmVz3MX9iQuNsrrSCGr\nad2aPDU8mTVp2dwzdanXcURk30Kqnahs4WHGU8OTqV0jkmvemffb1TkRgfSsAm4Yv5CkhrE8cG5X\nzHRhT0Qk2OWULxpFlJUoNEQtePijaFRRa/zHsuDHQJJzrhvwFfBGhW9kNtrM5prZ3PT0dD9E879X\nf1zP9OXbGHN6R3V3DgLHt4vnugFteX9uKh/OT/U6johULKTaiUBoVLsGzwzvwbrtOdwxeYm6cIsA\nJaWOG8YvICu/iP9c1JPY6AivI4mIyEHILijGDGKiwssVjTQZdrDwR9EoFSh/RTgR2Fx+BefcjnK3\nxRwH9KrojZxzY51zvZ1zvePj4/0Qzb+WpGby0GcrOKVzYy4/rpXXccTnhoHt6NsqjjsmLyUlTUM1\nRIJQyLQTgdS/TQNuOrk9Hy3crPmNRIDnZ6Tw0y87uH9QFzo2qeN1HBEROUjZBcXERkVgZkRHhAMq\nGgUTfxSN5gDtzKyVmUUBw4Gp5Vcws6blHg4CVvhhuwGVlV/Ede/NJ75WNI8O7abuzkEkIjyMZ0f0\nICYqnOveXaBbUYsEn5BoJ7xw7YC2HNu2AfdOXa6iuYS0OeszeOqr1ZyT3IxhvRO9jiMiIocgp6CY\nWr7eodGRvp5GOqcLGkdcNHLOFQPXAV9QdpD/vnNumZndb2aDfKtdb2bLzGwRcD1w6ZFuN5Ccc9z5\n0VI2ZuTy9Ige1IvRPEbBpnGdGjx2fndWbs3iwWk61xQJJqHQTnglLMx48vxkaqpoLiFsV24hN7y3\ngOZxMfzznC66sCciUsXkFJQQG13Ww0jD04KPXwZ7O+emAdP+8Nzd5b6/DbjNH9vywqT5m5iycDP/\nd0p7+iTFeR1H9mFAh0ZcdmwrXv1xHce3i+fkzo29jiQiPtW9nfBSozo1eHxYd/7y+hwe+mwl9w46\nyutIIgHjnGPMpCWkZRUw6epjqF0j0utIIiJyiLLK9zTS8LSg44/hadXa+u053DNlKUe3iuOaAW29\njiMHcOvpHejctA43T1zEtt35XscREQmIAR0bcflxrXj9p/V8tXyb13FEAua92Rv5fNlWbjmtA92b\n1/M6joiIHIacguLfbl7wW08j9Z4OGioa7UdRSSk3TlhIeJjx5AXJhIepu3Owi44I59kLe5BfVMrf\n319IaanuKCQioeGW08qK5rdOWkx6VsGBXyBSxf2Sns39nyzj+HYNueK41l7HERGRw1ThnEbqaRQ0\nVDTaj2e+XsPCjbt4cEg3mtWr6XUcOUht4mtxz9md+TFlB6/+uM7rOCIiAREdEc4zI5LJLijm5omL\ncE5Fc6m+CotLuXH8QmpGhvPYsO6E6cKeiEiVla3haUFNRaN9mLM+g+dnpDC0VyJndmt64BdIULmg\nT3NO6dyYRz5fxcqtu72OIyISEG0b1eaOMzvx7ap03vz5V6/jiFSaJ79azZJNmTw4pBuN69TwOo6I\niByB7IqGpxVreFqwUNGoAln5Rdw0YSGJ9WM0oWgVZWY8NKQrdWpGcsN7C3VHIREJGSP7tWRAh3ge\nmLaCNduyvI4j4nez1u7gxe9+YXif5pzWpYnXccTPzKy5mc0wsxW+u2re4Hs+zsy+NLM1vn/re51V\nRPzj93Ma+XoaFamnUbBQ0agC//xkOZt35fHE+d1/6yYnVU+DWtE8Oqwbq7Zl8egXq7yOIyISEGbG\nI0PL2q+b3l9Iobp3SzWSlV/E399fRIu4GO46q7PXcaRyFAP/55zrBPQDrjWzzsAY4GvnXDvga99j\n8UiJ5g0VPykoLqGoxFG7huY0ClYqGv3B9GVbeX9uKlef2IbeSXFex5EjNKBDI0b2a8kr/13HT79s\n9zqOiEhAxNeO5oEhXVm6aTfPfrPG6zgifnP/x8vZkpnHE+cn/3ZVWqoX59wW59x83/dZwAogARgM\nvOFb7Q3gHG8SyuLUXXS663M2ZuR6HUWqgez8YgBio8p6GGl4WvBR0aic9KwCbvtwCUc1q8MNA9t7\nHUf85LYzOtKqYSw3f7CYrPwir+OIiATEn49qwtBeiTw/I4X5G3Z6HUfkiE1ftpUP5pVd2OvVUiOT\nQoGZJQE9gFlAY+fcFigrLAGNvEsW2r5blU5hSSmbduV5HUWqgZyCsuLQXsPT1NMoaKho5OOc4/bJ\nS8gqKObJC5KJitCuqS5ioiJ4/PzubMnM4/6Pl3sdR0QkYO45uzNN69bk7xMWkltY7HUckcO2PVsX\n9kKNmdUCJgE3OucO+q4mZjbazOaa2dz09PTKCxjCFm7cBeikXvwju6Ds+GTPtDB7zsM1p1HwUGXE\n58P5m/hy+TZuPrUD7RvX9jqO+FnPFvW55sS2fDAvlenLtnodR0QkIGrXiOSxYd1ZvyOXhz5b6XUc\nkcPinOP2D3VhL5SYWSRlBaN3nHMf+p7eZmZNfcubAmkVvdY5N9Y519s51zs+Pj4wgUOIc44Fe4pG\nutGM+EGO76JWLd+cRuFhRmS4aXhaEFGrC2zelce9U5fRNymOy45r5XUcqSTXD2xH56Z1uH3yEjJy\nCr2OIyISEP3bNOCyY1vx5s+/8mOK5naTquejhZuYvnwb/zi1vS7shQAzM+AVYIVz7olyi6YCo3zf\njwKmBDqbwIaM3N+Oo9XTSPzhtzmNys1TFx0Rrt+vIBLyRSPnHLdMXEyJczw2rDvhYeZ1JKkkURFh\nPHFBdzLzirjro6VexxERCZhbTutA6/hYbpm4mN2a202qkK2Z+dw9ZRm9W9bn8uNaex1HAuNYYCRw\nkpkt9H2dATwEnGJma4BTfI8lwPYMTQMVjcQ//jg8Dcomw1ZPo+AR8kWjt2dt4L8p27njzE60aBDj\ndRypZB2b1OHGk9vz6ZItfLxos9dxREQCokZkOI8PK5vb7V+faG43qRqcc9w6aTHFJbqwF0qcc/91\nzplzrptzLtn3Nc05t8M5N9A51873b4bXWUPRgg3li0Y6qZcjl7OvopHmNAoaIV002piRy4PTVnB8\nu4Zc2LeF13EkQK46oTXdm9fjrilLScvK9zqOiEhA9GhRn7/+qQ3vz03lm5XbvI4jckAT5mzku9Xp\n3HZGR5IaxnodR0SABRt20rFJ2TBRndSLP+zpafS74WmRGp4WTEK2aFRa6rh54iLCzHjovG6UDZ+W\nUBARHsbjw7qRW1jCHZOX4pzzOpKISEDccHI7OjSuzW0fLiEzV8PUJHht2pXHvz5dwTFtGnDx0S29\njiMiQH5RCcu37KZf6waAhqeJf/xWNIoK/+05DU8LLiFbNHp71q/MXJvBXWd1IqFeTa/jSIC1bVSb\nm0/twJfLtzFVw9REJERER4Tz2LDubM8u5H4NU5Mg5ZxjzKTFOOd4+LxuhGlYmkhQWLZ5N0UljqNb\nxQEanib+kVNQTI3IMCLC/1eaiIoIU1EyiIRk0WjDjlwenLaSP7WP5/zezb2OIx657LhW9GxRj3um\nLtMwNREJGV0T63LNiW2YNF/D1CQ4vTd7Iz+s2c5tZ3SieZzmmxQJFgs27ASgZ8v6RIXrpF78Y+mm\n3TSuU+N3z2lOo+ASckWj0lLHLZMWERFmPDikq4alhbDwMOPRYd3JLSzhTg1TE5EQct1JbenQuDZj\nJmmYmgSX1J25/PvT5RzTpoHmmxQJMgs37qJZ3Ro0rlNDJ/XiF0tSM/l57Y69Pu+jI8LVky2IhFzR\n6B3fsLQ7z+pEMw1LC3lt4mvxj1PbM13D1EQkhERHhPP4+d3ZkaNhahI8nHPc9uESAA1LEwlCCzbs\nokeL+gBER2rOGTlyL373C7VrRHDh0X8sGqknWzAJqaLRxoxcHvxsJce3a6hhafKby49rTQ/fMLX0\nrAKv44iIBESXhLpc/aeyYWozVqV5HUeECXPKhqWN0bA0kaCTlpXPpl159GhRD9jTE0Qn9XL41m/P\n4bOlW7i4X0tq14j83bKyoqR+v4JFyBSNnHOM+XCx7pYmewkPMx4dWnY3tXumLvU6johIwPxtYFva\nN67FbZOWsDtfw9TEO1sy8/j3pyvo1zqOizQsTSTovDNzA1A2nxGoJ4gcubE/rCUiPIy/HJu01zIN\nTwsuIVM0Gj9nIz+m7OD2M3S3NNlb20a1ufHkdkxbspVpS7Z4HUdEJCCiI8J5dGh30rLyeeDTFV7H\nkRC1Z1hacanjkfO6a1iaSJCZsTKNZ75Zw7k9EujRvKynUVREGAVFOqmXw5OWlc/Eeamc1zORRrVr\n7LVcc2YFl5AoGm3eVXb16pg2DRjRV8PSpGKjj29N14S63PXRUjJyCr2OIyISEN2b1+PKE1ozfs5G\nfliT7nUcCUEfzt/Et6vSueW0DrRooGFpIsFk/fYcrh+/gE5N6vDAuf+7iVB0pIanyeEpLC7lX5+s\noKiklNEntK5wHfVkCy7VvmjknOOOyUsoKXU8rGFpsh8R4WE8Oqwbu/OLuHfqMq/jiIgEzE0nt6d1\nfCxjJi0hp6DY6zgSQtJ253Pfx8vo3bI+o/oneR1HRMrZmVPIVW/NIzzMeGlkL2pGhf+2rOykXj2N\n5NDszClk5CuzmLpoMzed3J5WDWMrXK+sKKnfr2BR7YtGkxdsYsaqdG49rYMmVZQD6tikDtcOaMvU\nRZv5cvk2r+OIiAREjchwHjmvG5sz83jk85Vex5EQ4ZzjrilLyS8u5eGhuluaSLAoKXW8M+tXBjz+\nLb+kZ/PsiB57nUepJ4gcqoUbdzH4+R9ZsHEXT17QnesHttvnutERYRQWl+KcC2BC2ZcIrwNUprSs\nfO77eDm9W9bnEl29koN0zYlt+XzpVu6YvIS+reKoWzPywC8SEanieifFcekxSbz243rO7NaMvq3i\nvI4k1dy0JVv5Ytk2xpzekTbxtbyOIxLysvKLmL5sG6/9tI6lm3ZzdKs47ht8FB2b1Nlr3eiIcHZk\nazoH2b/SUsfXK9N4+Ye1zFqXQcNa0bx3ZT96+SZU35foiDBKHRSXOiLDdUHBa9W2aOSc466PlpJX\nVKKrV3JIoiLCeHRod875z4888OkKHh7azetIIiIBcfOfO/DVim3cOmkxn91wPDUiww/8IpHDkJFT\nyN1TltItsS5XHNfK6zgiIamk1LFqaxbzNuzkxzXb+WZVGoXFpbSIi+HZET04q1vTfU7tUXZLdA0f\nkt9zzrFpVx6z12Xw/ep0fliznR05hSTUq8kdZ3Tigr7NqVPjwBfkoyPKjj8KikuJDK/2g6OCnl+K\nRmZ2GvA0EA687Jx76A/Lo4E3gV7ADuAC59x6f2x7X3T1So5E18S6jD6hNS98+wtndW/K8e3ivY4k\nUqUFYzshe4uJiuDhId248OVZPPnlam47o5PXkaSauv/jZezOL+KdoUcToRMCOQQHak/k95xzZOYV\nkbozj9SdeWzMyCUlLZs1aVms3pZNtm8eu8Z1ormwbwsGJTejR/N6B5wHVsPTQltWfhHbduezcWce\nv27PYf2OXFZvy2LZ5t1k5hUB0CA2iuPbNeTUo5pwaufGh/RZHx1Ztm5BUQm1oqttP5cq44j/B8ws\nHHgeOAVIBeaY2VTn3PJyq10O7HTOtTWz4cDDwAVHuu19ycgp5J6pS+maoKtXcvhuGNiOL5ZtZcyk\nJUy/6QRi9YElcliCsZ2QfTumbUNG9G3OuB/WckbXpnT33V5ZxF++XrGNjxZu5saT21U47EVkXw6y\nPamWSksduUUl5BQUk11QTFZ+Mdn5xezOLyIz739fO3MK2ZFTSEZOIWlZ+aTtLtiruNOwVhRtG9Vi\nSM8EerSoR++WcSTWr3lINwyKjtDd06o65xx5RSVkF5T9LuUUlJCVX8Ru3+/V7rwiduUWsTO3kJ25\nhWzPKmR7dgFpWQW/FRv3iI0Kp02jWpzRtSlHNatDcvN6dG5a57BH+0T/f3v3HR5HdfVx/Hu3qltu\nkixb7t1ylw3GQCgGTLOBYDAtBEIIYAgJLfCmEVoIhBoI2KG3gHHo3QQIYLBB7h1XXLHlIqtYbVf3\n/WNXsrDlqjLS7O/zPHp2d7SSzmhm5+ycveeOL1o00j7WJNTHWfBwYLm1diWAMeZlYCxQ8+A9Frg1\nen8K8IgxxtgGmtnqtrcXsqOkghcu06dXcuiqJoYdN/Fr7vlgCX8Zm+10SOIiJeXhH12FxOWaXJ6Q\nfbvllD58uiSPm6bM4+1rjiTgUy6V+lFQWsHvX19A74xkrjqmu9PhSPNzIPmkQVhrKQ9XUhG2VIQq\nKQ9XUh69rai6X3N5jftloarbMGUVkeVloUpKKyKPS0NhSivClFZElpVUhCkpD7OzPHJ/Z3mI0or9\nnzz7PIZWiYHqr6EdW9I2OUh6ShztU+Pp0DKBDi3jaZkYqPP/I+jzUFah9rS6sNYSqrS79p/obUXY\n7rk//Wi/ClffL6v6qghX3y+N3o/sU5F9qLSikpLq/SlMSXmInRVh9vcuy2MgNSFAywQ/bZKC9GmX\nwtE9g7RrEUdGi8h+1al1Im2SAvV6lfKa7WnivPooGrUH1tZ4vA44bG/PsdaGjDE7gNbAlnr4+z9S\n9enVtcfr0yupu5zOrbh4RGee+UoTw0r92Vke4tSHv+TcYVlc8ZNuTofTGJpUnpD9S4nzc+eZ2fzi\n2Vwe/XQ5vz2hp9MhiUv89b3FbC4sZeJFQ1WMlENxIPmkzu54ZxFvzt1QfTJfES0W1RdjIkWXOL+3\n+jbO5yUu4CXO56FVYoD4VC/xfi/xAS+JQR/xfi9JQR8JwchtcpyPpKCf5DgfLeL9tIj3kxDw1uuJ\n+75E5jRqfif0FeFdhbmyil0FlrJQpLDyo8Je1ePdija7ijx2V+GwRgGxrHqfqaQiZGsUg3btS1XP\nrc+PxoI+z679ye8lzr9r30qO85GWHCQh4CU+ULU/eUkI+kgMeEmK7k9JQR8p8T5S4vykxEX2Lyfm\nBt410qjpFybDlTZamNtV/P3R/hTabV/aR4G55r5SfRu2lIfCkYJ1LcXqB88dzIhurRt0HeujaFTb\nXrT77n8gz8EYczlwOUDHjh0PKZj0lDhOG9COCcfq0yupH5oYVurbfR99x6otxQyKnbafJpUn5MAc\n3yedMwZl8uinyzm5f4Y+iJE6m7Z8C//+Zi2/+klXtT3KodpvrqiPPNErI5lR5ekEvAa/14Pf5yHg\n9RDwefB7DYHoMr83cpLu99b8fuQ26IvcBrwegn4PQZ+3ernPYxqtuNNQqtrTrLWNsi7WWgpKQmwp\nLiN/ZznbiyvIL4m0UBWUVlS36xVF2/d2lkfarXaWh6IjayKFolBl3ao0Po+JbNfotq25D/h9pnpZ\nUtBXfd8+j2QyAAAgAElEQVTnNTW2/a79pGpfCvg8+Kr2m+rf4921v1XtT9FlVV8/2sd8nma/T9W0\na06jhitMWmspKguxvbiCbTvL2V5cXt3mWVBSQVFZiILoPlVc9VVjf6q6LQ/XLUaPoXo7Bnze6P5k\nqo8lVceXeL+XlDjfj/cVb6TI3NDqo2i0Dsiq8bgDsGEvz1lnjPEBLYBtu/8ia+0kYBJATk7OIb2i\ns9u34JHzhxzKj4rUKjHo4+6zBnDhk5oYVupu1prtPDVtFRce3pHDuzbspwJNSJPKE3Lg/nR6P75Y\ntoWbpszjtSuPUMu3HLLishA3vzaPLm0S+e0ojVyTQ7bffFIfeWJcThbjcrL2/8QYVjUSpDxcWd1K\nVBeVlZZ120tYuaWI77fu5PutO9m4o4SNO0rZVFDKlqKyfY72qhotkxj0kRT0kRjwkZnqJz4QGUkT\nFx21lRC9Dfojo7qqbqtGfQWrbqsLM94aRRuPrsjdSOqjPc1ay5aicpZtLmTVlmLWbS9h/fYSNuSX\nsLmwjM2Fpfts+4zze6pH8yUGvSQGfKQlx5EQ8EZGbPl3jdqK83uIj+5nNUd7Bbwe4nYrGgdrFP4C\nXk+zeG9VH0Wjb4EexpguwHpgPHD+bs95C7gY+Bo4G/hE81RIc3JkjzaMH6aJYaVuykJhbpoyj3Yp\ncfxudG+nw2lMyhPNVKvEALeNzWbCS7N44stVsdJOKQ3g3g+XsnZbCZN/NUIjdqUuDiSfSCOoOVHx\noRSNistCTF+5lWnLt7Jg/Q4WbSz40eTK8X4vmalxZKbG0z2tDW2Tg7RODNAmKUjLxACp8X5SEyJt\neUlBX7M48ZYDdyjtaaUVYWZ+v53c1dvJ/X4b89fvIH9nRfX3fR5DZmo87VrEMSgrlbTkIG2Tg7RK\nDNA6KUBqQqC61TMlzq8W6hrqXDSKzj1xNfAhkUtfPmWtXWiMuQ3Itda+BTwJPG+MWU7kk+Pxdf27\nIo3t/07tw6dLN2tiWDlkj3yynOWbi3jmkmEkx/mdDqfRKE80b6f0z+CkfuncP/U7TuibTre2SU6H\nJM1M7uptPPv1an42opPmBpQ62Vs+cTismBSMFn/LKioh7sB+JhSu5MOFm/j3N2v4ZtU2ysOVxPk9\n9G2XwpmD29MvM4VuaUl0ap1A26Sgq9qt5OBUjzTaT3tauNLy5fItvDVnAx8t/IHCshDGQK/0ZEb3\ny6BnejI90pPo1jaJ9JQ4vBopdkjq5Rri1tr3gPd2W/anGvdLgXH18bdEnJIS5+euM/trYlg5JAs3\n7OCxz1Zw1pD2HNMrzelwGp3yRPNljOH2sdmc8MDn/G7KPCb/aoSG58sBK62IjLDMbBHPTbE1wlIa\nSG35RBrfwYwEqQhX8tzX3/PUl6tYn19CVqt4fj6yM0f3aEtO55YafSh7qJ7TaB/tad+s2saf3lzA\nkh8KSQ76OCk7g1P6ZzC0UytaxMfOh7ONoV6KRiKxoubEsKOzM+jTThPDyv5VhCu58dV5tEwM8KfT\n+jodjshBS0uJ44+n9eWGV+fy3Ner+fnILk6HJM3Egx8vY+WWYp67dDhJQb3tFHGLmu1p+5K/s5wJ\nL81i2vKtDO/cij+d3pdRfdI14kP2aV9Fya1FZdz+ziLemLOBzBZxPDR+ECf1y1DxsQEpe4scpJoT\nw75+lSaGlf2b+L8VLNpYwMSLhpKa0PBXOBBpCD8d0p63527gbx8s5fg+6WS1SnA6JGni5q7NZ9Ln\nKxg3tANH92zrdDgiUo+qT+r30T60Iq+Iy57NZf32Ev4+biBnD+3QWOFJM7e3ibBLK8Jc8sy3LNlY\nyDXHdeeqY7oTH1CxqKHpbFfkIFVNDDt//Q4mfbHS6XCkiftuUyEP/3c5pw1ox0n9MpwOR+SQGWP4\n61n98XoMv/vPPDRPuexLeaiSm6bMo21ykD9ohKWI6+w6qa+9Pe37rcWc+eg0CkoqeOmXh6lgJAcl\nUF2U3LV/WWv505sLmLduB4+cP5jrT+ylglEjUdFI5BCcOqAdJ2dn8ODHy1i+udDpcKSJCldabpwy\nj6Q4H38Z08/pcETqLDM1nv87pQ9frdjKy9+udTocacIe/XQ5SzcVcteZ/TW3hIgLVY00Kt9Le9pj\nn62gNFTJ61eNJKezJsCXg1Nb++OLM9YwOXcd1xzXnRP1QWyjUtFI5BDdNjabhICXG6fMI1ypT9xl\nT098sZK5a/O5dUw/WicFnQ5HpF6cNzyLI7q15s53F7Mhv8TpcKQJWrShgEc/Xc4ZgzI5vk+60+GI\nSAPY10TFmwtKeW3WesYN7UDH1mplloO3e9Fo9prt/OXthRzTqy2/GaWLETU2FY1EDlHb5CC3nt6P\n2WvyeXraKqfDkSZm+eYi7pv6HSf2Tef0Ae2cDkek3hhj+NtPBxCutNzy2ny1qcmPVIQruXHKXFIT\n/Pz5dI2wFHGrvc05A/DktFWEKiu5/OiujR2WuITP68HrMdXtj89P/57EoI+Hzh2sSdQdoKKRSB2M\nHZTJqD5p/P2jpazaUux0ONJEhCstN02ZS7zfyx1nZmOMkpu4S1arBG4+uTf/+y6PV2euczocaUIe\n/2wFCzcUcMcZ2bRM1MT/Im61t6tbFZRW8NL0NZzcvx2dWic6EZq4RNDnqZ5ofc6afHI6taJFgtqd\nnaCikUgdGGO488z+BLwebnx1rtrUBICnp61i1pp8bh3Tl7TkOKfDEWkQFx3eieFdWnH7O4vYuENt\nagJLfijg4U+WcdqAdozO1ghLETerHmm029XTXpy+hsKyEFf+pJsTYYmLBH0eykKV5O8sZ+WWYgZ3\nTHU6pJilopFIHaWnxPHn0/uR+/12nvlqtdPhiMNW5hXx94+WcnzvNM4Y1N7pcEQajMdjuPfsAVSE\nK/k/tanFvFC4khtfnUdKnJ/bxmY7HY6INLDa5jQqrQjz1LRVHNm9DdntWzgVmrhE0OelLBRmztp8\nABWNHKSikUg9OGtIe47vnca9Hy5Rm1oMq7paWsDr4a6z+qstTVyvU+tEfje6N58uzWOK2tRi2sTP\nVzJ//Q7uOCObVmpLE3G92trT5qzNJ6+wjJ+N6ORUWOIiQX9kpNHsNfkYAwM6qGjkFBWNROqBMYa7\nzlKbWqx76stVzPx+O7eO6Ud6itrSJDZcPKIzwzu34ja1qcWsJT8U8ODH33HqgHac3F9taSKxoLaJ\nsAtKKgDITI13JCZxl6o5jeaszadXejJJQZ/TIcUsFY1E6knNNjVdTS32LN8caUsb1SedMwerLU1i\nh8djuHfcAEJhy83/UZtarKkIV3L95Lm0iPdzu9rSRGJGoGqkUY05jYrKQgA6uZd6EfR5KY22p6k1\nzVkqGonUo7OGtGdUnzTu+XApyzcXOR2ONJJIW9pc4vxe7tLV0iQGdWqdyC2nRK6mNjl3rdPhSCP6\n56dVV0vrr7Y0kRji9Rj8XvOj9rTiaNEoUUUjqQdBn4elPxSyo6SCQVkqGjlJRSORelTVppYQ8HL9\nq3MJhSv3/0PS7E36fCWz1+Rz29h+pKktTWLUhYd1YkTX1tz+zmLW56tNLRYs3LCDf3yyjDMGZTI6\nO8PpcESkkUUmKq450ihSQEqOU9FI6i7o97BxRykAgzu2dDia2KaikUg9S0uO47ax2cxdm8/Ez1c6\nHY40sCU/FPDA1O84OTuDMQMznQ5HxDEej+GeswdgreXGV+dSqbndXK0sFOa6V+bSMjHArWP6OR2O\nuIQx5l5jzBJjzDxjzOvGmNQa37vFGLPcGLPUGHOSk3FKROSS6LtGGhWVVeD1mOpJskXqomrerKSg\nj25tkxyOJrbpFS3SAE4f0I5T+7fjwY+/Y/HGAqfDkQZSHqrkulfmkhLv444z1JYmktUqgT+c1pev\nVmzlua9XOx2ONKAHpi5j6aZC7vnpAFIT1JYm9WYqkG2tHQB8B9wCYIzpC4wH+gGjgX8aY7yORSnA\nromKqxSXhUkMePV+SOpFVfFxYFYLvB7tU05S0UikARhjuP2MbFrEB/jtK3N+9CmMuMcjnyxj0cYC\n7jyzP62Tgk6HI9IkjB+WxTG92nL3B0tYmae53dxo5vfbmPT5CsYPy+LY3mlOhyMuYq39yFobij6c\nDnSI3h8LvGytLbPWrgKWA8OdiFF2Cfp3b08LaRJsqTdVRaPBWWpNc5qKRiINpFVigHvO7s+SHwp5\n8ONlTocj9WzO2nwe/WwFZw1pz0n9NJeHSBVjDPf8dABxfi/XTdbcbm6zszzEdZPnkpkazx9O6+t0\nOOJulwLvR++3B2rOsr8uukwctHt7WnFZiCTNZyT1pKo9TZNgO09FI5EGdFzvdM4bnsXE/60gd/U2\np8ORerKzPMRvX5lDRkqc5vIQqUVaShy3j81mztp8HvtshdPhSD26673FrNm2k/vGDdSIAjkkxpiP\njTELavkaW+M5vwdCwItVi2r5VbVOnGaMudwYk2uMyc3Ly6v/FZBqkaLRj0ca6cppUl+C/kipYlBH\nFY2cple1SAP7/al9+XL5Fq6bPJf3rj1Kb7Jd4K73FrN6azEvXXY4KXF+p8MRaZJOH5jJ1EWbeOi/\ny/hJr7YM6KA3fc3dp0s288L0NfzyqC4c1rW10+FIM2WtHbWv7xtjLgZOA4631lYVhtYBWTWe1gHY\nsJffPwmYBJCTk6MZ+RtQ0Of90ZxGak+T+nRsrzSshTaaAsJxGmkk0sCSgj7uP2cQ67bv5La3Fzod\njtTRp0sjJ02XHdmFEd100iSyL7ePzaZtcpDfvDKHknLN7dacbS0q48Yp8+idkcwNJ/VyOhxxKWPM\naOB3wBhr7c4a33oLGG+MCRpjugA9gG+ciFF2Cfr3bE9LDKhoJPXj2N5p3H5GttNhCCoaiTSKYZ1b\ncdUx3Zmcu44PFmx0Ohw5RFuLyrhpyjx6pSdz/Yk6aRLZnxYJfu4bN5CVecXc9d5ip8ORQ2St5ebX\n5lNQUsGD4wdVzzMh0gAeAZKBqcaYOcaYxwGstQuBycAi4ANggrVWlWiH7d6eVlwW1pxGIi6kopFI\nI7l2VA8GdGjBza/NZ1NBqdPhyEGy1vK7/8xnx84KHjh3EHF+nTSJHIgjurfhsiO78Pz07/l0yWan\nw5FDMDl3LVMXbeLGk3rROyPF6XDExay13a21WdbaQdGvK2p8705rbTdrbS9r7fv7+j3SOIK+H189\nrbC0Qu1pIi6kopFII/F7PTxw7iBKK8Lc8OpcKivVZt+cvDhjDR8v3sRNo3vRN1MnTSIH44aTetE7\nI5kbp8wlr7DM6XDkIKzIK+LWtxYxomtrfnFkF6fDEZEmpObV06y1FJeHSQzqQzURt1HRSKQRdWub\nxB9P68sXy7bw5JernA5HDtDyzYXc8e4ijurRhktH6qRJ5GDF+b08fN5gCktDKpo3I+WhSq59eTZB\nf+RDD4+ntgtYiUisCvo91RNhl4UqCVdakoK6QIiI26hoJNLIzh/ekRP7pnPPh0uYv26H0+HIfpSF\nwvz633NICPi4b9xAnTSJHKKe6cn84bS+/O+7PJ75arXT4cgBuO+jpSxYX8DffjqAjBZxTocjIk1M\nzfa0orIQAEkaaSTiOioaiTQyYwz3nD2ANklBfv3ybIqjSVaaprvfX8KijQXc89MBpKXopEmkLi48\nrCOj+qRz9/tLWLhBRfOm7MtlW5j4+UouOKwjJ/XLcDocEWmCaranFZVG3s8mak4jEddR0UjEAakJ\nAR44dxCrtxbz57cWOh2O7MXURZt4etpqfn5EZ0b1TXc6HJFmr6po3jLRzzUvqWjeVOUVlvGbV+bQ\nIy2JP5za1+lwRKSJqrp6mrW2eqSRikYi7lOnopExppUxZqoxZln0tuVenheOXjZzjjHmrbr8TRG3\nOLxra645tjtTZq7jtVnrnA5HdrMhv4Qbp8ylX2YKt5zS2+lwmi3lCdldq8QAD547mNVbi/njGwuc\nDkd2U1lp+e0rcygsreCR84cQH1CriYjULuDzYC1UhG31hwDJKhqJuE5dRxrdDPzXWtsD+G/0cW1K\nalw6c0wd/6aIa/z6+B4M79KK37++gOWbC50OR6JC4Up+8/IcKkKVPHL+EII+nTTVgfKE7GFEt9b8\n+vgevDZ7PVNmqmjelDz2vxV8uXwLfxnTj14ZyU6HIyJNWNX7o7JQmOJyjTQScau6Fo3GAs9G7z8L\nnFHH3ycSU3xeDw+PH0x8wMuEF2dTUh52OiQB7pv6Hd+s3sYdZ2bTpU2i0+E0d8oTUqtrjuvB4V1b\n8cc3FrBsk4rmTcG3q7dx30dLOX1gJucOy3I6HBFp4oL+yKlkWaiSQs1pJOJadS0apVtrNwJEb9P2\n8rw4Y0yuMWa6MWavJwzGmMujz8vNy8urY2gizUNGizjuP2cgSzcVcqvmN3LcJ0s28dhnKzhveBZn\nDu7gdDhuoDwhtfJ6DA+NH0xCwMuVL87S/EYO21JUxtUvzSKrVQJ3nZmNMbpSpIjsW9C3q2hUXBb5\n4DNJRSMR19lv0cgY87ExZkEtX2MP4u90tNbmAOcDDxpjutX2JGvtJGttjrU2p23btgfx60Wat2N6\npXHVMd14JXctr+audTqcmLVu+05++8pc+rZL4c+n93M6nGZDeUIOVXpKHA+NH8yKvCL+7/X5WGud\nDikmhSstv/73bPJ3VvDYBUNJjvM7HZKINAPV7WkV4erCf1KcikYibrPfV7W1dtTevmeM2WSMaWet\n3WiMaQds3svv2BC9XWmM+QwYDKw4tJBF3Om6E3oye00+f3hjAX0zU+iX2cLpkGJKWSjMhJdmU1lp\neezCIcT5NY/RgVKekLo4skcbrhvVk/umfkdOp5ZcNKKz0yHFnPunLuWrFVu55+wB9M1McTocEWkm\nao40KowWjRL0/knEderanvYWcHH0/sXAm7s/wRjT0hgTjN5vA4wEFtXx74q4js/r4R/nD6ZlQoAr\nX5jFjp0VTocUU/7y9iLmrs3n3nED6NRa8xjVI+UJ2a8Jx3bn2F5tue2dRcxZm+90ODHlv4s38ein\nKzg3J4tzcjSPkYgcuJpzGhWXhUgMePF41Noq4jZ1LRrdDZxgjFkGnBB9jDEmxxjzRPQ5fYBcY8xc\n4FPgbmutTgZEatEmKcijFwxh444Srps8h8pKtWo0hpe/WcNLM9Zw5THdGJ3dzulw3EZ5QvbL4zE8\ncO4g0lPiuOL5meQVljkdUkxYmVfEb16ZQ7/MFP4yVi25InJwdm9PU2uaiDvVqWhkrd1qrT3eWtsj\nerstujzXWntZ9P5X1tr+1tqB0dsn6yNwEbca2qklfzytL/9dspkHPv7O6XBcb/aa7fzpzYUc1aMN\nN5zYy+lwXEd5Qg5UakKASRflkF9SzlUvzqQ8VOl0SK5WWFrB5c/PxO/1MPGioWrJFZGDVtWeVh6u\npKgspCunibhUXUcaiUgDuOjwTpybk8U/PlnOe/M3Oh2Oa20uLOXKF2aRlhLk4fGD8WpItYij+mam\ncM/ZA/l29XZuf0eDzRpKZaXl+slzWbWlmEfOH0yHlglOhyTyI8aYG4wxNtqyjIl42Biz3Bgzzxgz\nxOkYpeZIo0jRSFdOE3EnFY1EmiBjDLed0Y8hHVO5fvJcFm8scDok1ymtCHP5czPZUVLBxIuG0jIx\n4HRIIgKMGZjJr47uyvPTv+flb9Y4HY4rPfzJMj5atInfn9KHI7q1cTockR8xxmQRaWeueQA4GegR\n/boceMyB0GQ3e85ppKKRiBupaCTSRAV9Xh6/cCgt4v1c9mwuW4o0x0d9sdZy83/mMWdtPg+cO1BX\nqhNpYm4a3Zuf9GzLH95YwNcrtjodjqu8PXcDD368jJ8O6cAlIzs7HY5IbR4AbgJqTuw4FnjORkwH\nUqNX5BQH7bp6WpiisrDmNBJxKRWNRJqwtJQ4Jv1sKFuLy/jlc7mUVoSdDskV/vnZCt6Ys4EbTuyp\nia9FmiCvx/CP8wfTpU0iV7wwk1Vbip0OyRXmrM3nhlfnMqxzS+46Kxtj1JIrTYsxZgyw3lo7d7dv\ntQfW1ni8LrpMHFTdnhYdaaT2NBF3UtFIpIkb0CGVB88dVP1mX1dUq5t3523k3g+XMmZgJhOO7e50\nOCKyFylxfp68eBhej+HSZ74lf2e50yE1axvyS7js2VzSUoJMvCin+mRPpLEZYz42xiyo5Wss8Hvg\nT7X9WC3Lan1DZIy53BiTa4zJzcvLq8/QZTfVI40qwtGJsHVcEXEjFY1EmoHR2e24eXRv3pm3kfun\n6opqh+rb1dv47eQ5DO3UknvOHqBP2UWauI6tE5h40VDWby/h8udnarTlIdpRUsElT39LWUWYpy4e\nRivN4SYOstaOstZm7/4FrAS6AHONMauBDsAsY0wGkZFFWTV+TQdgw15+/yRrbY61Nqdt27YNuzIx\nruacRrp6moh7qWgk0kxcfnRXzhuexSOfLufFGd87HU6zsyKviF8+l0v71Hie+FmOLi8t0kwM69yK\ne8cN4JtV27h+skZbHqyyUJjLn8tl5ZYiHr9oKD3Sk50OSaRW1tr51to0a21na21nIoWiIdbaH4C3\ngJ9Fr6J2OLDDWqvLyzos4I2cShaXhSgPVZKsopGIK+mVLdJMGGO4fWw2mwrK+OMbC2idGGR0dobT\nYTULmwtK+fnT3+A1hmcuGaYrpYk0M2MHtWdzQRl3vreYtJQgfzqtr0YKHoDKSsv1k+cyY9U2Hho/\niJHddaU0abbeA04BlgM7gUucDUcAfF4PPo9ha3GkfVgjjUTcSSONRJoRn9fDo+cPYWBWKr9+eTYz\nVuqqQvuzY2cFP3vqG7YWlfPkz4fRqXWi0yGJyCG47KguXDqyC09PW83Ez1c6HU6TZ63l9ncX8c68\njdxycm/GDtKcwdK8REccbYnet9baCdbabtba/tbaXKfjk4igz8PWIhWNRNxMRSORZiY+4OWpi4eR\n1TKey57LZcH6HU6H1GTtLA9xyTPfsDKvmEkX5TAoK9XpkETkEBlj+MOpfTh9YCZ3v7+EF6arTXdf\nHvh4GU9PW82lI7tw+dFdnQ5HRFwq6PeyLTrSSO1pIu6kopFIM9QyMcBzvziMlDg/Fz45g6U/FDod\nUpNTFgrzq+dnMmdtPg+fN4gje6gtQ6S583gM958zkFF90vjjmwt4ffY6p0NqkiZ9voKH/7uMc3Oy\n+ONpfdTKJyINJujzsLW4DNBIIxG3UtFIpJlqnxrPS788jKDPwwVPTGdFXpHTITUZZaEwV74wiy+W\nbeHuswYwOrud0yGJSD3xez08cv4QRnRtzQ2vzuP9+ZoLt6bnp3/PXe8t4dQB7bjrrP4qGIlIg4oU\njdSeJuJmKhqJNGOdWify4mWHA3D+v1Q4gl0Fo0+WbObOM7M5Z1jW/n9IRJqVOL+Xf/0s0nJ69b9n\n8+48FY4Anv1qNX98YwGj+qTxwDmD8HpUMBKRhhX0ecnfWQFAkopGIq6kopFIM9c9LYkXLjuMUNhy\n7sTpMd2qVlrx44LRBYd1cjokEWkgiUEfz146nCEdIxcGeHPOeqdDctSTX67iz28t5IS+6fzzgqEE\nfHqLJyINL+jfdaxJilPRSMSN9I5CxAV6Z6Twyq9G4PXA+Elfx+Tk2EVlIS595ls+WbKZO85QwUgk\nFiQFfTxzyXCGdmrJb1+Zw5SZsTnH0eP/W8Ht7yzi5OwM/nnBEBWMRKTRBGscb5ICKhqJuJHeVYi4\nRPe0JCb/agQJAR/n/Ws601dudTqkRrOtuJwL/jWdGau2cf85A7nwcBWMRGJFYtDHM5cM44hubbjh\n1blM/N8Kp0NqNJWVljveWcTd7y/h9IGZPHzeYPxevbUTkcYT9Hmr7ycGvft4pog0V3pnIeIinVon\nMvmKEaSnxPGzJ7/hnXkbnA6pwa3bvpNzJn7Nkh8KmXjhUM4a0sHpkESkkSUEfDz58xxOHdCOv76/\nhDveWURlpXU6rAZVHqrkuslzeOLLVfz8iM48dO4gFYxEpNFVjTQK+jz4dAwScSWNIRRxmfap8Uy5\nYgS/fC6Xq1+azQ87SvnFkV1ceQWdWWu2c/lzuZSFKnn20uEc3rW10yGJiEOCPi//GD+YNokBnvhy\nFRsLSvn72QOJD7jvk+8dOyuY8NIsvly+hRtP6sVVx3Rz5TFeRJq+qjmNkjWfkYhrqRws4kKpCQGe\n/8VhnJydwR3vLuZ3/5lHWSjsdFj16u25Gxg/aToJAR+vXzVSBSMRweMx3DqmH78b3Zv35m/knIlf\n88OOUqfDqlcr8oo445/TmLFqK/ecPYAJx3ZXwUhEHBOIji5K1JXTRFxLRSMRl4rze3n0/CFcc1x3\nJueuY/yk6WwqaP4nT6FwJX99fzHX/Hs2Azu04I0JI+meluR0WCLSRBhjuPKYbvzrohxW5hUx5pEv\nmbVmu9Nh1YvPlm7mjEenUVBSwUu/PJxzcrKcDklEYlzVnEaJmgRbxLVUNBJxMY/HcP2JvXjsgiEs\n/aGQ0/7xJV8u2+J0WIdsc0Ep5z8xg4n/W8n5h3XkhcsOo1ViwOmwRKQJGtU3ndeuGknQ7+Gcx7/m\nX5+vxNrmOc9RKFzJ3z5Yws+f/pb2qfG8efVIhnVu5XRYIiLV7WlJGmkk4loqGonEgJP7t+P1q0bS\nIt7PRU/N4K/vL6Y8VOl0WAflkyWbOOXhL5m/bgcPnDuQu87s/6MrdoiI7K5XRjLvXH0Ux/dJ4873\nFnPZs7lsLy53OqyDsiG/hPGTpvPYZys4b3gWb0wYSYeWCU6HJSIC7JoIO0lzGom4lopGIjGiV0Yy\nb199JOOHdWTi/1Zy9uNfseSHAqfD2q/C0gp+N2Uelz6TS+vEAG9ePZIzB+sKaSJyYFok+Hn8wqH8\nZUw/vli2hRMe+JwPFmx0Oqz9stby8jdrOOmBz1m8sYCHxg/ir2cNIM6vYrmINB3V7WkaaSTiWioa\nicSQ+ICXv57Vn8cvHML67SWc9vCX3PPBEkormt4k2dZapi7axOgHv+DVmWu58phuvHXNSHqmJzsd\nmpUK+b4AAA1KSURBVIg0M8YYLj6iM29ePZKMFkGueGEWE16cRV5hmdOh1Wrttp1c9OQ33PzafPq1\nT+H9a49m7KD2ToclIrKH6pFGQRW0RdxKJWGRGDQ6ux2HdWnNHe8u5p+freDd+Ru55eTenNQvo0lc\nhWdlXhG3vbOIz5bm0SMtiVevOIKhnVo6HZaINHN92qXw+lUjmfT5Sh76eBmff5fHhOO6c8nIzk2i\n3bWoLMRjny3nX1+swu8x3HFGNucP74jH4/xxWaSxGGOuAa4GQsC71tqbostvAX4BhIFfW2s/dC5K\nqaI5jUTcT69ukRjVMjHAfecM5MzB7bn17YVc8cIshnRM5ZZT+jg2weqG/BL++dlyXvl2LXE+L384\ntQ8XH9EZv1eDIkWkfvi9HiYc253R2Rnc9e5i7n5/CS/NWMP1J/bk1P7t8DlwvCkLhZkycx0PfryM\nvMIyzhiUyU2je5OZGt/osYg4yRhzLDAWGGCtLTPGpEWX9wXGA/2ATOBjY0xPa23TGyodY9SeJuJ+\nenWLxLgje7Thg2uPYsrMddw/9TvGPf41wzu34vKju3Jc77RG+YR7RV4RT09bxSvfrgVgXE4WvxnV\ng7TkuAb/2yISm7q1TeLJnw/ji2V53PHOYq59eQ73T/2OK37SjbOGtG+UkUfFZSH+/c0a/vXFSjYV\nlDGkYyqTLhrK4I4aWSkx60rgbmttGYC1dnN0+Vjg5ejyVcaY5cBw4GtnwpQqu9rTdFop4lZ1enUb\nY8YBtwJ9gOHW2ty9PG808BDgBZ6w1t5dl78rIvXL5/UwfnhHxgzK5KUZa3h62mouey6Xrm0S+enQ\nDowdlFnvV+sprQjz8eJNvDRjDV+t2IrfaxiXk8WEY7vTXp+uu4byhDR1R/Voy/vXtuGjRZv452fL\nueW1+dzzwRLOGNyec3Ky6NMupV7/nrWW2WvzeTV3LW/P3UhRWYgRXVtz37hBjOzeukm0CIs4qCdw\nlDHmTqAUuMFa+y3QHphe43nrosv2YIy5HLgcoGPHjg0brVS3p2mkkYh71fXVvQA4C5i4tycYY7zA\no8AJRA7w3xpj3rLWLqrj3xaRepYQ8HHZUV25+IjOvDd/I89//T33friUez9cyvDOrfhJr7aM7N6G\n/u1b4D3IEUjWWtZtL2HGqm1MXfQDn3+3hZKKMO1T47nxpF6My+mgkUXupDwhTZ7HYxidncFJ/dL5\nasVWXpqxhhemf8/T01bTMz2JY3ulcWzvNIZ0bEnAd/Dta6UVYWas2sanSzbz6dLNfL91J/F+L6f0\nb8cFh3dkiEYWSQwxxnwMZNTyrd8TOTdpCRwODAMmG2O6ArW96bC1/X5r7SRgEkBOTk6tz5H6UzUq\nUyONRNyrTq9ua+1iYH+fig0HlltrV0af+zKRIaY6GRBpovxeD2MHtWfsoPas3baTN2av570FP1QX\nkJKCPnqmJ9EzPZlubZNonRSgZUKApDgf4UpLRbiSneVhNuSXsH57Cau37mTO2ny2FEWuVJSREsfZ\nQztwUr8MRnRrfdAFKGk+lCekOTHGMLJ7G0Z2b8O24nLenLOeqYs28dS0VUz8fCV+r6FnejLZmS3o\n0jaRtklB0lKC1Z+wWxuZzHpzQSmbC8tYkVfEwvUFLM8rIlxpCfo8HNGtNVf8pBunDWhHcpzf4TUW\naXzW2lF7+54x5krgNWutBb4xxlQCbYh8oJBV46kdgA0NGqgcELWnibhfY7y62wNrazxeBxzWCH9X\nROpBVqsErjm+B9cc34MtRWV8tWIr367axtJNhXy48Ae276zY58/H+T10aJnA0T3bMDgrlcEdW9K3\nXYquBiQ1KU9Ik9MqMcAlI7twycguFJWFmLZ8C7PX5LNwww4+WrT/Yx9A2+Qg2ZkpnNgvnSGdWjKi\na2vi/M5fpU2kCXsDOA74zBjTEwgAW4C3gJeMMfcTmQi7B/CNY1FKtdZJQQDSUoIORyIiDWW/RaN9\nDSG11r55AH/jgIeTqgdZpGlrkxRkzMBMxgzMBCItZztKKti+s4LtO8spKg3h8xoCXg9xfi8ZLeJo\nnRjQHB0upzwhbpcU9HFSvwxO6rdrNy8qC5FXWMbmglJKKnZdwCkx6CMtOUjb5CAJAX3yLnKQngKe\nMsYsAMqBi6OjjhYaYyYTGYEaAiboymlNw6CsVD6+7mi6pyU7HYqINJD9vpvZ1xDSA3TAw0nVgyzS\nvBhjSE0IkJoQoAuJTocjDlGekFiUFPSRFPTRpY2OfSL1xVpbDly4l+/dCdzZuBHJgVDBSMTdDn42\nx4P3LdDDGNPFGBMAxhMZYioiIgLKEyIiIiIiTVKdikbGmDONMeuAEcC7xpgPo8szjTHvAVhrQ8DV\nwIfAYmCytXZh3cIWEZHmQHlCRERERKT5quvV014HXq9l+QbglBqP3wPeq8vfEhGR5kd5QkRERESk\n+WqM9jQREREREREREWlmVDQSEREREREREZE9mMhVLJseY0we8P0h/ngbYEs9htMcxNo6a33dLdbW\nFw5+nTtZa9s2VDDNgfLEQYu1ddb6ulusrS8oTxw05YmDEmvrC7G3zlpf9zuYdT7gHNFki0Z1YYzJ\ntdbmOB1HY4q1ddb6ulusrS/E5jo7KRb/37G2zlpfd4u19YXYXGcnxdr/O9bWF2JvnbW+7tdQ66z2\nNBERERERERER2YOKRiIiIiIiIiIisge3Fo0mOR2AA2JtnbW+7hZr6wuxuc5OisX/d6yts9bX3WJt\nfSE219lJsfb/jrX1hdhbZ62v+zXIOrtyTiMREREREREREakbt440EhERERERERGROnBd0cgYM9oY\ns9QYs9wYc7PT8dQ3Y0yWMeZTY8xiY8xCY8y10eWtjDFTjTHLorctnY61PhljvMaY2caYd6KPuxhj\nZkTX9xVjTMDpGOuTMSbVGDPFGLMkuq1HuHkbG2N+G92fFxhj/m2MiXPTNjbGPGWM2WyMWVBjWa3b\n00Q8HD2GzTPGDHEucndSnnDfMQSUJ5Qnmvc2Vp5oWpQn3HcMgdjKE7GWI0B5oiHzhKuKRsYYL/Ao\ncDLQFzjPGNPX2ajqXQi43lrbBzgcmBBdx5uB/1prewD/jT52k2uBxTUe/w14ILq+24FfOBJVw3kI\n+MBa2xsYSGTdXbmNjTHtgV8DOdbabMALjMdd2/gZYPRuy/a2PU8GekS/Lgcea6QYY4LyhPuOITUo\nT7h0GytPKE80JuUJ9x1DaoilPBEzOQKUJxo6T7iqaAQMB5Zba1daa8uBl4GxDsdUr6y1G621s6L3\nC4kcANoTWc9no097FjjDmQjrnzGmA3Aq8ET0sQGOA6ZEn+K29U0BjgaeBLDWlltr83HxNgZ8QLwx\nxgckABtx0Ta21n4ObNtt8d6251jgORsxHUg1xrRrnEhjgvJERLN+Te1OeUJ5gma+vsoTTYryRESz\nfk3tLpbyRIzmCFCeaLA84baiUXtgbY3H66LLXMkY0xkYDMwA0q21GyGSCIA05yKrdw8CNwGV0cet\ngXxrbSj62G3buSuQBzwdHUL7hDEmEZduY2vteuDvwBoiB/cdwEzcvY1h79szpo5jDoip/6/yhGuP\nIcoTyhMxcxxzQEz9f5UnXHkMiakcAcoT0LB5wm1FI1PLMldeHs4YkwT8B/iNtbbA6XgaijHmNGCz\ntXZmzcW1PNVN29kHDAEes9YOBopx0fDR3UV7b8cCXYBMIJHIkMrduWkb74vb92+nxcz/V3liD27a\nzsoTyhO7i5V1bwwx8/9VntiDW7ZzTOUIUJ6oRb3u324rGq0Dsmo87gBscCiWBmOM8RM5wL9orX0t\nunhT1ZCz6O1mp+KrZyOBMcaY1USGBx9H5JOC1OjQQ3Dfdl4HrLPWzog+nkLkwO/WbTwKWGWtzbPW\nVgCvAUfg7m0Me9+eMXEcc1BM/H+VJ5QnXLaNlSeUJxpTTPx/lSdcnSdiLUeA8kSD5gm3FY2+BXpE\nZ0kPEJn86i2HY6pX0f7bJ4HF1tr7a3zrLeDi6P2LgTcbO7aGYK29xVrbwVrbmcj2/MRaewHwKXB2\n9GmuWV8Aa+0PwFpjTK/oouOBRbh0GxMZRnq4MSYhun9Xra9rt3HU3rbnW8DPolc9OBzYUTXsVOqF\n8kSEa15TyhOA8gS4a32rKE84Q3kiwjWvqVjLEzGYI0B5AhowTxhr3TVCyxhzCpHKsRd4ylp7p8Mh\n1StjzJHAF8B8dvXk/h+RPuTJQEciL5px1trdJ8pq1owxxwA3WGtPM8Z0JfJJQStgNnChtbbMyfjq\nkzFmEJGJ+gLASuASIkVeV25jY8xfgHOJXM1jNnAZkb5bV2xjY8y/gWOANsAm4M/AG9SyPaOJ7hEi\nV0fYCVxirc11Im63Up5w3zGkivKE8kRz3cbKE02L8oT7jiFVYiVPxFqOAOUJGjBPuK5oJCIiIiIi\nIiIidee29jQREREREREREakHKhqJiIiIiIiIiMgeVDQSEREREREREZE9qGgkIiIiIiIiIiJ7UNFI\nRERERERERET2oKKRiIiIiIiIiIjsQUUjERERERERERHZg4pGIiIiIiIiIiKyh/8HLzOQhRZyAHgA\nAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "f, ax = plt.subplots(nrows=3,ncols=3,figsize=(20,10))\n", + "\n", + "a=np.random.randn(10)\n", + "b=np.random.randn(10)\n", + "\n", + "ax[0,0].scatter(a,b,color='green',marker='.')\n", + "ax[0,1].scatter(a,b,color='purple',marker='x')\n", + "ax[0,2].scatter(a,b,color='blue',marker='^')\n", + "#---------------------------\n", + "ax[1,0].plot(a)\n", + "ax[1,1].barh(a,b)\n", + "ax[1,2].hist(a)\n", + "#---------------------------\n", + "x=np.linspace(0,2*np.pi,100)\n", + "ax[2,0].plot(np.sin(x))\n", + "ax[2,1].plot(np.cos(x))\n", + "ax[2,2].plot(np.tan(x))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## Extra Credit" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the cell below to read in the data. See: https://www.quantshare.com/sa-43-10-ways-to-download-historical-stock-quotes-data-for-free" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "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", + "
DateOpenHighLowCloseVolume
08-Feb-18160.29161.00155.03155.1554390516
17-Feb-18163.08163.40159.07159.5451608580
26-Feb-18154.83163.72154.00163.0368243838
35-Feb-18159.10163.88156.00156.4972738522
42-Feb-18166.00166.80160.10160.5086593825
\n", + "
" + ], + "text/plain": [ + " Date Open High Low Close Volume\n", + "0 8-Feb-18 160.29 161.00 155.03 155.15 54390516\n", + "1 7-Feb-18 163.08 163.40 159.07 159.54 51608580\n", + "2 6-Feb-18 154.83 163.72 154.00 163.03 68243838\n", + "3 5-Feb-18 159.10 163.88 156.00 156.49 72738522\n", + "4 2-Feb-18 166.00 166.80 160.10 160.50 86593825" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_google = pd.read_csv('https://finance.google.com/finance/historical?output=csv&q=goog')\n", + "df_apple = pd.read_csv('https://finance.google.com/finance/historical?output=csv&q=aapl')\n", + "\n", + "df_disney = pd.read_csv('https://finance.google.com/finance/historical?output=csv&q=dis')\n", + "df_nike= pd.read_csv('https://finance.google.com/finance/historical?output=csv&q=nke')\n", + "\n", + "df_apple.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Show a 3 x 3 correlation matrix for Nike, Apple, and Disney stock prices for the month of July, 2017. \n", + "\n", + "Hint: Convert `Date` to a pandas datetime object. \n", + "Change the indices of all the dataframes to `Date`. Use `Date` indices to filter rows.\n", + "Create a new dataframe that stores values of the `Close` column from each dataframe.\n", + "Use the `Close` column of each company's stock data to find the correlation using df.corr()." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 226, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "################# ignore\n", + "'''# google\n", + "df_google.set_index(df_google.Date,inplace=True)\n", + "df_google.loc['31-Jul-17':'3-Jul-17', ['Close']]\n", + "#close_google.columns = [\"Google closing price\"]\n", + "#print(\"Google stock close: \\n\",close_google)\n", + "#year = df_google.loc['31-Jul-17':'3-Jul-17'].index\n", + "#g=pd.DataFrame({'Google':[close_google]})\n", + "\n", + "\n", + "# apple\n", + "df_apple.set_index(df_apple.Date,inplace=True)\n", + "df_apple.loc['31-Jul-17':'3-Jul-17', ['Close']]\n", + "#close_apple.columns = [\"Apple closing price\"]\n", + "#print(\"\\n Apple stock close: \\n\", close_apple)\n", + "#a=pd.DataFrame({'Apple':[close_apple]})\n", + "\n", + "\n", + "# disney\n", + "df_disney.set_index(df_disney.Date,inplace=True)\n", + "df_disney.loc['31-Jul-17':'3-Jul-17', ['Close']]\n", + "#close_disney.columns = [\"Disney closing price\"]\n", + "#print(\"\\n Disney stock close: \\n\", close_disney)\n", + "#ds=pd.DataFrame({'Disney':[close_disney]})\n", + "\n", + "\n", + "# nike\n", + "df_nike.set_index(df_nike.Date,inplace=True)\n", + "df_nike.loc['31-Jul-17':'3-Jul-17', ['Close']]\n", + "#close_nike.columns = [\"Nike closing price\"]\n", + "#print(\"\\n Nike stock close: \\n\", close_nike)\n", + "#n=pd.DataFrame({'Nike':[close_google]})\n", + "\n", + "stock_table=pd.concat[df_apple,df_nike,df_disney]\n", + "print(stock_table)\n", + "\n", + "\n", + "# correlation matrix of three 2017 dateframes'''\n" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "df_nike=df_nike.set_index(pd.to_datetime(df_nike.Date))\n", + "df_nike.drop('Date',axis=1,inplace=True)\n", + "del df_nike.index.name\n", + "\n", + "df_apple=df_apple.set_index(pd.to_datetime(df_apple.Date))\n", + "df_apple.drop('Date',axis=1,inplace=True)\n", + "del df_apple.index.name\n", + "\n", + "df_disney=df_disney.set_index(pd.to_datetime(df_disney.Date))\n", + "df_disney.drop('Date',axis=1,inplace=True)\n", + "del df_disney.index.name" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "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", + "
NikeAppleDisney
2018-02-0862.49155.15101.35
2018-02-0765.63159.54104.76
2018-02-0665.22163.03106.17
2018-02-0564.39156.49104.70
2018-02-0267.22160.50108.70
\n", + "
" + ], + "text/plain": [ + " Nike Apple Disney\n", + "2018-02-08 62.49 155.15 101.35\n", + "2018-02-07 65.63 159.54 104.76\n", + "2018-02-06 65.22 163.03 106.17\n", + "2018-02-05 64.39 156.49 104.70\n", + "2018-02-02 67.22 160.50 108.70" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "closing_values=pd.concat([df_nike.Close,df_apple.Close,df_disney.Close],axis=1)\n", + "closing_values.columns=['Nike','Apple','Disney']\n", + "closing_values.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "closing_values[\"2017-17\"].corr()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Show the same correlation matrix but over different time periods.\n", + "1. the last 20 days \n", + "2. the last 80 days" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Change the code so that it accepts a list of any stock symbols (i.e. ['NKE', 'APPL', 'DIS', ... ]) and creates a correlation matrix for the past 100 days." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Energy.csv b/Energy.csv new file mode 100644 index 0000000..a295089 --- /dev/null +++ b/Energy.csv @@ -0,0 +1 @@ +X1,X2,X3,X4,X5,X6,X7,X8,Y1 0.98,514.5,294,110.25,7,2,0,0,15.55 0.98,514.5,294,110.25,7,3,0,0,15.55 0.98,514.5,294,110.25,7,4,0,0,15.55 0.98,514.5,294,110.25,7,5,0,0,15.55 0.9,563.5,318.5,122.5,7,2,0,0,20.84 0.9,563.5,318.5,122.5,7,3,0,0,21.46 0.9,563.5,318.5,122.5,7,4,0,0,20.71 0.9,563.5,318.5,122.5,7,5,0,0,19.68 0.86,588,294,147,7,2,0,0,19.5 0.86,588,294,147,7,3,0,0,19.95 0.86,588,294,147,7,4,0,0,19.34 0.86,588,294,147,7,5,0,0,18.31 0.82,612.5,318.5,147,7,2,0,0,17.05 0.82,612.5,318.5,147,7,3,0,0,17.41 0.82,612.5,318.5,147,7,4,0,0,16.95 0.82,612.5,318.5,147,7,5,0,0,15.98 0.79,637,343,147,7,2,0,0,28.52 0.79,637,343,147,7,3,0,0,29.9 0.79,637,343,147,7,4,0,0,29.63 0.79,637,343,147,7,5,0,0,28.75 0.76,661.5,416.5,122.5,7,2,0,0,24.77 0.76,661.5,416.5,122.5,7,3,0,0,23.93 0.76,661.5,416.5,122.5,7,4,0,0,24.77 0.76,661.5,416.5,122.5,7,5,0,0,23.93 0.74,686,245,220.5,3.5,2,0,0,6.07 0.74,686,245,220.5,3.5,3,0,0,6.05 0.74,686,245,220.5,3.5,4,0,0,6.01 0.74,686,245,220.5,3.5,5,0,0,6.04 0.71,710.5,269.5,220.5,3.5,2,0,0,6.37 0.71,710.5,269.5,220.5,3.5,3,0,0,6.4 0.71,710.5,269.5,220.5,3.5,4,0,0,6.37 0.71,710.5,269.5,220.5,3.5,5,0,0,6.4 0.69,735,294,220.5,3.5,2,0,0,6.85 0.69,735,294,220.5,3.5,3,0,0,6.79 0.69,735,294,220.5,3.5,4,0,0,6.77 0.69,735,294,220.5,3.5,5,0,0,6.81 0.66,759.5,318.5,220.5,3.5,2,0,0,7.18 0.66,759.5,318.5,220.5,3.5,3,0,0,7.1 0.66,759.5,318.5,220.5,3.5,4,0,0,7.1 0.66,759.5,318.5,220.5,3.5,5,0,0,7.1 0.64,784,343,220.5,3.5,2,0,0,10.85 0.64,784,343,220.5,3.5,3,0,0,10.54 0.64,784,343,220.5,3.5,4,0,0,10.77 0.64,784,343,220.5,3.5,5,0,0,10.56 0.62,808.5,367.5,220.5,3.5,2,0,0,8.6 0.62,808.5,367.5,220.5,3.5,3,0,0,8.49 0.62,808.5,367.5,220.5,3.5,4,0,0,8.45 0.62,808.5,367.5,220.5,3.5,5,0,0,8.5 0.98,514.5,294,110.25,7,2,0.1,1,24.58 0.98,514.5,294,110.25,7,3,0.1,1,24.63 0.98,514.5,294,110.25,7,4,0.1,1,24.63 0.98,514.5,294,110.25,7,5,0.1,1,24.59 0.9,563.5,318.5,122.5,7,2,0.1,1,29.03 0.9,563.5,318.5,122.5,7,3,0.1,1,29.87 0.9,563.5,318.5,122.5,7,4,0.1,1,29.14 0.9,563.5,318.5,122.5,7,5,0.1,1,28.09 0.86,588,294,147,7,2,0.1,1,26.28 0.86,588,294,147,7,3,0.1,1,26.91 0.86,588,294,147,7,4,0.1,1,26.37 0.86,588,294,147,7,5,0.1,1,25.27 0.82,612.5,318.5,147,7,2,0.1,1,23.53 0.82,612.5,318.5,147,7,3,0.1,1,24.03 0.82,612.5,318.5,147,7,4,0.1,1,23.54 0.82,612.5,318.5,147,7,5,0.1,1,22.58 0.79,637,343,147,7,2,0.1,1,35.56 0.79,637,343,147,7,3,0.1,1,37.12 0.79,637,343,147,7,4,0.1,1,36.9 0.79,637,343,147,7,5,0.1,1,35.94 0.76,661.5,416.5,122.5,7,2,0.1,1,32.96 0.76,661.5,416.5,122.5,7,3,0.1,1,32.12 0.76,661.5,416.5,122.5,7,4,0.1,1,32.94 0.76,661.5,416.5,122.5,7,5,0.1,1,32.21 0.74,686,245,220.5,3.5,2,0.1,1,10.36 0.74,686,245,220.5,3.5,3,0.1,1,10.43 0.74,686,245,220.5,3.5,4,0.1,1,10.36 0.74,686,245,220.5,3.5,5,0.1,1,10.39 0.71,710.5,269.5,220.5,3.5,2,0.1,1,10.71 0.71,710.5,269.5,220.5,3.5,3,0.1,1,10.8 0.71,710.5,269.5,220.5,3.5,4,0.1,1,10.7 0.71,710.5,269.5,220.5,3.5,5,0.1,1,10.75 0.69,735,294,220.5,3.5,2,0.1,1,11.11 0.69,735,294,220.5,3.5,3,0.1,1,11.13 0.69,735,294,220.5,3.5,4,0.1,1,11.09 0.69,735,294,220.5,3.5,5,0.1,1,11.16 0.66,759.5,318.5,220.5,3.5,2,0.1,1,11.68 0.66,759.5,318.5,220.5,3.5,3,0.1,1,11.69 0.66,759.5,318.5,220.5,3.5,4,0.1,1,11.7 0.66,759.5,318.5,220.5,3.5,5,0.1,1,11.69 0.64,784,343,220.5,3.5,2,0.1,1,15.41 0.64,784,343,220.5,3.5,3,0.1,1,15.2 0.64,784,343,220.5,3.5,4,0.1,1,15.42 0.64,784,343,220.5,3.5,5,0.1,1,15.21 0.62,808.5,367.5,220.5,3.5,2,0.1,1,12.96 0.62,808.5,367.5,220.5,3.5,3,0.1,1,12.97 0.62,808.5,367.5,220.5,3.5,4,0.1,1,12.93 0.62,808.5,367.5,220.5,3.5,5,0.1,1,13.02 0.98,514.5,294,110.25,7,2,0.1,2,24.29 0.98,514.5,294,110.25,7,3,0.1,2,24.31 0.98,514.5,294,110.25,7,4,0.1,2,24.13 0.98,514.5,294,110.25,7,5,0.1,2,24.25 0.9,563.5,318.5,122.5,7,2,0.1,2,28.88 0.9,563.5,318.5,122.5,7,3,0.1,2,29.68 0.9,563.5,318.5,122.5,7,4,0.1,2,28.83 0.9,563.5,318.5,122.5,7,5,0.1,2,27.9 0.86,588,294,147,7,2,0.1,2,26.48 0.86,588,294,147,7,3,0.1,2,27.02 0.86,588,294,147,7,4,0.1,2,26.33 0.86,588,294,147,7,5,0.1,2,25.36 0.82,612.5,318.5,147,7,2,0.1,2,23.75 0.82,612.5,318.5,147,7,3,0.1,2,24.23 0.82,612.5,318.5,147,7,4,0.1,2,23.67 0.82,612.5,318.5,147,7,5,0.1,2,22.79 0.79,637,343,147,7,2,0.1,2,35.65 0.79,637,343,147,7,3,0.1,2,37.26 0.79,637,343,147,7,4,0.1,2,36.97 0.79,637,343,147,7,5,0.1,2,36.03 0.76,661.5,416.5,122.5,7,2,0.1,2,33.16 0.76,661.5,416.5,122.5,7,3,0.1,2,32.4 0.76,661.5,416.5,122.5,7,4,0.1,2,33.12 0.76,661.5,416.5,122.5,7,5,0.1,2,32.41 0.74,686,245,220.5,3.5,2,0.1,2,10.42 0.74,686,245,220.5,3.5,3,0.1,2,10.46 0.74,686,245,220.5,3.5,4,0.1,2,10.32 0.74,686,245,220.5,3.5,5,0.1,2,10.45 0.71,710.5,269.5,220.5,3.5,2,0.1,2,10.64 0.71,710.5,269.5,220.5,3.5,3,0.1,2,10.72 0.71,710.5,269.5,220.5,3.5,4,0.1,2,10.55 0.71,710.5,269.5,220.5,3.5,5,0.1,2,10.68 0.69,735,294,220.5,3.5,2,0.1,2,11.45 0.69,735,294,220.5,3.5,3,0.1,2,11.46 0.69,735,294,220.5,3.5,4,0.1,2,11.32 0.69,735,294,220.5,3.5,5,0.1,2,11.49 0.66,759.5,318.5,220.5,3.5,2,0.1,2,11.45 0.66,759.5,318.5,220.5,3.5,3,0.1,2,11.42 0.66,759.5,318.5,220.5,3.5,4,0.1,2,11.33 0.66,759.5,318.5,220.5,3.5,5,0.1,2,11.43 0.64,784,343,220.5,3.5,2,0.1,2,15.41 0.64,784,343,220.5,3.5,3,0.1,2,15.18 0.64,784,343,220.5,3.5,4,0.1,2,15.34 0.64,784,343,220.5,3.5,5,0.1,2,15.19 0.62,808.5,367.5,220.5,3.5,2,0.1,2,12.88 0.62,808.5,367.5,220.5,3.5,3,0.1,2,13 0.62,808.5,367.5,220.5,3.5,4,0.1,2,12.97 0.62,808.5,367.5,220.5,3.5,5,0.1,2,13.04 0.98,514.5,294,110.25,7,2,0.1,3,24.28 0.98,514.5,294,110.25,7,3,0.1,3,24.4 0.98,514.5,294,110.25,7,4,0.1,3,24.11 0.98,514.5,294,110.25,7,5,0.1,3,24.35 0.9,563.5,318.5,122.5,7,2,0.1,3,28.07 0.9,563.5,318.5,122.5,7,3,0.1,3,29.01 0.9,563.5,318.5,122.5,7,4,0.1,3,29.62 0.9,563.5,318.5,122.5,7,5,0.1,3,29.05 0.86,588,294,147,7,2,0.1,3,25.41 0.86,588,294,147,7,3,0.1,3,26.47 0.86,588,294,147,7,4,0.1,3,26.89 0.86,588,294,147,7,5,0.1,3,26.46 0.82,612.5,318.5,147,7,2,0.1,3,22.93 0.82,612.5,318.5,147,7,3,0.1,3,23.84 0.82,612.5,318.5,147,7,4,0.1,3,24.17 0.82,612.5,318.5,147,7,5,0.1,3,23.87 0.79,637,343,147,7,2,0.1,3,35.78 0.79,637,343,147,7,3,0.1,3,35.48 0.79,637,343,147,7,4,0.1,3,36.97 0.79,637,343,147,7,5,0.1,3,36.7 0.76,661.5,416.5,122.5,7,2,0.1,3,32.52 0.76,661.5,416.5,122.5,7,3,0.1,3,33.28 0.76,661.5,416.5,122.5,7,4,0.1,3,32.33 0.76,661.5,416.5,122.5,7,5,0.1,3,33.24 0.74,686,245,220.5,3.5,2,0.1,3,10.39 0.74,686,245,220.5,3.5,3,0.1,3,10.34 0.74,686,245,220.5,3.5,4,0.1,3,10.35 0.74,686,245,220.5,3.5,5,0.1,3,10.38 0.71,710.5,269.5,220.5,3.5,2,0.1,3,10.77 0.71,710.5,269.5,220.5,3.5,3,0.1,3,10.68 0.71,710.5,269.5,220.5,3.5,4,0.1,3,10.68 0.71,710.5,269.5,220.5,3.5,5,0.1,3,10.7 0.69,735,294,220.5,3.5,2,0.1,3,11.22 0.69,735,294,220.5,3.5,3,0.1,3,11.16 0.69,735,294,220.5,3.5,4,0.1,3,11.1 0.69,735,294,220.5,3.5,5,0.1,3,11.14 0.66,759.5,318.5,220.5,3.5,2,0.1,3,11.59 0.66,759.5,318.5,220.5,3.5,3,0.1,3,11.6 0.66,759.5,318.5,220.5,3.5,4,0.1,3,11.53 0.66,759.5,318.5,220.5,3.5,5,0.1,3,11.61 0.64,784,343,220.5,3.5,2,0.1,3,15.16 0.64,784,343,220.5,3.5,3,0.1,3,15.36 0.64,784,343,220.5,3.5,4,0.1,3,15.12 0.64,784,343,220.5,3.5,5,0.1,3,15.36 0.62,808.5,367.5,220.5,3.5,2,0.1,3,12.68 0.62,808.5,367.5,220.5,3.5,3,0.1,3,12.63 0.62,808.5,367.5,220.5,3.5,4,0.1,3,12.71 0.62,808.5,367.5,220.5,3.5,5,0.1,3,12.73 0.98,514.5,294,110.25,7,2,0.1,4,24.38 0.98,514.5,294,110.25,7,3,0.1,4,24.23 0.98,514.5,294,110.25,7,4,0.1,4,24.04 0.98,514.5,294,110.25,7,5,0.1,4,24.32 0.9,563.5,318.5,122.5,7,2,0.1,4,29.06 0.9,563.5,318.5,122.5,7,3,0.1,4,28.05 0.9,563.5,318.5,122.5,7,4,0.1,4,28.86 0.9,563.5,318.5,122.5,7,5,0.1,4,29.79 0.86,588,294,147,7,2,0.1,4,26.44 0.86,588,294,147,7,3,0.1,4,25.37 0.86,588,294,147,7,4,0.1,4,26.33 0.86,588,294,147,7,5,0.1,4,27.03 0.82,612.5,318.5,147,7,2,0.1,4,23.8 0.82,612.5,318.5,147,7,3,0.1,4,22.8 0.82,612.5,318.5,147,7,4,0.1,4,23.59 0.82,612.5,318.5,147,7,5,0.1,4,24.24 0.79,637,343,147,7,2,0.1,4,36.86 0.79,637,343,147,7,3,0.1,4,35.89 0.79,637,343,147,7,4,0.1,4,35.45 0.79,637,343,147,7,5,0.1,4,37.1 0.76,661.5,416.5,122.5,7,2,0.1,4,33.08 0.76,661.5,416.5,122.5,7,3,0.1,4,32.38 0.76,661.5,416.5,122.5,7,4,0.1,4,33.09 0.76,661.5,416.5,122.5,7,5,0.1,4,32.31 0.74,686,245,220.5,3.5,2,0.1,4,10.08 0.74,686,245,220.5,3.5,3,0.1,4,10.15 0.74,686,245,220.5,3.5,4,0.1,4,10.07 0.74,686,245,220.5,3.5,5,0.1,4,10.14 0.71,710.5,269.5,220.5,3.5,2,0.1,4,10.66 0.71,710.5,269.5,220.5,3.5,3,0.1,4,10.68 0.71,710.5,269.5,220.5,3.5,4,0.1,4,10.53 0.71,710.5,269.5,220.5,3.5,5,0.1,4,10.72 0.69,735,294,220.5,3.5,2,0.1,4,11.18 0.69,735,294,220.5,3.5,3,0.1,4,11.22 0.69,735,294,220.5,3.5,4,0.1,4,11.07 0.69,735,294,220.5,3.5,5,0.1,4,11.2 0.66,759.5,318.5,220.5,3.5,2,0.1,4,11.44 0.66,759.5,318.5,220.5,3.5,3,0.1,4,11.42 0.66,759.5,318.5,220.5,3.5,4,0.1,4,11.33 0.66,759.5,318.5,220.5,3.5,5,0.1,4,11.43 0.64,784,343,220.5,3.5,2,0.1,4,15.4 0.64,784,343,220.5,3.5,3,0.1,4,15.19 0.64,784,343,220.5,3.5,4,0.1,4,15.32 0.64,784,343,220.5,3.5,5,0.1,4,15.16 0.62,808.5,367.5,220.5,3.5,2,0.1,4,12.85 0.62,808.5,367.5,220.5,3.5,3,0.1,4,13.04 0.62,808.5,367.5,220.5,3.5,4,0.1,4,13 0.62,808.5,367.5,220.5,3.5,5,0.1,4,13 0.98,514.5,294,110.25,7,2,0.1,5,24.35 0.98,514.5,294,110.25,7,3,0.1,5,24.33 0.98,514.5,294,110.25,7,4,0.1,5,24.03 0.98,514.5,294,110.25,7,5,0.1,5,24.26 0.9,563.5,318.5,122.5,7,2,0.1,5,29.83 0.9,563.5,318.5,122.5,7,3,0.1,5,29.08 0.9,563.5,318.5,122.5,7,4,0.1,5,28.03 0.9,563.5,318.5,122.5,7,5,0.1,5,29.02 0.86,588,294,147,7,2,0.1,5,27.03 0.86,588,294,147,7,3,0.1,5,26.45 0.86,588,294,147,7,4,0.1,5,25.36 0.86,588,294,147,7,5,0.1,5,26.45 0.82,612.5,318.5,147,7,2,0.1,5,24.37 0.82,612.5,318.5,147,7,3,0.1,5,23.89 0.82,612.5,318.5,147,7,4,0.1,5,22.89 0.82,612.5,318.5,147,7,5,0.1,5,23.86 0.79,637,343,147,7,2,0.1,5,37.03 0.79,637,343,147,7,3,0.1,5,36.71 0.79,637,343,147,7,4,0.1,5,36.77 0.79,637,343,147,7,5,0.1,5,35.48 0.76,661.5,416.5,122.5,7,2,0.1,5,32.31 0.76,661.5,416.5,122.5,7,3,0.1,5,33.21 0.76,661.5,416.5,122.5,7,4,0.1,5,32.46 0.76,661.5,416.5,122.5,7,5,0.1,5,33.27 0.74,686,245,220.5,3.5,2,0.1,5,10.47 0.74,686,245,220.5,3.5,3,0.1,5,10.37 0.74,686,245,220.5,3.5,4,0.1,5,10.34 0.74,686,245,220.5,3.5,5,0.1,5,10.39 0.71,710.5,269.5,220.5,3.5,2,0.1,5,10.78 0.71,710.5,269.5,220.5,3.5,3,0.1,5,10.7 0.71,710.5,269.5,220.5,3.5,4,0.1,5,10.67 0.71,710.5,269.5,220.5,3.5,5,0.1,5,13.69 0.69,735,294,220.5,3.5,2,0.1,5,11.21 0.69,735,294,220.5,3.5,3,0.1,5,11.14 0.69,735,294,220.5,3.5,4,0.1,5,11.11 0.69,735,294,220.5,3.5,5,0.1,5,11.16 0.66,759.5,318.5,220.5,3.5,2,0.1,5,11.38 0.66,759.5,318.5,220.5,3.5,3,0.1,5,11.34 0.66,759.5,318.5,220.5,3.5,4,0.1,5,11.22 0.66,759.5,318.5,220.5,3.5,5,0.1,5,11.34 0.64,784,343,220.5,3.5,2,0.1,5,15.16 0.64,784,343,220.5,3.5,3,0.1,5,15.37 0.64,784,343,220.5,3.5,4,0.1,5,15.12 0.64,784,343,220.5,3.5,5,0.1,5,15.36 0.62,808.5,367.5,220.5,3.5,2,0.1,5,12.59 0.62,808.5,367.5,220.5,3.5,3,0.1,5,12.74 0.62,808.5,367.5,220.5,3.5,4,0.1,5,12.8 0.62,808.5,367.5,220.5,3.5,5,0.1,5,12.62 0.98,514.5,294,110.25,7,2,0.25,1,28.15 0.98,514.5,294,110.25,7,3,0.25,1,28.15 0.98,514.5,294,110.25,7,4,0.25,1,28.37 0.98,514.5,294,110.25,7,5,0.25,1,28.41 0.9,563.5,318.5,122.5,7,2,0.25,1,32.68 0.9,563.5,318.5,122.5,7,3,0.25,1,33.48 0.9,563.5,318.5,122.5,7,4,0.25,1,32.84 0.9,563.5,318.5,122.5,7,5,0.25,1,32 0.86,588,294,147,7,2,0.25,1,29.54 0.86,588,294,147,7,3,0.25,1,30.05 0.86,588,294,147,7,4,0.25,1,29.6 0.86,588,294,147,7,5,0.25,1,28.66 0.82,612.5,318.5,147,7,2,0.25,1,26.84 0.82,612.5,318.5,147,7,3,0.25,1,27.27 0.82,612.5,318.5,147,7,4,0.25,1,26.97 0.82,612.5,318.5,147,7,5,0.25,1,26.19 0.79,637,343,147,7,2,0.25,1,38.67 0.79,637,343,147,7,3,0.25,1,40.03 0.79,637,343,147,7,4,0.25,1,39.86 0.79,637,343,147,7,5,0.25,1,39.04 0.76,661.5,416.5,122.5,7,2,0.25,1,36.96 0.76,661.5,416.5,122.5,7,3,0.25,1,36.13 0.76,661.5,416.5,122.5,7,4,0.25,1,36.91 0.76,661.5,416.5,122.5,7,5,0.25,1,36.43 0.74,686,245,220.5,3.5,2,0.25,1,12.43 0.74,686,245,220.5,3.5,3,0.25,1,12.5 0.74,686,245,220.5,3.5,4,0.25,1,12.41 0.74,686,245,220.5,3.5,5,0.25,1,12.45 0.71,710.5,269.5,220.5,3.5,2,0.25,1,12.57 0.71,710.5,269.5,220.5,3.5,3,0.25,1,12.65 0.71,710.5,269.5,220.5,3.5,4,0.25,1,12.57 0.71,710.5,269.5,220.5,3.5,5,0.25,1,12.63 0.69,735,294,220.5,3.5,2,0.25,1,12.78 0.69,735,294,220.5,3.5,3,0.25,1,12.93 0.69,735,294,220.5,3.5,4,0.25,1,12.73 0.69,735,294,220.5,3.5,5,0.25,1,12.72 0.66,759.5,318.5,220.5,3.5,2,0.25,1,13.17 0.66,759.5,318.5,220.5,3.5,3,0.25,1,13.18 0.66,759.5,318.5,220.5,3.5,4,0.25,1,13.17 0.66,759.5,318.5,220.5,3.5,5,0.25,1,13.18 0.64,784,343,220.5,3.5,2,0.25,1,17.5 0.64,784,343,220.5,3.5,3,0.25,1,17.35 0.64,784,343,220.5,3.5,4,0.25,1,17.52 0.64,784,343,220.5,3.5,5,0.25,1,17.37 0.62,808.5,367.5,220.5,3.5,2,0.25,1,15.09 0.62,808.5,367.5,220.5,3.5,3,0.25,1,15.12 0.62,808.5,367.5,220.5,3.5,4,0.25,1,15.08 0.62,808.5,367.5,220.5,3.5,5,0.25,1,15.16 0.98,514.5,294,110.25,7,2,0.25,2,28.67 0.98,514.5,294,110.25,7,3,0.25,2,28.57 0.98,514.5,294,110.25,7,4,0.25,2,28.18 0.98,514.5,294,110.25,7,5,0.25,2,28.6 0.9,563.5,318.5,122.5,7,2,0.25,2,32.46 0.9,563.5,318.5,122.5,7,3,0.25,2,33.27 0.9,563.5,318.5,122.5,7,4,0.25,2,32.33 0.9,563.5,318.5,122.5,7,5,0.25,2,31.66 0.86,588,294,147,7,2,0.25,2,29.34 0.86,588,294,147,7,3,0.25,2,29.87 0.86,588,294,147,7,4,0.25,2,29.27 0.86,588,294,147,7,5,0.25,2,28.4 0.82,612.5,318.5,147,7,2,0.25,2,25.74 0.82,612.5,318.5,147,7,3,0.25,2,25.98 0.82,612.5,318.5,147,7,4,0.25,2,25.38 0.82,612.5,318.5,147,7,5,0.25,2,24.94 0.79,637,343,147,7,2,0.25,2,38.57 0.79,637,343,147,7,3,0.25,2,40.19 0.79,637,343,147,7,4,0.25,2,39.97 0.79,637,343,147,7,5,0.25,2,38.98 0.76,661.5,416.5,122.5,7,2,0.25,2,36.95 0.76,661.5,416.5,122.5,7,3,0.25,2,36.28 0.76,661.5,416.5,122.5,7,4,0.25,2,36.86 0.76,661.5,416.5,122.5,7,5,0.25,2,36.45 0.74,686,245,220.5,3.5,2,0.25,2,12.35 0.74,686,245,220.5,3.5,3,0.25,2,12.45 0.74,686,245,220.5,3.5,4,0.25,2,12.16 0.74,686,245,220.5,3.5,5,0.25,2,12.3 0.71,710.5,269.5,220.5,3.5,2,0.25,2,12.33 0.71,710.5,269.5,220.5,3.5,3,0.25,2,12.29 0.71,710.5,269.5,220.5,3.5,4,0.25,2,12.2 0.71,710.5,269.5,220.5,3.5,5,0.25,2,12.49 0.69,735,294,220.5,3.5,2,0.25,2,12.85 0.69,735,294,220.5,3.5,3,0.25,2,12.87 0.69,735,294,220.5,3.5,4,0.25,2,12.73 0.69,735,294,220.5,3.5,5,0.25,2,12.95 0.66,759.5,318.5,220.5,3.5,2,0.25,2,13.05 0.66,759.5,318.5,220.5,3.5,3,0.25,2,12.93 0.66,759.5,318.5,220.5,3.5,4,0.25,2,12.77 0.66,759.5,318.5,220.5,3.5,5,0.25,2,13 0.64,784,343,220.5,3.5,2,0.25,2,17.14 0.64,784,343,220.5,3.5,3,0.25,2,16.84 0.64,784,343,220.5,3.5,4,0.25,2,17.02 0.64,784,343,220.5,3.5,5,0.25,2,17.11 0.62,808.5,367.5,220.5,3.5,2,0.25,2,14.34 0.62,808.5,367.5,220.5,3.5,3,0.25,2,14.66 0.62,808.5,367.5,220.5,3.5,4,0.25,2,14.6 0.62,808.5,367.5,220.5,3.5,5,0.25,2,14.6 0.98,514.5,294,110.25,7,2,0.25,3,28.67 0.98,514.5,294,110.25,7,3,0.25,3,28.56 0.98,514.5,294,110.25,7,4,0.25,3,28.17 0.98,514.5,294,110.25,7,5,0.25,3,28.63 0.9,563.5,318.5,122.5,7,2,0.25,3,31.63 0.9,563.5,318.5,122.5,7,3,0.25,3,32.4 0.9,563.5,318.5,122.5,7,4,0.25,3,32.68 0.9,563.5,318.5,122.5,7,5,0.25,3,32.29 0.86,588,294,147,7,2,0.25,3,28.4 0.86,588,294,147,7,3,0.25,3,29.4 0.86,588,294,147,7,4,0.25,3,29.43 0.86,588,294,147,7,5,0.25,3,29.07 0.82,612.5,318.5,147,7,2,0.25,3,24.7 0.82,612.5,318.5,147,7,3,0.25,3,25.48 0.82,612.5,318.5,147,7,4,0.25,3,25.37 0.82,612.5,318.5,147,7,5,0.25,3,25.17 0.79,637,343,147,7,2,0.25,3,39.04 0.79,637,343,147,7,3,0.25,3,38.35 0.79,637,343,147,7,4,0.25,3,39.81 0.79,637,343,147,7,5,0.25,3,39.83 0.76,661.5,416.5,122.5,7,2,0.25,3,35.99 0.76,661.5,416.5,122.5,7,3,0.25,3,36.59 0.76,661.5,416.5,122.5,7,4,0.25,3,35.64 0.76,661.5,416.5,122.5,7,5,0.25,3,36.52 0.74,686,245,220.5,3.5,2,0.25,3,11.8 0.74,686,245,220.5,3.5,3,0.25,3,12.03 0.74,686,245,220.5,3.5,4,0.25,3,11.98 0.74,686,245,220.5,3.5,5,0.25,3,11.69 0.71,710.5,269.5,220.5,3.5,2,0.25,3,12.41 0.71,710.5,269.5,220.5,3.5,3,0.25,3,12.28 0.71,710.5,269.5,220.5,3.5,4,0.25,3,12.1 0.71,710.5,269.5,220.5,3.5,5,0.25,3,12.19 0.69,735,294,220.5,3.5,2,0.25,3,12.34 0.69,735,294,220.5,3.5,3,0.25,3,12.46 0.69,735,294,220.5,3.5,4,0.25,3,12.31 0.69,735,294,220.5,3.5,5,0.25,3,12.12 0.66,759.5,318.5,220.5,3.5,2,0.25,3,12.97 0.66,759.5,318.5,220.5,3.5,3,0.25,3,13.01 0.66,759.5,318.5,220.5,3.5,4,0.25,3,12.74 0.66,759.5,318.5,220.5,3.5,5,0.25,3,12.84 0.64,784,343,220.5,3.5,2,0.25,3,16.83 0.64,784,343,220.5,3.5,3,0.25,3,16.93 0.64,784,343,220.5,3.5,4,0.25,3,16.66 0.64,784,343,220.5,3.5,5,0.25,3,16.86 0.62,808.5,367.5,220.5,3.5,2,0.25,3,13.91 0.62,808.5,367.5,220.5,3.5,3,0.25,3,14.34 0.62,808.5,367.5,220.5,3.5,4,0.25,3,13.95 0.62,808.5,367.5,220.5,3.5,5,0.25,3,13.99 0.98,514.5,294,110.25,7,2,0.25,4,28.7 0.98,514.5,294,110.25,7,3,0.25,4,28.55 0.98,514.5,294,110.25,7,4,0.25,4,28.15 0.98,514.5,294,110.25,7,5,0.25,4,28.62 0.9,563.5,318.5,122.5,7,2,0.25,4,32.67 0.9,563.5,318.5,122.5,7,3,0.25,4,31.69 0.9,563.5,318.5,122.5,7,4,0.25,4,32.07 0.9,563.5,318.5,122.5,7,5,0.25,4,33.28 0.86,588,294,147,7,2,0.25,4,29.47 0.86,588,294,147,7,3,0.25,4,28.42 0.86,588,294,147,7,4,0.25,4,29.08 0.86,588,294,147,7,5,0.25,4,29.88 0.82,612.5,318.5,147,7,2,0.25,4,25.66 0.82,612.5,318.5,147,7,3,0.25,4,24.96 0.82,612.5,318.5,147,7,4,0.25,4,25.43 0.82,612.5,318.5,147,7,5,0.25,4,26 0.79,637,343,147,7,2,0.25,4,40 0.79,637,343,147,7,3,0.25,4,38.84 0.79,637,343,147,7,4,0.25,4,38.33 0.79,637,343,147,7,5,0.25,4,40.12 0.76,661.5,416.5,122.5,7,2,0.25,4,36.95 0.76,661.5,416.5,122.5,7,3,0.25,4,36.45 0.76,661.5,416.5,122.5,7,4,0.25,4,36.81 0.76,661.5,416.5,122.5,7,5,0.25,4,36.26 0.74,686,245,220.5,3.5,2,0.25,4,12.32 0.74,686,245,220.5,3.5,3,0.25,4,12.3 0.74,686,245,220.5,3.5,4,0.25,4,12.18 0.74,686,245,220.5,3.5,5,0.25,4,12.43 0.71,710.5,269.5,220.5,3.5,2,0.25,4,12.36 0.71,710.5,269.5,220.5,3.5,3,0.25,4,12.49 0.71,710.5,269.5,220.5,3.5,4,0.25,4,12.17 0.71,710.5,269.5,220.5,3.5,5,0.25,4,12.28 0.69,735,294,220.5,3.5,2,0.25,4,12.91 0.69,735,294,220.5,3.5,3,0.25,4,12.95 0.69,735,294,220.5,3.5,4,0.25,4,12.67 0.69,735,294,220.5,3.5,5,0.25,4,12.86 0.66,759.5,318.5,220.5,3.5,2,0.25,4,12.95 0.66,759.5,318.5,220.5,3.5,3,0.25,4,13 0.66,759.5,318.5,220.5,3.5,4,0.25,4,12.86 0.66,759.5,318.5,220.5,3.5,5,0.25,4,12.92 0.64,784,343,220.5,3.5,2,0.25,4,16.99 0.64,784,343,220.5,3.5,3,0.25,4,16.69 0.64,784,343,220.5,3.5,4,0.25,4,16.56 0.64,784,343,220.5,3.5,5,0.25,4,16.62 0.62,808.5,367.5,220.5,3.5,2,0.25,4,14.33 0.62,808.5,367.5,220.5,3.5,3,0.25,4,14.61 0.62,808.5,367.5,220.5,3.5,4,0.25,4,14.61 0.62,808.5,367.5,220.5,3.5,5,0.25,4,14.65 0.98,514.5,294,110.25,7,2,0.25,5,28.69 0.98,514.5,294,110.25,7,3,0.25,5,28.58 0.98,514.5,294,110.25,7,4,0.25,5,28.15 0.98,514.5,294,110.25,7,5,0.25,5,28.61 0.9,563.5,318.5,122.5,7,2,0.25,5,33.13 0.9,563.5,318.5,122.5,7,3,0.25,5,32.31 0.9,563.5,318.5,122.5,7,4,0.25,5,31.53 0.9,563.5,318.5,122.5,7,5,0.25,5,32.46 0.86,588,294,147,7,2,0.25,5,29.71 0.86,588,294,147,7,3,0.25,5,29.09 0.86,588,294,147,7,4,0.25,5,28.31 0.86,588,294,147,7,5,0.25,5,29.39 0.82,612.5,318.5,147,7,2,0.25,5,25.7 0.82,612.5,318.5,147,7,3,0.25,5,25.17 0.82,612.5,318.5,147,7,4,0.25,5,24.6 0.82,612.5,318.5,147,7,5,0.25,5,25.49 0.79,637,343,147,7,2,0.25,5,39.89 0.79,637,343,147,7,3,0.25,5,39.83 0.79,637,343,147,7,4,0.25,5,39.01 0.79,637,343,147,7,5,0.25,5,38.65 0.76,661.5,416.5,122.5,7,2,0.25,5,35.69 0.76,661.5,416.5,122.5,7,3,0.25,5,36.64 0.76,661.5,416.5,122.5,7,4,0.25,5,36.06 0.76,661.5,416.5,122.5,7,5,0.25,5,36.7 0.74,686,245,220.5,3.5,2,0.25,5,12.12 0.74,686,245,220.5,3.5,3,0.25,5,11.67 0.74,686,245,220.5,3.5,4,0.25,5,11.64 0.74,686,245,220.5,3.5,5,0.25,5,12.02 0.71,710.5,269.5,220.5,3.5,2,0.25,5,12.27 0.71,710.5,269.5,220.5,3.5,3,0.25,5,12.19 0.71,710.5,269.5,220.5,3.5,4,0.25,5,12.25 0.71,710.5,269.5,220.5,3.5,5,0.25,5,12.27 0.69,735,294,220.5,3.5,2,0.25,5,12.47 0.69,735,294,220.5,3.5,3,0.25,5,12.12 0.69,735,294,220.5,3.5,4,0.25,5,12.18 0.69,735,294,220.5,3.5,5,0.25,5,12.47 0.66,759.5,318.5,220.5,3.5,2,0.25,5,12.93 0.66,759.5,318.5,220.5,3.5,3,0.25,5,12.82 0.66,759.5,318.5,220.5,3.5,4,0.25,5,12.78 0.66,759.5,318.5,220.5,3.5,5,0.25,5,13.02 0.64,784,343,220.5,3.5,2,0.25,5,16.73 0.64,784,343,220.5,3.5,3,0.25,5,16.86 0.64,784,343,220.5,3.5,4,0.25,5,16.76 0.64,784,343,220.5,3.5,5,0.25,5,16.92 0.62,808.5,367.5,220.5,3.5,2,0.25,5,13.68 0.62,808.5,367.5,220.5,3.5,3,0.25,5,13.99 0.62,808.5,367.5,220.5,3.5,4,0.25,5,14.16 0.62,808.5,367.5,220.5,3.5,5,0.25,5,13.86 0.98,514.5,294,110.25,7,2,0.4,1,32.26 0.98,514.5,294,110.25,7,3,0.4,1,32.26 0.98,514.5,294,110.25,7,4,0.4,1,32.49 0.98,514.5,294,110.25,7,5,0.4,1,32.53 0.9,563.5,318.5,122.5,7,2,0.4,1,36.47 0.9,563.5,318.5,122.5,7,3,0.4,1,37.24 0.9,563.5,318.5,122.5,7,4,0.4,1,36.66 0.9,563.5,318.5,122.5,7,5,0.4,1,35.96 0.86,588,294,147,7,2,0.4,1,31.89 0.86,588,294,147,7,3,0.4,1,32.39 0.86,588,294,147,7,4,0.4,1,32.09 0.86,588,294,147,7,5,0.4,1,31.29 0.82,612.5,318.5,147,7,2,0.4,1,29.22 0.82,612.5,318.5,147,7,3,0.4,1,29.91 0.82,612.5,318.5,147,7,4,0.4,1,29.53 0.82,612.5,318.5,147,7,5,0.4,1,28.65 0.79,637,343,147,7,2,0.4,1,41.4 0.79,637,343,147,7,3,0.4,1,42.62 0.79,637,343,147,7,4,0.4,1,42.5 0.79,637,343,147,7,5,0.4,1,41.67 0.76,661.5,416.5,122.5,7,2,0.4,1,40.78 0.76,661.5,416.5,122.5,7,3,0.4,1,39.97 0.76,661.5,416.5,122.5,7,4,0.4,1,40.71 0.76,661.5,416.5,122.5,7,5,0.4,1,40.43 0.74,686,245,220.5,3.5,2,0.4,1,14.52 0.74,686,245,220.5,3.5,3,0.4,1,14.61 0.74,686,245,220.5,3.5,4,0.4,1,14.5 0.74,686,245,220.5,3.5,5,0.4,1,14.55 0.71,710.5,269.5,220.5,3.5,2,0.4,1,14.51 0.71,710.5,269.5,220.5,3.5,3,0.4,1,14.6 0.71,710.5,269.5,220.5,3.5,4,0.4,1,14.5 0.71,710.5,269.5,220.5,3.5,5,0.4,1,14.58 0.69,735,294,220.5,3.5,2,0.4,1,14.51 0.69,735,294,220.5,3.5,3,0.4,1,14.7 0.69,735,294,220.5,3.5,4,0.4,1,14.42 0.69,735,294,220.5,3.5,5,0.4,1,14.42 0.66,759.5,318.5,220.5,3.5,2,0.4,1,15.23 0.66,759.5,318.5,220.5,3.5,3,0.4,1,15.23 0.66,759.5,318.5,220.5,3.5,4,0.4,1,15.23 0.66,759.5,318.5,220.5,3.5,5,0.4,1,15.23 0.64,784,343,220.5,3.5,2,0.4,1,19.52 0.64,784,343,220.5,3.5,3,0.4,1,19.36 0.64,784,343,220.5,3.5,4,0.4,1,19.48 0.64,784,343,220.5,3.5,5,0.4,1,19.42 0.62,808.5,367.5,220.5,3.5,2,0.4,1,15.09 0.62,808.5,367.5,220.5,3.5,3,0.4,1,17.17 0.62,808.5,367.5,220.5,3.5,4,0.4,1,17.14 0.62,808.5,367.5,220.5,3.5,5,0.4,1,17.14 0.98,514.5,294,110.25,7,2,0.4,2,32.82 0.98,514.5,294,110.25,7,3,0.4,2,32.71 0.98,514.5,294,110.25,7,4,0.4,2,32.24 0.98,514.5,294,110.25,7,5,0.4,2,32.72 0.9,563.5,318.5,122.5,7,2,0.4,2,35.84 0.9,563.5,318.5,122.5,7,3,0.4,2,36.57 0.9,563.5,318.5,122.5,7,4,0.4,2,36.06 0.9,563.5,318.5,122.5,7,5,0.4,2,35.69 0.86,588,294,147,7,2,0.4,2,32.48 0.86,588,294,147,7,3,0.4,2,32.74 0.86,588,294,147,7,4,0.4,2,32.13 0.86,588,294,147,7,5,0.4,2,31.64 0.82,612.5,318.5,147,7,2,0.4,2,28.95 0.82,612.5,318.5,147,7,3,0.4,2,29.49 0.82,612.5,318.5,147,7,4,0.4,2,28.64 0.82,612.5,318.5,147,7,5,0.4,2,28.01 0.79,637,343,147,7,2,0.4,2,41.64 0.79,637,343,147,7,3,0.4,2,43.1 0.79,637,343,147,7,4,0.4,2,42.74 0.79,637,343,147,7,5,0.4,2,41.92 0.76,661.5,416.5,122.5,7,2,0.4,2,40.78 0.76,661.5,416.5,122.5,7,3,0.4,2,40.15 0.76,661.5,416.5,122.5,7,4,0.4,2,40.57 0.76,661.5,416.5,122.5,7,5,0.4,2,40.42 0.74,686,245,220.5,3.5,2,0.4,2,14.54 0.74,686,245,220.5,3.5,3,0.4,2,14.45 0.74,686,245,220.5,3.5,4,0.4,2,14.18 0.74,686,245,220.5,3.5,5,0.4,2,14.5 0.71,710.5,269.5,220.5,3.5,2,0.4,2,14.7 0.71,710.5,269.5,220.5,3.5,3,0.4,2,14.66 0.71,710.5,269.5,220.5,3.5,4,0.4,2,14.4 0.71,710.5,269.5,220.5,3.5,5,0.4,2,14.71 0.69,735,294,220.5,3.5,2,0.4,2,14.75 0.69,735,294,220.5,3.5,3,0.4,2,14.71 0.69,735,294,220.5,3.5,4,0.4,2,14.33 0.69,735,294,220.5,3.5,5,0.4,2,14.62 0.66,759.5,318.5,220.5,3.5,2,0.4,2,15.34 0.66,759.5,318.5,220.5,3.5,3,0.4,2,15.29 0.66,759.5,318.5,220.5,3.5,4,0.4,2,15.09 0.66,759.5,318.5,220.5,3.5,5,0.4,2,15.3 0.64,784,343,220.5,3.5,2,0.4,2,19.2 0.64,784,343,220.5,3.5,3,0.4,2,18.88 0.64,784,343,220.5,3.5,4,0.4,2,18.9 0.64,784,343,220.5,3.5,5,0.4,2,19.12 0.62,808.5,367.5,220.5,3.5,2,0.4,2,16.76 0.62,808.5,367.5,220.5,3.5,3,0.4,2,17.23 0.62,808.5,367.5,220.5,3.5,4,0.4,2,17.26 0.62,808.5,367.5,220.5,3.5,5,0.4,2,17.15 0.98,514.5,294,110.25,7,2,0.4,3,32.82 0.98,514.5,294,110.25,7,3,0.4,3,32.69 0.98,514.5,294,110.25,7,4,0.4,3,32.23 0.98,514.5,294,110.25,7,5,0.4,3,32.75 0.9,563.5,318.5,122.5,7,2,0.4,3,34.24 0.9,563.5,318.5,122.5,7,3,0.4,3,34.95 0.9,563.5,318.5,122.5,7,4,0.4,3,35.05 0.9,563.5,318.5,122.5,7,5,0.4,3,34.29 0.86,588,294,147,7,2,0.4,3,31.28 0.86,588,294,147,7,3,0.4,3,32.12 0.86,588,294,147,7,4,0.4,3,32.05 0.86,588,294,147,7,5,0.4,3,31.84 0.82,612.5,318.5,147,7,2,0.4,3,28.67 0.82,612.5,318.5,147,7,3,0.4,3,29.67 0.82,612.5,318.5,147,7,4,0.4,3,29.47 0.82,612.5,318.5,147,7,5,0.4,3,28.91 0.79,637,343,147,7,2,0.4,3,41.26 0.79,637,343,147,7,3,0.4,3,41.3 0.79,637,343,147,7,4,0.4,3,42.49 0.79,637,343,147,7,5,0.4,3,42.08 0.76,661.5,416.5,122.5,7,2,0.4,3,39.32 0.76,661.5,416.5,122.5,7,3,0.4,3,39.84 0.76,661.5,416.5,122.5,7,4,0.4,3,38.89 0.76,661.5,416.5,122.5,7,5,0.4,3,39.68 0.74,686,245,220.5,3.5,2,0.4,3,13.97 0.74,686,245,220.5,3.5,3,0.4,3,14.22 0.74,686,245,220.5,3.5,4,0.4,3,14.1 0.74,686,245,220.5,3.5,5,0.4,3,13.78 0.71,710.5,269.5,220.5,3.5,2,0.4,3,14.07 0.71,710.5,269.5,220.5,3.5,3,0.4,3,14.03 0.71,710.5,269.5,220.5,3.5,4,0.4,3,13.94 0.71,710.5,269.5,220.5,3.5,5,0.4,3,13.86 0.69,735,294,220.5,3.5,2,0.4,3,14.32 0.69,735,294,220.5,3.5,3,0.4,3,14.56 0.69,735,294,220.5,3.5,4,0.4,3,14.33 0.69,735,294,220.5,3.5,5,0.4,3,14.08 0.66,759.5,318.5,220.5,3.5,2,0.4,3,15.16 0.66,759.5,318.5,220.5,3.5,3,0.4,3,15.18 0.66,759.5,318.5,220.5,3.5,4,0.4,3,14.72 0.66,759.5,318.5,220.5,3.5,5,0.4,3,14.9 0.64,784,343,220.5,3.5,2,0.4,3,18.48 0.64,784,343,220.5,3.5,3,0.4,3,18.71 0.64,784,343,220.5,3.5,4,0.4,3,18.48 0.64,784,343,220.5,3.5,5,0.4,3,18.46 0.62,808.5,367.5,220.5,3.5,2,0.4,3,16.47 0.62,808.5,367.5,220.5,3.5,3,0.4,3,16.35 0.62,808.5,367.5,220.5,3.5,4,0.4,3,16.55 0.62,808.5,367.5,220.5,3.5,5,0.4,3,16.74 0.98,514.5,294,110.25,7,2,0.4,4,32.85 0.98,514.5,294,110.25,7,3,0.4,4,32.67 0.98,514.5,294,110.25,7,4,0.4,4,32.21 0.98,514.5,294,110.25,7,5,0.4,4,32.74 0.9,563.5,318.5,122.5,7,2,0.4,4,36.45 0.9,563.5,318.5,122.5,7,3,0.4,4,35.73 0.9,563.5,318.5,122.5,7,4,0.4,4,35.4 0.9,563.5,318.5,122.5,7,5,0.4,4,36.57 0.86,588,294,147,7,2,0.4,4,32.38 0.86,588,294,147,7,3,0.4,4,31.66 0.86,588,294,147,7,4,0.4,4,32.15 0.86,588,294,147,7,5,0.4,4,32.75 0.82,612.5,318.5,147,7,2,0.4,4,28.93 0.82,612.5,318.5,147,7,3,0.4,4,28.05 0.82,612.5,318.5,147,7,4,0.4,4,28.64 0.82,612.5,318.5,147,7,5,0.4,4,29.52 0.79,637,343,147,7,2,0.4,4,42.77 0.79,637,343,147,7,3,0.4,4,41.73 0.79,637,343,147,7,4,0.4,4,41.32 0.79,637,343,147,7,5,0.4,4,42.96 0.76,661.5,416.5,122.5,7,2,0.4,4,40.68 0.76,661.5,416.5,122.5,7,3,0.4,4,40.4 0.76,661.5,416.5,122.5,7,4,0.4,4,40.6 0.76,661.5,416.5,122.5,7,5,0.4,4,40.11 0.74,686,245,220.5,3.5,2,0.4,4,14.37 0.74,686,245,220.5,3.5,3,0.4,4,14.48 0.74,686,245,220.5,3.5,4,0.4,4,14.32 0.74,686,245,220.5,3.5,5,0.4,4,14.44 0.71,710.5,269.5,220.5,3.5,2,0.4,4,14.6 0.71,710.5,269.5,220.5,3.5,3,0.4,4,14.7 0.71,710.5,269.5,220.5,3.5,4,0.4,4,14.47 0.71,710.5,269.5,220.5,3.5,5,0.4,4,14.66 0.69,735,294,220.5,3.5,2,0.4,4,14.54 0.69,735,294,220.5,3.5,3,0.4,4,14.62 0.69,735,294,220.5,3.5,4,0.4,4,14.53 0.69,735,294,220.5,3.5,5,0.4,4,14.71 0.66,759.5,318.5,220.5,3.5,2,0.4,4,15.34 0.66,759.5,318.5,220.5,3.5,3,0.4,4,15.29 0.66,759.5,318.5,220.5,3.5,4,0.4,4,15.09 0.66,759.5,318.5,220.5,3.5,5,0.4,4,15.3 0.64,784,343,220.5,3.5,2,0.4,4,19.06 0.64,784,343,220.5,3.5,3,0.4,4,19.13 0.64,784,343,220.5,3.5,4,0.4,4,19 0.64,784,343,220.5,3.5,5,0.4,4,18.84 0.62,808.5,367.5,220.5,3.5,2,0.4,4,16.44 0.62,808.5,367.5,220.5,3.5,3,0.4,4,16.9 0.62,808.5,367.5,220.5,3.5,4,0.4,4,16.94 0.62,808.5,367.5,220.5,3.5,5,0.4,4,16.77 0.98,514.5,294,110.25,7,2,0.4,5,32.84 0.98,514.5,294,110.25,7,3,0.4,5,32.72 0.98,514.5,294,110.25,7,4,0.4,5,32.21 0.98,514.5,294,110.25,7,5,0.4,5,32.73 0.9,563.5,318.5,122.5,7,2,0.4,5,35.67 0.9,563.5,318.5,122.5,7,3,0.4,5,35.01 0.9,563.5,318.5,122.5,7,4,0.4,5,34.72 0.9,563.5,318.5,122.5,7,5,0.4,5,35.24 0.86,588,294,147,7,2,0.4,5,32.31 0.86,588,294,147,7,3,0.4,5,31.81 0.86,588,294,147,7,4,0.4,5,31.12 0.86,588,294,147,7,5,0.4,5,32.06 0.82,612.5,318.5,147,7,2,0.4,5,30 0.82,612.5,318.5,147,7,3,0.4,5,29.5 0.82,612.5,318.5,147,7,4,0.4,5,29.06 0.82,612.5,318.5,147,7,5,0.4,5,29.92 0.79,637,343,147,7,2,0.4,5,42.11 0.79,637,343,147,7,3,0.4,5,41.96 0.79,637,343,147,7,4,0.4,5,41.09 0.79,637,343,147,7,5,0.4,5,40.79 0.76,661.5,416.5,122.5,7,2,0.4,5,38.82 0.76,661.5,416.5,122.5,7,3,0.4,5,39.72 0.76,661.5,416.5,122.5,7,4,0.4,5,39.31 0.76,661.5,416.5,122.5,7,5,0.4,5,39.86 0.74,686,245,220.5,3.5,2,0.4,5,14.41 0.74,686,245,220.5,3.5,3,0.4,5,14.19 0.74,686,245,220.5,3.5,4,0.4,5,14.17 0.74,686,245,220.5,3.5,5,0.4,5,14.39 0.71,710.5,269.5,220.5,3.5,2,0.4,5,12.43 0.71,710.5,269.5,220.5,3.5,3,0.4,5,12.63 0.71,710.5,269.5,220.5,3.5,4,0.4,5,12.76 0.71,710.5,269.5,220.5,3.5,5,0.4,5,12.42 0.69,735,294,220.5,3.5,2,0.4,5,14.12 0.69,735,294,220.5,3.5,3,0.4,5,14.28 0.69,735,294,220.5,3.5,4,0.4,5,14.37 0.69,735,294,220.5,3.5,5,0.4,5,14.21 0.66,759.5,318.5,220.5,3.5,2,0.4,5,14.96 0.66,759.5,318.5,220.5,3.5,3,0.4,5,14.92 0.66,759.5,318.5,220.5,3.5,4,0.4,5,14.92 0.66,759.5,318.5,220.5,3.5,5,0.4,5,15.16 0.64,784,343,220.5,3.5,2,0.4,5,17.69 0.64,784,343,220.5,3.5,3,0.4,5,18.19 0.64,784,343,220.5,3.5,4,0.4,5,18.16 0.64,784,343,220.5,3.5,5,0.4,5,17.88 0.62,808.5,367.5,220.5,3.5,2,0.4,5,16.54 0.62,808.5,367.5,220.5,3.5,3,0.4,5,16.44 0.62,808.5,367.5,220.5,3.5,4,0.4,5,16.48 0.62,808.5,367.5,220.5,3.5,5,0.4,5,16.64 \ No newline at end of file diff --git a/Eye_Color.csv b/Eye_Color.csv new file mode 100644 index 0000000..50c00f0 --- /dev/null +++ b/Eye_Color.csv @@ -0,0 +1,2069 @@ +gender,age,year,eyecolor,height,miles,brothers,sisters,computertime,exercise,exercisehours,musiccds,playgames,watchtv +female,18,first,hazel,68,195,0,1,20,Yes,3,75,6,18 +male,20,third,brown,70,120,3,0,24,No,0,50,0,3 +female,18,first,green,67,200,0,1,35,Yes,3,53,8,1 +male,23,fourth,hazel,74,140,1,1,5,Yes,25,50,0,7 +female,19,second,blue,62,60,0,1,5,Yes,4,30,2,5 +male,19,second,green,67,0,0,1,5,Yes,8,100,0,10 +male,37,third,brown,74,511,1,1,3,No,0,50,3,8 +male,22,third,brown,73,210,3,2,2,Yes,10,100,6,10 +female,26,fourth,brown,70,120,2,1,5,No,0,130,0,20 +male,21,third,blue,68,90,1,1,5,Yes,3,34,0.5,5 +male,25,fourth,blue,69,90,0,3,3,Yes,6,55,0,21 +female,20,second,blue,70,93,0,1,15,Yes,7,60,1,1 +male,29,other,brown,69,244,1,1,5,No,0,100,20,20 +female,19,second,green,65,40,1,0,6,Yes,4,175,0,12 +male,19,first,blue,70,40,0,0,5,No,0,150,3,2 +male,22,other,blue,73,90,0,1,15,Yes,10,35,20,4 +female,20,second,brown,64,100,2,1,9,No,0,30,10,8 +male,21,third,brown,70,124,1,2,4,Yes,6,5,1,5 +male,20,third,blue,70,400,0,0,30,Yes,4,50,5,1 +female,19,second,hazel,63,206,1,1,10,No,0,20,20,15 +male,20,third,hazel,70,184,2,0,20,No,0,40,10,20 +female,19,second,blue,69,240,1,1,14,No,0,15,1,10 +female,19,first,hazel,65,230,1,0,12.5,Yes,9,30,0,4.5 +female,19,second,blue,64,0,1,0,6,Yes,5,52,0,0 +male,18,first,green,58,175,1,0,10,No,0,40,5,5 +male,19,second,blue,67,60,4,1,5,Yes,2,50,10,12 +male,23,fourth,brown,74,160,2,1,20,No,0,60,15,40 +male,24,other,blue,72,180,2,2,2,Yes,7,100,7,21 +female,20,second,brown,64,0,0,2,3,Yes,3,50,0,10 +male,21,third,green,70,100,1,1,6,Yes,5,20,0,10 +female,22,fourth,brown,66,300,1,0,1,Yes,1,50,1,1 +male,22,fourth,blue,72,0,0,2,10,Yes,6,250,0,25 +female,19,second,brown,67,180,0,2,40,Yes,5,70,1,7 +female,21,third,blue,63,0,2,3,10,No,0,50,0.5,8 +male,21,third,green,70,80,0,2,10,No,0,50,10,30 +male,22,fourth,green,74,120,2,1,10,No,0,35,1,5 +male,20,third,other,71,90,1,0,15,Yes,4,10,0,1 +male,21,third,green,71,220,1,0,18,Yes,30,20,0,21 +male,21,third,brown,71,190,1,0,10,Yes,5,25,1,10 +female,19,second,blue,64,200,0,1,5,Yes,3,130,0,8 +male,18,first,green,71,130,2,1,2,No,0,15,2,25 +male,20,second,blue,72,120,0,1,4,Yes,10,56,12,8 +male,21,third,brown,70,157,0,1,15,No,0,50,5,28 +female,21,fourth,green,69,230,1,0,10,Yes,8,215,2,10 +male,19,first,brown,67,75,2,0,10,No,0,0,12,12 +male,22,fourth,hazel,70,200,0,2,5,No,0,5,5,20 +male,20,second,green,67,109,1,1,5,No,0,80,0,1 +female,20,second,blue,62,200,1,0,12,Yes,1,300,0,10 +male,21,third,brown,66,0,1,2,5,Yes,5,0,10,30 +male,20,third,hazel,69,50,2,0,8,Yes,2.5,250,0,5 +female,20,second,hazel,67,600,1,0,15,Yes,4,140,0,15 +female,19,second,brown,62,40,1,0,15,Yes,8,25,0,13 +female,22,fourth,brown,65,5,1,0,1,Yes,6,50,0,3 +male,20,third,hazel,72,80,1,1,2.5,Yes,5.5,10,5.5,14 +male,21,third,hazel,70,150,1,0,2,Yes,10,100,15,7 +female,19,second,brown,62,30,4,2,10,No,0,10,0,20 +male,21,fourth,blue,69,140,1,0,5,No,0,100,0,2 +female,21,fourth,blue,66,10,2,1,3,Yes,3,20,5,10 +female,21,fourth,green,65,305,2,3,14,Yes,2,110,2,12 +male,20,third,blue,79,79,0,2,28,Yes,6,40,2,15 +female,20,second,brown,62,220,0,0,24,Yes,5,25,0,7 +male,20,third,hazel,71,55,0,1,12,Yes,6,150,12,12 +male,19,first,brown,68,20,2,0,10,No,0,40,10,14 +male,18,first,blue,71,180,2,0,3,Yes,5,30,2,2 +male,18,first,blue,72,75,0,2,3,Yes,2,15,0,4 +female,20,second,blue,64,150,0,3,7,No,0,150,0,28 +male,21,third,hazel,75,210,0,0,7,No,0,26,10,10 +male,20,second,brown,70,11,3,1,7,Yes,10,5,14,40 +male,23,other,brown,80,1500,1,0,10,No,0,20,10,1 +female,22,fourth,green,64,154,1,0,5,No,0,100,0,10 +female,18,second,green,67,80,1,0,70,No,0,56,0,5 +female,19,second,hazel,67,360,1,2,10,Yes,4,30,3,6 +male,21,third,blue,75,170,1,1,5,Yes,2,6,1,5 +female,38,third,hazel,67,40,1,1,4,Yes,7,30,14,14 +female,20,third,brown,67,35,0,0,3,Yes,5,60,0,10 +male,23,fourth,blue,74,0,1,1,8,Yes,5,500,11,16 +female,19,second,hazel,65,35,0,2,5,Yes,4,30,0,5 +male,21,third,blue,71,95,1,0,10,Yes,8,30,5,10 +male,20,second,blue,75,190,2,0,10,No,0,55,10,1 +female,21,third,blue,68,101,1,3,2,No,0,0,1,10 +female,19,second,green,67,150,1,5,4,Yes,3,200,0,3 +male,21,third,blue,75,15,2,1,7,Yes,4,100,10,10 +male,20,third,blue,76,210,1,1,5,Yes,3.5,100,10,10 +male,18,first,green,71,215,0,2,4,Yes,5,60,0,1 +female,20,third,brown,62,45,1,1,60,No,0,100,0,2 +male,22,fourth,blue,73,13,1,1,4,Yes,6,50,4,8 +male,22,other,blue,68,0,2,0,10,No,0,150,2,15 +female,18,first,green,67,215,0,2,30,No,0,20,1,3 +male,24,first,brown,70,28,3,3,20,Yes,6,0,8,20 +male,19,first,blue,72,260,0,1,20,No,0,100,10,20 +female,23,other,other,65,30,1,1,20,No,0,20,5,15 +male,21,second,brown,69,8587.2,1,0,20,Yes,6,0,6,2 +female,20,third,brown,60,30,0,1,7,No,0,50,0,25 +female,20,second,blue,62,60,1,0,18,Yes,5,350,0,18 +female,21,third,brown,63,7000,0,1,10,No,0,300,0,4 +female,19,first,hazel,68,230,0,1,30,No,0,350,2,2 +female,20,third,other,70,22,3,0,10,No,0,15,1,3 +female,20,second,blue,62,130,2,1,25,No,0,10,0,8 +male,23,other,blue,71,180,0,1,16,Yes,4,58,10,15 +female,17,other,brown,67,18,2,1,10,No,0,50,0,5 +female,19,second,blue,61,50,0,1,14,No,0,150,0,20 +female,21,fourth,brown,63,120,1,0,5,No,0,500,30,15 +male,20,second,blue,71,30,0,1,15,Yes,4,200,2,8 +female,27,fourth,blue,63,2000,1,1,8,Yes,6,27,0,7 +female,21,third,brown,67,220,2,1,6,Yes,5,100,0,10 +male,19,second,hazel,78,300,0,1,24,Yes,16,100,2,18 +male,21,third,brown,69,180,3,0,15,No,0,25,1,10 +male,20,second,brown,73,82,2,2,10,No,0,500,1,3 +female,20,second,green,65,160,5,6,3,Yes,0,30,0.5,12 +female,24,other,blue,64,100,1,0,4,No,0,133,0,10 +male,18,first,green,72,360,1,0,5,Yes,5,100,5,10 +male,21,third,green,73,0,1,1,2,No,0,200,0.5,2 +male,20,third,brown,71,58,0,2,52.5,No,0,12,12.5,22.5 +male,21,third,brown,72,0,0,1,2,Yes,9,100,14,7 +female,18,first,green,67,65,0,2,8,Yes,10,50,0,8 +male,20,second,blue,71,150,0,1,4,Yes,10,100,10,20 +female,20,second,hazel,68,190,6,2,3,Yes,6,15,0,5 +female,20,second,green,65,288.5,0,2,25,No,0,47,1,5 +female,19,second,blue,65,300,0,3,5,No,0,75,0.5,7 +male,20,second,green,68,132,2,0,25,Yes,7,50,10,10 +male,19,second,brown,71,4000,2,0,45,Yes,6,60,5,35 +female,19,second,brown,69,70,1,0,15,Yes,2,40,5,10 +female,20,third,blue,70,150,1,1,14,Yes,6,25,1,3 +male,20,third,brown,75,300,0,2,3,Yes,20,45,18,5 +female,20,second,green,64,215,0,0,5,Yes,25,200,0.5,2 +female,20,third,green,67,30,1,1,10,Yes,5,50,0,2 +male,22,fourth,brown,75,40,1,0,7,Yes,8,200,13,35 +female,20,third,blue,68,150,0,1,3,Yes,3.5,50,0,5 +male,20,second,blue,73,190,0,1,4,Yes,2,40,3,6 +male,19,first,brown,70,375,0,1,15,No,0,300,5,5 +female,19,second,green,64,193,0,1,40,No,0,1000,0,20 +female,21,fourth,green,66,180,1,0,14,Yes,5,100,2,30 +male,23,other,brown,68,293,3,1,2,Yes,15,150,21,14 +female,19,first,blue,69,250,0,1,12,Yes,8,55,0,6 +male,20,second,hazel,68,45,0,2,1.5,No,0,80,2,9 +female,21,fourth,green,66,45,1,0,5,No,0,20,1,8 +female,21,third,brown,66,300,1,2,15,Yes,6,200,0,15 +female,22,third,blue,70,240,3,2,1,Yes,1,12,0.5,0.5 +male,19,second,green,72,1500,1,0,2,Yes,3,31,6,16 +female,19,second,blue,67,40,1,2,2,Yes,3,60,0,10 +female,20,second,other,63,13000,2,1,20,No,0,10,0,2 +female,20,third,blue,66,260,1,1,7,No,0,34,1,15 +male,19,second,brown,72,800,0,2,4,Yes,4,450,2,8 +female,19,second,other,68,369,1,4,3,Yes,3,12,0,5 +female,20,second,blue,67,168,0,2,5,Yes,3,80,0,10 +male,21,third,hazel,73,50,1,1,5,Yes,8,100,5,4 +female,20,second,green,75,440,0,1,3,Yes,10,40,0,3 +male,20,second,green,68,60,0,1,7,Yes,3,120,7,25 +female,20,third,blue,68,75,1,2,15,Yes,3,20,0,0 +female,23,fourth,blue,70,40,1,1,6,No,0,75,0,3 +male,21,third,brown,69,200,1,2,4,No,0,100,7,20 +male,21,fourth,brown,74,85,2,0,10,Yes,6,100,5,5 +female,19,second,hazel,63,190,0,2,1,No,0,30,2,5 +male,21,third,green,69,175,1,1,8.5,Yes,7,300,5,17.5 +male,20,third,blue,66,200,1,1,3,No,0,20,0,2 +female,20,third,green,68,0,1,1,10,Yes,6,100,0,10 +female,23,fourth,hazel,64,33,2,1,5,No,0,20,0,10 +male,22,third,brown,71,150,3,0,2,Yes,5,80,4,6 +female,21,third,hazel,64,160,1,1,2,No,0,5,0,6 +male,24,third,brown,64,360,2,1,3,Yes,4,12,0,6 +male,22,other,green,72,50,2,0,15,Yes,5,45,3,6 +male,24,fourth,green,74,189,2,1,6,Yes,5,25,1,25 +female,19,second,green,77,105,2,0,10,Yes,8,120,1,3 +female,20,third,blue,62,65,1,1,15,Yes,4,10,0,10 +female,19,first,green,63,950,1,0,8,No,0,50,2,5 +female,19,first,hazel,66,350,1,0,4,Yes,4,45,0,8 +female,22,other,brown,68,210,2,1,8.5,No,0,75,0,22 +female,20,third,blue,67,138,0,2,6,No,0,79,0,15 +female,20,second,hazel,67,100,2,1,2.5,Yes,0,20,3.5,15 +female,20,second,brown,63,390,2,1,50,No,0,85,2,12 +female,19,third,brown,65,6000,0,1,15,No,0,27,0,20 +male,21,third,brown,69,130,1,2,1,No,0,60,5,20 +male,19,first,blue,73,110,2,1,11,No,0,400,1,3 +female,20,third,green,64,200,1,1,25,Yes,6,40,0.5,14 +male,25,fourth,brown,70,15,3,1,5,No,0,100,2,5 +female,22,fourth,brown,65,25,0,2,4,Yes,6,50,0,2 +male,21,third,blue,68,100,0,2,20,No,0,700,5,10 +female,20,second,brown,66,35,1,2,2,No,0,15,0,5 +male,19,first,brown,61,120,0,3,3,Yes,5,4,5,30 +female,19,first,brown,67,300,1,1,12,Yes,3,20,1,1 +male,21,other,blue,71,220,0,1,5,No,0,102,10,20 +female,18,first,brown,65,80,1,1,10,Yes,2,95,1,3 +male,28,other,hazel,72,110,3,1,6,No,0,100,2,21 +female,18,first,blue,67,30,1,1,20,No,0,100,0,3 +female,20,second,brown,72,500,1,1,8,No,0,200,4,7 +male,19,second,hazel,73,1697,1,0,5,Yes,5,35,10,5 +male,24,second,brown,73,57,1,1,5.5,Yes,12,300,1,3 +female,21,fourth,blue,65,150,0,1,10,No,0,60,1,15 +female,20,third,green,65,45,0,2,30,No,0,30,2,20 +female,41,first,hazel,69,10,2,1,6,Yes,6,200,2,6 +female,21,fourth,green,64,120,2,2,3,No,0,50,3,5 +female,20,second,brown,67,175,2,1,15,Yes,6,45,1,8 +female,19,first,blue,65,350,0,2,3,No,0,50,0,1 +male,19,first,blue,67,14,1,2,20,No,0,15,1,0 +female,20,second,hazel,68,75,1,0,5,No,0,100,7,5 +female,20,third,green,65,180,0,1,5,Yes,3,40,0,8 +male,23,third,blue,67,90,1,1,7,Yes,4.5,110,1,2 +male,21,third,blue,70,250,0,2,10,Yes,10,50,0,2 +male,20,third,blue,74,90,1,2,8,Yes,10,70,8,2 +female,20,third,blue,64,100,2,1,40,Yes,5,40,0,3 +female,19,second,green,67,350,1,1,6,No,0,50,1,6 +male,26,fourth,brown,69,770,3,0,15,Yes,4,150,10,7 +male,21,third,blue,73,200,1,1,2,Yes,6,5,2,20 +female,19,second,blue,71,180,1,3,15,Yes,3,100,0.5,10 +female,22,first,other,67,110,3,0,10,Yes,3,15,0,0 +male,20,third,other,77,130,2,2,4,Yes,6,150,6,15 +male,18,first,blue,73,90,1,1,15,No,0,30,0,10 +female,18,first,green,64,24,0,1,3,Yes,4,30,5,6 +male,19,third,hazel,72,150,1,0,5,Yes,7,58,4,18 +female,21,third,brown,63,60,1,2,25,No,0,75,10,2 +female,20,second,brown,69,150,2,1,3,No,0,75,0,4 +male,18,first,brown,71,50,2,2,8,Yes,12,75,1,0.5 +female,20,second,green,65,142,1,2,21,No,0,15,1,7 +male,20,third,blue,69,190,0,1,15,Yes,8.5,112,1,15 +female,19,second,hazel,60,40,0,1,4,Yes,5,20,0,14 +female,22,fourth,brown,63,1000,4,1,10,No,0,150,0,20 +female,22,fourth,blue,62,400,1,1,10,No,0,100,0.5,5 +female,19,second,blue,69,140,2,0,6,No,0,80,0,15 +female,20,third,blue,63,385,0,1,15,No,0,75,1,3 +male,20,third,hazel,68,212,0,1,3,Yes,4,50,1,10 +female,20,second,brown,63,150,3,3,3,Yes,7.5,25,4,5 +female,21,fourth,hazel,65,90,3,1,4,Yes,10,100,0,15 +male,20,second,green,74,396,1,0,10,Yes,2,90,24,10 +female,20,third,blue,65,300,1,1,4,Yes,4,30,10,5 +male,21,third,blue,70,200,1,1,1,Yes,6,50,2,30 +male,23,third,green,67,140,0,1,5,Yes,7.5,45,0,45 +female,18,first,blue,67,90,2,1,4,Yes,3,3,0,8 +female,19,second,brown,66,52,1,1,4,Yes,8,20,2,8 +male,21,third,blue,71,35,1,1,8,No,0,25,6,12 +male,20,third,brown,74,321,0,1,1.5,No,0,35,1,3 +male,26,second,hazel,73,120,0,0,5,No,0,76,10,25 +male,21,third,hazel,71,180,0,1,12,Yes,5,20,1,12 +male,21,third,blue,70,135,2,0,15,Yes,10,5,4,15 +female,19,second,brown,68,155,0,0,3,Yes,12,25,0,15 +female,19,first,green,64,70,1,0,7,No,0,15,0,7 +female,19,second,brown,65,75,1,2,15,No,0,94,7,3 +female,21,fourth,brown,72,45,1,0,30,Yes,3,70,0,2 +female,20,third,hazel,67,100,3,4,3,Yes,6,12,0,2.5 +male,22,fourth,green,67,35,0,2,0,No,0,200,10,10 +female,18,first,brown,66,210,1,0,7,No,0,100,2,10 +female,20,third,blue,63,130,0,1,6,Yes,9,60,0,15 +female,19,second,hazel,62,111,1,0,3,Yes,3,25,0,10 +male,19,first,hazel,68,150,3,0,4,No,0,10,3,3 +female,19,second,blue,72,0,1,1,2,Yes,7,8,2,20 +male,20,second,blue,70,210,2,0,5,Yes,13,75,5,20 +female,21,fourth,brown,62,200,5,0,4,No,0,80,1,6 +male,18,first,blue,77,375,1,1,8,Yes,12,24,0,7 +female,20,second,brown,73,173,1,1,8,Yes,20,100,0,3 +male,22,fourth,other,72,180,3,0,2,Yes,3,120,3,28 +male,19,second,brown,71,120,2,1,5,Yes,10,1,0,2 +male,20,third,brown,77,80,0,1,15,No,0,20,30,40 +male,21,third,blue,72,110,3,0,6,Yes,5,100,10,15 +female,22,fourth,other,65,75,0,2,5,Yes,5,30,0,7 +male,20,third,blue,73,180,0,1,6,No,0,120,10,30 +male,19,first,blue,72,40,2,1,7,Yes,4,20,3,1 +male,20,third,blue,70,240,1,1,15,Yes,10,50,5,5 +female,21,fourth,brown,68,250,1,0,2,No,0,75,2,5 +male,22,fourth,blue,73,290,1,1,7,Yes,5,100,10,10 +female,20,third,brown,62,180,1,4,10,Yes,5,40,1,6 +male,20,third,blue,67,0,2,0,15,Yes,4,0,1,15 +female,21,fourth,blue,67,80,2,0,10,Yes,5,100,1,15 +female,22,third,brown,68,95,0,2,10,Yes,6.5,55,2,12 +male,22,other,blue,70,117,2,1,5,No,0,50,5,21 +male,20,third,hazel,71,101.1,0,3,10,Yes,2,100,0,5 +female,21,third,blue,69,85,1,0,4,Yes,8,60,0,3 +female,19,second,blue,66,200,1,0,10,No,0,150,0,10 +female,20,third,blue,65,250,1,0,10,Yes,6,200,0,5 +female,20,second,hazel,68,162.5,0,0,15,Yes,12,150,0,10 +female,19,second,blue,68,125,2,1,7,Yes,5,35,0,1 +male,21,third,green,71,62,1,1,30,Yes,10,300,10,20 +female,21,third,brown,67,120,1,1,2,Yes,8,50,1,3 +male,25,fourth,brown,75,30,0,1,5,Yes,5,150,1,10 +female,19,second,hazel,64,125,2,0,12,No,0,4,0,3 +female,20,third,blue,66,70,1,4,20,Yes,3,25,0,4 +male,19,second,other,70,0,0,1,20,No,0,500,12,5 +female,22,fourth,brown,68,110,1,1,1,No,0,55,2,5 +male,21,fourth,other,70,40,1,1,4,Yes,16,30,1,5 +female,21,fourth,brown,70,60,1,3,10,No,0,30,1,3 +male,21,fourth,green,72,120,0,2,20,No,0,6,1,20 +male,18,first,brown,70,5000,1,0,15,Yes,4,50,20,15 +female,18,first,brown,65,1200,2,2,20,No,0,50,3,3 +female,19,second,green,70,90,0,1,10,Yes,5,300,2,10 +male,21,fourth,brown,67,300,3,1,10,Yes,1,50,0.5,4 +male,21,third,blue,68,0,1,2,4,Yes,6,50,1,8 +male,20,third,blue,71,280,1,1,5,Yes,2,3,10,10 +female,19,second,hazel,65,100,1,1,10,Yes,2,30,0.25,4 +male,20,second,brown,72,85,4,3,20,Yes,3,100,1,10 +male,18,first,blue,66,320,1,4,10,Yes,10,60,0,20 +male,21,third,brown,72,180,0,2,10,Yes,5,130,20,20 +female,21,third,blue,68,75,1,0,4,Yes,5,30,0,7 +female,20,second,blue,66,85,2,1,10,Yes,3,200,10,10 +female,19,second,blue,64,90,1,0,8,No,0,150,2,15 +female,18,first,brown,67,181,1,0,15,No,0,82,0,15 +male,20,third,blue,73,165,2,0,2,Yes,5,100,3.5,14 +male,20,second,blue,78,40,0,1,7,Yes,5.5,50,0,15 +male,24,fourth,blue,69,85,2,1,2,Yes,0,100,8,2 +female,20,third,brown,67,130,1,1,5,Yes,5,200,0,15 +female,18,first,green,67,0,0,0,30,Yes,14,60,0,2 +male,21,third,blue,70,225,3,0,4,Yes,5,50,2,15 +male,21,third,blue,74,100,1,1,1,Yes,3,50,1,5 +male,20,third,green,71,180,0,1,5,Yes,3,40,1,4 +female,22,fourth,brown,70,100,0,1,15,Yes,3,95,0,10 +male,19,second,blue,68,280,1,0,30,No,0,400,1,20 +female,19,second,blue,64,40,1,0,15,No,0,32,0,0 +female,20,third,blue,65,35,1,4,37.5,No,0,40,1,2 +male,21,third,hazel,77,180,1,1,3,Yes,6,20,2,15 +female,19,second,brown,69,175,1,1,5,Yes,3,50,3,2 +male,21,second,blue,68,55,1,1,3,Yes,18,40,0,12 +male,19,second,brown,70,230,0,2,10,No,0,60,6,2 +female,19,second,hazel,70,180,2,0,8,Yes,15,80,0,4 +male,23,third,blue,75,90,1,1,5,Yes,5,0,10,25 +female,20,second,green,69,140,1,2,5,Yes,5,200,0,0 +male,21,third,blue,71,45,1,0,10,Yes,20,80,4,5 +male,21,third,blue,68,70,1,0,8,Yes,12,100,2,10 +female,22,fourth,blue,60,0,2,2,10,Yes,5,20,0,0 +female,22,fourth,brown,64,40,1,1,5,No,0,50,0,0 +female,18,first,hazel,64,200,0,1,10,Yes,4,75,0,6 +female,23,other,blue,70,122,2,1,2.5,Yes,3.5,100,1.5,3.5 +female,22,fourth,hazel,65,5,0,3,15,Yes,4.5,40,0,15 +male,21,third,hazel,72,115,1,1,15,Yes,8,100,15,10 +male,21,third,green,74,120,0,1,15,Yes,6.5,60,2,15 +male,20,second,hazel,74,100,1,1,8,Yes,8,148,2,10 +female,19,second,blue,63,175,1,0,10,Yes,3.5,200,1,4 +female,22,fourth,blue,67,30,1,2,10,Yes,6,140,0,20 +female,20,third,blue,68,300,1,1,7,Yes,3,60,2,10 +male,19,second,hazel,72,45,0,0,70,Yes,0,30,0,2 +male,20,third,blue,68,250,0,1,1,Yes,5,100,12,12 +male,21,third,green,77,330,2,0,3,No,0,50,2,5 +female,22,other,blue,70,70,3,1,5,No,0,30,5,25 +female,21,third,blue,65,160,0,1,2,No,0,40,0,7 +male,20,second,blue,71,115,3,2,10,No,0,25,10,5 +male,19,first,brown,62,220,3,0,10,No,0,10,5,16 +male,20,second,blue,71,230,3,0,15,No,0,100,3,10 +male,19,first,blue,71,0,1,0,3,Yes,1,100,0,20 +male,21,third,other,73,79,0,1,2,Yes,10,96,12,3 +female,20,second,brown,68,30,0,3,10,No,0,20,2,4 +female,19,second,blue,61,368,2,0,10,No,0,60,2,5 +female,19,second,blue,65,2000,0,1,3,Yes,2,30,1,4 +female,18,first,green,69,0,1,0,10,Yes,3,20,0,5 +male,20,second,blue,74,30,0,1,35,No,0,1000,10,10 +male,24,fourth,blue,74,105,0,2,14,No,0,127,1,8 +female,21,third,green,63,43,1,0,10,Yes,5,20,2,1 +female,20,third,brown,67,300,2,0,15,No,0,150,1,5 +male,21,third,blue,72,120,0,2,10,Yes,10,100,0,5 +female,43,other,brown,65,60,0,0,0,No,0,0,0,25 +female,18,first,brown,67,0,0,2,5,Yes,5,15,0,15 +female,18,first,blue,74,237,0,0,35,Yes,6,46,12,28 +female,21,third,green,66,95,2,1,4,Yes,3,50,0,3 +male,20,second,blue,69,60,0,1,8,Yes,3,100,2,8 +male,20,third,blue,77,65,1,0,28,Yes,3,40,1,15 +male,19,second,blue,69,710,0,1,10,No,0,200,2,2 +female,21,fourth,green,67,400,0,2,20,No,0,4,0,8 +female,22,other,brown,60,30,3,0,8,Yes,5,150,0,4 +male,19,second,green,73,1100,0,1,0.5,Yes,5,20,3,2 +male,20,second,green,71,120,1,1,10,Yes,12,67,15,15 +female,19,second,hazel,64,370,2,1,20,No,0,100,0,2 +female,21,third,hazel,68,130,5,5,20,Yes,4.5,50,0,17.5 +male,21,third,brown,72,110,0,1,3,Yes,3,30,1,0.5 +female,22,fourth,blue,65,12,1,0,5,Yes,4,35,0,4 +female,19,second,hazel,62,0,1,0,7,Yes,4,300,0,21 +female,20,second,brown,69,100,1,0,10,Yes,21,100,0,5 +male,21,third,brown,70,200.2,0,1,5,No,0,50,0.5,5 +female,19,second,brown,68,87,1,2,5,No,0,35,0,10 +male,21,third,blue,74,90,0,1,10,No,0,10,10,10 +female,18,first,hazel,69,50,0,1,5,Yes,1,55,1,25 +female,19,second,green,67,35,1,0,1,No,0,57,2,10 +male,22,fourth,hazel,74,250,2,1,2,Yes,5,200,0,2 +male,21,third,blue,71,100,2,0,15,Yes,5,20,20,10 +male,20,third,brown,72,328,1,0,21,Yes,8,350,0,15 +female,21,third,hazel,64,64,1,1,3,No,0,50,1,5 +male,19,second,blue,76,220,1,0,10,Yes,5,70,2,7 +male,24,other,brown,66,180,2,0,10,No,0,150,15,20 +female,23,other,green,66,200,2,0,3,Yes,10,600,0,25 +female,20,third,brown,63,30,3,1,10,Yes,3.5,8,0,10 +female,20,third,hazel,67,90,0,1,10,Yes,5,35,1,8 +female,21,third,hazel,63,150,0,2,7,No,0,50,1,21 +male,22,fourth,hazel,72,60,3,0,3.5,Yes,6,50,,6.5 +male,20,second,hazel,68,0,1,1,8,No,0,90,2,9 +female,18,first,blue,63,102,1,1,5,No,0,50,0,3 +female,20,second,green,69,40,4,0,5,Yes,12,400,0,10 +female,18,first,hazel,62,72,0,2,25,Yes,15,52,1,2 +male,20,second,blue,72,120,2,1,10,Yes,8,5,0,15 +female,22,fourth,blue,72,75,1,0,12,Yes,3,110,0,2 +male,19,first,brown,70,510,1,1,10,Yes,5,30,1,10 +male,21,fourth,brown,72,400,1,1,5,No,0,65,2,12 +male,18,first,blue,69,120,5,0,6,Yes,15,30,25,10 +female,19,second,green,65,20,1,1,20,Yes,4,40,8,2 +male,24,first,brown,72,7000,0,1,40,No,0,100,20,15 +female,19,second,hazel,64,350,1,1,15,Yes,3,250,0,10 +female,20,third,hazel,72,0,0,2,15,Yes,3,5,5,5 +female,20,third,hazel,65,0,1,0,5,Yes,1.5,27,0,5 +female,20,third,brown,63,69,1,4,5,Yes,5,100,3,5 +female,22,fourth,green,64,180,2,0,3,No,0,50,0,12 +female,20,third,blue,65,65,2,0,3,Yes,3,30,0,6 +female,20,third,blue,60,0,1,1,8,No,0,50,5,10 +female,21,fourth,brown,62,460,1,2,10,Yes,4,25,0,1 +male,22,third,blue,72,40,0,1,10,No,0,75,5,5 +male,20,third,blue,74,240,1,1,2,Yes,4,50,4,4 +female,22,other,hazel,63,365,0,1,20,Yes,5,180,3,8 +female,19,second,brown,61,2300,1,1,5,No,0,35,0,7 +female,20,second,blue,69,63,3,2,5,Yes,3,200,1,2 +female,22,fourth,green,66,40,0,2,10,Yes,5,35,1,15 +male,22,other,blue,72,366,2,0,15,Yes,10,1500,5,15 +female,21,third,brown,69,33,1,0,4,Yes,3.5,20,0,6 +male,22,fourth,blue,72,35,2,1,15,Yes,3,75,4,1 +female,20,second,blue,65,8,0,0,14,No,0,50,0,25 +female,21,fourth,green,64,250,1,1,8,Yes,4,70,0,4 +female,21,fourth,hazel,63,350,1,0,10,No,0,250,0,3 +female,19,second,brown,62,160,1,0,2,Yes,4,35,2,5 +female,20,third,brown,67,286,0,2,2,No,0,18,0,8 +male,21,fourth,hazel,70,90,3,2,10,Yes,2,4,15,3 +female,22,other,brown,70,150,1,1,8,No,0,150,0,2 +female,21,fourth,green,66,50,4,1,5,Yes,3,25,1,1 +female,20,third,brown,62,205,0,1,6,Yes,4,60,0,2 +male,19,second,hazel,72,37,2,2,4,Yes,20,100,2,2 +female,19,second,green,64,75,1,1,14,Yes,3,25,0,4 +female,24,other,blue,66,45,0,0,8,No,0,30,0,14 +female,21,fourth,blue,64,75,1,0,15,No,0,30,2,20 +male,20,third,green,69,350,0,1,1,Yes,7,100,4,4 +female,20,second,brown,60,1700,0,1,4,No,0,30,0,5 +male,23,other,blue,73,150,3,2,3,No,0,575,1,6 +female,20,third,brown,65,200,0,1,16,Yes,3,60,1,8 +male,22,third,brown,70,140,2,1,5,No,0,30,10,10 +female,22,other,blue,65,400,0,1,10,No,0,600,0,0 +male,20,third,hazel,76,4500,1,0,10,Yes,7,30,10,10 +female,22,fourth,green,68,200,0,1,8.5,Yes,9,50,0,2 +male,40,other,blue,76,500,1,0,0,No,0,100,21,15 +female,19,second,hazel,62,175,1,2,12,Yes,3,10,1,19 +male,22,other,brown,69,15,0,1,10,No,0,100,10,10 +male,20,third,hazel,71,0,0,2,20,No,0,5,0,5 +male,20,third,green,75,176,1,2,21,Yes,5,0,1,14 +female,19,third,brown,67,42,0,3,4,Yes,6,20,1,6 +female,19,second,blue,72,198,2,2,45,Yes,5,167,1,1 +male,21,fourth,blue,68,100,0,2,15,No,0,1500,2,10 +male,20,second,hazel,76,100,1,1,4,Yes,5,6,8,16 +female,21,fourth,brown,62,185,4,4,2,No,0,40,0,2 +female,39,fourth,hazel,67,36,1,1,8,No,0,30,0,14 +female,20,third,blue,63,250,1,2,10,No,0,100,2,8 +male,24,third,hazel,71,120,4,0,12,Yes,10,200,3,12 +male,41,other,blue,74,0,1,1,2,No,0,25,2,20 +male,26,third,brown,68,20,0,1,20,Yes,10,75,4,6 +female,21,fourth,brown,69,210,1,0,5,Yes,2,12,1,3 +female,20,third,blue,60,90,0,4,20,Yes,7,150,0,2 +male,21,fourth,brown,70,96,1,1,8,Yes,2,50,2,6 +male,20,third,green,67,48,0,1,3,Yes,2,150,0,3 +male,21,fourth,blue,69,220,0,1,4,No,0,10,10,2 +female,20,third,green,63,430,1,2,2,No,0,10,0,2 +female,21,fourth,brown,66,60,0,2,1,No,0,30,0,2 +female,20,third,blue,65,200,1,1,5,No,0,50,0,5 +female,20,second,green,68,0,0,1,20,Yes,3,84,0,4 +female,27,second,hazel,62,244,2,0,5,Yes,4,55,0,10 +male,20,third,blue,71,450,1,1,7,No,0,30,0,9 +male,21,other,brown,69,170,2,0,15,Yes,2,20,0,10 +female,19,second,blue,67,120,0,1,15,No,0,100,15,30 +male,19,second,brown,68,3000,1,1,7,No,0,0,12,0 +male,21,fourth,brown,58,1000,3,0,10,Yes,10,80,10,25 +female,20,third,blue,62,330,2,0,5,No,0,120,0.5,2 +female,19,second,brown,62,200,2,0,10,Yes,3,20,0,1 +female,20,third,blue,66,1200,0,0,10,Yes,5,100,5,10 +male,20,third,blue,77,22,2,0,13,Yes,4.5,200,1,9 +male,21,third,hazel,73,138,1,0,8,Yes,5,100,10,2 +female,19,second,green,58,40,0,2,4,No,0,36,0,5 +male,20,third,hazel,72,100,0,1,40,Yes,4,200,10,4 +female,20,second,blue,64,120,2,1,5,No,0,50,0,2 +male,21,third,other,75,45,0,2,8,Yes,8,200,0,5 +female,20,third,hazel,65,90,1,1,18,Yes,0,40,0,2 +male,19,second,blue,73,120,3,1,15,Yes,10,1000,2,8 +female,18,first,brown,64,35,1,0,7.5,No,0,100,0,15 +male,20,second,hazel,73,80,2,1,5,No,0,30,5,10 +female,20,third,brown,69,110,0,3,15,Yes,5,50,2,8 +male,20,third,hazel,72,316,0,1,4,Yes,10,300,3,15 +female,19,second,blue,64,45,0,1,4,Yes,4,75,0,2 +male,24,fourth,blue,68,453,2,1,7,Yes,6,300,8,4 +female,23,other,blue,64,25,1,1,20,Yes,5,30,4,3 +female,20,third,hazel,68,90,1,1,4,Yes,5,50,0,10 +male,21,fourth,brown,67,30,1,0,24,No,0,100,3,20 +female,20,third,hazel,66,300,0,2,10,No,0,100,2,10 +male,20,third,brown,70,10,2,0,5,No,0,0,5,5 +female,22,fourth,brown,63,130,1,0,3,No,0,300,10,10 +male,20,third,blue,70,181,0,2,25,Yes,5,10,3,10 +male,19,second,hazel,66,30,1,2,20,No,0,300,2,20 +female,20,third,blue,70,73,2,0,5,No,0,30,2,10 +female,22,other,brown,71,0,2,0,2,Yes,5,50,0,5 +female,19,second,hazel,68,180,1,1,7,No,0,30,1,4 +male,20,third,blue,70,250,0,1,7,Yes,5,35,3,3 +male,20,third,blue,71,168,0,1,5,No,0,20,1,16 +male,19,second,blue,76,134,0,0,15,No,0,300,4,14 +male,24,third,blue,69,45,3,2,20,Yes,20,45,0,2 +male,27,fourth,blue,69,150,0,3,15,No,0,30,5,10 +male,22,fourth,hazel,75,200,0,1,1,Yes,2,150,1,10 +male,22,fourth,brown,77,50,1,1,3,No,0,124,0,3 +female,22,other,green,70,45,2,2,10,Yes,4,100,2,12 +male,20,third,brown,70,55,1,0,6,No,0,25,9,12 +female,19,second,green,80,107,3,0,10,No,0,50,0,9 +female,20,third,blue,64,27.5,1,0,7.5,No,0,100,0,2.5 +male,19,second,brown,69,240,1,1,10,No,0,215,2,2 +female,19,second,blue,65,160,1,1,10,Yes,4.5,30,0,5 +male,20,third,brown,70,118,2,0,20,No,0,100,2,3 +female,20,third,green,65,185,4,1,7.5,Yes,4,75,3,2.5 +female,21,third,blue,63,0,1,1,3,Yes,8,48,1,10 +female,20,third,hazel,68,99.6,1,0,30,No,0,120,10,21 +male,20,third,blue,79,30,0,1,5,Yes,15,50,15,35 +male,39,third,brown,68,525,1,1,12,Yes,2,30,1,5 +female,19,second,blue,63,90,3,1,8,No,0,25,0,7 +female,19,second,hazel,65,72,1,1,3,Yes,4,81,3,15 +male,21,fourth,blue,70,185,1,0,5,Yes,3,17,1,4 +male,21,fourth,blue,73,200,0,1,10,Yes,6,150,3,5 +female,19,second,green,67,150,2,1,18,No,0,30,0,16 +female,19,second,brown,67,135,1,1,6,Yes,2,43,0,1 +female,21,third,brown,70,90,0,1,2,No,0,15,0,2 +male,20,third,other,66,0,0,1,8,No,0,100,8,6 +male,23,other,green,69,20,2,2,4,Yes,6,43,3,2.5 +male,20,third,brown,69,370,0,2,10,No,0,120,1,5 +male,22,first,brown,72,1000,0,1,10,No,0,50,20,10 +male,21,third,brown,71,160,1,0,6.5,Yes,6,150,0.5,3 +female,20,second,green,64,150,0,1,4,Yes,6,100,10,12 +female,24,other,brown,60,700,1,2,10,No,0,25,2,4 +female,19,second,blue,62,45,1,1,2,No,0,73,4,3 +female,19,second,green,66,350,0,1,10,Yes,3,50,0,8 +male,20,third,blue,71,300,0,1,4,Yes,12,0,1,4.5 +female,20,third,brown,67,132,0,0,9,Yes,5,37,0,3.5 +female,19,second,blue,66,90,2,0,15,Yes,6.5,50,0,2 +female,20,third,green,72,320,2,0,7,No,0,60,0,14 +female,20,third,blue,63,220,2,2,1,Yes,4,0,0,3 +female,21,fourth,brown,65,60,3,1,1,No,0,200,0,16 +female,22,fourth,blue,67,175,4,2,6,No,0,175,3,28 +male,21,third,blue,72,140,1,0,3,No,0,25,0,10 +female,21,fourth,brown,66,10,0,1,15,No,0,35,0,10 +male,23,other,blue,72,30,0,1,7,Yes,8,60,8,21 +female,19,second,hazel,65,190,1,0,10,Yes,7,123,2,2 +male,22,fourth,hazel,69,10,1,2,8,Yes,6,150,0,1 +female,18,second,blue,66,889,2,0,4,No,0,35,2,4 +female,20,third,green,67,120,2,0,5,No,0,200,0,5 +male,21,fourth,brown,70,1400,1,0,12,Yes,8,4,5,8 +male,20,other,brown,69,65,1,2,6,No,0,130,4,8 +female,20,third,hazel,65,120,2,0,3,Yes,10,30,0,6 +female,22,other,green,64,150,1,2,2,Yes,4,10,0,20 +female,19,second,green,65,25,1,0,25,Yes,7,20,2,5 +female,20,third,hazel,68,400,0,3,14,Yes,7,100,0,6 +female,19,third,blue,67,40,2,1,12,Yes,3,30,1,3 +male,20,third,brown,70,209,1,1,3,Yes,4,450,1,4 +female,19,second,blue,69,40,0,2,10,Yes,5,50,1,4.5 +female,19,second,blue,66,180,0,2,6,Yes,3,20,1,15 +male,21,third,blue,69,100,1,1,1,Yes,5,50,0,2 +female,19,second,other,62,45,0,3,3,No,0,25,1,15 +male,24,third,green,73,350,2,1,5,Yes,10,45,2,1 +male,23,fourth,blue,64,40,1,1,30,No,0,50,1,3 +female,21,fourth,hazel,67,45,2,0,7,Yes,4,40,0,5 +female,20,third,blue,68,154,2,0,20,Yes,3,35,2,4 +female,19,second,green,64,45,1,1,4,No,0,200,0,6 +female,20,third,brown,65,0,1,1,3,No,0,50,0,3 +female,20,third,hazel,66,50,1,0,14,Yes,4.5,100,0,4 +female,19,second,blue,67,130,0,2,3,Yes,3,90,0,3 +male,20,second,blue,70,120,1,3,15,Yes,10,100,7,9 +female,22,third,brown,64,6000,0,3,15,No,0,100,15,10 +female,20,third,blue,65,43,0,2,4,Yes,3,70,0,10 +female,19,second,blue,72,20,1,1,35,No,0,75,7,28 +male,19,second,other,71,40,3,1,3,Yes,8,10,2,10 +male,20,second,brown,70,0,1,1,10,Yes,10,50,0,40 +female,26,third,hazel,68,150,0,1,12,Yes,4,250,2,12 +female,20,third,green,69,90,2,1,1,Yes,1,10,0,10 +male,20,third,blue,71,120,0,0,5,No,0,125,2,20 +female,19,second,brown,68,200,1,1,7,Yes,5,200,0.5,3 +male,18,first,blue,68,25,1,1,12,No,0,20,21,15 +female,20,third,blue,65,1000,1,0,20,No,0,175,2,5 +female,21,fourth,brown,63,65,2,3,10,No,0,50,5,5 +male,22,other,brown,69,60,1,1,28,Yes,2,43,2,20 +male,20,third,hazel,75,180,2,1,5,Yes,5,60,15,15 +female,22,fourth,green,66,0,2,0,3,Yes,5,20,5,10 +female,20,third,green,72,250,1,1,1,No,0,20,1,12 +male,22,other,brown,66,120,1,1,2,Yes,5,50,3,3 +female,22,fourth,blue,66,180,1,1,6,No,0,25,0,3 +male,19,second,blue,73,40,0,1,20,No,0,100,3,1 +female,20,third,brown,61,230,1,0,5,No,0,10,20,15 +female,20,third,brown,61,200,3,6,6,Yes,9,78,5,10 +female,31,fourth,brown,62,34,1,0,15,Yes,3,50,0,3 +male,21,third,blue,71,35,1,1,8,No,0,10,10,10 +male,20,third,hazel,72,180,0,0,5,No,0,100,10,10 +female,19,second,blue,67,60,2,1,21,Yes,5,200,4,14 +female,19,second,brown,66,60,2,1,20,No,0,100,1,21 +male,20,third,brown,74,235,1,1,10,Yes,10,189,0,3 +male,26,first,brown,70,5000,0,1,20,No,0,10,10,10 +male,20,third,brown,70,2500,0,0,10,Yes,5,50,10,20 +female,20,third,brown,64,300,0,3,10,No,0,50,0,10 +female,18,first,brown,67,35,0,1,8,No,0,30,3,5 +female,21,third,brown,64,50,1,3,2,No,0,100,0,5 +male,22,fourth,hazel,76,45,1,1,4,Yes,5,150,2,2 +male,20,third,blue,72,180,1,0,6,No,0,100,2,6 +female,19,second,green,64,100,1,1,2,No,0,50,1,2 +male,21,third,blue,70,100,2,0,2,Yes,7,10,0,10 +male,19,second,brown,71,388,0,1,10,No,0,350,0,4 +male,24,third,brown,77,90,2,0,2,Yes,4,50,0,3 +female,22,fourth,hazel,65,120,2,1,10,Yes,6,30,0,0 +male,21,fourth,blue,66,10,1,2,25,Yes,5,60,10,10 +male,22,other,blue,73,85,2,1,12,Yes,3,35,1,8 +male,21,fourth,blue,67,110,3,0,10,Yes,8,200,0,6 +female,21,third,brown,67,30,0,2,8,Yes,4,128,0,2 +female,20,second,green,68,105,0,1,6,Yes,5,56,0,5 +male,19,second,blue,74,130,2,0,15,Yes,4,20,10,10 +female,21,fourth,hazel,67,0,0,1,10,Yes,5,40,2,21 +male,20,third,blue,68,135,2,0,5,No,0,40,12,4 +female,19,second,blue,67,120,1,2,6,Yes,0,125,0,4 +female,19,third,blue,69,35,1,1,10,Yes,4,20,0,0 +male,20,third,brown,65,0,1,0,10,No,0,35,2,8 +male,19,second,brown,76,1381,0,1,5,Yes,3.5,36,10,15 +male,19,second,blue,69,140,1,1,10,Yes,10,20,15,5 +female,19,second,hazel,64,120,0,1,5,Yes,4.5,50,10,13 +female,20,third,blue,67,170,0,1,3,Yes,6,100,3,7 +female,20,third,blue,64,180,1,0,10,Yes,7,20,1,5 +female,20,third,hazel,70,210,0,1,7,No,0,50,0.5,5 +male,20,third,brown,72,113,0,1,5,Yes,5,50,0,4 +female,22,other,brown,61,326,1,1,65,No,0,55,20,21 +female,20,third,green,69,192,1,2,10,Yes,8,50,0,6 +male,22,first,brown,72,40,0,2,21,No,0,400,24,21 +male,20,third,blue,70,65,2,1,6,No,0,25,0,2 +female,19,second,brown,61,4000,0,1,10,No,0,60,0,0 +male,22,fourth,hazel,71,15,2,1,10,Yes,7,10,0,5 +male,20,third,brown,76,375,1,1,20,Yes,8,35,1,5 +male,20,third,brown,72,20,2,1,12,Yes,8,300,0,10 +female,19,second,blue,68,350,1,0,50,No,0,50,0.5,10 +female,20,third,brown,66,200,1,0,10,Yes,5,60,0,10 +male,19,second,blue,72,75,1,2,4,No,0,5,2,5 +male,19,second,brown,72,440,0,3,10,No,0,400,1,8 +male,21,third,hazel,75,200,1,3,5,No,0,20,15,20 +female,20,third,blue,66,400,0,1,6,Yes,4,150,1,0 +female,21,first,brown,66,7000,2,0,4,No,0,87,20,56 +female,20,third,brown,63,800,0,0,10,Yes,9,10,0,20 +female,19,second,blue,71,361.5,0,1,25,Yes,7,200,0,10 +male,21,fourth,brown,69,130,0,0,20,No,0,400,20,35 +female,20,third,brown,67,60,1,0,10,Yes,4,40,1,2 +female,21,third,brown,67,130,1,1,10,Yes,3,300,0,14 +male,22,fourth,blue,72,150,1,2,1,No,0,50,2,10 +female,19,second,blue,70,50,1,2,15,Yes,4,75,0,4 +male,21,second,brown,70,3000,1,0,5,No,0,0,10,2 +female,21,third,green,65,40,0,0,12,Yes,4,25,0,4 +female,20,third,brown,66,30,2,1,12,Yes,9,100,2,2 +male,22,fourth,blue,74,805.84,2,0,7,No,0,30,0,0 +female,20,third,blue,68,175,2,3,6,Yes,5,15,2,10 +male,18,first,blue,73,40,1,0,8,No,0,200,12,8 +female,20,third,hazel,60,250,0,0,6,Yes,3,100,1,5 +male,20,third,green,72,160,0,1,10,Yes,7,100,1,2 +female,20,third,brown,56,165,1,3,16,No,0,80,0,14 +female,21,fourth,green,66,120,1,1,15,Yes,8,100,4,8 +female,20,third,hazel,70,333,1,0,7,No,0,50,0.5,5 +female,18,first,hazel,62,120,2,2,8,Yes,2,120,0,2 +female,22,fourth,brown,67,30,1,4,8,No,0,35,2,20 +female,20,third,brown,67,134,1,1,4,Yes,3,27,2,2 +female,19,second,green,69,90,1,1,4,Yes,5,20,0,15 +female,20,third,blue,67,225,3,0,4,Yes,5,65,2,7 +female,21,third,blue,66,150,1,0,20,Yes,2,100,1,7 +female,22,other,blue,67,927,3,2,15,Yes,5,250,0,0 +female,21,other,brown,60,210,0,1,1,No,0,150,0,15 +female,20,third,green,66,60,3,1,1,Yes,3,10,0,10 +female,19,second,brown,66,350,0,1,20,No,0,45,1,10 +male,22,other,blue,72,110,1,2,15,Yes,4,150,1,14 +male,21,third,green,71,135,1,1,8,Yes,3,156,10,6 +female,20,third,hazel,61,30,1,1,15,Yes,7,60,1,9 +male,25,other,blue,71,37,1,3,5,No,0,25,0,0 +female,21,fourth,brown,66,8,1,1,1,Yes,0,30,0,2 +female,20,third,green,66,250,1,0,3,Yes,5,100,0,10 +female,20,third,brown,63,750,1,0,21,Yes,6,64,0,3 +male,21,third,blue,69,200,0,2,5,Yes,3,100,8,15 +female,23,other,hazel,62,180,1,0,5,No,0,40,0,10 +female,19,second,brown,66,200,0,1,20,No,0,170,0,2 +female,20,third,brown,68,330,0,2,25,Yes,4,35,4,20 +female,20,third,blue,71,150,1,2,21,No,0,2,2,14 +female,21,fourth,brown,60,250,1,0,5,No,0,120,0,5 +female,20,second,brown,63,250,2,1,18,Yes,6,90,0,0 +male,23,other,green,74,40,4,1,40,Yes,2,100,5,20 +female,19,second,blue,70,225,1,1,10,Yes,3,45,0,2 +female,20,third,brown,69,100,1,1,4,Yes,2,10,1,3 +male,21,third,blue,70,198,2,0,85,Yes,4,50,1,15 +male,20,third,blue,72,230,0,1,3,Yes,4.5,30,10,5 +male,38,first,other,67,6000,2,0,3,No,0,0,0,7 +female,21,fourth,hazel,62,2000,1,1,1,Yes,22,150,0,4 +female,22,fourth,blue,65,200,0,1,3,Yes,3,30,0,6 +male,21,fourth,brown,70,375,0,2,4,Yes,8,150,2,10 +male,19,second,hazel,72,120,1,1,16,Yes,9,70,3,5 +male,21,third,brown,75,110,0,1,15,No,0,25,3,15 +female,20,third,hazel,68,150,2,2,10,No,0,200,2,10 +female,17,first,brown,66,550,1,1,3,No,0,100,0,10 +female,20,third,green,63,210,2,2,23,Yes,5,600,0,0 +male,21,fourth,brown,72,300,1,0,10,Yes,10,200,3,15 +male,21,fourth,green,76,40,0,2,4,Yes,6,330,10,6 +male,20,third,blue,74,208,1,1,10,Yes,9,120,1,4 +female,20,fourth,brown,65,0,4,4,10,Yes,3,35,1,1 +female,19,second,green,68,40,2,0,15,Yes,10,50,0,4 +female,20,third,brown,62,2300,1,0,20,No,0,10,5,70 +female,19,second,hazel,63,250,1,0,10,Yes,4,100,0.5,4 +male,25,third,hazel,71,40,0,1,3,No,0,300,0,15 +male,20,third,blue,77,360,0,1,10,Yes,7,0,5,10 +female,20,third,brown,67,62,2,1,10,No,0,50,3,30 +male,25,fourth,blue,74,125,1,2,8,Yes,8,0,1,12 +female,21,fourth,brown,62,35,1,0,6,Yes,3,400,4,6 +male,21,other,hazel,72,93,1,0,20,Yes,4.5,10,4,10 +male,20,second,brown,72,212,3,3,2,Yes,3,20,1,2 +male,21,fourth,brown,70,200,0,1,5,No,0,40,5,5 +male,19,second,brown,68,180,4,0,8,Yes,8,100,1,30 +male,20,third,green,74,65,1,1,2,No,0,30,5,15 +male,21,third,hazel,67,45,2,1,3.5,Yes,6,250,2,3 +female,19,third,brown,71,620,1,0,21,Yes,8,100,0,2 +female,20,third,green,63,120,1,1,15,Yes,6,40,0,10 +male,19,second,blue,71,180,0,1,14,Yes,9,60,10,21 +female,21,fourth,green,64,60,0,2,3,Yes,6,2,0,9 +male,24,second,blue,72,90,1,1,4,Yes,6,100,4,10 +female,19,second,brown,61,45,2,0,2,Yes,5,20,0,14 +male,22,other,green,73,0,0,0,15,No,0,40,2,1 +female,20,third,hazel,63,0,0,3,3,Yes,9,15,2,7 +female,19,second,other,67,110,2,1,4,Yes,9,25,0,5 +female,19,second,brown,64,25,0,1,9,Yes,9,100,0,9 +male,20,second,other,72,5900,1,0,8,Yes,1,15,2,12 +male,20,third,hazel,70,212,0,2,20,No,0,200,1,12 +male,21,fourth,hazel,72,320,0,0,20,Yes,6,50,10,10 +female,36,fourth,blue,71,30,0,3,10,No,0,50,2,5 +female,23,fourth,green,69,120,0,1,3,Yes,3,100,3,3 +female,20,third,green,66,215,1,0,2,Yes,3.5,50,2,3 +female,19,second,brown,64,100,1,1,14,Yes,6,40,0,5 +male,19,second,hazel,72,100,0,1,2,Yes,8,30,10,10 +female,21,fourth,green,66,40,1,0,10,Yes,4,150,0.5,4 +female,20,third,green,63,210,0,1,30,Yes,3,50,5,21 +male,22,fourth,blue,70,100,0,1,15,Yes,7.5,300,0,10 +male,23,other,hazel,70,220,2,1,2,Yes,15,50,15,7 +male,20,third,blue,68,200,0,1,1,No,0,60,3,10 +female,21,fourth,hazel,67,240,1,1,20,Yes,3,30,2,5 +male,24,other,green,70,456,1,1,15,No,0,50,15,5 +female,23,other,brown,65,20,2,0,7,No,0,75,3,7 +female,20,third,hazel,65,30,0,1,7,Yes,3,100,0,10 +male,20,second,hazel,74,185,3,1,5,No,0,5,0.5,3 +male,19,second,green,78,140,0,1,8,No,0,20,0,7 +female,20,second,blue,63,60,0,2,10,Yes,1,35,1,7 +female,21,third,brown,67,85,1,0,5,Yes,5,10,0,1 +male,18,first,blue,72,100,1,1,10,Yes,4,100,35,35 +female,19,second,brown,68,35,1,1,7,Yes,6,30,2,13 +male,21,third,green,70,150,0,1,4,Yes,3,75,4,4 +male,21,third,blue,72,120,2,2,5,No,0,40,2,15 +female,21,fourth,blue,63,215,3,0,4,Yes,4,40,2,3 +male,20,third,brown,71,243,1,0,20,Yes,8,120,0,3 +female,23,other,blue,63,90,2,1,10,Yes,4,75,1,20 +female,21,third,blue,62,40,0,1,20,Yes,12,30,0,5 +male,21,second,brown,67,100,0,2,15,Yes,4,85,3,8 +male,19,first,green,74,40,1,0,10,No,0,9,25,10 +male,21,third,brown,70,0,0,0,19,No,0,100,6,18 +female,18,first,brown,68,170,4,2,10,No,0,100,3,35 +female,20,second,blue,69,113,1,0,20,No,0,50,4,8 +male,23,fourth,brown,75,100,1,1,5,Yes,5,25,0,5 +female,19,first,green,64,46,1,2,30,No,0,50,2,0 +male,21,third,blue,79,40,0,1,5,Yes,5,50,20,20 +male,22,fourth,green,76,45,3,3,4,Yes,4,300,6,5 +male,21,third,hazel,72,82,3,1,8,Yes,4,25,1,5 +female,21,third,blue,65,0,4,2,35,Yes,3,100,0,2 +female,19,second,brown,69,100,0,1,6,Yes,2,100,1,3 +female,20,second,hazel,68,200,1,0,15,Yes,4.5,30,0,0.5 +female,28,third,blue,63,35,2,0,4,Yes,3,75,1,7 +female,22,fourth,blue,68,95,1,0,10,Yes,4,100,3,15 +female,20,third,hazel,65,40,2,0,15,Yes,3,40,1,18 +female,21,third,blue,68,15,1,1,3,Yes,10,100,0,15 +female,21,third,blue,69,98,0,3,13,Yes,6,44,0,2.5 +male,20,second,hazel,70,99,0,2,20,No,0,2,10,20 +male,19,first,blue,61,60,3,1,20,Yes,6,30,1,5 +male,20,third,blue,72,300,0,1,10,No,0,0,20,20 +female,22,fourth,blue,64,87,0,1,2,No,0,1400,0,2 +female,20,third,blue,69,345,1,0,5,Yes,5,20,5,15 +female,20,second,blue,63,200,2,0,10,Yes,10,100,1,2 +male,20,second,brown,73,100,3,0,20,Yes,8,10,20,7 +male,21,third,hazel,76,150,1,2,6,Yes,4.5,20,6,1 +male,19,second,blue,74,150,1,1,3,No,0,30,8,15 +female,18,first,blue,65,359,2,1,2,No,0,30,0,10 +female,27,other,blue,62,175,2,0,20,Yes,5,35,2,10 +male,18,first,blue,71,30,3,0,30,Yes,8,7,0,5 +male,19,second,brown,71,160,0,0,14,No,0,12,0,1 +female,22,other,brown,66,100,0,1,7.5,No,0,30,7.5,1 +female,18,first,blue,65,146,4,0,5,Yes,8,20,2,20 +male,20,second,brown,73,200,0,0,28,Yes,7,150,0,7 +female,23,other,blue,67,300,1,1,10,Yes,4,40,0,3 +male,18,first,blue,70,50,1,0,4,No,0,5,10,5 +male,22,fourth,blue,72,250,1,1,5,No,0,20,0,15 +female,19,second,green,67,170,1,0,4,Yes,5,30,0,2 +male,20,second,blue,77,75,2,0,14,No,0,45,2,15 +female,20,third,blue,68,175,1,2,7,No,0,75,7,6 +female,19,second,brown,69,130,0,2,5,No,0,150,2,10 +female,20,third,blue,68,10,2,1,5,No,0,75,1,5 +male,22,second,other,70,6000,1,2,80,No,0,17,15,20 +female,20,third,blue,71,60,0,1,2,No,0,50,0,15 +female,21,third,hazel,68,60,2,3,5,Yes,4,50,0,5 +male,20,second,blue,74,323,1,0,8,Yes,12,75,0,8 +female,20,second,hazel,64,150,0,1,30,Yes,5,35,0,1 +female,19,second,hazel,65,220,3,0,30,Yes,5,94,0,6 +female,20,second,blue,68,500,1,0,3,No,0,40,0,5 +female,21,fourth,blue,67,45,0,2,20,No,0,40,1,4 +male,18,first,blue,72,153,1,1,15,No,0,50,30,7 +female,18,first,blue,66,140,1,3,5,Yes,2,20,10,0 +male,20,second,brown,76,184,1,2,15,Yes,4,20,5,25 +female,20,third,brown,66,3000,3,0,10,No,0,100,5,20 +female,23,other,blue,67,4,0,0,24,Yes,5,30,0,14 +male,25,fourth,brown,66,10000,0,1,10,Yes,3,20,3,10 +female,19,second,hazel,66,50,3,3,4,Yes,2,50,1,14 +female,21,third,green,67,189,1,0,15,Yes,6,35,1,10 +female,18,first,blue,63,175,1,1,10,No,0,30,0,0 +female,20,second,brown,65,60,1,2,10,No,0,20,0,14 +female,18,first,hazel,64,140,2,0,14,Yes,0.5,25,0,0.5 +female,19,second,blue,67,300,1,1,15,Yes,10,25,0,3 +female,22,fourth,green,69,40,1,1,40,No,0,175,1,5 +female,19,second,blue,67,80,1,2,15,Yes,5,25,1,15 +female,18,second,blue,65,590,1,1,15,Yes,4,60,0,3 +female,20,third,brown,66,45,4,2,40,Yes,5,10,3,8 +female,19,second,green,65,211,0,4,6,No,0,60,7,7 +female,19,"first""",blue,68,250,2,0,12,Yes,5,24,0,7 +female,19,second,blue,68,370,0,3,25,No,0,25,0,14 +female,20,second,green,63,101,1,2,2,Yes,0,20,0,3 +female,20,second,brown,62,220,1,0,10,No,0,10,0,3 +female,20,third,hazel,62,330,0,0,8,Yes,5,20,4,6 +female,21,third,brown,61,0,0,2,2.5,Yes,5,50,1,5 +female,18,first,brown,64,5,1,0,12,Yes,5,26,1,4 +female,21,third,brown,64,31,1,0,2,No,0,25,0,12 +female,39,fourth,hazel,67,40,1,1,4,Yes,5,30,0,10 +male,19,second,hazel,75,0,1,2,10,Yes,6,20,24,24 +female,19,second,blue,68,155,1,1,3.5,No,0,55,0.5,20 +female,20,second,blue,65,40,0,1,6,Yes,3.5,20,0,6 +female,24,other,green,70,140,5,1,8,Yes,8,45,0,8 +male,19,third,hazel,69,200,1,0,1,Yes,2,40,5,12 +female,20,second,hazel,62,48,1,0,3,Yes,2,45,2,8 +male,20,second,hazel,78,120,2,0,15,Yes,8,200,0,2 +female,21,third,green,67,100,1,4,5,Yes,4,25,0,30 +male,21,second,blue,70,60,0,1,10,No,0,30,0,5 +female,22,fourth,brown,65,222,2,1,5,Yes,3,10,0,10 +male,21,third,hazel,72,200,1,1,4,No,0,10,4,12 +female,21,third,brown,62,96,0,1,1,Yes,3,52,0,3 +female,20,second,green,62,0,1,0,10,Yes,2,25,0,5 +male,20,second,blue,68,225,0,2,5,Yes,4,15,2,12 +female,21,third,green,62,126,0,0,2,Yes,5,20,0,4 +male,21,fourth,blue,71,145,0,3,2,Yes,5,15,0,12 +female,22,fourth,brown,63,0,1,0,3,Yes,1,60,0,20 +male,21,third,blue,74,200,1,0,2,Yes,5,93,1,3 +male,21,third,brown,65,200,1,1,24,Yes,4,200,1,8 +female,22,fourth,hazel,68,60,1,0,12,Yes,3,15,1,12 +male,19,first,blue,77,350,2,1,2,Yes,8,30,1,2 +male,21,third,blue,70,150,2,1,15,No,0,120,5,3 +male,20,second,hazel,70,60,0,1,5,No,0,40,1,8 +male,20,second,hazel,71,193,1,1,4,No,0,100,8,4 +male,20,second,green,76,180,0,2,6,Yes,13,40,1,5 +female,20,second,hazel,69,25,1,1,10,Yes,6,300,0,8 +male,20,third,brown,70,0,0,1,10,No,0,25,20,4 +male,20,second,hazel,72,200,2,1,17.5,Yes,9,40,2,14 +female,20,third,blue,61,35,1,0,3,No,0,30,0,8 +male,19,second,blue,71,201,0,1,20,No,0,10,9,14 +female,21,third,brown,68,20,1,0,5,No,0,30,0,4 +male,21,third,blue,73,117,1,2,10,Yes,3,10,0,5 +male,24,third,brown,74,9,1,1,4,Yes,5,400,0,8 +female,26,fourth,green,63,7,1,0,4,No,0,250,0,1 +female,47,fourth,brown,63,0,5,2,4,Yes,2,50,0,4 +male,20,second,blue,73,189,1,0,5,Yes,6,200,0,4 +male,20,second,brown,70,50,1,0,1,No,0,25,5,10 +female,25,other,brown,62,1035.6,0,2,10,No,0,100,0,20 +male,21,third,hazel,71,84,1,2,10,Yes,5,12,4,2 +male,18,first,brown,73,1528,0,1,60,No,0,25,3,22 +female,20,second,brown,63,150,2,2,10,Yes,3,10,1,1 +male,21,fourth,green,73,30,2,0,15,No,0,70,2,12 +male,21,fourth,other,73,80,2,2,10,Yes,4,100,0,2 +male,20,third,blue,70,220,1,1,3,Yes,4,50,5,10 +male,20,second,hazel,72,115,0,2,2,Yes,30,25,0.25,0.5 +female,20,third,hazel,68,33,1,4,5,Yes,4,50,0,7 +male,20,second,green,73,300,4,1,4,Yes,9,1,2,4 +female,20,second,blue,69,190,1,0,7,Yes,3,250,2,10 +male,21,fourth,blue,71,326,1,0,10,Yes,4,60,2,15 +female,21,fourth,hazel,67,30,1,1,20,No,0,10,0,10 +male,28,second,brown,67,17,1,1,2,No,0,35,1,4 +male,21,third,brown,75,90,2,0,1,Yes,6,50,4,15 +female,20,second,blue,64,220,1,0,20,Yes,6,25,2,10 +male,22,fourth,brown,72,15,2,0,10,No,0,100,10,10 +female,21,third,blue,63,120,0,0,5,No,0,10,10,30 +female,20,third,hazel,67,100,5,1,3.5,Yes,8.5,12,0,11 +female,19,second,green,67,195,1,0,6,Yes,8,25,0,4 +female,22,fourth,hazel,66,60,1,1,2,No,0,100,0,10 +female,19,second,brown,68,210,1,0,5,Yes,10,30,1,6 +female,21,fourth,green,65,185,1,2,5,Yes,6,3,0,10 +male,20,second,hazel,72,50,2,0,1,No,0,100,6,10 +male,27,fourth,brown,72,800,3,0,10,No,0,125,5,10 +male,21,fourth,blue,75,40,0,0,5,Yes,7,18,2,15 +female,27,third,hazel,67,0,2,1,2,No,0,108,1,4 +female,18,first,blue,68,250,1,0,20,No,0,20,7,30 +female,20,second,brown,61,3500,1,0,5,No,0,250,2,2 +male,22,fourth,hazel,72,158,1,0,12,Yes,0,300,0,2 +female,19,second,blue,72,150,2,0,7,Yes,12,20,2,10 +female,18,first,blue,61,25,0,2,6,No,0,65,0,10 +male,20,third,hazel,69,120,0,2,3,No,0,50,15,15 +female,21,fourth,brown,70,25,0,0,10,Yes,10,100,0,8 +female,19,second,green,66,215,0,1,10,Yes,6,250,0,0 +female,20,third,blue,61,30,1,1,10,No,0,70,3,10 +male,21,third,blue,69,185,1,0,20,Yes,26,50,2,10 +male,20,second,blue,70,100,0,2,5,No,0,30,15,2 +male,19,second,green,68,180,1,2,2,Yes,10,50,2,5 +female,19,second,green,67,280,2,0,4,Yes,2,164,0,2 +female,22,fourth,green,72,60,1,2,6,No,0,30,0,4 +female,21,third,blue,68,25,2,0,4,Yes,3,50,2,7 +female,22,third,blue,64,250,1,4,5,Yes,0,30,0,10 +female,20,third,green,70,350,0,1,15,Yes,3,100,1,5 +female,21,fourth,blue,66,110,1,0,4,No,0,20,0,10 +female,20,second,brown,62,140,1,3,5,No,0,50,1,5 +female,21,third,blue,64,80,3,0,5,Yes,4,100,0,6 +female,33,fourth,brown,60,45,1,0,12,No,0,5,1,12 +male,20,third,green,72,150,0,1,10,Yes,10,11,3,7 +female,27,other,brown,69,300,3,0,3,Yes,1,100,0,4 +female,23,fourth,brown,62,385,1,1,4,Yes,7,85,0,6 +male,23,third,brown,68,25,1,2,2,Yes,5,100,3,5.5 +female,20,third,blue,65,424,0,1,2,No,0,40,10,25 +male,20,second,blue,72,35,2,1,4,Yes,6,150,2,4 +female,20,third,brown,67,1050,2,0,20,Yes,7,30,0,1 +male,20,third,brown,72,70,1,0,21,Yes,3,550,4,5 +female,18,first,blue,68,130,0,1,5,Yes,7,7,0,2 +female,23,third,brown,60,6750,0,1,35,No,0,3,0,0 +male,20,second,green,68,125,0,0,10,No,0,25,20,4 +female,22,fourth,hazel,63,20,4,2,5,Yes,2,75,0,10 +female,19,second,hazel,67,30,1,1,30,Yes,5,30,0,15 +male,23,other,brown,75,165,1,1,8,Yes,14,75,7.5,45 +male,20,second,blue,69,136,5,0,12,Yes,14,25,5,21 +male,19,first,hazel,75,0,0,1,1,Yes,5,100,5,5 +male,20,second,brown,71,30,2,0,10,Yes,9,200,5,5 +male,20,third,blue,72,92,2,1,5,No,0,40,5,15 +female,19,second,blue,72,170,0,1,14,No,0,25,0,2 +male,19,first,brown,72,315,0,2,6,No,0,10,5,10 +female,19,first,blue,66,800,1,1,9,Yes,14,50,0,4 +female,20,third,green,63,8,0,2,15,Yes,0,50,1,4 +male,20,second,blue,73,190,1,0,7,No,0,120,5,25 +male,18,first,blue,73,78,1,0,30,No,0,73,5,5 +male,18,first,blue,75,150,0,2,3,Yes,6,100,3,5 +female,20,third,blue,66,844,0,1,7,Yes,7,100,7,9 +female,19,second,brown,67,1800,1,0,8,Yes,9,101,0,3 +male,20,second,brown,72,35,1,0,15,No,0,115,45,35 +male,20,second,hazel,75,120,2,0,12,Yes,15,100,0,5 +male,50,other,hazel,75,1800,1,2,40,Yes,5,25,0,2 +male,20,second,other,72,200,1,1,10,No,0,32,5,5 +male,18,first,brown,76,20,1,1,5,Yes,5,250,1,10 +female,20,third,blue,66,100,2,1,80,No,0,85,3,2 +male,19,second,brown,69,300,2,1,3,Yes,2,200,10,10 +male,21,third,blue,68,250,0,1,7,Yes,7,100,14,14 +female,20,second,brown,64,120,0,2,24,Yes,4,112,2,3 +male,20,third,blue,69,1275.25,2,1,8,Yes,15,78,0.5,7 +female,19,first,blue,65,770,2,1,20,No,0,40,0,5 +male,21,fourth,blue,72,120,2,0,20,Yes,5,15,2,2 +female,20,second,brown,71,70,2,0,14,No,0,30,0,7.5 +male,19,second,blue,69,200,1,0,12,Yes,5,19,7,4 +male,19,second,brown,72,320,3,1,15,Yes,5,0,0,2 +male,22,fourth,blue,69,75,1,2,3,Yes,5,3,0,5 +male,20,second,hazel,74,360,1,0,10,Yes,5,0,2,15 +male,20,second,blue,70,50,3,0,7,Yes,7,100,1,20 +female,20,third,blue,65,220,1,0,8,Yes,5,5,0,9 +female,19,first,blue,66,270,1,0,6,No,0,100,0,0 +male,21,third,blue,73,230,0,1,3,Yes,5,200,1,8 +male,23,third,blue,70,192,0,1,6,Yes,6,275,0,5 +male,19,first,blue,69,190,0,1,5,Yes,6,50,4,3 +male,19,second,green,68,45,1,1,2,Yes,3.5,20,2,10 +female,18,first,hazel,66,220,0,1,4,No,0,50,4,15 +male,19,first,green,73,30,0,1,3,No,0,20,16,4 +female,20,second,green,69,50,3,3,12,Yes,6,25,0,8 +male,20,second,blue,74,100,0,2,5,No,0,20,0,5 +female,21,fourth,brown,64,23,1,2,20,Yes,6,40,5,5 +male,22,other,brown,70,100,0,2,20,No,0,23,1,15 +female,20,second,blue,72,230,2,0,6,No,0,90,1,1 +male,22,fourth,green,72,125,3,0,20,Yes,2,100,0.5,5 +female,20,third,brown,67,150,1,0,15,Yes,6,150,0,14 +female,20,second,brown,64,250,1,0,15,Yes,5,100,0,5 +female,20,third,green,65,270,1,0,20,Yes,7,60,0,10 +female,19,second,blue,70,250,1,0,10,Yes,5,100,0,7 +female,20,third,hazel,65,200,1,0,3,Yes,10,5,1,7 +female,19,second,brown,69,20,3,0,2,No,0,35,0,6 +male,20,second,green,72,160,0,1,2,Yes,3,50,3,10 +male,21,fourth,hazel,72,1,2,0,3,No,0,65,2,4 +female,20,second,green,65,50,0,4,14,Yes,7,40,1,3 +female,21,fourth,blue,67,35,0,2,12,Yes,6,50,0,12 +male,22,fourth,blue,72,60,1,1,6,Yes,5,12,5,15 +female,19,second,blue,62,1800,6,2,8,No,0,12,0,7 +female,20,third,blue,67,20,0,1,7,No,0,65,0,14 +female,19,second,green,67,50,1,0,3,Yes,2,100,1,3 +male,23,other,hazel,70,20,2,2,8,No,0,20,5,5 +female,23,other,brown,69,30,2,1,3,Yes,4,30,0,6 +female,19,first,green,72,200,2,1,10,Yes,7,100,0,5 +male,19,second,blue,66,75,0,1,4.5,No,0,97,1.5,2.5 +male,20,second,brown,72,120,0,0,10,Yes,7,53,10,15 +female,21,third,brown,66,176,2,2,7,Yes,3,50,2,5 +female,21,second,brown,64,1000,1,2,25,No,0,10,1,5 +male,20,second,hazel,73,140,1,1,10,No,0,50,15,30 +female,18,first,green,60,20,0,3,15,Yes,2.5,75,5,2 +male,20,second,blue,74,90,2,1,10,Yes,0,100,5,20 +male,18,first,blue,67,110,1,3,2,No,0,8,5,6 +female,23,third,brown,66,215,1,0,5,Yes,4,200,5,2 +female,20,second,green,64,720,1,0,12,Yes,2.5,124,1,20 +male,20,second,brown,69,20,0,0,6,Yes,2,100,5,6 +female,19,first,brown,64,182,0,2,5,Yes,5,20,5,10 +female,19,second,brown,63,0,1,2,5,Yes,4,50,1,12 +male,19,first,brown,70,1412.47,0,2,5,Yes,9,42,0,2 +male,23,other,blue,72,90,3,1,6,No,0,10,2,20 +male,20,second,blue,70,245,0,2,9,Yes,2,20,1,3 +female,19,third,blue,64,215,0,1,5,Yes,5,30,0,8 +female,20,second,hazel,64,1400,0,1,4,Yes,5,50,1,6 +female,21,fourth,brown,63,385,0,1,6,Yes,4,75,0,3 +male,25,other,blue,72,220,0,1,15,No,0,50,2,35 +male,26,other,green,72,90,1,3,15,Yes,5,100,2,5 +male,23,fourth,hazel,70,120,0,3,10,Yes,6,50,0,10 +male,21,third,blue,72,100,2,1,25,No,0,500,1,5 +male,21,third,hazel,72,40,0,1,6,Yes,10,25,10,14 +female,20,second,blue,70,94,1,0,20,Yes,2,30,5,10 +male,20,second,hazel,69,260,1,2,10,Yes,8,75,10,20 +female,20,second,hazel,67,23,1,1,5,Yes,5,100,1,10 +male,25,other,brown,76,99,2,1,10,Yes,7,200,5,15 +female,20,third,brown,65,211,1,0,21,Yes,3,200,0,15 +female,19,first,green,61,0,1,0,6,No,0,150,1,5 +male,22,other,brown,77,200,3,0,25,No,0,90,2,10 +male,20,second,green,72,300,1,1,15,Yes,8,20,2,50 +male,21,third,hazel,70,196,2,0,40,No,0,120,12,7 +male,19,first,brown,72,300,0,1,5,No,0,70,1,3 +female,18,first,brown,68,35,0,1,5,No,0,20,10,4 +male,20,third,blue,73,200,1,3,10,Yes,8,75,0,14 +male,20,second,brown,73,170,1,1,6,Yes,4,71,2,6 +female,21,third,blue,66,120,0,2,10,No,0,50,0,4 +male,20,second,brown,78,0,1,1,2,Yes,10,20,4,20 +male,21,fourth,blue,69,250,2,0,8,No,0,52,12,15 +male,20,second,blue,70,100,1,1,4,Yes,6,105,2,10 +female,20,third,green,68,150,1,0,3,No,0,10,3,1 +female,20,first,blue,61,347.47,0,2,10,No,0,80,5,10 +female,20,second,blue,68,90,1,1,2,No,0,20,5,5 +male,20,third,green,77,350,1,0,2,Yes,5,60,0,6 +male,23,second,hazel,70,60,2,1,2,No,0,25,0,6 +female,24,other,green,65,30,0,2,18,No,0,50,0,8 +male,20,third,blue,75,150,2,1,5,Yes,8,30,0,2 +male,19,second,brown,66,109,2,3,10,Yes,4,12,20,20 +male,22,fourth,blue,72,1042.92,0,2,10,Yes,2,0,0,10 +female,21,third,brown,66,40,2,2,15,Yes,6,25,1,10 +male,23,fourth,hazel,72,340,1,1,20,No,0,124,2,1 +female,21,third,brown,65,60,1,0,5,No,0,20,0,3 +male,21,third,other,72,35,0,0,10,Yes,5,40,15,20 +female,20,third,hazel,67,35,0,1,3,No,0,100,0,20 +male,20,first,blue,70,75,0,1,10,Yes,5,80,5,20 +female,18,first,green,65,1700,0,0,12,Yes,8,45,0,4 +female,20,second,brown,64,0,1,0,5,Yes,4,50,0,10 +male,21,third,brown,75,215,2,1,12,No,0,20,2,12 +female,20,third,green,61,75,4,2,12,No,0,200,2,10 +female,19,second,hazel,69,240,0,2,4,Yes,14,24,2,2 +female,20,third,green,69,20,0,1,5,Yes,6,20,2,10 +male,20,second,blue,74,65,1,2,40,Yes,3,20,3,2 +male,20,second,hazel,72,35,0,1,4,Yes,7,120,12,25 +male,23,fourth,blue,69,30,1,2,14,Yes,6,250,2,21 +female,20,third,blue,63,0,1,1,3,Yes,3,100,0,10 +female,20,third,green,68,200,2,1,10,Yes,6,46,1,10 +female,21,third,blue,69,232,1,0,7,No,0,200,1,6 +female,21,third,blue,59,350,0,1,15,Yes,5,55,0,1 +female,22,fourth,brown,74,144,1,1,3,Yes,3,14,0,4 +male,18,first,hazel,68,180,0,0,5,Yes,3,85,2,1 +female,19,second,brown,63,182.5,1,0,10,Yes,0,42,6,5 +male,19,first,green,72,12,0,1,17.5,No,0,70,2,4 +female,20,third,brown,67,160,1,0,11,Yes,4.5,100,1,5 +female,18,first,blue,60,90,0,1,15,Yes,6,75,0,14 +male,25,other,blue,71,68,2,1,5,Yes,4.5,12,8,8 +female,20,third,green,62,250,1,1,4,Yes,6,40,0,7 +male,21,third,brown,72,180,3,2,4,No,0,100,0,10 +female,20,third,brown,68,0,1,0,6,No,0,53,3,5 +male,24,other,brown,68,180,0,1,7,Yes,10,200,12,8 +female,21,third,brown,67,52,1,1,15,Yes,9,150,0,8 +female,19,second,brown,70,75,0,1,50,No,0,30,1,4 +female,20,third,hazel,67,45,1,0,10,Yes,10,40,0,20 +female,23,first,blue,65,46,0,2,10,Yes,5,6,0,12 +female,20,third,green,69,35,3,2,10,Yes,3,200,0,6 +female,20,third,hazel,67,333,1,1,12,Yes,3,126,0,5 +male,21,third,brown,68,600,1,0,5,Yes,0,200,5,20 +female,19,first,blue,63,500,0,0,20,No,0,70,2,20 +female,19,second,hazel,67,25,0,1,30,Yes,4,20,0.5,14 +female,19,first,blue,64,150,1,1,10,Yes,4,50,5,10 +male,18,first,brown,67,0,1,0,14,No,0,100,3,3 +female,20,third,green,65,45,1,0,40,No,0,75,1,12 +male,22,other,hazel,72,400,0,1,4,Yes,4,200,6,17 +female,19,second,brown,67,100,1,3,2,Yes,3,20,0,2 +female,19,second,blue,66,15,2,2,25,Yes,4,100,0,15 +female,19,second,brown,66,40,1,1,12,No,0,150,3,5 +female,19,first,green,64,12,2,0,8,Yes,3,15,0,6 +male,20,third,blue,71,119,2,0,25,No,0,,6,6 +male,22,fourth,blue,71,40,0,1,10,No,0,150,0,2 +male,20,second,hazel,70,250,2,2,3,No,0,80,10,3 +female,19,first,green,65,75,0,3,20,Yes,10,54,2,5 +female,21,fourth,brown,64,60,1,0,4,Yes,0,40,0,30 +male,24,other,brown,70,150,0,1,10,No,0,15,0,10 +male,20,second,hazel,74,90,0,1,20,Yes,3,200,1,10 +female,21,third,green,68,120,0,1,4,No,0,500,0,7 +female,19,second,hazel,65,150,4,4,10,Yes,7,50,0,15 +female,21,third,blue,73,60,0,4,7.5,Yes,5,56,0,18 +male,18,first,blue,69,180,1,1,3,Yes,5,50,5,15 +female,19,second,blue,67,200,0,3,20,No,0,50,1,7 +female,20,second,green,68,150,0,1,49,No,0,25,0,2 +female,20,second,green,63,152,3,2,14,Yes,1.5,80,0.5,7 +male,21,third,blue,74,140,0,0,8,No,0,0,8,5 +female,23,other,blue,64,138,0,2,5,No,0,200,0,12 +female,22,fourth,blue,62,145,1,2,15,Yes,5.5,15,0,6 +female,23,other,brown,63,145,1,0,10,No,0,50,5,10 +female,19,second,hazel,70,250,2,0,37.5,Yes,7.5,75,0,17 +male,21,third,brown,78,100,0,3,15,Yes,0,20,0,12 +male,19,second,blue,73,260,0,1,10,Yes,2,50,0,20 +female,20,third,brown,65,166,1,1,10,No,0,70,0.3,2 +male,21,third,blue,72,80,1,1,10,Yes,10,200,12,6 +male,20,second,hazel,68,200,2,0,26,Yes,16,0,0,1 +female,19,second,green,65,126,1,1,4,No,0,80,0,2 +male,19,first,green,71,40,1,0,10,No,0,30,10,21 +female,19,second,blue,62,120,1,0,15,Yes,4,50,3,2 +male,19,first,brown,67,180,0,1,10,No,0,10,1,9 +female,20,second,green,70,40,1,0,12,Yes,3,45,4,5 +male,19,second,brown,76,34,1,0,10,Yes,3,,2,6 +male,22,third,blue,68,240,0,1,3,Yes,2,10,0,3 +female,18,first,other,68,10000,0,0,25,No,0,50,2,1 +male,31,first,brown,69,0,2,1,5,Yes,6,30,0,5 +male,20,second,blue,73,200,1,0,22,Yes,3.5,5,2,10.5 +female,21,fourth,blue,67,125,1,0,20,Yes,1,10,0,15 +female,19,third,green,66,350,0,2,20,No,0,30,2,10 +female,19,second,hazel,62,200,3,2,30,Yes,7,50,0,30 +female,19,second,brown,67,200,1,1,5,Yes,1,60,0,1 +female,21,third,blue,67,0,0,1,48,No,0,150,1,6 +female,33,other,green,64,90,2,0,10,Yes,4,20,0,4 +male,18,first,hazel,69,15,1,0,7,Yes,3,30,1,2 +male,21,third,blue,77,80,1,0,30,Yes,10,50,0,4 +male,21,third,green,72,60,0,1,5,No,0,30,10,10 +female,19,second,blue,66,65,2,1,3,Yes,2,,1,8 +female,19,first,brown,69,223,3,3,20,Yes,6,30,2,6 +female,22,fourth,brown,63,160,3,3,5,Yes,5,30,0,12 +male,22,fourth,brown,75,375,0,1,15,Yes,5,25,20,25 +male,20,third,brown,67,200,1,0,25,No,0,10,1,10 +female,22,fourth,brown,61,35,0,1,20,Yes,6,50,5,20 +female,19,second,blue,67,0,5,5,4,No,0,0,0,3 +male,23,fourth,green,76,200,1,0,4,No,0,,4,5 +male,20,second,blue,72,150,0,0,7,No,0,380,5,8 +male,20,second,brown,71,173,2,2,4,Yes,6,88,1,1 +female,18,first,brown,61,30,3,4,10,No,0,30,4,4 +male,22,fourth,brown,72,160,0,2,10,Yes,5,10,4,15 +male,18,first,green,71,70,0,1,4,Yes,4,50,5,10 +male,20,second,brown,68,1076,1,0,7,Yes,13,20,4,21 +female,21,fourth,brown,68,30,1,1,4,No,0,30,0,5 +male,21,third,hazel,69,175,0,2,12,Yes,4,150,8,6 +male,21,third,blue,79,193,0,1,10,Yes,6,400,0,60 +male,21,third,green,74,135,2,0,1,Yes,10,50,2,3 +male,19,first,brown,70,102.5,3,3,4,No,0,20,7,3 +female,23,other,brown,65,183,0,3,49,Yes,4,300,0,3 +male,19,first,brown,68,,1,0,10,Yes,3,10,10,5 +male,23,other,brown,71,175,1,3,5,Yes,10,40,4,10 +female,19,second,green,71,0,2,1,12,No,0,100,0,5 +female,19,second,hazel,66,240,0,1,50,No,0,47,0,1 +female,23,other,blue,64,300,0,2,20,No,0,10,0,8 +female,18,first,brown,72,100,0,1,15,Yes,4,100,0,20 +female,20,third,brown,66,0,2,0,2,No,0,50,0,10 +male,18,first,blue,61,,2,0,6,Yes,10,100,45,5 +female,20,second,hazel,66,179,1,0,5,Yes,9,30,3,2 +male,19,second,brown,71,35,0,1,30,No,0,20,18,1 +female,19,second,blue,68,30,3,0,40,Yes,6,50,0,0 +female,20,second,blue,64,380,2,1,5,Yes,10,2,0,5 +male,18,first,hazel,70,195,4,0,15,Yes,7,10,4,3 +male,20,second,blue,73,5,0,4,7,Yes,8,50,1,4 +female,18,first,blue,66,100,2,2,3,Yes,10,50,0,6 +female,25,third,blue,71,260,1,2,15,Yes,6,5,3,15 +female,19,first,hazel,68,0,2,0,6,Yes,7,100,0,2 +female,20,second,brown,65,200,1,2,30,Yes,5,120,0,10 +female,19,first,blue,66,30,2,1,5,Yes,0,,1,3 +female,20,second,green,70,200,1,0,,Yes,9,20,1,14 +male,19,second,blue,73,105,0,2,4,No,0,15,3,3 +female,18,first,hazel,64,170,1,1,3,Yes,2.5,32,4,1 +male,21,third,blue,72,96,1,1,15,Yes,5,25,2,5 +male,19,first,hazel,74,137,0,1,10,No,0,55,0.5,20 +female,22,fourth,blue,,190,1,0,20,No,0,20,0,10 +male,23,other,hazel,72,155,0,1,14,Yes,12,400,1,10 +male,18,first,blue,73,85,1,1,20,Yes,7,78,2,20 +male,20,second,brown,72,150,1,1,25,Yes,4,100,10,25 +female,20,second,hazel,73,125,2,0,20,No,0,60,0,5 +male,20,third,brown,74,50,3,0,3,Yes,3,75,3,16 +female,21,third,brown,65,0,0,0,30,Yes,3,20,5,3 +female,20,second,hazel,63,400,1,1,20,No,0,200,3,2 +female,18,first,brown,65,190,4,0,10,Yes,5,80,2,10 +female,21,third,hazel,62,180,0,2,20,Yes,5,200,0,14 +female,18,first,brown,65,7500,1,0,25,Yes,3,50,0,0 +female,22,fourth,hazel,62,110,0,3,10,No,0,30,0,10 +female,19,first,green,67,150,1,0,,Yes,2.5,25,0,5 +female,19,first,hazel,65,800,1,1,15,Yes,6,105,0,3 +male,29,fourth,hazel,69,175,2,2,2,No,0,500,3,6 +male,20,third,green,67,190,2,0,28,Yes,7,10,1,7 +female,20,second,brown,63,70,2,2,5,No,0,30,0,3 +female,22,fourth,brown,62,175,1,0,2,Yes,3,80,0,8 +female,20,second,hazel,62,52,1,0,12,Yes,7,30,0,10 +female,18,first,green,63,60,1,0,15,Yes,4,3,0,0 +female,19,second,hazel,70,360,1,0,20,Yes,3,100,0,1 +male,22,fourth,blue,72,0,0,0,25,Yes,4,110,10,10 +male,19,first,blue,72,40,1,0,10,Yes,8,5,5,20 +male,20,third,hazel,72,0,3,0,5,Yes,6,50,3,7 +male,21,third,brown,72,90,3,0,2,No,0,30,0.5,10 +female,23,third,brown,62,900,0,0,15,Yes,2,70,1,5 +male,22,third,blue,72,108,3,4,8,No,0,300,2,1 +female,23,other,brown,65,222,2,1,15,Yes,4,10,0,15 +female,19,second,brown,64,120,2,0,20,No,0,40,0,15 +male,21,third,blue,70,230,0,1,15,Yes,4,300,10,10 +male,19,first,green,69,150,1,1,3,Yes,2,30,1,3 +male,21,third,brown,67,50,0,2,10,Yes,4,52,20,12 +male,23,third,hazel,72,80,0,2,20,Yes,5,20,2,25 +female,20,second,hazel,65,90,0,1,15,No,0,200,2,20 +male,19,second,blue,67,90,2,1,5,Yes,6,50,8,5 +female,20,second,brown,63,120,1,0,5,Yes,4,60,0,3 +male,21,third,hazel,72,193,1,1,10,No,0,100,15,15 +female,19,second,blue,63,170,1,1,6,Yes,8,100,0,2 +female,22,other,green,64,48,0,1,15,Yes,8,750,0,7.5 +female,20,third,brown,63,150,1,0,21,Yes,4,50,0,20 +female,22,fourth,blue,65,350,1,2,5,Yes,5,200,1,15 +female,19,second,hazel,63,300,1,0,10,No,0,60,0,4 +female,19,second,blue,68,204,2,1,48,Yes,3,10,0,10 +male,21,third,blue,71,100,1,0,2,Yes,3.5,30,3,1 +male,21,fourth,hazel,69,160,1,1,5,Yes,0,100,20,20 +male,22,third,blue,69,15,0,2,7,No,0,100,0,10 +male,21,fourth,blue,67,180,0,1,12,Yes,5,90,0.5,10 +female,25,third,hazel,64,198,2,0,15,Yes,5,40,5,5 +male,19,first,brown,65,90,0,0,20,No,0,0,0,40 +female,21,fourth,hazel,66,350,2,1,10,Yes,3,25,0,15 +male,20,second,blue,75,321,2,1,9,Yes,4,200,1,4 +male,19,first,blue,75,160,0,1,20,No,0,10,12,20 +female,20,second,blue,68,150,1,1,10,Yes,5,100,0,2 +male,23,fourth,blue,72,25,2,1,6,No,0,30,25,5 +female,20,third,blue,65,200,1,0,1,No,0,300,0,15 +female,20,second,brown,70,140,0,1,,No,0,100,2.5,10 +female,20,second,hazel,66,131,3,0,12,Yes,7,47,4,3 +male,20,third,hazel,70,100,0,2,10,Yes,4,20,0.5,5 +male,27,third,blue,71,180,1,0,7,No,0,50,0,12 +male,24,fourth,green,72,30,0,1,20,Yes,7,200,0,9 +male,21,fourth,blue,69,85,1,2,7,Yes,5,120,3,4 +female,20,second,blue,67,130,1,2,21,Yes,5,18,1,6 +male,18,first,brown,73,140,1,0,9,Yes,2,80,4,14 +male,20,third,blue,74,215,0,2,3,No,0,75,2,17 +female,20,second,hazel,64,90,1,0,20,No,0,50,5,18 +male,20,second,brown,70,10,1,1,7,No,0,15,3,7 +male,20,third,green,68,292,0,1,3,Yes,5,100,1,10 +male,20,third,blue,75,400,4,1,1,Yes,6,250,5,10 +female,20,second,blue,68,100,0,1,8,Yes,5,50,6,14 +female,20,second,hazel,64,0,2,0,35,Yes,2,10,1,35 +female,19,second,hazel,64,250,0,0,12,Yes,7,75,3,7 +female,19,second,brown,63,0,1,0,21,No,0,70,0,1 +male,21,fourth,green,70,9,1,1,25,No,0,65,3,2 +female,19,first,blue,64,411,0,1,12,Yes,3,100,0,12 +male,20,third,brown,70,75,1,1,10,No,0,40,2,15 +male,20,second,brown,75,300,1,3,6,No,0,0,3,3 +male,22,fourth,hazel,70,45,2,3,20,No,0,100,10,10 +female,20,third,blue,65,25,0,2,15,No,0,30,1,10 +female,19,second,brown,60,12089,0,1,60,No,0,20,10,100 +female,20,second,brown,70,247,0,2,4,Yes,3,75,0,4 +female,19,first,brown,67,90,1,1,20,Yes,6,10,3,10 +male,19,second,green,67,400,0,1,2,Yes,3,340,20,10 +female,20,third,brown,64,180,3,1,10,No,0,20,1,35 +female,19,second,blue,65,200,1,2,20,No,0,75,1,5 +female,19,second,blue,66,135.2,1,1,12,Yes,4.5,89,0,13 +female,20,second,brown,61,120,0,1,5,Yes,2,20,0,6 +male,19,first,other,72,120,0,1,20,No,0,30,3,6 +female,19,first,brown,66,300,2,2,35,Yes,4,50,7,30 +male,23,other,hazel,71,150,0,1,20,Yes,7,15,0,20 +female,20,second,blue,62,150,1,0,16.5,Yes,3.5,60,0,1.5 +female,19,first,brown,67,312,1,0,8,Yes,4,70,3,8 +male,18,first,hazel,70,70,0,1,25,Yes,5,5,2,5 +female,21,third,green,66,20,0,2,4,Yes,6,50,0,20 +male,20,second,blue,74,100,2,1,6,Yes,7,13,0,1.5 +female,19,second,blue,66,140,1,2,3,No,0,20,0,5 +female,19,second,brown,68,,0,2,10,No,0,30,10,10 +male,22,other,other,,1700,3,0,6,Yes,20,10,1,3 +male,18,first,blue,76,50,0,1,24,Yes,10,125,2,6 +male,21,third,brown,76,15,2,0,5,No,0,50,1,10 +female,21,third,blue,63,185,2,5,20,Yes,3,20,0,5 +male,23,other,brown,67,15,6,0,12,Yes,12,40,10,21 +male,19,second,hazel,71,400,1,1,30,No,0,,20,20 +female,21,third,blue,67,1838,1,0,15,Yes,4,53,0,5 +female,20,second,hazel,67,40,0,1,3,Yes,3.5,56,0.5,5 +male,19,second,brown,73,500,0,1,20,Yes,8,0,0,2 +female,19,second,hazel,70,90,0,2,15,No,0,15,0,10 +female,19,second,blue,63,156,3,0,15,Yes,2,25,0.5,12 +female,20,second,brown,66,330,0,1,20,Yes,12,150,1,5 +male,21,third,hazel,64,180,1,1,15,No,0,10,0,25 +female,20,third,green,68,600,1,0,3,Yes,5,75,0,7 +female,21,third,blue,64,170,0,1,20,Yes,5,50,0,7 +female,20,second,brown,67,300,3,1,6,Yes,10,100,2,14 +female,20,second,brown,65,50,3,1,3,No,0,50,4,6 +male,20,second,brown,68,45,0,1,10,Yes,4,,1,10 +female,20,second,blue,66,65,0,2,15,Yes,3,25,0,10 +male,20,second,hazel,68,120,2,0,50,No,0,50,0,5 +female,21,fourth,brown,70,20,1,0,3,Yes,12,,0,7 +male,18,first,blue,69,139,1,0,35,No,0,2,3,30 +female,20,third,brown,62,5000,2,1,5,No,0,40,5,5 +female,33,first,brown,65,,3,4,10,Yes,5,10,10,5 +female,22,fourth,green,65,0,1,0,2,Yes,4,300,0,14 +female,18,first,hazel,66,200,1,1,14,Yes,6,75,2,2 +female,18,first,brown,65,40,4,0,4,No,0,9,2,13 +female,19,second,blue,72,0,1,0,5,Yes,3,54,0,10 +male,24,third,other,67,6500,1,0,4,No,0,10,5,3 +female,20,third,blue,67,14,0,0,1,Yes,7,50,0,10 +female,23,other,brown,62,1200,5,0,10,No,0,75,0,3 +female,20,third,blue,63,60,3,2,35,No,0,30,0,14 +male,24,third,green,76,0,0,3,25,Yes,4,100,3,18 +male,21,second,brown,,8000,1,0,35,Yes,3,,28,0 +male,19,second,blue,75,120,1,0,15,Yes,3,212,1,10 +female,18,first,blue,69,200,0,1,30,No,0,20,2,23 +female,21,third,brown,70,180,3,3,10,Yes,5,60,0,3 +male,20,third,hazel,72,176,1,0,35,No,0,80,3,5 +female,20,third,hazel,70,420,1,0,50,No,0,,0,20 +male,20,second,blue,68,288,1,1,15,Yes,6,25,2,10 +male,27,third,green,69,1600,2,4,15,Yes,4,50,5,3 +male,23,third,blue,69,170,0,1,2,Yes,14,53,0,5 +female,21,third,brown,64,60,0,1,5,No,0,30,1,10 +male,19,second,brown,75,,2,0,40,No,0,10,1,8 +female,19,second,brown,66,200,0,1,15,Yes,2,50,0,2 +male,21,fourth,green,72,35,0,1,15,Yes,8,80,8,15 +female,25,fourth,brown,64,7000,1,0,35,No,0,50,1,0 +male,20,second,green,73,210,0,1,10,Yes,5,50,1,15 +female,19,first,blue,61,120,0,1,15,Yes,3,60,0,1 +female,20,second,blue,67,140,1,0,5,No,0,50,0,20 +male,20,second,blue,71,60,0,0,20,Yes,7,100,0,2 +female,20,third,blue,69,155,1,2,5,Yes,3,153,25,6 +female,20,third,brown,67,76,1,0,6,No,0,48,0,6 +female,20,third,hazel,64,90,2,0,1,Yes,6,20,0,7 +female,18,first,hazel,65,45,0,0,7,Yes,3,13,1,2 +female,19,second,hazel,,120,1,1,15,No,0,36,0,10 +female,19,second,blue,70,180,4,2,15,No,0,25,0,4 +male,20,second,blue,78,110,1,0,10,Yes,4,30,0,5 +female,19,second,brown,64,120,1,1,5,No,0,100,0,20 +male,19,second,blue,74,176,0,0,8,No,0,70,10,6 +female,20,second,green,64,100,0,1,4,Yes,6,100,0,2 +female,19,first,blue,70,90,0,1,15,Yes,11,60,0,7 +female,21,fourth,brown,62,10,3,2,10,Yes,3,30,2,5 +male,20,second,green,68,167,1,0,6,Yes,7,70,16,14 +male,27,third,brown,68,6500,0,1,1,Yes,1,,0.5,0.5 +male,22,third,brown,74,175,0,1,8,Yes,6,120,1,7 +male,26,fourth,brown,72,30,0,1,3,No,0,100,0,28 +male,18,first,brown,76,45,0,1,12,Yes,8,15,2,8 +female,20,second,blue,63,30,0,2,4,No,0,60,0,3 +female,21,fourth,hazel,70,45,1,0,20,Yes,3,100,2,12 +female,19,second,brown,64,158,1,0,20,No,0,500,0,10 +female,26,other,green,70,1132,0,1,50,Yes,5,40,0,0 +female,22,other,green,67,30,2,2,75,Yes,10,80,0,20 +female,21,third,other,68,4950,0,1,20,Yes,15,100,0,6 +female,20,second,blue,64,40,1,2,10,Yes,3,40,0,20 +male,22,fourth,green,67,9,1,0,5,Yes,4,20,18,12 +male,19,first,brown,70,175,0,1,40,No,0,10,0,1 +male,19,second,blue,75,15,0,1,1,Yes,3,100,1,10 +male,19,second,brown,70,55,1,1,35,Yes,4,0,1,1 +female,19,first,blue,68,0,0,1,3,Yes,6,11,0,30 +female,20,second,hazel,64,225,1,0,110,Yes,4,30,1,7 +female,21,fourth,green,63,140,1,0,20,Yes,8,100,4,4 +female,18,first,green,66,232,4,1,30,Yes,9,100,0,0 +male,23,other,hazel,78,0,1,1,10,Yes,4,35,0,3 +male,22,third,blue,71,130,2,2,,Yes,6.5,30,1.5,6 +female,21,fourth,other,71,180,1,0,6,No,0,100,1,3 +female,18,first,brown,60,,0,2,70,No,0,30,7.5,30 +male,23,third,hazel,77,330,1,0,20,Yes,6,300,0,10 +female,20,third,blue,67,160,0,1,25,Yes,5,45,1,1 +male,20,third,blue,69,60,1,1,39,No,0,26,0,6 +female,19,first,brown,65,227,0,1,28,No,0,100,0,1 +female,20,second,brown,64,120,1,3,8,Yes,7,100,0,10 +male,20,second,blue,75,180,0,1,20,No,0,3,4,15 +female,20,second,brown,62,160,0,1,7,Yes,4,50,1,5 +female,20,third,hazel,68,180,0,1,3,Yes,3,30,1,8 +female,20,third,blue,,35,6,4,3,No,0,15,0,10 +male,21,third,green,72,70,1,1,12,Yes,3,50,3,24 +male,22,fourth,hazel,78,120,2,0,20,No,0,100,1,6 +male,20,second,hazel,76,100,0,1,2,Yes,4,14,14,28 +male,20,third,green,78,200,0,0,10,Yes,9,20,10,10 +male,20,second,blue,70,15,1,1,15,Yes,3,250,3,15 +female,19,second,brown,62,60,0,1,10,Yes,1,25,5,5 +male,20,second,brown,75,2500,4,0,14,No,0,5,1,10 +male,20,third,blue,73,15,0,1,10,Yes,2,50,1,10 +female,19,first,blue,66,35,0,1,20,No,0,66,2,0 +female,21,third,brown,70,190,0,1,8,Yes,3,5,8,1 +male,19,first,blue,65,458,0,2,50,Yes,4,100,2,20 +female,20,third,green,,45,1,0,8,Yes,4,50,3,15 +female,20,second,blue,69,50,0,1,5,Yes,4,50,0,8 +female,18,first,brown,65,0,0,0,5,Yes,2,5,1,6.5 +male,20,second,hazel,69,0,0,2,18,Yes,5,40,3,15 +male,20,second,brown,72,200,0,0,3,Yes,3,100,0,2 +male,21,third,brown,72,70,0,1,5,Yes,5,50,5,15 +male,21,third,green,71,375,0,2,10,Yes,6,45,8,12 +male,20,second,blue,68,220,3,1,20,Yes,10,100,10,30 +female,21,third,green,70,45,0,2,4,No,0,300,1,6 +male,20,second,green,72,140,1,0,4,Yes,2,40,12,12 +male,20,second,brown,67,100,1,2,9,No,0,50,2,6 +female,21,third,hazel,65,140,1,0,20,No,0,20,0,3 +male,18,first,blue,71,150,0,2,10,Yes,10,20,3,1 +male,21,fourth,other,69,20,1,0,20,Yes,6,20,20,80 +male,21,third,brown,74,35,1,2,8,No,0,30,2,20 +male,20,second,green,69,140,3,0,12,Yes,2,5,0,2 +female,20,third,blue,69,210,1,0,12,No,0,10,0.5,10 +female,20,third,hazel,69,65,1,1,14,Yes,10,46,5,7 +male,24,second,brown,74,167,0,1,28,No,0,50,3,25 +female,19,second,brown,64,125,1,1,15,Yes,4,20,0,5 +female,20,second,green,66,130,0,1,10,Yes,6,50,0,7 +female,18,first,blue,56,570,0,1,12,Yes,14,100,21,14 +female,18,first,brown,70,70,2,0,10,Yes,5,25,0,1 +female,20,third,blue,64,165,0,2,10,Yes,10,100,5,3 +female,19,second,blue,66,0,1,0,20,Yes,3.5,30,1,15 +male,20,third,green,62,20,1,0,10,Yes,6,20,10,5 +male,20,second,green,70,350,0,2,10,No,0,100,0,5 +male,21,third,hazel,77,200,2,1,4,Yes,15,40,0,4 +female,21,third,brown,64,45,2,0,7,No,0,100,1,20 +male,22,third,brown,72,35,0,1,10,Yes,6,50,1,15 +male,19,second,green,72,15,0,2,4,Yes,4,20,1,4 +male,20,second,brown,69,30,2,0,15,No,0,200,3,20 +male,21,fourth,brown,77,375,1,0,5,Yes,10,40,10,15 +male,21,third,green,72,30,1,1,2,Yes,5,100,0,2 +female,19,second,brown,65,220,0,1,15,No,0,130,5,5 +male,29,second,blue,69,6300,0,4,24,No,0,2,7,1 +female,18,first,blue,69,105,1,2,10,Yes,7,21,0,0 +female,28,fourth,other,66,6350,0,1,10,No,0,50,3,10 +male,20,second,blue,70,157,1,4,28,No,0,45,0,2 +male,18,first,brown,73,2070,2,0,15,Yes,6.5,100,15,15 +female,19,second,blue,77,75,0,1,15,Yes,3,200,0,7 +male,20,second,hazel,72,136,0,0,36,No,0,70,2,4 +female,21,fourth,green,64,150,2,2,7,No,0,25,0,5 +male,20,second,brown,76,120,1,1,4,No,0,21,20,20 +female,21,fourth,hazel,69,100,0,1,10,Yes,7,250,6,10 +female,20,third,brown,67,65,2,0,4,No,0,20,0,25 +female,19,second,blue,64,300,1,1,5,Yes,7,10,0,15 +male,22,fourth,blue,73,180,0,1,10,Yes,4,20,2,12 +male,21,third,blue,71,1300,1,1,6,Yes,6,40,0,10 +male,21,third,green,72,110,0,2,15,Yes,6,25,5,15 +female,20,third,brown,61,200,1,0,15,No,0,10,0,6 +female,19,second,brown,65,115,1,2,20,No,0,55,0,5 +male,19,second,brown,72,35,2,2,20,Yes,5,100,0,7 +male,23,third,brown,72,145,1,3,10,Yes,8,100,0,2 +male,20,second,green,65,119,0,1,21,Yes,4,4,1,1 +female,20,second,blue,71,30,0,1,20,No,0,80,1,14 +male,23,other,blue,76,100,0,3,1,Yes,4,,0,0 +female,18,first,brown,66,450,0,1,20,No,0,75,0,10 +male,19,second,brown,71,220,1,1,50,Yes,5,250,4,4 +male,21,third,green,75,30,0,1,8,Yes,9,60,2,15 +male,20,second,brown,70,182,1,3,10,Yes,14,25,6,8 +male,22,fourth,blue,75,70,1,0,2,Yes,6,7,3,7 +female,20,third,brown,67,368,2,1,20,Yes,6,,4,4 +female,19,first,brown,66,,0,0,30,Yes,5,1,0,0 +male,20,third,brown,73,185,1,0,42,No,0,10,8,3 +female,24,fourth,blue,66,750,0,1,10,No,0,300,0,6 +female,22,fourth,hazel,70,250,0,0,15,Yes,0,50,1,5 +female,25,other,blue,65,40,0,1,24,No,0,50,2,10 +female,19,second,blue,69,230,1,0,8,Yes,4,60,2,10 +female,22,fourth,blue,65,25,0,1,20,Yes,8,50,0,10 +male,20,third,blue,71,160,1,0,24,Yes,3,50,1,7 +male,21,second,brown,68,40,0,2,4,Yes,10,15,6,4 +male,21,fourth,blue,75,50,0,1,,Yes,3,10,1,20 +male,20,second,hazel,67,150,0,2,15,Yes,14,150,0,10 +female,23,other,brown,66,352,1,0,30,Yes,10,37,10,6 +male,20,third,hazel,74,350,1,1,8,No,0,150,15,3 +female,20,third,hazel,66,180,0,2,10,No,0,10,0,2 +female,19,second,blue,62,230,2,0,12,No,0,200,0,4 +female,20,third,blue,68,115,2,1,12,No,0,57,3,1 +male,21,fourth,blue,73,20,2,0,10,No,0,76,20,10 +male,19,second,brown,70,200,2,7,14,Yes,4,40,10,10 +female,19,second,green,63,,0,1,15,Yes,4.5,,0,5 +female,21,third,blue,65,200,2,1,14,Yes,14,20,0,2 +male,19,second,blue,73,130,1,0,10,No,0,465,30,12 +female,20,second,blue,67,200,1,1,5,Yes,2,150,1,2 +female,30,third,green,69,100,3,1,15,Yes,7,200,0,20 +male,19,second,brown,67,350,1,1,4,Yes,10,500,0,10 +female,19,second,brown,67,1000,1,1,5,Yes,5,3,3,12 +male,19,second,blue,71,180,2,0,7,Yes,5,50,1,10 +male,27,other,blue,74,100,2,2,2,No,0,60,0,10 +female,20,third,brown,68,120,0,1,30,No,0,,0,20 +female,20,third,blue,64,362,2,1,15,No,0,30,0,4 +male,19,second,blue,73,235,2,2,10,No,0,3,7,10 +male,19,second,brown,70,226,0,1,12.5,Yes,7.5,100,0,2 +female,20,third,brown,67,45,0,1,12,Yes,3,125,0,5 +female,19,second,brown,64,220,2,1,4,No,0,30,1,3 +male,21,fourth,blue,71,70,1,2,,Yes,10,30,0,3 +female,21,third,brown,64,,1,2,7,No,0,,0,6.5 +female,26,third,blue,67,45,1,1,14,No,0,115,0,21 +male,20,fourth,brown,76,250,0,5,3,Yes,9,239,4,3 +male,19,second,green,72,40,1,1,6,Yes,6,150,0,12 +female,19,third,green,66,55,0,5,5,Yes,10,20,0,15 +female,21,fourth,blue,61,200,2,0,12,Yes,3,70,5,5 +female,20,third,hazel,64,25,1,0,6,No,0,56,0,6 +male,12,first,brown,,1,1,1,11,Yes,0,1,11,12 +male,23,fourth,blue,72,1200,1,0,18,Yes,17,40,0,25 +male,19,second,blue,72,130,2,1,30,No,0,35,1,5 +male,20,second,other,75,11,0,2,7,No,0,25,35,4 +female,20,third,blue,69,200,2,1,5,Yes,12,30,15,7 +male,21,third,hazel,68,20,1,2,6,Yes,7,3,6,3 +male,21,fourth,brown,75,65,5,1,10,No,0,100,10,10 +female,19,second,blue,67,350,1,1,6,Yes,8,100,0,1 +male,20,second,hazel,65,130,1,0,5,No,0,0,2,10 +female,21,second,hazel,59,15,0,0,20,No,0,15,0.5,4 +male,19,second,blue,71,333,1,0,30,No,0,150,10,20 +female,19,second,green,65,222,0,1,4,Yes,4,20,0,6 +female,20,second,other,62,57,1,0,14,Yes,0,100,1,7 +male,22,second,blue,75,140,1,0,20,No,0,100,4,4 +female,20,third,hazel,63,30,0,3,8,Yes,4,80,1,7 +male,22,fourth,hazel,69,300,0,1,18,Yes,8,200,5,15 +female,19,third,hazel,66,76,0,1,14,Yes,4,97,0,5 +male,20,third,brown,72,60,1,0,10,Yes,8,150,1,7 +female,19,second,brown,64,30,1,0,4,Yes,1,6,0,12 +female,20,third,brown,66,220,0,1,10,No,0,150,5,15 +female,19,second,green,65,180,1,1,7,Yes,8,60,1,3 +male,20,third,hazel,68,1600,1,0,5,Yes,6,8,40,10 +male,20,third,hazel,74,90,0,0,20,No,0,3,10,15 +female,19,second,blue,59,80,2,0,2,No,0,13,7,15 +female,21,third,hazel,65,45,0,1,9,Yes,2,70,0,3 +female,20,third,blue,69,30,0,1,8,No,0,,1,6 +male,19,second,hazel,68,30,1,1,10,Yes,5,20,40,15 +male,19,second,blue,78,350,1,2,20,No,0,10,14,20 +male,19,second,green,74,230,2,0,10,No,0,70,4,8 +female,20,third,blue,69,0,0,1,7,Yes,7,100,0,1 +male,19,second,blue,75,10,0,2,2,Yes,4,50,6,2 +female,19,second,hazel,66,120,1,0,12,Yes,8,100,2,9 +male,19,second,blue,73,180,2,1,5,Yes,10,20,10,5 +female,21,fourth,brown,65,22,1,2,10,Yes,3,100,0,10 +male,20,second,blue,69,40,1,1,14,Yes,12,50,7,10 +female,20,third,brown,69,9000,0,1,44,No,0,0,0,8 +female,23,third,other,63,6500,1,0,30,No,0,30,0,14 +male,22,other,blue,66,45,2,2,12,Yes,7,300,0,8 +male,22,other,brown,62,352,1,2,10,No,0,50,10,9 +male,20,third,brown,65,30,1,0,10,Yes,4,4,5,20 +male,19,third,brown,71,200,1,1,2,Yes,4.5,128,2,4 +male,19,second,brown,71,330,1,0,25,Yes,7,150,0,21 +female,19,second,green,70,200,0,1,2,No,0,200,1,10 +male,21,third,hazel,72,175,1,2,10,No,0,,30,20 +female,26,second,green,63,15,2,2,12,Yes,3,10,0,2 +male,19,second,hazel,71,371,0,1,15,Yes,12,500,0,6 +female,19,second,green,67,30,0,2,50,No,0,500,0,5 +male,20,third,brown,72,150,0,1,4,Yes,10,3,0,5 +female,19,second,green,66,180,2,1,15,No,0,35,0,14 +female,19,first,other,65,1000,2,1,21,No,0,10,0,0 +female,19,second,green,59,10,0,0,6,Yes,3,83,2,0 +male,18,first,blue,68,150,2,1,7,Yes,2,200,1,3 +male,20,third,blue,73,40,2,1,5,Yes,0,20,10,25 +male,20,third,hazel,69,45,0,0,20,No,0,75,5,10 +male,29,fourth,other,72,0,2,0,50,No,0,300,0,10 +male,22,fourth,blue,71,115,1,2,5,No,0,5,5,5 +female,19,second,brown,62,120,2,1,25,No,0,25,0,0 +female,21,fourth,green,67,45,0,2,30,No,0,17,0,21 +female,22,other,brown,68,500,0,1,30,Yes,8,100,0,10 +female,21,fourth,brown,64,93,1,0,15,Yes,0,150,0,4 +male,20,third,hazel,74,350,1,1,100,Yes,4.5,100,0,20 +male,25,third,green,,5000,4,0,12,Yes,4,50,0,7 +male,19,second,brown,68,160,2,1,3,Yes,4,100,0,1 +female,18,second,hazel,68,699,2,0,6,No,0,30,2,7 +male,18,first,brown,70,30,1,1,5,Yes,4,8,8,16 +male,20,third,brown,73,20,0,2,30,No,0,20,2,4 +female,20,third,other,65,190,1,0,14,Yes,6,100,0,3 +female,19,second,brown,67,90,0,1,15,Yes,5,25,1,4 +male,19,second,brown,70,30,2,0,20,Yes,5,0,0,5 +female,23,other,brown,64,2000,1,0,10,Yes,3,50,0, +female,19,second,blue,64,170,1,0,10,Yes,20,76,2,12 +female,19,second,brown,69,1039,0,1,7,Yes,0,32,5,14 +male,19,second,blue,71,190,1,0,20,Yes,15,125,2,5 +male,19,second,hazel,76,300,0,1,8,No,0,140,5,8 +female,22,other,green,64,190,1,4,2,No,0,10,0,10 +female,30,first,brown,,300,0,1,15,Yes,5,50,4,2 +male,21,fourth,brown,68,350,1,1,5,No,0,0,2,7 +female,22,fourth,blue,66,120,1,0,7,Yes,8,20,0,2 +male,21,third,hazel,67,25,1,1,12,No,0,15,20,20 +male,26,other,brown,68,30,0,2,15,No,0,50,0,1 +male,23,other,blue,66,111,1,1,7,Yes,5,111,2,20 +male,19,second,brown,77,60,1,2,20,Yes,5,30,2,10 +male,19,second,hazel,72,375,1,0,5,Yes,4,30,0,3 +male,20,second,blue,73,200,1,1,6,Yes,6,25,1,4 +male,21,third,blue,71,170,1,0,5,No,0,,0,3 +female,20,fourth,hazel,72,100,1,0,6,Yes,7,300,1.5,5 +female,24,fourth,blue,68,95,1,1,7,No,0,30,0,1 +male,21,third,blue,70,90,0,1,25,Yes,0,25,6,10 +female,21,second,brown,63,25000,0,0,14,No,0,30,4,21 +male,21,third,green,78,200,1,1,15,No,0,10,2,10 +female,19,second,green,67,150,1,1,5,Yes,3,80,7,6 +female,19,second,blue,70,260,1,1,21,Yes,7,10,0,5 +female,20,third,hazel,67,300,0,0,5,Yes,10,50,0,10 +female,19,second,hazel,62,150,1,0,4,Yes,2,32,2,2 +female,20,third,green,56,0,1,0,8,Yes,4,25,0,8 +male,20,second,blue,73,45,1,1,8,No,0,50,3,10 +male,20,third,other,70,48,1,0,10,Yes,4,,0,8 +male,20,second,blue,71,50,1,1,5,Yes,4,30,15,15 +male,20,second,blue,70,200,2,0,15,Yes,0,100,4,10 +female,22,fourth,green,64,45,0,2,2,Yes,8,150,0,6 +male,24,other,blue,72,30,2,1,24,Yes,4,30,5,5 +male,28,fourth,blue,71,200,1,0,10,No,0,50,0,10 +female,19,second,brown,69,,0,0,28,Yes,5,25,0,14 +female,19,second,green,64,72,0,2,8,Yes,10,12,0,0 +female,20,third,blue,64,100,0,7,7,No,0,100,10,7 +male,19,second,brown,67,42,2,1,10,No,0,4,10,10 +male,19,second,brown,76,137,0,2,20,Yes,4,75,8,12 +male,34,fourth,brown,74,90,0,2,4,No,0,25,0,1 +male,22,fourth,blue,72,50,0,1,6,No,0,30,0,3 +female,20,third,green,65,150,0,1,3,Yes,9,50,0,3 +male,20,third,blue,70,195,3,1,7,Yes,5,100,0,6 +female,21,fourth,blue,68,400,1,0,25,Yes,5,30,0,5 +female,21,fourth,blue,70,180,2,1,10,Yes,10,25,0,10 +male,19,second,green,74,130,1,1,10,Yes,4,0,8,2 +female,19,second,green,61,1500,2,1,25,No,0,75,0,10 +female,18,first,brown,66,200,0,2,8,No,0,100,4,10 +female,19,second,brown,62,,1,0,12,No,0,100,2,3 +female,19,second,blue,57,140,1,4,7,Yes,7,60,0,14 +female,21,fourth,blue,64,171,0,1,15,No,0,70,0,10 +male,22,fourth,brown,76,130,1,0,21,Yes,15,120,0,5 +male,19,second,brown,71,175,0,1,22.5,Yes,8,0,0,4 +male,19,second,brown,73,300,0,1,28,Yes,0,150,0,10 +male,21,third,blue,76,28,1,5,5,Yes,2,20,7,10 +female,23,other,hazel,64,80,1,0,8,Yes,6,20,0,5 +male,21,fourth,brown,71,60,0,0,40,No,0,20,0,8 +male,20,third,brown,72,330,0,1,35,No,0,30,13,20 +male,23,other,brown,69,1600,1,1,3,Yes,5,50,0,15 +female,21,other,brown,62,250,5,5,5,No,0,20,0,5 +male,19,second,blue,65,117,1,1,6,Yes,4,100,1,12 +female,21,fourth,blue,65,60,0,1,3,Yes,4,10,0,5 +male,19,second,green,73,137,2,3,14,No,0,0,2,2 +female,19,second,hazel,67,300,0,2,20,Yes,10,25,0,10 +male,20,third,blue,67,700,0,1,30,Yes,7.5,200,2,15 +female,19,second,blue,68,90,0,2,10,Yes,7,12,0,2 +female,20,third,brown,65,16,1,1,7,No,0,250,0,15 +female,20,second,blue,65,170,1,3,14,No,0,50,0,24 +female,20,second,hazel,66,190,2,1,6,Yes,4,50,0,11.5 +male,20,second,hazel,67,30,0,0,10,No,0,40,3,2 +male,20,third,hazel,69,180,2,0,8,Yes,7,150,0,2 +male,19,second,hazel,70,135,2,2,14,Yes,2.5,15,10,17 +male,22,first,brown,70,2000,0,0,20,No,0,50,2,10 +female,22,other,brown,60,1044,2,2,10,No,0,100,0,20 +female,21,fourth,brown,62,30,2,1,15,Yes,6,100,1,4 +male,20,third,brown,72,283,0,1,35,Yes,6,50,6,8 +male,21,fourth,green,74,116,0,1,2,Yes,6,,2,12 +female,21,fourth,brown,63,35,2,1,20,Yes,3,50,0,20 +male,22,fourth,blue,71,1300,1,1,4,Yes,7,50,0,4 +female,22,other,blue,65,180,2,1,1,No,0,20,0,6 +female,21,third,brown,65,150,1,0,4,Yes,5,,0,3 +male,20,third,blue,70,60,2,0,3,Yes,3,5,10,5 +female,20,third,hazel,64,100,2,1,4,No,0,50,0,5 +female,19,second,blue,64,65,3,0,4,Yes,4,40,1,3 +male,19,second,hazel,60,129,2,0,3,Yes,2,15,1,3 +male,19,second,hazel,73,130,2,1,10,Yes,10,50,0,5 +female,19,second,brown,66,250,2,0,12,Yes,7,40,1,6 +female,23,other,blue,68,45,4,1,14,No,0,275,0,7 +female,19,second,blue,65,30,0,2,28,No,0,45,2,15 +female,19,second,blue,64,90,0,1,10,Yes,9,25,0,5 +male,31,third,blue,72,31,5,1,3,No,0,35,0,3 +female,20,third,green,63,250,0,2,5,Yes,5,15,0,5 +female,19,second,brown,65,327,1,1,9,No,0,25,4,5 +male,20,third,blue,70,45,0,1,20,Yes,6,175,10,10 +female,21,third,blue,65,75,1,0,14,Yes,0,100,2,10 +female,21,fourth,blue,65,180,1,1,10,Yes,4,20,0,2 +female,20,third,brown,69,140,1,0,15,No,0,150,1,2 +female,19,first,blue,68,0,1,1,20,No,0,20,0,10 +female,20,third,green,67,217,1,1,12,No,0,120,18,10 +male,20,third,hazel,76,450,0,0,10,Yes,8,10,3,20 +male,21,third,hazel,70,160,3,2,6,Yes,4,2,4,6 +female,19,second,brown,67,35,0,1,10,Yes,0,50,1,10 +male,23,other,brown,72,120,2,4,1,No,0,100,0,0 +female,19,second,blue,62,196,3,0,5,Yes,5,500,0,2 +male,21,third,blue,73,125,2,1,6,Yes,5,,0,8 +female,19,second,blue,64,150,1,1,20,Yes,2,30,10,8 +female,19,second,hazel,67,10,1,1,3,Yes,3,40,0,5 +male,20,third,blue,74,150,0,0,7,Yes,3,20,0,1 +female,23,fourth,brown,65,120,1,1,6,Yes,3,20,0,10 +female,19,second,blue,63,400,1,1,15,Yes,20,150,0,4 +female,19,second,brown,66,177,1,0,20,Yes,7,5,0,1 +male,20,third,blue,82,45,1,3,35,No,0,50,0,4 +female,19,second,brown,64,200,1,1,3,No,0,,0,10 +female,19,second,brown,66,120,1,2,12,Yes,7,50,0,10 +female,23,fourth,brown,75,1000,4,3,5,Yes,25,10,7,14 +female,21,fourth,blue,63,15,0,0,5,Yes,10,10,0,2 +male,25,other,hazel,73,106,0,1,30,Yes,4,30,1,50 +female,20,third,hazel,65,772,1,0,20,No,0,100,5,15 +female,19,second,blue,62,250,1,0,15,Yes,8,100,0,15 +male,19,second,blue,75,15,0,0,4,Yes,5,25,5,3 +male,53,first,brown,70,0,0,1,5,No,0,12,4,3 +female,19,second,hazel,70,200,3,1,2,Yes,3,32,0,5 +female,22,other,brown,62,10,4,2,5,No,0,50,0,15 +female,21,fourth,hazel,64,25,1,2,15,Yes,4,25,0,15 +female,19,second,green,64,100,3,2,30,Yes,2,5,4,2 +female,22,fourth,blue,67,88,2,1,8,Yes,3,40,1,8 +male,20,second,brown,69,180,3,1,14,Yes,4,55,0,5 +male,23,other,other,67,90,1,0,5,Yes,5,0,3,5 +male,21,fourth,brown,72,0,2,1,20,Yes,0,2,45,20 +male,19,second,blue,70,45,1,0,10,No,0,70,0,12 +female,20,third,brown,70,441,0,4,14,No,0,50,0,21 +female,20,second,green,67,120,2,0,10,Yes,5,20,5,10 +female,19,second,blue,64,140,0,0,2,Yes,3,50,0,4 +male,39,fourth,brown,72,110,1,2,25,Yes,0,5,5,2 +female,19,second,brown,65,340,3,1,14,No,0,300,0,7 +male,19,second,brown,,10000,1,0,10,Yes,3,1,20,7 +male,19,second,blue,72,35,0,2,15,Yes,8,100,2,3 +female,19,second,hazel,67,220,2,0,5,Yes,4,200,0,1 +female,20,third,brown,62,230,1,0,3,No,0,100,3,3 +male,20,third,brown,69,20,1,0,11,No,0,30,1,6 +male,22,fourth,brown,73,100,1,1,10,Yes,7,100,7,12 +male,20,third,blue,74,158,2,0,4,Yes,6,34,2,0 +male,20,third,blue,71,350,0,0,15,Yes,9,150,0,2 +male,22,fourth,blue,70,200,0,1,10,Yes,5,100,0,20 +male,20,third,brown,79,180,1,0,35,Yes,3,15,0,8 +female,19,second,hazel,68,110,0,0,30,Yes,8,10,0,15 +female,18,second,blue,67,100,2,0,15,Yes,9,75,0,0 +male,21,third,hazel,74,50,2,3,16,Yes,8,5,25,14 +male,19,second,blue,71,20,1,1,15,Yes,4,100,5,12 +female,20,third,blue,66,115,2,2,64,Yes,3,25,0,3 +male,19,third,green,70,1500,3,0,10,Yes,5,40,4,14 +female,21,third,blue,69,230,1,0,11,Yes,10,75,1,10 +male,19,second,brown,71,35,1,0,10,Yes,3,21,7,3 +male,21,third,brown,74,193,0,1,17.5,Yes,2,100,0,22.5 +female,20,third,blue,64,50,1,0,10,No,0,20,0,15 +female,22,fourth,blue,68,30,1,2,9,Yes,4,25,1,10 +female,20,third,blue,64,175,1,4,0.5,No,0,75,0,21 +male,20,third,brown,69,90,1,1,25,Yes,8,60,1,2 +female,20,third,hazel,66,130,1,0,15,No,0,,10,25 +male,20,third,green,77,51,0,1,4,No,0,150,2,10 +female,19,second,hazel,71,160,0,2,10,Yes,2,60,0,10 +female,20,second,blue,66,200,4,2,35,Yes,12,53,1,6 +female,19,second,blue,65,250,0,2,1,No,0,25,3,6 +female,30,other,other,69,30,1,0,15,Yes,2.5,100,5,0 +male,31,other,green,76,30,1,2,15,Yes,20,100,5,0 +male,19,third,hazel,74,100,2,0,5,Yes,7,25,6,6 +male,21,fourth,brown,72,30,1,0,10,No,0,150,5,3 +male,21,third,blue,70,120,1,1,10,Yes,3,75,20,7 +female,21,fourth,green,63,379,1,1,12,Yes,7,50,0,2 +male,20,second,hazel,68,140,0,1,3,Yes,5,28,1,2 +female,19,second,blue,69,100,1,3,15,Yes,10,50,0,2 +male,19,second,brown,73,642,0,1,18,Yes,10,20,5,16 +male,20,third,brown,70,350,3,0,20,Yes,10,300,2,8 +female,19,second,green,70,200,1,1,25,Yes,8,50,0,5 +female,19,second,blue,65,215,0,1,14,Yes,0,150,0,6 +male,19,second,blue,75,150,0,1,2,Yes,8,10,2,12 +male,25,other,hazel,70,117,0,2,12,Yes,4,0,0,4 +male,22,third,blue,69,160,5,1,4,Yes,4,12,1,5 +female,21,fourth,green,62,40,3,0,7,Yes,10,30,0,14 +female,19,second,blue,64,40,1,2,21,No,0,30,0,4 +male,20,third,brown,66,97,3,1,15,Yes,4,25,3,0 +female,19,second,brown,68,300,2,3,6,No,0,200,0,12 +female,20,third,green,65,30,1,0,10,No,0,50,0,12 +female,19,second,green,65,65,2,0,8,Yes,0,30,1,2 +female,21,fourth,brown,62,200,1,0,35,Yes,5,10,0,8 +female,20,first,brown,,,1,0,21,Yes,5,5,0,14 +female,56,other,brown,66,190,2,0,21,Yes,5,10,0,30 +male,22,fourth,brown,69,150,1,0,10,No,0,100,10,30 +female,20,third,blue,67,160,2,2,42,No,0,0,1,28 +male,20,third,blue,73,180,1,1,50,No,0,5,25,15 +male,19,second,blue,70,40,2,0,10,Yes,6,48,5,10 +male,20,third,blue,74,115,0,1,4,Yes,7,75,0,2 +male,22,other,brown,68,70,1,2,30,Yes,8,200,0,0 +male,21,fourth,blue,76,60,3,1,25,Yes,3,75,0,0 +male,20,third,blue,76,185,1,0,5,Yes,4.5,30,7,5.5 +male,20,third,blue,69,1750,1,1,10,Yes,16,50,10,30 +male,23,other,blue,69,200,2,6,10,Yes,10,50,10,30 +female,20,third,blue,66,15,2,2,7,No,0,200,0,2 +female,19,second,brown,62,20,1,0,10,Yes,7,50,0,6 +male,22,other,blue,75,25,1,1,4,Yes,7,40,5,14 +female,21,third,green,64,0,2,1,7,Yes,7,50,0,3 +female,19,second,hazel,67,50,0,2,40,No,0,40,1,1 +male,19,second,brown,66,50,0,0,15,Yes,6.5,300,0,0 +male,20,second,brown,63,55,1,2,15,Yes,4.5,15,4,13 +female,20,third,hazel,67,45,1,2,14,No,0,50,0,15 +male,20,third,blue,74,15,0,1,10,Yes,10,100,1,9 +male,20,third,blue,72,220,1,0,8,Yes,20,103,2,14 +female,19,second,brown,65,300,0,2,6,No,0,20,0,2 +male,21,fourth,blue,72,169,1,1,5,Yes,12,28,2,15 +female,19,second,blue,64,200,2,1,10,No,0,50,1,8 +male,22,fourth,blue,71,600,3,2,6,Yes,2,25,1,4 +male,22,third,brown,74,200,1,2,10,No,0,30,1,7 +male,20,second,blue,73,112,1,1,2,No,0,15,3,49 +female,19,second,blue,68,90,1,1,10,Yes,3,200,2,15 +female,22,other,brown,71,10,2,3,6,No,0,120,0,15 +female,20,second,blue,63,140,1,0,15,No,0,10,2,1 +male,23,fourth,brown,72,6159,1,1,20,No,0,50,5,20 +male,19,second,brown,73,120,1,0,8,Yes,5,15,8,20 +female,18,first,blue,67,167,1,1,18,Yes,4,30,2,6 +female,19,second,brown,68,110,0,0,35,No,0,100,2,25 +female,20,second,hazel,69,35,0,1,7,No,0,30,0,12 +male,26,third,brown,70,0,0,2,72,Yes,5,100,0,0 +female,19,first,green,65,950,0,1,10,No,0,15,8,2 +female,19,second,blue,64,300,0,1,21,Yes,7,10,0,14 +male,22,fourth,brown,76,500,1,0,15,No,0,25,1,10 +male,20,second,blue,68,200,1,2,5,Yes,4,20,1,3 +female,21,third,blue,70,106,2,0,35,Yes,4,200,2,10 +female,19,second,brown,67,200,0,2,60,Yes,3,20,0,3 +female,21,third,brown,64,0,1,0,10,Yes,9,60,0,10 +female,20,third,blue,44,30,0,1,7,Yes,4,200,0,5 +male,21,third,hazel,70,0,1,1,10,No,0,200,0,8 +male,21,third,brown,68,1000,4,3,5,No,0,0,5,25 +female,19,second,blue,70,65,0,1,20,No,0,50,0,10 +male,20,second,brown,70,90,2,1,10,Yes,8,50,9,9 +female,20,third,brown,63,380,2,0,12,Yes,6,50,0,35 +female,19,second,hazel,64,45,1,1,14,Yes,2,3,0,10 +female,20,third,brown,65,230,2,0,15,Yes,7,25,0,14 +female,18,first,blue,68,99,2,0,60,Yes,5,30,1,5 +male,23,fourth,blue,74,100,1,0,5,Yes,6,50,2,5 +male,23,third,hazel,71,250,0,1,5,Yes,10,20,10,5 +male,21,third,hazel,73,200,0,1,2,Yes,15,100,2,7 +male,21,fourth,blue,72,228,0,1,12,Yes,4,447,6,6 +female,20,third,brown,65,40,2,0,40,No,0,60,2,1 +female,21,third,blue,63,200,0,0,12,Yes,5,250,3,6 +female,19,second,brown,64,100,1,1,8,No,0,5,4,8 +female,20,third,brown,62,15,1,1,25,Yes,7,150,1,15 +female,18,first,brown,68,55,1,1,3,No,0,6,0.5,6 +male,20,third,hazel,70,65,0,0,15,Yes,1,266,12,2 +male,20,second,blue,75,65,0,3,15,No,0,250,3,10 +male,19,first,blue,72,8,0,1,10,Yes,2,25,10,10 +female,19,second,brown,65,160,1,2,6,Yes,5,10,0,4 +female,18,first,brown,67,180,2,0,20,Yes,2.5,15,0,5 +female,20,third,hazel,67,60,1,1,10,No,0,100,0,3 +female,18,first,brown,63,4,1,0,10,No,0,,0,6 +female,31,other,blue,68,234,1,1,21,No,0,1000,2,4.5 +female,19,second,brown,60,200,2,0,7,Yes,5,15,0,5 +female,18,first,blue,68,200,2,0,21,Yes,4,15,1,3 +male,22,fourth,hazel,72,450,0,1,7,Yes,15,600,6,12 +male,20,second,green,72,359,0,1,7,No,0,10,11,19 +female,19,second,hazel,66,375,1,1,10,No,0,45,0,15 +female,19,third,brown,66,75,1,0,8,Yes,3,200,2,8 +male,20,third,brown,68,172,2,0,20,Yes,0,15,3,25 +female,20,third,blue,69,217,5,0,15,Yes,5,20,0,20 +female,20,third,green,64,380,1,1,15,Yes,6,50,0,8 +female,20,third,blue,62,184,1,0,6,Yes,6,100,1,10 +male,21,third,hazel,85,35,4,0,3,Yes,6,74,0,3 +male,19,second,brown,71,176,3,1,10,No,0,125,2,30 +male,18,first,brown,70,186,1,1,10,No,0,20,15,30 +male,34,other,hazel,75,0,0,2,46,No,0,1110,12,14 +female,18,first,blue,70,30,1,0,9,Yes,4,30,1,14 +male,25,third,brown,68,85,1,1,20,Yes,25,0,0,10 +male,20,second,brown,75,330,2,0,72,No,0,0,36,15 +male,20,second,blue,71,70,1,1,20,Yes,3,15,5,10 +male,22,fourth,brown,69,99,0,2,20,Yes,10,0,0,10 +male,22,fourth,brown,75,182,2,1,24,No,0,104,1,3 +male,21,third,blue,77,50,0,1,100,Yes,8,100,8,25 +female,19,second,green,,30,0,1,6,Yes,6,100,0,10 +female,18,first,green,71,200,0,1,10,No,0,30,6,2 +female,20,second,brown,63,150,1,1,35,No,0,10,0,21 +female,22,fourth,blue,68,180,0,0,10,Yes,3,55,0,3 +female,21,fourth,green,67,45,0,2,50,No,0,51,1,35 +female,19,second,blue,61,180,0,1,20,Yes,15,,0,3 +female,22,fourth,brown,68,0,1,1,10,Yes,12,80,0,10 +male,19,first,blue,72,120,1,1,10,No,0,,0,15 +female,22,fourth,blue,64,300,2,1,5,Yes,7,100,4,2 +male,19,second,green,74,130,0,1,3,Yes,6,35,4,4 +female,20,second,brown,64,,0,1,25,No,0,20,2,20 +female,19,second,brown,60,170,1,1,15,Yes,10,5,0,4 +male,22,fourth,blue,69,200,1,0,12,Yes,5,,2,20 +male,20,second,brown,74,143,0,1,25,Yes,0,,10,10 +female,20,second,blue,69,190,0,0,7,No,0,,0,10 +male,24,second,brown,,,0,1,10,Yes,3,30,2,5 +female,20,second,hazel,64,80,1,2,8,No,0,15,0,5 +male,19,first,brown,70,45,0,0,8,Yes,10,50,6,8 +male,27,other,blue,71,150,1,1,3,Yes,4,500,5,8 +female,19,first,hazel,61,180,2,0,10,No,0,25,0,15 +male,19,second,blue,78,120,1,1,35,Yes,5,50,4,4 +male,21,fourth,blue,72,75,1,2,4,Yes,4,,0.5,15 +male,20,third,brown,71,200,2,1,10,Yes,10,15,15,10 +female,20,second,green,71,120,1,2,25,No,0,30,0,4 +female,20,second,blue,68,130,0,2,15,Yes,8,12,0,2 +male,20,second,brown,67,35,0,1,20,Yes,4,30,15,10 +female,20,second,brown,65,100,1,3,12,No,0,35,0,12 +male,21,third,blue,72,25,0,1,15,Yes,8,20,0,7 +male,18,first,blue,71,200,1,1,8,No,0,5,2,6 +female,18,first,brown,62,45,1,1,13,Yes,6.5,300,1.5,1.5 +female,21,third,blue,68,150,1,1,25,Yes,6,60,20,10 +female,19,first,brown,63,500,1,1,20,Yes,8,,1,3 +male,20,second,green,72,90,1,0,5,No,0,45,20,50 +male,21,fourth,hazel,75,55,0,1,20,Yes,6,3,0,20 +male,19,first,hazel,75,60,1,0,3.5,Yes,4,15,9,2 +female,20,third,brown,66,32,0,1,2,Yes,3,100,7,4 +female,19,second,blue,71,0,1,0,6,Yes,6,35,1,2 +female,20,second,blue,63,50,0,1,15,No,0,100,0,10 +female,23,other,brown,69,120,1,0,30,Yes,4,55,1,15 +female,19,first,blue,71,100,1,2,30,Yes,3,1000,10,25 +male,20,second,brown,70,3500,1,0,6,No,0,20,0,4 +female,21,fourth,blue,68,225,2,1,20,Yes,9,250,0,3 +male,18,first,brown,72,370,0,1,30,No,0,70,2,10 +female,20,second,green,65,125,1,1,15,No,0,30,3,10 +female,20,second,blue,67,312,2,1,5,Yes,3,40,0.5,3 +female,22,fourth,blue,65,140,0,1,6,No,0,40,0,4 +male,21,third,hazel,72,200,0,1,20,No,0,1000,1,4 +female,18,first,blue,63,180,0,1,8,No,0,50,0,15 +male,21,third,brown,70,219,0,1,5,Yes,3,20,3,2 +female,20,second,hazel,64,150,1,0,10,No,0,55,2,7 +female,19,second,hazel,67,10,1,0,15,No,0,45,0.5,7 +female,19,second,brown,64,30,1,1,5,Yes,3,15,1,7 +female,18,first,blue,62,180,1,3,12,Yes,7,,0,5.5 +female,21,third,brown,72,200,0,1,10,Yes,10,,5,10 +female,20,second,green,,40,3,1,10,Yes,4,200,0,0 +male,24,other,brown,69,184,1,1,14,Yes,6,8,4,14 +female,18,first,green,76,210,1,0,25,Yes,20,50,0,2 +female,20,third,blue,71,120,1,2,10,Yes,4.5,50,1,6 +male,20,second,blue,72,130,1,0,15,No,0,80,2,6 +female,22,other,blue,73,600,1,2,10,Yes,5,50,0,15 +female,20,second,hazel,68,90,1,1,20,Yes,5,40,3,20 +female,23,other,green,64,60,0,2,5,Yes,7,100,0,8 +female,21,third,green,69,30,0,1,10,Yes,4,50,0,2 +female,18,first,blue,66,120,2,0,30,Yes,6,50,0,3 +male,19,second,blue,73,257,1,2,60,No,0,250,15,1 +male,22,fourth,blue,70,90,1,1,2,Yes,12,0,10,10 +female,22,fourth,blue,67,120,0,2,4,Yes,2,80,0,4 +female,20,second,green,63,1600,0,0,15,Yes,2,20,0,2 +male,21,third,brown,72,400,1,0,6,No,0,50,1,4 +female,20,third,brown,66,0,0,1,56,No,0,30,1,5 +female,20,second,blue,65,305,1,0,20,No,0,20,0,28 +male,21,second,blue,70,175,2,2,5,No,0,50,3,5 +female,21,third,brown,64,219,0,0,25,No,0,75,0,20 +female,20,second,green,66,160,1,2,25,No,0,75,0,3 +male,20,third,brown,78,335,1,0,9,No,0,10,8,10 +male,20,second,brown,78,220,1,1,15,No,0,10,2,8 +female,22,fourth,green,63,180,1,0,10,Yes,3,100,0,15 +male,18,first,blue,74,60,0,2,10,Yes,5,10,3,15 +female,26,other,brown,67,185,1,0,20,No,0,,0,15 +female,21,third,green,54,64,1,1,10,Yes,3,113,0,6 +male,21,fourth,brown,72,22.5,1,4,5,Yes,6,75,10,8 +male,19,second,brown,66,361,2,0,15,Yes,9.5,25,10,23 +female,35,fourth,green,64,30,1,0,12,Yes,2.5,200,2,6 +male,19,first,brown,68,102,1,1,14,No,0,20,14,1 +female,18,first,brown,67,350,0,0,10,No,0,200,0,10 +male,21,third,brown,74,360,1,3,6,No,0,650,12,3 +female,20,third,blue,66,180,0,1,28,Yes,7,20,0,21 +male,22,fourth,blue,73,170,0,1,10,No,0,90,0,2 +female,22,fourth,green,64,170,0,1,12,Yes,3,100,0,7 +male,22,fourth,blue,74,60,0,1,8,Yes,2,10,0,4 +male,21,third,other,76,90,1,2,8,No,0,50,12,8 +female,20,second,brown,62,15,4,0,12,No,0,100,0,15 +male,21,third,blue,75,230,0,3,7,Yes,6,200,1,10 +female,19,second,brown,65,30,1,1,25,No,0,78,0,30 +male,19,first,green,75,60,3,0,6,Yes,2,0,4,2 +female,20,second,green,67,110,2,0,25,Yes,10,100,3,20 +male,20,second,hazel,72,120,0,3,10,Yes,12,0,4,5 +female,19,second,blue,66,1027,1,0,20,No,0,0,0,3 +female,22,fourth,blue,65,210,0,1,20,Yes,5,10,0,5 +male,20,second,blue,70,150,0,0,10,Yes,5,5,15,15 +male,19,second,brown,75,15,0,1,4,Yes,0,5,15,3 +female,21,fourth,hazel,67,0,2,0,18,Yes,3,130,2,10 +male,20,second,brown,72,74,1,0,15,No,0,25,1,5 +female,19,second,hazel,70,250,0,0,5,Yes,12,50,1,4 +male,24,other,hazel,75,70,1,0,20,No,0,150,10,30 +male,21,fourth,green,73,120,1,0,6,Yes,6,100,8,35 +female,19,first,blue,64,250,2,1,8,No,0,25,2,10 +female,20,third,blue,67,,0,2,3,No,0,20,0,0 +female,23,other,blue,70,175,1,1,14,Yes,2,40,0,15 +male,22,second,green,66,4000,2,0,30,Yes,3,120,5,10 +male,20,third,green,75,45,4,1,20,Yes,7,10,10,20 +female,20,second,brown,63,90,0,2,4,No,0,23,1,2.5 +female,22,fourth,hazel,69,120,0,4,3,Yes,6,20,0,5 +female,19,second,green,63,250,1,1,20,No,0,75,2,4 +female,21,third,blue,64,1200,1,2,3,Yes,5,200,0,20 +male,32,third,blue,62,50,1,1,5,No,0,50,2,15 +female,21,third,green,64,170,0,2,40,Yes,8,,2,20 +female,21,third,brown,,0,0,2,10,Yes,3,50,0,20 +male,23,fourth,blue,71,236,1,1,8,No,0,40,10,4 +female,20,second,blue,63,60,3,1,24,No,0,90,0,3 +female,20,second,brown,67,20,2,2,42,No,0,2,1,3 +female,22,fourth,green,67,30,1,0,20,Yes,4,,0,10 +female,20,third,blue,66,100,0,2,15,Yes,5,,0,2 +male,24,other,brown,72,104,4,1,3,No,0,150,10,20 +female,19,second,blue,57,300,0,1,15,No,0,25,0,15 +female,25,third,hazel,67,33,0,0,14,Yes,4,50,0,3 +female,18,first,green,65,45,1,0,15,No,0,80,0,8 +male,20,third,green,72,115,2,1,10,No,0,50,30,20 +female,21,third,hazel,67,175,1,0,2,No,0,50,0,4 +female,19,second,hazel,68,150,0,3,15,Yes,4,80,1,3 +male,20,second,hazel,75,162,1,0,10,Yes,5,5,1,2 +male,23,other,blue,75,30,0,1,20,Yes,7,,10,5 +male,18,first,brown,61,352,0,1,35,No,0,30,10,4 +female,21,third,hazel,65,300,1,1,20,Yes,26,100,1,2 +male,19,second,blue,62,333,1,2,20,No,0,,2,12 +female,22,other,brown,67,130,4,2,8,Yes,5,50,2,30 +male,22,third,hazel,73,70,2,1,4,No,0,150,2,7 +female,19,second,brown,68,295,0,1,5,No,0,,0.5,3 +female,22,fourth,brown,68,,1,0,4,No,0,100,0,15 +female,20,second,brown,68,120,0,1,20,Yes,5,30,2,8 +male,22,fourth,hazel,72,120,1,1,3,No,0,25,5,20 +male,27,fourth,brown,68,90,1,0,5,Yes,4.5,600,0,2 +female,21,third,green,68,30,1,0,7,No,0,20,0,10 +female,18,first,brown,65,36,2,1,12,Yes,12,157,2,2 +male,26,other,brown,71,400,1,0,7,No,0,50,5,4 +male,20,second,blue,73,0,1,3,5,Yes,8,20,0,1 +female,19,second,blue,66,250,1,1,20,Yes,3.5,25,0,10 +female,18,first,green,65,120,1,0,15,Yes,4,50,1,8 +female,17,first,blue,66,60,1,0,30,Yes,5,9,0,20 +female,22,fourth,hazel,64,237,2,1,25,Yes,6,25,0,2 +female,19,second,brown,65,0,2,0,24,No,0,50,3,12 +female,20,third,blue,63,45,2,2,70,No,0,50,0,14 +male,20,third,green,73,180,1,1,4,Yes,10,100,2,12 +female,19,second,blue,63,214,1,0,,Yes,10,,0,5 +female,19,second,other,62,121,0,1,20,No,0,20,0,0.5 +female,18,first,blue,63,366,1,0,40,No,0,100,1,2 +male,25,second,blue,71,0,1,1,8,Yes,4,50,0,4 +male,24,fourth,brown,73,120,1,0,20,No,0,100,5,21 +female,20,third,blue,67,170,2,2,24,Yes,4,18,0,13 +female,24,third,brown,67,10,2,1,10,Yes,6,20,0.5,10 +male,21,fourth,green,76,88,0,1,28,Yes,6.5,100,2,2 +female,19,second,blue,67,200,1,0,25,No,0,100,4,10 +male,20,third,blue,71,120,2,0,10,No,0,20,5,15 +female,21,fourth,blue,67,360,1,1,28,Yes,4,150,5,7 +male,23,third,hazel,72,209,1,1,20,Yes,10,100,0,20 +female,19,first,hazel,66,108,0,2,16,Yes,8,40,1,14 +male,21,third,blue,68,110,1,3,10,Yes,7,50,0,9 +female,19,second,hazel,65,130,0,2,20,Yes,3,50,1,12 +male,25,fourth,blue,75,140,3,1,25,No,0,100,0,9 +female,19,second,blue,61,80,1,0,4,No,0,30,1,10 +male,22,third,green,69,40,0,2,10,No,0,50,2,15 +male,21,third,blue,71,38,1,0,40,Yes,21,100,2,4 +male,22,other,brown,70,1043,2,2,5,Yes,5.5,100,3,15 +male,18,first,blue,69,350,1,0,20,No,0,10,5,5 +female,20,third,brown,82,108,0,1,28,No,0,65,0,5 +male,21,third,brown,73,140,2,0,12,Yes,5,100,8,10 +female,19,first,blue,66,50,1,0,30,No,0,20,0,7 +female,20,third,blue,64,27,1,2,20,Yes,2,35,0,2 +male,20,second,hazel,69,30,1,1,5,Yes,4,40,5,12 +female,22,fourth,blue,65,90,1,3,12,Yes,4.5,90,0,40 +female,19,second,blue,70,160,0,1,14,No,0,70,0,8 +female,21,third,green,66,90,0,2,8,Yes,6.5,30,0,10 +female,22,fourth,brown,65,15,2,0,14,No,0,20,0,4 +female,18,first,brown,67,330,1,0,10,Yes,6,100,1,3 +female,18,first,brown,67,45,2,1,4,No,0,120,8,6 +male,22,fourth,blue,68,137,1,2,10,Yes,10,40,10,6 +female,18,first,blue,64,45,1,1,14,Yes,14,50,0,35 +female,20,third,brown,63,30,0,2,20,No,0,12,2,5 +female,18,first,hazel,74,106,1,1,16,Yes,10,58,2,40 +male,20,third,hazel,71,20,1,2,10,Yes,7,22,0,0 +female,18,first,hazel,67,90,2,1,10,Yes,3,26,0,12 +male,21,fourth,blue,73,250,1,0,12,Yes,4,100,1,8 +female,20,second,brown,64,171,1,2,8,Yes,15,45,2,3 +male,20,third,green,70,1500,2,0,10,No,0,15,10,20 +female,21,third,brown,61,70,1,4,20,Yes,4,40,0,3 +female,20,third,brown,62,300,2,1,10,Yes,4,,0,10 +female,24,fourth,brown,59,10200,1,0,5,No,0,0,2,5 +female,22,fourth,brown,66,120,0,1,25,No,0,20,0,0 +female,20,second,hazel,62,136,1,0,15,No,0,20,0,10 +male,20,third,blue,70,50,0,0,20,Yes,3,200,0,7 +female,19,first,blue,67,180,1,0,12,Yes,3,35,1,30 +male,21,third,brown,66,300,1,0,6,Yes,5,80,10,10 +female,18,first,hazel,70,700,0,0,27.5,No,0,150,3,7.5 +female,19,first,green,64,94,0,0,25,Yes,10,200,16,8 +female,19,first,hazel,69,180,1,0,14,Yes,4,60,0,5 +male,21,fourth,blue,74,200,1,0,3,Yes,5,12,5,10 +male,21,third,brown,72,180,1,1,4,No,0,5,4,20 +female,19,second,blue,52,0,2,1,4,Yes,4,200,1,4 +female,21,third,hazel,60,60,2,2,3,No,0,20,0,3 +female,20,second,brown,66,210,2,3,5,Yes,4,25,1,5 +male,19,second,brown,74,200,2,1,5,Yes,1,10,3,2 +male,21,fourth,brown,75,220,3,0,3,Yes,17,75,3,15 +female,18,first,blue,69,100,0,1,10,Yes,4,100,0,15 +male,18,first,blue,71,60,1,1,6,Yes,6,10,8,5 +male,20,third,green,74,800,0,1,20,No,0,30,5,3 +female,19,first,blue,66,80,2,1,4,Yes,4,50,7,7 +male,21,third,blue,75,75,1,1,15,Yes,45,25,0,10 +female,21,third,green,65,200,1,0,6,Yes,7.5,40,2.5,17.5 +male,20,second,blue,73,220,1,1,15,No,0,12,0,1 +female,19,first,blue,68,200,1,1,10,Yes,6,50,0,1 +male,20,second,brown,,55,0,1,8,No,0,5,3,7 +male,20,second,brown,,95,0,1,8,Yes,8,14,5,2 +female,25,fourth,blue,64,0,0,2,20,No,0,20,5,4 +female,20,third,brown,70,0,0,2,10,Yes,8,25,0,3 +male,19,first,green,77,36,0,1,8,No,0,75,9,3 +female,19,second,hazel,64,350,1,0,8,Yes,3,50,0,1 +female,20,second,blue,63,450,0,1,5,Yes,4,75,8,8 +female,18,first,brown,62,350,2,1,100,No,0,45,10,60 +male,26,fourth,brown,72,20,1,0,20,Yes,10,200,25,15 +male,20,second,brown,68,212,1,1,30,Yes,5,654,2,26 +female,19,second,green,70,180,1,0,10,Yes,0,30,0,5 +female,19,first,hazel,64,30,1,3,20,Yes,6,50,0,5 +male,20,second,hazel,75,212,0,1,3,No,0,25,2,15 +female,21,third,hazel,66,35,1,0,30,Yes,3,250,2,10 +female,22,fourth,brown,65,231,0,4,30,Yes,6,200,0,5 +female,20,third,green,65,20,0,1,10,No,0,30,0,15 +female,20,third,blue,67,180,1,0,6,Yes,2,50,0,10 +male,31,third,brown,66,75,4,1,15,Yes,6,400,10,12 +male,19,first,hazel,71,759,1,1,65,No,0,4,20,15 +female,19,second,brown,62,110,0,1,5,No,0,30,1,10 +male,24,third,blue,71,240,1,0,8,No,0,25,1,10 +male,21,third,blue,61,324,0,2,20,Yes,9,230,20,20 +male,21,fourth,brown,68,236,1,1,10,No,0,50,1,10 +male,21,fourth,hazel,72,144,1,1,30,Yes,4,25,0,0 +male,20,second,brown,72,140,0,1,21,No,0,150,7,21 +female,19,first,blue,65,120,1,0,3,No,0,48,2,4 +male,20,second,blue,77,120,1,0,7,Yes,7,0,5,15 +female,20,third,brown,70,300,1,1,10,Yes,5,30,0,8 +male,19,first,brown,69,100,3,0,2,No,0,2,1,6 +female,20,second,blue,69,360,1,1,20,Yes,0,25,0,5 +female,20,second,brown,63,120,1,1,10,Yes,4.5,2,5,5 +male,20,third,blue,76,154,1,1,10,No,0,20,18,5 +female,21,fourth,hazel,63,180,2,1,15,No,0,3,1,1 +female,20,third,green,64,90,0,2,12,Yes,12,100,1,5 +female,18,first,blue,66,110,0,1,14,No,0,239,2,10 +male,19,second,blue,73,140,0,1,4,Yes,6,45,7,12 +female,24,other,green,64,141.2,0,3,40,No,0,80,1,0 \ No newline at end of file diff --git a/Lab 2 - Clustering - Sp18.ipynb b/Lab 2 - Clustering - Sp18.ipynb new file mode 100644 index 0000000..e89db84 --- /dev/null +++ b/Lab 2 - Clustering - Sp18.ipynb @@ -0,0 +1,1335 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Lab 2: Clustering ##\n", + "INFO 254" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from sklearn.cluster import KMeans\n", + "from sklearn.metrics import silhouette_score\n", + "import numpy as np\n", + "from sklearn.preprocessing import normalize\n", + "\n", + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "\n", + "#%matplotlib inline\n", + "matplotlib.style.use('ggplot')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(171639, 43)\n" + ] + }, + { + "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", + "
q3q4q5q6q7q8q9q10q11q12...q16rq16uq16vq16wq16xq16yq16zq16aaq16abq16ac
count24205.00000024205.00000024205.00000024205.00000024205.00000024205.00000024205.00000024205.00000024205.00000024205.000000...24205.00000024205.00000024205.00000024205.00000024205.00000024205.00000024205.00000024205.00000024205.00000024205.000000
mean6.6734975.5321214.9900029.0026441.5071770.9309150.8637401.54015826.76539825.708965...3.6335880.46091622.55067125.0646970.00378173.9819780.6426770.5611241.1410803.649456
std7.46856125.40716522.81239928.1649310.8892740.9800010.9515311.02708610.16694411.569436...1.4909420.50930514.45427928.6508830.00602051.0606941.4270171.9080113.2348280.990191
min1.0000001.0000001.0000001.0000000.0000000.0000000.0000000.0000002.7800001.410000...1.0000000.0000001.0000001.0000000.0000000.2500000.0000000.0000000.0000001.000000
25%2.0000001.0000001.0000002.0000000.6900000.0000000.0000000.69000020.00000016.670000...3.0000000.00000010.0000009.0000000.00047739.1250000.0000000.0000000.0000003.200000
50%5.0000002.0000002.0000005.0000001.6100000.6900000.6900001.61000025.93000025.000000...4.0000000.33333321.00000017.0000000.00194461.8425930.0000000.0000000.5000003.800000
75%8.0000004.0000004.0000009.0000002.0800001.3900001.3900002.20000033.33000033.330000...5.0000000.66666734.00000032.0000000.00466695.3750001.0000000.0000001.3333334.333333
max360.0000002333.0000002093.0000002420.0000005.8900007.7500007.6500007.79000084.62000089.290000...5.0000007.00000053.0000001289.0000000.150618549.33333344.000000106.000000342.3000005.000000
\n", + "

8 rows × 40 columns

\n", + "
" + ], + "text/plain": [ + " q3 q4 q5 q6 q7 \\\n", + "count 24205.000000 24205.000000 24205.000000 24205.000000 24205.000000 \n", + "mean 6.673497 5.532121 4.990002 9.002644 1.507177 \n", + "std 7.468561 25.407165 22.812399 28.164931 0.889274 \n", + "min 1.000000 1.000000 1.000000 1.000000 0.000000 \n", + "25% 2.000000 1.000000 1.000000 2.000000 0.690000 \n", + "50% 5.000000 2.000000 2.000000 5.000000 1.610000 \n", + "75% 8.000000 4.000000 4.000000 9.000000 2.080000 \n", + "max 360.000000 2333.000000 2093.000000 2420.000000 5.890000 \n", + "\n", + " q8 q9 q10 q11 q12 \\\n", + "count 24205.000000 24205.000000 24205.000000 24205.000000 24205.000000 \n", + "mean 0.930915 0.863740 1.540158 26.765398 25.708965 \n", + "std 0.980001 0.951531 1.027086 10.166944 11.569436 \n", + "min 0.000000 0.000000 0.000000 2.780000 1.410000 \n", + "25% 0.000000 0.000000 0.690000 20.000000 16.670000 \n", + "50% 0.690000 0.690000 1.610000 25.930000 25.000000 \n", + "75% 1.390000 1.390000 2.200000 33.330000 33.330000 \n", + "max 7.750000 7.650000 7.790000 84.620000 89.290000 \n", + "\n", + " ... q16r q16u q16v q16w \\\n", + "count ... 24205.000000 24205.000000 24205.000000 24205.000000 \n", + "mean ... 3.633588 0.460916 22.550671 25.064697 \n", + "std ... 1.490942 0.509305 14.454279 28.650883 \n", + "min ... 1.000000 0.000000 1.000000 1.000000 \n", + "25% ... 3.000000 0.000000 10.000000 9.000000 \n", + "50% ... 4.000000 0.333333 21.000000 17.000000 \n", + "75% ... 5.000000 0.666667 34.000000 32.000000 \n", + "max ... 5.000000 7.000000 53.000000 1289.000000 \n", + "\n", + " q16x q16y q16z q16aa q16ab \\\n", + "count 24205.000000 24205.000000 24205.000000 24205.000000 24205.000000 \n", + "mean 0.003781 73.981978 0.642677 0.561124 1.141080 \n", + "std 0.006020 51.060694 1.427017 1.908011 3.234828 \n", + "min 0.000000 0.250000 0.000000 0.000000 0.000000 \n", + "25% 0.000477 39.125000 0.000000 0.000000 0.000000 \n", + "50% 0.001944 61.842593 0.000000 0.000000 0.500000 \n", + "75% 0.004666 95.375000 1.000000 0.000000 1.333333 \n", + "max 0.150618 549.333333 44.000000 106.000000 342.300000 \n", + "\n", + " q16ac \n", + "count 24205.000000 \n", + "mean 3.649456 \n", + "std 0.990191 \n", + "min 1.000000 \n", + "25% 3.200000 \n", + "50% 3.800000 \n", + "75% 4.333333 \n", + "max 5.000000 \n", + "\n", + "[8 rows x 40 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv('yelp_reviewers.csv')\n", + "print(df.shape)\n", + "df.dropna().describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Question 1 ###\n", + "\n", + "Choose an implementation of k-means and specify it in the google sheet \n", + "\n", + "** Answer **: \n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from sklearn.cluster import KMeans # Scikit-learn\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Question 2 ###\n", + "What is the best choice of k according to the silhouette metric for clustering q4-q6 (# of cool, funny, useful votes). Only consider 2 <= k <= 8. \n", + "\n", + "NOTE: For features with high variance, empty clusters can occur. There are several ways of dealing with empty clusters. A common approach is to drop empty clusters, the prefered approach for this Lab is to treat the empty cluster as a “singleton” leaving it empty with a single point placeholder. This can be accomplished in MATLAB, for example, with the command: [IDX,C]=kmeans(d,4, 'Distance', 'sqeuclidean','EmptyAction','singleton')\n", + "\n", + "**Answer**: " + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best choice: k = 2 , silhouette score = 0.98939672069\n" + ] + } + ], + "source": [ + "current_max, current_index = float(\"-inf\"),-1\n", + "#new_df = df.dropna().sample(n = 10000) # Sampling 10000 data points randomly since the whole dataset is too large to load\n", + "#print(type(new_df)) # Dataframe\n", + "#b = [1,3,5]\n", + "#print(df.iloc[:,b])\n", + "\n", + "for k in range(2,9):\n", + " kmeans = KMeans(n_clusters = k).fit(df.iloc[:, 1:4])\n", + " s_score = silhouette_score(df.iloc[:,1:4], kmeans.labels_, sample_size = 10000)\n", + " if s_score > current_max:\n", + " current_max = s_score\n", + " current_index = k\n", + "\n", + "print(\"Best choice: k = \", current_index, \", silhouette score = \", current_max)\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "\n", + "### Question 3 ###\n", + "Answer question 2 but using the log of the features (q7-q10)\n", + "\n", + "**Answer**: " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\n\\nfrom sklearn.preprocessing import Imputer\\n\\ncol_loc = new_df.columns.get_loc(\\'q7\\')\\n#new_df.iloc[:,col_loc:(col_loc+4)].head()\\n\\nlog_new_df = np.log(new_df.iloc[:,col_loc:(col_loc+4)])\\nlog_new_df[log_new_df == float(\\'-inf\\')] = float(\\'nan\\')\\n#print(log_new_df.head())\\nimputer = Imputer()\\nlog_new_df = imputer.fit_transform(log_new_df) # It is an array now\\n#print(log_new_df[:5])\\n\\n\\n\\ncurrent_max, current_index = float(\"-inf\"),-1\\nfor k in range(2,9):\\n kmeans = KMeans(n_clusters = k).fit(log_new_df)\\n s_score = silhouette_score(log_new_df, kmeans.labels_)\\n if s_score > current_max:\\n current_max = s_score\\n current_index = k\\nprint(\"Best choice: k = \", current_index)\\n\\n'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# I had taken log of the features q7-q10 in this code.\n", + "\n", + "\"\"\"\n", + "\n", + "from sklearn.preprocessing import Imputer\n", + "\n", + "col_loc = new_df.columns.get_loc('q7')\n", + "#new_df.iloc[:,col_loc:(col_loc+4)].head()\n", + "\n", + "log_new_df = np.log(new_df.iloc[:,col_loc:(col_loc+4)])\n", + "log_new_df[log_new_df == float('-inf')] = float('nan')\n", + "#print(log_new_df.head())\n", + "imputer = Imputer()\n", + "log_new_df = imputer.fit_transform(log_new_df) # It is an array now\n", + "#print(log_new_df[:5])\n", + "\n", + "\n", + "\n", + "current_max, current_index = float(\"-inf\"),-1\n", + "for k in range(2,9):\n", + " kmeans = KMeans(n_clusters = k).fit(log_new_df)\n", + " s_score = silhouette_score(log_new_df, kmeans.labels_)\n", + " if s_score > current_max:\n", + " current_max = s_score\n", + " current_index = k\n", + "print(\"Best choice: k = \", current_index)\n", + "\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best choice: k = 2 , silhouette score = 0.525805639106\n" + ] + } + ], + "source": [ + "from sklearn.preprocessing import Imputer\n", + "\n", + "col_loc = df.columns.get_loc('q7')\n", + "\n", + "\n", + "log_df = df.iloc[:,col_loc:(col_loc+4)]\n", + "log_df[log_df == float('-inf')] = float('nan')\n", + "#print(log_new_df.head())\n", + "imputer = Imputer()\n", + "log_df = imputer.fit_transform(log_df) # It is an array now\n", + "#print(log_new_df[:5])\n", + "\n", + "\n", + "\n", + "current_max, current_index = float(\"-inf\"),-1\n", + "for k in range(2,9):\n", + " kmeans = KMeans(n_clusters = k).fit(log_df)\n", + " s_score = silhouette_score(log_df, kmeans.labels_, sample_size = 10000)\n", + " if s_score > current_max:\n", + " current_max = s_score\n", + " current_index = k\n", + "print(\"Best choice: k = \", current_index, \", silhouette score = \", current_max)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#new_df.iloc[:,col_loc:(col_loc+4)].head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "\n", + "### Question 4 ###\n", + "Answer question 2 but using the percentage of the features (q11-q13)\n", + "\n", + "**Answer**:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(10000,)\n", + "Best choice: k = 8\n" + ] + } + ], + "source": [ + "# Here again, I took the percentage of each column w.r.t the sum of all the 3 columns\n", + "\n", + "\"\"\"\n", + "col_loc = new_df.columns.get_loc('q11')\n", + "new_df_slice = new_df.iloc[:,col_loc:(col_loc+3)]\n", + "sum_across_cols = new_df_slice.sum(axis=1) # Axis of repeat isn't supported in pandas' implememtation of repeat\n", + "\n", + "\n", + "#print(type(sum_across_cols)) # Series\n", + "#print(np.repeat(sum_across_cols, 3, axis =1).shape)\n", + "#percent_new_df = np.divide(, np.repeat(sum_across_cols, 3, axis=1))*100\n", + "\n", + "for i in range(len(new_df_slice.iloc[0])): # new_df_slice[:1] wasn't giving the desired results, think why\n", + " new_df_slice.iloc[:,i] = np.divide(new_df_slice.iloc[:,i], sum_across_cols)*100\n", + "#new_df_slice.describe()\n", + "\n", + "current_max, current_index = float(\"-inf\"),-1\n", + "for k in range(2,9):\n", + " kmeans = KMeans(n_clusters = k).fit(new_df_slice)\n", + " s_score = silhouette_score(new_df_slice, kmeans.labels_)\n", + " if s_score > current_max:\n", + " current_max = s_score\n", + " current_index = k\n", + "print(\"Best choice: k = \", current_index)\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best choice: k = 8\n" + ] + } + ], + "source": [ + "col_loc = df.columns.get_loc('q11')\n", + "df_slice = df.iloc[:,col_loc:(col_loc+3)]\n", + "\n", + "imputer = Imputer()\n", + "df_slice = imputer.fit_transform(df_slice)\n", + "current_max, current_index = float(\"-inf\"),-1\n", + "for k in range(2,9):\n", + " kmeans = KMeans(n_clusters = k).fit(df_slice)\n", + " s_score = silhouette_score(df_slice, kmeans.labels_, sample_size = 10000)\n", + " if s_score > current_max:\n", + " current_max = s_score\n", + " current_index = k\n", + "print(\"Best choice: k = \", current_index)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "\n", + "### Question 5 ###\n", + "Inspect the [best] clustering generated from question 4" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 5.a ####\n", + "**Question**: List the number of data points in each cluster (eg. C1: 2,000 C2: 4,200 etc)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "C0 : 8677, C1 : 14865, C2 : 86641, C3 : 5805, C4 : 4026, C5 : 10188, C6 : 32922, C7 : 8515, " + ] + } + ], + "source": [ + "kmeans = KMeans(n_clusters = current_index).fit(df_slice)\n", + "\n", + "from collections import Counter\n", + "cnt = Counter()\n", + "for label in kmeans.labels_:\n", + " cnt[label]+=1\n", + "for item in sorted(cnt.items(), key = lambda x: x[0]): # item is (key,value)\n", + " print(\"C\"+str(item[0]),\":\",item[1], end = \", \")\n", + "#print(sorted(cnt, key = lambda x:)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 5.b ####\n", + "**Question**: Were there clusters that represented very funny but useless reviewers? \n", + "\n", + "**Answer**: " + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 26.35629771 1.56193359 72.08165802]\n", + " [ 32.79166095 33.46908443 33.73584191]\n", + " [ 19.21344078 18.71325288 62.07314944]\n", + " [ 1.36427907 97.08347976 1.55237037]\n", + " [ 98.20565574 0.89977894 0.894615 ]\n", + " [ 49.12774441 2.46021692 48.41214861]\n", + " [ 0.17617186 0.40948758 99.41432112]\n", + " [ 2.01080446 46.42119789 51.56799883]]\n" + ] + } + ], + "source": [ + "print(kmeans.cluster_centers_)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From the coordinates of the cluster centers, we see that cluster 3 (in this case, the exact label could vary depending on initializations etc.) has only about 1.5% from useful votes and about 97% from funny votes. Instead of just looking at the cluster centers and saying this (which would be hard if there were many centers, we could also have a threshold, say 80%, for the difference between the percentages of funny and useful votes and return all clusters for which the threshold is exceeded." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 5.c ####\n", + "**Question**: How many reviewers were in the cluster that represented relatively equal strength in all voting categories (assuming such a cluster exists in your clustering)? \n", + "\n", + "**Answer**:" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The number of reviewers in the cluster that represented relatively equal strength in all voting categories: 14865\n" + ] + } + ], + "source": [ + "latest_cluster = -1 # The latest cluster that satisfies the required criteria\n", + "for i,centers in enumerate(kmeans.cluster_centers_):\n", + " if max(centers)-min(centers)<10: # some heuristic threshold\n", + " latest_cluster = i\n", + "if latest_cluster == -1:\n", + " print(\"No such cluster found\")\n", + "else:\n", + " print(\"The number of reviewers in the cluster that represented relatively equal strength in all voting categories: \",cnt[latest_cluster])\n", + " \n", + "# We could also have eyeballed it in this case since we see that cluster 6 has almost equal coordinates, but my code is more general, ofcourse with the caveat of having to select the threshold " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "\n", + "### Question 6 ###\n", + "Cluster the dataset using $k = 5$ and using features q7-q13 (log and % type votes) and q14 (most active year feature) and the natural log of q15 (avg review chars)" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "col_loc = df.columns.get_loc('q7')\n", + "q6_df = df.iloc[:,col_loc:(col_loc+8)] #q6 refers to question 6 here, not some feature\n", + "#new_df.iloc[:,new_df.columns.get_loc('q15')]\n", + "q6_df = q6_df.join(pd.DataFrame(np.log(df.iloc[:,df.columns.get_loc('q15')]))) \n", + "imputer = Imputer()\n", + "q6_df = imputer.fit_transform(q6_df)\n", + "\n", + "kmeans = KMeans(n_clusters = 5).fit(q6_df)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 6.a ####\n", + "**Question**: What is the silhouette metric for this clustering? \n", + "You may use the max, as you did in question 2. For a more in-depth understanding of cluster analysis with silhouette, look [here](http://scikit-learn.org/stable/auto_examples/cluster/plot_kmeans_silhouette_analysis.html)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The silhouette metric for this clustering is: 0.648573840098\n" + ] + } + ], + "source": [ + "s_score = silhouette_score(q6_df, kmeans.labels_, sample_size = 10000)\n", + "print(\"The silhouette metric for this clustering is: \", s_score)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 6.b ####\n", + "**Question**: What was the average “number of reviews per reviewer (q3)” among the points in each of the clusters (eg. C1: 1.4 C2: 4.2 C3: 3.4 etc)" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "C0 : 5.13274199769, C1 : 2.87911339962, C2 : 2.67239955971, C3 : 2.85209182152, C4 : 2.60288629012, " + ] + } + ], + "source": [ + "dict1 = {}\n", + "#for i in range(5):\n", + "# dict1[i] = list()\n", + "#print(kmeans.labels_[9999])\n", + "#print([new_df.iloc[9999,new_df.columns.get_loc('q3')]])\n", + "#print()\n", + "\n", + "for i in range(len(df)):\n", + " if kmeans.labels_[i] in dict1:\n", + " dict1[kmeans.labels_[i]].append(df.iloc[i,df.columns.get_loc('q3')])\n", + " else:\n", + " dict1[kmeans.labels_[i]] = ([df.iloc[i,df.columns.get_loc('q3')]])\n", + "#print(dict1.keys())\n", + "for key in sorted(dict1.keys()):\n", + " print(\"C\"+str(key),\":\",np.mean(np.array(dict1[key])), end =\", \")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "\n", + "### Question 7 ###\n", + "Cluster the dataset using the features described in question 6 + every group’s question 16 features (you may drop features with high incidents of -Inf / blank / or NaN values). It is suggested that you perform some form of normalization on these question 16 features so as not to over bias the clustering towards the larger magnitude features." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Data Cleansing and Normalization ####\n", + "Check how many null values there are in each column." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'q7': 0, 'q8': 117853, 'q9': 122162, 'q10': 81153, 'q11': 71282, 'q12': 71282, 'q13': 71282, 'q14': 0, 'q15': 0, 'q16a': 0, 'q16b': 0, 'q16c': 0, 'q16d': 0, 'q16e': 0, 'q16f': 0, 'q16g': 0, 'q16h': 0, 'q16i': 0, 'q16j': 0, 'q16k': 0, 'q16l': 0, 'q16m': 0, 'q16n': 0, 'q16o': 0, 'q16p': 0, 'q16q': 0, 'q16r': 0, 'q16s': 0, 'q16t': 0, 'q16u': 0, 'q16v': 0, 'q16w': 0, 'q16x': 0, 'q16y': 0, 'q16z': 0, 'q16aa': 0, 'q16ab': 47594, 'q16ac': 0}\n" + ] + } + ], + "source": [ + "from sklearn.preprocessing import MinMaxScaler\n", + "col_loc = df.columns.get_loc('q7')\n", + "q6_df = df.iloc[:,col_loc:(col_loc+8)] #q6 refers to question 6 here, not some feature\n", + "q6_df = q6_df.join(pd.DataFrame(np.log(df.iloc[:,df.columns.get_loc('q15')])))\n", + "q7_df = pd.DataFrame(q6_df).join(df.iloc[:,df.columns.get_loc('q16a'):])\n", + "#print(q7_df.shape)\n", + "#print(q7_df.head())\n", + "#print(q7_df['q8'].isnull().sum())\n", + "\n", + "d = {}\n", + "for col in q7_df.columns:\n", + " d[col] = np.sum(q7_df[col].isnull().sum())\n", + "print(d)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It looks like q8 - q13 and q16ab have a lot of null values, especially q8 and q9. Let's see what the impact is of removing some of these columnsbefore removing any columns" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#print(q7_df.columns)\n", + "del q7_df['q8'] # Could also do df.drop\n", + "del q7_df['q9']\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "By removing 2 features, we double the number of rows remaining. That's pretty good. \n", + "Preprocess categorical variables to dummy values." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{dtype('float64'), dtype('int64'), dtype('O')}\n", + " q7 q10 q11 q12 q13 q14 q15 q16a q16b q16c \\\n", + "1 1.10 0.00 0.0 0.0 100.0 9 5.030438 0 0.577350 0.002179 \n", + "3 1.10 0.00 0.0 0.0 100.0 10 6.219934 1 2.309401 0.000663 \n", + "5 1.10 1.10 0.0 0.0 100.0 9 5.950643 0 2.309401 0.002604 \n", + "6 2.08 1.79 25.0 0.0 75.0 9 6.013104 5 1.995531 0.002446 \n", + "9 0.69 0.00 0.0 50.0 50.0 9 5.898527 1 2.121320 0.002743 \n", + "\n", + " ... q16t q16u q16v q16w q16x q16y q16z q16aa \\\n", + "1 ... 1 1.0 19 14 0.000000 21.833333 1 0 \n", + "3 ... 1 0.0 8 11 0.002242 61.500000 0 0 \n", + "5 ... 1 0.0 27 11 0.005814 41.000000 0 0 \n", + "6 ... 0 0.5 1 27 0.006479 42.156250 0 0 \n", + "9 ... 1 0.5 31 7 0.000000 56.750000 0 0 \n", + "\n", + " q16ab q16ac \n", + "1 0.333333 4.666667 \n", + "3 0.333333 3.666667 \n", + "5 1.000000 3.666667 \n", + "6 1.000000 3.375000 \n", + "9 1.000000 3.500000 \n", + "\n", + "[5 rows x 36 columns]\n" + ] + } + ], + "source": [ + "q7_df = q7_df.dropna() # Till now I have been imputing and not dropping the NaN values, but siunce this question refers to dropping NaN, I have done so here\n", + "list_of_types = []\n", + "for col in q7_df.columns:\n", + " list_of_types.append(q7_df[col].dtype)\n", + "print(set(list_of_types))\n", + "\n", + "for col in q7_df.columns:\n", + " if q7_df[col].dtype == 'O':\n", + " cats = set(q7_df[col])\n", + " #print(cats)\n", + " count = 0\n", + " d = {}\n", + " for elt in cats:\n", + " d[elt] = count\n", + " count+=1\n", + " #print(d)\n", + " #break\n", + " new_q7 = []\n", + " for elt in q7_df[col]:\n", + " new_q7.append(d[elt])\n", + " q7_df[col]=new_q7\n", + " \n", + "print(q7_df.head()) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now normalize the remaining features." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "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", + "
q7q10q11q12q13q14q15q16aq16bq16c...q16tq16uq16vq16wq16xq16yq16zq16aaq16abq16ac
00.1867570.0000000.0000000.0000001.0000000.8333330.5110360.00.2041240.000654...1.00.1111110.3461540.0100930.0000000.0315550.0227270.00.0009740.916667
10.1867570.0000000.0000000.0000001.0000000.9166670.6778440.10.8164970.000187...1.00.0000000.1346150.0077640.0058090.0895470.0000000.00.0009740.666667
20.1867570.1412070.0000000.0000001.0000000.8333330.6400800.00.8164970.000784...1.00.0000000.5000000.0077640.0150630.0595760.0000000.00.0029210.666667
30.3531410.2297820.2678670.0000000.7380830.8333330.6488400.50.7055270.000736...0.00.0555560.0000000.0201860.0167860.0612660.0000000.00.0029210.593750
40.1171480.0000000.0000000.5599730.4761660.8333330.6327720.10.7500000.000827...1.00.0555560.5769230.0046580.0000000.0826020.0000000.00.0029210.625000
\n", + "

5 rows × 36 columns

\n", + "
" + ], + "text/plain": [ + " q7 q10 q11 q12 q13 q14 q15 q16a \\\n", + "0 0.186757 0.000000 0.000000 0.000000 1.000000 0.833333 0.511036 0.0 \n", + "1 0.186757 0.000000 0.000000 0.000000 1.000000 0.916667 0.677844 0.1 \n", + "2 0.186757 0.141207 0.000000 0.000000 1.000000 0.833333 0.640080 0.0 \n", + "3 0.353141 0.229782 0.267867 0.000000 0.738083 0.833333 0.648840 0.5 \n", + "4 0.117148 0.000000 0.000000 0.559973 0.476166 0.833333 0.632772 0.1 \n", + "\n", + " q16b q16c ... q16t q16u q16v q16w q16x \\\n", + "0 0.204124 0.000654 ... 1.0 0.111111 0.346154 0.010093 0.000000 \n", + "1 0.816497 0.000187 ... 1.0 0.000000 0.134615 0.007764 0.005809 \n", + "2 0.816497 0.000784 ... 1.0 0.000000 0.500000 0.007764 0.015063 \n", + "3 0.705527 0.000736 ... 0.0 0.055556 0.000000 0.020186 0.016786 \n", + "4 0.750000 0.000827 ... 1.0 0.055556 0.576923 0.004658 0.000000 \n", + "\n", + " q16y q16z q16aa q16ab q16ac \n", + "0 0.031555 0.022727 0.0 0.000974 0.916667 \n", + "1 0.089547 0.000000 0.0 0.000974 0.666667 \n", + "2 0.059576 0.000000 0.0 0.002921 0.666667 \n", + "3 0.061266 0.000000 0.0 0.002921 0.593750 \n", + "4 0.082602 0.000000 0.0 0.002921 0.625000 \n", + "\n", + "[5 rows x 36 columns]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cols = q7_df.columns\n", + "scaler = MinMaxScaler()\n", + "scaler.fit(q7_df)\n", + "q7_df = pd.DataFrame(scaler.transform(q7_df), columns = cols)\n", + "#q7_df = pd.DataFrame(normalize(q7_df, axis = 0))\n", + "q7_df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 7.a ####\n", + "**Question**: Using the silhouette metric, what was the best k? \n", + "\n", + "**Answer**: " + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best choice: k = 2 , silhouette score = 0.232197223377\n" + ] + } + ], + "source": [ + "current_max, current_index = float(\"-inf\"),-1\n", + "sse = []\n", + "for k in range(2,9):\n", + " kmeans = KMeans(n_clusters = k).fit(q7_df)\n", + " sse.append(kmeans.inertia_)\n", + " s_score = silhouette_score(q7_df, kmeans.labels_, sample_size = 10000)\n", + " if s_score > current_max:\n", + " current_max = s_score\n", + " current_index = k\n", + "\n", + "print(\"Best choice: k = \", current_index, \", silhouette score = \", current_max)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 7.b ####\n", + "**Question**: Using the the sum of within cluster variance metric with the elbow method what was the best k? \n", + "**Answer**: " + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n9TpKlezYsYMNGzYwZcoUFixYwCeffEJmZqbXsarM5/MBEBsbS+/evdm9e7fHiU6f3+/H7/eXX42m\npKSwd+9ej1NVz+bNm2nXrh3NmjXzOkqVbd26lRYtWhATE0N4eDh9+vRh586dtfZ5Dea2krWWxYsX\n07p1ay655BKv41TL4cOHCQsLIyoqipKSErZu3crll1/udawqGTt2LGPHjgVg27ZtvPTSS0ydOtXj\nVFVz7NgxrLU0bdqUY8eO8fHHHzN69GivY522Zs2a4ff72b9/P61atWLr1q2cffbZXseqlvp+Swkg\nPj6eXbt2cfz4cRo3bszWrVvp0KFDrX1egymHHTt2kJ2dTdu2bbn11lsBuOaaa+jZs6fHyU5fYWEh\nCxcuxHVdrLX07duXXr16eR2rwTt06BBz584FArdm+vfvT2JiosepqmbChAlkZmZSWlpKixYtSEtL\n8zpSlR0/fpyPP/6YSZMmeR2lWhISEkhJSeH2228nLCyMc889t1bntPSEtIiIVNCg5hxERKRyVA4i\nIlKBykFERCpQOYiISAUqBxERqUDlICIiFagcRESkApWDiIhU8P8BVy0MU2vLZloAAAAASUVORK5C\nYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "k = range(2,9)\n", + "plt.plot(k,sse)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "By the elbow method, it is seen that maximum slope change occurs at k=3." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Question 8 ###\n", + "For this question please come up with your own question about this dataset and using a clustering technique as part of your method of answering it. This question answer should be submitted to a bCourses assignment in the form a pdf. This report is expected to be between 2 and 3 pages. It is meant to give you practice writing up your results. The report should have the following sections:\n", + "\n", + "\n", + "RESEARCH QUESTION: Describe what it is you want to ask of this dataset\n", + " (the question can not be the same as question 9)\n", + " \n", + " \n", + "DATASET: describe the yelp_reviews to yelp_reviewers transformation. have a subsection called FEATURES SELECTED: briefly describe the features from the dataset you choose (at least 1 features should be from a q16)\n", + "\n", + "\n", + "METHODS: Briefly describe the methods you used (such as k-means) and why you used them\n", + "\n", + "\n", + "RESULTS: Here you can tell the story of how you investigated the question (plots are always nice) and the conclusions you drew.\n", + "\n", + "\n", + "NOTE: If you are hypothesizing that clusters might be formed with respect to a particular attribute, consider withholding that attribute from clustering and then looking to see what the mean value or distribution of that attribute is among the formed clusters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#I have submitted the pdf and a separate Ipython notebook for this titled Lab2 Q8.ipynb." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Bonus question (+15%) - Reviewer overlap:\n", + "Create a dataset with f reviewers as the rows and business_ids as the columns (there are a lot) where the feature value is is ‘1’ if the reviewer has written a review for that business and ‘0’ if not. Use the methods described in this assignment to answer the question of how much overlap of businesses reviewed exists among reviewers in this dataset. Append this answer to your question 8 document." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Attached after Q8\n", + "\n" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Lab3_Decision_Trees.ipynb b/Lab3_Decision_Trees.ipynb new file mode 100644 index 0000000..2480693 --- /dev/null +++ b/Lab3_Decision_Trees.ipynb @@ -0,0 +1,511 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Lab 3 - Decision Trees" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This assignment uses a dataset obtained from the JSE Data Archive that aims at identifying whether there is a statistically significant dependence between gender and biological/activity traits in humans. \n", + "\n", + "FEATURE DESCRIPTIONS: \n", + "\n", + "
    \n", + "
  • Color (Blue, Brown, Green, Hazel, Other)\n", + "
  • Age (in years)\n", + "
  • YearinSchool (First, Second, Third, Fourth, Other)\n", + "
  • Height (in inches)\n", + "
  • Miles (distance from home town of student to Ames, IA) \n", + "
  • Brothers (number of brothers)\n", + "
  • Sisters (number of sisters)\n", + "
  • CompTime (number of hours spent on computer per week)\n", + "
  • Exercise (whether the student exercises Yes or No)\n", + "
  • ExerTime (number of hours spent exercising per week)\n", + "
  • MusicCDs (number of music CDs student owns)\n", + "
  • PlayGames (number of hours spent playing games per week)\n", + "
  • WatchTV (number of hours spent watching TV per week\n", + "
\n", + "\n", + "https://ww2.amstat.org/publications/jse/jse_data_archive.htm" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from collections import Counter, defaultdict\n", + "from itertools import combinations \n", + "import pandas as pd\n", + "import numpy as np\n", + "import operator" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 2068 entries, 0 to 2067\n", + "Data columns (total 14 columns):\n", + "gender 2068 non-null object\n", + "age 2068 non-null int64\n", + "year 2068 non-null object\n", + "eyecolor 2068 non-null object\n", + "height 2051 non-null float64\n", + "miles 2052 non-null float64\n", + "brothers 2068 non-null int64\n", + "sisters 2068 non-null int64\n", + "computertime 2061 non-null float64\n", + "exercise 2068 non-null object\n", + "exercisehours 2068 non-null float64\n", + "musiccds 2024 non-null float64\n", + "playgames 2067 non-null float64\n", + "watchtv 2067 non-null float64\n", + "dtypes: float64(7), int64(3), object(4)\n", + "memory usage: 226.3+ KB\n" + ] + } + ], + "source": [ + "df = pd.read_csv('Eye_Color.csv')\n", + "df.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 1988 entries, 0 to 1987\n", + "Data columns (total 14 columns):\n", + "gender 1988 non-null object\n", + "age 1988 non-null int64\n", + "year 1988 non-null object\n", + "eyecolor 1988 non-null object\n", + "height 1988 non-null float64\n", + "miles 1988 non-null float64\n", + "brothers 1988 non-null int64\n", + "sisters 1988 non-null int64\n", + "computertime 1988 non-null float64\n", + "exercise 1988 non-null object\n", + "exercisehours 1988 non-null float64\n", + "musiccds 1988 non-null float64\n", + "playgames 1988 non-null float64\n", + "watchtv 1988 non-null float64\n", + "dtypes: float64(7), int64(3), object(4)\n", + "memory usage: 217.5+ KB\n" + ] + }, + { + "data": { + "text/plain": [ + "30" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# remove NA's and reset the index\n", + "df = df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)\n", + "df = df.reset_index(drop=True)\n", + "df.info()\n", + "df.head()\n", + "len(df.height.unique())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Calculating Gini Index " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "**Question 1: How many rows are there in the dataset for males? For females? **\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "male: 910 female: 1078\n" + ] + } + ], + "source": [ + "grouped=df.groupby('gender').size()\n", + "grouped\n", + "print('male: ',grouped['male'],'female: ',grouped['female'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Question 2: What is the Gini Index of this dataset, using males and females as the target classes?**" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.496429279905\n" + ] + } + ], + "source": [ + "ratio=grouped['female']/(grouped['female']+grouped['male'])\n", + "\n", + "def gini(p):\n", + " return 1-p*p-(1-p)*(1-p)\n", + "print(gini(ratio))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Best Split of a Numeric Feature" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Question 3: What is the best split point of the 'height' feature. **" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[44.0, 52.0, 54.0, 56.0, 57.0, 58.0, 59.0, 60.0, 61.0, 62.0, 63.0, 64.0, 65.0, 66.0, 67.0, 68.0, 69.0, 70.0, 71.0, 72.0, 73.0, 74.0, 75.0, 76.0, 77.0, 78.0, 79.0, 80.0, 82.0, 85.0]\n", + "[48.0, 53.0, 55.0, 56.5, 57.5, 58.5, 59.5, 60.5, 61.5, 62.5, 63.5, 64.5, 65.5, 66.5, 67.5, 68.5, 69.5, 70.5, 71.5, 72.5, 73.5, 74.5, 75.5, 76.5, 77.5, 78.5, 79.5, 81.0, 83.5]\n" + ] + }, + { + "ename": "KeyError", + "evalue": "'female'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\indexes\\base.py\u001b[0m in \u001b[0;36mget_value\u001b[1;34m(self, series, key)\u001b[0m\n\u001b[0;32m 2482\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2483\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mlibts\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_value_box\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2484\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mIndexError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32mpandas/_libs/tslib.pyx\u001b[0m in \u001b[0;36mpandas._libs.tslib.get_value_box (pandas\\_libs\\tslib.c:18843)\u001b[1;34m()\u001b[0m\n", + "\u001b[1;32mpandas/_libs/tslib.pyx\u001b[0m in \u001b[0;36mpandas._libs.tslib.get_value_box (pandas\\_libs\\tslib.c:18477)\u001b[1;34m()\u001b[0m\n", + "\u001b[1;31mTypeError\u001b[0m: 'str' object cannot be interpreted as an integer", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 25\u001b[0m \u001b[1;31m# bsplitcount=bottomcount['male'] + bottomcount['female']\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 26\u001b[0m \u001b[1;31m#else:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 27\u001b[1;33m \u001b[0mbsplitcount\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mbottomcount\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'male'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mbottomcount\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'female'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 28\u001b[0m \u001b[0mbottomsplitprob\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mbottomcount\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'male'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0mbsplitcount\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 29\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\series.py\u001b[0m in \u001b[0;36m__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 599\u001b[0m \u001b[0mkey\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcom\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_apply_if_callable\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 600\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 601\u001b[1;33m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_value\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 602\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 603\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mis_scalar\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\indexes\\base.py\u001b[0m in \u001b[0;36mget_value\u001b[1;34m(self, series, key)\u001b[0m\n\u001b[0;32m 2489\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mInvalidIndexError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2490\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2491\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0me1\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2492\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mException\u001b[0m\u001b[1;33m:\u001b[0m \u001b[1;31m# pragma: no cover\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2493\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0me1\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\indexes\\base.py\u001b[0m in \u001b[0;36mget_value\u001b[1;34m(self, series, key)\u001b[0m\n\u001b[0;32m 2475\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2476\u001b[0m return self._engine.get_value(s, k,\n\u001b[1;32m-> 2477\u001b[1;33m tz=getattr(series.dtype, 'tz', None))\n\u001b[0m\u001b[0;32m 2478\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0me1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2479\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m0\u001b[0m \u001b[1;32mand\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minferred_type\u001b[0m \u001b[1;32min\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;34m'integer'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'boolean'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_value\u001b[1;34m()\u001b[0m\n", + "\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_value\u001b[1;34m()\u001b[0m\n", + "\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n", + "\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n", + "\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n", + "\u001b[1;31mKeyError\u001b[0m: 'female'" + ] + } + ], + "source": [ + "sorted_heights = sorted(df[\"height\"].unique())\n", + "print(sorted_heights)\n", + "psp=[] #potential split point\n", + "for i,value in enumerate(sorted_heights):\n", + " if i<29:\n", + " midpoint=((sorted_heights[i]+sorted_heights[i+1])/2)\n", + " psp=np.append(midpoint,psp)\n", + "print(sorted(psp))\n", + "\n", + "for x in psp:\n", + " top=df[df['height']<=x]\n", + " topcount=top.groupby('gender').size()\n", + " bottom=df[df['height']>x]\n", + " bottomcount=bottom.groupby('gender').size()\n", + " \n", + " #if len(topcount==1):\n", + " # topsplitprob=1\n", + " # tsplitcount=topcount['male'] + topcount['female']\n", + " #else:\n", + " tsplitcount=topcount['male'] + topcount['female']\n", + " topsplitprob=topcount['male']/tsplitcount\n", + " \n", + " #if len(bottomcount==1):\n", + " # bottomsplitprob=1\n", + " # bsplitcount=bottomcount['male'] + bottomcount['female']\n", + " #else:\n", + " bsplitcount=bottomcount['male'] + bottomcount['female']\n", + " bottomsplitprob=bottomcount['male']/bsplitcount \n", + " \n", + " # totalcount=bsplitcount+tsplitcount\n", + " # final_gini=gini(tsplitcount)*(topsplitprob/totalcount) +gini(bottomsplitprob)*(bsplitcount/totalcount)\n", + " \n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Question 4: What is the Gini Index of this best split?**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Question 5: How much does this partitioning reduce the Gini Index over that of the overall dataset?**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Question 6: How many 'female' rows are below your best split point? 'male' rows?**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Question 7: How many 'female' rows are above your best split point? 'male' rows?**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Recall that, to calculate the best split of this numeric field, you'll need to order your data by 'height', then consider the midpoint between each pair of consecutive heights as a potential split point, then calculate the Gini Index for that partitioning. You'll want to keep track of the best split point and its Gini Index (remember that you are trying to minimize the Gini Index). \n", + "\n", + "There are a lot of ways to do this. Some are very fast, others very slow. One tip to make this run quickly is, as you consecutively step through the data and calculate the Gini Index of each possible split point, keep a running total of the number of rows for each candidate that are located above and below the split point. \n", + "\n", + "Some Python tips: \n", + "\n", + "* Counter(), from the collections module, is a special dictionary for counting values of a key\n", + "* zip() lets you concatenate lists into a list of tuples (for example, if we have a list of the candidates and a list of transaction amounts, zip(candidate_list, transaction_amount) would give us a list of (candidate, transaction amount) pairs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Best Split of a Categorial Variable" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Question 8: How many possible splits are there of the eyecolor feature?**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Question 9: Which split of eyecolor best splits the female and male rows, as measured by the Gini Index?**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Question 10: What is the Gini Index of this best split?**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Question 11: How much does this partitioning reduce the Gini Index over that of the overall data set?**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Question 12: How many 'female' rows and 'male' rows are in your first partition? How many 'female' rows and 'male' rows are in your second partition?**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Python tip: the combinations function of the itertools module allows you to enumerate combinations of a list. You might want to Google 'power set'." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Training a decision tree" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Question 13: Using all of the features in the original dataframe read in at the top of this notebook, train a decision tree classifier that has a depth of three (including the root node and leaf nodes). What is the accuracy of this classifier on the training data?**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Scikit-learn classifiers require class labels and features to be in numeric arrays. As such, you will need to turn your categorical features into numeric arrays using DictVectorizer. This is a helpful notebook for understanding how to do this: http://nbviewer.ipython.org/gist/sarguido/7423289. You can turn a pandas dataframe of features into a dictionary of the form needed by DictVectorizer by using df.to_dict('records'). Make sure you remove the class label first (in this case, gender). If you use the class label as a feature, your classifier will have a training accuracy of 100%! The example notebook link also shows how to turn your class labels into a numeric array using sklearn.preprocessing.LabelEncoder()." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import sklearn\n", + "from sklearn.tree import DecisionTreeClassifier\n", + "from sklearn.feature_extraction import DictVectorizer #to turn categorial variables into numeric arrays\n", + "from sklearn import preprocessing #to transform the feature labels" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Question 14: Using the following code snippet, export your decision tree to graphviz and visualize it. In your write-up, write down the interpretation of the rule at each node which is used to perform the splitting.**\n", + "\n", + "In order to install graphviz, you may need to download the tool from [this website](https://graphviz.gitlab.io), and then pip3/conda install the python libraries you do not have.\n", + "\n", + "Mac users can use ```brew install graphviz``` instead of following the link, and linux users can do the same using their favourite package manager (for example, Ubuntu users can use ```sudo apt-get install graphviz```, followed by the necessary pip3/conda installations." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from IPython.display import Image \n", + "import pydotplus \n", + "import pydot\n", + "from sklearn.externals.six import StringIO\n", + "\n", + "#\n", + "# clf = your classifier\n", + "\n", + "dotfile = StringIO() \n", + "tree.export_graphviz(clf, out_file=dotfile,\n", + "# feature_names=df.columns, \n", + "# class_names=['Female', 'Male'], \n", + " filled=True, rounded=True, \n", + " special_characters=True)\n", + " \n", + "graph = pydotplus.graph_from_dot_data(dotfile.getvalue())\n", + "Image(graph.create_png())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Question 15 (Extra Credit): For each of your leaf nodes, specify the percentage of 'female' rows in that node (out of the total number of rows at that node).**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "See this notebook for the basics of training a decision tree in scikit-learn and exporting the outputs to view in graphviz: http://nbviewer.ipython.org/gist/tebarkley/b68c04d9b31e64ce6023" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "gist_id": "0945553f802dad1bfa88", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Pre-Lab 2 Tutorial.ipynb b/Pre-Lab 2 Tutorial.ipynb new file mode 100644 index 0000000..c142ec5 --- /dev/null +++ b/Pre-Lab 2 Tutorial.ipynb @@ -0,0 +1,469 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Learning Goals:\n", + "\n", + "1. Jupyter functionality for markdown text\n", + "2. Plotting with matplotlib\n", + "3. Using scikit-learn for k-means\n", + "4. Calculate silhouette_score" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 1. Markdown" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can do cool stuff with markdown. You can make numbered or bullet lists. You can even write cool equations like: $\\sum{x}=\\log(y)$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2. Matplotlib\n", + "matplotlib.pyplot is a collection of command style functions that make matplotlib work like MATLAB. Each pyplot function makes some change to a figure: e.g., creates a figure, creates a plotting area in a figure, plots some lines in a plotting area, decorates the plot with labels, etc." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline \n", + "x=np.array(range(10))\n", + "y=np.array([1,1.1,1.2,1.3,4,2.3,3.9,7,10,15])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nGGNMof4fNeY6JvufmY0AAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(x,y)\n", + "plt.plot(x,y,color='r',linewidth=5)\n", + "plt.plot(x,y,x,-y)\n", + "plt.xlabel('Years')\n", + "plt.ylabel('Portfolio [$]')\n", + "plt.title('Stocks')\n", + "plt.legend(['good','bad'])\n", + "#plt.xlim([-1,5])\n", + "#plt.ylim([1,10])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(x,y)\n", + "#plt.scatter(x+5,y-5)\n", + "#plt.legend(['original','shifted'])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#plt.figure(1,figsize=(10,5))\n", + "plt.subplot(121)\n", + "plt.title('Plot 1')\n", + "plt.plot(x,y)\n", + "plt.subplot(122)\n", + "plt.title('Plot 2')\n", + "plt.plot(-x,-y)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 3. Scikit-learn K-means" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from sklearn.cluster import KMeans\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(8, 2)\n" + ] + } + ], + "source": [ + "X = np.array([[1, 2], [1, 4], [1.5, 3], [4, 2], [4, 4], [3.5, 1.9],[3.7,3],[4.2,3.8]])\n", + "print(X.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\nfcz2G7bvLHumsti+yPbLtl9tnItflj1T2Wz32J6y/ZeyZymT7eO2p20fLfJYYNvWuBtb4/8p6Tuq\nP0L4iqRbI+LNtvwDidj+pqRTkh6JiGvKnqdMti+XdHlEHLF9iaRJSXs26XVhSVsj4pTtXkmHJd0Z\nES+WPFppbP9EUlXSpRGxu+x5ymL7uKRqRBTajNTOd9xsjW+IiEOS3it7jm4QEe9ExJHG1x9IOqb6\nbtxNJ+pONb7tbfzatE8H2N4u6SZJD5Y9SzbtDPdqW+M35Q2K1dm+UtKQpJfKnaQ8jaWBo5JOSjoQ\nEZv2XEh6QNLdkj4qe5AuEJL+bnuy8d+HnFc7w11oazw2J9sXS3pK0l0R8X7Z85QlIpYi4jrVdyDv\nsL0pl9Js75Z0MiImy56lS+yMiK+p/r+w/rCx3LqmdoabrfFYVWM99ylJj0XEvrLn6QYRsSDpoKRd\nJY9Slp2Sbm6s7T4h6Xrbj5Y7UnkiYq7x+0lJT6u+9LymdoabrfE4R+MDuYckHYuI+8uep0y2+233\nNb6uSLpB0j/KnaocETEaEdsj4krVW/FcRNxW8lilsL218cG9bG+VdKOk8z6R1rZwR8QZSctb449J\nerLA1vgNyfbjkl6QNGj7hO07yp6pRDsl3a76O6qjjV/fK3uoklwu6Xnbr6n+RudARGzqx+AgSbpM\n0mHbr0p6WdIzEfHs+X6ALe8AkAw7JwEgGcINAMkQbgBIhnADQDKEGwCSIdwAkAzhBoBk/gfNmMVt\nb4m+WQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(X[:,0],X[:,1])\n", + "plt.xlim([0,5])\n", + "plt.ylim([0,5])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "kmeans = KMeans(n_clusters=2, random_state=0).fit(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 1, 1, 0, 0, 0, 0, 0])" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "kmeans.labels_" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 0])" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "kmeans.predict([[0, 0], [4, 4]])" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 3.88 , 2.94 ],\n", + " [ 1.16666667, 3. ]])" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "kmeans.cluster_centers_" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nkMJdRCRA/x+kBSaIu17TZwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(X[:,0],X[:,1])\n", + "plt.scatter(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1],color='r')\n", + "plt.legend(['Training Data','Cluster Center'])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 4. Scikit-learn Silhouette_score" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Silhouette Coefficient is calculated using the mean intra-cluster distance (a) and the mean nearest-cluster distance (b) for each sample. The Silhouette Coefficient for a sample is $\\frac{(b - a)}{\\max(a, b)}$. To clarify, b is the distance between a sample and the nearest cluster that the sample is not a part of.\n", + "\n", + "http://scikit-learn.org/stable/modules/generated/sklearn.metrics.silhouette_score.html" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from sklearn.metrics import silhouette_score" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "score = silhouette_score(X, kmeans.labels_)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.546688066289\n" + ] + } + ], + "source": [ + "print(score)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW4AAAD8CAYAAABXe05zAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAC+5JREFUeJzt3FFonfUZx/Hfb2mGoToyMJM2VbrB\nSBHLzHboBoUxxZluigu9mqBXg9xso24jsu5meNWLgniziwWVbeh0QmsZbjMr2CKFWU3aaq2xQ1yH\nTYTEuaCF4Nr02UVOjDUnOW/sOXnznHw/EHrO27ftw0v75e3/vP84IgQAyONzZQ8AAFgZwg0AyRBu\nAEiGcANAMoQbAJIh3ACQzIYiJ9k+J+lDSbOSLkVEpZlDAQCWVijcVbdFxHtNmwQAUAhLJQCQjIvs\nnLT9L0n/lRSSfhsRQzXOGZA0IEkbN278xrZt2xo8KgC0rtHR0fcioqvIuUXDvTkiJmx/SdJhST+N\niBeXOr9SqcTIyEjhgQFgvbM9WvTzw0JLJRExUf1xUtKzknZ89vEAAFejbrhtb7R93fxrSXdKer3Z\ngwEAaivyVMkNkp61PX/+HyPi+aZOBQBYUt1wR8Tbkr62CrMAAArgcUAASIZwA0AyhBsAkiHcAJAM\n4QaAZAg3ACRDuAEgGcINAMkQbgBIhnADQDKEGwCSIdwAkAzhBoBkCDcAJEO4ASAZwg0AyRBuAEiG\ncANAMoQbAJIh3ACQDOEGgGQINwAkQ7gBIBnCDQDJEG4ASIZwA0AyhBsAkiHcAJAM4QaAZAg3ACRD\nuAEgGcINAMkQbgBIhnADQDKEGwCSKRxu2222T9p+rpkDAQCWt5I77j2Sxpo1CACgmELhtr1F0l2S\nHm3uOACAeorecT8i6UFJl5c6wfaA7RHbI1NTUw0ZDgCwWN1w275b0mREjC53XkQMRUQlIipdXV0N\nGxAAcKUid9w7Jd1j+5ykpyXdbvuJpk4FAFhS3XBHxN6I2BIRWyX9UNILEXFf0ycDANTEc9wAkMyG\nlZwcEUclHW3KJACAQrjjBoBkCDcAJEO4ASAZwg0AyRBuAEiGcANAMoQbAJIh3ACQDOEGgGQINwAk\nQ7gBIBnCDQDJEG4ASIZwA0AyhBsAkiHcAJAM4QaAZAg3ACRDuAEgGcINAMkQbgBIhnADQDKEGwCS\nIdwAkAzhBoBkCDcAJEO4ASAZwg0AyRBuAEiGcANAMoQbAJIh3ACQDOEGgGQINwAkUzfctq+x/bLt\nV22fsf3QagwGAKhtQ4FzPpJ0e0RcsN0u6Zjtv0XES02eDQBQQ91wR0RIulB92179imYOBQBYWqE1\nbttttk9JmpR0OCKO1zhnwPaI7ZGpqalGzwkAqCoU7oiYjYhbJW2RtMP2LTXOGYqISkRUurq6Gj0n\nAKBqRU+VRMS0pKOSdjVlGgBAXUWeKumy3Vl93SHpDklvNnswAEBtRZ4q2STp97bbNBf6ZyLiueaO\nBQBYSpGnSl6T1LsKswAACmDnJAAkQ7gBIBnCDQDJEG4ASIZwA0AyhBsAkiHcAJAM4QaAZAg3ACRD\nuAEgGcINAMkQbgBIhnADQDKEGwCSIdwAkAzhBoBkCDcAJEO4ASAZwg0AyRBuAEiGcANAMoQbAJIh\n3ACQDOEGgGQINwAkQ7gBIBnCDQDJEG4ASIZwA0AyhBsAktlQ9gAA1p9DJ8e1f/isJqZntLmzQ4N9\nPerv7S57rDQIN4BVdejkuPYePK2Zi7OSpPHpGe09eFqSiHdBLJUAWFX7h89+HO15MxdntX/4bEkT\n5UO4AayqiemZFR3HYoQbwKra3NmxouNYrG64bd9o+4jtMdtnbO9ZjcEAtKbBvh61t/mKY+1t1mBf\nT0kT5VPkw8lLkn4RESdsXydp1PbhiHijybMBaFVR5z2WVfeOOyLejYgT1dcfShqTxEe/AD6T/cNn\ndfHylaW+eDn4cHIFVrTGbXurpF5Jx2v83IDtEdsjU1NTjZkOQMvhw8mrV/g5btvXSjog6YGI+ODT\nPx8RQ5KGJKlSqfAfHwA1be7s0HiNSM9/OMnmnPoK3XHbbtdctJ+MiIPNHQlAKxvs61FHe9sVxzra\n2zTY1/Px5pzx6RmFFjbnHDo5Xs6wa1SRp0os6TFJYxHxcPNHAtDK+nu7tW/3dnV3dsiSujs7tG/3\ndvX3drM5p6AiSyU7Jd0v6bTtU9Vjv4qIvzZvLACtrL+3u+byB+vfxdQNd0Qck+R65wHA1aq3/o05\n7JwEsGYst/6NBXx3QABrxvzyCU+VLI9wA1hTllr/xgKWSgAgGcINAMkQbgBIhnADQDKEGwCSIdwA\nkAzhBoBkCDcAJEO4ASAZwg0AyRBuAEiGcANAMoQbAJIh3ACQDOEGgGQINwAkQ7gBIBnCDQDJEG4A\nSIZwA0AyhBsAkiHcAJAM4QaAZAg3ACRDuAEgGcINAMkQbgBIZkPZA7SqQyfHtX/4rCamZ7S5s0OD\nfT3q7+1e8jgAFEW4m+DQyXHtPXhaMxdnJUnj0zPae/C0Rv79vg6Mji86Lol4AyiMpZIm2D989uM4\nz5u5OKunjr9T8/j+4bOrOR6A5Ah3E0xMz9Q8PhuxovMBoJa64bb9uO1J26+vxkCtYHNnR83jbfaK\nzgeAWorccf9O0q4mz9FSBvt61NHedsWxjvY2fesrX6x5/m3bulZjLAAtom64I+JFSe+vwiwto7+3\nW/t2b1d3Z4csqbuzQ/t2b9e5/9ReEjny5tTqDgggtYY9VWJ7QNKAJN10002N+m3T6u/tXvSkyM/+\ndKrmuaxxA1iJhn04GRFDEVGJiEpXF//1r2WptWzWuAGsBE+VrKKl1r4H+3pKmghARmzAWUXzSyfs\nnARwNeqG2/ZTkr4j6Xrb5yX9OiIea/ZgrarW2jcArETdcEfEvasxCACgGNa4ASAZwg0AyRBuAEiG\ncANAMoQbAJIh3ACQDOEGgGQINwAkQ7gBIBnCDQDJEG4ASIZwA0AyhBsAkiHcAJAM4QaAZAg3ACRD\nuAEgGcINAMkQbgBIhnADQDKEGwCSIdwAkAzhBoBkCDcAJEO4ASAZwg0AyRBuAEiGcANAMoQbAJIh\n3ACQDOEGgGQINwAkQ7gBIBnCDQDJEG4ASKZQuG3vsn3W9lu2f9nsoQAAS6sbbtttkn4j6XuSbpZ0\nr+2bmz0YAKC2InfcOyS9FRFvR8T/JD0t6QfNHQsAsJQNBc7plvTOJ96fl/TNT59ke0DSQPXtR7Zf\nv/rxWsL1kt4re4g1gOuwgGuxgGuxoKfoiUXC7RrHYtGBiCFJQ5JkeyQiKkWHaGVcizlchwVciwVc\niwW2R4qeW2Sp5LykGz/xfoukiZUOBQBojCLhfkXSV21/2fbnJf1Q0p+bOxYAYCl1l0oi4pLtn0ga\nltQm6fGIOFPnlw01YrgWwbWYw3VYwLVYwLVYUPhaOGLRcjUAYA1j5yQAJEO4ASCZhoabrfFzbD9u\ne5Jn2SXbN9o+YnvM9hnbe8qeqSy2r7H9su1Xq9fiobJnKpvtNtsnbT9X9ixlsn3O9mnbp4o8Ftiw\nNe7q1vh/Svqu5h4hfEXSvRHxRkP+gERsf1vSBUl/iIhbyp6nTLY3SdoUESdsXydpVFL/Ov17YUkb\nI+KC7XZJxyTtiYiXSh6tNLZ/Lqki6QsRcXfZ85TF9jlJlYgotBmpkXfcbI2viogXJb1f9hxrQUS8\nGxEnqq8/lDSmud24607MuVB92179WrdPB9jeIukuSY+WPUs2jQx3ra3x6/IfKGqzvVVSr6Tj5U5S\nnurSwClJk5IOR8S6vRaSHpH0oKTLZQ+yBoSkv9serX77kGU1MtyFtsZjfbJ9raQDkh6IiA/Knqcs\nETEbEbdqbgfyDtvrcinN9t2SJiNitOxZ1oidEfF1zX0X1h9Xl1uX1MhwszUeNVXXcw9IejIiDpY9\nz1oQEdOSjkraVfIoZdkp6Z7q2u7Tkm63/US5I5UnIiaqP05KelZzS89LamS42RqPRaofyD0maSwi\nHi57njLZ7rLdWX3dIekOSW+WO1U5ImJvRGyJiK2aa8ULEXFfyWOVwvbG6gf3sr1R0p2Sln0irWHh\njohLkua3xo9JeqbA1viWZPspSf+Q1GP7vO0flT1TiXZKul9zd1Snql/fL3uokmySdMT2a5q70Tkc\nEev6MThIkm6QdMz2q5JelvSXiHh+uV/AlncASIadkwCQDOEGgGQINwAkQ7gBIBnCDQDJEG4ASIZw\nA0Ay/wfrGAlQXKUVNwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "X = np.array([[1.1, 1.1], [1, 1.1], [1.1, 1], [4, 2], [4, 2.1], [4.1, 1.9]])\n", + "plt.scatter(X[:,0],X[:,1])\n", + "plt.xlim([0,5])\n", + "plt.ylim([0,5])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "kmeans = KMeans(n_clusters=2, random_state=0).fit(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 1, 1, 0, 0, 0])" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "kmeans.labels_" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "score = silhouette_score(X, kmeans.labels_)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.956852497597\n" + ] + } + ], + "source": [ + "print(score)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/diabetesdata.csv b/diabetesdata.csv new file mode 100644 index 0000000..35d3b9f --- /dev/null +++ b/diabetesdata.csv @@ -0,0 +1 @@ +TimesPregnant,glucoseLevel,BP,insulin,BMI,Pedigree,Age,IsDiabetic 6,148,72,0,33.6,0.627,50,1 1,,66,0,26.6,0.351,31,0 8,183,64,0,23.3,0.672,,1 1,,66,94,28.1,0.167,21,0 0,137,40,168,43.1,2.288,33,1 5,116,74,0,25.6,0.201,30,0 3,78,50,88,31,0.248,26,1 10,115,0,0,35.3,0.134,29,0 2,197,70,543,30.5,0.158,53,1 8,,96,0,0,0.232,54,1 4,110,92,0,37.6,0.191,,0 10,168,74,0,38,0.537,34,1 10,139,80,0,27.1,1.441,57,0 1,,60,846,30.1,0.398,59,1 5,166,72,175,25.8,0.587,51,1 7,100,0,0,30,0.484,32,1 0,,84,230,45.8,0.551,31,1 7,107,74,0,29.6,0.254,31,1 1,103,30,83,43.3,0.183,33,0 1,115,70,96,34.6,0.529,32,1 3,126,88,235,39.3,0.704,27,0 8,99,84,0,35.4,0.388,50,0 7,196,90,0,39.8,0.451,41,1 9,119,80,0,29,0.263,29,1 11,143,94,146,36.6,0.254,51,1 10,125,70,115,31.1,0.205,41,1 7,147,76,0,39.4,0.257,43,1 1,97,66,140,23.2,0.487,,0 13,,82,110,22.2,0.245,57,0 5,117,92,0,34.1,0.337,38,0 5,109,75,0,36,0.546,60,0 3,158,76,245,31.6,0.851,28,1 3,88,58,54,24.8,0.267,22,0 6,,92,0,19.9,0.188,28,0 10,122,78,0,27.6,0.512,,0 4,103,60,192,24,0.966,33,0 11,138,76,0,33.2,0.42,35,0 9,102,76,0,32.9,0.665,46,1 2,,68,0,38.2,0.503,27,1 4,111,72,207,37.1,1.39,56,1 3,180,64,70,34,0.271,26,0 7,133,84,0,40.2,0.696,37,0 7,106,92,0,22.7,0.235,48,0 9,171,110,240,45.4,0.721,54,1 7,159,64,0,27.4,0.294,40,0 0,180,66,0,42,1.893,25,1 1,146,56,0,29.7,0.564,29,0 2,71,70,0,28,0.586,22,0 7,103,66,0,39.1,0.344,31,1 7,105,0,0,0,0.305,24,0 1,103,80,82,19.4,0.491,22,0 1,101,50,36,24.2,0.526,26,0 5,88,66,23,24.4,0.342,30,0 8,176,90,300,33.7,0.467,58,1 7,150,66,342,34.7,0.718,42,0 1,73,50,0,23,0.248,21,0 7,187,68,304,37.7,0.254,41,1 0,100,88,110,46.8,0.962,31,0 0,146,82,0,40.5,1.781,44,0 0,105,64,142,41.5,0.173,22,0 2,84,0,0,0,0.304,21,0 8,133,72,0,32.9,0.27,39,1 5,44,62,0,25,0.587,36,0 2,141,58,128,25.4,0.699,24,0 7,114,66,0,32.8,0.258,42,1 5,99,74,0,29,0.203,32,0 0,109,88,0,32.5,0.855,38,1 2,109,92,0,42.7,0.845,54,0 1,95,66,38,19.6,0.334,25,0 4,146,85,100,28.9,0.189,27,0 2,100,66,90,32.9,0.867,28,1 5,139,64,140,28.6,0.411,26,0 13,126,90,0,43.4,0.583,42,1 4,129,86,270,35.1,0.231,23,0 1,79,75,0,32,0.396,22,0 1,0,48,0,24.7,0.14,,0 7,62,78,0,32.6,0.391,41,0 5,95,72,0,37.7,0.37,,0 0,131,0,0,43.2,0.27,26,1 2,,66,0,25,0.307,24,0 3,113,44,0,22.4,0.14,22,0 2,74,0,0,0,0.102,22,0 7,83,78,71,29.3,0.767,36,0 0,101,65,0,24.6,0.237,22,0 5,137,108,0,48.8,0.227,37,1 2,110,74,125,32.4,0.698,27,0 13,,72,0,36.6,0.178,45,0 2,100,68,71,38.5,0.324,26,0 15,136,70,110,37.1,0.153,43,1 1,107,68,0,26.5,0.165,24,0 1,80,55,0,19.1,0.258,21,0 4,123,80,176,32,0.443,34,0 7,81,78,48,46.7,0.261,42,0 4,,72,0,23.8,0.277,60,1 2,142,82,64,24.7,0.761,21,0 6,144,72,228,33.9,0.255,40,0 2,92,62,0,31.6,0.13,24,0 1,,48,76,20.4,0.323,22,0 6,93,50,64,28.7,0.356,23,0 1,122,90,220,49.7,0.325,31,1 1,,72,0,39,1.222,33,1 1,151,60,0,26.1,0.179,22,0 0,125,96,0,22.5,0.262,21,0 1,81,72,40,26.6,0.283,24,0 2,85,65,0,39.6,0.93,27,0 1,126,56,152,28.7,0.801,21,0 1,96,122,0,22.4,0.207,27,0 4,144,58,140,29.5,0.287,37,0 3,83,58,18,34.3,0.336,25,0 0,95,85,36,37.4,0.247,24,1 3,171,72,135,33.3,0.199,24,1 8,155,62,495,34,0.543,46,1 1,89,76,37,31.2,0.192,23,0 4,76,62,0,34,0.391,25,0 7,160,54,175,30.5,0.588,39,1 4,146,92,0,31.2,0.539,61,1 5,124,74,0,34,0.22,38,1 5,78,48,0,33.7,0.654,25,0 4,97,60,0,28.2,0.443,22,0 4,99,76,51,23.2,0.223,21,0 0,162,76,100,53.2,0.759,25,1 6,111,64,0,34.2,0.26,24,0 2,107,74,100,33.6,0.404,23,0 5,132,80,0,26.8,0.186,69,0 0,113,76,0,33.3,0.278,,1 1,88,30,99,55,0.496,26,1 3,120,70,135,42.9,0.452,30,0 1,118,58,94,33.3,0.261,23,0 1,117,88,145,34.5,0.403,,1 0,105,84,0,27.9,0.741,62,1 4,173,70,168,29.7,0.361,33,1 9,122,56,0,33.3,1.114,33,1 3,170,64,225,34.5,0.356,30,1 8,84,74,0,38.3,0.457,39,0 2,96,68,49,21.1,0.647,26,0 2,125,60,140,33.8,0.088,31,0 0,100,70,50,30.8,0.597,21,0 0,93,60,92,28.7,0.532,22,0 0,129,80,0,31.2,0.703,29,0 5,105,72,325,36.9,0.159,28,0 3,128,78,0,21.1,0.268,55,0 5,106,82,0,39.5,0.286,38,0 2,108,52,63,32.5,0.318,22,0 10,108,66,0,32.4,0.272,42,1 4,154,62,284,32.8,0.237,23,0 0,102,75,0,0,0.572,21,0 9,57,80,0,32.8,0.096,41,0 2,106,64,119,30.5,1.4,34,0 5,147,78,0,33.7,0.218,65,0 2,90,70,0,27.3,0.085,22,0 1,136,74,204,37.4,0.399,24,0 4,114,65,0,21.9,0.432,37,0 9,156,86,155,34.3,1.189,42,1 1,153,82,485,40.6,0.687,23,0 8,188,78,0,47.9,0.137,43,1 7,152,88,0,50,0.337,36,1 2,99,52,94,24.6,0.637,21,0 1,109,56,135,25.2,0.833,23,0 2,88,74,53,29,0.229,22,0 17,163,72,114,40.9,0.817,47,1 4,151,90,0,29.7,0.294,36,0 7,102,74,105,37.2,0.204,45,0 0,114,80,285,44.2,0.167,27,0 2,100,64,0,29.7,0.368,21,0 0,131,88,0,31.6,0.743,32,1 6,104,74,156,29.9,0.722,41,1 3,148,66,0,32.5,0.256,22,0 4,120,68,0,29.6,0.709,34,0 4,110,66,0,31.9,0.471,29,0 3,111,90,78,28.4,0.495,29,0 6,102,82,0,30.8,0.18,36,1 6,134,70,130,35.4,0.542,29,1 2,87,0,0,28.9,0.773,25,0 1,79,60,48,43.5,0.678,23,0 2,75,64,55,29.7,0.37,33,0 8,179,72,130,32.7,0.719,36,1 6,85,78,0,31.2,0.382,42,0 0,129,110,130,67.1,0.319,26,1 5,143,78,0,45,0.19,47,0 5,130,82,0,39.1,0.956,37,1 6,87,80,0,23.2,0.084,32,0 0,119,64,92,34.9,0.725,23,0 1,,74,23,27.7,0.299,21,0 5,73,60,0,26.8,0.268,27,0 4,141,74,0,27.6,0.244,40,0 7,,68,0,35.9,0.745,41,1 8,181,68,495,30.1,0.615,60,1 1,,98,58,32,1.321,33,1 8,109,76,114,27.9,0.64,31,1 5,139,80,160,31.6,0.361,25,1 3,111,62,0,22.6,0.142,21,0 9,123,70,94,33.1,0.374,40,0 7,159,66,0,30.4,0.383,36,1 11,135,0,0,52.3,0.578,40,1 8,85,55,0,24.4,0.136,42,0 5,158,84,210,39.4,0.395,29,1 1,105,58,0,24.3,0.187,21,0 3,107,62,48,22.9,0.678,23,1 4,109,64,99,34.8,0.905,26,1 4,148,60,318,30.9,0.15,29,1 0,113,80,0,31,0.874,21,0 1,138,82,0,40.1,0.236,28,0 0,108,68,0,27.3,0.787,32,0 2,99,70,44,20.4,0.235,27,0 6,103,72,190,37.7,0.324,55,0 5,111,72,0,23.9,0.407,27,0 8,196,76,280,37.5,0.605,57,1 5,162,104,0,37.7,0.151,52,1 1,96,64,87,33.2,0.289,21,0 7,184,84,0,35.5,0.355,41,1 2,81,60,0,27.7,0.29,25,0 0,147,85,0,42.8,0.375,24,0 7,179,95,0,34.2,0.164,60,0 0,140,65,130,42.6,0.431,24,1 9,112,82,175,34.2,0.26,36,1 12,151,70,271,41.8,0.742,38,1 5,109,62,129,35.8,0.514,25,1 6,125,68,120,30,0.464,32,0 5,85,74,0,29,1.224,32,1 5,112,66,0,37.8,0.261,41,1 0,177,60,478,34.6,1.072,21,1 2,158,90,0,31.6,0.805,66,1 7,119,0,0,25.2,0.209,37,0 7,142,60,190,28.8,0.687,61,0 1,100,66,56,23.6,0.666,26,0 1,87,78,32,34.6,0.101,22,0 0,101,76,0,35.7,0.198,26,0 3,162,52,0,37.2,0.652,24,1 4,197,70,744,36.7,2.329,31,0 0,117,80,53,45.2,0.089,24,0 4,142,86,0,44,0.645,22,1 6,134,80,370,46.2,0.238,46,1 1,79,80,37,25.4,0.583,22,0 4,122,68,0,35,0.394,29,0 3,74,68,45,29.7,0.293,23,0 4,171,72,0,43.6,0.479,26,1 7,181,84,192,35.9,0.586,51,1 0,179,90,0,44.1,0.686,23,1 9,164,84,0,30.8,0.831,32,1 0,104,76,0,18.4,0.582,27,0 1,91,64,0,29.2,0.192,21,0 4,91,70,88,33.1,0.446,22,0 3,139,54,0,25.6,0.402,22,1 6,119,50,176,27.1,1.318,33,1 2,146,76,194,38.2,0.329,29,0 9,184,85,0,30,1.213,49,1 10,122,68,0,31.2,0.258,41,0 0,165,90,680,52.3,0.427,23,0 9,124,70,402,35.4,0.282,34,0 1,111,86,0,30.1,0.143,23,0 9,106,52,0,31.2,0.38,42,0 2,129,84,0,28,0.284,27,0 2,90,80,55,24.4,0.249,24,0 0,86,68,0,35.8,0.238,25,0 12,92,62,258,27.6,0.926,44,1 1,113,64,0,33.6,0.543,21,1 3,111,56,0,30.1,0.557,30,0 2,114,68,0,28.7,0.092,25,0 1,193,50,375,25.9,0.655,24,0 11,155,76,150,33.3,1.353,51,1 3,191,68,130,30.9,0.299,34,0 3,141,0,0,30,0.761,27,1 4,95,70,0,32.1,0.612,24,0 3,142,80,0,32.4,0.2,63,0 4,123,62,0,32,0.226,35,1 5,96,74,67,33.6,0.997,43,0 0,138,0,0,36.3,0.933,25,1 2,128,64,0,40,1.101,24,0 0,102,52,0,25.1,0.078,21,0 2,146,0,0,27.5,0.24,28,1 10,101,86,0,45.6,1.136,38,1 2,108,62,56,25.2,0.128,21,0 3,122,78,0,23,0.254,40,0 1,71,78,45,33.2,0.422,21,0 13,106,70,0,34.2,0.251,52,0 2,100,70,57,40.5,0.677,25,0 7,106,60,0,26.5,0.296,29,1 0,104,64,116,27.8,0.454,23,0 5,114,74,0,24.9,0.744,57,0 2,108,62,278,25.3,0.881,22,0 0,146,70,0,37.9,0.334,28,1 10,129,76,122,35.9,0.28,39,0 7,133,88,155,32.4,0.262,37,0 7,161,86,0,30.4,0.165,47,1 2,108,80,0,27,0.259,52,1 7,136,74,135,26,0.647,51,0 5,155,84,545,38.7,0.619,34,0 1,119,86,220,45.6,0.808,29,1 4,96,56,49,20.8,0.34,,0 5,108,72,75,36.1,0.263,33,0 0,78,88,40,36.9,0.434,21,0 0,107,62,74,36.6,0.757,25,1 2,128,78,182,43.3,1.224,31,1 1,128,48,194,40.5,0.613,24,1 0,161,50,0,21.9,0.254,65,0 6,151,62,120,35.5,0.692,28,0 2,146,70,360,28,0.337,29,1 0,126,84,215,30.7,0.52,24,0 14,,78,184,36.6,0.412,46,1 8,112,72,0,23.6,0.84,,0 0,167,0,0,32.3,0.839,30,1 2,144,58,135,31.6,0.422,25,1 5,77,82,42,35.8,0.156,35,0 5,,98,0,52.9,0.209,,1 3,150,76,0,21,0.207,37,0 2,120,76,105,39.7,0.215,29,0 10,161,68,132,25.5,0.326,47,1 0,137,68,148,24.8,0.143,21,0 0,128,68,180,30.5,1.391,25,1 2,124,68,205,32.9,0.875,30,1 6,80,66,0,26.2,0.313,41,0 0,106,70,148,39.4,0.605,22,0 2,155,74,96,26.6,0.433,27,1 3,113,50,85,29.5,0.626,25,0 7,109,80,0,35.9,1.127,43,1 2,112,68,94,34.1,0.315,26,0 3,99,80,64,19.3,0.284,30,0 3,182,74,0,30.5,0.345,29,1 3,115,66,140,38.1,0.15,28,0 6,194,78,0,23.5,0.129,59,1 4,129,60,231,27.5,0.527,31,0 3,112,74,0,31.6,0.197,25,1 0,124,70,0,27.4,0.254,36,1 13,152,90,29,26.8,0.731,43,1 2,112,75,0,35.7,0.148,21,0 1,157,72,168,25.6,0.123,24,0 1,122,64,156,35.1,0.692,30,1 10,179,70,0,35.1,0.2,37,0 2,102,86,120,45.5,0.127,23,1 6,105,70,68,30.8,0.122,37,0 8,118,72,0,23.1,1.476,46,0 2,87,58,52,32.7,0.166,25,0 1,180,0,0,43.3,0.282,41,1 12,106,80,0,23.6,0.137,44,0 1,95,60,58,23.9,0.26,22,0 0,165,76,255,47.9,0.259,26,0 0,117,0,0,33.8,0.932,44,0 5,115,76,0,31.2,0.343,44,1 9,152,78,171,34.2,0.893,33,1 7,178,84,0,39.9,0.331,41,1 1,130,70,105,25.9,0.472,22,0 1,95,74,73,25.9,0.673,36,0 1,0,68,0,32,0.389,22,0 5,122,86,0,34.7,0.29,33,0 8,95,72,0,36.8,0.485,57,0 8,126,88,108,38.5,0.349,49,0 1,139,46,83,28.7,0.654,22,0 3,116,0,0,23.5,0.187,23,0 3,99,62,74,21.8,0.279,26,0 5,0,80,0,41,0.346,37,1 4,92,80,0,42.2,0.237,29,0 4,137,84,0,31.2,0.252,30,0 3,61,82,0,34.4,0.243,46,0 1,90,62,43,27.2,0.58,24,0 3,90,78,0,42.7,0.559,21,0 9,165,88,0,30.4,0.302,49,1 1,125,50,167,33.3,0.962,28,1 13,129,0,0,39.9,0.569,44,1 12,88,74,54,35.3,0.378,48,0 1,196,76,249,36.5,0.875,29,1 5,189,64,325,31.2,0.583,29,1 5,158,70,0,29.8,0.207,63,0 5,103,108,0,39.2,0.305,65,0 4,146,78,0,38.5,0.52,67,1 4,147,74,293,34.9,0.385,30,0 5,99,54,83,34,0.499,30,0 6,124,72,0,27.6,0.368,29,1 0,101,64,0,21,0.252,21,0 3,81,86,66,27.5,0.306,22,0 1,133,102,140,32.8,0.234,45,1 3,173,82,465,38.4,2.137,25,1 0,118,64,89,0,1.731,21,0 0,84,64,66,35.8,0.545,21,0 2,105,58,94,34.9,0.225,25,0 2,122,52,158,36.2,0.816,28,0 12,140,82,325,39.2,0.528,58,1 0,98,82,84,25.2,0.299,22,0 1,87,60,75,37.2,0.509,22,0 4,156,75,0,48.3,0.238,32,1 0,93,100,72,43.4,1.021,35,0 1,107,72,82,30.8,0.821,24,0 0,105,68,0,20,0.236,22,0 1,109,60,182,25.4,0.947,21,0 1,90,62,59,25.1,1.268,25,0 1,125,70,110,24.3,0.221,25,0 1,119,54,50,22.3,0.205,24,0 5,116,74,0,32.3,0.66,35,1 8,105,100,0,43.3,0.239,45,1 5,144,82,285,32,0.452,58,1 3,100,68,81,31.6,0.949,28,0 1,100,66,196,32,0.444,42,0 5,166,76,0,45.7,0.34,27,1 1,131,64,415,23.7,0.389,21,0 4,116,72,87,22.1,0.463,37,0 4,158,78,0,32.9,0.803,31,1 2,127,58,275,27.7,1.6,25,0 3,96,56,115,24.7,0.944,39,0 0,131,66,0,34.3,0.196,22,1 3,82,70,0,21.1,0.389,25,0 3,193,70,0,34.9,0.241,25,1 4,95,64,0,32,0.161,31,1 6,137,61,0,24.2,0.151,55,0 5,136,84,88,35,0.286,35,1 9,72,78,0,31.6,0.28,38,0 5,168,64,0,32.9,0.135,41,1 2,123,48,165,42.1,0.52,26,0 4,115,72,0,28.9,0.376,46,1 0,101,62,0,21.9,0.336,25,0 8,197,74,0,25.9,1.191,39,1 1,172,68,579,42.4,0.702,28,1 6,102,90,0,35.7,0.674,28,0 1,112,72,176,34.4,0.528,25,0 1,143,84,310,42.4,1.076,22,0 1,143,74,61,26.2,0.256,21,0 0,138,60,167,34.6,0.534,21,1 3,173,84,474,35.7,0.258,22,1 1,97,68,0,27.2,1.095,22,0 4,144,82,0,38.5,0.554,37,1 1,83,68,0,18.2,0.624,27,0 3,129,64,115,26.4,0.219,28,1 1,119,88,170,45.3,0.507,26,0 2,94,68,76,26,0.561,21,0 0,102,64,78,40.6,0.496,21,0 2,115,64,0,30.8,0.421,21,0 8,151,78,210,42.9,0.516,36,1 4,184,78,277,37,0.264,31,1 0,94,0,0,0,0.256,25,0 1,181,64,180,34.1,0.328,38,1 0,135,94,145,40.6,0.284,26,0 1,95,82,180,35,0.233,43,1 2,99,0,0,22.2,0.108,23,0 3,89,74,85,30.4,0.551,38,0 1,80,74,60,30,0.527,22,0 2,139,75,0,25.6,0.167,29,0 1,90,68,0,24.5,1.138,36,0 0,141,0,0,42.4,0.205,29,1 12,140,85,0,37.4,0.244,41,0 5,147,75,0,29.9,0.434,28,0 1,97,70,0,18.2,0.147,21,0 6,107,88,0,36.8,0.727,31,0 0,189,104,0,34.3,0.435,41,1 2,83,66,50,32.2,0.497,22,0 4,117,64,120,33.2,0.23,24,0 8,108,70,0,30.5,0.955,33,1 4,117,62,0,29.7,0.38,30,1 0,180,78,14,59.4,2.42,25,1 1,100,72,70,25.3,0.658,28,0 0,95,80,92,36.5,0.33,26,0 0,104,64,64,33.6,0.51,22,1 0,120,74,63,30.5,0.285,26,0 1,82,64,95,21.2,0.415,23,0 2,134,70,0,28.9,0.542,23,1 0,91,68,210,39.9,0.381,25,0 2,119,0,0,19.6,0.832,72,0 2,100,54,105,37.8,0.498,24,0 14,175,62,0,33.6,0.212,38,1 1,135,54,0,26.7,0.687,62,0 5,86,68,71,30.2,0.364,24,0 10,148,84,237,37.6,1.001,51,1 9,134,74,60,25.9,0.46,81,0 9,120,72,56,20.8,0.733,48,0 1,71,62,0,21.8,0.416,26,0 8,74,70,49,35.3,0.705,39,0 5,88,78,0,27.6,0.258,37,0 10,115,98,0,24,1.022,34,0 0,124,56,105,21.8,0.452,21,0 0,74,52,36,27.8,0.269,22,0 0,97,64,100,36.8,0.6,25,0 8,120,0,0,30,0.183,38,1 6,154,78,140,46.1,0.571,27,0 1,144,82,0,41.3,0.607,28,0 0,137,70,0,33.2,0.17,22,0 0,119,66,0,38.8,0.259,22,0 7,136,90,0,29.9,0.21,50,0 4,114,64,0,28.9,0.126,24,0 0,137,84,0,27.3,0.231,59,0 2,105,80,191,33.7,0.711,29,1 7,114,76,110,23.8,0.466,31,0 8,126,74,75,25.9,0.162,39,0 4,132,86,0,28,0.419,63,0 3,158,70,328,35.5,0.344,35,1 0,123,88,0,35.2,0.197,29,0 4,85,58,49,27.8,0.306,28,0 0,84,82,125,38.2,0.233,23,0 0,145,0,0,44.2,0.63,31,1 0,135,68,250,42.3,0.365,24,1 1,139,62,480,40.7,0.536,21,0 0,173,78,265,46.5,1.159,58,0 4,99,72,0,25.6,0.294,28,0 8,194,80,0,26.1,0.551,67,0 2,83,65,66,36.8,0.629,24,0 2,89,90,0,33.5,0.292,42,0 4,99,68,0,32.8,0.145,33,0 4,125,70,122,28.9,1.144,45,1 3,80,0,0,0,0.174,22,0 6,166,74,0,26.6,0.304,66,0 5,110,68,0,26,0.292,30,0 2,81,72,76,30.1,0.547,25,0 7,195,70,145,25.1,0.163,55,1 6,154,74,193,29.3,0.839,39,0 2,117,90,71,25.2,0.313,21,0 3,84,72,0,37.2,0.267,28,0 6,0,68,0,39,0.727,41,1 7,94,64,79,33.3,0.738,41,0 3,96,78,0,37.3,0.238,40,0 10,75,82,0,33.3,0.263,38,0 0,180,90,90,36.5,0.314,35,1 1,130,60,170,28.6,0.692,21,0 2,84,50,76,30.4,0.968,21,0 8,120,78,0,25,0.409,64,0 12,84,72,0,29.7,0.297,46,1 0,139,62,210,22.1,0.207,21,0 9,91,68,0,24.2,0.2,58,0 2,91,62,0,27.3,0.525,22,0 3,99,54,86,25.6,0.154,24,0 3,163,70,105,31.6,0.268,28,1 9,145,88,165,30.3,0.771,53,1 7,125,86,0,37.6,0.304,51,0 13,76,60,0,32.8,0.18,41,0 6,129,90,326,19.6,0.582,60,0 2,68,70,66,25,0.187,25,0 3,124,80,130,33.2,0.305,26,0 6,114,0,0,0,0.189,26,0 9,130,70,0,34.2,0.652,45,1 3,125,58,0,31.6,0.151,24,0 3,87,60,0,21.8,0.444,21,0 1,97,64,82,18.2,0.299,21,0 3,116,74,105,26.3,0.107,24,0 0,117,66,188,30.8,0.493,22,0 0,111,65,0,24.6,0.66,31,0 2,122,60,106,29.8,0.717,22,0 0,107,76,0,45.3,0.686,24,0 1,86,66,65,41.3,0.917,29,0 6,91,0,0,29.8,0.501,31,0 1,77,56,56,33.3,1.251,24,0 4,132,0,0,32.9,0.302,23,1 0,105,90,0,29.6,0.197,46,0 0,57,60,0,21.7,0.735,67,0 0,127,80,210,36.3,0.804,23,0 3,129,92,155,36.4,0.968,32,1 8,100,74,215,39.4,0.661,43,1 3,128,72,190,32.4,0.549,,1 10,90,85,0,34.9,0.825,56,1 4,84,90,56,39.5,0.159,25,0 1,88,78,76,32,0.365,29,0 8,186,90,225,34.5,0.423,37,1 5,187,76,207,43.6,1.034,53,1 4,131,68,166,33.1,0.16,,0 1,164,82,67,32.8,0.341,50,0 4,189,110,0,28.5,0.68,37,0 1,116,70,0,27.4,0.204,21,0 3,84,68,106,31.9,0.591,25,0 6,114,88,0,27.8,0.247,66,0 1,88,62,44,29.9,0.422,23,0 1,84,64,115,36.9,0.471,28,0 7,124,70,215,25.5,0.161,37,0 1,97,70,0,38.1,0.218,30,0 8,110,76,0,27.8,0.237,58,0 11,103,68,0,46.2,0.126,42,0 11,85,74,0,30.1,0.3,35,0 6,125,76,0,33.8,0.121,54,1 0,198,66,274,41.3,0.502,28,1 1,87,68,77,37.6,0.401,24,0 6,99,60,54,26.9,0.497,32,0 0,91,80,0,32.4,0.601,27,0 2,95,54,88,26.1,0.748,22,0 1,99,72,18,38.6,0.412,21,0 6,92,62,126,32,0.085,46,0 4,154,72,126,31.3,0.338,37,0 0,121,66,165,34.3,0.203,33,1 3,78,70,0,32.5,0.27,39,0 2,130,96,0,22.6,0.268,21,0 3,111,58,44,29.5,0.43,22,0 2,98,60,120,34.7,0.198,22,0 1,143,86,330,30.1,0.892,23,0 1,119,44,63,35.5,0.28,25,0 6,108,44,130,24,0.813,35,0 2,118,80,0,42.9,0.693,21,1 10,133,68,0,27,0.245,36,0 2,197,70,0,34.7,0.575,62,1 0,151,90,0,42.1,0.371,21,1 6,109,60,0,25,0.206,27,0 12,121,78,0,26.5,0.259,62,0 8,100,76,0,38.7,0.19,42,0 8,124,76,600,28.7,0.687,52,1 1,93,56,0,22.5,0.417,22,0 8,143,66,0,34.9,0.129,41,1 6,103,66,0,24.3,0.249,29,0 3,176,86,156,33.3,1.154,52,1 0,73,0,0,21.1,0.342,25,0 11,111,84,0,46.8,0.925,45,1 2,112,78,140,39.4,0.175,24,0 3,132,80,0,34.4,0.402,44,1 2,82,52,115,28.5,1.699,25,0 6,123,72,230,33.6,0.733,34,0 0,188,82,185,32,0.682,22,1 0,67,76,0,45.3,0.194,46,0 1,89,24,25,27.8,0.559,21,0 1,173,74,0,36.8,0.088,,1 1,109,38,120,23.1,0.407,26,0 1,108,88,0,27.1,0.4,24,0 6,96,0,0,23.7,0.19,28,0 1,124,74,0,27.8,0.1,30,0 7,150,78,126,35.2,0.692,54,1 4,183,0,0,28.4,0.212,36,1 1,124,60,0,35.8,0.514,21,0 1,181,78,293,40,1.258,,1 1,92,62,41,19.5,0.482,25,0 0,152,82,272,41.5,0.27,27,0 1,111,62,182,24,0.138,23,0 3,106,54,158,30.9,0.292,24,0 3,174,58,194,32.9,0.593,36,1 7,168,88,321,38.2,0.787,40,1 6,105,80,0,32.5,0.878,,0 11,138,74,144,36.1,0.557,50,1 3,106,72,0,25.8,0.207,27,0 6,117,96,0,28.7,0.157,,0 2,68,62,15,20.1,0.257,23,0 9,112,82,0,28.2,1.282,50,1 0,119,0,0,32.4,0.141,24,1 2,112,86,160,38.4,0.246,28,0 2,92,76,0,24.2,1.698,28,0 6,183,94,0,40.8,1.461,45,0 0,94,70,115,43.5,0.347,21,0 2,108,64,0,30.8,0.158,21,0 4,90,88,54,37.7,0.362,29,0 0,125,68,0,24.7,0.206,21,0 0,132,78,0,32.4,0.393,21,0 5,128,80,0,34.6,0.144,45,0 4,94,65,0,24.7,0.148,21,0 7,114,64,0,27.4,0.732,34,1 0,102,78,90,34.5,0.238,24,0 2,111,60,0,26.2,0.343,23,0 1,128,82,183,27.5,0.115,22,0 10,92,62,0,25.9,0.167,31,0 13,104,72,0,31.2,0.465,38,1 5,104,74,0,28.8,0.153,48,0 2,94,76,66,31.6,0.649,23,0 7,97,76,91,40.9,0.871,32,1 1,100,74,46,19.5,0.149,28,0 0,102,86,105,29.3,0.695,27,0 4,128,70,0,34.3,0.303,24,0 6,147,80,0,29.5,0.178,50,1 4,90,0,0,28,0.61,31,0 3,103,72,152,27.6,0.73,27,0 2,157,74,440,39.4,0.134,30,0 1,167,74,144,23.4,0.447,33,1 0,179,50,159,37.8,0.455,22,1 11,136,84,130,28.3,0.26,42,1 0,107,60,0,26.4,0.133,,0 1,91,54,100,25.2,0.234,23,0 1,117,60,106,33.8,0.466,27,0 5,123,74,77,34.1,0.269,,0 2,120,54,0,26.8,0.455,,0 1,106,70,135,34.2,0.142,,0 2,155,52,540,38.7,0.24,,1 2,101,58,90,21.8,0.155,22,0 1,120,80,200,38.9,1.162,41,0 11,127,106,0,39,0.19,51,0 3,80,82,70,34.2,1.292,27,1 10,162,84,0,27.7,0.182,54,0 1,199,76,0,42.9,1.394,22,1 8,167,106,231,37.6,0.165,43,1 9,145,80,130,37.9,0.637,40,1 6,115,60,0,33.7,0.245,40,1 1,112,80,132,34.8,0.217,24,0 4,145,82,0,32.5,0.235,70,1 10,111,70,0,27.5,0.141,40,1 6,98,58,190,34,0.43,43,0 9,154,78,100,30.9,0.164,45,0 6,165,68,168,33.6,0.631,49,0 1,99,58,0,25.4,0.551,21,0 10,68,106,49,35.5,0.285,47,0 3,123,100,240,57.3,0.88,22,0 8,91,82,0,35.6,0.587,68,0 6,195,70,0,30.9,0.328,31,1 9,156,86,0,24.8,0.23,53,1 0,93,60,0,35.3,0.263,25,0 3,121,52,0,36,0.127,25,1 2,101,58,265,24.2,0.614,23,0 2,56,56,45,24.2,0.332,,0 0,162,76,0,49.6,0.364,26,1 0,95,64,105,44.6,0.366,22,0 4,125,80,0,32.3,0.536,27,1 5,136,82,0,0,0.64,,0 2,129,74,205,33.2,0.591,25,0 3,,64,0,23.1,0.314,22,0 1,107,50,0,28.3,0.181,29,0 1,140,74,180,24.1,0.828,,0 1,144,82,180,46.1,0.335,46,1 8,,80,0,24.6,0.856,,0 13,158,114,0,42.3,0.257,44,1 2,121,70,95,39.1,0.886,23,0 7,129,68,125,38.5,0.439,43,1 2,90,60,0,23.5,0.191,25,0 7,142,90,480,30.4,0.128,,1 3,169,74,125,29.9,0.268,31,1 0,99,0,0,25,0.253,22,0 4,,88,155,34.5,0.598,28,0 4,118,70,0,44.5,0.904,26,0 2,,76,200,35.9,0.483,26,0 6,125,78,0,27.6,0.565,,1 1,168,88,0,35,0.905,52,1 2,129,0,0,38.5,0.304,41,0 4,110,76,100,28.4,0.118,27,0 6,80,80,0,39.8,0.177,28,0 10,115,0,0,0,0.261,30,1 2,127,46,335,34.4,0.176,,0 9,,78,0,32.8,0.148,45,1 2,93,64,160,38,0.674,23,1 3,158,64,387,31.2,0.295,24,0 5,,78,22,29.6,0.439,40,0 10,129,62,0,41.2,0.441,,1 0,,58,291,26.4,0.352,21,0 3,,74,0,29.5,0.121,32,0 7,,50,392,33.9,0.826,34,1 3,173,78,185,33.8,0.97,31,1 10,,72,0,23.1,0.595,56,0 1,108,60,178,35.5,0.415,24,0 5,,76,0,35.6,0.378,52,1 4,83,86,0,29.3,0.317,34,0 1,114,66,200,38.1,0.289,21,0 1,149,68,127,29.3,0.349,42,1 5,,86,105,39.1,0.251,42,0 1,111,94,0,32.8,0.265,45,0 4,,78,0,39.4,0.236,38,0 1,116,78,180,36.1,0.496,25,0 0,141,84,0,32.4,0.433,,0 2,,88,0,22.9,0.326,22,0 2,92,52,0,30.1,0.141,22,0 3,130,78,79,28.4,0.323,34,1 8,120,86,0,28.4,0.259,22,1 2,174,88,120,44.5,0.646,24,1 2,,56,165,29,0.426,,0 2,105,75,0,23.3,0.56,53,0 4,95,60,0,35.4,0.284,28,0 0,126,86,120,27.4,0.515,21,0 8,,72,0,32,0.6,42,0 2,99,60,160,36.6,0.453,,0 1,102,74,0,39.5,0.293,42,1 11,120,80,150,42.3,0.785,48,1 3,102,44,94,30.8,0.4,26,0 1,109,58,116,28.5,0.219,22,0 9,140,94,0,32.7,0.734,45,1 13,153,88,140,40.6,1.174,39,0 12,100,84,105,30,0.488,46,0 1,147,94,0,49.3,0.358,27,1 1,81,74,57,46.3,1.096,32,0 3,187,70,200,36.4,0.408,36,1 6,162,62,0,24.3,0.178,50,1 4,136,70,0,31.2,1.182,22,1 1,121,78,74,39,0.261,28,0 3,108,62,0,26,0.223,25,0 0,181,88,510,43.3,0.222,26,1 8,154,78,0,32.4,0.443,45,1 1,128,88,110,36.5,1.057,37,1 7,137,90,0,32,0.391,39,0 0,123,72,0,36.3,0.258,52,1 1,106,76,0,37.5,0.197,26,0 6,190,92,0,35.5,0.278,66,1 2,88,58,16,28.4,0.766,22,0 9,170,74,0,44,0.403,43,1 9,89,62,0,22.5,0.142,33,0 10,101,76,180,32.9,0.171,63,0 2,122,70,0,36.8,0.34,27,0 5,121,72,112,26.2,0.245,30,0 1,126,60,0,30.1,0.349,47,1 1,93,70,0,30.4,0.315,23,0 \ No newline at end of file diff --git a/hw2_regression_classification_webscraping.ipynb b/hw2_regression_classification_webscraping.ipynb new file mode 100644 index 0000000..6ad4a09 --- /dev/null +++ b/hw2_regression_classification_webscraping.ipynb @@ -0,0 +1,2744 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data-X Spring 2018: Homework 02\n", + "\n", + "### Regression, Classification, Webscraping\n", + "\n", + "**Authors:** Sana Iqbal (Part 1, 2, 3), Alexander Fred-Ojala (Extra Credit)\n", + "\n", + "\n", + "In this homework, you will do some exercises with prediction-classification, regression and web-scraping.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Part 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "### Data:\n", + "__Data Source__:\n", + "Data file is uploaded to bCourses and is named: __Energy.csv__\n", + "\n", + "The dataset was created by Angeliki Xifara ( Civil/Structural Engineer) and was processed by Athanasios Tsanas, Oxford Centre for Industrial and Applied Mathematics, University of Oxford, UK).\n", + "\n", + "__Data Description__:\n", + "\n", + "The dataset contains eight attributes of a building (or features, denoted by X1...X8) and response being the heating load on the building, y1. \n", + "\n", + "* X1\tRelative Compactness \n", + "* X2\tSurface Area \n", + "* X3\tWall Area \n", + "* X4\tRoof Area \n", + "* X5\tOverall Height \n", + "* X6\tOrientation \n", + "* X7\tGlazing Area \n", + "* X8\tGlazing Area Distribution \n", + "* y1\tHeating Load \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Q1:Read the data file in python. Describe data features in terms of type, distribution range and mean values. Plot feature distributions.This step should give you clues about data sufficiency." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "X1 float64\n", + "X2 float64\n", + "X3 float64\n", + "X4 float64\n", + "X5 float64\n", + "X6 int64\n", + "X7 float64\n", + "X8 int64\n", + "Y1 float64\n", + "dtype: object\n", + " X1 X2 X3 X4 X5 X6 \\\n", + "count 768.000000 768.000000 768.000000 768.000000 768.00000 768.000000 \n", + "mean 0.764167 671.708333 318.500000 176.604167 5.25000 3.500000 \n", + "std 0.105777 88.086116 43.626481 45.165950 1.75114 1.118763 \n", + "min 0.620000 514.500000 245.000000 110.250000 3.50000 2.000000 \n", + "25% 0.682500 606.375000 294.000000 140.875000 3.50000 2.750000 \n", + "50% 0.750000 673.750000 318.500000 183.750000 5.25000 3.500000 \n", + "75% 0.830000 741.125000 343.000000 220.500000 7.00000 4.250000 \n", + "max 0.980000 808.500000 416.500000 220.500000 7.00000 5.000000 \n", + "\n", + " X7 X8 Y1 \n", + "count 768.000000 768.00000 768.000000 \n", + "mean 0.234375 2.81250 22.307201 \n", + "std 0.133221 1.55096 10.090196 \n", + "min 0.000000 0.00000 6.010000 \n", + "25% 0.100000 1.75000 12.992500 \n", + "50% 0.250000 3.00000 18.950000 \n", + "75% 0.400000 4.00000 31.667500 \n", + "max 0.400000 5.00000 43.100000 \n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAskAAAJOCAYAAABFgJqNAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3X2YZHV55//3J6CAoIAy9hIgGVwJ\nKwsrsrPKho1pJKuAIrg/9cIQBUOWZIOuRhIFs79IknUvzIpG80BEIWCCIEFdWDWJBOl1/W3QgBIe\nBMJEJjhAGA0POmh0x9y/P+q0FGequ6u7q7oe5v26rrq6zvecqnN/q8596u5T3zonVYUkSZKkx/3Q\nqAOQJEmSxo1FsiRJktRikSxJkiS1WCRLkiRJLRbJkiRJUotFsiRJktRikSxJkiS1WCRPsSR7JNmU\n5Ke72p6a5N4kr0xydJLrkzyaZNMIQ5XUQx85/CtJbkvyrST3JPmVUcYraXt95PGbk3w1yTeT3J/k\nvUl2HmXM6rBInmJVtRU4A3hfknVN828BN1bVVcBjwMWAH6zSGOojhwO8DtgbOBZ4Q5KTRxKspJ76\nyOP/CRxRVU8DDgWeC/znkQSrJ4hX3Jt+SS4BdgE+AHwMOLSqHuia/1PAh6pq/UgClLSopXK4a7n3\n09mvv3FtI5S0lH7yOMkzgI8Cf1NVv7jmQeoJPJK8Y/glYBa4CvjlXh+uksbakjmcJMBPALevbWiS\n+rRgHif56STfBL5B50jyB0YSoZ7AInkHUFUP0/ngfArw8RGHI2mZ+szhc+ns0/9wjcKStAyL5XFV\nfaQZbvFjwB8AD659hGqzSN4BJPkZYD3wF8C7RhuNpOVaKoeTvIHO2OSXVtV31zY6Sf3o57O4qu6m\nU0j//tpFpoX468kpl+SZwHuBVwN3Arcn+UhVfW60kUnqx1I5nORngbOBF1bV5tFFKmkhy/ws3hn4\n52sZn3rzSPL0+13gf1TV9c34p7cCH0yyS5IfSrIr8CQ6Qxp3TfLkkUYrqW2xHD4F+G/Av6+qr440\nSkmLWSyPf64poklyCHAOcN0IY1XDs1tMsSQn0fnK5pCqeqSr/TrgBuBa4PrWw/5XVc2uWZCSFtRH\nDv80sD/QPcTij6vqF9Y0UEkL6iOPfxg4HtgD+DrwJ8D/W1X/OIJw1cUiWZIkSWpxuIUkSZLUYpEs\nSZIktVgkS5I0AZIckOT6JHckuT3Jm5r2pye5Nsndzd+9m/YkeX+SjUluSXLEaHsgTRaLZEmSJsM2\n4Kyqeg5wJHBmczaEs4HrquogOmdFOLtZ/jjgoOZ2BnDB2ocsTa6xOE/yPvvsU+vXrx91GMv22GOP\nsfvuu486jBUx9rV30003faOq1o06jmHZa6+96tnPfvaowxi6Sd3+lmNH6COsrJ+jzOPm1GEPNPe/\nleQOYD/gRDqXOwa4FJgD3ta0f7g6v9C/IcleSfbtdVnzeSv5PJ6G7WUa+gDT0Y+16EO/eTwWRfL6\n9eu58cYbRx3Gss3NzTE7OzvqMFbE2Ndekr8bdQzDNDMzM5F5vFyTuv0tx47QR1hZP8clj5OsB54H\nfAGYmS98q+qB+XPu0imgv9b1sM1N2xOK5CRn0DnSzMzMDO9+97uXFcvWrVvZY489lt+JMTINfYDp\n6Mda9OHoo4/uK4/HokiWJEn9SbIH8DHgzVX1zSQLLtqjbbvzvlbVhcCFABs2bKjl/uMwDf9UTUMf\nYDr6MU59cEyyJEkTIsmT6BTIl1XVx5vmB5Ps28zfF9jStG8GDuh6+P7A/WsVqzTpLJIlSZoA6Rwy\nvgi4o6re0zXrGuDU5v6pwNVd7a9rznJxJPDoYuORJT2Rwy0kSZoMRwGvBW5NcnPT9nbgPODKJKcD\n9wKvauZ9ms7ljjcC3wZev7bhSpPNIlmSpAlQVZ+n9zhjgGN6LF/AmUMNSppiE1Mkrz/7U6MOgU3n\nvXTVzzGIfgwiDkmTz/3JEy339TjrsG2c1nrMNL0e02xctv1xiUPD4ZhkSZIkqcUiWZIkSWqxSJYk\nSZJaLJIlSZKkFotkSZIkqWXJIjnJxUm2JLmtq+2/J7kzyS1JPpFkr6555yTZmOSuJC8ZVuCS+mce\nS5K0PP0cSb4EOLbVdi1waFX9K+BvgHMAkhwCnAz8y+Yxv59kp4FFK2mlLsE8liSpb0sWyVX1OeCh\nVttnqmpbM3kDnevBA5wIXFFV362qe+hc5ef5A4xX0gqYx5IkLc8gLibys8BHm/v70fmwnbe5adtO\nkjOAMwBmZmaYm5tbdCVnHbZt0flroR3j1q1bl4y7bRD9WO46e1lJ7ONikmMfY6vO43Xr1u0Q78s4\nbX/D2p+MUx+XY7mvx8xu2z9mEvstaThWVSQn+VVgG3DZfFOPxarXY6vqQuBCgA0bNtTs7Oyi62pf\nFWkUNp0y+4Tpubk5loq7bRD9aMexEiuJfVxMcuzjaFB5fPDBBy+Zx9NgnLa/Ye1PxqmPy7Hc1+Os\nw7Zx/q1P/BgcxP5V0nRYcZGc5FTgZcAxzfXhoXPE6YCuxfYH7l95eJKGyTyWJKm3FZ0CLsmxwNuA\nl1fVt7tmXQOcnGSXJAcCBwFfXH2YkgbNPJYkaWFLHklOcjkwC+yTZDPwDjq/gt8FuDYJwA1V9QtV\ndXuSK4Gv0Pn69syq+v6wgpfUH/NYkqTlWbJIrqrX9Gi+aJHl3wm8czVBSRos81iSpOXxinuSJElS\ni0WyJEmS1GKRLEmSJLVYJEuSJEktFsmSJElSi0WyJEmS1GKRLEmSJLVYJEuSJEktFsmSJElSi0Wy\nJEmS1GKRLEmSJLVYJEuSJEktFsmSJElSi0WyJEmS1LJkkZzk4iRbktzW1fb0JNcmubv5u3fTniTv\nT7IxyS1Jjhhm8JL6Yx5Lk2+BPD43yX1Jbm5ux3fNO6fJ47uSvGQ0UUuTq58jyZcAx7bazgauq6qD\ngOuaaYDjgIOa2xnABYMJU9IqXYJ5LE26S9g+jwHeW1WHN7dPAyQ5BDgZ+JfNY34/yU5rFqk0BZYs\nkqvqc8BDreYTgUub+5cCJ3W1f7g6bgD2SrLvoIKVtDLmsTT5FsjjhZwIXFFV362qe4CNwPOHFpw0\nhXZe4eNmquoBgKp6IMkzm/b9gK91Lbe5aXug/QRJzqBzlIqZmRnm5uYWXeFZh21bYaiD045x69at\nS8bdNoh+LHedvawk9nExybGPmYHm8bp163aI92Wctr9h7U/GqY/LsdzXY2a37R8zif0G3pDkdcCN\nwFlV9TCdnL2ha5n5PN7Ocj+P20axvQx6219pH8blM33epOZut3Hqw0qL5IWkR1v1WrCqLgQuBNiw\nYUPNzs4u+sSnnf2p1ca2aptOmX3C9NzcHEvF3TaIfrTjWImVxD4uJjn2CbGiPD744IOXzONpME7b\n37D2J+PUx+VY7utx1mHbOP/WJ34MDmL/usYuAH6TTo7+JnA+8LMM8fO4bRTby6C3/ZX2YVw+0+dN\nau52G6c+rPTsFg/Of/3a/N3StG8GDuhabn/g/pWHJ2mIzGNpwlXVg1X1/ar6J+CDPD6kwjyWVmml\nRfI1wKnN/VOBq7vaX9f8Ov5I4NH5r3MljR3zWJpwrd8LvAKYP/PFNcDJSXZJciCdH+J+ca3jkybZ\nksMtklwOzAL7JNkMvAM4D7gyyenAvcCrmsU/DRxP5wcC3wZeP4SYJS2TeSxNvgXyeDbJ4XSGUmwC\nfh6gqm5PciXwFWAbcGZVfX8UcUuTaskiuapes8CsY3osW8CZqw1K0mCZx9LkWyCPL1pk+XcC7xxe\nRNJ084p7kiRJUotFsiRJktRikSxJkiS1WCRLkiRJLRbJkiRJUotFsiRJktRikSxJkiS1WCRLkiRJ\nLRbJkiRJUotFsiRJktSy5GWpJUmSNBzrz/7Uqp9j03kvHUAkavNIsiRJktRikSxJkiS1rKpITvJL\nSW5PcluSy5PsmuTAJF9IcneSjyZ58qCClTR45rEkSdtbcZGcZD/gPwMbqupQYCfgZOBdwHur6iDg\nYeD0QQQqafDMY0mSelvtcIudgd2S7Aw8BXgAeBFwVTP/UuCkVa5D0nCZx5Iktaz47BZVdV+SdwP3\nAt8BPgPcBDxSVduaxTYD+/V6fJIzgDMAZmZmmJubW3R9Zx22bdH5a6Ed49atW5eMu20Q/VjuOntZ\nSezjYpJjHzeDzON169btEO/LOG1/w9qfjFMfl2O5r8fMbts/ZhL7LWk4VlwkJ9kbOBE4EHgE+BPg\nuB6LVq/HV9WFwIUAGzZsqNnZ2UXXd9oATpGyWptOmX3C9NzcHEvF3TaIfrTjWImVxD4uJjn2cTPI\nPD744IOXzONpME7b37D2J+PUx+VY7utx1mHbOP/WJ34MDmL/Kmk6rGa4xU8B91TV16vq/wIfB34c\n2Kv52hZgf+D+VcYoaXjMY0mSelhNkXwvcGSSpyQJcAzwFeB64JXNMqcCV68uRElDZB5LktTDiovk\nqvoCnR/2fAm4tXmuC4G3AW9JshF4BnDRAOKUNATmsSRJva3qstRV9Q7gHa3mrwLPX83zSlo75rEk\nSdvzinuSJElSi0WyJEmS1GKRLEmSJLVYJEuSJEktFsmSJElSi0WyJEmS1GKRLEnSBEhycZItSW7r\nant6kmuT3N383btpT5L3J9mY5JYkR4wucmkyWSRLkjQZLgGObbWdDVxXVQcB1zXTAMcBBzW3M4AL\n1ihGaWpYJEuSNAGq6nPAQ63mE4FLm/uXAid1tX+4Om4A9kqy79pEKk2HVV1xT5IkjdRMVT0AUFUP\nJHlm074f8LWu5TY3bQ+0nyDJGXSONjMzM8Pc3NyyAti6deuyH7NaZx22bdXP0R3zSvswiDgGYT72\nUbwXgzZOfbBIliRp+qRHW/VasKouBC4E2LBhQ83Ozi5rRXNzcyz3Mat12tmfWvVzbDpl9gf3V9qH\nQcQxCPN9GcV7MWjj1AeHW0iSNLkenB9G0fzd0rRvBg7oWm5/4P41jk2aaB5JXob1rf8Yzzps20j+\ni2zHsRKjin0Q2rFvOu+lq37OQbymg4hjmg3iNR4Hk5w7vfR6X6atj1PuGuBU4Lzm79Vd7W9IcgXw\nAuDR+WEZkvpjkSxJ0gRIcjkwC+yTZDPwDjrF8ZVJTgfuBV7VLP5p4HhgI/Bt4PVrHrA04VZVJCfZ\nC/gQcCidsU4/C9wFfBRYD2wCXl1VD68qSklDYx5Lk6GqXrPArGN6LFvAmcONSJpuqx2T/D7gz6rq\nXwDPBe5g4XM2ShpP5rEkSS0rLpKTPA14IXARQFV9r6oeYeFzNkoaM+axJEm9rWa4xbOArwN/mOS5\nwE3Am1j4nI1PsNzzMo7LuQi7zew2nnH1Y5piH8T5FAd9zs0JMrA8Xrdu3aKvwaRub22TnDv92hH6\nCL37OaF5LGkIVlMk7wwcAbyxqr6Q5H0s4yvZ5Z6XcRx/aX3WYds4/9bJ/O3jNMXefa7LlRr0OTcn\nyMDy+OCDD140j8cxh1diknOnXztCH6F3Pyc0jyUNwWrGJG8GNlfVF5rpq+h82C50zkZJ48c8liSp\nhxUXyVX198DXkhzcNB0DfIXHz9kITzxno6QxYx5LktTbar9PeyNwWZInA1+lcx7GH6L3ORsljSfz\nWJKkllUVyVV1M7Chx6ztztkoaTyZx5IkbW+150mWJEmSpo5FsiRJktRikSxJkiS1WCRLkiRJLRbJ\nkiRJUotFsiRJktRikSxJkiS1WCRLkiRJLRbJkiRJUotFsiRJktRikSxJkiS1WCRLkiRJLRbJkiRJ\nUsvOq32CJDsBNwL3VdXLkhwIXAE8HfgS8Nqq+t5q1yNpeMxjSf1Yf/antms767BtnNajXZOl13u7\nXJvOe+mqY1jt9rTaGLoN4kjym4A7uqbfBby3qg4CHgZOH8A6JA2XeSxJUpdVFclJ9gdeCnyomQ7w\nIuCqZpFLgZNWsw5Jw2UeS5K0vdUOt/ht4K3AU5vpZwCPVNW2ZnozsF+vByY5AzgDYGZmhrm5uUVX\ndNZh2xadPwozu41nXP2YptiX2nb6MYjXYhBxjMhA8njdunWLvgaTur21TXLu9GtH6CP07ucE57Gk\nAVtxkZzkZcCWqropyex8c49Fq9fjq+pC4EKADRs21OzsbK/FfmAcxzudddg2zr911cO6R2KaYt90\nyuyqn3MQ29cg4lhrg8zjgw8+eNE8HsccXolJzp1+7Qh9hN79nMQ8ljQcq9kLHgW8PMnxwK7A0+gc\nkdoryc7NUaj9gftXH6akITGPJUnqYcVjkqvqnKrav6rWAycDn62qU4DrgVc2i50KXL3qKCUNhXks\nSVJvwzhP8tuAtyTZSGds40VDWIek4TKPJUk7tIEMOquqOWCuuf9V4PmDeF5Ja8c8liZXkk3At4Dv\nA9uqakOSpwMfBdYDm4BXV9XDo4pRmjRecU+SpOlwdFUdXlUbmumzgeua851f10xL6pNFsiRJ0+lE\nOuc5B893Li3b9J/jR5Kk6VfAZ5IU8IHm9IwzVfUAQFU9kOSZvR64nOsW9Dp/9qSeV7u7n1u3bl3R\nObLHpd/zsa+0HzAe1ws467Btq96eBnmuc4tkSZIm31FVdX9TCF+b5M5+H7ic6xb0Ot/5pJ5Xu/uc\n2HNzcyx1vYZexuX87/N9WWk/YDyuF3Da2Z9a9fY0yHOdO9xCkqQJV1X3N3+3AJ+g88PbB5PsC9D8\n3TK6CKXJY5EsSdIES7J7kqfO3wdeDNwGXEPnPOfg+c6lZZu870ckSVK3GeATSaDzuf6RqvqzJH8F\nXJnkdOBe4FUjjFGaOBbJkiRNsOa85s/t0f4PwDFrH5E0HRxuIUmSJLVYJEuSJEktFsmSJElSi0Wy\nJEmS1GKRLEmSJLVYJEuSJEktKy6SkxyQ5PokdyS5PcmbmvanJ7k2yd3N370HF66kQTKPJUnqbTVH\nkrcBZ1XVc4AjgTOTHAKcDVxXVQcB1zXTksaTeSxJUg8rLpKr6oGq+lJz/1vAHcB+wInApc1ilwIn\nrTZIScNhHkuS1NtArriXZD3wPOALwExVPQCdD+Akz1zgMWcAZwDMzMwwNze36DrOOmzbIEIdqJnd\nxjOufkxT7EttO/0YxGsxiDhGabV5vG7dukVfg0nd3tomOXf6tSP0EXr3c9LzWNLgrLpITrIH8DHg\nzVX1zeba8UuqqguBCwE2bNhQs7Oziy5/2tmfWl2gQ3DWYds4/9bJvLL3NMW+6ZTZVT/nILavQcQx\nKoPI44MPPnjRPB7HHF6JSc6dfu0IfYTe/ZzkPJY0WKs6u0WSJ9H5YL2sqj7eND+YZN9m/r7AltWF\nKGmYzGNJkra3mrNbBLgIuKOq3tM16xrg1Ob+qcDVKw9P0jCZx5Ik9baa79OOAl4L3Jrk5qbt7cB5\nwJVJTgfuBV61uhAlDZF5LElSDysukqvq88BCAxePWenzSlo75rEkSb15xT1JkiSpxSJZkiRJarFI\nliRJkloskiVJkqQWi2RJkiSpxSJZkiRJarFIliRJkloskiVJkqQWi2RJkiSpxSJZkiRJarFIliRJ\nkloskiVJkqQWi2RJkiSpZWhFcpJjk9yVZGOSs4e1HknDYQ5Lk888llZuKEVykp2A3wOOAw4BXpPk\nkGGsS9LgmcPS5DOPpdUZ1pHk5wMbq+qrVfU94ArgxCGtS9LgmcPS5DOPpVVIVQ3+SZNXAsdW1c81\n068FXlBVb+ha5gzgjGbyYOCugQcyfPsA3xh1ECtk7GvvR6tq3aiD6Ec/Ody0d+fxocBtaxroaEzq\n9rccO0IfYWX9nPY8Xsnn8TRsL9PQB5iOfqxFH/rK452HtPL0aHtCNV5VFwIXDmn9ayLJjVW1YdRx\nrISxawlL5jA8MY93lPdlR+jnjtBH2CH6uew8XtFKpuB1nIY+wHT0Y5z6MKzhFpuBA7qm9wfuH9K6\nJA2eOSxNPvNYWoVhFcl/BRyU5MAkTwZOBq4Z0rokDZ45LE0+81hahaEMt6iqbUneAPw5sBNwcVXd\nPox1jdgkDxcxdi1ohTm8o7wvO0I/d4Q+wpT3cw0/i6fhdZyGPsB09GNs+jCUH+5JkiRJk8wr7kmS\nJEktFsmSJElSi0VyH5a6rGeS9ya5ubn9TZJHRhFnL33E/iNJrk/y5SS3JDl+FHH20kfsP5rkuibu\nuST7jyLOHUWSTUlubbbzG5u2pye5Nsndzd+9m/YkeX/z3t2S5IjRRt+/JHsluSrJnUnuSPJvp62f\nSQ7u2mfdnOSbSd48hf38pSS3J7ktyeVJdm1+xPaFpo8fbX7QRpJdmumNzfz1o41+PCQ5oPmMuKN5\nLd/UtJ+b5L6ubej4rsec07yOdyV5yeiif1zz3n8xyV83/fj1pn1itodF+nBJknu63ovDm/axzdsk\nO6VTd3yymR7P96GqvC1yo/Njh78FngU8Gfhr4JBFln8jnR9HTETsdAbI/6fm/iHAplHHvYzY/wQ4\ntbn/IuCPRh33NN+ATcA+rbbfAs5u7p8NvKu5fzzwp3TO03ok8IVRx7+Mfl4K/Fxz/8nAXtPYz67+\n7gT8PfCj09RPYD/gHmC3ZvpK4LTm78lN2x907f9+EfiD5v7JwEdH3YdxuAH7Akc0958K/E3zWXEu\n8Ms9lj+k2V/vAhzY7Md3GoN+BNijuf8k4AvNtjwx28MifbgEeGWP5cc2b4G3AB8BPtlMj+X74JHk\npS33sp6vAS5fk8iW1k/sBTytub8n43MOzX5iPwS4rrl/fY/5Gr4T6RSVNH9P6mr/cHXcAOyVZN9R\nBLgcSZ4GvBC4CKCqvldVjzBl/Ww5Bvjbqvo7pq+fOwO7JdkZeArwAJ1/qK9q5rf7ON/3q4BjkvS6\nGMcOpaoeqKovNfe/BdxB5x+QhZwIXFFV362qe4CNdPbnI9Vsu1ubySc1t2KCtodF+rCQsczbdL71\nfSnwoWY6jOn7YJG8tP2Ar3VNb2aBHUSSH6Xzn/Nn1yCufvQT+7nAzyTZDHyazpHwcdBP7H8N/D/N\n/VcAT03yjDWIbUdVwGeS3JTOZWwBZqrqAeh8mALPbNr7zpsx8yzg68AfNl8FfijJ7kxfP7udzOP/\n2E9NP6vqPuDdwL10iuNHgZuAR6pqW7NYdz9+0Mdm/qOA+5MuzVfdz6NzBBPgDc3X+BfPD81hjLeV\n5iv+m4EtwLV0jnJP1PbQ7kNVzb8X72zei/cm2aVpG9f34reBtwL/1Ew/gzF9HyySl9bXZT0bJwNX\nVdX3hxjPcvQT+2uAS6pqfzpfzfxRknHYLvqJ/ZeBn0zyZeAngfuAbds9SoNyVFUdARwHnJnkhYss\nu5y8GSc7A0cAF1TV84DH6Aw7WMik9hOAZtzfy+kMXVp00R5tY93Ppmg7kc6Bix8Gdqez7bbN92Pi\n+riWkuwBfAx4c1V9E7gA+OfA4XT+CTl/ftEeDx+L17Gqvl9Vh9O58uDzgef0Wqz5O5b9aPchyaHA\nOcC/AP4N8HTgbc3iY9eHJC8DtlTVTd3NPRYdi/dhHIqhcbecy3p2H5EZB/3EfjqdsUBU1V8CuwL7\nrEl0i1sy9qq6v6r+Q1PM/GrT9ujahbhjqar7m79bgE/Q+ZB5cP7ru+bvlmbxSb0c7mZgc9fRmavo\nFM3T1s95xwFfqqoHm+lp6udPAfdU1der6v8CHwd+nM5XzvMX0uruxw/62MzfE3hobUMeT0meRKdA\nvqyqPg5QVQ82Bds/AR/k8SEVY7+tNEOo5uiM053I7aGrD8c2Q2Kqqr4L/CHj/V4cBbw8ySY6wyhf\nROfI8li+DxbJS+vrsp5JDgb2Bv5yjeNbTD+x30tnTCJJnkOnSP76mkbZ25KxJ9mn66j3OcDFaxzj\nDiPJ7kmeOn8feDFwG5335NRmsVOBq5v71wCva35dfSTw6PzX+OOsqv4e+FqTz9DJja8wZf3s0v4N\nxTT1817gyCRPacYwzr+X1wOvbJZp93G+768EPlvNr4V2ZM1rdxFwR1W9p6u9e2zrK+jsD6DzOp7c\nnJXgQOAg4ItrFe9CkqxLsldzfzc6/0TdwQRtDwv04c6uf2xDZyxv93sxVnlbVedU1f5VtZ7O5/pn\nq+oUxvV9GPQvAafxRmcYwt/QGb/0q03bbwAv71rmXOC8Uce63Njp/Pjt/6Mzvvdm4MWjjnkZsb8S\nuLtZ5kPALqOOeVpvdMbq/nVzu73r/XgGnR9P3t38fXrTHuD3mvfuVmDDqPuwjL4eDtwI3AL8Dzr/\n/E5jP58C/AOwZ1fbVPUT+HXgTjpFwx/ROePCs+gUbRvpDDPZpVl212Z6YzP/WaOOfxxuwL+j8/X2\nLc1nxM3NvvmPmm3hFjqFzL5dj/nVZlu5Czhu1H1oYvpXwJebeG8Dfq1pn5jtYZE+fLZ5L24D/pjH\nz4Ax1nkLzPL42S3G8n3wstSSJElSi8MtJEmSpBaLZEmSJKnFIlmSJElqsUiWJEmSWiySJUmSpBaL\nZEmSJKnFIlmSJElqsUiWJEmSWiySJUmSpBaLZEmSJKnFIlmSJElqsUiWJEmSWiySJUmSpBaLZEmS\nJKnFInmKJdkjyaYkP93V9tQk9yZ5ZVfbk5PcmWTzaCKV1MtSOZzk3CT/N8nWrtuzRhmzpCfq57M4\nyRFJPtfk8INJ3jS6iDXPInmKVdVW4AzgfUnWNc2/BdxYVVd1LforwJa1jk/S4vrM4Y9W1R5dt6+O\nJFhJPS2Vx0n2Af4M+ADwDODZwGdGEqyeIFU16hg0ZEkuAXahk4AfAw6tqgeaeQcCnwbeAnywqvYf\nVZySelsoh5OcCzy7qn5mhOFJ6sMiefzfgAOq6rWjjE/b80jyjuGXgFngKuCX5wvkxu8Abwe+M4K4\nJPVnsRw+IclDSW5P8p9GEp2kfiyUx0cCDyX5P0m2JPmfSX5kVEHqcRbJO4Cqehi4HXgK8PH59iSv\nAHauqk+MKjZJS1soh4ErgecA64D/CPxaktesfYSSlrJIHu8PnAq8CfgR4B7g8jUPUNuxSN4BJPkZ\nYD3wF8C7mrbd6YyJeuPoIpPUj145DFBVX6mq+6vq+1X1f4D3Aa/s/SySRmmhPKbzTe4nquqvquof\ngV8HfjzJnmsfpbrtPOoANFxJngm8F3g1cCdwe5KPAN+kk6z/OwnAk4E9k/w9cGRVbRpJwJKeYKEc\nrqrP9Vi8gKxlfJKWtkQe30LHHOuRAAAgAElEQVQnd+fN3zeXR8wf7k25JFcCj1bVf2ymf47O2Sz+\nFbB316I/DvwucATw9ar6/lrHKml7S+TwscDngEeAfwN8Anh7VV06onAl9bBEHh9F54d8R9MZjvFb\nwIaq+okRhauGRfIUS3IS8PvAIVX1SFf7dcANVfWrXW2zwB97dgtpfCyVw8CzgBfT+cX8ZuD3q+r9\no4hVUm/9fBY3P7r9L3TGK38e+MWq+tpIAtYPWCRLkiRJLf5wT5IkSWqxSJYkSZJaLJIlSZKklr6L\n5CQ7Jflykk820wcm+UKSu5N8NMmTm/ZdmumNzfz1wwld0nKZx9LkSnJAkuuT3NFcYfFNTfvTk1zb\n5PG1SfZu2pPk/U0e35LkiNH2QJosyzmS/Cbgjq7pdwHvraqDgIeB05v204GHq+rZdM4J+C4kjQvz\nWJpc24Czquo5dC5lfGaSQ4CzgeuaPL6umQY4DjiouZ0BXLD2IUuTq6+zWyTZH7gUeCfwFuAE4OvA\nP6uqbUn+LXBuVb0kyZ839/8yyc7A3wPrapEV7bPPPrV+/frV92YFHnvsMXbfffeRrHsp4xqbcS3f\nY489xp133vmNqlo3qhimOY/njfM20A/jH72l+nDTTTeNNI+7JbmazvntfxeYraoHkuwLzFXVwUk+\n0Ny/vFn+rvnlFnrOpfJ4Gt7jpUx7H+1f/3nc7xX3fht4K/DUZvoZwCNVta2Z3gzs19zfD/gaQPPB\n+2iz/De6nzDJGXT+s2VmZoZ3v/vdfYYyWFu3bmWPPfYYybqXMq6xGdfybd26lRNOOOHvRhzG1Obx\nvHHeBvph/KO3VB+OPvroUecxAM0QqOcBXwBm5gvfplB+ZrPYD/K4MZ/jTyiSl5PH0/AeL2Xa+2j/\n+s/jJYvkJC8DtlTVTc0FJ6D3pRIXu4zidkefqupC4EKADRs21OzsbHuRNTE3N8eo1r2UcY3NuJZv\nbm5upOuf9jyeN87bQD+Mf/QmoQ9J9qBzhbY3V9U3kwWvXjzwPJ6E12e1pr2P9q9//RxJPgp4eZLj\ngV2Bp9E5IrVXkp2bo1D7A/c3y28GDgA2N1/T7gk8NJBoJa2UeSxNgSRPolMgX1ZVH2+aH0yyb9dw\niy1N+3wez+vOcUlLWPKHe1V1TlXtX1XrgZOBz1bVKcD1wCubxU4Frm7uX9NM08z/7GLjGCUNn3ks\nTb50DhlfBNxRVe/pmtWdr+08fl1zlosjgUcXG48s6Yn6HZPcy9uAK5L8V+DLdBKX5u8fJdlI58jT\nyasLUdIQmcfS5DgKeC1wa5Kbm7a3A+cBVyY5HbgXeFUz79PA8cBG4NvA69c2XGmyLatIrqo5YK65\n/1Xg+T2W+UceT1BJY8Y8liZTVX2e3uOMAY7psXwBZw41KGmKreZIsjQ11p/9qVU/x6bzXjqASKaX\nr7GGbRDb2CXHTu+psQbh1vse5bRVvs7jkscLbS9nHbat7z6Oe196Wah/49CXccthL0stSZIktVgk\nS5IkSS0WyZIkSVKLRbIkSZLUYpEsSZIktVgkS5IkSS0WyZIkSVKLRbIkSZLUYpEsSZIktVgkS5Ik\nSS0WyZIkSVKLRbIkSZLUYpEsSZIktVgkS5IkSS0WyZIkSVKLRbIkSZLUYpEsSZIktVgkS5IkSS0W\nyZIkSVKLRbIkSZLUYpEsSZIktVgkS5IkSS0WyZIkSVKLRbIkSZLUYpEsSZIktVgkS5IkSS0WyZIk\nSVLLkkVykl2TfDHJXye5PcmvN+0HJvlCkruTfDTJk5v2XZrpjc389cPtgqSlmMfS5EtycZItSW7r\najs3yX1Jbm5ux3fNO6fJ4buSvGQ0UUuTq58jyd8FXlRVzwUOB45NciTwLuC9VXUQ8DBwerP86cDD\nVfVs4L3NcpJGyzyWJt8lwLE92t9bVYc3t08DJDkEOBn4l81jfj/JTmsWqTQFliySq2NrM/mk5lbA\ni4CrmvZLgZOa+yc20zTzj0mSgUUsadnMY2nyVdXngIf6XPxE4Iqq+m5V3QNsBJ4/tOCkKZSqWnqh\nzn+fNwHPBn4P+O/ADc1RJpIcAPxpVR3afA10bFVtbub9LfCCqvpG6znPAM4AmJmZ+ddXXHHF4Hq1\nDFu3bmWPPfYYybqXMq6xTWNct9736KrXf9h+ey44b+vWrZxwwgk3VdWGVa9ohUadx8N+jWF8t81+\nGf/qDGIbO3DPnRbtw9FHHz3qPF4PfLKqDm2mzwVOA74J3AicVVUPJ/ldOvn9x81yF9HJ76t6PGff\nebzloUd58Dur68NSebxWFtpeZnaj7z6Oe196Wah/49CXtchh6D+Pd+5nhVX1feDwJHsBnwCe02ux\n5m+vo03bVeJVdSFwIcCGDRtqdna2n1AGbm5ujlGteynjGts0xnXa2Z9a9fo3nbLwuufm5lb9/Ks1\n6jwe9msM47tt9sv4V2cQ29glx+4+ae/BBcBv0snP3wTOB36WPnMYlpfHv3PZ1Zx/a1+lw4KWyuO1\nstD2ctZh2/ru47j3pZeF+jcOfRm3HF7W2S2q6hFgDjgS2CvJ/Ku8P3B/c38zcABAM39P+v96SNKQ\nmcfS9KiqB6vq+1X1T8AHeXxIxQ9yuNGd35L60M/ZLdY1R55IshvwU8AdwPXAK5vFTgWubu5f00zT\nzP9s9TOmQ9LQmMfSdEqyb9fkK4D5M19cA5zcnKnmQOAg4ItrHZ80yfr5PmFf4NJmPOMPAVdW1SeT\nfAW4Isl/Bb4MXNQsfxHwR0k20jnydPIQ4pa0POaxNOGSXA7MAvsk2Qy8A5hNcjidoRSbgJ8HqKrb\nk1wJfAXYBpzZDLmS1Kcli+SqugV4Xo/2r9Ljl7JV9Y/AqwYSnaSBMI+lyVdVr+nRfFGPtvnl3wm8\nc3gRSdPNK+5JkiRJLRbJkiRJUotFsiRJktRikSxJkiS1WCRLkiRJLRbJkiRJUotFsiRJktRikSxJ\nkiS1WCRLkiRJLRbJkiRJUotFsiRJktRikSxJkiS1WCRLkiRJLRbJkiRJUotFsiRJktRikSxJkiS1\nWCRLkiRJLRbJkiRJUotFsiRJktRikSxJkiS1WCRLkiRJLRbJkiRJUotFsiRJktRikSxJkiS1WCRL\nkiRJLRbJkiRJUotFsiRJktRikSxJkiS1WCRLkiRJLUsWyUkOSHJ9kjuS3J7kTU3705Ncm+Tu5u/e\nTXuSvD/JxiS3JDli2J2QtDjzWJp8SS5OsiXJbV1t5rA0JP0cSd4GnFVVzwGOBM5McghwNnBdVR0E\nXNdMAxwHHNTczgAuGHjUkpbLPJYm3yXAsa02c1gakiWL5Kp6oKq+1Nz/FnAHsB9wInBps9ilwEnN\n/ROBD1fHDcBeSfYdeOSS+mYeS5Ovqj4HPNRqNoelIUlV9b9wsh74HHAocG9V7dU17+Gq2jvJJ4Hz\nqurzTft1wNuq6sbWc51B579bZmZm/vUVV1yxyq6szNatW9ljjz1Gsu6ljGts0xjXrfc9uur1H7bf\nngvO27p1KyeccMJNVbVh1StapVHl8bBfYxjfbbNfxr86g9jGDtxzp0X7cPTRR480j5v8/WRVHdpM\nP7KaHG7m9Z3HWx56lAe/s7o+LJXHa2Wh7WVmN/ru47j3pZeF+jcOfVmLHIb+83jnfleaZA/gY8Cb\nq+qbSRZctEfbdpV4VV0IXAiwYcOGmp2d7TeUgZqbm2NU617KuMY2jXGddvanVr3+TacsvO65ublV\nP/8gjDKPh/0aw/hum/0y/tUZxDZ2ybG7T/R70KWvHIbl5fHvXHY159/ad+nQ01J5vFYW2l7OOmxb\n330c9770slD/xqEv45bDfZ3dIsmT6HywXlZVH2+aH5z/6qb5u6Vp3wwc0PXw/YH7BxKtpBUzj6Wp\nZA5LQ7Lkv0rpHGq6CLijqt7TNesa4FTgvObv1V3tb0hyBfAC4NGqemCgUU+w9cv8b6/Xf1Wbznvp\nIEPSDsA8lqaWOSwNST/fJxwFvBa4NcnNTdvb6STklUlOB+4FXtXM+zRwPLAR+Dbw+oFGLGklzGNp\nwiW5HJgF9kmyGXgH5rA0NEsWyc2g/4UGLh7TY/kCzlxlXJIGyDyWJl9VvWaBWeawNARecU+SJElq\nsUiWJEmSWiySJUmSpBaLZEmSJKnFIlmSJElqsUiWJEmSWiySJUmSpBaLZEmSJKnFIlmSJElqsUiW\nJEmSWiySJUmSpBaLZEmSJKnFIlmSJElqsUiWJEmSWiySJUmSpBaLZEmSJKnFIlmSJElqsUiWJEmS\nWiySJUmSpBaLZEmSJKnFIlmSJElq2XnUAayl9Wd/aru2sw7bxmk92nvZdN5LBx2SJEmSxpBHkiVJ\nkqQWi2RJkiSpxSJZkiRJarFIliRJkloskiVJkqQWi2RJkiSpZckiOcnFSbYkua2r7elJrk1yd/N3\n76Y9Sd6fZGOSW5IcMczgJfXHPJamW5JNSW5NcnOSG5u2njkuqT/9HEm+BDi21XY2cF1VHQRc10wD\nHAcc1NzOAC4YTJiSVukSzGNp2h1dVYdX1YZmeqEcl9SHJYvkqvoc8FCr+UTg0ub+pcBJXe0fro4b\ngL2S7DuoYCWtjHks7ZAWynFJfUhVLb1Qsh74ZFUd2kw/UlV7dc1/uKr2TvJJ4Lyq+nzTfh3wtqq6\nscdznkHnKBUzMzP/+oorrhhAdxZ3632Pbtc2sxs8+J3+Hn/YfnsOJYaFLBTbIOJYja1bt7LHHnuM\nNIZeVhPXct6XhSz2vmzdupUTTjjhpq4jPGtu1Hk87NcYxnfb7Jfxr84gtrED99xp0T4cffTRI83j\nhSS5B3gYKOADVXXhQjne47F95/GWhx7t+zNzIaP+DJu30Pay1nXBIExDbQFrk8PQfx4P+rLU6dHW\nswqvqguBCwE2bNhQs7OzAw5le70uP33WYds4/9b+XoZNp8wOJYaFLBTbIOJYjbm5Odbi/Vqu1cS1\nnPdlIYu9L3Nzc6t+/jU0lDwe9msM47tt9sv4V2cQ29glx+4+qe/BUVV1f5JnAtcmubPfBy4nj3/n\nsqv7/sxcyKg/w+YttL2sdV0wCNNQW8D45fBKz27x4PzXr83fLU37ZuCAruX2B+5feXiShsg8lqZE\nVd3f/N0CfAJ4PgvnuKQ+rLRIvgY4tbl/KnB1V/vrml/HHwk8WlUPrDJGScNhHktTIMnuSZ46fx94\nMXAbC+e4pD4s+X1CksuBWWCfJJuBdwDnAVcmOR24F3hVs/ingeOBjcC3gdcPIWZJy2QeS1NtBvhE\nEuh8rn+kqv4syV/RO8cl9WHJIrmqXrPArGN6LFvAmasNStJgmcfS9KqqrwLP7dH+D/TIcUn98Yp7\nkiRJUotFsiRJktRikSxJkiS1WCRLkiRJLRbJkiRJUotFsiRJktRikSxJkiS1WCRLkiRJLUteTGRc\nrD/7U6MOQZIkSTsIjyRLkiRJLRbJkiRJUotFsiRJktRikSxJkiS1WCRLkiRJLRbJkiRJUotFsiRJ\nktRikSxJkiS1WCRLkiRJLRbJkiRJUotFsiRJktRikSxJkiS1WCRLkiRJLRbJkiRJUotFsiRJktRi\nkSxJkiS1WCRLkiRJLRbJkiRJUotFsiRJktQytCI5ybFJ7kqyMcnZw1qPpOEwh6XJZx5LKzeUIjnJ\nTsDvAccBhwCvSXLIMNYlafDMYWnymcfS6gzrSPLzgY1V9dWq+h5wBXDikNYlafDMYWnymcfSKgyr\nSN4P+FrX9OamTdJkMIelyWceS6uw85CeNz3a6gkLJGcAZzSTW5PcNaRYFvWfYR/gG/0sm3cNOZiW\nhWJb6zh66Ps1W2MjjWuJ92Uf4EfXJpKBWDKHYe3zuI9tf1y3zX4Z/4gd/a4l+7Cj5/Gq3+Mx+Axb\n1DjXBYMwxrXFQPSRw9BnHg+rSN4MHNA1vT9wf/cCVXUhcOGQ1t+3JDdW1YZRx9HLuMZmXMvXxLZ+\n1HEsw5I5DOOTx/PGeRvoh/GP3jT0ocvA83jKXp+epr2P9q9/wxpu8VfAQUkOTPJk4GTgmiGtS9Lg\nmcPS5DOPpVUYypHkqtqW5A3AnwM7ARdX1e3DWJekwTOHpclnHkurM6zhFlTVp4FPD+v5B2hsviru\nYVxjM67lG+fYepqgHO42ca9zi/GP3jT04QeGkMdT9fosYNr7aP/6lKrtxvBLkiRJOzQvSy1JkiS1\nTH2RnOTiJFuS3NbV9t+T3JnkliSfSLJX074+yXeS3Nzc/mCN4zo3yX1d6z++a945zWVF70rykmHF\ntUhsH+2Ka1OSm5v2tXzNDkhyfZI7ktye5E1N+9OTXJvk7ubv3k17kry/ed1uSXLEGsc18u1sR5Jk\npyRfTvLJUceyEk1e3dpsEzeOOp7lSrJXkquabf6OJP921DH1K8nBXfl4c5JvJnnzqOMaJwvt56ZF\nkl2TfDHJXzf9+/VRxzQMk76fXMqg96NTP9wiyQuBrcCHq+rQpu3FwGebHzW8C6Cq3pZkPfDJ+eVG\nENe5wNaqendr2UOAy+lcPemHgb8Afqyqvr9WsbXmnw88WlW/scav2b7AvlX1pSRPBW4CTgJOAx6q\nqvOSnA3s3byfxwNvBI4HXgC8r6pesIZx7c+It7MdSZK3ABuAp1XVy0Ydz3Il2QRsqKqJPM9wkkuB\n/11VH0rnTApPqapHRh3XcqVzKef7gBdU1d+NOp5xsdB+rqq+MuLQBiJJgN2ramuSJwGfB95UVTeM\nOLSBmvT95FIGvR+d+iPJVfU54KFW22eqalszeQOdYmbkcS3iROCKqvpuVd0DbKRTMK95bM2O5NV0\nivY1VVUPVNWXmvvfAu6gc/WoE4FLm8UupVOg0rR/uDpuAPZqdvRrEtc4bGc7iiT7Ay8FPjTqWHZE\nSZ4GvBC4CKCqvjeJBXLjGOBvLZCfaJH971RoPie2NpNPam5TdRTR/eTyTX2R3IefBf60a/rA5quI\n/5XkJ0YQzxuar+cvnh82wHhdWvQngAer6u6utjV/zZqjsc8DvgDMVNUD0NmRA89sFlvz160VV7dx\n286mzW8DbwX+adSBrEIBn0lyUzpXQJskzwK+Dvxhs11/KMnuow5qhU5mBAcBJski+7mJ1gxFuBnY\nAlxbVVPVP6ZjP7mUge5Hd+giOcmvAtuAy5qmB4AfqarnAW8BPtIcIVkrFwD/HDi8ieX8+VB7LDuq\n/3BfwxM/QNb8NUuyB/Ax4M1V9c3FFu3RNrTXbaG4xnA7mypJXgZsqaqbRh3LKh1VVUcAxwFnNsOe\nJsXOwBHABc12/Rhw9mhDWr5mmMjLgT8ZdSzjahn734lTVd+vqsPpfOv3/CRTMyRuivaTSxnofnSH\nLZKTnAq8DDilmoHZzXCGf2ju3wT8LfBjaxVTVT3YJOk/AR/k8SEVfV1adNiS7Az8B+Cj821r/Zo1\nY8U+BlxWVR9vmh+cH0bR/N3StK/Z67ZAXGO5nU2ho4CXN2PRrgBelOSPRxvS8lXV/c3fLcAnGOKQ\nqiHYDGzuOvJ2FZ2iedIcB3ypqh4cdSDjaKH93LRphgrNAceOOJRBmor95FIGvR/dIYvkJMcCbwNe\nXlXf7mpf1/xogyTPAg4CvrqGcXWPl30FMH92iWuAk5PskuTAJq4vrlVcXX4KuLOqNs83rOVr1oyH\nvgi4o6re0zXrGuDU5v6pwNVd7a9Lx5F0fmz4wFrFNa7b2bSpqnOqav+qWk/nq/LPVtXPjDisZUmy\ne/NjKJphCi/m8fwfe1X198DXkhzcNB0DTOIPutrflKmxyP53KjT75fkzEO1G83k32qgGZxr2k0sZ\nxn50aFfcGxdJLgdmgX2SbAbeAZwD7AJc28l7bqiqX6Dzw5PfSLIN+D7wC1XV74/rBhHXbJLD6QwJ\n2AT8PEBV3Z7kSjofOtuAM4d1ZouFYquqi+g9Vm/NXjM6/wm/Fri1GTcG8HbgPODKJKcD9wKvauZ9\nms6ZLTYC3wZev8ZxvZ8Rb2eaGDPAJ5rtZGfgI1X1Z6MNadneCFzWDFn4KsPLt6FI8hTg39Psd7Wd\nnvu56lzRbxrsC1zaHMD4IeDKqprK06RNsYHvR6f+FHCSJEnScu2Qwy0kSZKkxVgkS5IkSS0WyZIk\nSVKLRbIkSZLUYpEsSZIktVgkS5IkSS0WyZIkSVKLRbIkSZLUYpEsSZIktVgkS5IkSS0WyZIkSVKL\nRbIkSZLUYpEsSZIktVgkS5IkSS0WyZIkSVKLRfIUS7JHkk1Jfrqr7alJ7k3yyiR/mmRr1+17SW4d\nZcySHtdHDu+S5A+SPJjkoST/M8l+o4xZ0hMluSzJxa22n0zyD0l+IsmfJ/lGkhpVjOotVb4n0yzJ\ni4HLgEOq6utJLgBmquo/9Fh2DvhsVf3GGocpaQGL5XCStwKnAC8GHgU+COzeK78ljUaSZwC3A6+t\nqmuT7ArcAvw34C+Bfwd8A/gfVZXRRao2i+QdQJJLgF2ADwAfAw6tqgday6wH/hZ4dlXds8YhSlrE\nQjncFMzfqqq3Nsu9FHhPVR08smAlbSfJq4DfAg4F/gtweFUd1zX/2cDdFsnjxSJ5B5Bkb+ArwJOA\nX6mqP+yxzK8BL6qq2TUOT9ISFsrhJBuA9wGvAh4BPgRsqao3jypWSb0luQp4MnAU8LyqurdrnkXy\nGHJM8g6gqh6m81XPU4CPL7DY64BL1iomSf1bJIf/BrgXuA/4JvAcwOFS0ng6E3gR8BvdBbLGl0Xy\nDiDJzwDrgb8A3tVj/r8D/hlw1dpGJqkfi+TwBcCuwDOA3ekU0H+61vFJWlpVPUhn7PHto45F/bFI\nnnJJngm8F/iPwM8Dr07ywtZipwIfr6qtax2fpMUtkcPPBS6pqoeq6rvA7wDPT7LPaKKVpOlhkTz9\nfpfOL2avb36s91bgg0l2AUiyG53xjJeMLkRJi1gsh/8KeF2SPZM8CfhF4P6q+sYI45XUp3TsSmes\nMkl2nf981uhZJE+xJCfRObXMr8y3VdWHgM3ArzVNJ9E5ddT1ax6gpEX1kcO/DPwjcDfwdeB44BVr\nH6mkFfpR4Ds8PgTjO8BdowtH3Ty7hSRJktTikWRJkiSpxSJZkiRJalmySE5yQJLrk9yR5PYkb2ra\nz01yX5Kbm9vxXY85J8nGJHcleckwOyBpaUkuTrIlyW1dbeawJEkLWHJMcpJ9gX2r6ktJngrcROfH\nXq8GtlbVu1vLHwJcDjwf+GE65/X8sar6/hDil9SH5pRhW4EPV9WhTdu5mMOSJPW081ILNKcceqC5\n/60kdwD7LfKQE4ErmnN23pNkI50P279c6AH77LNPrV+/ftE4HnvsMXbfffelwh054xysSYkTlo71\npptu+kZVrVvDkH6gqj6XZH2fiy87h2HpPP7/27v/YLnK+77j728wJgRoAWPuqKBGuKN4jC1XUJUw\nQ8dzCWkqIMOPGbsjhoAwtMKpmJiJZhphZ4obDTM0QXZrkuKIwkhMFX4kmEpjaGKicocyU0FkW0aS\nZQfhKEagkVrjAAqt2wvf/rHn2svR3rt7757dc/be92tm5+4+e+7dz57dZ/XV2fM8T1NeS3OYo58c\ndfbjYejl3+MqNOX1ni1zD88gM/faj7sWye2Kf2QvAJ6ntfb4bRFxI7ALWFcsnXoOsLPt1w7RoaiO\niDXAGoCxsTHuueee8ibvcezYMU499dTZxK2FOas1Kjmhe9ZLL730r4cYp1dz7sMwu37clNfSHObo\nJ0dD+3FllixZwq5duwb+OBMTE4yPjw/8capm7uEZZOaI6Kkf91wkR8SpwOPA7Zn5ZkTcB2wAsvi5\nEbgZiA6/ftw5HZm5CdgEsGLFiuy2I0blBTZntUYlJ4xW1kJffRhm14+bsn/MYY5RyCGpfj3NblGs\n5PQ4sDUzvwqtNcgz853MfBe4n9bXsdA66rS47dfPBV6rLrKkKtiHJUmaXi+zWwTwALA/M7/Y1r6o\nbbNrgalR89uBVRFxUkScBywFXqgusqQq2IclSZpeL6dbXALcAOyJiN1F2+eA6yJiOa2vYQ8CtwJk\n5r6IeAz4DjAJrHVUvFSviHgYGAfOiohDwJ3AuH1YkqTOepnd4jk6n6P41Ay/cxdwVx+5JFUoM6/r\n0PzADNvbhyVJC9qsZrdY6Jasf7LrNuuWTXLTDNsdvPvKKiPVqpf90U1T9kcVz2XzytGaXmeh2vPq\nGzP20V5U8b41R/U5qmA/Hrwl65/s+m9lN035t0Pzm8tSS5IkSSUWyZIkSVKJRbIkSZJUYpEsSZIk\nlVgkS5IkSSUWyZIkSVKJRbIkSZJUYpEsSZIklVgkS5IkSSUWyZIkSVKJRbIkSZJUYpEsSZIklVgk\nS5IkSSUWyZIkSVKJRbIkSZJUYpEsLQAR8WBEHI2IvW1tvxcR342IFyPiiYg4vWhfEhH/OyJ2F5ev\n1JdckqR6WCRLC8NmYGWp7WngY5n5ceAvgTva7ns5M5cXl88MKaMkSY1hkSwtAJn5LPB6qe3rmTlZ\n3NwJnDv0YJIkNdT76g4gqRFuBh5tu31eRHwLeBP47cz8751+KSLWAGsAxsbGmJiYmPYBjh07NuP9\nwzJ2MqxbNtl9wxlU8TzMUX2OKjTlfSqpfhbJ0gIXEZ8HJoGtRdNh4O9n5g8j4h8B/yUiPpqZb5Z/\nNzM3AZsAVqxYkePj49M+zsTEBDPdPyz3bt3Gxj39ffQdvH7cHA3MUYXNK09pxPtUUv26nm4REYsj\n4pmI2B8R+yLis0X7mRHxdES8VPw8o2iPiPhyRBwoBgRdOOgnIWluImI18KvA9ZmZAJn548z8YXH9\nG8DLwC/Ul1KSpOHr5ZzkSWBdZn4EuBhYGxHnA+uBHZm5FNhR3Aa4HFhaXNYA91WeWlLfImIl8FvA\nVZn5dlv7ByPihOL6h2j15e/Xk1KSpHp0LZIz83BmfrO4/hawHzgHuBrYUmy2BbimuH418FC27ARO\nj4hFlSeX1LOIeBj4H8CHI+JQRNwC/D5wGvB0aaq3TwAvRsS3gT8BPpOZr3f8w5IkzVOzOgEsIpYA\nFwDPA2OZeRhahXREnHRhyQQAABTtSURBVF1sdg7wStuvHSraDpf+Vs8DfqAZgyl6GVTSbfBJ3c9h\nShX7s4pBNk153at4Lk14j04nM6/r0PzANNs+Djw+2ESSJDVbz0VyRJxK6x/O2zPzzYiYdtMObXlc\nwywG/EAzBv3ctP7JrtusWzY54+CTKga4VKGK/dnL/uim2/4Y1utexXNxwI+kQYqIB2mNITiamR8r\n2r4A/EvgfxabfS4znyruuwO4BXgH+I3M/LOhh5ZGWE9FckScSKtA3pqZXy2aj0TEouIo8iLgaNF+\nCFjc9uvnAq9VFViSpAVqM63TpB4qtX8pM+9pbyjGDq0CPgr8PeDPI+IXMvOdYQQdtCVVHKS5+8oK\nkmg+62V2i6D1tez+zPxi213bgdXF9dXAtrb2G4tZLi4G3pg6LUOSJM1Np0WBZnA18EgxW81fAQeA\niwYWTpqHejmSfAlwA7AnInYXbZ8D7gYeKwYA/QD4VHHfU8AVtDrk28CnK00sSZLa3RYRNwK7aM1G\n9SNaY4F2tm0zNT7oOLMdI9SvdcsmG7F4zFyeZ5PHnsxkFHM3IXPXIjkzn6PzecYAl3XYPoG1feaS\nJEnd3QdsoDX2ZwOwkdYKmj2ND4LZjxHq103rn+w6fmcY5jJGqAnjo+ZiFHM3IXMv8yRLkqQGyswj\nmflOZr4L3M9PT6lwfJDUJ4tkSZJGVGkdgmuBvcX17cCqiDgpIs6jtSjQC8POJ42yer/rkCRJPSkW\nBRoHzoqIQ8CdwHhELKd1KsVB4FaAzNwXEY8B36G1cu7a+TKzhTQsFsmSJI2A2SwKVGx/F3DX4BJJ\n85unW0iSJEklFsmSJElSiUWyJEmSVGKRLEmSJJVYJEuSJEklFsmSJElSiUWyJEmSVGKRLC0AEfFg\nRByNiL1tbWdGxNMR8VLx84yiPSLiyxFxICJejIgL60suSVI9LJKlhWEzsLLUth7YkZlLgR3FbYDL\naS1huxRYA9w3pIySJDWGRbK0AGTms8DrpeargS3F9S3ANW3tD2XLTuD0iFg0nKSSJDWDy1JLC9dY\nZh4GyMzDEXF20X4O8ErbdoeKtsPlPxARa2gdbWZsbIyJiYlpH+zYsWMz3j8sYyfDumWTff2NKp6H\nOarPUYWmvE8l1c8iWVJZdGjLThtm5iZgE8CKFStyfHx82j86MTHBTPcPy71bt7FxT38ffQevHzdH\nA3NUYfPKUxrxPpVUP0+3kBauI1OnURQ/jxbth4DFbdudC7w25GySJNXKIllauLYDq4vrq4Ftbe03\nFrNcXAy8MXVahiRJC0X9321JGriIeBgYB86KiEPAncDdwGMRcQvwA+BTxeZPAVcAB4C3gU8PPbAk\nSTWzSJYWgMy8bpq7LuuwbQJrB5tIkqRm83QLSZIkqaRrkTzNSl1fiIhXI2J3cbmi7b47ipW6vhcR\n/2xQwSVJkqRB6eVI8maOX6kL4EuZuby4PAUQEecDq4CPFr/zHyPihKrCSpIkScPQtUieZqWu6VwN\nPJKZP87Mv6I18OeiPvJJkiRJQ9fPwL3bIuJGYBewLjN/RGtVrp1t20yt1HWc2azUBc1YBamX1aC6\nrRpV93OYUsX+rGJ1rKa87lU8lya8RyVJUjXmWiTfB2ygtQrXBmAjcDMDWqkLmrFa103rn+y6zbpl\nkzOuGlXFylRVqGJ/9rI/uum2P4b1ulfxXFypS5Kk+WNOs1tk5pHMfCcz3wXu56enVLhSlyRJkkbe\nnIrkqaVsC9cCUzNfbAdWRcRJEXEesBR4ob+IkiRJ0nB1Pd1impW6xiNiOa1TKQ4CtwJk5r6IeAz4\nDjAJrM3MdwYTXZIkSRqMrkXyNCt1PTDD9ncBd/UTSpIkSaqTK+5JkiRJJRbJkiRJUolFsiRJklRi\nkSxJkiSVWCRLkjQCIuLBiDgaEXvb2s6MiKcj4qXi5xlFe0TElyPiQES8GBEX1pdcGk0WyZIkjYbN\nwMpS23pgR2YuBXYUtwEup7VWwVJgDa2VciXNgkWytIBFxIcjYnfb5c2IuD0ivhARr7a1X1F3Vmmh\ny8xngddLzVcDW4rrW4Br2tofypadwOmlhcAkddF1nmRJ81dmfg9YDhARJwCvAk8Anwa+lJn31BhP\nUndjmXkYIDMPR8TZRfs5wCtt2x0q2g6X/0BErKF1tJmxsTEmJiYGGnjdsknGTm79rNNcnuexY8cG\nvn8GYRRzNyGzRbKkKZcBL2fmX0dE3Vkk9adTJ85OG2bmJmATwIoVK3J8fHyAseCm9U+ybtkkG/fU\nW4IcvH581r8zMTHBoPfPIIxi7iZktkiWNGUV8HDb7dsi4kZgF7AuM39U/oXZHIFqwlEBoJIjWFU8\nD3NUn6MKTXmfzsKRiFhUHEVeBBwt2g8Bi9u2Oxd4bejppBFmkSyJiHg/cBVwR9F0H7CB1pGnDcBG\n4Oby783mCFQTjgoA3Lt1W99HsOZyBMocg89Rhc0rT2nE+3QWtgOrgbuLn9va2m+LiEeAXwTemDot\nQ1Jv6v9EktQElwPfzMwjAFM/ASLifuBrdQWT1BIRDwPjwFkRcQi4k1Zx/FhE3AL8APhUsflTwBXA\nAeBtWuMMJM2CRbIkgOtoO9Vi6uvb4ua1wN6OvyVpaDLzumnuuqzDtgmsHWwiaX6zSJYWuIj4OeCf\nAre2Nf9uRCyndbrFwdJ9kiTNexbJ0gKXmW8DHyi13VBTHEmSGsHFRCRJkqQSi2RJkiSpxCJZkiRJ\nKrFIliRJkkoskiVJkqQSZ7eQJEkaYUvWPznj/euWTXJTl22qcPDuKwf+GMPU9UhyRDwYEUcjYm9b\n25kR8XREvFT8PKNoj4j4ckQciIgXI+LCQYaXJEmSBqGX0y02AytLbeuBHZm5FNhR3IbW0rZLi8sa\n4L5qYkqSJEnD07VIzsxngddLzVcDW4rrW4Br2tofypadwOkRsaiqsJIkSdIwzPWc5LHMPAyQmYcj\n4uyi/RzglbbtDhVth8t/ICLW0DrazNjYGBMTEzM+4LFjx7puM2jrlk123Wbs5Jm3q/s5TKlif/ay\nP7ppyutexXNpwntUkiRVo+qBe9GhLTttmJmbgE0AK1asyPHx8Rn/8MTEBN22GbReTnpft2ySjXum\n360Hrx+vMNHcVbE/qxgE0G1/DOt1r+K5bF55Su3vUUmSVI25TgF3ZOo0iuLn0aL9ELC4bbtzgdfm\nHk+SJEkavrkWyduB1cX11cC2tvYbi1kuLgbemDotQ5IkSRoVXU+3iIiHgXHgrIg4BNwJ3A08FhG3\nAD8APlVs/hRwBXAAeBv49AAyS5IkSQPVtUjOzOumueuyDtsmsLbfUJIkSVKdXJZakiRJKnFZammB\ni4iDwFvAO8BkZq6IiDOBR4ElwEHgn2fmj+rKKEnSsHkkWRLApZm5PDNXFLenW1VTkqQFwSJZUifT\nraopSdKC4OkWkhL4ekQk8IfFQj/Trar5HrNZObMpKxJ2WxWzF1U8D3NUn6MKTXmfSqqfRbKkSzLz\ntaIQfjoivtvrL85m5cwmrJoJcO/WbTOuitmLKlbONEf1OargypmSptT/iSSpVpn5WvHzaEQ8AVxE\nsapmcRS5fVXNOdvz6ht9L/998O4r+40hSVJPPCdZWsAi4pSIOG3qOvArwF6mX1VTkqQFwSPJ0sI2\nBjwREdD6PPijzPzTiPgLOq+qKUmq0JI+v2Frkn6fS9O+LbRIlhawzPw+8A87tP+QDqtqSpK0UHi6\nhSRJklRikSxJkiSVeLqFJEkjzuXlpep5JFmSpPnB5eWlClkkS5I0P7m8vNQHT7eQJGn0DWV5+Sqs\nWzbZiGXI5/I8B7Fs+TD2QxP2dy/a920Tloi3SJYkafQNZXn5Kty0/knWLZusfRnyuSynPjExUfmy\n5f2uRNqLJuzvXrS/JoPY17Pl6RaSJI249uXlgfcsLw9Q1fLy0kLS/P9WSJKkaRVLyv9MZr7Vtrz8\n7/DT5eXvxuXlNQLaV+xbt2xyTkfZq1y1zyJZkqTR5vLy0gBYJEuSNMJcXl4ajL6KZCcvlyRJ0nxU\nxcA9Jy+XJEnSvDKI2S2cvFySJEkjrd9zkoc2eXkTJpXuZSLubhN21/0cplSxP6uYmLwpr3sVz6UJ\n71FJUm+WzGHmhLnOuKDR1G+RPLTJy+/duo2Nz/1tP1n7nhakl47RbcLuuUxePghVTNJdxQdFt/0x\nrMnEq3gum1eeUvvE55IkqRp9nW7h5OXSaIuIxRHxTETsj4h9EfHZov0LEfFqROwuLlfUnVWSpGGa\nc5EcEadExGlT12lNXr6Xn05eDk5eLjXdJLAuMz8CXAysjYjzi/u+VAzKXZ6ZT9UXUZKk4evndAsn\nL5dGXDF+YGoMwVsRsR84p95UkiTVb85FspOXS/NLRCwBLgCeBy4BbouIG4FdtI42Hzff+WwG4HYb\n1NqLKgZGmmP+5qiCA3AlTXHFPUlExKnA48DtmflmRNwHbKA1g80GYCNwc/n3ZjMA996t22Yc1NqL\nKga+mmP+5qiCA3AlTRnEPMmSRkhEnEirQN6amV8FyMwjmflOZr4L3E9rUK4kSQuGRbK0gEVrUMED\nwP7M/GJb+6K2za6lNShXkqQFo/7vtiTV6RLgBmBPROwu2j4HXBcRy2mdbnEQuLWeeJIk1cMiWVrA\nMvM5IDrc5ZRvkqQFzdMtJEmSpBKLZEmSJKnEIlmSJEkq8ZxkSZLUkyXrn6w7gjQ0HkmWJEmSSiyS\nJUmSpBKLZEmSJKnEIlmSJEkqsUiWJEmSSiySJUmSpBKLZEmSJKnEIlmSJEkqsUiWJEmSSiySJUmS\npBKLZEmSJKnEIlmSJEkqGViRHBErI+J7EXEgItYP6nEkDYZ9WBp99mNp7gZSJEfECcAfAJcD5wPX\nRcT5g3gsSdWzD0ujz34s9WdQR5IvAg5k5vcz8/8CjwBXD+ixJFXPPiyNPvux1IfIzOr/aMQngZWZ\n+S+K2zcAv5iZt7VtswZYU9z8MPC9Ln/2LOB/VR62euas1qjkhO5Zfz4zPzisMP3opQ8X7bPpx015\nLc3xXuZ4L/tx93+Pq9CU13u2zD08g8zcUz9+34AePDq0vacaz8xNwKae/2DErsxc0W+wQTNntUYl\nJ4xW1h507cMwu37clP1jDnOMQo6KVN6PqzKq+9ncw9OEzIM63eIQsLjt9rnAawN6LEnVsw9Lo89+\nLPVhUEXyXwBLI+K8iHg/sArYPqDHklQ9+7A0+uzHUh8GcrpFZk5GxG3AnwEnAA9m5r4+/+xQvwrq\ngzmrNSo5YbSyzmie92FzvJc53qspOfo2oH5clVHdz+YentozD2TgniRJkjTKXHFPkiRJKrFIliRJ\nkkoaVSR3Wz4zIk6KiEeL+5+PiCXDT/mTLN2yfiIivhkRk8VclbXoIedvRsR3IuLFiNgRET/f0Jyf\niYg9EbE7Ip6ra9WoXpd4jYhPRkRGxEhNuTMoTVgaNyIejIijEbG3jsdvy7E4Ip6JiP0RsS8iPltT\njp+NiBci4ttFjn9bR44iywkR8a2I+FqNGQ62fcbsqivHfNSp70XEmRHxdES8VPw8o86MZdP10xHI\n3bFfF4M3ny9yP1oM5GyU8udAIzJnZiMutAYVvAx8CHg/8G3g/NI2/wr4SnF9FfBog7MuAT4OPAR8\nssE5LwV+rrj+63Xs0x5z/p2261cBf9rEnMV2pwHPAjuBFXW89k269LrfhpDjE8CFwN6a98ci4MK2\n98pf1rQ/Aji1uH4i8DxwcU375DeBPwK+VuPrchA4q873xny9dOp7wO8C64vr64F/V3fOUuaO/XQE\ncnfs18BjwKqi/SvAr9edtUP293wONCFzk44k97J85tXAluL6nwCXRUSnydIHrWvWzDyYmS8C79aQ\nb0ovOZ/JzLeLmztpzaM5bL3kfLPt5il0mBB/CHpd4nUDrQ/S/zPMcA3WiKVxM/NZ4PVhP26HHIcz\n85vF9beA/cA5NeTIzDxW3DyxuAy9X0XEucCVwH8a9mNrOKbpe+3/nm8BrhlqqC5m6KdNzz1dv/4l\nWnUTNDB3+XOgqO1qz9ykIvkc4JW224c4/h+On2yTmZPAG8AHhpJumhyFTlmbYLY5bwH+60ATddZT\nzohYGxEv0ypAf2NI2dp1zRkRFwCLM7O2r40baFT6y9AVp4xdQOtoTx2Pf0JE7AaOAk9nZh05/j3w\nr6n3gAK0ComvR8Q3orVMswZrLDMPQ6sgBc6uOc+0Sv208bnL/ZrWN3l/U9RN0MzP4PLnwAdoQOYm\nFcm9LJ/Z0xKbQ9CUHN30nDMifg1YAfzeQBN11uvSqX+Qmf8A+C3gtwee6ngz5oyInwG+BKwbWqLR\nMCr9Zagi4lTgceD20jclQ5OZ72TmclrfIF0UER8b5uNHxK8CRzPzG8N83GlckpkXApcDayPiE3UH\nUv2a0E9nq9yvgY902my4qaY3zedAI/7daFKR3MvymT/ZJiLeB/xd6vn6dFSW+uwpZ0T8MvB54KrM\n/PGQsrWb7f58hHq+KuqW8zTgY8BERBykdR7YdgfvjUx/GZqIOJHWP7xbM/OrdefJzL8BJoCVQ37o\nS4Criv7yCPBLEfGfh5wBgMx8rfh5FHiCVnGhwTkSEYsAip9Ha85znGn6aeNzT2nr1xcDpxd1EzTv\nM/i4zwFaR5Zrz9ykIrmX5TO3A6uL658E/lsWZ3QP2ags9dk1Z3F6wB/SKpDr6uy95FzadvNK4KUh\n5psyY87MfCMzz8rMJZm5hNY53ldl5kIfKT8q/WUoinPtHgD2Z+YXa8zxwYg4vbh+MvDLwHeHmSEz\n78jMc4v+sorWZ/qvDTMDQEScEhGnTV0HfgWodRaUBaD93/PVwLYasxxnhn7a9Nyd+vV+4BladRM0\nLPc0nwPX04TMwx4pONMFuILWCNKXgc8Xbb9Dq9AA+Fngj4EDwAvAhxqc9R/TOoL2t8APgX0Nzfnn\nwBFgd3HZ3tCc/wHYV2R8BvhoE3OWtp3A2S2m3W81ZHgYOAz8v6Jv3lJTjn9C62vDF9v63RU15Pg4\n8K0ix17g39T8HhmnptktaM288u3isq+u9+h8vXTqe7TOOd1B64DHDuDMunOWMnfspyOQu2O/Lt7j\nLxT10x8DJ9WddZr8P/kcaEJml6WWJEmSSpp0uoUkSZLUCBbJkiRJUolFsiRJklRikSxJkiSVWCRL\nkiRJJRbJkiRJUolFsiRJklTy/wFzrg2Vs4gCmwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "data=pd.read_csv('Energy.csv')\n", + "energydata=pd.DataFrame(data)\n", + "print(energydata.dtypes)\n", + "print(energydata.describe())\n", + "energydata.hist(figsize=(12,10))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " __REGRESSION__:\n", + "LABELS ARE CONTINUOUS VALUES.\n", + "Here the model is trained to predict a continuous value for each instance.\n", + "On inputting a feature vector into the model, the trained model is able to predict a continuous value for that instance. \n", + "\n", + "__Q2.1: Train a linear regression model on 85 percent of the given dataset, what is the intercept value and coefficient values.__\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of total samples: 768\n", + "Number of samples in training data: 652\n", + "Number of samples in validation data: 116\n", + "\n", + "Coefficients:\n", + " [ -6.24938187e+01 1.14351200e+12 -1.14351200e+12 -2.28702401e+12\n", + " 4.32184148e+00 1.94553204e-02 2.00676946e+01 2.36007105e-01]\n", + "\n", + "Intercept: 77.891702454\n" + ] + } + ], + "source": [ + "from sklearn import datasets, linear_model\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "energy_x = energydata.iloc[:,:-1]\n", + "energy_y = energydata['Y1']\n", + "print('number of total samples: ',len(energy_x))\n", + "\n", + "xtrain, xtest, ytrain, ytest = train_test_split(energy_x, energy_y, test_size=0.15, random_state = 100)\n", + "print ('Number of samples in training data:',len(xtrain))\n", + "print ('Number of samples in validation data:',len(xtest))\n", + "\n", + "reg=linear_model.LinearRegression(fit_intercept=True)\n", + "reg.fit(xtrain, ytrain)\n", + "\n", + "ypred=reg.predict(xtest)\n", + "ypred1=reg.predict(xtrain)\n", + "\n", + "print('\\nCoefficients:\\n ',reg.coef_)\n", + "print('\\nIntercept: ',reg.intercept_)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "\n", + "#### Q.2.2: Report model performance using 'ROOT MEAN SQUARE' error metric on: \n", + "__1. Data that was used for training(Training error)__ \n", + "__2. On the 15 percent of unseen data (test error) __ \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1. RMSE train data: 2.93551172582705\n", + "2. RMSE test data: 2.885331133638931\n", + "\n", + "linear regression naccuracy (%): 90.9952525941\n" + ] + } + ], + "source": [ + "from sklearn.metrics import mean_squared_error\n", + "from math import sqrt\n", + "\n", + "print('1. RMSE train data: ',sqrt(mean_squared_error(ytrain, ypred1)))\n", + "print('2. RMSE test data: ',sqrt(mean_squared_error(ytest, ypred)))\n", + "acc_reglin=reg.score(xtest,ytest)\n", + "print('\\nlinear regression naccuracy (%): ',acc_reglin*100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "__ Q2.3: Lets us see the effect of amount of data on the performance of prediction model.Use varying amounts of Training data (100,200,300,400,500,all) to train regression models and report training error and validation error in each case. Validation data/Test data is the same as above for all these cases.__ \n", + "\n", + "Plot error rates vs number of training examples.Comment on the relationshipyou observe in the plot, between the amount of data used to train the model and the validation accuracy of the model.\n", + "\n", + "__Hint:__ Use array indexing to choose varying data amounts" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[100, 200, 300, 400, 500, 652]\n", + "Number of samples in train data: 100\n", + "Number of samples in test data: 116\n", + "Training RMSE for 100 observations in training set: 2.92760482324\n", + "Test RMSE for 100 observations in training set: 3.05435382389\n", + "Number of samples in train data: 200\n", + "Number of samples in test data: 116\n", + "Training RMSE for 200 observations in training set: 2.94940507493\n", + "Test RMSE for 200 observations in training set: 2.89522452089\n", + "Number of samples in train data: 300\n", + "Number of samples in test data: 116\n", + "Training RMSE for 300 observations in training set: 3.03196105191\n", + "Test RMSE for 300 observations in training set: 2.9246707638\n", + "Number of samples in train data: 400\n", + "Number of samples in test data: 116\n", + "Training RMSE for 400 observations in training set: 2.93409921214\n", + "Test RMSE for 400 observations in training set: 2.88615665111\n", + "Number of samples in train data: 500\n", + "Number of samples in test data: 116\n", + "Training RMSE for 500 observations in training set: 3.00664352621\n", + "Test RMSE for 500 observations in training set: 2.86352008296\n", + "Number of samples in train data: 652\n", + "Number of samples in test data: 116\n", + "Training RMSE for all observations in training set: 2.93551172583\n", + "Test RMSE for all observations in training set: 2.88533113364\n" + ] + }, + { + "data": { + "image/png": "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\npE3dqozo0pD3Zm4kda+1TjkR4+el8tX8Ldx+ekuftL+JrliOD67rztkd6vHUjyt5+JulNsvOz4qb\ntfW7qjZT1Wqq+q982yeq6gj/hBeCyujsrQOZ2Tw0YSktalfmlgEt3A7npNw1qBUi8NxPq90OJWis\nSzvAw98spUfTGtw2wHcdnaMiwnnp4s7c2K8ZH87exI0fzLN1ZfyoyLl3InJzcQeq6mulH04ZUKMp\n1OvkzN465Xa3o/Gb/01exdb9h/nypl5ERbjT2bek6lerwDWnNOX16Wu5rm9T4uv7b72UYJSZncOt\nHy8gKiKMFy7u5PNSZliYs6ZMg2oVePTbZVz8xmzeuiqBWpUD7x6lUFNcaesV4HogFud+jUYFHuZk\nxSfClnllprw1b+Ne3pu1gat6xdK1SQ23wymRUac1J7pCOUb/UHAmuynoyUkrWb4tnWfO70i9aP8N\nq17ZK5axl3dl1fZ0hr82k3VpB45/kCmR4hLJKcB0YDDOjYITVfWBvIdfogtVZWjlxMzsHO4bv5j6\n0RW4Z3Brt8MpsegK5bi1fwt+X7OLP9bscjucgPXz8h28O3MD15wSy8C4On4//xnxdfnkhp4cyMxm\nxJiZzNu4x+8xlCXFjZHMUtU7cTr3jgeuFJHFnsF2UxLVY6F+5zLRWv7VqWtJ2XmAJxLbUekE7mIO\nZFf0akKDahV48ocV5Nqg7t/ktYaPr//X1vD+1rlxdb4a1ZvoCuW49I05/Lh0u2uxhDpvVkisCjQF\nmgB7cRormpKKT4St82HvBrcj8ZmV29MZMy2FxM4NOK11bbfDKTVREeHcM7g1y7am893iQjv0lFnZ\nObnc8clCsrJzeeXSLq6Ph8XWqsT4Ub2Jq1+VUR/N450Z612NJ1QV1yLlEhH5BvgBqA5cp6r9VPUP\nv0UXyuI83e9DtLyVk6vcN34JVcqX4+GzA3/JmBN1bsf6xNevyjOTV5GZbbOD8rw8JYWkDXt4PLEd\nTWtVcjscAGpWjuLj63syqG0d/vPdch7/frldSZay4q5IPsK5CtkC9ACeE5HP8x5+iS6UVY+F+l1C\ntrz1zoz1LNq8j3+fE1eqN6AFirzWKal7D/PBrLIxaeJ4Zq3dzctT1jCiS0MSOwdWI84KkeGMubwr\nV/eO5c0/1nPbJwusd1opKq5oPdRvUZRV8cPg50dgz3pnWnCI2LznEM/+tJoBbWpzbkevlq4JSn1b\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "Observations from the plot:\n", + "1. Training RMSE wavers with increasing training observations.\n", + "2. Test RMSE in general decreases with increasing observations in the training set.\n", + "3. The training error being higher than test error means that the linear regression model accurately captures the trend in \n", + " the data. This can be seen in that the predictions made by this model on the test set are quite accurate and have low \n", + " errors/deviations from their actual values.\n", + "4. The test and train RMSE values are very close to each other indicating a good model.\n" + ] + } + ], + "source": [ + "'''traindata=[100,200,300,400,500,652]\n", + "\n", + "n=[]\n", + "ytesterror=[]\n", + "ytrainerror=[]\n", + "\n", + "for i,x in enumerate(traindata):\n", + " xtrainpoints=xtrain[:x]\n", + " ytrainpoints=ytrain[:x]\n", + " n=np.append(n,x)\n", + " print('no of training points: ',int(n[i]))\n", + " print(len(xtrainpoints))\n", + " reg=linear_model.LinearRegression()\n", + " reg.fit(xtrainpoints, ytrainpoints)\n", + " \n", + " ypred=reg.predict(xtest)\n", + " ypred1=reg.predict(xtrainpoints)\n", + " \n", + " a=mean_squared_error(ytrainpoints, ypred1)\n", + " b=mean_squared_error(ytest, ypred)\n", + " \n", + " ytesterror=np.append(ytesterror,a)\n", + " ytrainerror=np.append(ytrainerror,b)\n", + " \n", + " print('\\n1.',x,'RMSE train data: ',a)\n", + " print('2.',x,'RMSE test data: ',b)\n", + "\n", + "plt.plot(n,ytesterror,n,ytrainerror)\n", + "plt.xlabel('no of training samples')\n", + "plt.ylabel('RMSE')\n", + "\n", + "plt.show()'''\n", + "\n", + "train_mse = list()\n", + "test_mse = list()\n", + "a = list([100,200,300,400,500,652])\n", + "print(a)\n", + "\n", + "# Assuming error rate being talked about is RMSE and not error rate = 1 - accuracy\n", + "\n", + "# 100 samples\n", + "# Splitting data \n", + "x_train_100, x_test_100, y_train_100, y_test_100 = train_test_split(energy_x, energy_y, train_size = 100, test_size=0.15, random_state=100)\n", + "print ('Number of samples in train data:',len(x_train_100))\n", + "print ('Number of samples in test data:',len(x_test_100))\n", + "\n", + "# Fitting the model\n", + "LinearRegressionModel_100= linear_model.LinearRegression()\n", + "LinearRegressionModel_100.fit(x_train_100, y_train_100)\n", + "\n", + "# RMSE for training data\n", + "y_pred_train_100 = LinearRegressionModel_100.predict(x_train_100)\n", + "train_mse_100 = np.sqrt(np.mean((y_train_100-y_pred_train_100)**2))\n", + "print(\"Training RMSE for 100 observations in training set:\",train_mse_100)\n", + "train_mse.append(train_mse_100)\n", + "\n", + "# RMSE for test data\n", + "y_pred_test_100 = LinearRegressionModel_100.predict(x_test_100)\n", + "test_mse_100 = np.sqrt(np.mean((y_test_100-y_pred_test_100)**2))\n", + "print(\"Test RMSE for 100 observations in training set:\", test_mse_100)\n", + "test_mse.append(test_mse_100)\n", + "\n", + "\n", + "# 200 samples\n", + "# Splitting data \n", + "x_train_200, x_test_200, y_train_200, y_test_200 = train_test_split(energy_x, energy_y, train_size = 200, test_size=0.15, random_state=100)\n", + "print ('Number of samples in train data:',len(x_train_200))\n", + "print ('Number of samples in test data:',len(x_test_200))\n", + "\n", + "# Fitting the model\n", + "LinearRegressionModel_200= linear_model.LinearRegression()\n", + "LinearRegressionModel_200.fit(x_train_200, y_train_200)\n", + "\n", + "# RMSE for training data\n", + "y_pred_train_200 = LinearRegressionModel_200.predict(x_train_200)\n", + "train_mse_200 = np.sqrt(np.mean((y_train_200-y_pred_train_200)**2))\n", + "print(\"Training RMSE for 200 observations in training set:\",train_mse_200)\n", + "train_mse.append(train_mse_200)\n", + "\n", + "# RMSE for test data\n", + "y_pred_test_200 = LinearRegressionModel_200.predict(x_test_200)\n", + "test_mse_200 = np.sqrt(np.mean((y_test_200-y_pred_test_200)**2))\n", + "print(\"Test RMSE for 200 observations in training set:\", test_mse_200)\n", + "test_mse.append(test_mse_200)\n", + "\n", + "\n", + "# 300 samples\n", + "# Splitting data \n", + "x_train_300, x_test_300, y_train_300, y_test_300 = train_test_split(energy_x, energy_y, train_size = 300, test_size=0.15, random_state=100)\n", + "print ('Number of samples in train data:',len(x_train_300))\n", + "print ('Number of samples in test data:',len(x_test_300))\n", + "\n", + "# Fitting the model\n", + "LinearRegressionModel_300= linear_model.LinearRegression()\n", + "LinearRegressionModel_300.fit(x_train_300, y_train_300)\n", + "\n", + "# RMSE for training data\n", + "y_pred_train_300 = LinearRegressionModel_300.predict(x_train_300)\n", + "train_mse_300 = np.sqrt(np.mean((y_train_300-y_pred_train_300)**2))\n", + "print(\"Training RMSE for 300 observations in training set:\",train_mse_300)\n", + "train_mse.append(train_mse_300)\n", + "\n", + "# RMSE for test data\n", + "y_pred_test_300 = LinearRegressionModel_300.predict(x_test_300)\n", + "test_mse_300 = np.sqrt(np.mean((y_test_300-y_pred_test_300)**2))\n", + "print(\"Test RMSE for 300 observations in training set:\", test_mse_300)\n", + "test_mse.append(test_mse_300)\n", + "\n", + "\n", + "# 400 samples\n", + "# Splitting data \n", + "x_train_400, x_test_400, y_train_400, y_test_400 = train_test_split(energy_x, energy_y, train_size = 400, test_size=0.15, random_state=100)\n", + "print ('Number of samples in train data:',len(x_train_400))\n", + "print ('Number of samples in test data:',len(x_test_400))\n", + "\n", + "# Fitting the model\n", + "LinearRegressionModel_400= linear_model.LinearRegression()\n", + "LinearRegressionModel_400.fit(x_train_400, y_train_400)\n", + "\n", + "# RMSE for training data\n", + "y_pred_train_400 = LinearRegressionModel_400.predict(x_train_400)\n", + "train_mse_400 = np.sqrt(np.mean((y_train_400-y_pred_train_400)**2))\n", + "print(\"Training RMSE for 400 observations in training set:\",train_mse_400)\n", + "train_mse.append(train_mse_400)\n", + "\n", + "# RMSE for test data\n", + "y_pred_test_400 = LinearRegressionModel_400.predict(x_test_400)\n", + "test_mse_400 = np.sqrt(np.mean((y_test_400-y_pred_test_400)**2))\n", + "print(\"Test RMSE for 400 observations in training set:\", test_mse_400)\n", + "test_mse.append(test_mse_400)\n", + "\n", + "\n", + "# 500 samples\n", + "# Splitting data \n", + "x_train_500, x_test_500, y_train_500, y_test_500 = train_test_split(energy_x, energy_y, train_size = 500, test_size=0.15, random_state=100)\n", + "print ('Number of samples in train data:',len(x_train_500))\n", + "print ('Number of samples in test data:',len(x_test_500))\n", + "\n", + "# Fitting the model\n", + "LinearRegressionModel_500= linear_model.LinearRegression()\n", + "LinearRegressionModel_500.fit(x_train_500, y_train_500)\n", + "\n", + "# RMSE for training data\n", + "y_pred_train_500 = LinearRegressionModel_500.predict(x_train_500)\n", + "train_mse_500 = np.sqrt(np.mean((y_train_500-y_pred_train_500)**2))\n", + "print(\"Training RMSE for 500 observations in training set:\",train_mse_500)\n", + "train_mse.append(train_mse_500)\n", + "\n", + "# RMSE for test data\n", + "y_pred_test_500 = LinearRegressionModel_500.predict(x_test_500)\n", + "test_mse_500 = np.sqrt(np.mean((y_test_500-y_pred_test_500)**2))\n", + "print(\"Test RMSE for 500 observations in training set:\", test_mse_500)\n", + "test_mse.append(test_mse_500)\n", + "\n", + "# All samples\n", + "# Splitting data \n", + "x_train_all, x_test_all, y_train_all, y_test_all = train_test_split(energy_x, energy_y, test_size=0.15, random_state=100)\n", + "print ('Number of samples in train data:',len(x_train_all))\n", + "print ('Number of samples in test data:',len(x_test_all))\n", + "\n", + "# Fitting the model\n", + "LinearRegressionModel_all= linear_model.LinearRegression()\n", + "LinearRegressionModel_all.fit(x_train_all, y_train_all)\n", + "\n", + "# RMSE for training data\n", + "y_pred_train_all = LinearRegressionModel_all.predict(x_train_all)\n", + "train_mse_all = np.sqrt(np.mean((y_train_all-y_pred_train_all)**2))\n", + "print(\"Training RMSE for all observations in training set:\",train_mse_all)\n", + "train_mse.append(train_mse_all)\n", + "\n", + "# RMSE for test data\n", + "y_pred_test_all = LinearRegressionModel_all.predict(x_test_all)\n", + "test_mse_all = np.sqrt(np.mean((y_test_all-y_pred_test_all)**2))\n", + "print(\"Test RMSE for all observations in training set:\", test_mse_all)\n", + "test_mse.append(test_mse_all)\n", + "\n", + "plt.plot(a,train_mse, label = 'train RMSE')\n", + "plt.plot(a,test_mse, label = \"test RMSE\");\n", + "#plt.legend(loc=3)\n", + "plt.xlabel(\"Number of samples in the test set\")\n", + "plt.ylabel(\"Training/Test RMSE\")\n", + "plt.show()\n", + "\n", + "print('''\\n\\nObservations from the plot:\n", + "1. Training RMSE wavers with increasing training observations.\n", + "2. Test RMSE in general decreases with increasing observations in the training set.\n", + "3. The training error being higher than test error means that the linear regression model accurately captures the trend in \n", + " the data. This can be seen in that the predictions made by this model on the test set are quite accurate and have low \n", + " errors/deviations from their actual values.\n", + "4. The test and train RMSE values are very close to each other indicating a good model.''')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"import numpy as np\\n#np.random.seed(100)\\n\\nxtrain1=xtrain[:100] # error becomes very large when I choose random samples - xtrain.sample(100). why??\\nxtrain2=xtrain[:200]\\nxtrain3=xtrain[:300]\\nxtrain4=xtrain[:400]\\nxtrain5=xtrain[:500]\\nytrain1=ytrain[:100]\\nytrain2=ytrain[:200]\\nytrain3=ytrain[:300]\\nytrain4=ytrain[:400]\\nytrain5=ytrain[:500]\\nprint(xtrain1.head())\\nprint(xtrain2.head())\\n\\nreg1=linear_model.LinearRegression()\\nreg1.fit(xtrain1, ytrain1)\\n\\nypred1=reg1.predict(xtest)\\nypred11=reg1.predict(xtrain1)\\n\\nprint('1. 100 RMSE train data: ',sqrt(mean_squared_error(ytrain1, ypred11)))\\nprint('2. 100 RMSE test data: ',sqrt(mean_squared_error(ytest, ypred1)))\\n\\nreg2=linear_model.LinearRegression()\\nreg.fit(xtrain2, ytrain2)\\n\\nypred2=reg.predict(xtest)\\nypred12=reg.predict(xtrain2)\\n\\nprint('\\n1. 200 RMSE train data: ',sqrt(mean_squared_error(ytrain2, ypred12)))\\nprint('2. 200 RMSE test data: ',sqrt(mean_squared_error(ytest, ypred2)))\\n\\nreg3=linear_model.LinearRegression()\\nreg.fit(xtrain3, ytrain3)\\n\\nypred3=reg.predict(xtest)\\nypred13=reg.predict(xtrain3)\\n\\nprint('\\n1. 300 RMSE train data: ',sqrt(mean_squared_error(ytrain3, ypred13))\\nprint('2. 300 RMSE test data: ',sqrt(mean_squared_error(ytest, ypred3)))\\n\\nreg4=linear_model.LinearRegression()\\nreg.fit(xtrain4, ytrain4)\\n\\nypred4=reg.predict(xtest)\\nypred14=reg.predict(xtrain4)\\n\\nprint('\\n1. 400 RMSE train data: ',sqrt(mean_squared_error(ytrain4, ypred14)))\\nprint('2. 400 RMSE test data: ',sqrt(mean_squared_error(ytest, ypred4)))\\n\\nreg5=linear_model.LinearRegression()\\nreg.fit(xtrain5, ytrain5)\\n\\nypred5=reg.predict(xtest)\\nypred15=reg.predict(xtrain5)\\n\\nprint('\\n1. 500 RMSE train data: ',sqrt(mean_squared_error(ytrain5, ypred15)))\\nprint('2. 500 RMSE test data: ',sqrt(mean_squared_error(ytest, ypred5)))\\n\\nprint('\\nerror for all data is same as in previous part')\"" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "## IGNORE\n", + "\n", + "'''import numpy as np\n", + "#np.random.seed(100)\n", + "\n", + "xtrain1=xtrain[:100] # error becomes very large when I choose random samples - xtrain.sample(100). why??\n", + "xtrain2=xtrain[:200]\n", + "xtrain3=xtrain[:300]\n", + "xtrain4=xtrain[:400]\n", + "xtrain5=xtrain[:500]\n", + "ytrain1=ytrain[:100]\n", + "ytrain2=ytrain[:200]\n", + "ytrain3=ytrain[:300]\n", + "ytrain4=ytrain[:400]\n", + "ytrain5=ytrain[:500]\n", + "print(xtrain1.head())\n", + "print(xtrain2.head())\n", + "\n", + "reg1=linear_model.LinearRegression()\n", + "reg1.fit(xtrain1, ytrain1)\n", + "\n", + "ypred1=reg1.predict(xtest)\n", + "ypred11=reg1.predict(xtrain1)\n", + "\n", + "print('1. 100 RMSE train data: ',sqrt(mean_squared_error(ytrain1, ypred11)))\n", + "print('2. 100 RMSE test data: ',sqrt(mean_squared_error(ytest, ypred1)))\n", + "\n", + "reg2=linear_model.LinearRegression()\n", + "reg.fit(xtrain2, ytrain2)\n", + "\n", + "ypred2=reg.predict(xtest)\n", + "ypred12=reg.predict(xtrain2)\n", + "\n", + "print('\\n1. 200 RMSE train data: ',sqrt(mean_squared_error(ytrain2, ypred12)))\n", + "print('2. 200 RMSE test data: ',sqrt(mean_squared_error(ytest, ypred2)))\n", + "\n", + "reg3=linear_model.LinearRegression()\n", + "reg.fit(xtrain3, ytrain3)\n", + "\n", + "ypred3=reg.predict(xtest)\n", + "ypred13=reg.predict(xtrain3)\n", + "\n", + "print('\\n1. 300 RMSE train data: ',sqrt(mean_squared_error(ytrain3, ypred13))\n", + "print('2. 300 RMSE test data: ',sqrt(mean_squared_error(ytest, ypred3)))\n", + "\n", + "reg4=linear_model.LinearRegression()\n", + "reg.fit(xtrain4, ytrain4)\n", + "\n", + "ypred4=reg.predict(xtest)\n", + "ypred14=reg.predict(xtrain4)\n", + "\n", + "print('\\n1. 400 RMSE train data: ',sqrt(mean_squared_error(ytrain4, ypred14)))\n", + "print('2. 400 RMSE test data: ',sqrt(mean_squared_error(ytest, ypred4)))\n", + "\n", + "reg5=linear_model.LinearRegression()\n", + "reg.fit(xtrain5, ytrain5)\n", + "\n", + "ypred5=reg.predict(xtest)\n", + "ypred15=reg.predict(xtrain5)\n", + "\n", + "print('\\n1. 500 RMSE train data: ',sqrt(mean_squared_error(ytrain5, ypred15)))\n", + "print('2. 500 RMSE test data: ',sqrt(mean_squared_error(ytest, ypred5)))\n", + "\n", + "print('\\nerror for all data is same as in previous part')'''" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "__CLASSIFICATION__:\n", + "LABELS ARE DISCRETE VALUES.\n", + "Here the model is trained to classify each instance into a set of predefined discrete classes.\n", + "On inputting a feature vector into the model, the trained model is able to predict a class of that instance. You can also output the probabilities of an instance belnging to a class. \n", + "\n", + "__ Q 3.1: Bucket values of 'y1' i.e 'Heating Load' from the original dataset into 3 classes:__ \n", + "\n", + "0: 'Low' ( < 15), \n", + "1: 'Medium' (15-30), \n", + "2: 'High' (>30)\n", + "\n", + "This converts the given dataset into a classification problem, classes being, Heating load is: *low, medium or high*. Use this datset with transformed 'heating load' for creating a logistic regression classifiction model that predicts heating load type of a building. Use test-train split ratio of 0.15. \n", + "\n", + "*Report training and test accuracies and confusion matrices.*\n", + "\n", + "\n", + "**HINT:** Use pandas.cut" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "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", + "
X1X2X3X4X5X6X7X8Heating Load
00.98514.5294.0110.257.020.00Medium
10.98514.5294.0110.257.030.00Medium
20.98514.5294.0110.257.040.00Medium
30.98514.5294.0110.257.050.00Medium
40.90563.5318.5122.507.020.00Medium
\n", + "
" + ], + "text/plain": [ + " X1 X2 X3 X4 X5 X6 X7 X8 Heating Load\n", + "0 0.98 514.5 294.0 110.25 7.0 2 0.0 0 Medium\n", + "1 0.98 514.5 294.0 110.25 7.0 3 0.0 0 Medium\n", + "2 0.98 514.5 294.0 110.25 7.0 4 0.0 0 Medium\n", + "3 0.98 514.5 294.0 110.25 7.0 5 0.0 0 Medium\n", + "4 0.90 563.5 318.5 122.50 7.0 2 0.0 0 Medium" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "energydata['Heating Load']=pd.cut(energydata['Y1'],bins=[0,15,30,45],labels=['Low','Medium','High'])\n", + "energydata=energydata.drop('Y1',axis=1)\n", + "energydata.head() #energydata['Heating Load'].unique to chech values of bands\n" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Logistic Regression accuracy for train data: 0.773006134969 and for test data: 0.76724137931\n", + "Confusion matrix of train data is: \n", + " Predicted 0 Predicted 1 Predicted 2\n", + "Actual 0 244 1 0\n", + "Actual 1 71 120 41\n", + "Actual 2 0 35 140\n", + "Confusion matrix of test data is: \n", + " Predicted 0 Predicted 1 Predicted 2\n", + "Actual 0 40 0 0\n", + "Actual 1 12 29 9\n", + "Actual 2 0 6 20\n" + ] + } + ], + "source": [ + "from sklearn.linear_model import LogisticRegression\n", + "\n", + "energy1x=energydata.iloc[:,:-1]\n", + "energy1y=energydata['Heating Load'].map({'Low': 0, 'Medium': 1,'High' :2})\n", + "xtrain, xtest, ytrain, ytest = train_test_split(energy1x, energy1y, test_size=0.15, random_state = 100)\n", + "\n", + "logreg=LogisticRegression()\n", + "logreg.fit(xtrain,ytrain)\n", + "Ypred=logreg.predict(xtest)\n", + "acc_train=logreg.score(xtrain,ytrain)\n", + "acc_test=logreg.score(xtest,ytest)\n", + "print('Logistic Regression accuracy for train data: ',acc_train,'and for test data: ',acc_test)\n", + "\n", + "#acc_log = sum(Ypred == ytest)/len(ytest)*100\n", + "#print('Scikit Model score: ',acc_log)\n", + "\n", + "# CONFUSION MATRIX\n", + "\n", + "from sklearn.metrics import confusion_matrix\n", + "y_true_train=ytrain\n", + "y_pred_train=logreg.predict(xtrain)\n", + "ConfusionMatrix=pd.DataFrame(confusion_matrix(y_true_train, y_pred_train), \\\n", + " columns=['Predicted 0','Predicted 1','Predicted 2'],index=['Actual 0','Actual 1','Actual 2'])\n", + "print ('Confusion matrix of train data is: \\n',ConfusionMatrix)\n", + "\n", + "y_true_test=ytest\n", + "y_pred_test=logreg.predict(xtest)\n", + "ConfusionMatrix1=pd.DataFrame(confusion_matrix(y_true_test, y_pred_test), \\\n", + " columns=['Predicted 0','Predicted 1','Predicted 2'],index=['Actual 0','Actual 1','Actual 2'])\n", + "print ('Confusion matrix of test data is: \\n',ConfusionMatrix1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "__ Q2.2: One of the preprocessing steps in Data science is Feature Scaling i.e getting all our data on the same scale by setting same Min-Max of feature values. This makes training less sensitive to the scale of features . Scaling is important in algorithms that use distance based classification, SVM or K means or involve gradient descent optimization.If we Scale features in the range [0,1] it is called unity based normalization.__\n", + "\n", + "__Perform unity based normalization on the above dataset and train the model again, compare model performance in training and validation with your previous model.__ \n", + "\n", + "refer:http://scikit-learn.org/stable/modules/preprocessing.html#preprocessing-scaler \n", + "more at: https://en.wikipedia.org/wiki/Feature_scaling" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MinMaxScaler(copy=True, feature_range=(0, 1))\n", + "\n", + " Sample row from actual train values:\n", + " X1 X2 X3 X4 X5 X6 X7 X8\n", + "458 0.74 686.0 245.0 220.5 3.5 4 0.25 4\n", + "\n", + " Scaled values of the same row:\n", + " [[ 0.33333333 0.58333333 0. 1. 0. 0.66666667\n", + " 0.625 0.8 ]]\n", + "\n", + " Sample row from actual test values:\n", + " X1 X2 X3 X4 X5 X6 X7 X8\n", + "173 0.71 710.5 269.5 220.5 3.5 3 0.1 3\n", + "\n", + " Scaled values of the test values\n", + " [[ 0.25 0.66666667 0.14285714 1. 0. 0.33333333\n", + " 0.25 0.6 ]]\n", + "Training accuracy for scaled features: 0.799079754601\n", + "Accuracy of the model on test data: 0.784482758621\n", + "\n", + "model improves after scaling\n" + ] + } + ], + "source": [ + "from sklearn import preprocessing\n", + "from sklearn.preprocessing import MinMaxScaler\n", + "\n", + "min_max_scaler = preprocessing.MinMaxScaler() \n", + "print(min_max_scaler)\n", + "\n", + "energy_x = energydata.iloc[:,:-1]\n", + "energy_y = energydata['Heating Load'].map({'Low': 0, 'Medium': 1,'High' :2})\n", + "xtrain, xtest, ytrain, ytest = train_test_split(energy_x, energy_y, test_size=0.15, random_state = 100)\n", + "\n", + "x_train_scaled = min_max_scaler.fit_transform(xtrain)\n", + "x_test_scaled = min_max_scaler.fit_transform(xtest)\n", + "\n", + "print(\"\\n Sample row from actual train values:\\n\", xtrain[0:1][:])\n", + "print(\"\\n Scaled values of the same row:\\n\", x_train_scaled[0:1][:])\n", + "print(\"\\n Sample row from actual test values:\\n\", xtest[0:1][:])\n", + "print(\"\\n Scaled values of the test values\\n\", x_test_scaled[0:1][:])\n", + "\n", + "Logreg_scaled = linear_model.LogisticRegression()\n", + "Logreg_scaled.fit(x_train_scaled, ytrain)\n", + "\n", + "training_accuracy_scaled=Logreg_scaled.score(x_train_scaled,ytrain)\n", + "print ('Training accuracy for scaled features:',training_accuracy_scaled)\n", + "\n", + "test_accuracy_scaled=Logreg_scaled.score(x_test_scaled,ytest)\n", + "print('Accuracy of the model on test data: ',test_accuracy_scaled)\n", + "print('\\nmodel improves after scaling')\n", + "#minmax=MinMaxScaler().fit(xtrain)\n", + "#scaled_xtrain=minmax.transform(xtrain)\n", + "#scaled_ytrain=minmax.fit_transform(ytrain.values.reshape(-1,1))\n", + "#scaled_xtest=minmax.transform(xtest)\n", + "#scaled_ytest=minmax.fit_transform(ytest.values.reshape(-1,1))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## Part 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "__ 1. Read __`diabetesdata.csv`__ file into a pandas dataframe. Analyze the data features, check for NaN values. \n", + "About the data: __\n", + "\n", + "1. __TimesPregnant__: Number of times pregnant \n", + "2. __glucoseLevel__: Plasma glucose concentration a 2 hours in an oral glucose tolerance test \n", + "3. __BP__: Diastolic blood pressure (mm Hg) \n", + "5. __insulin__: 2-Hour serum insulin (mu U/ml) \n", + "6. __BMI__: Body mass index (weight in kg/(height in m)^2) \n", + "7. __pedigree__: Diabetes pedigree function \n", + "8. __Age__: Age (years) \n", + "9. __IsDiabetic__: 0 if not diabetic or 1 if diabetic) \n", + "\n", + "__ 2. Preprocess data to replace NaN values in a feature(if any) using mean of the feature. \n", + "Train logistic regression, SVM, perceptron, kNN, xgboost and random forest models using this preprocessed data with 20% test split.Report training and test accuracies.__\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TimesPregnant glucoseLevel BP insulin BMI Pedigree Age \\\n", + "0 6 148.000000 72 0 33.6 0.627 50.000000 \n", + "1 1 121.016349 66 0 26.6 0.351 31.000000 \n", + "2 8 183.000000 64 0 23.3 0.672 33.353741 \n", + "3 1 121.016349 66 94 28.1 0.167 21.000000 \n", + "4 0 137.000000 40 168 43.1 2.288 33.000000 \n", + "\n", + " IsDiabetic \n", + "0 1 \n", + "1 0 \n", + "2 1 \n", + "3 0 \n", + "4 1 \n" + ] + }, + { + "data": { + "image/png": "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\nAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data=pd.read_csv('diabetesdata.csv')\n", + "diabetes=pd.DataFrame(data)\n", + "diabetes1=diabetes.fillna(diabetes.mean())\n", + "print(diabetes1.head())\n", + "diabetes1.hist(figsize=(8,10))\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from sklearn import datasets, linear_model\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "diabetes_x=diabetes1.iloc[:,:-1]\n", + "diabetes_y=diabetes['IsDiabetic']\n", + "#diabetes_y=diabetes_y.to_frame('IsDiabetic')\n", + "xtrain,xtest,ytrain,ytest=train_test_split(diabetes_x,diabetes_y,test_size=0.2,random_state=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "no. of correct predictions: 113 / 154\n", + "Logistic Regression Accuracy for test data: 73.0 % and fo rtrain data: 78.0\n" + ] + } + ], + "source": [ + "# LOGISTIC REGRESSION\n", + "\n", + "from sklearn.linear_model import LogisticRegression\n", + "logreg=LogisticRegression()\n", + "logreg.fit(xtrain,ytrain)\n", + "ypred=logreg.predict(xtest)\n", + "print('no. of correct predictions: ',sum(ypred==ytest),'/',len(xtest))\n", + "trainacc=logreg.score(xtrain,ytrain)\n", + "accuracy=logreg.score(xtest,ytest)\n", + "print('Logistic Regression Accuracy for test data: ',str(round(accuracy,2)*100),'% and fo rtrain data: ',str(round(trainacc,2)*100))" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "no. of correct predictions: 101 / 154\n", + "Logistic Regression Accuracy for test data: 66.0 % and fo rtrain data: 100.0\n" + ] + } + ], + "source": [ + "# SVM\n", + "\n", + "from sklearn.svm import SVC, LinearSVC\n", + "svc=SVC()\n", + "svc.fit(xtrain,ytrain)\n", + "ypred=svc.predict(xtest)\n", + "print('no. of correct predictions: ',sum(ypred==ytest),'/',len(xtest))\n", + "trainacc=svc.score(xtrain,ytrain)\n", + "accuracy=svc.score(xtest,ytest)\n", + "print('Logistic Regression Accuracy for test data: ',str(round(accuracy,2)*100),'% and fo rtrain data: ',str(round(trainacc,2)*100))" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "no. of correct predictions: 99 / 154\n", + "Logistic Regression Accuracy for test data: 64.0 % and fo rtrain data: 64.0\n" + ] + } + ], + "source": [ + "# PERCEPTRON\n", + "\n", + "from sklearn.linear_model import Perceptron\n", + "per=Perceptron()\n", + "per.fit(xtrain,ytrain)\n", + "ypred=per.predict(xtest)\n", + "print('no. of correct predictions: ',sum(ypred==ytest),'/',len(xtest))\n", + "trainacc=per.score(xtrain,ytrain)\n", + "accuracy=per.score(xtest,ytest)\n", + "print('Logistic Regression Accuracy for test data: ',str(round(accuracy,2)*100),'% and fo rtrain data: ',str(round(trainacc,2)*100))" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "no. of correct predictions: 110 / 154\n", + "Logistic Regression Accuracy for test data: 71.0 % and fo rtrain data: 85.0\n" + ] + } + ], + "source": [ + "# KNN\n", + "\n", + "from sklearn.neighbors import KNeighborsClassifier\n", + "knn=KNeighborsClassifier(n_neighbors=2)\n", + "knn.fit(xtrain,ytrain)\n", + "ypred=knn.predict(xtest)\n", + "print('no. of correct predictions: ',sum(ypred==ytest),'/',len(xtest))\n", + "trainacc=knn.score(xtrain,ytrain)\n", + "accuracy=knn.score(xtest,ytest)\n", + "print('Logistic Regression Accuracy for test data: ',str(round(accuracy,2)*100),'% and fo rtrain data: ',str(round(trainacc,2)*100))" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "no. of correct predictions: 111 / 154\n", + "Logistic Regression Accuracy for test data: 72.0 % and fo rtrain data: 100.0\n" + ] + } + ], + "source": [ + "# XGBOOST\n", + "\n", + "import xgboost as xgb\n", + "gradboost=xgb.XGBClassifier(n_estimators=1000)\n", + "gradboost.fit(xtrain,ytrain)\n", + "ypred=gradboost.predict(xtest)\n", + "print('no. of correct predictions: ',sum(ypred==ytest),'/',len(xtest))\n", + "trainacc=gradboost.score(xtrain,ytrain)\n", + "accuracy=gradboost.score(xtest,ytest)\n", + "print('Logistic Regression Accuracy for test data: ',str(round(accuracy,2)*100),'% and fo rtrain data: ',str(round(trainacc,2)*100))" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "no. of correct predictions: 108 / 154\n", + "Logistic Regression Accuracy for test data: 70.0 % and fo rtrain data: 100.0\n" + ] + } + ], + "source": [ + "# RANDOM FOREST\n", + "\n", + "from sklearn.ensemble import RandomForestClassifier\n", + "rf=RandomForestClassifier(n_estimators=1000)\n", + "rf.fit(xtrain,ytrain)\n", + "ypred=rf.predict(xtest)\n", + "print('no. of correct predictions: ',sum(ypred==ytest),'/',len(xtest))\n", + "trainacc=rf.score(xtrain,ytrain)\n", + "accuracy=rf.score(xtest,ytest)\n", + "print('Logistic Regression Accuracy for test data: ',str(round(accuracy,2)*100),'% and fo rtrain data: ',str(round(trainacc,2)*100))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "__3. What is the ratio of diabetic persons in 3 equirange bands of 'BMI' and 'Pedigree' in the provided dataset.__\n", + "\n", + " __Convert these features - 'BP','insulin','BMI' and 'Pedigree' into categorical values by mapping different bands of values of these features to integers 0,1,2.__ \n", + " \n", + "HINT: USE pd.cut with bin=3 to create 3 bins\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "IsDiabetic 0 1\n", + "BMI_cat \n", + "0 49 2\n", + "1 437 244\n", + "2 14 22\n", + "IsDiabetic 0 1\n", + "Pedigree_cat \n", + "0 461 224\n", + "1 34 40\n", + "2 5 4\n", + "IsDiabetic 0 1 Ratio of diabetics by BMI\n", + "BMI_cat \n", + "0 49 2 0.007463\n", + "1 437 244 0.910448\n", + "2 14 22 0.082090\n", + "IsDiabetic 0 1 Ratio of diabetics by Pedigree\n", + "Pedigree_cat \n", + "0 461 224 0.835821\n", + "1 34 40 0.149254\n", + "2 5 4 0.014925\n" + ] + }, + { + "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", + "
Ratio of diabetics by BMIRatio of diabetics by Pedigree
00.0074630.835821
10.9104480.149254
20.0820900.014925
\n", + "
" + ], + "text/plain": [ + " Ratio of diabetics by BMI Ratio of diabetics by Pedigree\n", + "0 0.007463 0.835821\n", + "1 0.910448 0.149254\n", + "2 0.082090 0.014925" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_BP = pd.cut(diabetes[\"BP\"],bins=3,labels = [\"Low\", \"Medium\", \"High\"]) \n", + "X_BP=X_BP.map({'Low': 0, 'Medium': 1,'High' :2})\n", + "diabetes['BP_cat'] = X_BP\n", + "\n", + "X_insulin = pd.cut(diabetes[\"insulin\"],bins=3,labels = [\"Low\", \"Medium\", \"High\"])\n", + "X_insulin=X_insulin.map({'Low': 0, 'Medium': 1,'High' :2})\n", + "diabetes['insulin_cat'] = X_insulin\n", + "\n", + "X_BMI = pd.cut(diabetes[\"BMI\"],bins=3,labels = [\"Low\", \"Medium\", \"High\"])\n", + "X_BMI=X_BMI.map({'Low': 0, 'Medium': 1,'High' :2})\n", + "diabetes['BMI_cat'] = X_BMI\n", + "\n", + "X_Pedigree = pd.cut(diabetes[\"Pedigree\"],bins=3,labels = [\"Low\", \"Medium\", \"High\"])\n", + "X_Pedigree=X_Pedigree.map({'Low': 0, 'Medium': 1,'High' :2})\n", + "diabetes['Pedigree_cat'] = X_Pedigree\n", + "\n", + "tab1 = pd.crosstab(diabetes[\"BMI_cat\"], diabetes[\"IsDiabetic\"])\n", + "print(tab1)\n", + "tab2 = pd.crosstab(diabetes[\"Pedigree_cat\"],diabetes[\"IsDiabetic\"])\n", + "print(tab2)\n", + "ratio1 = pd.Series([2/268, 244/268, 22/268]) \n", + "tab1[\"Ratio of diabetics by BMI\"]=ratio1\n", + "print(tab1)\n", + "ratio2 = pd.Series([224/268, 40/268, 4/268])\n", + "tab2[\"Ratio of diabetics by Pedigree\"] = ratio2\n", + "print(tab2)\n", + "ratio_df = pd.concat([tab1[\"Ratio of diabetics by BMI\"],tab2[\"Ratio of diabetics by Pedigree\"]], axis = 1)\n", + "\n", + "ratio_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "__4. Now consider the original dataset again, instead of generalizing the NAN values with the mean of the feature we will try assigning values to NANs based on some hypothesis. For example for age we assume that the relation between BMI and BP of people is a reflection of the age group.We can have 9 types of BMI and BP relations and our aim is to find the median age of each of that group:__\n", + "\n", + "Your Age guess matrix will look like this: \n", + "\n", + "| BMI | 0 | 1 | 2 |\n", + "|-----|-------------|------------- |----- |\n", + "| BP | | | |\n", + "| 0 | a00 | a01 | a02 |\n", + "| 1 | a10 | a11 | a12 |\n", + "| 2 | a20 | a21 | a22 |\n", + "\n", + "\n", + "__Create a guess_matrix for NaN values of *'Age'* ( using 'BMI' and 'BP') and *'glucoseLevel'* (using 'BP' and 'Pedigree') for the given dataset and assign values accordingly to the NaNs in 'Age' or *'glucoseLevel'* .__\n", + "\n", + "\n", + "Refer to how we guessed age in the titanic notebook in the class.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TimesPregnant glucoseLevel BP insulin BMI Pedigree Age IsDiabetic\n", + "0 6 148.0 72 0 33.6 0.627 50.0 1\n", + "1 1 NaN 66 0 26.6 0.351 31.0 0\n", + "2 8 183.0 64 0 23.3 0.672 NaN 1\n", + "3 1 NaN 66 94 28.1 0.167 21.0 0\n", + "4 0 137.0 40 168 43.1 2.288 33.0 1\n", + "\n", + " TimesPregnant 0\n", + "glucoseLevel 34\n", + "BP 0\n", + "insulin 0\n", + "BMI 0\n", + "Pedigree 0\n", + "Age 33\n", + "IsDiabetic 0\n", + "dtype: int64\n", + "\n", + " [[0 0 0]\n", + " [0 0 0]\n", + " [0 0 0]]\n", + "Guess_Age table:\n", + " [[24 29 33]\n", + " [25 29 32]\n", + " [55 37 31]]\n", + "\n", + "Assigning age values to NAN age values in the dataset...\n", + "\n", + "\n", + " [[0 0 0]\n", + " [0 0 0]\n", + " [0 0 0]]\n", + "Guess_Glucose table:\n", + " [[115 112 133]\n", + " [127 115 129]\n", + " [137 149 159]]\n", + "\n", + "Assigning glucose values to NAN age values in the dataset...\n", + "\n" + ] + }, + { + "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", + "
TimesPregnantglucoseLevelBPinsulinBMIPedigreeAgeIsDiabeticBP_catBMI_catPedigree_catinsulin_cat
0614872033.60.6275011100
1111266026.60.3513101100
2818364023.30.6722911100
31112669428.10.1672101100
401374016843.12.2883310120
\n", + "
" + ], + "text/plain": [ + " TimesPregnant glucoseLevel BP insulin BMI Pedigree Age IsDiabetic \\\n", + "0 6 148 72 0 33.6 0.627 50 1 \n", + "1 1 112 66 0 26.6 0.351 31 0 \n", + "2 8 183 64 0 23.3 0.672 29 1 \n", + "3 1 112 66 94 28.1 0.167 21 0 \n", + "4 0 137 40 168 43.1 2.288 33 1 \n", + "\n", + " BP_cat BMI_cat Pedigree_cat insulin_cat \n", + "0 1 1 0 0 \n", + "1 1 1 0 0 \n", + "2 1 1 0 0 \n", + "3 1 1 0 0 \n", + "4 0 1 2 0 " + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Reading the data as a new file\n", + "diabetes2 = pd.read_csv(\"diabetesdata.csv\")\n", + "print(diabetes2.head())\n", + "print(\"\\n\",diabetes2.isnull().sum())\n", + "\n", + "# Converting features to categorical variables\n", + "X_BP = pd.cut(diabetes2[\"BP\"],bins=3,labels = [\"Low\", \"Medium\", \"High\"]) \n", + "X_BP=X_BP.map({'Low': 0, 'Medium': 1,'High' :2})\n", + "diabetes2['BP_cat'] = X_BP\n", + "\n", + "X_BMI = pd.cut(diabetes2[\"BMI\"],bins=3,labels = [\"Low\", \"Medium\", \"High\"])\n", + "X_BMI=X_BMI.map({'Low': 0, 'Medium': 1,'High' :2})\n", + "diabetes2['BMI_cat'] = X_BMI\n", + "\n", + "X_Pedigree = pd.cut(diabetes2[\"Pedigree\"],bins=3,labels = [\"Low\", \"Medium\", \"High\"])\n", + "X_Pedigree=X_Pedigree.map({'Low': 0, 'Medium': 1,'High' :2})\n", + "diabetes2['Pedigree_cat'] = X_Pedigree\n", + "\n", + "X_insulin = pd.cut(diabetes2[\"insulin\"],bins=3,labels = [\"Low\", \"Medium\", \"High\"])\n", + "X_insulin=X_insulin.map({'Low': 0, 'Medium': 1,'High' :2})\n", + "diabetes2['insulin_cat'] = X_insulin\n", + "\n", + "# Initiating our age guess table\n", + "guess_ages = np.zeros((3,3),dtype=int)\n", + "print(\"\\n\",guess_ages)\n", + "\n", + "# Forming the age guess table and modifying the diabetes2 dataframe to fill median values\n", + "for i in range(0, 3):\n", + " for j in range(0,3):\n", + " guess_df = diabetes2[(diabetes2['BP_cat'] == i) \\\n", + " &(diabetes2['BMI_cat'] == j)]['Age'].dropna()\n", + "\n", + " # Extract the median age for this group\n", + " # (less sensitive) to outliers\n", + " age_guess = guess_df.median()\n", + " \n", + " # Convert random age float to int\n", + " guess_ages[i,j] = int(age_guess)\n", + " \n", + " \n", + "print('Guess_Age table:\\n',guess_ages)\n", + "print ('\\nAssigning age values to NAN age values in the dataset...')\n", + " \n", + "for i in range(0, 3):\n", + " for j in range(0, 3):\n", + " diabetes2.loc[ (diabetes2.Age.isnull()) & (diabetes2.BP_cat == i) \\\n", + " & (diabetes.BMI_cat == j),'Age'] = guess_ages[i,j]\n", + " \n", + "\n", + "diabetes2['Age'] = diabetes2['Age'].astype(int)\n", + "print()\n", + "\n", + "# Initiating our glucose guess table\n", + "guess_glucose = np.zeros((3,3),dtype=int)\n", + "print(\"\\n\",guess_glucose)\n", + "\n", + "# Forming the glucose guess table and modifying the diabetes2 dataframe to fill median values\n", + "for i in range(0, 3):\n", + " for j in range(0,3):\n", + " guess_df2 = diabetes2[(diabetes2['Pedigree_cat'] == i) \\\n", + " &(diabetes2['BP_cat'] == j)]['glucoseLevel'].dropna()\n", + "\n", + " # Extract the median age for this group\n", + " # (less sensitive) to outliers\n", + " glucose_guess = guess_df2.median()\n", + " \n", + " # Convert random age float to int\n", + " guess_glucose[i,j] = int(glucose_guess)\n", + " \n", + " \n", + "print('Guess_Glucose table:\\n',guess_glucose)\n", + "print ('\\nAssigning glucose values to NAN age values in the dataset...')\n", + " \n", + "for i in range(0, 3):\n", + " for j in range(0, 3):\n", + " diabetes2.loc[ (diabetes2.glucoseLevel.isnull()) & (diabetes2.Pedigree_cat == i) \\\n", + " & (diabetes.BP_cat == j),'glucoseLevel'] = guess_glucose[i,j]\n", + " \n", + "\n", + "diabetes2['glucoseLevel'] = diabetes2['glucoseLevel'].astype(int)\n", + "print()\n", + "diabetes2.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The guess matrix for age as a dataframe is shown below:\n", + "\n", + " BMI_cat \n", + " 0 1 2\n", + "BP_cat 0 24 29 33\n", + " 1 25 29 32\n", + " 2 55 37 31\n", + "The guess matrix for glucose as a dataframe is shown below:\n", + "\n" + ] + }, + { + "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", + "
BP_cat
012
Pedigree_cat0115112133
1127115129
2137149159
\n", + "
" + ], + "text/plain": [ + " BP_cat \n", + " 0 1 2\n", + "Pedigree_cat 0 115 112 133\n", + " 1 127 115 129\n", + " 2 137 149 159" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "age_df = pd.DataFrame(guess_ages)\n", + "\n", + "columns = [(\"BMI_cat\",0),(\"BMI_cat\",1),(\"BMI_cat\",2)]\n", + "age_df.columns = pd.MultiIndex.from_tuples(columns)\n", + "\n", + "index = [(\"BP_cat\",0),(\"BP_cat\",1),(\"BP_cat\",2)]\n", + "age_df.index = pd.MultiIndex.from_tuples(index)\n", + "print(\"The guess matrix for age as a dataframe is shown below:\\n\")\n", + "print(age_df)\n", + "\n", + "\n", + "glucose_df = pd.DataFrame(guess_glucose)\n", + "\n", + "columns2 = [(\"BP_cat\",0),(\"BP_cat\",1),(\"BP_cat\",2)]\n", + "glucose_df.columns = pd.MultiIndex.from_tuples(columns2)\n", + "\n", + "index2 = [(\"Pedigree_cat\",0),(\"Pedigree_cat\",1),(\"Pedigree_cat\",2)]\n", + "glucose_df.index = pd.MultiIndex.from_tuples(index2)\n", + "print(\"The guess matrix for glucose as a dataframe is shown below:\\n\")\n", + "glucose_df\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "__5. Now, convert 'glucoseLevel' and 'Age' features also to categorical variables of 5 categories each.__\n", + "\n", + "__Use this dataset (with all features in categorical form) to train perceptron, logistic regression and random forest models using 20% test split. Report training and test accuracies.__\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "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", + "
TimesPregnantIsDiabeticBP_catBMI_catPedigree_catinsulin_catglucoseLevel_catAge_cat
061110032
110110020
281110040
310110020
401012030
\n", + "
" + ], + "text/plain": [ + " TimesPregnant IsDiabetic BP_cat BMI_cat Pedigree_cat insulin_cat \\\n", + "0 6 1 1 1 0 0 \n", + "1 1 0 1 1 0 0 \n", + "2 8 1 1 1 0 0 \n", + "3 1 0 1 1 0 0 \n", + "4 0 1 0 1 2 0 \n", + "\n", + " glucoseLevel_cat Age_cat \n", + "0 3 2 \n", + "1 2 0 \n", + "2 4 0 \n", + "3 2 0 \n", + "4 3 0 " + ] + }, + "execution_count": 72, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# Converting glucose and age into categorical variables of 5 categories each\n", + "X_glucose = pd.cut(diabetes2[\"glucoseLevel\"],bins=5,labels = [\"Lowest\", \"Lower\", \"Medium\", \"Higher\", \"Highest\"])\n", + "X_glucose=X_glucose.map({'Lowest': 0, 'Lower': 1,'Medium' :2, 'Higher':3, 'Highest':4})\n", + "diabetes2['glucoseLevel_cat'] = X_glucose\n", + "\n", + "X_age = pd.cut(diabetes2[\"Age\"],bins=5,labels = [\"Lowest\", \"Lower\", \"Medium\", \"Higher\", \"Highest\"])\n", + "X_age=X_age.map({'Lowest': 0, 'Lower': 1,'Medium' :2, 'Higher':3, 'Highest':4})\n", + "diabetes2['Age_cat'] = X_age\n", + "\n", + "\n", + "diabetes2.drop(\"glucoseLevel\",axis=1, inplace=True)\n", + "diabetes2.drop(\"BP\",axis=1, inplace=True)\n", + "diabetes2.drop(\"insulin\",axis=1, inplace=True)\n", + "diabetes2.drop(\"BMI\",axis=1, inplace=True)\n", + "diabetes2.drop(\"Pedigree\",axis=1, inplace=True)\n", + "diabetes2.drop(\"Age\",axis=1, inplace=True)\n", + "\n", + "diabetes2.head()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TimesPregnant BP_cat BMI_cat Pedigree_cat insulin_cat \\\n", + "0 6 1 1 0 0 \n", + "1 1 1 1 0 0 \n", + "2 8 1 1 0 0 \n", + "3 1 1 1 0 0 \n", + "4 0 0 1 2 0 \n", + "\n", + " glucoseLevel_cat Age_cat \n", + "0 3 2 \n", + "1 2 0 \n", + "2 4 0 \n", + "3 2 0 \n", + "4 3 0 \n", + "\n", + "\n", + " 0 1\n", + "1 0\n", + "2 1\n", + "3 0\n", + "4 1\n", + "Name: IsDiabetic, dtype: int64\n", + "Number of samples in training data: 614\n", + "Number of samples in validation data: 154\n", + "\n", + " Use this dataset (with all features in categorical form) to train perceptron,\n", + "logistic regression and random forest models using 20% test split. Report training and test accuracies..\n", + "\n", + " Training accuracy for logistic regression: 0.768729641694\n", + "Test accuracy for logistic regression: 0.714285714286\n", + "\n", + " Training accuracy for perceptron: 0.711726384365\n", + "Test accuracy for perceptron: 0.701298701299\n", + "\n", + " Training accuracy for Random Forest: 0.899022801303\n", + "Test accuracy for Random Forest: 0.655844155844\n" + ] + }, + { + "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", + "
TimesPregnantIsDiabeticBP_catBMI_catPedigree_catinsulin_catglucoseLevel_catAge_cat
061110032
110110020
281110040
310110020
401012030
\n", + "
" + ], + "text/plain": [ + " TimesPregnant IsDiabetic BP_cat BMI_cat Pedigree_cat insulin_cat \\\n", + "0 6 1 1 1 0 0 \n", + "1 1 0 1 1 0 0 \n", + "2 8 1 1 1 0 0 \n", + "3 1 0 1 1 0 0 \n", + "4 0 1 0 1 2 0 \n", + "\n", + " glucoseLevel_cat Age_cat \n", + "0 3 2 \n", + "1 2 0 \n", + "2 4 0 \n", + "3 2 0 \n", + "4 3 0 " + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Applying various ML methods\n", + "\n", + "# Getting features and response from the data as 2 separate dataframes\n", + "X=diabetes2.loc[:,[\"TimesPregnant\",\"BP_cat\",\"BMI_cat\", \"Pedigree_cat\",\"insulin_cat\",\"glucoseLevel_cat\",\"Age_cat\"]]\n", + "print(X.head())\n", + "\n", + "Y=diabetes2['IsDiabetic']\n", + "print(\"\\n\\n\",Y.head())\n", + "\n", + "# Splitting the data set\n", + "x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.20, random_state=100)\n", + "print('Number of samples in training data:',len(x_train))\n", + "print('Number of samples in validation data:',len(x_test))\n", + "\n", + "print('''\\n Use this dataset (with all features in categorical form) to train perceptron,\n", + "logistic regression and random forest models using 20% test split. Report training and test accuracies..''')\n", + "\n", + "\n", + "\n", + "# Logistic regression\n", + "logreg = LogisticRegression() \n", + "logreg.fit(x_train, y_train) \n", + "\n", + "# Training accuracy\n", + "training_accuracy_logistic=logreg.score(x_train,y_train)\n", + "print ('\\n Training accuracy for logistic regression:',training_accuracy_logistic)\n", + "\n", + "# Test accuracy\n", + "test_accuracy_logistic=logreg.score(x_test,y_test)\n", + "print('Test accuracy for logistic regression: ', test_accuracy_logistic)\n", + "\n", + "\n", + "# Perceptron\n", + "perceptron = Perceptron()\n", + "perceptron.fit(x_train, y_train)\n", + "\n", + "# Training accuracy\n", + "training_accuracy_perceptron=perceptron.score(x_train,y_train)\n", + "print ('\\n Training accuracy for perceptron:',training_accuracy_perceptron)\n", + "\n", + "# Test accuracy\n", + "test_accuracy_perceptron=perceptron.score(x_test,y_test)\n", + "print('Test accuracy for perceptron: ', test_accuracy_perceptron)\n", + "\n", + "\n", + "\n", + "# Random Forest\n", + "random_forest = RandomForestClassifier(n_estimators=1000)\n", + "random_forest.fit(x_train, y_train)\n", + "\n", + "# Training accuracy\n", + "training_accuracy_rf=random_forest.score(x_train,y_train)\n", + "print ('\\n Training accuracy for Random Forest:',training_accuracy_rf)\n", + "\n", + "# Test accuracy\n", + "test_accuracy_rf=random_forest.score(x_test,y_test)\n", + "print('Test accuracy for Random Forest: ', test_accuracy_rf)\n", + "\n", + "diabetes2.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Part 3\n", + "\n", + "1. __Derive the expression for the optimal parameters in the linear regression equation, i.e. solve the normal equation for Ordinary Least Squares for the case of Simple Linear Regression, when we only have one input and one output__\n", + "\n", + "Given a set of _n_ points $(X_i,Y_i)$ where $Yi$ is dependent on $Xi$ by a linear relation, find the best-fit line,$$Z_i = {aX_i + b}$$ that minimizes the __sum of squared errors in Y__,i.e: $$minimize \\sum_{i}{(Y_i- Z_i)^2}$$\n", + "__i. __ Show that $$ intercept \\quad b = \\overline{Y}- a.\\overline{X}\\quad and \\quad slope \\quad a= \\frac{\\sum_{i}(X_i- \\overline{X})\u0001(Y_i- \\overline{Y})^2}{ \\sum_{i}(X_i- \\overline{X})}$$\n", + "\n", + "\n", + " where $\\overline{X}$ and $\\overline{Y}$ are the averages of the X values and the Y values, respectively.\n", + " \n", + "__ ii. __Show that slope _a_ can be written as $ a = r.(S_y /S_x)$ where $S_y$ = the standard deviation of the Y values and $S_x$= the standard deviation of the X values and _r_ is the correlation coefficient.\n", + "\n", + "##### Please try to write a nice LateXed version of your answer, and do the derivations of the expressions as nicely as possible\n", + "\n", + "\n", + "_____" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "\n", + "i. For least squares regression, the sum of the squares of the errors is minimized. Using calculus, we can find equations for the parameters a and b that minimize the sum of the squared errors, S.\n", + "\n", + "$\\min S = \\displaystyle\\min \\sum\\limits_{i=1}^n \\left(e_i \\right)^2= \\min \\sum \\left(Y_i - Z_i \\right)^2= \\min \\sum \\left(Y_i - b - aX_i\\right)^2$\n", + "\n", + "We want to find b and a that minimize the sum, S. We start by taking the partial derivative of S with respect to b and setting it to zero: \n", + "\n", + "$\\displaystyle\\frac{\\partial{S}}{\\partial{b}} = -2 \\sum \\left(Y_i - b - aX_i\\right) = 0$\n", + "\n", + "$=>\\displaystyle\\sum \\left(Y_i - b - aX_i\\right) = 0$\n", + "\n", + "$=>\\displaystyle\\sum b = \\sum Y_i -a \\sum X_i$\n", + "\n", + "$=>\\displaystyle nb = \\sum Y_i -a\\sum X_i$\n", + "\n", + "$=>\\displaystyle b = \\frac{1}{n}\\sum Y_i - a \\frac{1}{n}\\sum X_i $ \n", + "\n", + "Let's call the above as equation 1\n", + "\n", + "$=>\\displaystyle b = \\bar Y - a . \\bar X $\n", + "\n", + "where $\\bar Y$ and $\\bar X$ are the averages of the X values and Y values respectively. This completes the derivation of the\n", + "intercept.\n", + "\n", + "Before taking partial derivative of S with respect to a, substitute the previous result for b in the equation for S\n", + "\n", + "$\\displaystyle \\min S = \\min \\sum \\left[Y_i-\\left(\\bar Y-a\\bar X \\right)-aX_i\\right]^{2}=\\min \\sum \\left[\\left(Y_i-\\bar Y\\right)-a\\left(X_i-\\bar X\\right)\\right]^{2}$\n", + "\n", + "Now, taking the partial derivative of S with respect to a and setting it to zero:\n", + "\n", + "$\\displaystyle \\frac{\\partial{S}}{\\partial{b}} = -2\\sum \\left[\\left(Y_i-\\bar Y\\right)-a\\left(X_i-\\bar X\\right)\\right]\\left(X_i-{\\bar X}\\right)=0$\n", + "\n", + "$=>\\displaystyle \\sum \\left(Y_i-\\bar Y\\right)\\left(X_i-\\bar X\\right)-a\\sum \\left(X_i-\\bar X\\right)^{2}=0$\n", + "\n", + "$=>\\displaystyle a = \\frac {\\sum \\left(X_i-\\bar X\\right)\\left(Y_i-\\bar Y\\right)}{\\sum \\left(X_i-\\bar X\\right)^{2}}$\n", + "\n", + "This completes the derivation of the slope.\n", + "\n", + "ii. We can divide the numerator and the denominator in the above equation obtained for slope by n to get the following equation:\n", + "\n", + "$=>\\displaystyle a = \\frac {\\sum \\left(X_i-\\bar X\\right)\\left(Y_i-\\bar Y\\right)}{\\sum \\left(X_i-\\bar X\\right)^{2}}$\n", + "\n", + "$=>\\displaystyle a = \\frac {\\operatorname {Cov} (X,Y)}{\\operatorname {Var} (X)}$\n", + "\n", + "We know that the covariance can be written as $ r . S_x . S_y$ , where r is the correlation coefficient and $S_x$ and $S_y$ are the standard deviation of X and Y values respectively. We also know that Var(X) = $(S_x)^2$. Substituting this in the above equation for the slope a, we get:\n", + "\n", + "$=>\\displaystyle a = \\frac {\\operatorname {Cov} (X,Y)}{\\operatorname {Var} (X)}$\n", + "\n", + "$=>\\displaystyle a = \\frac {r . S_x . S_y}{(S_x)^2}$\n", + "\n", + "$=>\\displaystyle a = \\frac {r.S_y}{S_x}$\n", + "\n", + "$=>\\displaystyle a = r.(S_y/S_x)$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Two Extra Credit Points: Fun with Webscraping & Text manipulation\n", + "### (Mandatory for Grad students!)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
`NOTE:` **If you are a Graduate Section student (enrolled in 290), the Extra Credit Questions are mandatory.**
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## 1. Statistics in Presidential Debates\n", + "\n", + "Your first task is to scrape Presidential Debates from the Commission of Presidential Debates website: http://www.debates.org/index.php?page=debate-transcripts.\n", + "\n", + "To do this, you are not allowed to manually look up the URLs that you need, instead you have to scrape them. The root url to be scraped is the one listed above, namely: http://www.presidency.ucsb.edu/debates.php\n", + "\n", + "\n", + "1. By using `requests` and `BeautifulSoup` find all the links / URLs on the website that links to transcriptions of **First Presidential Debates** from the years [2012, 2008, 2004, 2000, 1996, 1988, 1984, 1976, 1960]. In total you should find 9 links / URLs tat fulfill this criteria.\n", + "2. When you have a list of the URLs your task is to create a Data Frame with some statistics (see example of output below):\n", + " 1. Scrape the title of each link and use that as the column name in your Data Frame. \n", + " 2. Count how long the transcript of the debate is (as in the number of characters in transcription string). Feel free to include `\\` characters in your count, but remove any breakline characters, i.e. `\\n`. You will get credit if your count is +/- 10% from our result.\n", + " 3. Count how many times the word **war** was used in the different debates. Note that you have to convert the text in a smart way (to not count the word **warranty** for example, but counting **war.**, **war!**, **war,** or **War** etc.\n", + " 4. Also scrape the most common used word in the debate, and write how many times it was used. Note that you have to use the same strategy as in 3 in order to do this.\n", + " \n", + "**Tips:**\n", + "\n", + "___\n", + "\n", + "In order to solve question 3 and 4 above it can be useful to work with Regular Expressions and explore methods on strings like `.strip(), .replace(), .find(), .count(), .lower()` etc. Both are very powerful tools to do string processing in Python. To count common words for example I used a `Counter` object and a Regular expression pattern for only words, see example:\n", + "\n", + "```python\n", + " from collections import Counter\n", + " import re\n", + "\n", + " counts = Counter(re.findall(r\"[\\w']+\", text.lower()))\n", + "```\n", + "\n", + "Read more about Regular Expressions here: https://docs.python.org/3/howto/regex.html\n", + " \n", + " \n", + "**Example output of all of the answers to EC Question 1:**\n", + "\n", + "\n", + "![pres_stats](https://github.com/ikhlaqsidhu/data-x/raw/master/x-archive/misc/hw2_imgs_spring2018/president_stats.png)\n", + "\n", + "\n", + "\n", + "\n", + "----\n", + "\n", + ".\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import requests\n", + "import bs4 as bs\n", + "from collections import Counter\n", + "import re" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "urls are:\n", + " ['http://www.debates.org/index.php?page=october-3-2012-debate-transcript', 'http://www.debates.org/index.php?page=2008-debate-transcript', 'http://www.debates.org/index.php?page=september-30-2004-debate-transcript', 'http://www.debates.org/index.php?page=october-3-2000-transcript', 'http://www.debates.org/index.php?page=october-6-1996-debate-transcript', 'http://www.debates.org/index.php?page=september-25-1988-debate-transcript', 'http://www.debates.org/index.php?page=october-7-1984-debate-transcript', 'http://www.debates.org/index.php?page=september-23-1976-debate-transcript', 'http://www.debates.org/index.php?page=september-26-1960-debate-transcript']\n", + "\n", + "titles: \n", + " ['October 3, 2012: The First Obama-Romney Presidential Debate', 'September 26, 2008: The First McCain-Obama Presidential Debate', 'September 30, 2004: The First Bush-Kerry Presidential Debate', 'October 3, 2000: The First Gore-Bush Presidential Debate', 'October 6, 1996: The First Clinton-Dole Presidential Debate', 'September 25, 1988: The First Bush-Dukakis Presidential Debate', 'October 7, 1984: The First Reagan-Mondale Presidential Debate', 'September 23, 1976: The First Carter-Ford Presidential Debate', 'September 26, 1960: The First Kennedy-Nixon Presidential Debate']\n" + ] + } + ], + "source": [ + "# PART A\n", + "\n", + "source = requests.get('http://www.debates.org/index.php?page=debate-transcripts').content\n", + "soup = bs.BeautifulSoup(source,features='html.parser')\n", + "#print(soup.prettify())\n", + "#print(soup.a)\n", + "soup.a.get('href')\n", + "\n", + "array = ['First', 'Presidential', 'Debate']\n", + "url=[]\n", + "title=[]\n", + "links = soup.find_all('a')\n", + "\n", + "for l in links:\n", + " if all(x in l.text for x in array):\n", + " url.append(l.get('href'))\n", + " title.append(l.text)\n", + "print('urls are:\\n',url)\n", + "print('\\ntitles: \\n',title)" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[, , , , , , , , ]\n" + ] + } + ], + "source": [ + "# PART 2A\n", + "\n", + "source=[]\n", + "for i in range(len(url)):\n", + " source.append(requests.get(url[i]))\n", + "print(source) " + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[95108, 182428, 82726, 91071, 93095, 87736, 87000, 80837, 61013]\n", + "[3, 44, 64, 11, 14, 8, 2, 7, 3]\n", + "['the', 'the', 'the', 'the', 'the', 'the', 'the', 'the', 'the']\n", + "[757, 1470, 857, 919, 876, 804, 867, 857, 779]\n" + ] + }, + { + "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", + "
October 3, 2012: The First Obama-Romney Presidential DebateSeptember 26, 2008: The First McCain-Obama Presidential DebateSeptember 30, 2004: The First Bush-Kerry Presidential DebateOctober 3, 2000: The First Gore-Bush Presidential DebateOctober 6, 1996: The First Clinton-Dole Presidential DebateSeptember 25, 1988: The First Bush-Dukakis Presidential DebateOctober 7, 1984: The First Reagan-Mondale Presidential DebateSeptember 23, 1976: The First Carter-Ford Presidential DebateSeptember 26, 1960: The First Kennedy-Nixon Presidential Debate
Debate char length9510818242882726910719309587736870008083761013
war_count3446411148273
most_common_wthethethethethethethethethe
most_common_w_count7571470857919876804867857779
\n", + "
" + ], + "text/plain": [ + " October 3, 2012: The First Obama-Romney Presidential Debate \\\n", + "Debate char length 95108 \n", + "war_count 3 \n", + "most_common_w the \n", + "most_common_w_count 757 \n", + "\n", + " September 26, 2008: The First McCain-Obama Presidential Debate \\\n", + "Debate char length 182428 \n", + "war_count 44 \n", + "most_common_w the \n", + "most_common_w_count 1470 \n", + "\n", + " September 30, 2004: The First Bush-Kerry Presidential Debate \\\n", + "Debate char length 82726 \n", + "war_count 64 \n", + "most_common_w the \n", + "most_common_w_count 857 \n", + "\n", + " October 3, 2000: The First Gore-Bush Presidential Debate \\\n", + "Debate char length 91071 \n", + "war_count 11 \n", + "most_common_w the \n", + "most_common_w_count 919 \n", + "\n", + " October 6, 1996: The First Clinton-Dole Presidential Debate \\\n", + "Debate char length 93095 \n", + "war_count 14 \n", + "most_common_w the \n", + "most_common_w_count 876 \n", + "\n", + " September 25, 1988: The First Bush-Dukakis Presidential Debate \\\n", + "Debate char length 87736 \n", + "war_count 8 \n", + "most_common_w the \n", + "most_common_w_count 804 \n", + "\n", + " October 7, 1984: The First Reagan-Mondale Presidential Debate \\\n", + "Debate char length 87000 \n", + "war_count 2 \n", + "most_common_w the \n", + "most_common_w_count 867 \n", + "\n", + " September 23, 1976: The First Carter-Ford Presidential Debate \\\n", + "Debate char length 80837 \n", + "war_count 7 \n", + "most_common_w the \n", + "most_common_w_count 857 \n", + "\n", + " September 26, 1960: The First Kennedy-Nixon Presidential Debate \n", + "Debate char length 61013 \n", + "war_count 3 \n", + "most_common_w the \n", + "most_common_w_count 779 " + ] + }, + "execution_count": 97, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# PART 2B\n", + "\n", + "soups = []\n", + "content = []\n", + "character_length = []\n", + "war_count = []\n", + "counts = []\n", + "word = []\n", + "frequency = []\n", + "common_count = []\n", + "common_word = []\n", + "\n", + "for i in range(len(url)):\n", + " soups.append(bs.BeautifulSoup(source[i].content, features='html.parser')) \n", + " #print(\"The transcript of\", title[i], \"debate is as follows\")\n", + " content.append(soups[i].find(id='content-sm').text)\n", + " #print(content[i])\n", + " character_length.append(len(content[i]))\n", + " # Part 2C counting the word war in the text\n", + " war_count.append(sum(1 for _ in re.finditer(r'\\b%s\\b' % re.escape(\"war\"), content[i].lower())))\n", + " # Part 2D counting the most common word and its quantity\n", + " counts = Counter(re.findall(r\"[\\w']+\", content[i].lower()))\n", + " word,frequency = counts.most_common(1)[0]\n", + " common_word.append(word)\n", + " common_count.append(frequency)\n", + " \n", + "\n", + "print(character_length)\n", + "print(war_count)\n", + "print(common_word)\n", + "print(common_count)\n", + "\n", + "# making the final data frame\n", + "indices = [\"Debate char length\",\"war_count\",\"most_common_w\",\"most_common_w_count\"]\n", + "df_final = pd.DataFrame([character_length, war_count, common_word, common_count],columns=title,index=indices)\n", + "df_final\n", + "# number of years for reference\n", + "#[2012, 2008, 2004, 2000, 1996, 1988, 1984, 1976, 1960]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " \n", + "## 2. Download and read in specific line from many data sets\n", + "\n", + "Scrape the first 27 data sets from this URL http://people.sc.fsu.edu/~jburkardt/datasets/regression/ (i.e.`x01.txt` - `x27.txt`). Then, save the 5th line in each data set, this should be the name of the data set author (get rid of the `#` symbol, the white spaces and the comma at the end). \n", + "\n", + "Count how many times (with a Python function) each author is the reference for one of the 27 data sets. Showcase your results, sorted, with the most common author name first and how many times he appeared in data sets. Use a Pandas DataFrame to show your results, see example.\n", + "\n", + "**Example output of the answer EC Question 2:**\n", + "\n", + "![author_stats](https://github.com/ikhlaqsidhu/data-x/raw/master/x-archive/misc/hw2_imgs_spring2018/data_authors.png)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "None\n", + "\n" + ] + } + ], + "source": [ + "source2 = requests.get(\" http://people.sc.fsu.edu/~jburkardt/datasets/regression/ \") \n", + "print(source2)\n", + "\n", + "soup2 = bs.BeautifulSoup(source2.content, features='html.parser') \n", + "print(type(soup2))\n", + "print(soup2.a)\n", + "print()" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "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", + "
# of occurence
names
Helmut Spaeth16
S Chatterjee3
D G Kleinbaum and L L Kupper2
R J Freund and P D Minton2
S C Narula2
K A Brownlee1
S Chatterjee and B Price1
\n", + "
" + ], + "text/plain": [ + " # of occurence\n", + "names \n", + " Helmut Spaeth 16\n", + " S Chatterjee 3\n", + " D G Kleinbaum and L L Kupper 2\n", + " R J Freund and P D Minton 2\n", + " S C Narula 2\n", + " K A Brownlee 1\n", + " S Chatterjee and B Price 1" + ] + }, + "execution_count": 99, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# KR code\n", + "source3 = requests.get(\"http://people.sc.fsu.edu/~jburkardt/datasets/regression/\",) \n", + "soup3 = bs.BeautifulSoup(source3.content, features='html.parser') \n", + "print(source3) \n", + "# If then the website has been downloaded succesfully\n", + "\n", + "links3 = soup3.find('table').find_all('a')\n", + "urls3 = ['http://people.sc.fsu.edu/~jburkardt/datasets/regression/'+l.get('href') for l in links3]\n", + "urls3 = urls3[6:33]\n", + "#urls3\n", + "\n", + "sourc = requests.get(urls3[15],) \n", + "soup3 = bs.BeautifulSoup(sourc.content, features='html.parser') \n", + "content3 = soup3.body\n", + "#content3 = soup3.find('p').text\n", + "chars3 = str(soup3)\n", + "#chars3\n", + "\n", + "cnt = 0\n", + "m=0\n", + "names=[]\n", + "while cnt<5: \n", + " if(chars3[m]=='\\n'):\n", + " cnt+=1\n", + " elif(cnt==4):\n", + " names.append(chars3[m])\n", + " m+=1\n", + "\n", + "#names\n", + "\n", + "names = ''.join(names)\n", + "#names\n", + "\n", + "finallist=[]\n", + "for i in range(len(urls3)):\n", + " lis=[]\n", + " sourc = requests.get(urls3[i],) \n", + " soup3 = bs.BeautifulSoup(sourc.content, features='html.parser') \n", + " content3 = soup3.body\n", + " chars3 = str(soup3)\n", + " cnt = 0\n", + " m=0\n", + " names=[]\n", + " while cnt<5: \n", + " if(chars3[m]=='\\n'):\n", + " cnt+=1\n", + " elif(cnt==4):\n", + " names.append(chars3[m])\n", + " m+=1\n", + " names = ''.join(names)\n", + " finallist.append(names) \n", + " #chars = chars.replace('\\n', '')\n", + " #lis.append(len(chars)) #Adding total word count to the list first\n", + " #warcts = Counter(re.findall(r\"[ ][w][a][r][!?.,]? \", content.lower()))\n", + " #lis.append(len(list(warcts.elements()))) # Adding 'war' word count to the list\n", + " #counts = Counter(re.findall(r\"[\\w']+\", content.lower()))\n", + " #most_common,num_most_common = counts.most_common(1)[0]\n", + " #lis.append(most_common) #Adding most common word\n", + " #lis.append(num_most_common) #Adding most common word count\n", + " #finaldf[title[i]] = lis\n", + "\n", + "# finallist\n", + "\n", + "namesdf = pd.DataFrame(finallist)\n", + "\n", + "namesdf = namesdf.rename(columns = {0:'names'})\n", + "\n", + "# namesdf\n", + "\n", + "namesdf['names']=namesdf.names.str.extract('([A-Za-z ]+)')\n", + "\n", + "ans= pd.DataFrame(namesdf.groupby('names')['names'].count())\n", + "\n", + "#ans.head()\n", + "\n", + "ans = ans.sort_values('names', ascending=0)\n", + "ans = ans.rename(columns = {'names':'# of occurence'})\n", + "\n", + "ans" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/web_scraping.ipynb b/web_scraping.ipynb new file mode 100644 index 0000000..98999ce --- /dev/null +++ b/web_scraping.ipynb @@ -0,0 +1,4522 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import bs4 as bs" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import requests" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "rbt = requests.get('https://www.bloomberg.com/robots.txt')\n", + "soup=bs.BeautifulSoup(rbt.content,'lxml')" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#print(soup.prettify())" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "source = requests.get('https://www.bloomberg.com/feeds/bpol/sitemap_news.xml').content\n", + "a=bs.BeautifulSoup(source,'xml')\n", + "#print(a.prettify())" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "news=a.find_all({'news'})" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "House Passes a Temporary Spending Bill\n" + ] + } + ], + "source": [ + "for news in print(news.title.text)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "source = requests.post('https://www.caravanmagazine.in/')\n", + "source" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " PHP Security Audit Script: php_security.php\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "
\n", + " \n", + " \"PHP\n", + " \n", + "

\n", + " \n", + " PHP\n", + " \n", + " Security Audit\n", + "

\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "

\n", + " Script Name\n", + "

\n", + "
\n", + "
\n", + "

\n", + " Description\n", + "

\n", + "

\n", + " This web-accessible script will list security recommendations after scanning available PHP configuration variables and functions for common exploit vectors.\n", + "

\n", + "
\n", + "
\n", + "

\n", + " Download script\n", + "

\n", + "

\n", + " \n", + " Click here\n", + " \n", + " to download this script.\n", + "

\n", + "
\n", + "
\n", + "

\n", + " View Source\n", + "

\n", + "
\n", + " \n", + " \n", + " \n", + " <?php\n", + "
\n", + "
\n", + "
\n", + " \n", + " /**\n", + "
\n", + " *  PHP Security Check Script\n", + "
\n", + " *  http://php-security-audit.com/\n", + "
\n", + " *\n", + "
\n", + " *  This security check script will evaluate the PHP runtime environment\n", + "
\n", + " *  for your configuration to determine whether any improvements could be\n", + "
\n", + " *  made to your configuration.\n", + "
\n", + " *\n", + "
\n", + " * * * * * * *\n", + "
\n", + " *\n", + "
\n", + " *  Revision History\n", + "
\n", + " *\n", + "
\n", + " *  2009-05-08 - 1.0 - Created\n", + "
\n", + " *\n", + "
\n", + " *  2009-06-10 - 1.1 - Classified security levels, added message constants\n", + "
\n", + " *\n", + "
\n", + " *  2009-11-23 - 1.3 - Removed \"PHP_VERSION constant set\" warning\n", + "
\n", + " *\n", + "
\n", + " *                     Note for splFileObject: (disable_classes config\n", + "
\n", + " *                     directive requires lowercase)\n", + "
\n", + " *\n", + "
\n", + " *  2011-07-17 - 1.4 - Contributed by kaotix: Added various tweaks to make\n", + "
\n", + " *                     script more compatible with Windows:\n", + "
\n", + " *\n", + "
\n", + " *                      - Backslashes\n", + "
\n", + " *                      - OS detection\n", + "
\n", + " *                      - User detection\n", + "
\n", + " *\n", + "
\n", + " * * * * * * *\n", + "
\n", + " *\n", + "
\n", + " *  Please freely distribute this script without modification - if any\n", + "
\n", + " *  improvements can be made, visit php-security-audit.com to submit\n", + "
\n", + " *  your recommendation.\n", + "
\n", + " *\n", + "
\n", + " */\n", + "
\n", + "
\n", + "
\n", + " // Application message declarations\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'APP_TITLE'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'PHP Security Audit'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'APP_DESCRIPTION'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'This audit script checks core PHP configuration, available functions, and available classes to determine potential vulnerabilities and offer configuration suggestions.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'APP_INSTRUCTIONS'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'If errors are reported which you do not have access to correct (as in the case of a shared hosting account), you may want to contact your hosting provider or system administrator to ensure the security of your system.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'APP_LABEL_HOSTNAME'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'Server Hostname:'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'APP_LABEL_OS'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'Operating System:'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'APP_LABEL_USER'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'Username:'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'APP_LABEL_RUN_DATE'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'Date Run:'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'APP_LABEL_COMMON'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'Common Exploits'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'APP_LABEL_SHARED'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'Shared Environment Protection'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'APP_LABEL_PARANOID'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'Locked Down Configuration'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'APP_LABEL_ERROR_FEATURES'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'PHP Configuration'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'APP_DESCRIPTION_ERROR_FEATURES'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'Update your <a href=\"http://us2.php.net/configuration.changes\">PHP configuration</a> to correct the following issues:'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'APP_LABEL_ERROR_FUNCTIONS'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'Insecure Functions'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'APP_DESCRIPTION_ERROR_FUNCTIONS'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'Add the following to the <strong class=\"ms\">disable_functions</strong> directive in your <a href=\"http://us2.php.net/configuration.changes\">PHP configuration</a> to reduce your risk exposure:'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'APP_LABEL_ERROR_CLASSES'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'Insecure Classes'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'APP_DESCRIPTION_ERROR_CLASSES'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'Add the following to the <strong class=\"ms\">disable_classes</strong> directive in your <a href=\"http://us2.php.net/configuration.changes\">PHP configuration</a> to reduce your risk exposure:<br />Note: Configuration requires class names in lower case letters - i.e. \"splfileobject\"'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'APP_LABEL_MESSAGES'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'Messages'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'APP_DESCRIPTION_MESSAGES'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " ''\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + " // Message declarations\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'MSG_BASEDIR'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'Your base directory is presently set to $$BASEDIR$$ - PHP scripts will not be able to access the file system outside of this directory.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + " // Error declarations\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'ERR_CONFIG_BASEDIR'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'Your configuration should be changed to enforce a base directory (i.e. \"/var/www/\") to prevent PHP from accessing other directories on the underlying filesystem.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'ERR_CONFIG_BASEDIR_CHDIR'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'A base directory is presently set to $$BASEDIR$$ - you should remove this directory entry to ensure that PHP scripts will not be able to access other directories by changing the working directory.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'ERR_CONFIG_BASEDIR_SLASH'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'A base directory is presently set to $$BASEDIR$$ - you should add a trailing \"/\" to ensure that PHP scripts will not be able to access the file system outside of this directory.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'ERR_CONFIG_ERRORS'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'Your configuration should be changed to avoid displaying error output when your scripts encounter errors as this information may be useful to a malicious user.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'ERR_CONFIG_EXECUTE'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " '(Critical) Your configuration should be changed to restrict PHP from executing commands on the underlying system.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'ERR_CONFIG_INCLUDES'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " '(Critical) Your configuration presently allows PHP to include files from remote webservers - this functionality should be disabled and any applications which rely upon remote file includes should be replaced immediately as there exists an extremely high potential for abuse of this feature.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'ERR_CONFIG_GLOBALS'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " '(Critical) You must disable register_globals in your PHP configuration to prevent malicious variable manipulation.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'ERR_CONFIG_PHPUSER'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'PHP is running under the underlying system\\'s \"root\" user account - this creates many possibilities for abuse. '\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'ERR_CONFIG_PROFILE'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'Your configuration should be changed to reduce the amount of information a malicious user may gather regarding your PHP configuration.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'ERR_FUNCTION_EXECUTE'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " '(Critical) This function should be disabled to prevent PHP from executing commands on the underlying system.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'ERR_FUNCTION_DISRUPT'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'This function should be disabled to prevent PHP scripts from disrupting other processes.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'ERR_FUNCTION_LOGGING'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'You should disable this function to avoid the possibility of log file tampering on your system.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'ERR_FUNCTION_PROFILE'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'This function should be disabled to reduce the amount of information a malicious user may gather regarding your PHP configuration. While this function must be run to generate output, some applications may include this function as part of their feature set.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + " // Warning declarations\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'WARN_CONFIG_PHPUSER_WIN'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'PHP is running as $$USERNAME$$ - you should ensure that this user is not an administrator on the local system as this creates many possibilites for abuse.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'WARN_CONFIG_UPLOAD'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " '(Warning) You may want to change your configuration to prevent PHP from accepting file uploads unless this feature is absolutely necessary.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'WARN_FUNCTION_FILES'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " '(Warning) You may want to change your configuration to disable PHP access to the underlying filesystem unless this access is absolutely necessary.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + "
\n", + " \n", + " // Awaiting implementation (need reliable mechanism for confirmation)\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'ERR_VERSION'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'Your version of PHP is outdated. Exploitable vulnerabilities may exist in your present PHP installation.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " define\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'WARN_VERSION'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " '(Warning) Your version of PHP could not be determined. While this greatly reduces the likelihood that your PHP information can be successfully profiled in mounting an attack on your system, it is recommended that you check php.net to ensure that your version of PHP is up to date.'\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + "
\n", + " function\n", + "
\n", + " \n", + " build_output\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " $section_title\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " $section_class\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " $section_description\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " $section_array\n", + " \n", + " \n", + " ) {\n", + "
\n", + "
\n", + " global\n", + "
\n", + " \n", + " $output_count_errors\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + "
\n", + " \n", + " $build_output\n", + " \n", + " \n", + " =\n", + " \n", + " \n", + " \"\"\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " if (\n", + "
\n", + " (\n", + "
\n", + " \n", + " is_array\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " $section_array\n", + " \n", + " \n", + " ) ) &&\n", + "
\n", + " (\n", + "
\n", + " \n", + " count\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " $section_array\n", + " \n", + " \n", + " ) )\n", + "
\n", + " ) {\n", + "
\n", + "
\n", + " \n", + " $build_output\n", + " \n", + " \n", + " .=\n", + " \n", + " \n", + " \"\\r\\n\\t\"\n", + " \n", + " \n", + " .\n", + " \n", + " \n", + " '<div class=\"'\n", + " \n", + " \n", + " .\n", + " \n", + " \n", + " $section_class\n", + " \n", + " \n", + " .\n", + " \n", + " \n", + " '\">'\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $build_output\n", + " \n", + " \n", + " .=\n", + " \n", + " \n", + " \"\\r\\n\\t\\t\"\n", + " \n", + " \n", + " .\n", + " \n", + " \n", + " ' <h2>'\n", + " \n", + " \n", + " .\n", + " \n", + " \n", + " $section_title\n", + " \n", + " \n", + " .\n", + " \n", + " \n", + " '</h2>'\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $build_output\n", + " \n", + " \n", + " .=\n", + " \n", + " \n", + " \"\\r\\n\\t\\t\"\n", + " \n", + " \n", + " .\n", + " \n", + " \n", + " ' <p>'\n", + " \n", + " \n", + " .\n", + " \n", + " \n", + " $section_description\n", + " \n", + " \n", + " .\n", + " \n", + " \n", + " '</p>'\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $build_output\n", + " \n", + " \n", + " .=\n", + " \n", + " \n", + " \"\\r\\n\\t\\t\"\n", + " \n", + " \n", + " .\n", + " \n", + " \n", + " ' <ul>'\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " foreach (\n", + "
\n", + " \n", + " $section_array\n", + " \n", + " \n", + " as\n", + " \n", + " \n", + " $error_key\n", + " \n", + " \n", + " =>\n", + " \n", + " \n", + " $error_message\n", + " \n", + " \n", + " )\n", + "
\n", + " {\n", + "
\n", + "
\n", + " \n", + " $build_output\n", + " \n", + " \n", + " .=\n", + " \n", + " \n", + " \"\\r\\n\\t\\t\\t\"\n", + " \n", + " \n", + " .\n", + " \n", + " \n", + " '<li><strong class=\"ms\">'\n", + " \n", + " \n", + " .\n", + " \n", + " \n", + " $error_key\n", + " \n", + " \n", + " .\n", + " \n", + " \n", + " '</strong> - '\n", + " \n", + " \n", + " .\n", + " \n", + " \n", + " $error_message\n", + " \n", + " \n", + " .\n", + " \n", + " \n", + " '</li>'\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $output_count_errors\n", + " \n", + " \n", + " ++;\n", + "
\n", + " }\n", + "
\n", + "
\n", + "
\n", + " \n", + " $build_output\n", + " \n", + " \n", + " .=\n", + " \n", + " \n", + " \"\\r\\n\\t\\t\"\n", + " \n", + " \n", + " .\n", + " \n", + " \n", + " ' </ul>'\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $build_output\n", + " \n", + " \n", + " .=\n", + " \n", + " \n", + " \"\\r\\n\\t\"\n", + " \n", + " \n", + " .\n", + " \n", + " \n", + " '</div>'\n", + " \n", + " \n", + " ;\n", + "
\n", + " }\n", + "
\n", + "
\n", + " return\n", + "
\n", + " \n", + " $build_output\n", + " \n", + " \n", + " ;\n", + "
\n", + " }\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + " $insecure_features\n", + " \n", + " \n", + " = array();\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " = array();\n", + "
\n", + "
\n", + " \n", + " $insecure_classes\n", + " \n", + " \n", + " = array();\n", + "
\n", + "
\n", + "
\n", + " \n", + " $messages\n", + " \n", + " \n", + " = array();\n", + "
\n", + "
\n", + " \n", + " $error_features\n", + " \n", + " \n", + " = array();\n", + "
\n", + "
\n", + " \n", + " $error_functions\n", + " \n", + " \n", + " = array();\n", + "
\n", + "
\n", + " \n", + " $error_classes\n", + " \n", + " \n", + " = array();\n", + "
\n", + "
\n", + "
\n", + " \n", + " $output\n", + " \n", + " \n", + " =\n", + " \n", + " \n", + " ''\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $output_count_errors\n", + " \n", + " \n", + " =\n", + " \n", + " \n", + " 0\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + " $flag_windows\n", + " \n", + " \n", + " =\n", + " \n", + " \n", + " false\n", + " \n", + " \n", + " ;\n", + "
\n", + " if (\n", + "
\n", + "
\n", + " \n", + " 'win'\n", + " \n", + " \n", + " ==\n", + " \n", + " \n", + " substr\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " strtolower\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " PHP_OS\n", + " \n", + " \n", + " ),\n", + " \n", + " \n", + " 0\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 3\n", + " \n", + " \n", + " ) ||\n", + "
\n", + "
\n", + " \n", + " 'cygwin'\n", + " \n", + " \n", + " ==\n", + " \n", + " \n", + " substr\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " strtolower\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " PHP_OS\n", + " \n", + " \n", + " ),\n", + " \n", + " \n", + " 0\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 6\n", + " \n", + " \n", + " )\n", + "
\n", + " ) {\n", + "
\n", + "
\n", + " \n", + " $flag_windows\n", + " \n", + " \n", + " =\n", + " \n", + " \n", + " true\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $process_user\n", + " \n", + " \n", + " =\n", + " \n", + " \n", + " getenv\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'username'\n", + " \n", + " \n", + " );\n", + "
\n", + " } else {\n", + "
\n", + "
\n", + " \n", + " $process_user\n", + " \n", + " \n", + " =\n", + " \n", + " \n", + " posix_getpwuid\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " posix_geteuid\n", + " \n", + " \n", + " ());\n", + "
\n", + "
\n", + " \n", + " $process_user\n", + " \n", + " \n", + " = (\n", + " \n", + " \n", + " $process_user\n", + " \n", + " \n", + " ) ?\n", + " \n", + " \n", + " $process_user\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'name'\n", + " \n", + " \n", + " ] :\n", + " \n", + " \n", + " '[unknown]'\n", + " \n", + " \n", + " ;\n", + "
\n", + " }\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + " $app_audit_level\n", + " \n", + " \n", + " =\n", + " \n", + " \n", + " ''\n", + " \n", + " \n", + " ;\n", + "
\n", + " if (\n", + "
\n", + "
\n", + " \n", + " $_POST\n", + " \n", + " \n", + " &&\n", + "
\n", + "
\n", + " \n", + " array_key_exists\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'app_audit_level'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " $_POST\n", + " \n", + " \n", + " )\n", + "
\n", + " ) {\n", + "
\n", + "
\n", + " \n", + " $app_audit_level\n", + " \n", + " \n", + " =\n", + " \n", + " \n", + " trim\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " $_POST\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'app_audit_level'\n", + " \n", + " \n", + " ]);\n", + "
\n", + " }\n", + "
\n", + "
\n", + " switch (\n", + "
\n", + " \n", + " $app_audit_level\n", + " \n", + " \n", + " ) {\n", + "
\n", + "
\n", + " case\n", + "
\n", + " \n", + " 'paranoid'\n", + " \n", + " \n", + " :\n", + "
\n", + "
\n", + "
\n", + " \n", + " $insecure_features\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'expose_php'\n", + " \n", + " \n", + " ]                =\n", + " \n", + " \n", + " ERR_CONFIG_PROFILE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'apache_child_terminate'\n", + " \n", + " \n", + " ]    =\n", + " \n", + " \n", + " ERR_FUNCTION_PROFILE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'apache_get_modules'\n", + " \n", + " \n", + " ]        =\n", + " \n", + " \n", + " ERR_FUNCTION_PROFILE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'apache_get_version'\n", + " \n", + " \n", + " ]        =\n", + " \n", + " \n", + " ERR_FUNCTION_PROFILE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'apache_getenv'\n", + " \n", + " \n", + " ]            =\n", + " \n", + " \n", + " ERR_FUNCTION_PROFILE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'get_loaded_extensions'\n", + " \n", + " \n", + " ]    =\n", + " \n", + " \n", + " ERR_FUNCTION_PROFILE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'phpinfo'\n", + " \n", + " \n", + " ]                    =\n", + " \n", + " \n", + " ERR_FUNCTION_PROFILE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'phpversion'\n", + " \n", + " \n", + " ]                =\n", + " \n", + " \n", + " ERR_FUNCTION_PROFILE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + "
\n", + " \n", + " $insecure_features\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'file_uploads'\n", + " \n", + " \n", + " ]                =\n", + " \n", + " \n", + " WARN_CONFIG_UPLOAD\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'chgrp'\n", + " \n", + " \n", + " ]                    =\n", + " \n", + " \n", + " WARN_FUNCTION_FILES\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'chmod'\n", + " \n", + " \n", + " ]                    =\n", + " \n", + " \n", + " WARN_FUNCTION_FILES\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'chown'\n", + " \n", + " \n", + " ]                    =\n", + " \n", + " \n", + " WARN_FUNCTION_FILES\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'copy'\n", + " \n", + " \n", + " ]                        =\n", + " \n", + " \n", + " WARN_FUNCTION_FILES\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'link'\n", + " \n", + " \n", + " ]                        =\n", + " \n", + " \n", + " WARN_FUNCTION_FILES\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'mkdir'\n", + " \n", + " \n", + " ]                    =\n", + " \n", + " \n", + " WARN_FUNCTION_FILES\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'rename'\n", + " \n", + " \n", + " ]                    =\n", + " \n", + " \n", + " WARN_FUNCTION_FILES\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'rmdir'\n", + " \n", + " \n", + " ]                    =\n", + " \n", + " \n", + " WARN_FUNCTION_FILES\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'symlink'\n", + " \n", + " \n", + " ]                    =\n", + " \n", + " \n", + " WARN_FUNCTION_FILES\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'touch'\n", + " \n", + " \n", + " ]                    =\n", + " \n", + " \n", + " WARN_FUNCTION_FILES\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'unlink'\n", + " \n", + " \n", + " ]                    =\n", + " \n", + " \n", + " WARN_FUNCTION_FILES\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " case\n", + "
\n", + " \n", + " 'shared'\n", + " \n", + " \n", + " :\n", + "
\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'openlog'\n", + " \n", + " \n", + " ]                    =\n", + " \n", + " \n", + " ERR_FUNCTION_LOGGING\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'proc_nice'\n", + " \n", + " \n", + " ]                =\n", + " \n", + " \n", + " ERR_FUNCTION_DISRUPT\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'syslog'\n", + " \n", + " \n", + " ]                    =\n", + " \n", + " \n", + " ERR_FUNCTION_LOGGING\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " case\n", + "
\n", + " \n", + " 'common'\n", + " \n", + " \n", + " :\n", + "
\n", + "
\n", + "
\n", + " \n", + " $insecure_classes\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'splFileObject'\n", + " \n", + " \n", + " ]                 =\n", + " \n", + " \n", + " ERR_CONFIG_EXECUTE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + "
\n", + " \n", + " $insecure_features\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'register_globals'\n", + " \n", + " \n", + " ]            =\n", + " \n", + " \n", + " ERR_CONFIG_GLOBALS\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_features\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'allow_url_fopen'\n", + " \n", + " \n", + " ]            =\n", + " \n", + " \n", + " ERR_CONFIG_INCLUDES\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_features\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'display_errors'\n", + " \n", + " \n", + " ]            =\n", + " \n", + " \n", + " ERR_CONFIG_ERRORS\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + "
\n", + " \n", + " $insecure_features\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'enable_dl'\n", + " \n", + " \n", + " ]                    =\n", + " \n", + " \n", + " ERR_CONFIG_EXECUTE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'apache_note'\n", + " \n", + " \n", + " ]                =\n", + " \n", + " \n", + " ERR_FUNCTION_EXECUTE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'apache_setenv'\n", + " \n", + " \n", + " ]            =\n", + " \n", + " \n", + " ERR_FUNCTION_EXECUTE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'dl'\n", + " \n", + " \n", + " ]                        =\n", + " \n", + " \n", + " ERR_FUNCTION_EXECUTE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'exec'\n", + " \n", + " \n", + " ]                        =\n", + " \n", + " \n", + " ERR_FUNCTION_EXECUTE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'passthru'\n", + " \n", + " \n", + " ]                    =\n", + " \n", + " \n", + " ERR_FUNCTION_EXECUTE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'pcntl_exec'\n", + " \n", + " \n", + " ]                =\n", + " \n", + " \n", + " ERR_FUNCTION_EXECUTE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'popen'\n", + " \n", + " \n", + " ]                    =\n", + " \n", + " \n", + " ERR_FUNCTION_EXECUTE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'proc_close'\n", + " \n", + " \n", + " ]                =\n", + " \n", + " \n", + " ERR_FUNCTION_EXECUTE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'proc_open'\n", + " \n", + " \n", + " ]                =\n", + " \n", + " \n", + " ERR_FUNCTION_EXECUTE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'proc_get_status'\n", + " \n", + " \n", + " ]            =\n", + " \n", + " \n", + " ERR_FUNCTION_EXECUTE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'proc_terminate'\n", + " \n", + " \n", + " ]            =\n", + " \n", + " \n", + " ERR_FUNCTION_EXECUTE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'putenv'\n", + " \n", + " \n", + " ]                    =\n", + " \n", + " \n", + " ERR_FUNCTION_EXECUTE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'shell_exec'\n", + " \n", + " \n", + " ]                =\n", + " \n", + " \n", + " ERR_FUNCTION_EXECUTE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'system'\n", + " \n", + " \n", + " ]                    =\n", + " \n", + " \n", + " ERR_FUNCTION_EXECUTE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'virtual'\n", + " \n", + " \n", + " ]                    =\n", + " \n", + " \n", + " ERR_FUNCTION_EXECUTE\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + "
\n", + " \n", + " // Check PHP permissions\n", + "
\n", + "
\n", + " \n", + " if (\n", + " \n", + " \n", + " $flag_windows\n", + " \n", + " \n", + " )\n", + "
\n", + " {\n", + "
\n", + "
\n", + " \n", + " $error_features\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'PHP User Account'\n", + " \n", + " \n", + " ] =\n", + " \n", + " \n", + " str_replace\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " '$$USERNAME$$'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " $process_user\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " WARN_CONFIG_PHPUSER_WIN\n", + " \n", + " \n", + " );\n", + "
\n", + " } else if (\n", + "
\n", + " \n", + " 'root'\n", + " \n", + " \n", + " ==\n", + " \n", + " \n", + " $process_user\n", + " \n", + " \n", + " ) {\n", + "
\n", + "
\n", + " \n", + " $error_features\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'PHP User Account'\n", + " \n", + " \n", + " ] =\n", + " \n", + " \n", + " ERR_CONFIG_PHPUSER\n", + " \n", + " \n", + " ;\n", + "
\n", + " }\n", + "
\n", + "
\n", + "
\n", + " \n", + " // Check open_basedir restriction\n", + "
\n", + "
\n", + " \n", + " if ( !\n", + " \n", + " \n", + " ini_get\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'open_basedir'\n", + " \n", + " \n", + " ) )\n", + "
\n", + " {\n", + "
\n", + "
\n", + " \n", + " $error_features\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'open_basedir'\n", + " \n", + " \n", + " ] =\n", + " \n", + " \n", + " ERR_CONFIG_BASEDIR\n", + " \n", + " \n", + " ;\n", + "
\n", + " } else {\n", + "
\n", + "
\n", + "
\n", + " \n", + " $error_basedir\n", + " \n", + " \n", + " =\n", + " \n", + " \n", + " ''\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + "
\n", + " \n", + " $basedirs\n", + " \n", + " \n", + " = (\n", + " \n", + " \n", + " $flag_windows\n", + " \n", + " \n", + " ) ?\n", + " \n", + " \n", + " explode\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " ';'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " ini_get\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'open_basedir'\n", + " \n", + " \n", + " )) :\n", + " \n", + " \n", + " explode\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " ':'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " ini_get\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'open_basedir'\n", + " \n", + " \n", + " ));\n", + "
\n", + "
\n", + " foreach (\n", + "
\n", + " \n", + " $basedirs\n", + " \n", + " \n", + " as\n", + " \n", + " \n", + " $basedir\n", + " \n", + " \n", + " )\n", + "
\n", + " {\n", + "
\n", + " if (\n", + "
\n", + " \n", + " '.'\n", + " \n", + " \n", + " ===\n", + " \n", + " \n", + " $basedir\n", + " \n", + " \n", + " )\n", + "
\n", + " {\n", + "
\n", + "
\n", + " \n", + " $error_basedir\n", + " \n", + " \n", + " .= (\n", + " \n", + " \n", + " $error_basedir\n", + " \n", + " \n", + " ) ?\n", + " \n", + " \n", + " '<br />'\n", + " \n", + " \n", + " :\n", + " \n", + " \n", + " ''\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $error_basedir\n", + " \n", + " \n", + " .=\n", + " \n", + " \n", + " str_replace\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " '$$BASEDIR$$'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " $basedir\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " ERR_CONFIG_BASEDIR_CHDIR\n", + " \n", + " \n", + " );\n", + "
\n", + " }\n", + "
\n", + "
\n", + " if (\n", + "
\n", + " \n", + " $flag_windows\n", + " \n", + " \n", + " )\n", + "
\n", + " {\n", + "
\n", + " if (\n", + "
\n", + " \n", + " '\\\\'\n", + " \n", + " \n", + " !=\n", + " \n", + " \n", + " substr\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " $basedir\n", + " \n", + " \n", + " , -\n", + " \n", + " \n", + " 1\n", + " \n", + " \n", + " ) )\n", + "
\n", + " {\n", + "
\n", + "
\n", + " \n", + " $error_basedir\n", + " \n", + " \n", + " .= (\n", + " \n", + " \n", + " $error_basedir\n", + " \n", + " \n", + " ) ?\n", + " \n", + " \n", + " '<br />'\n", + " \n", + " \n", + " :\n", + " \n", + " \n", + " ''\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $error_basedir\n", + " \n", + " \n", + " .=\n", + " \n", + " \n", + " str_replace\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " '$$BASEDIR$$'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " $basedir\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " ERR_CONFIG_BASEDIR_SLASH\n", + " \n", + " \n", + " );\n", + "
\n", + " }\n", + "
\n", + " } else {\n", + "
\n", + " if (\n", + "
\n", + " \n", + " '/'\n", + " \n", + " \n", + " !=\n", + " \n", + " \n", + " substr\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " $basedir\n", + " \n", + " \n", + " , -\n", + " \n", + " \n", + " 1\n", + " \n", + " \n", + " ) )\n", + "
\n", + " {\n", + "
\n", + "
\n", + " \n", + " $error_basedir\n", + " \n", + " \n", + " .= (\n", + " \n", + " \n", + " $error_basedir\n", + " \n", + " \n", + " ) ?\n", + " \n", + " \n", + " '<br />'\n", + " \n", + " \n", + " :\n", + " \n", + " \n", + " ''\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " $error_basedir\n", + " \n", + " \n", + " .=\n", + " \n", + " \n", + " str_replace\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " '$$BASEDIR$$'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " $basedir\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " ERR_CONFIG_BASEDIR_SLASH\n", + " \n", + " \n", + " );\n", + "
\n", + " }\n", + "
\n", + " }\n", + "
\n", + " }\n", + "
\n", + "
\n", + " if (\n", + "
\n", + " \n", + " $error_basedir\n", + " \n", + " \n", + " )\n", + "
\n", + " {\n", + "
\n", + "
\n", + " \n", + " $error_features\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'open_basedir'\n", + " \n", + " \n", + " ] =\n", + " \n", + " \n", + " $error_basedir\n", + " \n", + " \n", + " ;\n", + "
\n", + " } else {\n", + "
\n", + "
\n", + " \n", + " $messages\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'Base Directory'\n", + " \n", + " \n", + " ] =\n", + " \n", + " \n", + " str_replace\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " '$$BASEDIR$$'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " ini_get\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'open_basedir'\n", + " \n", + " \n", + " ),\n", + " \n", + " \n", + " MSG_BASEDIR\n", + " \n", + " \n", + " );\n", + "
\n", + " }\n", + "
\n", + " }\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + " // PHP version checking\n", + "
\n", + "
\n", + " \n", + " switch (\n", + " \n", + " \n", + " true\n", + " \n", + " \n", + " ) {\n", + "
\n", + "
\n", + " case (\n", + "
\n", + " \n", + " defined\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'PHP_VERSION_ID'\n", + " \n", + " \n", + " ) ):\n", + "
\n", + "
\n", + "
\n", + " \n", + " $php_version_id\n", + " \n", + " \n", + " =\n", + " \n", + " \n", + " PHP_VERSION_ID\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " case (\n", + "
\n", + " \n", + " function_exists\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'phpversion'\n", + " \n", + " \n", + " ) ):\n", + "
\n", + "
\n", + "
\n", + " \n", + " $php_version_id\n", + " \n", + " \n", + " = (!\n", + " \n", + " \n", + " $php_version_id\n", + " \n", + " \n", + " ) ?\n", + " \n", + " \n", + " substr\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " phpversion\n", + " \n", + " \n", + " (),\n", + " \n", + " \n", + " 0\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " strpos\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " phpversion\n", + " \n", + " \n", + " (),\n", + " \n", + " \n", + " '-'\n", + " \n", + " \n", + " )) :\n", + " \n", + " \n", + " $php_version_id\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " case (\n", + "
\n", + " \n", + " defined\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'PHP_VERSION'\n", + " \n", + " \n", + " ) ):\n", + "
\n", + "
\n", + "
\n", + " \n", + " $php_version_id\n", + " \n", + " \n", + " = (!\n", + " \n", + " \n", + " $php_version_id\n", + " \n", + " \n", + " ) ? (\n", + " \n", + " \n", + " $version\n", + " \n", + " \n", + " {\n", + " \n", + " \n", + " 0\n", + " \n", + " \n", + " } *\n", + " \n", + " \n", + " 10000\n", + " \n", + " \n", + " +\n", + " \n", + " \n", + " $version\n", + " \n", + " \n", + " {\n", + " \n", + " \n", + " 2\n", + " \n", + " \n", + " } *\n", + " \n", + " \n", + " 100\n", + " \n", + " \n", + " +\n", + " \n", + " \n", + " $version\n", + " \n", + " \n", + " {\n", + " \n", + " \n", + " 4\n", + " \n", + " \n", + " }) :\n", + " \n", + " \n", + " $php_version_id\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " break;\n", + "
\n", + "
\n", + " default:\n", + "
\n", + "
\n", + " \n", + " $messages_features\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'PHP_VERSION'\n", + " \n", + " \n", + " ] =\n", + " \n", + " \n", + " WARN_VERSION\n", + " \n", + " \n", + " ;\n", + "
\n", + " break;\n", + "
\n", + " }\n", + "
\n", + "
\n", + "
\n", + " \n", + " // Check features\n", + "
\n", + "
\n", + " \n", + " if (\n", + " \n", + " \n", + " is_array\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " $insecure_features\n", + " \n", + " \n", + " ) )\n", + "
\n", + " {\n", + "
\n", + " foreach (\n", + "
\n", + " \n", + " $insecure_features\n", + " \n", + " \n", + " as\n", + " \n", + " \n", + " $feature_key\n", + " \n", + " \n", + " =>\n", + " \n", + " \n", + " $feature_message\n", + " \n", + " \n", + " )\n", + "
\n", + " {\n", + "
\n", + " if ( (bool)\n", + "
\n", + " \n", + " ini_get\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " $feature_key\n", + " \n", + " \n", + " ) )\n", + "
\n", + "
\n", + " \n", + " $error_features\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " $feature_key\n", + " \n", + " \n", + " ] =\n", + " \n", + " \n", + " $feature_message\n", + " \n", + " \n", + " ;\n", + "
\n", + " }\n", + "
\n", + " }\n", + "
\n", + "
\n", + "
\n", + " \n", + " // Check classes\n", + "
\n", + "
\n", + " \n", + " if (\n", + " \n", + " \n", + " is_array\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " $insecure_classes\n", + " \n", + " \n", + " ) )\n", + "
\n", + " {\n", + "
\n", + " foreach (\n", + "
\n", + " \n", + " $insecure_classes\n", + " \n", + " \n", + " as\n", + " \n", + " \n", + " $class_key\n", + " \n", + " \n", + " =>\n", + " \n", + " \n", + " $class_message\n", + " \n", + " \n", + " )\n", + "
\n", + " {\n", + "
\n", + " if (\n", + "
\n", + " \n", + " class_exists\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " $class_key\n", + " \n", + " \n", + " ) )\n", + "
\n", + "
\n", + " \n", + " $error_classes\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " $class_key\n", + " \n", + " \n", + " ] =\n", + " \n", + " \n", + " $class_message\n", + " \n", + " \n", + " ;\n", + "
\n", + " }\n", + "
\n", + " }\n", + "
\n", + "
\n", + "
\n", + " \n", + " // Check functions\n", + "
\n", + "
\n", + " \n", + " if (\n", + " \n", + " \n", + " is_array\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " ) )\n", + "
\n", + " {\n", + "
\n", + " foreach (\n", + "
\n", + " \n", + " $insecure_functions\n", + " \n", + " \n", + " as\n", + " \n", + " \n", + " $function_key\n", + " \n", + " \n", + " =>\n", + " \n", + " \n", + " $function_message\n", + " \n", + " \n", + " )\n", + "
\n", + " {\n", + "
\n", + " if (\n", + "
\n", + " \n", + " function_exists\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " $function_key\n", + " \n", + " \n", + " ) )\n", + "
\n", + "
\n", + " \n", + " $error_functions\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " $function_key\n", + " \n", + " \n", + " ] =\n", + " \n", + " \n", + " $function_message\n", + " \n", + " \n", + " ;\n", + "
\n", + " }\n", + "
\n", + " }\n", + "
\n", + "
\n", + "
\n", + " \n", + " // Build content for display\n", + "
\n", + "
\n", + " \n", + " $output\n", + " \n", + " \n", + " .=\n", + " \n", + " \n", + " build_output\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " APP_LABEL_ERROR_FEATURES\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'error features'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " APP_DESCRIPTION_ERROR_FEATURES\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " $error_features\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " $output\n", + " \n", + " \n", + " .=\n", + " \n", + " \n", + " build_output\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " APP_LABEL_ERROR_CLASSES\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'error classes'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " APP_DESCRIPTION_ERROR_CLASSES\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " $error_classes\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " $output\n", + " \n", + " \n", + " .=\n", + " \n", + " \n", + " build_output\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " APP_LABEL_ERROR_FUNCTIONS\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'error functions'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " APP_DESCRIPTION_ERROR_FUNCTIONS\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " $error_functions\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " \n", + " $output\n", + " \n", + " \n", + " .=\n", + " \n", + " \n", + " build_output\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " APP_LABEL_MESSAGES\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " 'message'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " APP_DESCRIPTION_MESSAGES\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " $messages\n", + " \n", + " \n", + " );\n", + "
\n", + "
\n", + " break;\n", + "
\n", + "
\n", + " default:\n", + "
\n", + "
\n", + "
\n", + " \n", + " // Set default content for display\n", + "
\n", + " // ...\n", + "
\n", + "
\n", + "
\n", + " \n", + " break;\n", + "
\n", + "
\n", + " }\n", + "
\n", + "
\n", + "
\n", + " \n", + " ?>\n", + " \n", + " <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n", + "
\n", + " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n", + "
\n", + " <html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n", + "
\n", + " <head>\n", + "
\n", + "
\n", + " <title>\n", + " \n", + " <?php\n", + " \n", + " \n", + " if (\n", + " \n", + " \n", + " $output_count_errors\n", + " \n", + " \n", + " ) echo\n", + " \n", + " \n", + " $output_count_errors\n", + " \n", + " \n", + " .\n", + " \n", + " \n", + " ' Problems Identified - '\n", + " \n", + " \n", + " ;\n", + " \n", + " \n", + " ?><?php\n", + " \n", + " \n", + " echo\n", + " \n", + " \n", + " APP_TITLE\n", + " \n", + " \n", + " ;\n", + " \n", + " \n", + " ?>\n", + " \n", + " </title>\n", + "
\n", + "
\n", + " <style type=\"text/css\">\n", + "
\n", + " * {\n", + "
\n", + " margin:0;\n", + "
\n", + " padding:0;\n", + "
\n", + " }\n", + "
\n", + " body {\n", + "
\n", + " background-color:#EFEFEF;\n", + "
\n", + " font-family:Arial,sans-serif;\n", + "
\n", + " }\n", + "
\n", + " div {\n", + "
\n", + " margin:10px 20px;\n", + "
\n", + " padding:8px;\n", + "
\n", + " -moz-border-radius:8px;\n", + "
\n", + " border-radius:8px;\n", + "
\n", + " }\n", + "
\n", + " .application {\n", + "
\n", + " border:solid 1px #444444;\n", + "
\n", + " background-color:#F6F6F6;\n", + "
\n", + " }\n", + "
\n", + " .error {\n", + "
\n", + " color:#880000;\n", + "
\n", + " border:solid 1px #880000;\n", + "
\n", + " background-color:#EFCCCC;\n", + "
\n", + " }\n", + "
\n", + " .message {\n", + "
\n", + " color:#008800;\n", + "
\n", + " border:solid 1px #008800;\n", + "
\n", + " background-color:#CCEFCC;\n", + "
\n", + " }\n", + "
\n", + " ul {\n", + "
\n", + " list-style-type:square;\n", + "
\n", + " margin-left:20px;\n", + "
\n", + " }\n", + "
\n", + " li {\n", + "
\n", + " margin-bottom:0.4em;\n", + "
\n", + " }\n", + "
\n", + " p {\n", + "
\n", + " margin:0.4em 0.2em;\n", + "
\n", + " }\n", + "
\n", + " .ms {\n", + "
\n", + " font-family:monospace;\n", + "
\n", + " }\n", + "
\n", + " </style>\n", + "
\n", + "
\n", + " </head>\n", + "
\n", + " <body>\n", + "
\n", + " <div class=\"application\">\n", + "
\n", + " <h1>\n", + " \n", + " <?php\n", + " \n", + " \n", + " echo\n", + " \n", + " \n", + " APP_TITLE\n", + " \n", + " \n", + " ;\n", + " \n", + " \n", + " ?>\n", + " \n", + " </h1>\n", + "
\n", + " <hr />\n", + "
\n", + " <p>\n", + " \n", + " <?php\n", + " \n", + " \n", + " echo\n", + " \n", + " \n", + " APP_DESCRIPTION\n", + " \n", + " \n", + " ;\n", + " \n", + " \n", + " ?>\n", + " \n", + " </p>\n", + "
\n", + " <p></p>\n", + "
\n", + " <hr />\n", + "
\n", + " <p class=\"ms\"><strong>\n", + " \n", + " <?php\n", + " \n", + " \n", + " echo\n", + " \n", + " \n", + " APP_LABEL_HOSTNAME\n", + " \n", + " \n", + " ;\n", + " \n", + " \n", + " ?>\n", + " \n", + " </strong>\n", + " \n", + " <?php\n", + " \n", + " \n", + " echo\n", + " \n", + " \n", + " $_SERVER\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'HTTP_HOST'\n", + " \n", + " \n", + " ];\n", + " \n", + " \n", + " ?>\n", + " \n", + " </p>\n", + "
\n", + " <p class=\"ms\"><strong>\n", + " \n", + " <?php\n", + " \n", + " \n", + " echo\n", + " \n", + " \n", + " APP_LABEL_OS\n", + " \n", + " \n", + " ;\n", + " \n", + " \n", + " ?>\n", + " \n", + " </strong>\n", + " \n", + " <?php\n", + " \n", + " \n", + " echo\n", + " \n", + " \n", + " PHP_OS\n", + " \n", + " \n", + " ;\n", + " \n", + " \n", + " ?>\n", + " \n", + " </p>\n", + "
\n", + " <p class=\"ms\"><strong>\n", + " \n", + " <?php\n", + " \n", + " \n", + " echo\n", + " \n", + " \n", + " APP_LABEL_USER\n", + " \n", + " \n", + " ;\n", + " \n", + " \n", + " ?>\n", + " \n", + " </strong>\n", + " \n", + " <?php\n", + " \n", + " \n", + " echo\n", + " \n", + " \n", + " $process_user\n", + " \n", + " \n", + " ;\n", + " \n", + " \n", + " ?>\n", + " \n", + " </p>\n", + "
\n", + " <p class=\"ms\"><strong>\n", + " \n", + " <?php\n", + " \n", + " \n", + " echo\n", + " \n", + " \n", + " APP_LABEL_RUN_DATE\n", + " \n", + " \n", + " ;\n", + " \n", + " \n", + " ?>\n", + " \n", + " </strong>\n", + " \n", + " <?php\n", + " \n", + " \n", + " echo\n", + " \n", + " \n", + " date\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " \"Y-m-d H:i:s\"\n", + " \n", + " \n", + " );\n", + " \n", + " \n", + " ?>\n", + " \n", + " </p>\n", + "
\n", + " </div>\n", + "
\n", + "
\n", + " <div class=\"application\">\n", + "
\n", + " <form action=\"\n", + " \n", + " <?php\n", + " \n", + " \n", + " echo\n", + " \n", + " \n", + " $_SERVER\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'PHP_SELF'\n", + " \n", + " \n", + " ];\n", + " \n", + " \n", + " ?>\n", + " \n", + " \" method=\"post\">\n", + "
\n", + " <select name=\"app_audit_level\">\n", + "
\n", + " <option value=\"common\"\n", + " \n", + " <?php\n", + " \n", + " \n", + " if (\n", + " \n", + " \n", + " $_POST\n", + " \n", + " \n", + " &&\n", + " \n", + " \n", + " array_key_exists\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'app_audit_level'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " $_POST\n", + " \n", + " \n", + " ) &&\n", + " \n", + " \n", + " $_POST\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'app_audit_level'\n", + " \n", + " \n", + " ] ==\n", + " \n", + " \n", + " 'common'\n", + " \n", + " \n", + " ) echo\n", + " \n", + " \n", + " ' selected=\"selected\"'\n", + " \n", + " \n", + " ;\n", + " \n", + " \n", + " ?>\n", + " \n", + " >\n", + " \n", + " <?php\n", + " \n", + " \n", + " echo\n", + " \n", + " \n", + " APP_LABEL_COMMON\n", + " \n", + " \n", + " ;\n", + " \n", + " \n", + " ?>\n", + " \n", + " </option>\n", + "
\n", + " <option value=\"shared\"\n", + " \n", + " <?php\n", + " \n", + " \n", + " if (\n", + " \n", + " \n", + " $_POST\n", + " \n", + " \n", + " &&\n", + " \n", + " \n", + " array_key_exists\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'app_audit_level'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " $_POST\n", + " \n", + " \n", + " ) &&\n", + " \n", + " \n", + " $_POST\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'app_audit_level'\n", + " \n", + " \n", + " ] ==\n", + " \n", + " \n", + " 'shared'\n", + " \n", + " \n", + " ) echo\n", + " \n", + " \n", + " ' selected=\"selected\"'\n", + " \n", + " \n", + " ;\n", + " \n", + " \n", + " ?>\n", + " \n", + " >\n", + " \n", + " <?php\n", + " \n", + " \n", + " echo\n", + " \n", + " \n", + " APP_LABEL_SHARED\n", + " \n", + " \n", + " ;\n", + " \n", + " \n", + " ?>\n", + " \n", + " </option>\n", + "
\n", + " <option value=\"paranoid\"\n", + " \n", + " <?php\n", + " \n", + " \n", + " if (\n", + " \n", + " \n", + " $_POST\n", + " \n", + " \n", + " &&\n", + " \n", + " \n", + " array_key_exists\n", + " \n", + " \n", + " (\n", + " \n", + " \n", + " 'app_audit_level'\n", + " \n", + " \n", + " ,\n", + " \n", + " \n", + " $_POST\n", + " \n", + " \n", + " ) &&\n", + " \n", + " \n", + " $_POST\n", + " \n", + " \n", + " [\n", + " \n", + " \n", + " 'app_audit_level'\n", + " \n", + " \n", + " ] ==\n", + " \n", + " \n", + " 'paranoid'\n", + " \n", + " \n", + " ) echo\n", + " \n", + " \n", + " ' selected=\"selected\"'\n", + " \n", + " \n", + " ;\n", + " \n", + " \n", + " ?>\n", + " \n", + " >\n", + " \n", + " <?php\n", + " \n", + " \n", + " echo\n", + " \n", + " \n", + " APP_LABEL_PARANOID\n", + " \n", + " \n", + " ;\n", + " \n", + " \n", + " ?>\n", + " \n", + " </option>\n", + "
\n", + " </select>\n", + "
\n", + " <input type=\"submit\" value=\"Run Audit &gt;&gt;\" />\n", + "
\n", + " </form>\n", + "
\n", + " </div>\n", + "
\n", + "
\n", + " \n", + " <?php\n", + "
\n", + "
\n", + " \n", + " echo\n", + " \n", + " \n", + " $output\n", + " \n", + " \n", + " ;\n", + "
\n", + "
\n", + " \n", + " ?>\n", + "
\n", + "
\n", + "
\n", + " </body>\n", + "
\n", + " </html>\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

\n", + " Copyright © 2009-2013 Hadean LLC\n", + "

\n", + "

\n", + " Retrieved 2013-02-23 12:51:40\n", + "

\n", + "
\n", + "
\n", + " \n", + " \n", + " \n", + "\n" + ] + } + ], + "source": [ + "soup = bs.BeautifulSoup(source.content,'lxml')\n", + "print(soup.prettify())" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n" + ] + } + ], + "source": [ + "navigation=soup.find_all('ul')\n", + "print(navigation)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "ResultSet object has no attribute 'find_all'. You're probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mfor\u001b[0m \u001b[0murl\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mnavigation\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfind_all\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'a'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mlink\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0murl\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'href'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;34m'caravanmagazine.in/'\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mlink\u001b[0m\u001b[1;33m:\u001b[0m \u001b[1;31m# check link to a subpage\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlink\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\bs4\\element.py\u001b[0m in \u001b[0;36m__getattr__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 1805\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__getattr__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1806\u001b[0m raise AttributeError(\n\u001b[1;32m-> 1807\u001b[1;33m \u001b[1;34m\"ResultSet object has no attribute '%s'. You're probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?\"\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1808\u001b[0m )\n", + "\u001b[1;31mAttributeError\u001b[0m: ResultSet object has no attribute 'find_all'. You're probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?" + ] + } + ], + "source": [ + "for url in navigation.find_all('a'):\n", + " link=url.get('href')\n", + " if 'caravanmagazine.in/' in link: # check link to a subpage\n", + " print(link) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}