diff --git a/python-assn/assn-01/Omkar_Rajebhosale-01.ipynb b/python-assn/assn-01/Omkar_Rajebhosale-01.ipynb new file mode 100644 index 0000000..f0bec73 --- /dev/null +++ b/python-assn/assn-01/Omkar_Rajebhosale-01.ipynb @@ -0,0 +1,569 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Assignment 1: Strings, Lists and Files\n", + "\n", + "This assignment is based on basic python operations and to help you get a better understanding of lists, dictionaries, string operations, file I/O and other basic python operations. All the best!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1) Given an positive integer, write a function to print the smallest integer that can be formed by rearranging the digits of the given number.**\n", + "\n", + "For e.g.:\n", + "```\n", + " >>> least_int(54235)\n", + " 23455\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "23455\n" + ] + } + ], + "source": [ + "def least_int(num):\n", + " #write your code here\n", + " \n", + " l=list(str(num)) \n", + " l.sort()\n", + " print (\"\".join(l))\n", + "\n", + "least_int(54235)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "\n", + "**Q2) Given a string consisting of words and whitespaces, write a function to print a word consisting of the last letters of all the words beginning with the letter 'a'. Assume that all the alphabets in the strings are lower case.**\n", + "\n", + "For e.g.: \n", + "```\n", + ">>> mystring = 'apple banana aeroplace machine learning python append'\n", + ">>> function_a(mystring)\n", + "eed\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "eed" + ] + } + ], + "source": [ + "def function_a(string1):\n", + " #write your code here\n", + " \n", + " l= string1.split() \n", + " for i in range(len(l)):\n", + " for x in range(len(l[i])): \n", + " if l[i][0]==\"a\": \n", + " print (l[i][-1],end=\"\") \n", + " break\n", + " \n", + "function_a(\"apple banana aeroplace machine learning python append\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "**Q3) Given a string in the form of a sentence, remove all duplicate words from the sentence.(Order of words in the return value can differ from original)**\n", + "For e.g.:\n", + "```\n", + ">>> mystr = 'Vedang Pro is Pro at ML'\n", + ">>> remove_dup(mystr)\n", + "'Vedang at ML Pro is'\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'is Vedang at Pro ML'\n" + ] + } + ], + "source": [ + "def remove_dup(mystring):\n", + " #write your code here\n", + " l= list(set(mystring.split()))\n", + " return \"'\"+(\" \".join(l))+\"'\"\n", + "\n", + "print(remove_dup(\"Vedang Pro is Pro at ML\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "______\n", + "**Q4) Write a single line of code to check if a given string ```mystring``` is a palindrome or not.**\n", + "For e.g.:\n", + "```\n", + ">>> mystring = 'SatanoscillatemymetallicsonataS'\n", + "#your code\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "malayalam\n", + "Is_palindrame\n" + ] + } + ], + "source": [ + "#give any random string\n", + "mystring=input()\n", + "if(mystring==mystring[::-1]):\n", + " print (\"Is_palindrame\")\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "**Q5) Given a list of integers, create a new list where the i'th entry in the list is the average of previous i - 1 entries in the original list.**\n", + "For e.g.:\n", + "```\n", + ">>> a = [1, 2, 3, 4, 5]\n", + ">>> list_of_avgs(a)\n", + "[1.0, 1.5, 2.0, 2.5, 3.0]\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1.0, 1.5, 2.0, 2.5, 3.0]\n" + ] + } + ], + "source": [ + "def list_of_avgs(a):\n", + " new_list=a[::] \n", + " for i in range(len(a)):\n", + " total=0\n", + " for prev in range(0,i+1):\n", + " total+=a[prev] \n", + " new_list[i]=total/(i+1) \n", + " print (new_list)\n", + "\n", + "a=[1,2,3,4,5]\n", + "list_of_avgs(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "**Q6) Given a list of random integers, modify the list such that all the elements in even places are in ascending order and all those in the odd places appear in a decreasing order. Assume labeling of the places start from the number zero.**\n", + "\n", + "For e.g.\n", + "```\n", + ">>> a = [1, 8, 4, 5, 2, 5, 3, 9, 4]\n", + ">>> asc_desc_list(a)\n", + "[1, 9, 2, 8, 3, 5, 4, 5, 4]\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 9, 2, 8, 3, 5, 4, 5, 4]\n" + ] + } + ], + "source": [ + "def asc_desc_list(a):\n", + " #write your code here\n", + " list_e= a[::2]\n", + " list_o= a[1::2]\n", + " list_e.sort()\n", + " list_o.sort(reverse=True)\n", + " new_list=[0]*(len(list_e)+len(list_o))\n", + " new_list[::2]=list_e\n", + " new_list[1::2]=list_o\n", + " print (new_list)\n", + " \n", + "a = [1, 8, 4, 5, 2, 5, 3, 9, 4] \n", + "asc_desc_list(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "**Q7) Write an iterator function to return the elements of the Fibonacci series.**" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0,\n", + " 1,\n", + " 1,\n", + " 2,\n", + " 3,\n", + " 5,\n", + " 8,\n", + " 13,\n", + " 21,\n", + " 34,\n", + " 55,\n", + " 89,\n", + " 144,\n", + " 233,\n", + " 377,\n", + " 610,\n", + " 987,\n", + " 1597,\n", + " 2584,\n", + " 4181,\n", + " 6765,\n", + " 10946,\n", + " 17711,\n", + " 28657,\n", + " 46368,\n", + " 75025,\n", + " 121393,\n", + " 196418,\n", + " 317811,\n", + " 514229,\n", + " 832040,\n", + " 1346269,\n", + " 2178309,\n", + " 3524578,\n", + " 5702887,\n", + " 9227465,\n", + " 14930352,\n", + " 24157817,\n", + " 39088169,\n", + " 63245986,\n", + " 102334155,\n", + " 165580141,\n", + " 267914296,\n", + " 433494437,\n", + " 701408733,\n", + " 1134903170,\n", + " 1836311903,\n", + " 2971215073,\n", + " 4807526976,\n", + " 7778742049]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def fibonacci(n):\n", + " list=[0,1]\n", + " a = 0\n", + " b = 1\n", + " if n < 0:\n", + " print(\"Incorrect input\")\n", + " elif n == 0:\n", + " return [a]\n", + " elif n == 1:\n", + " return [a,b]\n", + " else:\n", + " for i in range(2,n):\n", + " c = a + b\n", + " a = b\n", + " b = c\n", + " list.extend([c])\n", + " return list\n", + "\n", + "fibonacci(50)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "**Q8) Print all the sublists of a list, seperated by a comma and a whitespace.**\n", + "For e.g.:\n", + "```\n", + ">>> a = [1, 2]\n", + ">>> sub_lists(a)\n", + "[], [1], [1, 2] [2][\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[], [1], [1, 2], [1, 2, 3], [2], [2, 3], [3], None\n" + ] + } + ], + "source": [ + "def sub_lists(a):\n", + " print ([], end=', ') \n", + " for i in range(len(a)):\n", + " for j in range(i+1,len(a)+1): \n", + " print (a[i:j],end=\", \") \n", + " \n", + "\n", + "print (sub_lists([1,2,3]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "**Q9) Write two functions, each of which take a list as an argument. The first function modifies the list by appending the sum of entries of the list passed as an argument. The second function reassigns a new list to the argument passed, where each entry in the new list is one more than the corresponding entry given as an argument. Is the change reflected outside the functions in both cases? Why/Why not?**\n", + "Note: For reassign_list(a), you have to reassign a new list to the argument, and not change the existing list." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3, 6]\n", + "[1, 2, 3]\n" + ] + } + ], + "source": [ + "def modify_list(a):\n", + " sum=0 \n", + " for i in range(len(a)):\n", + " sum+=a[i]\n", + " a.extend([sum])\n", + " pass\n", + " \n", + "def reassign_list(a):\n", + " new=[0]*len(a)\n", + " for i in range(len(a)):\n", + " new[i]=a[i]+1\n", + " pass\n", + "\n", + "\n", + "a = [1, 2, 3]\n", + "modify_list(a)\n", + "print(a)\n", + "\n", + "a = [1, 2, 3]\n", + "reassign_list(a)\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "**Q10) Given a string, return a dictionary consisting of each character in the string and the position at which it occurs. (Positions are to be taken as keys, and position numbering starts from 1)**\n", + "\n", + "For e.g.)\n", + "\n", + "```\n", + ">>> a = 'Machine Learning'\n", + ">>> char_position(a)\n", + "{1: 'M', 2: 'a', 3: 'c', 4: 'h', 5: 'i', 6: 'n', 7: 'e', 9: 'L', 10: 'e', 11: 'a', 12: 'r', 13: 'n', 14: 'i', 15: 'n', 16: 'g'}\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{1: 'M', 2: 'a', 3: 'c', 4: 'h', 5: 'i', 6: 'n', 7: 'e', 9: 'L', 10: 'e', 11: 'a', 12: 'r', 13: 'n', 14: 'i', 15: 'n', 16: 'g'}\n" + ] + } + ], + "source": [ + "def char_position(a):\n", + " l= list(a)\n", + " d={} \n", + " for i in range(len(l)):\n", + " if l[i]==\" \":\n", + " continue\n", + " d[i+1]=l[i]\n", + " return (d) \n", + "\n", + "print(char_position(\"Machine Learning\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "**Q11) Given a string, arrange the characters in increasing order of their frequency at which they appear(Ignore any whitespaces)**\n", + "\n", + "For e.g.:\n", + "```\n", + ">>> a = 'ifadhaiusbdufbugfsdbfubgsidf'\n", + ">>> sort_by_freq(a)\n", + "'haaggiiisssdddduuuubbbbfffff'\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def sort_by_freq(a): \n", + " dict = {}\n", + " l = list(a)\n", + " for i in l: \n", + " keys = dict.keys()\n", + " if i in keys:\n", + " dict[i] += 1\n", + " else:\n", + " dict[i] = 1\n", + " print (dict)\n", + " \n", + " maxf = max_freq(dict)\n", + " print (maxf)\n", + "\n", + " \n", + " for t in range(1,maxf+1):\n", + " freq_t = []\n", + " \n", + " for char in dict:\n", + " if dict[char]==t:\n", + " freq_t.append(char*t)\n", + " \n", + " \n", + " freq_t.sort()\n", + " print (\"\".join(freq_t),end=\"\")\n", + " \n", + "def max_freq(dict):\n", + " maxf = 1\n", + " for key in dict:\n", + " if(dict[key]> maxf):\n", + " maxf= dict[key]\n", + " return maxf\n", + " \n", + "a=\"ifadhaiusbdufbugfsdbfubgsidf\"\n", + "sort_by_freq(a)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "---\n", + "**Q12)**\n", + "\n", + "**A) Create a file called myfile.txt**\n", + "\n", + "**B) Enter some random paragraph into the file.**\n", + "\n", + "**C) Take an integer input n from the user. Create a file with the name as the nth word in myfile.txt.(Assume that n is less than the number of words in your file.)**\n", + "\n", + "**D) Enter the paragraph from myfile.txt into your new file, in reverse order. \n", + "Note: In part (D) only the order of the words should change, the words are not reversed in themselves.**" + ] + } + ], + "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.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/python-assn/assn-02/Omkar_Rajebhosale-02.ipynb b/python-assn/assn-02/Omkar_Rajebhosale-02.ipynb new file mode 100644 index 0000000..b23a899 --- /dev/null +++ b/python-assn/assn-02/Omkar_Rajebhosale-02.ipynb @@ -0,0 +1,323 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0 1 2 3]\n", + " [ 4 5 6 7]\n", + " [ 8 9 10 11]\n", + " [12 13 14 15]]\n" + ] + } + ], + "source": [ + "A = np.arange(16) #This creates a vector with values from 0 to 15.\n", + "\n", + "#Reshape A into a 4x4 numpy array and print the array\n", + "#################################\n", + "\n", + "R = A.reshape((4,4))\n", + "print (R)\n", + "\n", + "################################# " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0 1 4 9]\n", + " [ 16 25 36 49]\n", + " [ 64 81 100 121]\n", + " [144 169 196 225]]\n" + ] + } + ], + "source": [ + "#Create another array B which is made of square of each elements of B[changed to R] and print B.\n", + "#################################\n", + "\n", + "B = np.square(R)\n", + "print (B)\n", + "\n", + "#################################" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 50.01026923, 37.57927816, 51.59954058, 21.46386098,\n", + " -48.78244569, -21.39896047, -29.12738484, -57.2421675 ,\n", + " -46.57999874, -9.67706059])" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Create a numpy array of shape (28,28) whose values are chosen randomly from 0-255\n", + "#################################\n", + "\n", + "X = np.random.randint(255,size=(28,28))\n", + "\n", + "#################################\n", + "\n", + "#Convert x into a vector (Make it of single dimension)\n", + "#################################\n", + "\n", + "X = X.flatten() \n", + "\n", + "#################################\n", + "\n", + "#Add the number 1 at the start of x\n", + "# e.g.: If x is [3,2,5,7,5,...], new x should be [1,3,2,5,7,5,...]\n", + "#################################\n", + "\n", + "X = np.insert(X,0,1)\n", + "\n", + "#################################\n", + "\n", + "#Create vector W of shape (785,10) whose values follow a normal distribution with mean=0 and standard dev=0.01\n", + "#################################\n", + "\n", + "W=np.random.normal(0,0.01,size = (785,10))\n", + "\n", + "#################################\n", + "\n", + "#Multiply the 2 matrices W and x. (Keep in mind the shape of the two)\n", + "#################################\n", + "\n", + "np.matmul(X,W) \n", + "\n", + "#################################\n" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "#Load the Iris.csv file into numpy array 'data' and shuffle the data.(The data array should contain rows in random order)\n", + "#################################\n", + "\n", + "data = np.genfromtxt('Iris.csv',delimiter=',')\n", + "np.random.shuffle(data) \n", + "\n", + "#################################\n", + "\n", + "\n", + "#Create a numpy array X that contains the first 4 columns of data. Keep the last column of data in numpy array y.\n", + "#################################\n", + "\n", + "X=np.array(data[:,0:4])\n", + "Y=np.array(data[:,4])\n", + "\n", + "#################################\n" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[5.7 2.9 4.2 1.3 1. ]\n", + " [6.1 2.9 4.7 1.4 1. ]\n", + " [4.6 3.6 1. 0.2 0. ]\n", + " [6.7 3.1 4.4 1.4 1. ]\n", + " [5. 3. 1.6 0.2 0. ]\n", + " [6. 2.2 5. 1.5 2. ]\n", + " [6.7 3.3 5.7 2.1 2. ]\n", + " [6.1 2.6 5.6 1.4 2. ]\n", + " [5.4 3.4 1.5 0.4 0. ]\n", + " [5.4 3. 4.5 1.5 1. ]]\n", + "[[5.7 2.5 5. 2. 2. ]\n", + " [6.3 2.5 4.9 1.5 1. ]\n", + " [4.9 3. 1.4 0.2 0. ]\n", + " [5. 2. 3.5 1. 1. ]\n", + " [5.5 2.6 4.4 1.2 1. ]\n", + " [6. 2.2 4. 1. 1. ]\n", + " [5.9 3. 5.1 1.8 2. ]\n", + " [6.1 3. 4.9 1.8 2. ]\n", + " [4.8 3.4 1.9 0.2 0. ]\n", + " [6.2 3.4 5.4 2.3 2. ]]\n", + "[[6. 2.2 5. 1.5]\n", + " [6.7 3.3 5.7 2.1]\n", + " [6.1 2.6 5.6 1.4]\n", + " [6.4 2.8 5.6 2.2]\n", + " [7.7 3. 6.1 2.3]\n", + " [7.7 3.8 6.7 2.2]\n", + " [6.7 3.3 5.7 2.5]\n", + " [5.6 2.8 4.9 2. ]\n", + " [6.9 3.2 5.7 2.3]\n", + " [7.2 3. 5.8 1.6]\n", + " [5.8 2.7 5.1 1.9]\n", + " [6.7 3. 5.2 2.3]\n", + " [6.3 2.7 4.9 1.8]\n", + " [6.5 3. 5.5 1.8]\n", + " [6.4 3.1 5.5 1.8]\n", + " [6.9 3.1 5.4 2.1]\n", + " [7.7 2.6 6.9 2.3]\n", + " [6.9 3.1 5.1 2.3]\n", + " [6.4 2.8 5.6 2.1]\n", + " [5.8 2.8 5.1 2.4]\n", + " [7.2 3.6 6.1 2.5]\n", + " [6.8 3.2 5.9 2.3]\n", + " [6.3 3.4 5.6 2.4]\n", + " [6.5 3. 5.2 2. ]\n", + " [6.3 3.3 6. 2.5]\n", + " [6.2 2.8 4.8 1.8]\n", + " [6.3 2.5 5. 1.9]\n", + " [7.4 2.8 6.1 1.9]\n", + " [6.3 2.8 5.1 1.5]\n", + " [6.3 2.9 5.6 1.8]\n", + " [7.3 2.9 6.3 1.8]\n", + " [6.5 3.2 5.1 2. ]\n", + " [6.5 3. 5.8 2.2]\n", + " [6.4 3.2 5.3 2.3]\n", + " [6.4 2.7 5.3 1.9]\n", + " [6.8 3. 5.5 2.1]\n", + " [7.7 2.8 6.7 2. ]\n", + " [7.6 3. 6.6 2.1]\n", + " [5.8 2.7 5.1 1.9]\n", + " [7.2 3.2 6. 1.8]\n", + " [6.7 2.5 5.8 1.8]\n", + " [4.9 2.5 4.5 1.7]\n", + " [7.1 3. 5.9 2.1]\n", + " [7.9 3.8 6.4 2. ]\n", + " [6. 3. 4.8 1.8]\n", + " [6.7 3.1 5.6 2.4]\n", + " [5.7 2.5 5. 2. ]\n", + " [5.9 3. 5.1 1.8]\n", + " [6.1 3. 4.9 1.8]\n", + " [6.2 3.4 5.4 2.3]]\n" + ] + } + ], + "source": [ + "# Print the following:\n", + "# 1) First 10 values of data\n", + "# 2) Last 10 values of data\n", + "# 3) All rows of X whose corresponding value in y is 2\n", + "\n", + "#################################\n", + "\n", + "print(data[0:10])\n", + "print(data[-10:]) \n", + "print(X[Y==2.0])\n", + "\n", + "#################################" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "# Create a numpy array y1 of same length as y and number of columns 3. \n", + "# Values of y1 are such that,\n", + "# If y contains 0, y1 should have (1,0,0)\n", + "# If y contains 1, y1 should have (0,1,0)\n", + "# If y contains 2, y1 should have (0,0,1)\n", + "# This type of encoding is known as one-hot encoding\n", + "#################################\n", + "\n", + "length = int(data.size)//5\n", + "y1 = np.zeros([length,3])\n", + "row=0\n", + "for num in Y:\n", + " col = int(num)\n", + " y1[row][col] = 1\n", + " row+=1\n", + " \n", + "#################################" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1, 32, 64, 3)" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A=np.random.randint(100,size=(32,64,3))\n", + "# Convert A into shape (1,32,64,3) without using np.reshape()\n", + "#################################\n", + "\n", + "A=np.array([A])\n", + "A.shape\n", + "\n", + "#################################" + ] + } + ], + "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.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/python-assn/assn-03/Omkar_Rajebhosale-03.ipynb b/python-assn/assn-03/Omkar_Rajebhosale-03.ipynb new file mode 100644 index 0000000..f457500 --- /dev/null +++ b/python-assn/assn-03/Omkar_Rajebhosale-03.ipynb @@ -0,0 +1,2228 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Using Pandas, Matplotlib and Scikit-Learn**\n", + "\n", + "NOTE: SAVE FILE BEFORE ATTEMPTING.\n", + "\n", + "Since the outputs will get cleared as you run cells. Take screenshots to compare answers to expected answers." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Using Pandas**\n", + "\n", + "We start out by practicing how to handle data given to us. The rows in any dataset are called tuples or instances and the columns are the features with one of the columns being the label (there may also not be a label if it is an Unsupervised learning task). \n", + "\n", + "Storing this data as a list of lists might be cumbersome and difficult depending on the complexity and size of the data.\n", + "\n", + "Pandas offers a data structure called a DataFrame, which makes it easy to handle data and visualise the intricacies of it.\n", + "\n", + "In this example we'll try to handle and analyse the Iris dataset and build a simple model for learning it using Scikit-Learn. The problem is to look at a few features of the data (sepal length, sepal width, etc.) and determine which of the three given flowers (here called 0, 1 and 2) are we looking at." + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [], + "source": [ + "# Just to load the data. Don't worry about scikit-learn for now.\n", + "from sklearn.datasets import load_iris\n", + "data = load_iris()" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[5.1, 3.5, 1.4, 0.2],\n", + " [4.9, 3. , 1.4, 0.2],\n", + " [4.7, 3.2, 1.3, 0.2],\n", + " [4.6, 3.1, 1.5, 0.2],\n", + " [5. , 3.6, 1.4, 0.2],\n", + " [5.4, 3.9, 1.7, 0.4],\n", + " [4.6, 3.4, 1.4, 0.3],\n", + " [5. , 3.4, 1.5, 0.2],\n", + " [4.4, 2.9, 1.4, 0.2],\n", + " [4.9, 3.1, 1.5, 0.1],\n", + " [5.4, 3.7, 1.5, 0.2],\n", + " [4.8, 3.4, 1.6, 0.2],\n", + " [4.8, 3. , 1.4, 0.1],\n", + " [4.3, 3. , 1.1, 0.1],\n", + " [5.8, 4. , 1.2, 0.2],\n", + " [5.7, 4.4, 1.5, 0.4],\n", + " [5.4, 3.9, 1.3, 0.4],\n", + " [5.1, 3.5, 1.4, 0.3],\n", + " [5.7, 3.8, 1.7, 0.3],\n", + " [5.1, 3.8, 1.5, 0.3],\n", + " [5.4, 3.4, 1.7, 0.2],\n", + " [5.1, 3.7, 1.5, 0.4],\n", + " [4.6, 3.6, 1. , 0.2],\n", + " [5.1, 3.3, 1.7, 0.5],\n", + " [4.8, 3.4, 1.9, 0.2],\n", + " [5. , 3. , 1.6, 0.2],\n", + " [5. , 3.4, 1.6, 0.4],\n", + " [5.2, 3.5, 1.5, 0.2],\n", + " [5.2, 3.4, 1.4, 0.2],\n", + " [4.7, 3.2, 1.6, 0.2],\n", + " [4.8, 3.1, 1.6, 0.2],\n", + " [5.4, 3.4, 1.5, 0.4],\n", + " [5.2, 4.1, 1.5, 0.1],\n", + " [5.5, 4.2, 1.4, 0.2],\n", + " [4.9, 3.1, 1.5, 0.1],\n", + " [5. , 3.2, 1.2, 0.2],\n", + " [5.5, 3.5, 1.3, 0.2],\n", + " [4.9, 3.1, 1.5, 0.1],\n", + " [4.4, 3. , 1.3, 0.2],\n", + " [5.1, 3.4, 1.5, 0.2],\n", + " [5. , 3.5, 1.3, 0.3],\n", + " [4.5, 2.3, 1.3, 0.3],\n", + " [4.4, 3.2, 1.3, 0.2],\n", + " [5. , 3.5, 1.6, 0.6],\n", + " [5.1, 3.8, 1.9, 0.4],\n", + " [4.8, 3. , 1.4, 0.3],\n", + " [5.1, 3.8, 1.6, 0.2],\n", + " [4.6, 3.2, 1.4, 0.2],\n", + " [5.3, 3.7, 1.5, 0.2],\n", + " [5. , 3.3, 1.4, 0.2],\n", + " [7. , 3.2, 4.7, 1.4],\n", + " [6.4, 3.2, 4.5, 1.5],\n", + " [6.9, 3.1, 4.9, 1.5],\n", + " [5.5, 2.3, 4. , 1.3],\n", + " [6.5, 2.8, 4.6, 1.5],\n", + " [5.7, 2.8, 4.5, 1.3],\n", + " [6.3, 3.3, 4.7, 1.6],\n", + " [4.9, 2.4, 3.3, 1. ],\n", + " [6.6, 2.9, 4.6, 1.3],\n", + " [5.2, 2.7, 3.9, 1.4],\n", + " [5. , 2. , 3.5, 1. ],\n", + " [5.9, 3. , 4.2, 1.5],\n", + " [6. , 2.2, 4. , 1. ],\n", + " [6.1, 2.9, 4.7, 1.4],\n", + " [5.6, 2.9, 3.6, 1.3],\n", + " [6.7, 3.1, 4.4, 1.4],\n", + " [5.6, 3. , 4.5, 1.5],\n", + " [5.8, 2.7, 4.1, 1. ],\n", + " [6.2, 2.2, 4.5, 1.5],\n", + " [5.6, 2.5, 3.9, 1.1],\n", + " [5.9, 3.2, 4.8, 1.8],\n", + " [6.1, 2.8, 4. , 1.3],\n", + " [6.3, 2.5, 4.9, 1.5],\n", + " [6.1, 2.8, 4.7, 1.2],\n", + " [6.4, 2.9, 4.3, 1.3],\n", + " [6.6, 3. , 4.4, 1.4],\n", + " [6.8, 2.8, 4.8, 1.4],\n", + " [6.7, 3. , 5. , 1.7],\n", + " [6. , 2.9, 4.5, 1.5],\n", + " [5.7, 2.6, 3.5, 1. ],\n", + " [5.5, 2.4, 3.8, 1.1],\n", + " [5.5, 2.4, 3.7, 1. ],\n", + " [5.8, 2.7, 3.9, 1.2],\n", + " [6. , 2.7, 5.1, 1.6],\n", + " [5.4, 3. , 4.5, 1.5],\n", + " [6. , 3.4, 4.5, 1.6],\n", + " [6.7, 3.1, 4.7, 1.5],\n", + " [6.3, 2.3, 4.4, 1.3],\n", + " [5.6, 3. , 4.1, 1.3],\n", + " [5.5, 2.5, 4. , 1.3],\n", + " [5.5, 2.6, 4.4, 1.2],\n", + " [6.1, 3. , 4.6, 1.4],\n", + " [5.8, 2.6, 4. , 1.2],\n", + " [5. , 2.3, 3.3, 1. ],\n", + " [5.6, 2.7, 4.2, 1.3],\n", + " [5.7, 3. , 4.2, 1.2],\n", + " [5.7, 2.9, 4.2, 1.3],\n", + " [6.2, 2.9, 4.3, 1.3],\n", + " [5.1, 2.5, 3. , 1.1],\n", + " [5.7, 2.8, 4.1, 1.3],\n", + " [6.3, 3.3, 6. , 2.5],\n", + " [5.8, 2.7, 5.1, 1.9],\n", + " [7.1, 3. , 5.9, 2.1],\n", + " [6.3, 2.9, 5.6, 1.8],\n", + " [6.5, 3. , 5.8, 2.2],\n", + " [7.6, 3. , 6.6, 2.1],\n", + " [4.9, 2.5, 4.5, 1.7],\n", + " [7.3, 2.9, 6.3, 1.8],\n", + " [6.7, 2.5, 5.8, 1.8],\n", + " [7.2, 3.6, 6.1, 2.5],\n", + " [6.5, 3.2, 5.1, 2. ],\n", + " [6.4, 2.7, 5.3, 1.9],\n", + " [6.8, 3. , 5.5, 2.1],\n", + " [5.7, 2.5, 5. , 2. ],\n", + " [5.8, 2.8, 5.1, 2.4],\n", + " [6.4, 3.2, 5.3, 2.3],\n", + " [6.5, 3. , 5.5, 1.8],\n", + " [7.7, 3.8, 6.7, 2.2],\n", + " [7.7, 2.6, 6.9, 2.3],\n", + " [6. , 2.2, 5. , 1.5],\n", + " [6.9, 3.2, 5.7, 2.3],\n", + " [5.6, 2.8, 4.9, 2. ],\n", + " [7.7, 2.8, 6.7, 2. ],\n", + " [6.3, 2.7, 4.9, 1.8],\n", + " [6.7, 3.3, 5.7, 2.1],\n", + " [7.2, 3.2, 6. , 1.8],\n", + " [6.2, 2.8, 4.8, 1.8],\n", + " [6.1, 3. , 4.9, 1.8],\n", + " [6.4, 2.8, 5.6, 2.1],\n", + " [7.2, 3. , 5.8, 1.6],\n", + " [7.4, 2.8, 6.1, 1.9],\n", + " [7.9, 3.8, 6.4, 2. ],\n", + " [6.4, 2.8, 5.6, 2.2],\n", + " [6.3, 2.8, 5.1, 1.5],\n", + " [6.1, 2.6, 5.6, 1.4],\n", + " [7.7, 3. , 6.1, 2.3],\n", + " [6.3, 3.4, 5.6, 2.4],\n", + " [6.4, 3.1, 5.5, 1.8],\n", + " [6. , 3. , 4.8, 1.8],\n", + " [6.9, 3.1, 5.4, 2.1],\n", + " [6.7, 3.1, 5.6, 2.4],\n", + " [6.9, 3.1, 5.1, 2.3],\n", + " [5.8, 2.7, 5.1, 1.9],\n", + " [6.8, 3.2, 5.9, 2.3],\n", + " [6.7, 3.3, 5.7, 2.5],\n", + " [6.7, 3. , 5.2, 2.3],\n", + " [6.3, 2.5, 5. , 1.9],\n", + " [6.5, 3. , 5.2, 2. ],\n", + " [6.2, 3.4, 5.4, 2.3],\n", + " [5.9, 3. , 5.1, 1.8]])" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# We retrieve the X vector which contains the features of each tuple\n", + "X = data['data']\n", + "\n", + "X" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", + " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", + " 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", + " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", + " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", + " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", + " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# And the y vector which is the numpy array containing the labels.\n", + "y = data['target']\n", + "\n", + "y" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['sepal length (cm)',\n", + " 'sepal width (cm)',\n", + " 'petal length (cm)',\n", + " 'petal width (cm)']" + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Here we store the names of the features for our understanding later.\n", + "headers = data['feature_names']\n", + "\n", + "headers" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There are also a lot of other keys in the dictionary that is the variable ```data```, but we'll not use these.\n", + "\n", + "We'll now make a DataFrame object to handle the data properly." + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "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", + "
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)
05.13.51.40.2
14.93.01.40.2
24.73.21.30.2
34.63.11.50.2
45.03.61.40.2
55.43.91.70.4
64.63.41.40.3
75.03.41.50.2
84.42.91.40.2
94.93.11.50.1
105.43.71.50.2
114.83.41.60.2
124.83.01.40.1
134.33.01.10.1
145.84.01.20.2
155.74.41.50.4
165.43.91.30.4
175.13.51.40.3
185.73.81.70.3
195.13.81.50.3
205.43.41.70.2
215.13.71.50.4
224.63.61.00.2
235.13.31.70.5
244.83.41.90.2
255.03.01.60.2
265.03.41.60.4
275.23.51.50.2
285.23.41.40.2
294.73.21.60.2
...............
1206.93.25.72.3
1215.62.84.92.0
1227.72.86.72.0
1236.32.74.91.8
1246.73.35.72.1
1257.23.26.01.8
1266.22.84.81.8
1276.13.04.91.8
1286.42.85.62.1
1297.23.05.81.6
1307.42.86.11.9
1317.93.86.42.0
1326.42.85.62.2
1336.32.85.11.5
1346.12.65.61.4
1357.73.06.12.3
1366.33.45.62.4
1376.43.15.51.8
1386.03.04.81.8
1396.93.15.42.1
1406.73.15.62.4
1416.93.15.12.3
1425.82.75.11.9
1436.83.25.92.3
1446.73.35.72.5
1456.73.05.22.3
1466.32.55.01.9
1476.53.05.22.0
1486.23.45.42.3
1495.93.05.11.8
\n", + "

