From 1851c1c7c21024242c5033930cab9847654dc01a Mon Sep 17 00:00:00 2001 From: SriAish Date: Sat, 26 May 2018 20:36:15 +0530 Subject: [PATCH 1/5] update --- python-assn/assn-01/Assignment1.ipynb | 30 +++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/python-assn/assn-01/Assignment1.ipynb b/python-assn/assn-01/Assignment1.ipynb index 2456c0b..93edfdb 100644 --- a/python-assn/assn-01/Assignment1.ipynb +++ b/python-assn/assn-01/Assignment1.ipynb @@ -29,8 +29,25 @@ "outputs": [], "source": [ "def least_int(num):\n", - " #write your code here\n", - " pass" + " def least_int(num): + + ans = str(num) + y = [] + for i in range(len(ans)): + y.append(ans[i]) + + for i in range(len(y)): + for k in range(len(y)): + if(y[k-1]>y[k] and k!=0): + n = y[k] + y[k] = y[k-1] + y[k-1] = n + + ans = "" + for i in range(len(y)): + ans+=(y[i]) + + print(ans)\n", ] }, { @@ -56,8 +73,13 @@ "outputs": [], "source": [ "def function_a(string1):\n", - " #write your code here\n", - " pass" + " y = string1.split()\n" + " ans = ''\n" + "\n" + " for i in range(len(y)):\n" + " if y[i][0] == 'a':\n" + " ans += y[i][-1]\n" + " print(ans)\n", ] }, { From 1d7a22307a5efbe9be8d537a84340da9e4617e64 Mon Sep 17 00:00:00 2001 From: SriAish <32357005+SriAish@users.noreply.github.com> Date: Sat, 26 May 2018 20:40:59 +0530 Subject: [PATCH 2/5] Update Assignment1.ipynb --- python-assn/assn-01/Assignment1.ipynb | 38 +++++++++++++-------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/python-assn/assn-01/Assignment1.ipynb b/python-assn/assn-01/Assignment1.ipynb index 93edfdb..5e56b3a 100644 --- a/python-assn/assn-01/Assignment1.ipynb +++ b/python-assn/assn-01/Assignment1.ipynb @@ -29,25 +29,25 @@ "outputs": [], "source": [ "def least_int(num):\n", - " def least_int(num): - - ans = str(num) - y = [] - for i in range(len(ans)): - y.append(ans[i]) - - for i in range(len(y)): - for k in range(len(y)): - if(y[k-1]>y[k] and k!=0): - n = y[k] - y[k] = y[k-1] - y[k-1] = n - - ans = "" - for i in range(len(y)): - ans+=(y[i]) - - print(ans)\n", + " def least_int(num):\n" + "\n" + " ans = str(num)\n" + " y = []\n" + " for i in range(len(ans)):\n" + " y.append(ans[i])\n" + "\n" + " for i in range(len(y)):\n" + " for k in range(len(y)):\n" + " if(y[k-1]>y[k] and k!=0):\n" + " n = y[k]\n" + " y[k] = y[k-1]\n" + " y[k-1] = n \n" + "\n" + " ans = '' \n" + " for i in range(len(y)):\n" + " ans+=(y[i])\n" + "\n" + " print(ans)\n", ] }, { From 11dd8cb56f39cad10828221abca7ed7976f757c1 Mon Sep 17 00:00:00 2001 From: SriAish <32357005+SriAish@users.noreply.github.com> Date: Sat, 26 May 2018 20:43:08 +0530 Subject: [PATCH 3/5] Update Assignment1.ipynb --- python-assn/assn-01/Assignment1.ipynb | 50 +++++++++++++-------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/python-assn/assn-01/Assignment1.ipynb b/python-assn/assn-01/Assignment1.ipynb index 5e56b3a..d2628af 100644 --- a/python-assn/assn-01/Assignment1.ipynb +++ b/python-assn/assn-01/Assignment1.ipynb @@ -29,25 +29,25 @@ "outputs": [], "source": [ "def least_int(num):\n", - " def least_int(num):\n" - "\n" - " ans = str(num)\n" - " y = []\n" - " for i in range(len(ans)):\n" - " y.append(ans[i])\n" - "\n" - " for i in range(len(y)):\n" - " for k in range(len(y)):\n" - " if(y[k-1]>y[k] and k!=0):\n" - " n = y[k]\n" - " y[k] = y[k-1]\n" - " y[k-1] = n \n" - "\n" - " ans = '' \n" - " for i in range(len(y)):\n" - " ans+=(y[i])\n" - "\n" - " print(ans)\n", + " def least_int(num):\n", + "\n", + " ans = str(num)\n", + " y = []\n", + " for i in range(len(ans)):\n", + " y.append(ans[i])\n", + "\n", + " for i in range(len(y)):\n", + " for k in range(len(y)):\n", + " if(y[k-1]>y[k] and k!=0):\n", + " n = y[k]\n", + " y[k] = y[k-1]\n", + " y[k-1] = n \n", + "\n", + " ans = '' \n", + " for i in range(len(y)):\n", + " ans+=(y[i])\n", + "\n", + " print(ans)\n" ] }, { @@ -73,12 +73,12 @@ "outputs": [], "source": [ "def function_a(string1):\n", - " y = string1.split()\n" - " ans = ''\n" - "\n" - " for i in range(len(y)):\n" - " if y[i][0] == 'a':\n" - " ans += y[i][-1]\n" + " y = string1.split()\n", + " ans = ''\n", + "\n", + " for i in range(len(y)):\n", + " if y[i][0] == 'a':\n", + " ans += y[i][-1]\n", " print(ans)\n", ] }, From 740981014e8e972ccad77ec9bf5d0c6fd2fb2f04 Mon Sep 17 00:00:00 2001 From: SriAish Date: Sat, 26 May 2018 20:54:14 +0530 Subject: [PATCH 4/5] update --- python-assn/assn-01/Assignment1.ipynb | 30 ++++----------------------- 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/python-assn/assn-01/Assignment1.ipynb b/python-assn/assn-01/Assignment1.ipynb index 93edfdb..2456c0b 100644 --- a/python-assn/assn-01/Assignment1.ipynb +++ b/python-assn/assn-01/Assignment1.ipynb @@ -29,25 +29,8 @@ "outputs": [], "source": [ "def least_int(num):\n", - " def least_int(num): - - ans = str(num) - y = [] - for i in range(len(ans)): - y.append(ans[i]) - - for i in range(len(y)): - for k in range(len(y)): - if(y[k-1]>y[k] and k!=0): - n = y[k] - y[k] = y[k-1] - y[k-1] = n - - ans = "" - for i in range(len(y)): - ans+=(y[i]) - - print(ans)\n", + " #write your code here\n", + " pass" ] }, { @@ -73,13 +56,8 @@ "outputs": [], "source": [ "def function_a(string1):\n", - " y = string1.split()\n" - " ans = ''\n" - "\n" - " for i in range(len(y)):\n" - " if y[i][0] == 'a':\n" - " ans += y[i][-1]\n" - " print(ans)\n", + " #write your code here\n", + " pass" ] }, { From 85b051cd84574f437472484deaa63ac5a95536d7 Mon Sep 17 00:00:00 2001 From: SriAish Date: Mon, 28 May 2018 22:59:00 +0530 Subject: [PATCH 5/5] Assign --- .../assn-01/Aishwarya_Srivastava.ipynb | 504 +++ .../assn-02/Aishwarya_Srivastava.ipynb | 743 +++++ .../assn-03/Aishwarya_Srivastava.ipynb | 2887 +++++++++++++++++ 3 files changed, 4134 insertions(+) create mode 100644 python-assn/assn-01/Aishwarya_Srivastava.ipynb create mode 100644 python-assn/assn-02/Aishwarya_Srivastava.ipynb create mode 100644 python-assn/assn-03/Aishwarya_Srivastava.ipynb diff --git a/python-assn/assn-01/Aishwarya_Srivastava.ipynb b/python-assn/assn-01/Aishwarya_Srivastava.ipynb new file mode 100644 index 0000000..485528e --- /dev/null +++ b/python-assn/assn-01/Aishwarya_Srivastava.ipynb @@ -0,0 +1,504 @@ +{ + "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": [ + { + "data": { + "text/plain": [ + "'23455'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def least_int(num):\n", + "\n", + " ans = str(num)\n", + " y = []\n", + " for i in range(len(ans)):\n", + " y.append(ans[i])\n", + "\n", + " y.sort()\n", + "\n", + " ans = \"\"\n", + " for i in range(len(y)):\n", + " ans+=(y[i])\n", + "\n", + " return ans" + ] + }, + { + "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": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'eed'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def function_a(string1):\n", + " y = string1.split()\n", + " ans = \"\"\n", + "\n", + " for i in range(len(y)):\n", + " if y[i][0] == \"a\":\n", + " ans += y[i][-1]\n", + " return ans" + ] + }, + { + "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": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'ML Pro at Vedang is '" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def remove_dup(mystring):\n", + " l = mystring.split()\n", + " ans = set()\n", + " for i in l:\n", + " ans.add(i)\n", + " fstr = \"\"\n", + " for i in ans:\n", + " fstr += i\n", + " fstr += \" \"\n", + " return fstr" + ] + }, + { + "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": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mystring = '' #give any random string\n", + "mystring == mystring[::-1]" + ] + }, + { + "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": 22, + "metadata": {}, + "outputs": [], + "source": [ + "def list_of_avgs(a):\n", + "\n", + " sum = 0.0\n", + " avg = []\n", + "\n", + " for i in range(len(a)):\n", + " sum += a[i]\n", + "\n", + " avg.append(sum/(i+1))\n", + "\n", + " return avg" + ] + }, + { + "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": 23, + "metadata": {}, + "outputs": [], + "source": [ + "def asc_desc_list(a):\n", + " asc = []\n", + " dec = []\n", + " for i in range(int(len(a)/2)):\n", + " if 2*i < len(a):\n", + " asc.append(a[2*i])\n", + "\n", + " for i in range(int(len(a)/2)):\n", + " if 2*i + 1 < len(a):\n", + " dec.append(a[2*i + 1])\n", + "\n", + " asc.sort()\n", + " dec.sort(reverse = True)\n", + "\n", + " ans = []\n", + "\n", + " for i in range(len(asc)):\n", + " ans.append(asc[i])\n", + " if i < len(dec):\n", + " ans.append(dec[i])\n", + "\n", + " return ans" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "**Q7) Write an iterator function to return the elements of the Fibonacci series.**" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "def fib():\n", + " a = 0\n", + " b = 1\n", + "\n", + " while 1 == 1:\n", + " yield b\n", + " c = b\n", + " b = a+b\n", + " a = c\n", + "\n", + "ite = fib()" + ] + }, + { + "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": 25, + "metadata": {}, + "outputs": [], + "source": [ + "def sub_lists(a):\n", + " subs = [[]]\n", + " for i in range(len(a)):\n", + " print(\"i\",i)\n", + " for j in range(i + 1, len(a)+1):\n", + " print(\"j\",j)\n", + " sub = a[i:j]\n", + " print(sub)\n", + " subs.append(sub)\n", + "\n", + " for i in subs:\n", + " if(i != []):\n", + " print(\",\",i,end=\"\")\n", + " else:\n", + " print(i,end=\"\")\n", + "\n", + " print()" + ] + }, + { + "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": 8, + "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 a:\n", + " sum += i\n", + " a.append(sum)\n", + " # appended into the passed variable change will be reflected\n", + "\n", + "def reassign_list(a):\n", + " b = []\n", + " for i in a:\n", + " b.append(i+1)\n", + " a = b\n", + " # a new local variable created so no change will be reflected\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": 28, + "metadata": {}, + "outputs": [], + "source": [ + "def char_position(a):\n", + " dic = {}\n", + " for i in range(len(a)):\n", + " if a[i] != \" \":\n", + " dic[i+1] = a[i]\n", + "\n", + " return dic" + ] + }, + { + "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": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'haaggiiisssbbbbdddduuuufffff'" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def sort_by_freq(a):\n", + " lis_a = []\n", + " for i in range(len(a)):\n", + " if a[i] != \" \":\n", + " lis_a.append(a[i])\n", + "\n", + " lis_a.sort()\n", + "\n", + " dic = {}\n", + " ch = lis_a[0]\n", + " cou = 0\n", + " for i in lis_a:\n", + " if ch == i:\n", + " cou += 1\n", + " else:\n", + " dic[ch] = cou\n", + " ch = i\n", + " cou = 1\n", + "\n", + " dic[ch] = cou\n", + "\n", + " lis_a = sorted(dic, key=dic.get)\n", + "\n", + " ans = \"\"\n", + "\n", + " for i in lis_a:\n", + " for j in range(dic[i]):\n", + " ans += i\n", + "\n", + " return ans\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "---\n", + "**Q12)**\n", + "\n", + "**A) Create a file called myfile.txt**\n", + "\n", + "**B) Enter some a 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.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/python-assn/assn-02/Aishwarya_Srivastava.ipynb b/python-assn/assn-02/Aishwarya_Srivastava.ipynb new file mode 100644 index 0000000..51dba81 --- /dev/null +++ b/python-assn/assn-02/Aishwarya_Srivastava.ipynb @@ -0,0 +1,743 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Numpy exercise\n", + "===\n", + "\n", + "This exercise is designed to get you familiarised with numpy and shows the most common operations that you will perform in the future.\n", + "\n", + "You will need the Iris.csv file from the GitHub repositry to perform this exercise.\n", + "\n", + "Write your code in the following way:\n", + "#################################
\n", + "\n", + "Your code here\n", + "#################################" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0, 1, 2, 3],\n", + " [ 4, 5, 6, 7],\n", + " [ 8, 9, 10, 11],\n", + " [12, 13, 14, 15]])" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "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", + "A=A.reshape((4,4))\n", + "A\n", + "#################################" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Expected output:
\n", + "[[ 0 1 2 3]\n", + " [ 4 5 6 7]\n", + " [ 8 9 10 11]\n", + " [12 13 14 15]]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0, 1, 4, 9],\n", + " [ 16, 25, 36, 49],\n", + " [ 64, 81, 100, 121],\n", + " [144, 169, 196, 225]])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Create another array B which is made of square of each elements of B and print B.\n", + "#################################\n", + "B = np.square(A)\n", + "B\n", + "#################################" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Expected output:
\n", + "[[ 0 1 4 9]\n", + " [ 16 25 36 49]\n", + " [ 64 81 100 121]\n", + " [144 169 196 225]]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0.99974888, 133.64958416, 95.93078975, ..., 255.31480277,\n", + " 250.95892573, 105.34540698],\n", + " [ 1.00302457, 134.68942612, 98.32757524, ..., 249.06534772,\n", + " 244.3288309 , 104.86881597],\n", + " [ 1.00742953, 132.20426905, 96.78359079, ..., 248.3218581 ,\n", + " 250.96427044, 103.35679888],\n", + " ...,\n", + " [ 1.0005424 , 130.58274826, 99.96215366, ..., 250.55249525,\n", + " 245.21223277, 104.38656022],\n", + " [ 1.00024672, 134.34648961, 96.67656407, ..., 250.38007007,\n", + " 248.28938259, 105.75204736],\n", + " [ 0.99311051, 135.36445455, 97.66456136, ..., 249.85793917,\n", + " 249.40730602, 102.02263235]])" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Create a numpy array of shape (28,28) whose values are chosen randomly from 0-255\n", + "#################################\n", + "x = np.random.randint(256, size = (28 , 28))\n", + "#################################\n", + "\n", + "#Convert x into a vector (Make it of single dimension)\n", + "#################################\n", + "x = np.ravel(x)\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", + "x = np.insert(x,0,1)\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", + "W = np.random.normal(1, 0.01, (785,10))\n", + "#################################\n", + "\n", + "#Multiply the 2 matrices W and x. (Keep in mind the shape of the two)\n", + "#################################\n", + "np.ndarray.transpose(W)*x\n", + "#################################" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1.],\n", + " [0.],\n", + " [0.],\n", + " [2.],\n", + " [0.],\n", + " [1.],\n", + " [0.],\n", + " [0.],\n", + " [2.],\n", + " [2.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [2.],\n", + " [2.],\n", + " [0.],\n", + " [2.],\n", + " [2.],\n", + " [2.],\n", + " [0.],\n", + " [1.],\n", + " [2.],\n", + " [2.],\n", + " [0.],\n", + " [0.],\n", + " [1.],\n", + " [2.],\n", + " [2.],\n", + " [2.],\n", + " [2.],\n", + " [0.],\n", + " [1.],\n", + " [2.],\n", + " [2.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [2.],\n", + " [1.],\n", + " [1.],\n", + " [0.],\n", + " [0.],\n", + " [1.],\n", + " [2.],\n", + " [1.],\n", + " [2.],\n", + " [0.],\n", + " [0.],\n", + " [1.],\n", + " [0.],\n", + " [2.],\n", + " [1.],\n", + " [0.],\n", + " [2.],\n", + " [2.],\n", + " [1.],\n", + " [1.],\n", + " [0.],\n", + " [1.],\n", + " [0.],\n", + " [1.],\n", + " [0.],\n", + " [0.],\n", + " [2.],\n", + " [0.],\n", + " [1.],\n", + " [0.],\n", + " [2.],\n", + " [0.],\n", + " [2.],\n", + " [1.],\n", + " [2.],\n", + " [0.],\n", + " [2.],\n", + " [2.],\n", + " [1.],\n", + " [0.],\n", + " [1.],\n", + " [0.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [2.],\n", + " [1.],\n", + " [0.],\n", + " [0.],\n", + " [2.],\n", + " [2.],\n", + " [2.],\n", + " [2.],\n", + " [1.],\n", + " [0.],\n", + " [2.],\n", + " [0.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [0.],\n", + " [2.],\n", + " [2.],\n", + " [2.],\n", + " [1.],\n", + " [2.],\n", + " [2.],\n", + " [1.],\n", + " [1.],\n", + " [0.],\n", + " [1.],\n", + " [2.],\n", + " [0.],\n", + " [1.],\n", + " [0.],\n", + " [0.],\n", + " [1.],\n", + " [0.],\n", + " [0.],\n", + " [2.],\n", + " [0.],\n", + " [0.],\n", + " [1.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [2.],\n", + " [0.],\n", + " [1.],\n", + " [1.],\n", + " [2.],\n", + " [0.],\n", + " [1.],\n", + " [0.],\n", + " [0.],\n", + " [1.],\n", + " [2.],\n", + " [0.],\n", + " [2.],\n", + " [1.],\n", + " [2.],\n", + " [0.],\n", + " [1.],\n", + " [1.],\n", + " [2.],\n", + " [1.],\n", + " [0.],\n", + " [0.],\n", + " [2.],\n", + " [2.],\n", + " [2.]])" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "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", + "my_data = np.genfromtxt('Iris.csv', delimiter=',')\n", + "np.random.shuffle(my_data)\n", + "#################################\n", + "\n", + "\n", + "#Create a numpy array X that contains the firts 4 columns of data. Keep the last column of data in numpy array y.\n", + "#################################\n", + "X = my_data[:,0:4] \n", + "y = my_data[:,4:5]\n", + "y\n", + "#################################" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6.2\n", + "3.4\n", + "5.4\n", + "2.3\n", + "2.0\n", + "5.2\n", + "4.1\n", + "1.5\n", + "0.1\n", + "0.0\n", + "7.7\n", + "2.8\n", + "6.7\n", + "2.0\n", + "2.0\n", + "6.0\n", + "3.4\n", + "4.5\n", + "1.6\n", + "1.0\n", + "[6.2 3.4 5.4 2.3]\n", + "[7.7 2.6 6.9 2.3]\n", + "[6.2 2.8 4.8 1.8]\n", + "[4.9 2.5 4.5 1.7]\n", + "[5.8 2.7 5.1 1.9]\n", + "[6.5 3.2 5.1 2. ]\n", + "[5.9 3. 5.1 1.8]\n", + "[6.7 3.3 5.7 2.5]\n", + "[6.8 3. 5.5 2.1]\n", + "[6.3 2.5 5. 1.9]\n", + "[6.4 3.1 5.5 1.8]\n", + "[6.7 3.1 5.6 2.4]\n", + "[6.7 3. 5.2 2.3]\n", + "[6.3 3.4 5.6 2.4]\n", + "[7.3 2.9 6.3 1.8]\n", + "[6.5 3. 5.2 2. ]\n", + "[7.2 3. 5.8 1.6]\n", + "[6.3 2.7 4.9 1.8]\n", + "[5.6 2.8 4.9 2. ]\n", + "[6.4 3.2 5.3 2.3]\n", + "[6.9 3.2 5.7 2.3]\n", + "[7.4 2.8 6.1 1.9]\n", + "[5.8 2.8 5.1 2.4]\n", + "[6.7 2.5 5.8 1.8]\n", + "[7.7 3.8 6.7 2.2]\n", + "[6.3 3.3 6. 2.5]\n", + "[6.1 3. 4.9 1.8]\n", + "[5.8 2.7 5.1 1.9]\n", + "[6.4 2.7 5.3 1.9]\n", + "[6. 2.2 5. 1.5]\n", + "[6.7 3.3 5.7 2.1]\n", + "[7.7 3. 6.1 2.3]\n", + "[7.6 3. 6.6 2.1]\n", + "[6.9 3.1 5.1 2.3]\n", + "[6. 3. 4.8 1.8]\n", + "[5.7 2.5 5. 2. ]\n", + "[6.8 3.2 5.9 2.3]\n", + "[7.1 3. 5.9 2.1]\n", + "[6.4 2.8 5.6 2.2]\n", + "[6.5 3. 5.5 1.8]\n", + "[7.9 3.8 6.4 2. ]\n", + "[6.5 3. 5.8 2.2]\n", + "[7.2 3.2 6. 1.8]\n", + "[6.9 3.1 5.4 2.1]\n", + "[6.4 2.8 5.6 2.1]\n", + "[6.1 2.6 5.6 1.4]\n", + "[7.2 3.6 6.1 2.5]\n", + "[6.3 2.8 5.1 1.5]\n", + "[6.3 2.9 5.6 1.8]\n", + "[7.7 2.8 6.7 2. ]\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", + "cou = 0\n", + "for i in np.nditer(my_data):\n", + " if cou == 10:\n", + " break \n", + " print(i)\n", + " cou += 1\n", + "\n", + "for j in np.nditer(my_data[::-1].copy(order = \"C\")):\n", + " if cou == 0:\n", + " break \n", + " print(j)\n", + " cou -= 1\n", + " \n", + "for k in range(len(my_data)):\n", + " if y[k] == 2:\n", + " print(X[k])\n", + "#################################" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [1., 0., 0.],\n", + " [0., 0., 1.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [1., 0., 0.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.],\n", + " [0., 1., 0.],\n", + " [0., 1., 0.],\n", + " [0., 1., 0.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.],\n", + " [1., 0., 0.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.],\n", + " [1., 0., 0.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.],\n", + " [0., 1., 0.],\n", + " [0., 1., 0.],\n", + " [0., 1., 0.],\n", + " [0., 0., 1.],\n", + " [0., 1., 0.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [0., 0., 1.],\n", + " [0., 1., 0.],\n", + " [0., 0., 1.],\n", + " [1., 0., 0.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [0., 0., 1.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.],\n", + " [0., 1., 0.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [1., 0., 0.],\n", + " [0., 0., 1.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [0., 0., 1.],\n", + " [1., 0., 0.],\n", + " [0., 0., 1.],\n", + " [0., 1., 0.],\n", + " [0., 0., 1.],\n", + " [1., 0., 0.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [0., 1., 0.],\n", + " [0., 1., 0.],\n", + " [0., 0., 1.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [1., 0., 0.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [0., 0., 1.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [0., 1., 0.],\n", + " [0., 1., 0.],\n", + " [0., 1., 0.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.],\n", + " [0., 1., 0.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.],\n", + " [0., 1., 0.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [0., 0., 1.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [1., 0., 0.],\n", + " [0., 0., 1.],\n", + " [1., 0., 0.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [1., 0., 0.],\n", + " [1., 0., 0.],\n", + " [0., 0., 1.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [0., 1., 0.],\n", + " [0., 0., 1.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [0., 0., 1.],\n", + " [1., 0., 0.],\n", + " [0., 0., 1.],\n", + " [0., 1., 0.],\n", + " [0., 0., 1.],\n", + " [1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [0., 1., 0.],\n", + " [0., 0., 1.],\n", + " [0., 1., 0.],\n", + " [1., 0., 0.],\n", + " [1., 0., 0.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.],\n", + " [0., 0., 1.]])" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "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", + "y = y.reshape(-1)\n", + "y1 = np.eye(3)[y]\n", + "#################################" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[[49., 98., 67.],\n", + " [68., 97., 80.],\n", + " [33., 27., 7.],\n", + " ...,\n", + " [ 2., 59., 26.],\n", + " [27., 63., 47.],\n", + " [92., 30., 59.]],\n", + "\n", + " [[22., 93., 59.],\n", + " [23., 44., 30.],\n", + " [39., 93., 0.],\n", + " ...,\n", + " [26., 10., 90.],\n", + " [89., 2., 98.],\n", + " [ 8., 10., 20.]],\n", + "\n", + " [[94., 50., 72.],\n", + " [52., 25., 4.],\n", + " [ 6., 45., 98.],\n", + " ...,\n", + " [35., 46., 45.],\n", + " [11., 80., 12.],\n", + " [95., 73., 12.]],\n", + "\n", + " ...,\n", + "\n", + " [[95., 41., 46.],\n", + " [13., 87., 95.],\n", + " [16., 96., 17.],\n", + " ...,\n", + " [78., 5., 30.],\n", + " [71., 22., 89.],\n", + " [69., 44., 29.]],\n", + "\n", + " [[13., 63., 22.],\n", + " [32., 76., 17.],\n", + " [95., 64., 6.],\n", + " ...,\n", + " [ 7., 51., 33.],\n", + " [18., 68., 48.],\n", + " [17., 43., 87.]],\n", + "\n", + " [[64., 91., 28.],\n", + " [98., 36., 28.],\n", + " [24., 57., 20.],\n", + " ...,\n", + " [58., 99., 52.],\n", + " [68., 29., 15.],\n", + " [19., 88., 77.]]]])" + ] + }, + "execution_count": 10, + "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", + "B = np.empty((1,32,64,3))\n", + "B[0] = A\n", + "A = B\n", + "#################################" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Expected Output:
(1,32,64,3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "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.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/python-assn/assn-03/Aishwarya_Srivastava.ipynb b/python-assn/assn-03/Aishwarya_Srivastava.ipynb new file mode 100644 index 0000000..5c9ed63 --- /dev/null +++ b/python-assn/assn-03/Aishwarya_Srivastava.ipynb @@ -0,0 +1,2887 @@ +{ + "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": 3, + "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": 4, + "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": 4, + "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": 5, + "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": 5, + "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": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['sepal length (cm)',\n", + " 'sepal width (cm)',\n", + " 'petal length (cm)',\n", + " 'petal width (cm)']" + ] + }, + "execution_count": 6, + "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": 7, + "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": 7, + "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": 8, + "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": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Return the first 10 rows in df\n", + "### CODE HERE ###\n", + "df.head(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "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": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Return the last 10 rows in df\n", + "### CODE HERE ###\n", + "df.tail(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(150, 4)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get to know the shape of the data\n", + "### CODE HERE ###\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": 11, + "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": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get a more detailed description of the dataset\n", + "### CODE HERE ###\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": 12, + "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": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Retrieve only sepal_length from df\n", + "### CODE HERE ###\n", + "df['sepal length (cm)']" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "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": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Return 5th row of df\n", + "### CODE HERE ###\n", + "df.iloc[4]\n", + "# 0 indexing" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.4" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Return petal length of 5th row of df\n", + "### CODE HERE ###\n", + "df['petal length (cm)'].loc[4]" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "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": 15, + "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", + "### CODE HERE ###\n", + "\n", + "df1 = df.loc[df['sepal width (cm)'] < 2.9]\n", + "df1" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "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": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get mean of each column in df\n", + "# Hint: use numpy.mean\n", + "import numpy as np\n", + "\n", + "### CODE HERE ###\n", + "df.mean()" + ] + }, + { + "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": 17, + "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": 18, + "metadata": {}, + "outputs": [], + "source": [ + "sl = df['sepal length (cm)']" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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cuaZZ3LfffexePFiPve5zzFlyhSeeiq7Gem1117L9OnT2Xfffbn33nv7N2iVRMROs0ybNi3MrPksX748ue1VV0W0tkbA1qW1NSvfUevXr48DDjggJk+eHAsWLIi77rorIiI2bNgQBx54YLzwwgsREXHNNdfESSedFBERM2bMiFNPPTUiIu6+++7o7OyMiIh169bFxo0bIyLi9ttvj+OOOy4iIu6888746Ec/us22S8vPOeec+O53vxsRES+//HJMnjw5Xnvttfj2t78dkyZNildeeSXefPPNmDBhQqxatSrWrFkT7e3tsXbt2tiwYUMcfPDBccYZZ0RExLx58+Laa6/dsp0ZM2bEZz7zmYiI+OEPfxgzZ87cJpZKrwPZ/YmSPmPrekhK0mzgn8luoHRZRHy5rH5X4N+AacBa4ISIeCavOwc4BdgMnBURt9YzVjNrDueeC2+80bPsjTey8hNP3LE+d9ttN5YsWcK9997LnXfeyQknnMCXv/xlCoUCy5Yt47DDDgNg8+bN7L333lvWmzt3LgAf/vCHefXVV3nllVdYv3498+bN48knn0QSGzduTI7jtttuY/HixXz1q18FsrPHVq1aBcDMmTMZNWoUAB0dHTz77LO8+OKLzJgxgz333BOAj3/84zzxxBO99n/ccccBMG3aNJ555pnkuFLV7ZCUpBbgm8CRQAcwV1L5wbZTgJcj4l3APwJfydftILulaycwG/iXvL+6qLb7O2sWSFuXWbP6tj5AZ2fPPjo7e9affjoMG5bVDRuWPS43blzPPsaN69s2RozoWT9ixLbbqNam2likjEe155EyFtWk9FHrwx5WG/nnZ3J5qpaWFg455BC++MUv8o1vfIPrr7+eiKCzs5OlS5eydOlSHnnkEW677bYt65SfWSSJ8847j0MPPZRly5bxgx/8oE+nqkYE119//ZbtrVq1iv322w9gy+GyYqybNm3q83Ms9rGj61dTzzmM6cDKiHg6IjYA1wDHlLU5BvhO/vt1wExlr9AxwDUR8euI+CWwMu+v5hYtgvnz4dlns53fZ5/NHhc/PGbNgjvu6LnOHXds/aCstj5kH9zLy24wu3z51g/000+Hb30LNm/OHm/enD0u/ZAbNw5+9aueffzqV1s/bKttY8QIKP9HaOPGngmhWptqY5EyHtWeR8pYVJPSR8rrZo0xYULfylOsWLGCJ598csvjpUuX0t7ezrvf/W66u7u5//77gewb6Y8++uiWdt/73vcA+MlPfsKoUaMYNWoU69atY1z+hr3yyiv7FMcRRxzB17/+dSK/0+lDDz203fbvf//7ufvuu3n55ZfZtGkT119//Za63XffnfXr1/dp+/1Vz4QxDniu5PHqvKxim4jYBKwD9kpctya2t/sL235AFhXLq60P236Ql5cvXFi5vrS8/EO2vLzaNnrbay4tr9am2lhA9fGo9jxSxqKalD5SXjdrjIsugtbWnmWtrVn5jnrttdeYN28eHR0d7L///ixfvpwLLriAESNGcN111/GXf/mXHHDAAUyZMoX77rtvy3ojR45k6tSpnHbaaVx++eUAnH322ZxzzjlMnTq1z//Fn3feeWzcuJH999+fzs5OzjvvvO22HzduHH/1V3/F9OnTOeigg5g4ceKWw1Zz5szh4osvZurUqVsmvesudbKjrwtwPNm8RfHxHwPfKGuzDBhf8vgpYAzwDeATJeWXA8f3sp35QBfQNWHChG0mdKqRek6uFRepOCHU+5Kyfkof1epr0cdAbKMW45myjWpqEafVVl8mvSOyCe729uz1aG/v34T3jpoxY0Y8+OCDA7/hMuvXr4+IiI0bN8ZRRx0VN9xwww731d9J73ruYawB9il5PD4vq9hG0jBgFNnkd8q6AETEwogoREShra2tz0H2d/e3FrvPLb3MzvRW3sz6Ox61GIuUPupx2MNq58QT4Zln4O23s587Otm9M7jgggu2nNo7adIkjj322MYFk5pZ+rqQfSnwaWASMAL4BdBZ1uYM4JL89znAf+S/d+btd83XfxpoqbbNHTmtttopfDNnVv5PtHjGWsopgB0dlfvo6MjqFyyoXL9gwdY+xo6t3Gbs2LRtDB9euX748K3bqNam2likjEe155EyFtWk9FGPUzetd33dw7D66O8eRt0SRhYHHwGeIDvUdG5ediFwdP77SOBaskntB4B3lqx7br7eCuDIlO3t6Pcwqu3+ln9Qlp/enLL7XP6BXvwgL1qwIKKlJatraan8AVn+YVv8kE3dRnlCKE0WqW2qjUXKeFR7HiljUU1KH81w2GOocMJoDv1NGMra7xwKhULU+1oqZtZ3jz32GO95z3t8AcIGiggef/zxLafxFklaEhGFlD58aRAzq7uRI0eydu1adqZ/UAeTiOx+GCNH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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": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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bffRRx8dsI3Ro0dz1VVXAdDa2srDDz8MwIYNG3jooYcAuOaaa/jUpz41YP3z589n4sSJAJxzzjls376d6dOnF+1XqRQURKS6MoEhExDgiAMCZNcUktydj3zkI3zxi18suO+PfvQjHnnkETZs2MC4ceOYN29eyZd5Fmqjrq4uvjqotraWnp6eEt9N1pgxY+Lvh1pHIZo+EpHqykwZJSXXGMpo/vz5PPDAA+zatQuA119/ne3btwNhwO7u7gZg7969nHTSSYwbN45f//rX/PznPy9LGwOZPXs2Dz74IAD33XdfnD9hwgT27dtX+hssAwUFEame5BpCRwf09YWvyTWGMjrnnHP467/+a97xjncwY8YMrrjiCl5++WUAFi5cyIwZM7j22mu58sor6enp4eyzz2bx4sXMnj27LG0M5Ctf+Qpf/vKXmTFjBlu2bImnh2bMmEFtbS0zZ86MF5orzbwC0biS2trafOPGjdXuhogU8Nxzz3H22WeXVnjp0rConJkyygSKSZPKegXSsezAgQOMHTsWM+O+++7j3nvv5Tvf+c6Q68t3/M2s093biu2rNQURqa6lS0MgyKwhZNYYjqP/iO7s7OTGG2/E3Zk0aRIrV66sWl8UFESk+tIB4DgKCBCujnrqqaeq3Q1AawoiIpKgoCAiIjEFBRERiSkoiIhITEFBREako33r7GI+9rGP8eyzz/bLT94O+6GHHsopM2/ePI72JfgKCiIyIh1rt86+6667OOeccwqWSQeFaqhoUDCzK83seTPbYmaL87w+xszWRq//wsyaK9mfYSH9z4R9ff1fT+cdPJib7uqC/ftz8156KTe9e3f/fdL3UMl3T5V02+m0yBCsWQPNzVBTE75GNxUtm0rfOvv+++/nlltuAWDZsmWceeaZAGzdupVLL70UyP3Uv2rVKt761rcya9YsfvrTnwLws5/9jHXr1vHpT3+alpYWXnjhhbjuWbNm8da3vpX169eX98Dk4+4V2YBa4AXgTGA08BRwTqrMJ4A7o++vBtYWq7e1tdWPxKRJ7mFkHXgbO7b466tXuzc1uZuFr9dfn5tevXoInVuyxL2jw72vL6Rvu829pSV8dQ/5p5/uPm2ae29vyMt06uKLQ/rQoWzevn25ZSB/OrlPd3fI6+52r693nzgx27+5c0N/Mm339ob03LlDeLMykj377LMll1292n3cuNxfy3Hjhvg3lDB+/Hh3d+/u7vYFCxb43//93/uzzz7rV111lR8+fNjd3a+//nq/5557cspn7Nmzx93dDxw44Oeee66/9tpr7u7e1NTku3fvzin78ssve1tbm7u7v//97/e2tjbfuXOn33333b548WJ3d587d64/8cQT/tJLL/n06dN9165d3tXV5ZdcconfcMMN7u7+kY98xO+///643rlz5/ott9zi7u7f+973fP78+SW993zHH9joJYzdlTxTmAVscfet7n4YuA94T6rMe4B7ou8fAOZbBR/setJJ4b/pi0l/8M73+oc/DNu3h1/h7dvha1/LTS9cOMhPO+n7yvf1wbp1sGlT+Jq5J8yLL8Irr0Bra25HN2wI6fr6bN6ECf3PEH7729z07t25+4wZE84QJkyAQ4eyZxB9fbB3b+hPa2tIt7aG9N69OmOQIbv1VkhP9x84EPKPROaTf1tbG42NjVx33XU5t7VuaWnh0UcfZevWrXn3X758efwwnMytswcybdo09u/fz759+9ixYwfXXHMNjz/+OOvXr6e9vT2n7C9+8QvmzZvH1KlTGT16NB/84AcLvo/3ve99QLjV9rZt2wZ3EIagkv/RfDqQfPrDTuCigcq4e4+Z7QUmA+V90GmklIBQLplf6uhMtLiB7ivf0hIG3trakL7pJli/PuSNG5dbRzoNcPrpuenotDaWvJd8TU0Y3OvqQrq+Hvbtg1HRr0lnZzYQZPrT0hLya7Q8JUPzX/81uPxSHe1bZ19yySWsWrWKt73tbbS3t7Ny5Uo2bNjA3/7t3x7R+8jcKrsSt8nOZ1j8JZvZQjPbaGYbd6fnwo9hg/6lTgaGjM7O3PSyZf3z0h+zDh0Kg3nSiy/mpqPb+ubs09WVm5cMCBAG/nTbCghyhBobB5d/JCp56+z29nb+5m/+hjlz5nD++efz2GOPMWbMmPiOpxkXXXQRP/7xj9mzZw/d3d3cf//98WvVuFV2WiX/ml8Eko8Daojy8pYxs1HARKDfM+/cfYW7t7l729SpUyvU3fIb9C91vvvKt7bmpjs6+uelzxDq68P0T1L6jCH9tKn6+jB1lDRhQu5ic2bKKN0/TR3JEfj85/Of9H7+8+Vvq5K3zm5vb2fHjh3MmTOH2tpapk+fzmWXXdav3KmnnsrSpUu5+OKLufTSS3PuZnr11VfzpS99ifPPPz9eaD7qSll4GMpGmJraCpxBdqH53FSZG8hdaP6nYvUeyUJzKYvM5doGvVDW1xcWmSF8zSziQnZx96absg20tLgfOJDbaDoN7i++mJveujU3vWtXbrqmJrvIDOFrd3f+/qTTIpHBLDS7979w40gXmY93x+RCs7v3ADcCPwCeiwb8Z8zsL81sQVTsG8BkM9sC3AL0u2y1nH73u3CL9mLGji3++urV0NQUZnyamuD663PTK1YMYj0Bwo6TJmWfTVtTAwsWhDn7BQtCetmy8Il/2rQwbZPs6MUXh3Ry3nPfPjjttNx2zjgjNz11au4+XV1hymjfvuzZw6hRof2JE3PXEDo7Q3riRE0hyRG59lrYti2cdG7bNsi/HSkrPWTnWOOee9vgvr7cATfzmT6Zd/BgboDo6oLubjjhhGzeSy/lBojdu0NASO5TW5u7htDTk5vO1590WoRBPmRHyk4P2RlJ0lfkpgdcs/5l0qc2Y8b0Xx9InzGk12bS5aF/QMjXHwUEkRFFf9EiUhHDbRZipDjS466gICJlV19fz549exQYjjJ3Z8+ePdQn/yF1kDR9JCJl19DQwM6dOxlO/1c0UtTX19PQ0DDk/RUURKTs6urqOCN9pZsMC5o+EhGRmIKCiIjEFBRERCQ27P55zcx2A9uHsOsUKnT31QpRfytvuPVZ/a2s4dZfGFyfm9y96M3jhl1QGCoz21jKf/MdK9TfyhtufVZ/K2u49Rcq02dNH4mISExBQUREYsdTUCj85O1jj/pbecOtz+pvZQ23/kIF+nzcrCmIiEhxx9OZgoiIFDHig4KZXWlmz5vZFjOr6EN8ysHMVprZLjN7utp9KYWZTTezx8zsWTN7xsw6qt2nQsys3sz+w8yeivr7f6vdp1KYWa2Z/dLMvlvtvpTCzLaZ2WYz22Rmx/wDUMxskpk9YGa/NrPnzOziavdpIGb2tui4Zrbfm9kny1b/SJ4+MrNa4D+BK4CdwBPAh9z92ap2rAAzmwPsB77p7m+vdn+KMbNTgVPd/UkzmwB0Au89Vo+xmRkw3t33m1kd8BOgw92LP5m9iszsFqANONHdr6p2f4oxs21Am7sPi+v+zeweYL2732Vmo4Fx7v5GtftVTDTGvQhc5O5D+f+tfkb6mcIsYIu7b3X3w8B9wHuq3KeC3P1x4PVq96NU7v6yuz8Zfb+P8OjV06vbq4FFj6vdHyXrou2Y/mRkZg3Au4G7qt2XkcjMJgJzCI8Hxt0PD4eAEJkPvFCugAAjPyicDuxIpHdyDA9Yw52ZNQPnA7+obk8Ki6ZiNgG7gIfd/ZjuL/AV4DNAX7U7MggO/LuZdZrZwmp3pogzgN3AqmiK7i4zG1/tTpXoauDeclY40oOCHCVmdgLwIPBJd/99tftTiLv3unsL0ADMMrNjdprOzK4Cdrl7Z7X7MkiXufsFwDuBG6Jp0WPVKOAC4Gvufj7wJjAc1h9HAwuA+8tZ70gPCi8C0xPphihPyiiam38QWOPu/1zt/pQqmiJ4DLiy2n0p4FLQPQECAAAE2ElEQVRgQTRHfx/wB2a2urpdKs7dX4y+7gK+TZjKPVbtBHYmzhgfIASJY907gSfd/dVyVjrSg8ITwFlmdkYUVa8G1lW5TyNKtHD7DeA5d/9ytftTjJlNNbNJ0fdjCRch/Lq6vRqYu/+5uze4ezPh9/eH7v7hKnerIDMbH110QDQN8w7gmL2azt1fAXaY2duirPnAMXmhRMqHKPPUEYzwJ6+5e4+Z3Qj8AKgFVrr7M1XuVkFmdi8wD5hiZjuBJe7+jer2qqBLgf8DbI7m6QH+wt3/tYp9KuRU4J7oqo0a4J/cfVhc5jmMvAX4dvi8wCjgW+7+b9XtUlE3AWuiD49bgY9WuT8FRcH2CuDjZa97JF+SKiIigzPSp49ERGQQFBRERCSmoCAiIjEFBRERiSkoiIhITEFBjmlmtr94qUHX2WJm70qkl5rZpwqUv9PMLi2h3j81sz/Kk9+cuevtYNtOlDMz+6GZnVisbAl1PWJmJx1pPTIyKSjI8agFeFfRUlmzgaJ3UXX3O939m2VuO+NdwFNluoXIPwKfKEM9MgIpKMiwYWafNrMnzOxXmecgRJ/CnzOzr0fPR/j36D+VMbMLo7KbzOxLZvZ09M9Jfwl8MMr/YFT9OWb2IzPbamY3J9o8m3D79clm1hnlzTQzN7PGKP2CmY1Lfuo3s9bomQ1PATdEeYNqO+Va4DuJfv1R9N6eMrN/jPLuNrOvmdnPo7rmWXg+x3NmdneirnWE/4YV6UdBQYYFM3sHcBbhHjotQGviJmtnAV9193OBN4D3R/mrgI9HN7/rhXBbZOA2YK27t7j72qjsfwf+Z1T/kuh+ThDuL/Nv0T186qPpm3ZgI9BuZk2EG9YdSHV5FXCTu8/MZAyh7aRLCc+qwMzOBT4L/EFUf/LBRicBFwOLCIP/HcC5wHlm1hL143fAGDObnKcdOc4pKMhw8Y5o+yXwJGEgPSt67bfunrnFRifQHN3faIK7b4jyv1Wk/u+5e1f0UJhdhFs1QBisM7do+BlhcJ4DfCH62g6sT1YUtT0pejYGhOmaobSddHL0vAqAPwDuzzzAxt2Tz9/4Fw+3KdgMvOrum929D3gGaE6U2wWcVqRfchwa0fc+khHFgC+6+z/kZIZnOHQlsnqBsUOoP13HKDMbRxjcX4ryHycEgSbCVM6fEZ4b8L0htFew7TxlesysJhrgS6mrL1VvX6reeuDgYDsqI5/OFGS4+AHwJ9FzGzCz083slIEKR7fF3mdmF0VZVyde3gdMKKHN/0G4tXbGeuDDwG+iwfl1wgLwT/K0/YaZXRZlXTuEttOeB86Mvv8h8IHM9I+ZnTyYiqI7204Dtg2hHzLCKSjIsODu/06YAtpgZpsJ97wvNrheB3w9unvreGBvlP8YYXE3udibzzvJTh3h7tsIZyyZaaGfAG9Ec/RpHwW+GrVtifxS2077HuHuuUR3+v088ONoIXuwtyxvBX7u7j2D3E+OA7pLqoxYZnZC5nnMZrYYONXdO4rsltz/ScID0bsr1cdB9OVU4JvufkUZ6loGrHP3R4+8ZzLSaE1BRrJ3m9mfE37PtwN/PJido8dJHhPc/eXostsTy/C/Ck8rIMhAdKYgIiIxrSmIiEhMQUFERGIKCiIiElNQEBGRmIKCiIjEFBRERCT2/wG86fDnHdTHQAAAAABJRU5ErkJggg==\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')\n", + "\n", + "### CODE HERE ###\n", + "pl = df['petal length (cm)']\n", + "pw = df['petal width (cm)']\n", + "ax0 = fig.add_subplot(111)\n", + "ax0.scatter(pl, y, c = 'r', marker='x', label='Petal length')\n", + "ax0.scatter(pw, y, c = 'b', marker='o', label='Petal width')\n", + "ax0.set_xlabel('length/width (cm)')\n", + "ax0.set_ylabel('flower')\n", + "ax0.legend()\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAEKCAYAAAARnO4WAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3X+YVPV59/H3zaqLP6ECF4oUEeOS4q9FtjRKoij+SIw10SSXprY1IU9oYmOT9qm26uMT84M2jTZNaoq5qCSxLU2tGA2PNcZowRAl0AW3iigYKSii64qCiIos3M8fc2bZXWbmfGfnnDO/Pq/r2gvmzJlz7jnivWfuub/fr7k7IiLS+IZVOwAREcmGEr6ISJNQwhcRaRJK+CIiTUIJX0SkSSjhi4g0CSV8EZEmoYQvItIklPBFRJrEAdUOoL/Ro0f7xIkTqx2GiEjdWLVq1avuPiZk35pK+BMnTqSzs7PaYYiI1A0z2xS6r0o6IiJNQglfRKRJpJbwzWyymXX1+3nDzL6U1vlERKS01Gr47r4OaAcwsxbgReCeco+ze/duNm/ezDvvvJNwhBJq+PDhjB8/ngMPPLDaoYhIBbL60nYW8Jy7B3+5kLd582YOP/xwJk6ciJmlEJqU4u5s3bqVzZs3c9xxx1U7HBGpQFY1/MuBHxV6wszmmFmnmXX29PTs9/w777zDqFGjlOyrxMwYNWqUPmGJNIDUE76ZHQRcDNxV6Hl3n+/uHe7eMWZM4VZSJfvq0vUX2V/3wm6WT1zO0mFLWT5xOd0Lu6sdUqwsSjofAla7e+1fDRGRAN0Lu1k3Zx1739oLwK5Nu1g3Zx0AY68YW83QSsqipPNJipRz6sXcuXM58cQTOeWUU2hvb2fFihWJHn/p0qVcdNFFwdsrde+997J27dq+xzNnztSAN5EybLhhQ1+yz9v71l423LChShGFSfUO38wOBc4D/ijN86Rp+fLl3HfffaxevZrW1lZeffVV3n333WqHVZF7772Xiy66iClTplQ7FJG6tOv5XWVtrxWp3uG7+053H+Xu29M8T39J19VeeuklRo8eTWtrKwCjR49m3LhxAKxatYqzzjqLadOmccEFF/DSSy8BuTvmL37xi7S3t3PSSSexcuVKAFauXMnpp5/O1KlTOeOMM1i3bl1wHDt37mT27NlMnz6dqVOn8pOf/ASAH/7wh1x66aV88IMf5IQTTuDaa6/te82CBQtoa2tj+vTpfPazn+ULX/gCjz32GIsXL+aaa66hvb2d5557DoC77rqL6dOn09bWxrJlyyq6ZiKNrnVCa1nba0VDjbTN19V2bdoFvq+uVknSP//883nhhRdoa2vjqquu4pFHHgFy4wOuvvpqFi1axKpVq5g9ezY33HBD3+veeusturq6mDdvHrNnzwbgve99L8uWLePxxx/nq1/9Ktdff31wHHPnzuWcc85h5cqVLFmyhGuuuYadO3cC0NXVxZ133smTTz7JnXfeyQsvvMCWLVv42te+xq9+9SseffRRnnnmGQDOOOMMLr74Ym6++Wa6uro4/vjjAejt7WXlypV8+9vf5itf+cqQr5dIM5g0dxLDDhmYPocdMoxJcydVKaIwNTV5WqVK1dWG+kXKYYcdxqpVq1i2bBlLlizhsssu4xvf+AYdHR2sWbOG8847D4A9e/Zw9NFH973uk5/8JABnnnkmb7zxBtu2bWPHjh1ceeWVPPvss5gZu3fvDo7jwQcfZPHixdxyyy1Arl31+eefB2DWrFmMGDECgClTprBp0yZeffVVzjrrLI488kgAPvGJT7B+/fqix7/00ksBmDZtGhs3bgyOS6QZjb1iLC/94CW2Pbytb9sRpx9R01/YQoMl/LTqai0tLcycOZOZM2dy8sknc8cddzBt2jROPPFEli9fXvA1g1sZzYwbb7yRs88+m3vuuYeNGzcyc+bM4BjcnbvvvpvJkycP2L5ixYq+clM+1t7e3vA3F8kfY6ivF2km669aPyDZA2x7eBvrr1pP27y2KkUVr6FKOmnU1datW8ezzz7b97irq4tjjz2WyZMn09PT05fwd+/ezVNPPdW335133gnAL3/5S0aMGMGIESPYvn07xxxzDJCrvZfjggsu4NZbb8XdAXj88cdL7v/bv/3bPPLII7z++uv09vZy99139z13+OGHs2PHjrLOLyL7bJm/pazttaKhEn4adbU333yTK6+8kilTpnDKKaewdu1abrrpJg466CAWLVrEX/zFX3DqqafS3t7OY4891ve64cOHM3XqVD73uc+xYMECAK699lquu+46pk6dWvZd9I033sju3bs55ZRTOPHEE7nxxhtL7n/MMcdw/fXXM336dGbMmMHEiRP7yj6XX345N998M1On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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", + "ax0.scatter(sl, pl, c = 'm', marker='o', label='Sepal length')\n", + "ax0.set_xlabel('sepal length (cm)')\n", + "ax0.set_ylabel('petal length (cm)')\n", + "ax0.legend()\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "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", + "ax0 = fig.add_subplot(111)\n", + "ax0.plot(np.arange(150), sl, c = 'g')\n", + "ax0.set_ylabel('sepal length (cm)')\n", + "ax0.set_xlabel('instance')\n", + "ax0.legend()\n", + "\n", + "plt.show()\n" + ] + }, + { + "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": 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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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)target
04.83.01.40.30
14.63.11.50.20
26.72.55.81.82
37.23.66.12.52
45.84.01.20.20
56.12.84.01.31
66.53.25.12.02
74.42.91.40.20
86.42.85.62.12
96.33.36.02.52
106.53.05.82.22
116.32.34.41.31
125.74.41.50.40
136.62.94.61.31
146.42.85.62.22
157.73.86.72.22
166.93.15.12.32
175.73.04.21.21
185.13.81.50.30
195.62.74.21.31
205.63.04.51.51
216.33.45.62.42
225.23.51.50.20
237.42.86.11.92
245.62.84.92.02
255.13.81.90.40
266.93.15.42.12
275.72.84.51.31
285.43.04.51.51
296.32.54.91.51
..................
1205.72.84.11.31
1216.12.94.71.41
1225.93.04.21.51
1236.93.14.91.51
1246.83.05.52.12
1254.52.31.30.30
1265.23.41.40.20
1275.63.04.11.31
1285.13.51.40.20
1294.63.61.00.20
1306.03.44.51.61
1315.13.51.40.30
1325.24.11.50.10
1336.32.95.61.82
1345.13.31.70.50
1355.82.75.11.92
1367.72.66.92.32
1376.13.04.91.82
1386.73.15.62.42
1396.73.14.41.41
1406.32.55.01.92
1417.23.26.01.82
1425.22.73.91.41
1436.53.05.51.82
1445.82.74.11.01
1455.82.64.01.21
1464.83.41.90.20
1474.73.21.60.20
1486.22.24.51.51
1494.93.01.40.20
\n", + "

150 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\n", + "0 4.8 3.0 1.4 0.3 \n", + "1 4.6 3.1 1.5 0.2 \n", + "2 6.7 2.5 5.8 1.8 \n", + "3 7.2 3.6 6.1 2.5 \n", + "4 5.8 4.0 1.2 0.2 \n", + "5 6.1 2.8 4.0 1.3 \n", + "6 6.5 3.2 5.1 2.0 \n", + "7 4.4 2.9 1.4 0.2 \n", + "8 6.4 2.8 5.6 2.1 \n", + "9 6.3 3.3 6.0 2.5 \n", + "10 6.5 3.0 5.8 2.2 \n", + "11 6.3 2.3 4.4 1.3 \n", + "12 5.7 4.4 1.5 0.4 \n", + "13 6.6 2.9 4.6 1.3 \n", + "14 6.4 2.8 5.6 2.2 \n", + "15 7.7 3.8 6.7 2.2 \n", + "16 6.9 3.1 5.1 2.3 \n", + "17 5.7 3.0 4.2 1.2 \n", + "18 5.1 3.8 1.5 0.3 \n", + "19 5.6 2.7 4.2 1.3 \n", + "20 5.6 3.0 4.5 1.5 \n", + "21 6.3 3.4 5.6 2.4 \n", + "22 5.2 3.5 1.5 0.2 \n", + "23 7.4 2.8 6.1 1.9 \n", + "24 5.6 2.8 4.9 2.0 \n", + "25 5.1 3.8 1.9 0.4 \n", + "26 6.9 3.1 5.4 2.1 \n", + "27 5.7 2.8 4.5 1.3 \n", + "28 5.4 3.0 4.5 1.5 \n", + "29 6.3 2.5 4.9 1.5 \n", + ".. ... ... ... ... \n", + "120 5.7 2.8 4.1 1.3 \n", + "121 6.1 2.9 4.7 1.4 \n", + "122 5.9 3.0 4.2 1.5 \n", + "123 6.9 3.1 4.9 1.5 \n", + "124 6.8 3.0 5.5 2.1 \n", + "125 4.5 2.3 1.3 0.3 \n", + "126 5.2 3.4 1.4 0.2 \n", + "127 5.6 3.0 4.1 1.3 \n", + "128 5.1 3.5 1.4 0.2 \n", + "129 4.6 3.6 1.0 0.2 \n", + "130 6.0 3.4 4.5 1.6 \n", + "131 5.1 3.5 1.4 0.3 \n", + "132 5.2 4.1 1.5 0.1 \n", + "133 6.3 2.9 5.6 1.8 \n", + "134 5.1 3.3 1.7 0.5 \n", + "135 5.8 2.7 5.1 1.9 \n", + "136 7.7 2.6 6.9 2.3 \n", + "137 6.1 3.0 4.9 1.8 \n", + "138 6.7 3.1 5.6 2.4 \n", + "139 6.7 3.1 4.4 1.4 \n", + "140 6.3 2.5 5.0 1.9 \n", + "141 7.2 3.2 6.0 1.8 \n", + "142 5.2 2.7 3.9 1.4 \n", + "143 6.5 3.0 5.5 1.8 \n", + "144 5.8 2.7 4.1 1.0 \n", + "145 5.8 2.6 4.0 1.2 \n", + "146 4.8 3.4 1.9 0.2 \n", + "147 4.7 3.2 1.6 0.2 \n", + "148 6.2 2.2 4.5 1.5 \n", + "149 4.9 3.0 1.4 0.2 \n", + "\n", + " target \n", + "0 0 \n", + "1 0 \n", + "2 2 \n", + "3 2 \n", + "4 0 \n", + "5 1 \n", + "6 2 \n", + "7 0 \n", + "8 2 \n", + "9 2 \n", + "10 2 \n", + "11 1 \n", + "12 0 \n", + "13 1 \n", + "14 2 \n", + "15 2 \n", + "16 2 \n", + "17 1 \n", + "18 0 \n", + "19 1 \n", + "20 1 \n", + "21 2 \n", + "22 0 \n", + "23 2 \n", + "24 2 \n", + "25 0 \n", + "26 2 \n", + "27 1 \n", + "28 1 \n", + "29 1 \n", + ".. ... \n", + "120 1 \n", + "121 1 \n", + "122 1 \n", + "123 1 \n", + "124 2 \n", + "125 0 \n", + "126 0 \n", + "127 1 \n", + "128 0 \n", + "129 0 \n", + "130 1 \n", + "131 0 \n", + "132 0 \n", + "133 2 \n", + "134 0 \n", + "135 2 \n", + "136 2 \n", + "137 2 \n", + "138 2 \n", + "139 1 \n", + "140 2 \n", + "141 2 \n", + "142 1 \n", + "143 2 \n", + "144 1 \n", + "145 1 \n", + "146 0 \n", + "147 0 \n", + "148 1 \n", + "149 0 \n", + "\n", + "[150 rows x 5 columns]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Join target variable to dataframe\n", + "### CODE HERE ###\n", + "df['target'] = y\n", + "# Randomly shuffle dataframe\n", + "### CODE HERE ###\n", + "df = df.sample(frac = 1).reset_index(drop=True)\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "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": 24, + "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": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 0, 2, 0, 2, 2, 2, 2, 0, 0, 2, 2, 1, 0, 1, 0, 2, 2, 0, 0, 2, 2,\n", + " 1, 2, 2, 0, 2, 2, 1, 1])" + ] + }, + "execution_count": 25, + "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": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9" + ] + }, + "execution_count": 26, + "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": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'Assn-03 (copy).ipynb' Assn-03.ipynb dataframe.csv\r\n" + ] + } + ], + "source": [ + "ls" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "import pickle\n", + "\n", + "# Save dataframe to csv\n", + "### CODE HERE ###\n", + "df.to_csv('dataframe.csv')\n", + "# Save model to model.pkl\n", + "### CODE HERE ###\n", + "file = open('model.pkl', 'wb')\n", + "pickle.dump(clf , file)\n", + "file.close()\n" + ] + }, + { + "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!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "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.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}