150 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)\n", + "0 5.1 3.5 1.4 0.2\n", + "1 4.9 3.0 1.4 0.2\n", + "2 4.7 3.2 1.3 0.2\n", + "3 4.6 3.1 1.5 0.2\n", + "4 5.0 3.6 1.4 0.2\n", + "5 5.4 3.9 1.7 0.4\n", + "6 4.6 3.4 1.4 0.3\n", + "7 5.0 3.4 1.5 0.2\n", + "8 4.4 2.9 1.4 0.2\n", + "9 4.9 3.1 1.5 0.1\n", + "10 5.4 3.7 1.5 0.2\n", + "11 4.8 3.4 1.6 0.2\n", + "12 4.8 3.0 1.4 0.1\n", + "13 4.3 3.0 1.1 0.1\n", + "14 5.8 4.0 1.2 0.2\n", + "15 5.7 4.4 1.5 0.4\n", + "16 5.4 3.9 1.3 0.4\n", + "17 5.1 3.5 1.4 0.3\n", + "18 5.7 3.8 1.7 0.3\n", + "19 5.1 3.8 1.5 0.3\n", + "20 5.4 3.4 1.7 0.2\n", + "21 5.1 3.7 1.5 0.4\n", + "22 4.6 3.6 1.0 0.2\n", + "23 5.1 3.3 1.7 0.5\n", + "24 4.8 3.4 1.9 0.2\n", + "25 5.0 3.0 1.6 0.2\n", + "26 5.0 3.4 1.6 0.4\n", + "27 5.2 3.5 1.5 0.2\n", + "28 5.2 3.4 1.4 0.2\n", + "29 4.7 3.2 1.6 0.2\n", + ".. ... ... ... ...\n", + "120 6.9 3.2 5.7 2.3\n", + "121 5.6 2.8 4.9 2.0\n", + "122 7.7 2.8 6.7 2.0\n", + "123 6.3 2.7 4.9 1.8\n", + "124 6.7 3.3 5.7 2.1\n", + "125 7.2 3.2 6.0 1.8\n", + "126 6.2 2.8 4.8 1.8\n", + "127 6.1 3.0 4.9 1.8\n", + "128 6.4 2.8 5.6 2.1\n", + "129 7.2 3.0 5.8 1.6\n", + "130 7.4 2.8 6.1 1.9\n", + "131 7.9 3.8 6.4 2.0\n", + "132 6.4 2.8 5.6 2.2\n", + "133 6.3 2.8 5.1 1.5\n", + "134 6.1 2.6 5.6 1.4\n", + "135 7.7 3.0 6.1 2.3\n", + "136 6.3 3.4 5.6 2.4\n", + "137 6.4 3.1 5.5 1.8\n", + "138 6.0 3.0 4.8 1.8\n", + "139 6.9 3.1 5.4 2.1\n", + "140 6.7 3.1 5.6 2.4\n", + "141 6.9 3.1 5.1 2.3\n", + "142 5.8 2.7 5.1 1.9\n", + "143 6.8 3.2 5.9 2.3\n", + "144 6.7 3.3 5.7 2.5\n", + "145 6.7 3.0 5.2 2.3\n", + "146 6.3 2.5 5.0 1.9\n", + "147 6.5 3.0 5.2 2.0\n", + "148 6.2 3.4 5.4 2.3\n", + "149 5.9 3.0 5.1 1.8\n", + "\n", + "[150 rows x 4 columns]" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "df = pd.DataFrame(X, columns=headers)\n", + "\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This will give you a very user-friendly version of the data which you can manipulate using the methods in ```DataFrame```.\n", + "\n", + "The advantage of using a DataFrame over a list of lists or any other Python data structure is that it is much more versatile and easy to use." + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "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", + "
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)
05.13.51.40.2
14.93.01.40.2
24.73.21.30.2
34.63.11.50.2
45.03.61.40.2
55.43.91.70.4
64.63.41.40.3
75.03.41.50.2
84.42.91.40.2
94.93.11.50.1
\n", + "
" + ], + "text/plain": [ + " sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)\n", + "0 5.1 3.5 1.4 0.2\n", + "1 4.9 3.0 1.4 0.2\n", + "2 4.7 3.2 1.3 0.2\n", + "3 4.6 3.1 1.5 0.2\n", + "4 5.0 3.6 1.4 0.2\n", + "5 5.4 3.9 1.7 0.4\n", + "6 4.6 3.4 1.4 0.3\n", + "7 5.0 3.4 1.5 0.2\n", + "8 4.4 2.9 1.4 0.2\n", + "9 4.9 3.1 1.5 0.1" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Return the first 10 rows in df\n", + "df[0:10]" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "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", + "
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)
1406.73.15.62.4
1416.93.15.12.3
1425.82.75.11.9
1436.83.25.92.3
1446.73.35.72.5
1456.73.05.22.3
1466.32.55.01.9
1476.53.05.22.0
1486.23.45.42.3
1495.93.05.11.8
\n", + "
" + ], + "text/plain": [ + " sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)\n", + "140 6.7 3.1 5.6 2.4\n", + "141 6.9 3.1 5.1 2.3\n", + "142 5.8 2.7 5.1 1.9\n", + "143 6.8 3.2 5.9 2.3\n", + "144 6.7 3.3 5.7 2.5\n", + "145 6.7 3.0 5.2 2.3\n", + "146 6.3 2.5 5.0 1.9\n", + "147 6.5 3.0 5.2 2.0\n", + "148 6.2 3.4 5.4 2.3\n", + "149 5.9 3.0 5.1 1.8" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Return the last 10 rows in df\n", + "df[-10:]" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(150, 4)" + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get to know the shape of the data\n", + "df.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This tells us there are 150 rows and 4 columns in ```df```." + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "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", + "
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)
count150.000000150.000000150.000000150.000000
mean5.8433333.0540003.7586671.198667
std0.8280660.4335941.7644200.763161
min4.3000002.0000001.0000000.100000
25%5.1000002.8000001.6000000.300000
50%5.8000003.0000004.3500001.300000
75%6.4000003.3000005.1000001.800000
max7.9000004.4000006.9000002.500000
\n", + "
" + ], + "text/plain": [ + " sepal length (cm) sepal width (cm) petal length (cm) \\\n", + "count 150.000000 150.000000 150.000000 \n", + "mean 5.843333 3.054000 3.758667 \n", + "std 0.828066 0.433594 1.764420 \n", + "min 4.300000 2.000000 1.000000 \n", + "25% 5.100000 2.800000 1.600000 \n", + "50% 5.800000 3.000000 4.350000 \n", + "75% 6.400000 3.300000 5.100000 \n", + "max 7.900000 4.400000 6.900000 \n", + "\n", + " petal width (cm) \n", + "count 150.000000 \n", + "mean 1.198667 \n", + "std 0.763161 \n", + "min 0.100000 \n", + "25% 0.300000 \n", + "50% 1.300000 \n", + "75% 1.800000 \n", + "max 2.500000 " + ] + }, + "execution_count": 80, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get a more detailed description of the dataset\n", + "df.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This gives us the statistics of each of features in detail. ```count``` is the number of values in that feature, ```mean``` and ```std``` are the mean and standard deviation and the other values are the minimum, maximum and values for each of the quartiles (1st, 2nd and 3rd).\n", + "\n", + "Other methods:" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 5.1\n", + "1 4.9\n", + "2 4.7\n", + "3 4.6\n", + "4 5.0\n", + "5 5.4\n", + "6 4.6\n", + "7 5.0\n", + "8 4.4\n", + "9 4.9\n", + "10 5.4\n", + "11 4.8\n", + "12 4.8\n", + "13 4.3\n", + "14 5.8\n", + "15 5.7\n", + "16 5.4\n", + "17 5.1\n", + "18 5.7\n", + "19 5.1\n", + "20 5.4\n", + "21 5.1\n", + "22 4.6\n", + "23 5.1\n", + "24 4.8\n", + "25 5.0\n", + "26 5.0\n", + "27 5.2\n", + "28 5.2\n", + "29 4.7\n", + " ... \n", + "120 6.9\n", + "121 5.6\n", + "122 7.7\n", + "123 6.3\n", + "124 6.7\n", + "125 7.2\n", + "126 6.2\n", + "127 6.1\n", + "128 6.4\n", + "129 7.2\n", + "130 7.4\n", + "131 7.9\n", + "132 6.4\n", + "133 6.3\n", + "134 6.1\n", + "135 7.7\n", + "136 6.3\n", + "137 6.4\n", + "138 6.0\n", + "139 6.9\n", + "140 6.7\n", + "141 6.9\n", + "142 5.8\n", + "143 6.8\n", + "144 6.7\n", + "145 6.7\n", + "146 6.3\n", + "147 6.5\n", + "148 6.2\n", + "149 5.9\n", + "Name: sepal length (cm), Length: 150, dtype: float64" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Retrieve only sepal_length from df\n", + "df['sepal length (cm)']" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "sepal length (cm) 5.0\n", + "sepal width (cm) 3.6\n", + "petal length (cm) 1.4\n", + "petal width (cm) 0.2\n", + "Name: 4, dtype: float64" + ] + }, + "execution_count": 82, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Return 5th row of df\n", + "df.iloc[4]" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1.4" + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Return petal length of 5th row of df\n", + "df.iloc[4,2]" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "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", + "
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)
414.52.31.30.3
535.52.34.01.3
546.52.84.61.5
555.72.84.51.3
574.92.43.31.0
595.22.73.91.4
605.02.03.51.0
626.02.24.01.0
675.82.74.11.0
686.22.24.51.5
695.62.53.91.1
716.12.84.01.3
726.32.54.91.5
736.12.84.71.2
766.82.84.81.4
795.72.63.51.0
805.52.43.81.1
815.52.43.71.0
825.82.73.91.2
836.02.75.11.6
876.32.34.41.3
895.52.54.01.3
905.52.64.41.2
925.82.64.01.2
935.02.33.31.0
945.62.74.21.3
985.12.53.01.1
995.72.84.11.3
1015.82.75.11.9
1064.92.54.51.7
1086.72.55.81.8
1116.42.75.31.9
1135.72.55.02.0
1145.82.85.12.4
1187.72.66.92.3
1196.02.25.01.5
1215.62.84.92.0
1227.72.86.72.0
1236.32.74.91.8
1266.22.84.81.8
1286.42.85.62.1
1307.42.86.11.9
1326.42.85.62.2
1336.32.85.11.5
1346.12.65.61.4
1425.82.75.11.9
1466.32.55.01.9
\n", + "
" + ], + "text/plain": [ + " sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)\n", + "41 4.5 2.3 1.3 0.3\n", + "53 5.5 2.3 4.0 1.3\n", + "54 6.5 2.8 4.6 1.5\n", + "55 5.7 2.8 4.5 1.3\n", + "57 4.9 2.4 3.3 1.0\n", + "59 5.2 2.7 3.9 1.4\n", + "60 5.0 2.0 3.5 1.0\n", + "62 6.0 2.2 4.0 1.0\n", + "67 5.8 2.7 4.1 1.0\n", + "68 6.2 2.2 4.5 1.5\n", + "69 5.6 2.5 3.9 1.1\n", + "71 6.1 2.8 4.0 1.3\n", + "72 6.3 2.5 4.9 1.5\n", + "73 6.1 2.8 4.7 1.2\n", + "76 6.8 2.8 4.8 1.4\n", + "79 5.7 2.6 3.5 1.0\n", + "80 5.5 2.4 3.8 1.1\n", + "81 5.5 2.4 3.7 1.0\n", + "82 5.8 2.7 3.9 1.2\n", + "83 6.0 2.7 5.1 1.6\n", + "87 6.3 2.3 4.4 1.3\n", + "89 5.5 2.5 4.0 1.3\n", + "90 5.5 2.6 4.4 1.2\n", + "92 5.8 2.6 4.0 1.2\n", + "93 5.0 2.3 3.3 1.0\n", + "94 5.6 2.7 4.2 1.3\n", + "98 5.1 2.5 3.0 1.1\n", + "99 5.7 2.8 4.1 1.3\n", + "101 5.8 2.7 5.1 1.9\n", + "106 4.9 2.5 4.5 1.7\n", + "108 6.7 2.5 5.8 1.8\n", + "111 6.4 2.7 5.3 1.9\n", + "113 5.7 2.5 5.0 2.0\n", + "114 5.8 2.8 5.1 2.4\n", + "118 7.7 2.6 6.9 2.3\n", + "119 6.0 2.2 5.0 1.5\n", + "121 5.6 2.8 4.9 2.0\n", + "122 7.7 2.8 6.7 2.0\n", + "123 6.3 2.7 4.9 1.8\n", + "126 6.2 2.8 4.8 1.8\n", + "128 6.4 2.8 5.6 2.1\n", + "130 7.4 2.8 6.1 1.9\n", + "132 6.4 2.8 5.6 2.2\n", + "133 6.3 2.8 5.1 1.5\n", + "134 6.1 2.6 5.6 1.4\n", + "142 5.8 2.7 5.1 1.9\n", + "146 6.3 2.5 5.0 1.9" + ] + }, + "execution_count": 84, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Return all instances in df where sepal width is less than 2.9 and store it in a different DataFrame, df1\n", + "df1=df.loc[df['sepal width (cm)'] < 2.9]\n", + "df1" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "sepal length (cm) 5.843333\n", + "sepal width (cm) 3.054000\n", + "petal length (cm) 3.758667\n", + "petal width (cm) 1.198667\n", + "dtype: float64" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get mean of each column in df\n", + "# Hint: use numpy.mean\n", + "import numpy as np\n", + "np.mean(df)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "While we can always get the mean using ```df.describe()```, ```df.apply()``` can be used to apply any function to each column, such as ```np.sum```, ```np.max``` and so on." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Using Matplotlib**\n", + "\n", + "It is important to visualise the data we have so we can get useful inferences from it, such as by plotting one feature against another. If we can guess beforehand which features are more likely to decide the value of the target variable, we'll be able to create a better model accordingly.\n", + "\n", + "```matplotlib.pyplot``` is the library for creating 2D graphs in Python. It mimics the functions used in Matlab, which is a much more comprehensive tool for a wide range of experimental purposes." + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "# Only for jupyter-notebooks; don't bother about this line elsewhere.\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll try to plot the features from the Iris dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [], + "source": [ + "sl = df['sepal length (cm)']" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEKCAYAAAAB0GKPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3XucXHV9//HXm01CuoIhkG1LEnLRBsqGQkLWIIGa8EuAoBQo6o+k2EYuzY8gUutPqRQpFEt/Wn20VqRCKoiVFCxXI1YuIjcLAhuJEAKBgBDW0LIECOFmLnx+f5wzyexkdue72Zmd2ez7+Xicx8z5fr/nez7zndn57LnMOYoIzMzMKtml3gGYmdnA4IRhZmZJnDDMzCyJE4aZmSVxwjAzsyROGGZmlsQJw8zMkjhhmJlZEicMMzNLMqTeAVTTqFGjYsKECfUOw8xswFi2bNnLEdGS0nanShgTJkygvb293mGYmQ0Ykp5PbetdUmZmlsQJw8zMkjhhmJlZEicMMzNL4oRhZmZJnDDMzCxJzRKGpH0k3SXpCUmPS/qLMm0k6RuSVkt6VNLBRXULJD2dTwtqFaeZmaWp5RbGZuD/RsT+wAeBT0lqLWlzDDApnxYC3wKQtCdwAXAIMB24QNLIGsa6U1iyBCZMgF12yR6XLKl3RLVT6bWmjMWcOSBtm+bM6X0fZ54JQ4Zkyw8Zks1Xsx5g5MiucY4s+UsYM6Zr/Zgx2/cxeXLXNpMnb9+mJynrqPRaKo13iv54X6vxd5TSR1/fk7r8vUdEv0zAD4AjS8ouB+YXza8C9gbmA5d31667adq0aTFYXX11RHNzBGybmpuz8p1NpdeaMhazZ3etL0yzZ6f3sWhR+T4WLapOfUTEHnuUb7PHHln96NHl60eP3tZHa2v5Nq2taeOdso5Kr6XSeKfoj/e1Gn9HKX309T2p5t870B6p3+OpDfsyAROANcB7S8pvAQ4vmr8TaAM+B3yxqPx84HOV1jOYE8b48eU/gOPH1zuy6qv0WlPGolx9YUrto6mpfJumpurUp8RZqT61TU9Slq/0WvoaQ+p70tf3tRp/R9WIsxrrSNWbhFHzg96SdgNuAD4TEa+XVpdZJHooL9f/Qkntkto7Ozv7FuwAtmZN78oHskqvtRpjkdLHli3l2xTK+1o/kPTHa+mP97W/Pjt9Va+/95omDElDyZLFkoi4sUyTDmCfovmxwNoeyrcTEYsjoi0i2lpakq6ftVMaN6535QNZpddajbFI6aOpqXybQnlf6weS/ngt/fG+9tdnp6/q9fdey7OkBFwBPBER/9hNs6XAn+VnS30QWB8RLwK3AUdJGpkf7D4qL7NuXHwxNDd3LWtuzsp3NpVea8pYzJ5dvu9CeUofCxeW76NQ3td6gD32KN+mUD56dPn64vLW0lNNKpT31Fd35ZVeS6XxTtEf72s1/o5S+ujre1K3v/fUfVe9nYDDyXYjPQosz6cPA2cAZ+RtBFwKPAM8BrQVLX8qsDqfTklZ52A+hhGRHfAaPz5Cyh53xgPeBZVea8pYlB4gLT0Am9LHokXb9t83NXU9YF2N+ojtD3wXDngXlB6ULj4YXVB6kDX14Gpv1lHptVQa7xT98b5W4+8opY++vifV+nunF8cwlLXfObS1tYUvb25mlk7SsohoS2nrX3qbmVkSJwwzM0vihGFmZkmcMMzMLIkThpmZJXHCMDOzJE4YZmaWxAnDzMySOGGYmVkSJwwzM0vihGFmZkmcMMzMLIkThpmZJXHCMDOzJE4YZmaWZEitOpZ0JXAs8FJEHFCm/vPAyUVx7A+0RMQrkp4DNgBbgM2p12o3M7PaqeUWxlXA3O4qI+KrETElIqYA5wL3RMQrRU2OyOudLMzMGkDNEkZE3Au8UrFhZj5wTa1iMTOzvqv7MQxJzWRbIjcUFQdwu6Rlkrq5vbyZmfWnmh3D6IU/Av6rZHfUYRGxVtJvA3dIejLfYtlOnlAWAowbN6720ZqZDVJ138IA5lGyOyoi1uaPLwE3AdO7WzgiFkdEW0S0tbS01DRQM7PBrK4JQ9IIYCbwg6Ky90javfAcOApYUZ8IzcysoJan1V4DzAJGSeoALgCGAkTEZXmzPwZuj4g3ixb9HeAmSYX4/j0ibq1VnGZmlqZmCSMi5ie0uYrs9NvismeBg2oTlZmZ7ahGOIZhZmYDgBOGmZklccIwM7MkThhmZpbECcPMzJI4YZiZWRInDDMzS+KEYWZmSZwwzMwsiROGmZklccIwM7MkThhmZpbECcPMzJI4YZiZWRInDDMzS+KEYWZmSWqWMCRdKeklSWVvrypplqT1kpbn098U1c2VtErSaklfqFWMZmaWrpZbGFcBcyu0uS8ipuTTRQCSmoBLgWOAVmC+pNYaxmlmZglqljAi4l7glR1YdDqwOiKejYiNwLXA8VUNzszMeq3exzAOlfRLST+WNDkvGwO8UNSmIy8rS9JCSe2S2js7O2sZq5nZoFbPhPELYHxEHARcAtycl6tM2+iuk4hYHBFtEdHW0tJSgzDNzAzqmDAi4vWIeCN//p/AUEmjyLYo9ilqOhZYW4cQzcysSN0ShqTflaT8+fQ8lnXAw8AkSRMlDQPmAUvrFaeZmWWG1KpjSdcAs4BRkjqAC4ChABFxGfAxYJGkzcDbwLyICGCzpLOA24Am4MqIeLxWcZqZWRpl39E7h7a2tmhvb693GGZmA4akZRHRltK23mdJmZnZAOGEYWZmSZwwzMwsiROGmZklccIwM7MkThhmZpbECcPMzJI4YZiZWRInDDMzS+KEYWZmSZwwzMwsiROGmZklccIwM7MkThhmZpbECcPMzJLULGFIulLSS5JWdFN/sqRH8+l+SQcV1T0n6TFJyyX5BhdmZg2gllsYVwFze6j/FTAzIg4EvgQsLqk/IiKmpN7Yw8zMaqtmt2iNiHslTeih/v6i2Z8DY2sVi5mZ9V2jHMM4Dfhx0XwAt0taJmlhnWIyM7MiNdvCSCXpCLKEcXhR8WERsVbSbwN3SHoyIu7tZvmFwEKAcePG1TxeM7PBqq5bGJIOBL4NHB8R6wrlEbE2f3wJuAmY3l0fEbE4Itoioq2lpaXWIZuZDVp1SxiSxgE3An8aEU8Vlb9H0u6F58BRQNkzrczMrP/UbJeUpGuAWcAoSR3ABcBQgIi4DPgbYC/gXyQBbM7PiPod4Ka8bAjw7xFxa63iNDOzNLU8S2p+hfrTgdPLlD8LHLT9EmZmVk+NcpaUmZk1OCcMMzNL4oRhZmZJnDDMzCyJE4aZmSVxwjAzsyQ9JgxJTZJ+0l/BmJlZ4+oxYUTEFuAtSSP6KR4zM2tQKT/cewd4TNIdwJuFwog4u2ZRmZlZw0lJGD/KJzMzG8QqJoyI+K6k3wLGRcSqfojJzMwaUMWzpCT9EbAcuDWfnyJpaa0DMzOzxpJyWu2FZPejeA0gIpYDE2sYk5mZNaCUhLE5ItaXlEUtgjEzs8aVctB7haQ/AZokTQLOBu6vbVhmZtZoUrYwPg1MBn4DXAOsBz6T0rmkKyW9JKnsHfOU+Yak1ZIelXRwUd0CSU/n04KU9ZmZWe2kJIzfjYjzIuID+b2zvxgR7yT2fxUwt4f6Y4BJ+bQQ+BaApD3J7tB3CNnxkwskjUxc56C1ZAlMmAC77JI9LlnStf7MM2HIEJCyxzPP7H0fleqrEeeYMVmMhWnMmO37qNQmpY85c7q2mTOna33KeE2e3LWPyZN7V5+yjmrE2dfPRqUYUtaR8tmpxufLaigiepyAe4FngGuBM4E/qLRMyfITgBXd1F0OzC+aXwXsDcwHLu+uXXfTtGnTYrC6+uqI5uYI2DY1N2flERGLFnWtK0yLFqX3Uam+GnGOHl0+ztGjt/VRqU1KH7Nnl28ze3b6eLW2lm/T2ppWn7KOasTZ189GpRiq9dmpxufLeg9oj9Tv86RGMAw4DDgPWAO8kryCnhPGLcDhRfN3Am3A54AvFpWfD3yu0roGc8IYP778H/X48Vl9U1P5+qam9D4q1VcjznJ1hamgUptq9JEyXn2NoxrrqMb7WqmPlPGsxmenGp8v673eJIyKB70lHQ78YT7tkX/J37cDGzNluy9TFj2Ul4tvIdnuLMaNG1elsAaeNWt6Lt+ypXx9cXmlPirVp6hGH/0hZbwaYR3VeF+rEUc1PjsD5bMxmKUcw7gHOAFYDMyKiDMj4poqrb8D2Kdofiywtofy7UTE4siOrbS1tLRUKayBp7tcWShvaipfX1xeqY9K9Smq0Ud/SBmvRlhHNd7XasRRjc/OQPlsDGYpCWMv4CLgUOBWST+R9KUqrX8p8Gf52VIfBNZHxIvAbcBRkkbmB7uPysusGxdfDM3NXcuam7NygIULyy9XXF6pj0r11Yhz9OjyyxWXV2qT0sfs2eXbFMpTxqu1tXybQnml+pR1VCPOvn42KsWQso6Uz041Pl9WYyn7rYD9gTOAJcCvgHsSl7sGeBHYRLbVcFrezxl5vYBLyQ6qPwa0FS17KrA6n05JWd9gPoYRkR0cHD8+QsoeSw8WLlq0bX91U1PXA6OpfVSqr0acpQetiw9Wp7ZJ6aP0YG7xQdyItPEqPbBdOKCdWp+yjmrE2dfPRqUYUtaR8tmpxufLeodeHMNQ1r57kp4hO3vpZ2THLh6MiI1Vy1hV1NbWFu3t7fUOw8xswJC0LCLaUtqm/NJ7UkS828eYzMxsgEs5hjFa0k35L7b/R9INksbWPDIzM2soKQnjO2QHp0cDY4Af5mVmZjaIpCSMloj4TkRszqergMF7/qqZ2SCVkjBelvQJSU359AlgXa0DMzOzxpKSME4F/jfw32SnyH4sLzMzs0Ek5Z7ea4Dj+iEWMzNrYN0mDEnf6GnBiDi7+uGYmVmj6mkL40Syq9OOBF7tn3DMzKxR9ZQwXgfuJjul9oh+icbMzBpWTwnjMuBW4H1A8fU2RHap8ffVMC4zM2sw3Z4lFRHfiIj9gSsj4n1F08SIcLIwMxtkKp5WGxGL+iMQMzNrbCm/wzAzM3PCMDOzNE4YZmaWpKYJQ9JcSaskrZb0hTL1/yRpeT49Jem1orotRXVLaxmnmZlVlnIDpR0iqYns9qtHkt2e9WFJSyNiZaFNRPxlUftPA1OLung7IqbUKj4zM+udWm5hTAdWR8Sz+S1drwWO76H9fLJ7gJuZWQOqZcIYA7xQNN+Rl21H0nhgIvDTouLhktol/VzSCd2tRNLCvF17Z2dnNeI2M7MyapkwVKYsumk7D7g+IrYUlY3Lb0z+J8DXJb2/3IIRsTgi2iKiraXF93UyM6uVWiaMDmCfovmxwNpu2s6jZHdURKzNH58lu6bV1O0XMzOz/lLLhPEwMEnSREnDyJLCdmc7SdqP7Iq4DxSVjZS0a/58FHAYsLJ0WTMz6z81O0sqIjZLOgu4DWgiuybV45IuAtojopA85gPXRkTx7qr9gcslvUuW1L5cfHaVmZn1P3X9nh7Y2traor29vXJDMzMDQNKy/HhxRf6lt5mZJXHCMDOzJE4YZmaWxAnDzMySOGGYmVkSJwwzM0vihGFmZkmcMMzMLIkThpmZJXHCMDOzJE4YZmaWxAnDzMySOGGYmVkSJwwzM0vihGFmZklqmjAkzZW0StJqSV8oU/9JSZ2SlufT6UV1CyQ9nU8LahmnmZlVVrM77klqAi4FjiS7v/fDkpaWuXPe9yPirJJl9wQuANqAAJbly75aq3jNzKxntdzCmA6sjohnI2IjcC1wfOKyRwN3RMQreZK4A5hbozjNzCxBLRPGGOCFovmOvKzURyU9Kul6Sfv0clkzM+sntUwYKlNWegPxHwITIuJA4CfAd3uxbNZQWiipXVJ7Z2fnDgdrZmY9q2XC6AD2KZofC6wtbhAR6yLiN/nsvwLTUpct6mNxRLRFRFtLS0tVAjczs+3VMmE8DEySNFHSMGAesLS4gaS9i2aPA57In98GHCVppKSRwFF5mZmZ1UnNzpKKiM2SziL7om8CroyIxyVdBLRHxFLgbEnHAZuBV4BP5su+IulLZEkH4KKIeKVWsZqZWWWKKHtoYEBqa2uL9vb2eodhZjZgSFoWEW0pbf1LbzMzS+KEYWZmSZwwzMwsiROGmZklccIwM7MkThhmZpbECcPMzJI4YZiZWRInDDMzS+KEYWZmSZwwzMwsiROGmZklccIwM7MkThhmZpbECcPMzJI4YZiZWZKaJgxJcyWtkrRa0hfK1H9W0kpJj0q6U9L4orotkpbn09LSZc3MrH/V7BatkpqAS4EjgQ7gYUlLI2JlUbNHgLaIeEvSIuAfgJPyurcjYkqt4jMzs96p5RbGdGB1RDwbERuBa4HjixtExF0R8VY++3NgbA3jMTOzPqhlwhgDvFA035GXdec04MdF88MltUv6uaQTultI0sK8XXtnZ2ffIjYzs27VbJcUoDJlUbah9AmgDZhZVDwuItZKeh/wU0mPRcQz23UYsRhYDNDW1la2fzMz67tabmF0APsUzY8F1pY2kjQHOA84LiJ+UyiPiLX547PA3cDUGsZqZmYV1DJhPAxMkjRR0jBgHtDlbCdJU4HLyZLFS0XlIyXtmj8fBRwGFB8sNzOzflazXVIRsVnSWcBtQBNwZUQ8LukioD0ilgJfBXYDrpMEsCYijgP2By6X9C5ZUvtyydlVZmbWzxSx8+z2b2tri/b29nqHYWY2YEhaFhFtKW39S28zM0vihGFmZkmcMMzMLIkThpmZJXHCMDOzJE4YZmaWxAnDzMyS1PJaUmZmAGzatImOjg7eeeedeocyaA0fPpyxY8cydOjQHe7DCcPMaq6jo4Pdd9+dCRMmkF/VwfpRRLBu3To6OjqYOHHiDvfjXVJmVnPvvPMOe+21l5NFnUhir7326vMWnhOGmfULJ4v6qsb4O2GY2aBw8cUXM3nyZA488ECmTJnCgw8+WNX+7777bo499tjk8r66+eabWbly2zVZZ82aRa2vpedjGGa203vggQe45ZZb+MUvfsGuu+7Kyy+/zMaNG+sdVp/cfPPNHHvssbS2tvbbOr2FYWYNZ8kSmDABdtkle1yypG/9vfjii4waNYpdd90VgFGjRjF69GgAli1bxsyZM5k2bRpHH300L774IpD9x/6Zz3yGGTNmcMABB/DQQw8B8NBDDzFjxgymTp3KjBkzWLVqVXIcb775Jqeeeiof+MAHmDp1Kj/4wQ8AuOqqqzjxxBOZO3cukyZN4pxzztm6zBVXXMG+++7LrFmz+PM//3POOuss7r//fpYuXcrnP/95pkyZwjPPZDcjve6665g+fTr77rsv9913X98GrZyI2GmmadOmhZk1npUrVya3vfrqiObmCNg2NTdn5Ttqw4YNcdBBB8WkSZNi0aJFcffdd0dExMaNG+PQQw+Nl156KSIirr322jjllFMiImLmzJlx+umnR0TEPffcE5MnT46IiPXr18emTZsiIuKOO+6IE088MSIi7rrrrvjIRz6y3bqLy88999z43ve+FxERr776akyaNCneeOON+M53vhMTJ06M1157Ld5+++0YN25crFmzJn7961/H+PHjY926dbFx48Y4/PDD41Of+lRERCxYsCCuu+66reuZOXNmfPazn42IiB/96Ecxe/bs7WIp9z6Q3Z8o6Tu2prukJM0F/pnsBkrfjogvl9TvCvwbMA1YB5wUEc/ldecCpwFbgLMj4rZaxmpmjeG88+Ctt7qWvfVWVn7yyTvW52677cayZcu47777uOuuuzjppJP48pe/TFtbGytWrODII48EYMuWLey9995bl5s/fz4AH/rQh3j99dd57bXX2LBhAwsWLODpp59GEps2bUqO4/bbb2fp0qV87WtfA7Kzx9asWQPA7NmzGTFiBACtra08//zzvPzyy8ycOZM999wTgI9//OM89dRT3fZ/4oknAjBt2jSee+655LhS1WyXlKQm4FLgGKAVmC+pdGfbacCrEfF7wD8BX8mXbSW7petkYC7wL3l/NVFp83fOHJC2TXPm9G55gMmTu/YxeXLX+jPPhCFDsrohQ7L5UmPGdO1jzJjerWPYsK71w4Ztv45KbSqNRcp4VHodKWNRSUof1d7tYdWRf38ml6dqampi1qxZ/O3f/i3f/OY3ueGGG4gIJk+ezPLly1m+fDmPPfYYt99++9ZlSs8sksT555/PEUccwYoVK/jhD3/Yq1NVI4Ibbrhh6/rWrFnD/vvvD7B1d1kh1s2bNxO9vMFdoY/C8tVWy2MY04HVEfFsRGwErgWOL2lzPPDd/Pn1wGxl79DxwLUR8ZuI+BWwOu+v6pYsgYUL4fnns43f55/P5gtfHnPmwJ13dl3mzju3fVFWWh6yL+6VJTeYXbly2xf6mWfCt74FW7Zk81u2ZPPFX3JjxsDatV37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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Create a plt.figure object\n", + "fig = plt.figure('Sepal length vs y')\n", + "\n", + "ax0 = fig.add_subplot(111) # This means there's only 1 plot in the whole figure. 211 would mean 2 plots\n", + "# and the top plot is being added. 212 means 2 plots and bottom plot is being added.\n", + "ax0.scatter(sl, y, c = 'b', marker='o', label='Sepal length')\n", + "ax0.set_xlabel('sepal length (cm)')\n", + "ax0.set_ylabel('flower')\n", + "ax0.legend()\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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iIgUrpivFGYDr7n7H929FbgX+HQRxxMRkT4qZlKYCLyVVt6SqIv7MzP7rZk9YGaTixiPiIjkUcykYFnqPFb+F6DG3WuBx4A7s3ZkttjMms2sefv27f0cpoiIJBUzKWwB0v/znwRsTW/g7jvd/VCi+A9AfbaO3H21uze4e8P48eOLEqyIiBQ3KTwHTDOzqWY2ArgQWJvewMyOSysuAl4uYjwiIpJH0a4+cvd2M7sc+BVQBvzE3V8ys78Gmt19LXCFmS0C2oH3gL8sVjwiIpKfucen+Qe2hoYGb25uLnUYIiKDipm1uHtDvnZ6R7OIiESUFEREJKKkICIiESUFERGJKCmIiEhESUFERCJKCiIiElFSEBGRiJKCiIhElBRERCSipCAiIhElBRERiSgpiIhIRElBREQiSgoiIhJRUhARkYiSgoiIRJQUREQkUrTPaBaRD5e2tja2bNnCwYMHSx3Kh1pFRQWTJk2ivLy8V/srKYhIv9iyZQuVlZXU1NRgZqUO50PJ3dm5cydbtmxh6tSpvepD00ci0i8OHjzIuHHjlBBKyMwYN25cn16tKSmISL9RQii9vj4HSgoiMmR8+9vfZsaMGdTW1lJXV8czzzzTr/2vW7eOhQsXFlzfVw8//DCbNm2Kyk1NTTQ3N/f7OOm0piAiQ8KGDRt45JFHeP755xk5ciQ7duygtbW11GH1ycMPP8zChQuZPn36YRtTrxREpCTuugtqamDYsPD1rrv61t8777xDVVUVI0eOBKCqqorjjz8egJaWFhobG6mvr+ecc87hnXfeAcJ/3ldeeSVz587lxBNP5NlnnwXg2WefZe7cuZx88snMnTuXV155peA49u3bxxe/+EVmzZrFySefzM9//nMA7rjjDi644ALOPfdcpk2bxjXXXBPtc9ttt/Gxj32MpqYm/uqv/orLL7+cp59+mrVr13L11VdTV1fH66+/DsD999/P7Nmz+djHPsb69ev7dtCycfdBtdXX17uIDDybNm0quO2aNe6jR7tDahs9OtT31p49e3zmzJk+bdo0X7Jkia9bt87d3VtbW/20007zbdu2ubv7vffe61/4whfc3b2xsdG//OUvu7v7E0884TNmzHB39927d3tbW5u7uz/66KN+wQUXuLv7448/7uedd16XsdPrr7vuOv/pT3/q7u7vv/++T5s2zffu3eu33367T5061Xft2uUHDhzw6upqf/PNN/3tt9/2KVOm+M6dO721tdXPOOMMv+yyy9zd/ZJLLvH7778/GqexsdG/9rWvubv7L37xC1+wYEHWY5HtuQCavYBzrKaPROSwu/562L8/s27//lB/8cW96/OII46gpaWF9evX8/jjj/PZz36W733vezQ0NPDiiy9y1llnAdDR0cFxxx0X7XfRRRcBMH/+fD744AN27drFnj17uOSSS3j11VcxM9ra2gqO49e//jVr167lb//2b4FwVdabb74JwIIFCxg7diwA06dPZ/PmzezYsYPGxkaOOeYYAD7zmc/whz/8odv+L7jgAgDq6+t54403Co6rUEoKInLYJc6RBdcXqqysjKamJpqamjjppJO48847qa+vZ8aMGWzYsCHrPvGrdcyM5cuX84lPfIKHHnqIN954g6ampoJjcHcefPBBTjjhhIz6Z555JpraSsba3t5O+Ce+cMk+kvv3N60piMhhV13ds/pCvPLKK7z66qtReePGjUyZMoUTTjiB7du3R0mhra2Nl156KWp33333AfDUU08xduxYxo4dy+7du5k4cSIQ1gJ64pxzzuHv/u7vopP9Cy+8kLP97NmzeeKJJ3j//fdpb2/nwQcfjH5WWVnJnj17ejR+XykpiMhh9+1vw+jRmXWjR4f63tq7dy+XXHIJ06dPp7a2lk2bNrFq1SpGjBjBAw88wDe+8Q1mzpxJXV0dTz/9dLTf0Ucfzdy5c7n00ku57bbbALjmmmu47rrrOP300+no6OhRHMuXL6etrY3a2lpOPPFEli9fnrP9xIkT+eY3v8mpp57KmWeeyfTp06MppgsvvJDvf//7nHzyydFCc9EVsvAwkDYtNIsMTD1ZaHYPi8pTpribha99WWTurcbGRn/uuecO/8Axe/bscXf3trY2X7hwof/sZz/rU39aaBaRQefii3u/qDzUrFq1iscee4yDBw9y9tlnc/7555csFiUFEfnQWrduXalDAIiuVBoItKYgIiIRJQUREYkoKYiISERJQUREIkoKIjJklJWVUVdXx4knnshnPvMZ9sfvpRHzne98p6B+a2pq2LFjR8H1ffHGG29w9913R+U77riDyy+/vF/HyEVJQURKI357hx7e7iGbUaNGsXHjRl588UVGjBjBrbfemrN9oUnhcIonhcOtqEnBzM41s1fM7DUzuzbLz0ea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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot petal width vs y with blue o's and petal length vs y with red x's\n", + "fig = plt.figure('Petal width vs y,Petal length vs y')\n", + "\n", + "### CODE HERE ###\n", + "ax0 = fig.add_subplot(111)\n", + "pw=df['petal width (cm)']\n", + "pl=df['petal length (cm)']\n", + "ax0.scatter(pw, y, c = 'b', marker='o', label='Sepal length')\n", + "ax0.scatter(pl,y,c='r',marker='x',label='Petal length')\n", + "ax0.set_xlabel('length/width')\n", + "ax0.set_ylabel('flower')\n", + "ax0.legend()\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAEKCAYAAAARnO4WAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3X2UXFWZ7/Hvkw50eE0kyQo2mRCjdjRgSEgLksxASxAUEQV1AYt7B43XKBlRxjsyV1jcQZ3Mi6ALx7nBFY2KY8ZBgiCXi4owNKCJwQSiQCCNZhKIDU0IJoEAMZ0894+qajqdqjq7us45VafO77NWr6R2nTp71yE8feqpZ+9t7o6IiLS+UY0egIiIpEMBX0QkJxTwRURyQgFfRCQnFPBFRHJCAV9EJCcU8EVEckIBX0QkJxTwRURyYnSjBzDUhAkTfOrUqY0ehohIZqxdu/Z5d58YcmxTBfypU6eyZs2aRg9DRCQzzGxz6LFK6YiI5IQCvohITiQW8M1supmtG/Kz08wuT6o/ERGpLrEcvrtvAGYBmFkb8Afg1lrPs2fPHrZs2cKrr74a8wgl1JgxY5g8eTIHHXRQo4ciInVI60vb+cDv3T34y4WSLVu2cMQRRzB16lTMLIGhSTXuzrZt29iyZQtveMMbGj0cEalDWjn8C4EflHvCzBaa2RozW7N169YDnn/11VcZP368gn2DmBnjx4/XJyyRFpB4wDezg4FzgZvLPe/uS929y927Jk4sX0qqYN9Yuv4iB+pf3s+qqavoGdXDqqmr6F/e3+ghRUojpfMe4CF3b/6rISISoH95PxsWbmDfy/sA2L15NxsWbgBg0sWTGjm0qtJI6VxEhXROVixevJjjjjuOmTNnMmvWLFavXh3r+Xt6ejjnnHOC2+t12223sX79+sHH3d3dmvAmUoONV20cDPYl+17ex8arNjZoRGESvcM3s0OBdwGfSLKfJK1atYo77riDhx56iPb2dp5//nn+9Kc/NXpYdbnttts455xzmDFjRqOHIpJJu5/aXVN7s0j0Dt/dX3b38e6+I8l+hoo7r/bMM88wYcIE2tvbAZgwYQIdHR0ArF27ltNOO405c+Zw1lln8cwzzwCFO+bLL7+cuXPncvzxx/Pggw8C8OCDDzJ37lxmz57N3Llz2bBhQ/A4du3axYIFC3j729/O7Nmz+fGPfwzAd7/7Xc4//3ze/e538+Y3v5krrrhi8DXLli2js7OT7u5uPv7xj/OpT32KlStXcvvtt/O5z32OWbNm8fvf/x6Am2++mZNOOonOzk4eeOCBuq6ZSKtrn9JeU3uzaKmZtqW82u7Nu8Ffy6vVE/TPPPNMnn76aTo7O1m0aBH33XcfUJgfcNlll7FixQrWrl3LggULuOqqqwZft2vXLlauXMmSJUtYsGABAG95y1u4//77efjhh/niF7/IlVdeGTyOxYsXc/rpp/PrX/+ae++9l8997nPs2rULgHXr1nHTTTfxyCOPcNNNN/H000/T19fHl770JX71q1/x85//nCeeeAKAuXPncu6553Lttdeybt063vjGNwIwMDDAgw8+yPXXX88XvvCFEV8vkTyYtngaow7dP3yOOnQU0xZPa9CIwjTV4mn1qpZXG+kXKYcffjhr167lgQce4N577+WCCy7gn/7pn+jq6uLRRx/lXe96FwB79+7l9a9//eDrLrroIgBOPfVUdu7cyfbt23nxxRe55JJLePLJJzEz9uzZEzyOu+66i9tvv53rrrsOKJSrPvXUUwDMnz+fsWPHAjBjxgw2b97M888/z2mnncZRRx0FwIc//GF6e3srnv/8888HYM6cOWzatCl4XCJ5NOniSTzznWfYfs/2wbYjTzmyqb+whRYL+Enl1dra2uju7qa7u5u3ve1t3HjjjcyZM4fjjjuOVatWlX3N8FJGM+Pqq6/mne98J7feeiubNm2iu7s7eAzuzi233ML06dP3a1+9evVguqk01oGBAdw9/A3C4DlKrxeRynoX9e4X7AG237Od3kW9dC7pbNCoorVUSieJvNqGDRt48sknBx+vW7eOY489lunTp7N169bBgL9nzx4ee+yxweNuuukmAH7xi18wduxYxo4dy44dOzjmmGOAQu69FmeddRZf//rXBwP5ww8/XPX4k046ifvuu48//vGPDAwMcMsttww+d8QRR/Diiy/W1L+IvKZvaV9N7c2ipQJ+Enm1l156iUsuuYQZM2Ywc+ZM1q9fzzXXXMPBBx/MihUr+Nu//VtOOOEEZs2axcqVKwdf97rXvY65c+fyyU9+kmXLlgFwxRVX8PnPf5558+axd+/emsZx9dVXs2fPHmbOnMnxxx/P1VdfXfX4Y445hiuvvJKTTz6ZM844gxkz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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot sepal length vs petal length for each instance\n", + "fig = plt.figure('Sepal length vs petal length')\n", + "\n", + "### CODE HERE ###\n", + "ax0=fig.add_subplot(111)\n", + "\n", + "ax0.scatter(sl,pl,c='m',marker='o',label='Sepal length')\n", + "ax0.set_xlabel(\"sepal length\")\n", + "ax0.set_ylabel(\"petal length\")\n", + "ax0.legend()\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot sepal length as a line graph for each instance\n", + "# Hint: use numpy.arange() for x axis\n", + "\n", + "fig = plt.figure('Sepal length')\n", + "\n", + "### CODE HERE ###\n", + "import numpy as np\n", + "ax0=fig.add_subplot(111)\n", + "ax0.set_ylabel(\"sepal length\")\n", + "ax0.set_xlabel(\"instance\")\n", + "ax0.plot(sl,color='magenta')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Using Scikit-Learn**\n", + "\n", + "Scikit-Learn offers a variety of classifiers for learning the data and creating a model for it. This task is a classification task and hence a regression method such as Linear Regression cannot be used for it. We'll use Logistic Regression to create a classifier for this data. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before using a model on the data, we will need some data to test the model on. For this, we'll keep some data aside called the 'test set'.\n", + "\n", + "Also, we can have some problems in learning the data if the data is not randomly shuffled and chosen first. (More on this later)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [], + "source": [ + "# Join target variable to dataframe\n", + "### CODE HERE ###\n", + "from sklearn.datasets import load_iris\n", + "import pandas as pd\n", + "data = load_iris()\n", + "X = data['data']\n", + "header=data['feature_names']\n", + "df=pd.DataFrame(X,columns=header)\n", + "header=data['target']\n", + "df2=pd.DataFrame(header,columns=['target'])\n", + "df['target']=df2\n", + "# Randomly shuffle dataframe\n", + "### CODE HERE ###" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", + " intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n", + " penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n", + " verbose=0, warm_start=False)" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "# We divide df into training and testing sets such that the training set is 80% of df and test set is 20%\n", + "train, test = train_test_split(df, test_size=0.2)\n", + "\n", + "y_train = train['target']\n", + "y_test = test['target']\n", + "X_train = train[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']]\n", + "X_test = test[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']]\n", + "\n", + "# Create a classifier\n", + "clf = LogisticRegression()\n", + "# Train it on the training set\n", + "clf.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0, 1, 0, 2, 0, 2, 1, 2, 1, 2, 2, 0, 1, 0, 1, 1, 1, 1, 1, 2, 0, 1,\n", + " 0, 0, 1, 2, 0, 2, 0, 0])" + ] + }, + "execution_count": 94, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Calculate the predictions on the test set\n", + "pred = clf.predict(X_test)\n", + "\n", + "pred" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "execution_count": 95, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.metrics import accuracy_score\n", + "\n", + "# Find the accuracy on the test set\n", + "accuracy_score(pred, y_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since the accuracy is high, we can assume this is a good model we have created. However, there are a lot of factors that decide how relevant the accuracy is to the actual performance of the model. (Again, more on this later!)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Saving data and model**\n", + "\n", + "To save the data, we'll use the csv format, which is quite popular with data scientists since it is easy to read from and write to. \n", + "\n", + "To store the model, we'll use the pickle module in python to save it to disk.\n", + "\n", + "Both of these shall be in the same directory as this." + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dataframe.csv new_Assignment.ipynb Rohan Prabhu_model\r\n", + "model Rohan Prabhu_dataframe.csv Sahil_Jain.ipynb\r\n", + "model.pkl Rohan Prabhu K.ipynb\r\n" + ] + } + ], + "source": [ + "ls" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [], + "source": [ + "import pickle\n", + "\n", + "# Save dataframe to csv\n", + "### CODE HERE ###\n", + "df.to_csv('Omkar_Rajebhosale_dataframe.csv')\n", + "# Save model to model.pkl\n", + "### CODE HERE ###\n", + "pickle_out = open(\"Omkar_Rajebhosale_model\",\"wb\")\n", + "pickle.dump(clf, pickle_out)\n", + "pickle_out.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is recommended you practice these functions to get a good idea of how to create a model for a dataset in Python. Hope you enjoyed it!" + ] + } + ], + "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.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/python-assn/assn-03/Omkar_Rajebhosale_dataframe.csv b/python-assn/assn-03/Omkar_Rajebhosale_dataframe.csv new file mode 100644 index 0000000..819dfde --- /dev/null +++ b/python-assn/assn-03/Omkar_Rajebhosale_dataframe.csv @@ -0,0 +1,151 @@ +,sepal length (cm),sepal width (cm),petal length (cm),petal width (cm),target +0,5.1,3.5,1.4,0.2,0 +1,4.9,3.0,1.4,0.2,0 +2,4.7,3.2,1.3,0.2,0 +3,4.6,3.1,1.5,0.2,0 +4,5.0,3.6,1.4,0.2,0 +5,5.4,3.9,1.7,0.4,0 +6,4.6,3.4,1.4,0.3,0 +7,5.0,3.4,1.5,0.2,0 +8,4.4,2.9,1.4,0.2,0 +9,4.9,3.1,1.5,0.1,0 +10,5.4,3.7,1.5,0.2,0 +11,4.8,3.4,1.6,0.2,0 +12,4.8,3.0,1.4,0.1,0 +13,4.3,3.0,1.1,0.1,0 +14,5.8,4.0,1.2,0.2,0 +15,5.7,4.4,1.5,0.4,0 +16,5.4,3.9,1.3,0.4,0 +17,5.1,3.5,1.4,0.3,0 +18,5.7,3.8,1.7,0.3,0 +19,5.1,3.8,1.5,0.3,0 +20,5.4,3.4,1.7,0.2,0 +21,5.1,3.7,1.5,0.4,0 +22,4.6,3.6,1.0,0.2,0 +23,5.1,3.3,1.7,0.5,0 +24,4.8,3.4,1.9,0.2,0 +25,5.0,3.0,1.6,0.2,0 +26,5.0,3.4,1.6,0.4,0 +27,5.2,3.5,1.5,0.2,0 +28,5.2,3.4,1.4,0.2,0 +29,4.7,3.2,1.6,0.2,0 +30,4.8,3.1,1.6,0.2,0 +31,5.4,3.4,1.5,0.4,0 +32,5.2,4.1,1.5,0.1,0 +33,5.5,4.2,1.4,0.2,0 +34,4.9,3.1,1.5,0.1,0 +35,5.0,3.2,1.2,0.2,0 +36,5.5,3.5,1.3,0.2,0 +37,4.9,3.1,1.5,0.1,0 +38,4.4,3.0,1.3,0.2,0 +39,5.1,3.4,1.5,0.2,0 +40,5.0,3.5,1.3,0.3,0 +41,4.5,2.3,1.3,0.3,0 +42,4.4,3.2,1.3,0.2,0 +43,5.0,3.5,1.6,0.6,0 +44,5.1,3.8,1.9,0.4,0 +45,4.8,3.0,1.4,0.3,0 +46,5.1,3.8,1.6,0.2,0 +47,4.6,3.2,1.4,0.2,0 +48,5.3,3.7,1.5,0.2,0 +49,5.0,3.3,1.4,0.2,0 +50,7.0,3.2,4.7,1.4,1 +51,6.4,3.2,4.5,1.5,1 +52,6.9,3.1,4.9,1.5,1 +53,5.5,2.3,4.0,1.3,1 +54,6.5,2.8,4.6,1.5,1 +55,5.7,2.8,4.5,1.3,1 +56,6.3,3.3,4.7,1.6,1 +57,4.9,2.4,3.3,1.0,1 +58,6.6,2.9,4.6,1.3,1 +59,5.2,2.7,3.9,1.4,1 +60,5.0,2.0,3.5,1.0,1 +61,5.9,3.0,4.2,1.5,1 +62,6.0,2.2,4.0,1.0,1 +63,6.1,2.9,4.7,1.4,1 +64,5.6,2.9,3.6,1.3,1 +65,6.7,3.1,4.4,1.4,1 +66,5.6,3.0,4.5,1.5,1 +67,5.8,2.7,4.1,1.0,1 +68,6.2,2.2,4.5,1.5,1 +69,5.6,2.5,3.9,1.1,1 +70,5.9,3.2,4.8,1.8,1 +71,6.1,2.8,4.0,1.3,1 +72,6.3,2.5,4.9,1.5,1 +73,6.1,2.8,4.7,1.2,1 +74,6.4,2.9,4.3,1.3,1 +75,6.6,3.0,4.4,1.4,1 +76,6.8,2.8,4.8,1.4,1 +77,6.7,3.0,5.0,1.7,1 +78,6.0,2.9,4.5,1.5,1 +79,5.7,2.6,3.5,1.0,1 +80,5.5,2.4,3.8,1.1,1 +81,5.5,2.4,3.7,1.0,1 +82,5.8,2.7,3.9,1.2,1 +83,6.0,2.7,5.1,1.6,1 +84,5.4,3.0,4.5,1.5,1 +85,6.0,3.4,4.5,1.6,1 +86,6.7,3.1,4.7,1.5,1 +87,6.3,2.3,4.4,1.3,1 +88,5.6,3.0,4.1,1.3,1 +89,5.5,2.5,4.0,1.3,1 +90,5.5,2.6,4.4,1.2,1 +91,6.1,3.0,4.6,1.4,1 +92,5.8,2.6,4.0,1.2,1 +93,5.0,2.3,3.3,1.0,1 +94,5.6,2.7,4.2,1.3,1 +95,5.7,3.0,4.2,1.2,1 +96,5.7,2.9,4.2,1.3,1 +97,6.2,2.9,4.3,1.3,1 +98,5.1,2.5,3.0,1.1,1 +99,5.7,2.8,4.1,1.3,1 +100,6.3,3.3,6.0,2.5,2 +101,5.8,2.7,5.1,1.9,2 +102,7.1,3.0,5.9,2.1,2 +103,6.3,2.9,5.6,1.8,2 +104,6.5,3.0,5.8,2.2,2 +105,7.6,3.0,6.6,2.1,2 +106,4.9,2.5,4.5,1.7,2 +107,7.3,2.9,6.3,1.8,2 +108,6.7,2.5,5.8,1.8,2 +109,7.2,3.6,6.1,2.5,2 +110,6.5,3.2,5.1,2.0,2 +111,6.4,2.7,5.3,1.9,2 +112,6.8,3.0,5.5,2.1,2 +113,5.7,2.5,5.0,2.0,2 +114,5.8,2.8,5.1,2.4,2 +115,6.4,3.2,5.3,2.3,2 +116,6.5,3.0,5.5,1.8,2 +117,7.7,3.8,6.7,2.2,2 +118,7.7,2.6,6.9,2.3,2 +119,6.0,2.2,5.0,1.5,2 +120,6.9,3.2,5.7,2.3,2 +121,5.6,2.8,4.9,2.0,2 +122,7.7,2.8,6.7,2.0,2 +123,6.3,2.7,4.9,1.8,2 +124,6.7,3.3,5.7,2.1,2 +125,7.2,3.2,6.0,1.8,2 +126,6.2,2.8,4.8,1.8,2 +127,6.1,3.0,4.9,1.8,2 +128,6.4,2.8,5.6,2.1,2 +129,7.2,3.0,5.8,1.6,2 +130,7.4,2.8,6.1,1.9,2 +131,7.9,3.8,6.4,2.0,2 +132,6.4,2.8,5.6,2.2,2 +133,6.3,2.8,5.1,1.5,2 +134,6.1,2.6,5.6,1.4,2 +135,7.7,3.0,6.1,2.3,2 +136,6.3,3.4,5.6,2.4,2 +137,6.4,3.1,5.5,1.8,2 +138,6.0,3.0,4.8,1.8,2 +139,6.9,3.1,5.4,2.1,2 +140,6.7,3.1,5.6,2.4,2 +141,6.9,3.1,5.1,2.3,2 +142,5.8,2.7,5.1,1.9,2 +143,6.8,3.2,5.9,2.3,2 +144,6.7,3.3,5.7,2.5,2 +145,6.7,3.0,5.2,2.3,2 +146,6.3,2.5,5.0,1.9,2 +147,6.5,3.0,5.2,2.0,2 +148,6.2,3.4,5.4,2.3,2 +149,5.9,3.0,5.1,1.8,2 diff --git a/python-assn/assn-03/Omkar_Rajebhosale_model b/python-assn/assn-03/Omkar_Rajebhosale_model new file mode 100644 index 0000000..ee1c38e Binary files /dev/null and b/python-assn/assn-03/Omkar_Rajebhosale_model differ