From 1afdd2b76a959f60f9d8244359f5babbb84f4255 Mon Sep 17 00:00:00 2001
From: Kunal Dudhavat <35394933+kunald11@users.noreply.github.com>
Date: Wed, 30 May 2018 01:14:22 +0530
Subject: [PATCH 1/3] Add files via upload
---
python-assn/assn-01/Kunal_Dudhavat-01.ipynb | 441 ++++++++++++++++++++
1 file changed, 441 insertions(+)
create mode 100644 python-assn/assn-01/Kunal_Dudhavat-01.ipynb
diff --git a/python-assn/assn-01/Kunal_Dudhavat-01.ipynb b/python-assn/assn-01/Kunal_Dudhavat-01.ipynb
new file mode 100644
index 0000000..eb04fed
--- /dev/null
+++ b/python-assn/assn-01/Kunal_Dudhavat-01.ipynb
@@ -0,0 +1,441 @@
+{
+ "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": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def least_int(num):\n",
+ " #write your code here\n",
+ " numList = [int(d) for d in str(num)]\n",
+ " numList.sort()\n",
+ " snum = int(''.join(map(str,numList)))\n",
+ " return snum\n",
+ "least_int(554698)"
+ ]
+ },
+ {
+ "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": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def function_a(string1):\n",
+ " #write your code here\n",
+ " lst = string1.split()\n",
+ " sr = \"\"\n",
+ " for i in range(0,len(lst)):\n",
+ " s = lst[i]\n",
+ " l = len(s)\n",
+ " if s[0] == 'a':\n",
+ " sr += s[l - 1]\n",
+ " return sr \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": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def remove_dup(mystring):\n",
+ " #write your code here\n",
+ " mylist = mystring.split()\n",
+ " newlist = []\n",
+ " for string in mylist:\n",
+ " if string not in newlist:\n",
+ " newlist.append(string)\n",
+ " mystring = \" \".join(newlist)\n",
+ " return mystring \n",
+ "\n",
+ "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": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "mystring = 'SatanoscillatemymetallicsonataS' #give any random string\n",
+ "#write your code here\n",
+ "def isPalindrome(mystring):\n",
+ " rev = mystring[::-1]\n",
+ " if mystring == rev:\n",
+ " print(\"It is a Palindrome!\")\n",
+ " else:\n",
+ " print(\"It is not a Palindrome!\")\n",
+ "isPalindrome(mystring)"
+ ]
+ },
+ {
+ "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": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def list_of_avgs(a):\n",
+ " #write your code here\n",
+ " sum_var=0\n",
+ " result=[]\n",
+ " for i in range(len(a)):\n",
+ " sum_var=sum_var+a[i]\n",
+ " result.append(sum_var/(i+1))\n",
+ " print(result)\n",
+ " return result\n",
+ "list_of_avgs([1, 2, 3, 4, 5]) "
+ ]
+ },
+ {
+ "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": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def asc_decc_list(a):\n",
+ " #write your code here\n",
+ " evenlist = a[::2]\n",
+ " oddlist = a[1::2]\n",
+ " oddlist.sort(reverse = True)\n",
+ " evenlist.sort()\n",
+ " newlist = [None]*(len(oddlist)+len(evenlist))\n",
+ " newlist[::2] = evenlist\n",
+ " newlist[1::2] = oddlist\n",
+ " return newlist\n",
+ "asc_decc_list([1, 8, 4, 5, 2, 5, 3, 9, 4])\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "___\n",
+ "**Q7) Write an iterator function to return the elements of the Fibonacci series.**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#write your code here\n",
+ "nterms = int(input(\"How many terms? \"))\n",
+ "\n",
+ "n1 = 0\n",
+ "n2 = 1\n",
+ "count = 0\n",
+ "\n",
+ "if nterms <= 0:\n",
+ " print(\"Please enter a positive integer\")\n",
+ "elif nterms == 1:\n",
+ " print(\"Fibonacci sequence upto\",nterms,\":\")\n",
+ " print(n1)\n",
+ "else:\n",
+ " print(\"Fibonacci sequence upto\",nterms,\":\")\n",
+ " while count < nterms:\n",
+ " print(n1,end=' , ')\n",
+ " nth = n1 + n2\n",
+ " \n",
+ " n1 = n2\n",
+ " n2 = nth\n",
+ " count += 1 \n"
+ ]
+ },
+ {
+ "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": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def sub_lists(a):\n",
+ " #write your code here\n",
+ " sublist = [[]]\n",
+ " for i in range(len(a)):\n",
+ " for j in range(i + 1, len(a)):\n",
+ " sub = a[i:j]\n",
+ " sublist.append(sub)\n",
+ " return sublist\n",
+ " \n",
+ "\n",
+ "l1 = [1, 2, 3, 4]\n",
+ "print(sub_lists(l1))"
+ ]
+ },
+ {
+ "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": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def modify_list(a):\n",
+ " #write your code here\n",
+ " lsum = sum(a)\n",
+ " a.append(lsum)\n",
+ " return a\n",
+ "\n",
+ "def reassign_list(a):\n",
+ " #write your code here\n",
+ " new_a = [x+1 for x in a]\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": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def char_position(a):\n",
+ " #write your code here\n",
+ " b = dict((i+1,a[i]) for i in range(len(a)) if (a[i]!= \" \"))\n",
+ " return b\n",
+ "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",
+ " #write your code here\n",
+ " import string\n",
+ " char_freq = dict.fromkeys(string.ascii_lowercase,0)\n",
+ " for x in a:\n",
+ " char_freq[x]=char_freq[x]+1\n",
+ " \n",
+ " for key in char_freq:\n",
+ " min_freq=char_freq[key]\n",
+ " for key2 in char_freq:\n",
+ " if char_freq[key2]>min_freq and min_freq==0:\n",
+ " min_freq=char_freq[key2]\n",
+ " elif char_freq[key2]0:\n",
+ " min_freq=char_freq[key2]\n",
+ "\n",
+ " for key2 in char_freq:\n",
+ " if char_freq[key2]==min_freq:\n",
+ " for i in range(char_freq[key2]):\n",
+ " print(key2,end='')\n",
+ " char_freq[key2]=0\n",
+ " break\n",
+ "\n",
+ "sort_by_freq(\"ifadhaiusbdufbugfsdbfubgsidf\")"
+ ]
+ },
+ {
+ "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.**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Q12\n",
+ "n=int(input())\n",
+ "read_file = open(\"myfile.txt\",\"r+\")\n",
+ "words=[x for x in read_file.read().split(\" \")]\n",
+ "write_file = open(words[n-1], \"w+\")\n",
+ "for i in range(1,len(words),1):\n",
+ " write_file.write(words[len((words))-i-1])\n",
+ " write_file.write(\" \")\n",
+ "write_file.close()"
+ ]
+ }
+ ],
+ "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
+}
From e80288883de0429ad716e7936057bff4301e87a8 Mon Sep 17 00:00:00 2001
From: Kunal Dudhavat <35394933+kunald11@users.noreply.github.com>
Date: Wed, 30 May 2018 01:14:59 +0530
Subject: [PATCH 2/3] Add files via upload
---
python-assn/assn-02/Kunal_Dudhavat-02.ipynb | 423 ++++++++++++++++++++
1 file changed, 423 insertions(+)
create mode 100644 python-assn/assn-02/Kunal_Dudhavat-02.ipynb
diff --git a/python-assn/assn-02/Kunal_Dudhavat-02.ipynb b/python-assn/assn-02/Kunal_Dudhavat-02.ipynb
new file mode 100644
index 0000000..715f61d
--- /dev/null
+++ b/python-assn/assn-02/Kunal_Dudhavat-02.ipynb
@@ -0,0 +1,423 @@
+{
+ "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": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "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.shape = (4,4)\n",
+ "print(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": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "#Create another array B which is made of square of each elements of B and print B.\n",
+ "#################################\n",
+ "B=np.empty([4,4],dtype='int')\n",
+ "B=A**2\n",
+ "print(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": 140,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[[ 0 0 0 0 0 0 0 0 240 206 217 81 0 0 0 0 218 2\n",
+ " 0 0 0 0 0 0 255 255 255 255]\n",
+ " [255 255 255 255 228 101 93 10 32 91 70 97 0 0 0 0 0 0\n",
+ " 0 0 32 32 32 49 32 32 51 53]\n",
+ " [ 32 32 54 55 32 49 49 52 32 49 48 49 32 32 57 55 32 49\n",
+ " 49 54 32 49 48 49 32 32 51 50]\n",
+ " [ 32 32 57 55 32 32 51 50 32 49 49 48 32 49 49 55 32 49\n",
+ " 48 57 32 49 49 50 32 49 50 49]\n",
+ " [ 32 32 51 50 32 32 57 55 10 32 49 49 52 32 49 49 52 32\n",
+ " 32 57 55 32 49 50 49 32 32 51]\n",
+ " [ 50 32 49 49 49 32 49 48 50 32 32 51 50 32 49 49 53 32\n",
+ " 49 48 52 32 32 57 55 32 49 49]\n",
+ " [ 50 32 49 48 49 32 32 51 50 32 32 52 48 32 32 53 48 32\n",
+ " 32 53 54 32 32 52 52 10 32 32]\n",
+ " [ 53 48 32 32 53 54 32 32 52 49 32 32 51 50 32 49 49 57\n",
+ " 32 49 48 52 32 49 49 49 32 49]\n",
+ " [ 49 53 32 49 48 49 32 32 51 50 32 49 49 56 32 32 57 55\n",
+ " 32 49 48 56 32 49 49 55 32 49]\n",
+ " [ 48 49 32 49 49 53 32 32 51 50 32 32 57 55 10 32 49 49\n",
+ " 52 32 49 48 49 32 32 51 50 32]\n",
+ " [ 32 57 57 32 49 48 52 32 49 49 49 32 49 49 53 32 49 48\n",
+ " 49 32 49 49 48 32 32 51 50 32]\n",
+ " [ 49 49 52 32 32 57 55 32 49 49 48 32 49 48 48 32 49 49\n",
+ " 49 32 49 48 57 32 49 48 56 32]\n",
+ " [ 49 50 49 10 32 32 51 50 32 49 48 50 32 49 49 52 32 49\n",
+ " 49 49 32 49 48 57 32 32 51 50]\n",
+ " [ 32 32 52 56 32 32 52 53 32 32 53 48 32 32 53 51 32 32\n",
+ " 53 51 32 32 49 48 32 32 51 53]\n",
+ " [ 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32\n",
+ " 51 53 10 32 32 51 53 32 32 51]\n",
+ " [ 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32\n",
+ " 32 51 53 32 32 51 53 32 32 51]\n",
+ " [ 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32\n",
+ " 32 51 53 32 32 51 53 32 32 51]\n",
+ " [ 53 32 32 51 53 32 32 51 53 10 32 32 51 53 32 32 51 53\n",
+ " 32 32 51 53 32 32 51 53 32 32]\n",
+ " [ 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53\n",
+ " 32 32 49 48 32 49 50 48 32 32]\n",
+ " [ 54 49 32 49 49 48 32 49 49 50 32 32 52 54 32 49 48 49\n",
+ " 32 49 48 57 32 49 49 50 10 32]\n",
+ " [ 49 49 54 32 49 50 49 32 32 52 48 32 32 57 49 32 32 53\n",
+ " 48 32 32 53 54 32 32 52 52 32]\n",
+ " [ 32 53 48 32 32 53 54 32 32 57 51 32 32 52 52 32 49 48\n",
+ " 48 32 49 49 54 32 49 50 49 32]\n",
+ " [ 49 49 50 32 49 48 49 32 32 54 49 32 32 51 57 10 32 49\n",
+ " 49 55 32 49 48 53 32 49 49 48]\n",
+ " [ 32 49 49 54 32 32 53 54 32 32 51 57 32 32 52 49 32 32\n",
+ " 49 48 32 49 49 50 32 49 49 52]\n",
+ " [ 32 49 48 53 32 49 49 48 32 49 49 54 32 32 52 48 32 49\n",
+ " 50 48 32 32 52 49 32 32 49 48]\n",
+ " [ 32 32 51 53 10 32 32 51 53 32 32 51 53 32 32 51 53 32\n",
+ " 32 51 53 32 32 51 53 32 32 51]\n",
+ " [ 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32\n",
+ " 32 51 53 32 32 51 53 32 32 51]\n",
+ " [ 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32\n",
+ " 32 51 53 10 0 10 112 114 105 110]]\n",
+ "[ 0 0 0 0 0 0 0 0 240 206 217 81 0 0 0 0 218 2\n",
+ " 0 0 0 0 0 0 255 255 255 255 255 255 255 255 228 101 93 10\n",
+ " 32 91 70 97 0 0 0 0 0 0 0 0 32 32 32 49 32 32\n",
+ " 51 53 32 32 54 55 32 49 49 52 32 49 48 49 32 32 57 55\n",
+ " 32 49 49 54 32 49 48 49 32 32 51 50 32 32 57 55 32 32\n",
+ " 51 50 32 49 49 48 32 49 49 55 32 49 48 57 32 49 49 50\n",
+ " 32 49 50 49 32 32 51 50 32 32 57 55 10 32 49 49 52 32\n",
+ " 49 49 52 32 32 57 55 32 49 50 49 32 32 51 50 32 49 49\n",
+ " 49 32 49 48 50 32 32 51 50 32 49 49 53 32 49 48 52 32\n",
+ " 32 57 55 32 49 49 50 32 49 48 49 32 32 51 50 32 32 52\n",
+ " 48 32 32 53 48 32 32 53 54 32 32 52 52 10 32 32 53 48\n",
+ " 32 32 53 54 32 32 52 49 32 32 51 50 32 49 49 57 32 49\n",
+ " 48 52 32 49 49 49 32 49 49 53 32 49 48 49 32 32 51 50\n",
+ " 32 49 49 56 32 32 57 55 32 49 48 56 32 49 49 55 32 49\n",
+ " 48 49 32 49 49 53 32 32 51 50 32 32 57 55 10 32 49 49\n",
+ " 52 32 49 48 49 32 32 51 50 32 32 57 57 32 49 48 52 32\n",
+ " 49 49 49 32 49 49 53 32 49 48 49 32 49 49 48 32 32 51\n",
+ " 50 32 49 49 52 32 32 57 55 32 49 49 48 32 49 48 48 32\n",
+ " 49 49 49 32 49 48 57 32 49 48 56 32 49 50 49 10 32 32\n",
+ " 51 50 32 49 48 50 32 49 49 52 32 49 49 49 32 49 48 57\n",
+ " 32 32 51 50 32 32 52 56 32 32 52 53 32 32 53 48 32 32\n",
+ " 53 51 32 32 53 51 32 32 49 48 32 32 51 53 32 32 51 53\n",
+ " 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 10 32\n",
+ " 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51\n",
+ " 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32\n",
+ " 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51\n",
+ " 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 10\n",
+ " 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32\n",
+ " 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53\n",
+ " 32 32 49 48 32 49 50 48 32 32 54 49 32 49 49 48 32 49\n",
+ " 49 50 32 32 52 54 32 49 48 49 32 49 48 57 32 49 49 50\n",
+ " 10 32 49 49 54 32 49 50 49 32 32 52 48 32 32 57 49 32\n",
+ " 32 53 48 32 32 53 54 32 32 52 52 32 32 53 48 32 32 53\n",
+ " 54 32 32 57 51 32 32 52 52 32 49 48 48 32 49 49 54 32\n",
+ " 49 50 49 32 49 49 50 32 49 48 49 32 32 54 49 32 32 51\n",
+ " 57 10 32 49 49 55 32 49 48 53 32 49 49 48 32 49 49 54\n",
+ " 32 32 53 54 32 32 51 57 32 32 52 49 32 32 49 48 32 49\n",
+ " 49 50 32 49 49 52 32 49 48 53 32 49 49 48 32 49 49 54\n",
+ " 32 32 52 48 32 49 50 48 32 32 52 49 32 32 49 48 32 32\n",
+ " 51 53 10 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51\n",
+ " 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32\n",
+ " 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51\n",
+ " 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32\n",
+ " 32 51 53 10 0 10 112 114 105 110]\n",
+ "[ 1 0 0 0 0 0 0 0 0 240 206 217 81 0 0 0 0 218\n",
+ " 2 0 0 0 0 0 0 255 255 255 255 255 255 255 255 228 101 93\n",
+ " 10 32 91 70 97 0 0 0 0 0 0 0 0 32 32 32 49 32\n",
+ " 32 51 53 32 32 54 55 32 49 49 52 32 49 48 49 32 32 57\n",
+ " 55 32 49 49 54 32 49 48 49 32 32 51 50 32 32 57 55 32\n",
+ " 32 51 50 32 49 49 48 32 49 49 55 32 49 48 57 32 49 49\n",
+ " 50 32 49 50 49 32 32 51 50 32 32 57 55 10 32 49 49 52\n",
+ " 32 49 49 52 32 32 57 55 32 49 50 49 32 32 51 50 32 49\n",
+ " 49 49 32 49 48 50 32 32 51 50 32 49 49 53 32 49 48 52\n",
+ " 32 32 57 55 32 49 49 50 32 49 48 49 32 32 51 50 32 32\n",
+ " 52 48 32 32 53 48 32 32 53 54 32 32 52 52 10 32 32 53\n",
+ " 48 32 32 53 54 32 32 52 49 32 32 51 50 32 49 49 57 32\n",
+ " 49 48 52 32 49 49 49 32 49 49 53 32 49 48 49 32 32 51\n",
+ " 50 32 49 49 56 32 32 57 55 32 49 48 56 32 49 49 55 32\n",
+ " 49 48 49 32 49 49 53 32 32 51 50 32 32 57 55 10 32 49\n",
+ " 49 52 32 49 48 49 32 32 51 50 32 32 57 57 32 49 48 52\n",
+ " 32 49 49 49 32 49 49 53 32 49 48 49 32 49 49 48 32 32\n",
+ " 51 50 32 49 49 52 32 32 57 55 32 49 49 48 32 49 48 48\n",
+ " 32 49 49 49 32 49 48 57 32 49 48 56 32 49 50 49 10 32\n",
+ " 32 51 50 32 49 48 50 32 49 49 52 32 49 49 49 32 49 48\n",
+ " 57 32 32 51 50 32 32 52 56 32 32 52 53 32 32 53 48 32\n",
+ " 32 53 51 32 32 53 51 32 32 49 48 32 32 51 53 32 32 51\n",
+ " 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 10\n",
+ " 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32\n",
+ " 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53\n",
+ " 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32\n",
+ " 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53\n",
+ " 10 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32\n",
+ " 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51\n",
+ " 53 32 32 49 48 32 49 50 48 32 32 54 49 32 49 49 48 32\n",
+ " 49 49 50 32 32 52 54 32 49 48 49 32 49 48 57 32 49 49\n",
+ " 50 10 32 49 49 54 32 49 50 49 32 32 52 48 32 32 57 49\n",
+ " 32 32 53 48 32 32 53 54 32 32 52 52 32 32 53 48 32 32\n",
+ " 53 54 32 32 57 51 32 32 52 52 32 49 48 48 32 49 49 54\n",
+ " 32 49 50 49 32 49 49 50 32 49 48 49 32 32 54 49 32 32\n",
+ " 51 57 10 32 49 49 55 32 49 48 53 32 49 49 48 32 49 49\n",
+ " 54 32 32 53 54 32 32 51 57 32 32 52 49 32 32 49 48 32\n",
+ " 49 49 50 32 49 49 52 32 49 48 53 32 49 49 48 32 49 49\n",
+ " 54 32 32 52 48 32 49 50 48 32 32 52 49 32 32 49 48 32\n",
+ " 32 51 53 10 32 32 51 53 32 32 51 53 32 32 51 53 32 32\n",
+ " 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53\n",
+ " 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32\n",
+ " 51 53 32 32 51 53 32 32 51 53 32 32 51 53 32 32 51 53\n",
+ " 32 32 51 53 10 0 10 112 114 105 110]\n",
+ "[[-1.70959053e-02 2.59759698e-03 1.37182524e-02 ... -1.75612468e-02\n",
+ " 1.07571267e-02 2.40498293e-02]\n",
+ " [ 3.40539936e-03 -5.21691889e-04 1.21487599e-02 ... -1.88415975e-07\n",
+ " 1.03528476e-03 1.31321075e-02]\n",
+ " [-9.43320303e-03 -1.28074581e-02 5.71105194e-03 ... 6.19979477e-03\n",
+ " 5.07207269e-04 -6.50443912e-03]\n",
+ " ...\n",
+ " [ 7.76289696e-03 2.92500197e-03 -1.24003235e-02 ... 1.36733358e-02\n",
+ " 1.29526136e-02 5.02107937e-03]\n",
+ " [-1.40916544e-02 2.57908976e-02 -4.13449709e-04 ... -5.02315078e-03\n",
+ " -9.43358502e-04 1.37318601e-02]\n",
+ " [-2.74217129e-03 -5.60632340e-03 -3.41017567e-02 ... 1.27718592e-02\n",
+ " -5.89726637e-03 -1.47913861e-02]]\n",
+ "(10, 785)\n",
+ "[ 20.16197655 11.17914099 -0.38878155 -27.72195217 23.27443093\n",
+ " 15.05961274 1.38725079 -2.16423043 22.14473215 -8.27130715]\n"
+ ]
+ }
+ ],
+ "source": [
+ "#Create a numpy array of shape (28,28) whose values are chosen randomly from 0-255\n",
+ "#################################\n",
+ "x=np.empty([28,28],dtype='uint8')\n",
+ "print(x)\n",
+ "#################################\n",
+ "\n",
+ "#Convert x into a vector (Make it of single dimension)\n",
+ "#################################\n",
+ "x.shape=(x.size)\n",
+ "print(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",
+ "print(x)\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(0, 0.01, (785, 10))\n",
+ "print(w)\n",
+ "#################################\n",
+ "\n",
+ "#Multiply the 2 matrices W and x. (Keep in mind the shape of the two)\n",
+ "#################################\n",
+ "print(w.T.shape)\n",
+ "if w.T.shape[1]==x.shape[0]:\n",
+ " mul = np.dot(w.T,x)\n",
+ " print(mul)\n",
+ "else :\n",
+ " print(\"Cannot be multiplied\") \n",
+ "#################################"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "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",
+ "import csv \n",
+ "import numpy as np\n",
+ "with open('Iris.csv', 'r') as f:\n",
+ " reader = csv.reader(f)\n",
+ " count=0\n",
+ " data = np.ones([150,5]) \n",
+ " for row in reader:\n",
+ " data[count]=row\n",
+ " count +=1\n",
+ " np.random.shuffle(data) \n",
+ " print(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 = np.ones([150,4])\n",
+ "y = np.ones([150,1])\n",
+ "x = data[...,0:4]\n",
+ "y[...,0] = data[...,4]\n",
+ "\n",
+ "print(x)\n",
+ "print(y)\n",
+ "#################################"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "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",
+ "print(data[0:10])\n",
+ "print(data[-10:])\n",
+ "'''\n",
+ "for i in range(150):\n",
+ " if y[i]==2:\n",
+ " print(x[i])\n",
+ "'''\n",
+ "print(x[(y==2).flatten()])\n",
+ "#################################"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "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",
+ "y1 = np.zeros([150,3])\n",
+ "\"\"\"for i in range(150):\n",
+ " if y[i]==0:\n",
+ " y1[i,0]=1\n",
+ " elif y[i]==1:\n",
+ " y1[i,1]=1\n",
+ " elif y[i]==2:\n",
+ " y1[i,2]=1\"\"\"\n",
+ "y1[(y==0).flatten(),0]=1\n",
+ "y1[(y==1).flatten(),1]=1\n",
+ "y1[(y==2).flatten(),2]=1\n",
+ "print(y1) \n",
+ "#################################"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "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.zeros([1,32,64,3],dtype='i1')\n",
+ "B[0:1,0:32,0:64,0:3] = A[0:32,0:64,0:3]\n",
+ "A = B\n",
+ "print(A.shape)\n",
+ "#################################"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Expected Output:
(1,32,64,3)"
+ ]
+ }
+ ],
+ "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
+}
From 3aaad50101a3836eeae52feb9807d7742443c99d Mon Sep 17 00:00:00 2001
From: Kunal Dudhavat <35394933+kunald11@users.noreply.github.com>
Date: Wed, 30 May 2018 01:15:46 +0530
Subject: [PATCH 3/3] Add files via upload
---
.../assn-03/Kunal_Dudhavat dataframe.csv | 151 ++
python-assn/assn-03/Kunal_Dudhavat model.pkl | Bin 0 -> 936 bytes
python-assn/assn-03/Kunal_Dudhavat-03.ipynb | 2269 +++++++++++++++++
3 files changed, 2420 insertions(+)
create mode 100644 python-assn/assn-03/Kunal_Dudhavat dataframe.csv
create mode 100644 python-assn/assn-03/Kunal_Dudhavat model.pkl
create mode 100644 python-assn/assn-03/Kunal_Dudhavat-03.ipynb
diff --git a/python-assn/assn-03/Kunal_Dudhavat dataframe.csv b/python-assn/assn-03/Kunal_Dudhavat dataframe.csv
new file mode 100644
index 0000000..819dfde
--- /dev/null
+++ b/python-assn/assn-03/Kunal_Dudhavat 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/Kunal_Dudhavat model.pkl b/python-assn/assn-03/Kunal_Dudhavat model.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..cec5579c3efe5289b345c2eb5ed83bd7585ca0c9
GIT binary patch
literal 936
zcmZuwO-$5K5N_E;U;zR7M-)YrU4aS+2#6Nh1Bt~AX`*RNOl`YwcdOlYr+o_&V*&>R
zLeQHDCoUdH)SCw{Wc7rJ7fu?D5kve-jD~1X)I@!KyXZmZ@H%fg`M#NN=8bza=c0iW
z+vE)0Bwsmhg^|G-R#bPeuK9*Cj)apX~?M`IX#AsVw4Gi=3W2P+ssen{Fz@*K+;K{gaf
zdE{c~YPw4(lyb>Eu3VCJLJ8Z2u$1oxk_OggiVa1ybZf+hV%jHxQ7s2SiNHuck~^x{
zl*`7jV}^2>@&!wEpp=y8qEi^;$WW%4$#`On(<~ctltQs>Wy~krNV7}_+er=kpgf)B
zGsEe>P$4jrP#I)ZsG5Rm5o-JbD|jYhXC^U>#}dc~wN!V#8+Hkdz)rz#5$gPchpOBM
zdqSbm$zR0iAut&Bsx!eVQXVyT6t20Wa}DY->{F#|;%XL($j}fgkI_Q*$4C_iL};W{
z2;QsUkEN+2-4IAq9~7a9P{;lyZC0m)=YJM;Hk6^K{ENc*#i_5)_(%7?&sE;oOa(u^
zGshdh@MpOPn|j{2RQ1x@h6!;rG@&9)az@f2A(Wr^+O8=PNl>7yEt%YtAkdzgEkS`GddoQH4!Cl4-b{Dwyf~6
zx5FMeYjb1XL>ya9T+-QI(d^Wi40v^NJm_xZV`H1Bz6*dGfL?z+>oFrDEdBnKvkt9dn-;oS^&E%C+@yZ7`5jx!*}6Ht+xd
literal 0
HcmV?d00001
diff --git a/python-assn/assn-03/Kunal_Dudhavat-03.ipynb b/python-assn/assn-03/Kunal_Dudhavat-03.ipynb
new file mode 100644
index 0000000..07beff3
--- /dev/null
+++ b/python-assn/assn-03/Kunal_Dudhavat-03.ipynb
@@ -0,0 +1,2269 @@
+{
+ "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": 68,
+ "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": 69,
+ "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": 69,
+ "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": 70,
+ "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": 70,
+ "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": 71,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['sepal length (cm)',\n",
+ " 'sepal width (cm)',\n",
+ " 'petal length (cm)',\n",
+ " 'petal width (cm)']"
+ ]
+ },
+ "execution_count": 71,
+ "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": 72,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " sepal length (cm) | \n",
+ " sepal width (cm) | \n",
+ " petal length (cm) | \n",
+ " petal width (cm) | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 5.1 | \n",
+ " 3.5 | \n",
+ " 1.4 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 4.9 | \n",
+ " 3.0 | \n",
+ " 1.4 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 4.7 | \n",
+ " 3.2 | \n",
+ " 1.3 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 4.6 | \n",
+ " 3.1 | \n",
+ " 1.5 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 5.0 | \n",
+ " 3.6 | \n",
+ " 1.4 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 5.4 | \n",
+ " 3.9 | \n",
+ " 1.7 | \n",
+ " 0.4 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 4.6 | \n",
+ " 3.4 | \n",
+ " 1.4 | \n",
+ " 0.3 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 5.0 | \n",
+ " 3.4 | \n",
+ " 1.5 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 4.4 | \n",
+ " 2.9 | \n",
+ " 1.4 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 4.9 | \n",
+ " 3.1 | \n",
+ " 1.5 | \n",
+ " 0.1 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 5.4 | \n",
+ " 3.7 | \n",
+ " 1.5 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 4.8 | \n",
+ " 3.4 | \n",
+ " 1.6 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 4.8 | \n",
+ " 3.0 | \n",
+ " 1.4 | \n",
+ " 0.1 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 4.3 | \n",
+ " 3.0 | \n",
+ " 1.1 | \n",
+ " 0.1 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 5.8 | \n",
+ " 4.0 | \n",
+ " 1.2 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 5.7 | \n",
+ " 4.4 | \n",
+ " 1.5 | \n",
+ " 0.4 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 5.4 | \n",
+ " 3.9 | \n",
+ " 1.3 | \n",
+ " 0.4 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 5.1 | \n",
+ " 3.5 | \n",
+ " 1.4 | \n",
+ " 0.3 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 5.7 | \n",
+ " 3.8 | \n",
+ " 1.7 | \n",
+ " 0.3 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 5.1 | \n",
+ " 3.8 | \n",
+ " 1.5 | \n",
+ " 0.3 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 5.4 | \n",
+ " 3.4 | \n",
+ " 1.7 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 5.1 | \n",
+ " 3.7 | \n",
+ " 1.5 | \n",
+ " 0.4 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 4.6 | \n",
+ " 3.6 | \n",
+ " 1.0 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 5.1 | \n",
+ " 3.3 | \n",
+ " 1.7 | \n",
+ " 0.5 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 4.8 | \n",
+ " 3.4 | \n",
+ " 1.9 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 5.0 | \n",
+ " 3.0 | \n",
+ " 1.6 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 5.0 | \n",
+ " 3.4 | \n",
+ " 1.6 | \n",
+ " 0.4 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 5.2 | \n",
+ " 3.5 | \n",
+ " 1.5 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 5.2 | \n",
+ " 3.4 | \n",
+ " 1.4 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 4.7 | \n",
+ " 3.2 | \n",
+ " 1.6 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 120 | \n",
+ " 6.9 | \n",
+ " 3.2 | \n",
+ " 5.7 | \n",
+ " 2.3 | \n",
+ "
\n",
+ " \n",
+ " | 121 | \n",
+ " 5.6 | \n",
+ " 2.8 | \n",
+ " 4.9 | \n",
+ " 2.0 | \n",
+ "
\n",
+ " \n",
+ " | 122 | \n",
+ " 7.7 | \n",
+ " 2.8 | \n",
+ " 6.7 | \n",
+ " 2.0 | \n",
+ "
\n",
+ " \n",
+ " | 123 | \n",
+ " 6.3 | \n",
+ " 2.7 | \n",
+ " 4.9 | \n",
+ " 1.8 | \n",
+ "
\n",
+ " \n",
+ " | 124 | \n",
+ " 6.7 | \n",
+ " 3.3 | \n",
+ " 5.7 | \n",
+ " 2.1 | \n",
+ "
\n",
+ " \n",
+ " | 125 | \n",
+ " 7.2 | \n",
+ " 3.2 | \n",
+ " 6.0 | \n",
+ " 1.8 | \n",
+ "
\n",
+ " \n",
+ " | 126 | \n",
+ " 6.2 | \n",
+ " 2.8 | \n",
+ " 4.8 | \n",
+ " 1.8 | \n",
+ "
\n",
+ " \n",
+ " | 127 | \n",
+ " 6.1 | \n",
+ " 3.0 | \n",
+ " 4.9 | \n",
+ " 1.8 | \n",
+ "
\n",
+ " \n",
+ " | 128 | \n",
+ " 6.4 | \n",
+ " 2.8 | \n",
+ " 5.6 | \n",
+ " 2.1 | \n",
+ "
\n",
+ " \n",
+ " | 129 | \n",
+ " 7.2 | \n",
+ " 3.0 | \n",
+ " 5.8 | \n",
+ " 1.6 | \n",
+ "
\n",
+ " \n",
+ " | 130 | \n",
+ " 7.4 | \n",
+ " 2.8 | \n",
+ " 6.1 | \n",
+ " 1.9 | \n",
+ "
\n",
+ " \n",
+ " | 131 | \n",
+ " 7.9 | \n",
+ " 3.8 | \n",
+ " 6.4 | \n",
+ " 2.0 | \n",
+ "
\n",
+ " \n",
+ " | 132 | \n",
+ " 6.4 | \n",
+ " 2.8 | \n",
+ " 5.6 | \n",
+ " 2.2 | \n",
+ "
\n",
+ " \n",
+ " | 133 | \n",
+ " 6.3 | \n",
+ " 2.8 | \n",
+ " 5.1 | \n",
+ " 1.5 | \n",
+ "
\n",
+ " \n",
+ " | 134 | \n",
+ " 6.1 | \n",
+ " 2.6 | \n",
+ " 5.6 | \n",
+ " 1.4 | \n",
+ "
\n",
+ " \n",
+ " | 135 | \n",
+ " 7.7 | \n",
+ " 3.0 | \n",
+ " 6.1 | \n",
+ " 2.3 | \n",
+ "
\n",
+ " \n",
+ " | 136 | \n",
+ " 6.3 | \n",
+ " 3.4 | \n",
+ " 5.6 | \n",
+ " 2.4 | \n",
+ "
\n",
+ " \n",
+ " | 137 | \n",
+ " 6.4 | \n",
+ " 3.1 | \n",
+ " 5.5 | \n",
+ " 1.8 | \n",
+ "
\n",
+ " \n",
+ " | 138 | \n",
+ " 6.0 | \n",
+ " 3.0 | \n",
+ " 4.8 | \n",
+ " 1.8 | \n",
+ "
\n",
+ " \n",
+ " | 139 | \n",
+ " 6.9 | \n",
+ " 3.1 | \n",
+ " 5.4 | \n",
+ " 2.1 | \n",
+ "
\n",
+ " \n",
+ " | 140 | \n",
+ " 6.7 | \n",
+ " 3.1 | \n",
+ " 5.6 | \n",
+ " 2.4 | \n",
+ "
\n",
+ " \n",
+ " | 141 | \n",
+ " 6.9 | \n",
+ " 3.1 | \n",
+ " 5.1 | \n",
+ " 2.3 | \n",
+ "
\n",
+ " \n",
+ " | 142 | \n",
+ " 5.8 | \n",
+ " 2.7 | \n",
+ " 5.1 | \n",
+ " 1.9 | \n",
+ "
\n",
+ " \n",
+ " | 143 | \n",
+ " 6.8 | \n",
+ " 3.2 | \n",
+ " 5.9 | \n",
+ " 2.3 | \n",
+ "
\n",
+ " \n",
+ " | 144 | \n",
+ " 6.7 | \n",
+ " 3.3 | \n",
+ " 5.7 | \n",
+ " 2.5 | \n",
+ "
\n",
+ " \n",
+ " | 145 | \n",
+ " 6.7 | \n",
+ " 3.0 | \n",
+ " 5.2 | \n",
+ " 2.3 | \n",
+ "
\n",
+ " \n",
+ " | 146 | \n",
+ " 6.3 | \n",
+ " 2.5 | \n",
+ " 5.0 | \n",
+ " 1.9 | \n",
+ "
\n",
+ " \n",
+ " | 147 | \n",
+ " 6.5 | \n",
+ " 3.0 | \n",
+ " 5.2 | \n",
+ " 2.0 | \n",
+ "
\n",
+ " \n",
+ " | 148 | \n",
+ " 6.2 | \n",
+ " 3.4 | \n",
+ " 5.4 | \n",
+ " 2.3 | \n",
+ "
\n",
+ " \n",
+ " | 149 | \n",
+ " 5.9 | \n",
+ " 3.0 | \n",
+ " 5.1 | \n",
+ " 1.8 | \n",
+ "
\n",
+ " \n",
+ "
\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": 72,
+ "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": 73,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " sepal length (cm) | \n",
+ " sepal width (cm) | \n",
+ " petal length (cm) | \n",
+ " petal width (cm) | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 5.1 | \n",
+ " 3.5 | \n",
+ " 1.4 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 4.9 | \n",
+ " 3.0 | \n",
+ " 1.4 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 4.7 | \n",
+ " 3.2 | \n",
+ " 1.3 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 4.6 | \n",
+ " 3.1 | \n",
+ " 1.5 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 5.0 | \n",
+ " 3.6 | \n",
+ " 1.4 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 5.4 | \n",
+ " 3.9 | \n",
+ " 1.7 | \n",
+ " 0.4 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 4.6 | \n",
+ " 3.4 | \n",
+ " 1.4 | \n",
+ " 0.3 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 5.0 | \n",
+ " 3.4 | \n",
+ " 1.5 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 4.4 | \n",
+ " 2.9 | \n",
+ " 1.4 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 4.9 | \n",
+ " 3.1 | \n",
+ " 1.5 | \n",
+ " 0.1 | \n",
+ "
\n",
+ " \n",
+ "
\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": 73,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Return the first 10 rows in df\n",
+ "df[:10]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 74,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " sepal length (cm) | \n",
+ " sepal width (cm) | \n",
+ " petal length (cm) | \n",
+ " petal width (cm) | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 140 | \n",
+ " 6.7 | \n",
+ " 3.1 | \n",
+ " 5.6 | \n",
+ " 2.4 | \n",
+ "
\n",
+ " \n",
+ " | 141 | \n",
+ " 6.9 | \n",
+ " 3.1 | \n",
+ " 5.1 | \n",
+ " 2.3 | \n",
+ "
\n",
+ " \n",
+ " | 142 | \n",
+ " 5.8 | \n",
+ " 2.7 | \n",
+ " 5.1 | \n",
+ " 1.9 | \n",
+ "
\n",
+ " \n",
+ " | 143 | \n",
+ " 6.8 | \n",
+ " 3.2 | \n",
+ " 5.9 | \n",
+ " 2.3 | \n",
+ "
\n",
+ " \n",
+ " | 144 | \n",
+ " 6.7 | \n",
+ " 3.3 | \n",
+ " 5.7 | \n",
+ " 2.5 | \n",
+ "
\n",
+ " \n",
+ " | 145 | \n",
+ " 6.7 | \n",
+ " 3.0 | \n",
+ " 5.2 | \n",
+ " 2.3 | \n",
+ "
\n",
+ " \n",
+ " | 146 | \n",
+ " 6.3 | \n",
+ " 2.5 | \n",
+ " 5.0 | \n",
+ " 1.9 | \n",
+ "
\n",
+ " \n",
+ " | 147 | \n",
+ " 6.5 | \n",
+ " 3.0 | \n",
+ " 5.2 | \n",
+ " 2.0 | \n",
+ "
\n",
+ " \n",
+ " | 148 | \n",
+ " 6.2 | \n",
+ " 3.4 | \n",
+ " 5.4 | \n",
+ " 2.3 | \n",
+ "
\n",
+ " \n",
+ " | 149 | \n",
+ " 5.9 | \n",
+ " 3.0 | \n",
+ " 5.1 | \n",
+ " 1.8 | \n",
+ "
\n",
+ " \n",
+ "
\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": 74,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Return the last 10 rows in df\n",
+ "df[-10:]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 75,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(150, 4)"
+ ]
+ },
+ "execution_count": 75,
+ "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": 76,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " sepal length (cm) | \n",
+ " sepal width (cm) | \n",
+ " petal length (cm) | \n",
+ " petal width (cm) | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | count | \n",
+ " 150.000000 | \n",
+ " 150.000000 | \n",
+ " 150.000000 | \n",
+ " 150.000000 | \n",
+ "
\n",
+ " \n",
+ " | mean | \n",
+ " 5.843333 | \n",
+ " 3.054000 | \n",
+ " 3.758667 | \n",
+ " 1.198667 | \n",
+ "
\n",
+ " \n",
+ " | std | \n",
+ " 0.828066 | \n",
+ " 0.433594 | \n",
+ " 1.764420 | \n",
+ " 0.763161 | \n",
+ "
\n",
+ " \n",
+ " | min | \n",
+ " 4.300000 | \n",
+ " 2.000000 | \n",
+ " 1.000000 | \n",
+ " 0.100000 | \n",
+ "
\n",
+ " \n",
+ " | 25% | \n",
+ " 5.100000 | \n",
+ " 2.800000 | \n",
+ " 1.600000 | \n",
+ " 0.300000 | \n",
+ "
\n",
+ " \n",
+ " | 50% | \n",
+ " 5.800000 | \n",
+ " 3.000000 | \n",
+ " 4.350000 | \n",
+ " 1.300000 | \n",
+ "
\n",
+ " \n",
+ " | 75% | \n",
+ " 6.400000 | \n",
+ " 3.300000 | \n",
+ " 5.100000 | \n",
+ " 1.800000 | \n",
+ "
\n",
+ " \n",
+ " | max | \n",
+ " 7.900000 | \n",
+ " 4.400000 | \n",
+ " 6.900000 | \n",
+ " 2.500000 | \n",
+ "
\n",
+ " \n",
+ "
\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": 76,
+ "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": 77,
+ "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": 77,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Retrieve only sepal_length from df\n",
+ "df[df.columns[0]]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 78,
+ "metadata": {
+ "scrolled": true
+ },
+ "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": 78,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Return 5th row of df\n",
+ "df.loc[4]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 79,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1.4"
+ ]
+ },
+ "execution_count": 79,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Return petal length of 5th row of df\n",
+ "df.iloc[4,2]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 80,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " sepal length (cm) | \n",
+ " sepal width (cm) | \n",
+ " petal length (cm) | \n",
+ " petal width (cm) | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 41 | \n",
+ " 4.5 | \n",
+ " 2.3 | \n",
+ " 1.3 | \n",
+ " 0.3 | \n",
+ "
\n",
+ " \n",
+ " | 53 | \n",
+ " 5.5 | \n",
+ " 2.3 | \n",
+ " 4.0 | \n",
+ " 1.3 | \n",
+ "
\n",
+ " \n",
+ " | 54 | \n",
+ " 6.5 | \n",
+ " 2.8 | \n",
+ " 4.6 | \n",
+ " 1.5 | \n",
+ "
\n",
+ " \n",
+ " | 55 | \n",
+ " 5.7 | \n",
+ " 2.8 | \n",
+ " 4.5 | \n",
+ " 1.3 | \n",
+ "
\n",
+ " \n",
+ " | 57 | \n",
+ " 4.9 | \n",
+ " 2.4 | \n",
+ " 3.3 | \n",
+ " 1.0 | \n",
+ "
\n",
+ " \n",
+ " | 59 | \n",
+ " 5.2 | \n",
+ " 2.7 | \n",
+ " 3.9 | \n",
+ " 1.4 | \n",
+ "
\n",
+ " \n",
+ " | 60 | \n",
+ " 5.0 | \n",
+ " 2.0 | \n",
+ " 3.5 | \n",
+ " 1.0 | \n",
+ "
\n",
+ " \n",
+ " | 62 | \n",
+ " 6.0 | \n",
+ " 2.2 | \n",
+ " 4.0 | \n",
+ " 1.0 | \n",
+ "
\n",
+ " \n",
+ " | 67 | \n",
+ " 5.8 | \n",
+ " 2.7 | \n",
+ " 4.1 | \n",
+ " 1.0 | \n",
+ "
\n",
+ " \n",
+ " | 68 | \n",
+ " 6.2 | \n",
+ " 2.2 | \n",
+ " 4.5 | \n",
+ " 1.5 | \n",
+ "
\n",
+ " \n",
+ " | 69 | \n",
+ " 5.6 | \n",
+ " 2.5 | \n",
+ " 3.9 | \n",
+ " 1.1 | \n",
+ "
\n",
+ " \n",
+ " | 71 | \n",
+ " 6.1 | \n",
+ " 2.8 | \n",
+ " 4.0 | \n",
+ " 1.3 | \n",
+ "
\n",
+ " \n",
+ " | 72 | \n",
+ " 6.3 | \n",
+ " 2.5 | \n",
+ " 4.9 | \n",
+ " 1.5 | \n",
+ "
\n",
+ " \n",
+ " | 73 | \n",
+ " 6.1 | \n",
+ " 2.8 | \n",
+ " 4.7 | \n",
+ " 1.2 | \n",
+ "
\n",
+ " \n",
+ " | 76 | \n",
+ " 6.8 | \n",
+ " 2.8 | \n",
+ " 4.8 | \n",
+ " 1.4 | \n",
+ "
\n",
+ " \n",
+ " | 79 | \n",
+ " 5.7 | \n",
+ " 2.6 | \n",
+ " 3.5 | \n",
+ " 1.0 | \n",
+ "
\n",
+ " \n",
+ " | 80 | \n",
+ " 5.5 | \n",
+ " 2.4 | \n",
+ " 3.8 | \n",
+ " 1.1 | \n",
+ "
\n",
+ " \n",
+ " | 81 | \n",
+ " 5.5 | \n",
+ " 2.4 | \n",
+ " 3.7 | \n",
+ " 1.0 | \n",
+ "
\n",
+ " \n",
+ " | 82 | \n",
+ " 5.8 | \n",
+ " 2.7 | \n",
+ " 3.9 | \n",
+ " 1.2 | \n",
+ "
\n",
+ " \n",
+ " | 83 | \n",
+ " 6.0 | \n",
+ " 2.7 | \n",
+ " 5.1 | \n",
+ " 1.6 | \n",
+ "
\n",
+ " \n",
+ " | 87 | \n",
+ " 6.3 | \n",
+ " 2.3 | \n",
+ " 4.4 | \n",
+ " 1.3 | \n",
+ "
\n",
+ " \n",
+ " | 89 | \n",
+ " 5.5 | \n",
+ " 2.5 | \n",
+ " 4.0 | \n",
+ " 1.3 | \n",
+ "
\n",
+ " \n",
+ " | 90 | \n",
+ " 5.5 | \n",
+ " 2.6 | \n",
+ " 4.4 | \n",
+ " 1.2 | \n",
+ "
\n",
+ " \n",
+ " | 92 | \n",
+ " 5.8 | \n",
+ " 2.6 | \n",
+ " 4.0 | \n",
+ " 1.2 | \n",
+ "
\n",
+ " \n",
+ " | 93 | \n",
+ " 5.0 | \n",
+ " 2.3 | \n",
+ " 3.3 | \n",
+ " 1.0 | \n",
+ "
\n",
+ " \n",
+ " | 94 | \n",
+ " 5.6 | \n",
+ " 2.7 | \n",
+ " 4.2 | \n",
+ " 1.3 | \n",
+ "
\n",
+ " \n",
+ " | 98 | \n",
+ " 5.1 | \n",
+ " 2.5 | \n",
+ " 3.0 | \n",
+ " 1.1 | \n",
+ "
\n",
+ " \n",
+ " | 99 | \n",
+ " 5.7 | \n",
+ " 2.8 | \n",
+ " 4.1 | \n",
+ " 1.3 | \n",
+ "
\n",
+ " \n",
+ " | 101 | \n",
+ " 5.8 | \n",
+ " 2.7 | \n",
+ " 5.1 | \n",
+ " 1.9 | \n",
+ "
\n",
+ " \n",
+ " | 106 | \n",
+ " 4.9 | \n",
+ " 2.5 | \n",
+ " 4.5 | \n",
+ " 1.7 | \n",
+ "
\n",
+ " \n",
+ " | 108 | \n",
+ " 6.7 | \n",
+ " 2.5 | \n",
+ " 5.8 | \n",
+ " 1.8 | \n",
+ "
\n",
+ " \n",
+ " | 111 | \n",
+ " 6.4 | \n",
+ " 2.7 | \n",
+ " 5.3 | \n",
+ " 1.9 | \n",
+ "
\n",
+ " \n",
+ " | 113 | \n",
+ " 5.7 | \n",
+ " 2.5 | \n",
+ " 5.0 | \n",
+ " 2.0 | \n",
+ "
\n",
+ " \n",
+ " | 114 | \n",
+ " 5.8 | \n",
+ " 2.8 | \n",
+ " 5.1 | \n",
+ " 2.4 | \n",
+ "
\n",
+ " \n",
+ " | 118 | \n",
+ " 7.7 | \n",
+ " 2.6 | \n",
+ " 6.9 | \n",
+ " 2.3 | \n",
+ "
\n",
+ " \n",
+ " | 119 | \n",
+ " 6.0 | \n",
+ " 2.2 | \n",
+ " 5.0 | \n",
+ " 1.5 | \n",
+ "
\n",
+ " \n",
+ " | 121 | \n",
+ " 5.6 | \n",
+ " 2.8 | \n",
+ " 4.9 | \n",
+ " 2.0 | \n",
+ "
\n",
+ " \n",
+ " | 122 | \n",
+ " 7.7 | \n",
+ " 2.8 | \n",
+ " 6.7 | \n",
+ " 2.0 | \n",
+ "
\n",
+ " \n",
+ " | 123 | \n",
+ " 6.3 | \n",
+ " 2.7 | \n",
+ " 4.9 | \n",
+ " 1.8 | \n",
+ "
\n",
+ " \n",
+ " | 126 | \n",
+ " 6.2 | \n",
+ " 2.8 | \n",
+ " 4.8 | \n",
+ " 1.8 | \n",
+ "
\n",
+ " \n",
+ " | 128 | \n",
+ " 6.4 | \n",
+ " 2.8 | \n",
+ " 5.6 | \n",
+ " 2.1 | \n",
+ "
\n",
+ " \n",
+ " | 130 | \n",
+ " 7.4 | \n",
+ " 2.8 | \n",
+ " 6.1 | \n",
+ " 1.9 | \n",
+ "
\n",
+ " \n",
+ " | 132 | \n",
+ " 6.4 | \n",
+ " 2.8 | \n",
+ " 5.6 | \n",
+ " 2.2 | \n",
+ "
\n",
+ " \n",
+ " | 133 | \n",
+ " 6.3 | \n",
+ " 2.8 | \n",
+ " 5.1 | \n",
+ " 1.5 | \n",
+ "
\n",
+ " \n",
+ " | 134 | \n",
+ " 6.1 | \n",
+ " 2.6 | \n",
+ " 5.6 | \n",
+ " 1.4 | \n",
+ "
\n",
+ " \n",
+ " | 142 | \n",
+ " 5.8 | \n",
+ " 2.7 | \n",
+ " 5.1 | \n",
+ " 1.9 | \n",
+ "
\n",
+ " \n",
+ " | 146 | \n",
+ " 6.3 | \n",
+ " 2.5 | \n",
+ " 5.0 | \n",
+ " 1.9 | \n",
+ "
\n",
+ " \n",
+ "
\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": 80,
+ "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",
+ "df1 = df[(df[df.columns[1]] < 2.9)]\n",
+ "df1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 81,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | sepal length (cm) | \n",
+ " 5.843333 | \n",
+ "
\n",
+ " \n",
+ " | sepal width (cm) | \n",
+ " 3.054000 | \n",
+ "
\n",
+ " \n",
+ " | petal length (cm) | \n",
+ " 3.758667 | \n",
+ "
\n",
+ " \n",
+ " | petal width (cm) | \n",
+ " 1.198667 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " 0\n",
+ "sepal length (cm) 5.843333\n",
+ "sepal width (cm) 3.054000\n",
+ "petal length (cm) 3.758667\n",
+ "petal width (cm) 1.198667"
+ ]
+ },
+ "execution_count": 81,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Get mean of each column in df\n",
+ "# Hint: use numpy.mean\n",
+ "import numpy as np\n",
+ "v = [np.mean(df['sepal length (cm)']),np.mean(df['sepal width (cm)']),np.mean(df['petal length (cm)']),np.mean(df['petal width (cm)'])]\n",
+ "f = pd.DataFrame(Z,index=['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)'])\n",
+ "f\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": 82,
+ "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": 83,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "sl = df['sepal length (cm)']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 84,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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mDp1Kj/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": 85,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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ilfKM4XZwEvu/oq7HwFuBT5ewv5ERKSHSpkUJgLbM8o7onVJf2pmz5jZnWY2uYTxiIhIAaVMCpZjnSfK/wHUuPsM4H7gppwNmS0zsyYza3rrrbd6OUwREUkpZVLYAWS+858E7Mys4O673f1wVPwRUJerIXdf5+717l4/fvz4kgQrIiKlTQpPASeb2VQzGwZcAGzKrGBmJ2QUlwBbSxiPiIgUULKrj9y91cwuAX4OVADr3f03ZvYPQJO7bwIuNbMlQCvwDvC5UsUjIiKFmXtymL9/q6+v96ampnKHISIyoJhZs7vXF6qnTzSLiEhMSUFERGJKCiIiElNSEBGRmJKCiIjElBRERCSmpCAiIjElBRERiSkpiIhITElBRERiSgoiIhJTUhARkZiSgoiIxJQUREQkpqQgIiIxJQUREYkpKYiISExJQUREYiX7jmYRef9qaWlhx44dHDp0qNyhvO9UVVUxadIkKisru7W9koKI9LodO3YwevRoampqMLNyh/O+4e7s3r2bHTt2MHXq1G61oeEjEel1hw4dYuzYsUoIfczMGDt2bI/O0JQURKQklBDKo6f7XUlBRAaliooKamtrOe200/izP/szDhw4kLf+P/7jPxbVbk1NDW+//XaX4/n85z/P888/32H9jTfeyCWXXALAPffck1Vn4cKFNDU1dbmvnlBSEJFBacSIEWzZsoXnnnuOYcOGcd111+WtX2xS6K7rr7+eadOm5a2TTArloKQgImW3cSPU1MCQIeHnxo29235DQwMvvfQSABs2bGD27NnU1tbyhS98gba2Nq644goOHjxIbW0tS5cuBeATn/gEdXV1TJ8+nXXr1uVt//bbb+dLX/oSAGvWrOGkk04C4OWXX2bevHlA9rv+G264gVNOOYUFCxbw6KOPAvDYY4+xadMmvvKVr1BbW8vLL78MwB133MHs2bM55ZRT2Lx5c+/umByUFESkrDZuhGXLYNs2cA8/ly3rvcTQ2trKvffey+mnn87WrVu57bbbePTRR9myZQsVFRVs3LiR7373u/GZxcao4/Xr19Pc3ExTUxNr165l9+7dnfYxf/78+IC9efNmxo4dy+uvv84jjzxCQ0NDVt1du3bR2NjIo48+yn333RefGZx99tksWbKE733ve2zZsoUPfvCDcfxPPvkk11xzDd/4xjd6Z6fkoaQgImV15ZWQHO4/cCCs74nUO//6+nqqq6u56KKLeOCBB2hububMM8+ktraWBx54gFdeeSXn9mvXrmXmzJnMmTOH7du38+KLL3ba14QJE9i3bx979+5l+/btXHjhhTz88MNs3ry5Q1J44oknWLhwIePHj2fYsGH8xV/8Rd7n8clPfhKAuro6Xn311a7thG7Q5xREpKxee61r64uVeuefyd357Gc/y3e+85282z700EPcf//9PP7444wcOZKFCxcWvMxz7ty53HDDDZx66qk0NDSwfv16Hn/8cf7lX/6lQ92uXCE0fPhwIEyct7a2Fr1dd+lMQUTKqrq6a+t7YtGiRdx55528+eabALzzzjts27YNgMrKSlpaWgDYs2cPxx57LCNHjuS3v/0tv/zlLwu2PX/+fP75n/+Z+fPnc8YZZ/Dggw8yfPhwxowZk1XvrLPO4qGHHmL37t20tLRwxx13xI+NHj2avXv39tbT7RYlBREpq29/G0aOzF43cmRY39umTZvGt771LT7ykY8wY8YMPvzhD7Nr1y4Ali1bxowZM1i6dCmLFy+mtbWVGTNm8PWvf505c+YUbLuhoYHt27czf/58KioqmDx5cjzJnOmEE05g9erVzJ07l3PPPZdZs2bFj11wwQV873vf44wzzognmvuauXtZOu6u+vp67+vrdkWka7Zu3cqHPvShoutv3BjmEF57LZwhfPvbEF0EJN2Qa/+bWbO71xfaVnMKIlJ2S5cqCfQXGj4SEZGYkoKIiMSUFEREJKakICIiMSUFERGJKSmIyKDU17fO7u4ttfN59dVXufnmm+Ny5m22S0VJQUTKL/l5qV74/FR/u3V2dySTQl8oaVIws8Vm9oKZvWRmV+R4fLiZ3RY9/oSZ1ZQynn4t+U/Q3t7x8eS6gwezy4cPw7592et27swuv/deqJdp//7scq77qyT7TpZFumv1arj88vT/gHsor17da12U+tbZSbn6ADjqqKO48sor4xvtvfHGG0C4xfacOXM488wzWbVqFUcddRQAV1xxBZs3b6a2tparr74agJ07d7J48WJOPvlkvvrVr/bK/sni7iVZgArgZeAkYBjwa2Baos7FwHXR7xcAtxVqt66uzrvjmGPcw19b58uIEYUf37DBfcoUd7Pwc/ny7PKGDd0IrrHRfeVK9/b2UF61yr22Nvx0D+snTnSfMMG9rS2sSwU1d24oHzqU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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')\n",
+ "pw = df['petal width (cm)']\n",
+ "pl = df['petal length (cm)']\n",
+ "ax0 = fig.add_subplot(111)\n",
+ "ax0.scatter(pw, y, c = 'b', marker='o', label='Petal width')\n",
+ "ax0.scatter(pl, y, c = 'r', marker='x', label='Petal length')\n",
+ "ax0.set_xlabel('petal length/width (cm)')\n",
+ "ax0.set_ylabel('flower')\n",
+ "ax0.legend()\n",
+ "\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 86,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAEKCAYAAAARnO4WAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3X+YVPV59/H3zaqLPyECF4oUEeOSoiLIViMkuorRxFgTTXKpj2215Ak1Nra2T7VVH5+YH6RptH2S2mIuGpLYlqZWjIbHGuOPsmqUYACJv8FIQQm6riiIqMjC/fwxZ9bdYWbOd3bOOfPr87quvWDOnDnnniPee+ae+/v9mrsjIiLNb1itAxARkWwo4YuItAglfBGRFqGELyLSIpTwRURahBK+iEiLUMIXEWkRSvgiIi1CCV9EpEXsVesABho9erRPnDix1mGIiDSMlStXvubuY0L2rauEP3HiRFasWFHrMEREGoaZbQjdVyUdEZEWoYQvItIiUkv4ZjbZzFYP+HnTzK5I63wiIlJeajV8d18DTAMwszbgN8AdlR5n586dbNy4kXfffTfhCCXU8OHDGT9+PHvvvXetQxGRKmT1pe1s4AV3D/5yIW/jxo0ceOCBTJw4ETNLITQpx93ZvHkzGzdu5Igjjqh1OCJShaxq+BcAPyr2hJnNNbMVZrait7d3j+ffffddRo0apWRfI2bGqFGj9AlLpAmknvDNbB/gHOC2Ys+7+wJ373T3zjFjireSKtnXlq6/yJ56FvWwbOIyuod1s2ziMnoW9dQ6pFhZlHQ+Aaxy9/q/GiIiAXoW9bBm7hp2v70bgB0bdrBm7hoAxl40tpahlZVFSedCSpRzGsW8efM4+uijmTp1KtOmTWP58uWJHr+7u5uzzz47eHu17rzzTp555pn+x11dXRrwJlKBddeu60/2ebvf3s26a9fVKKIwqd7hm9l+wMeAP0rzPGlatmwZd911F6tWraK9vZ3XXnuN9957r9ZhVeXOO+/k7LPPZsqUKbUORaQh7XhxR0Xb60Wqd/ju/ra7j3L3rWmeZ6Ck62ovv/wyo0ePpr29HYDRo0czbtw4AFauXMkpp5zCjBkzOPPMM3n55ZeB3B3zFVdcwcyZMznmmGN47LHHAHjssceYOXMm06dPZ+bMmaxZsyY4ju3btzNnzhx+53d+h+nTp/OTn/wEgB/+8Iecd955fPzjH+eoo47iqquu6n/NwoUL6ejooKuriy984Qt86Utf4tFHH2XJkiVceeWVTJs2jRdeeAGA2267jRNOOIGOjg4efvjhqq6ZSLNrn9Be0fZ60VQjbfN1tR0bdoC/X1erJumfccYZvPTSS3R0dHDZZZfx4IMPArnxAZdffjmLFy9m5cqVzJkzh2uvvbb/ddu3b+fRRx9l/vz5zJkzB4APfehDPPTQQzz++ON89atf5ZprrgmOY968eZx22mn88pe/ZOnSpVx55ZVs374dgNWrV3Prrbfy5JNPcuutt/LSSy+xadMmvva1r/GLX/yC++67j+eeew6AmTNncs4553DDDTewevVqjjzySAD6+vp47LHH+Pa3v81XvvKVIV8vkVYwad4khu03OH0O228Yk+ZNqlFEYepq8rRqlaurDfWLlAMOOICVK1fy8MMPs3TpUs4//3y++c1v0tnZyVNPPcXHPvYxAHbt2sWhhx7a/7oLL7wQgJNPPpk333yTLVu2sG3bNi6++GKef/55zIydO3cGx3HvvfeyZMkSbrzxRiDXrvriiy8CMHv2bEaMGAHAlClT2LBhA6+99hqnnHIKBx98MACf+9znWLt2bcnjn3feeQDMmDGD9evXB8cl0orGXjSWl3/wMlse2NK/7aCTDqrrL2yhyRJ+WnW1trY2urq66Orq4thjj+WWW25hxowZHH300SxbtqzoawpbGc2M6667jlNPPZU77riD9evX09XVFRyDu3P77bczefLkQduXL1/eX27Kx9rX14e7h79B6D9G/vUiUtray9YOSvYAWx7YwtrL1tIxv6NGUcVrqpJOGnW1NWvW8Pzzz/c/Xr16NYcffjiTJ0+mt7e3P+Hv3LmTp59+un+/W2+9FYCf//znjBgxghEjRrB161YOO+wwIFd7r8SZZ57JTTfd1J/IH3/88bL7n3DCCTz44IO88cYb9PX1cfvtt/c/d+CBB7Jt27aKzi8i79u0YFNF2+tFUyX8NOpqb731FhdffDFTpkxh6tSpPPPMM1x//fXss88+LF68mL/8y7/kuOOOY9q0aTz66KP9r/vABz7AzJkzufTSS1m4cCEAV111FVdffTWzZs1i165dFcVx3XXXsXPnTqZOncoxxxzDddddV3b/ww47jGuuuYYTTzyR008/nSlTpvSXfS64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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",
+ "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": 87,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEKCAYAAAD9xUlFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzsvXl4HNWZ7/85vaq1WLIlW/KGZcCYMWDLYBxwuOwhcEOAMCQh9yYxZAYPmRnmlzuZkGUm+5PJnUkySSZzEyAhwcwwGUJCgCSEEIYQ9sU2EjarAe+2ZFm29lav5/dH9ylVVVd1V29az+d59Ejqpep0t3Te+n7f97xHSCnRaDQajQbAN9kD0Gg0Gs3UQQcFjUaj0RjooKDRaDQaAx0UNBqNRmOgg4JGo9FoDHRQ0Gg0Go2BDgoajUajMdBBQaPRaDQGOihoNBqNxiAw2QMolpaWFtne3j7Zw9BoNJppxdatW49IKecXelxVg4IQ4v8Afw5IYDtwvZRyzHR/GLgTOAPoAz4opdyd75jt7e1s2bKlamPWaDSamYgQYo+Xx1XNPhJCLAb+BlgnpTwV8APX2h72Z8AxKeWJwLeBf6rWeDQajUZTmGrnFAJARAgRAGqBg7b7rwQ2Z3/+OXCREEJUeUwajUajcaFqQUFKeQD4JrAXOAQMSCkftj1sMbAv+/gkMAA0V2tMGo1Go8lP1XIKQoi5ZJTAcqAfuEcI8WEp5X+YH+bw1Jxe3kKITcAmgOOOOy7nCYlEgv379zM2NpZzn2biqKmpYcmSJQSDwckeikajKZFqJpovBnZJKXsBhBD3AhsAc1DYDywF9mctpkbgqP1AUsrbgNsA1q1blxM09u/fT0NDA+3t7Wj3aXKQUtLX18f+/ftZvnz5ZA9Ho9GUSDVzCnuBs4QQtdk8wUXAq7bHPABszP58DfCoLGHXn7GxMZqbm3VAmESEEDQ3N2u1ptFMc6qZU3iOTPJ4G5lyVB9wmxDiK0KIK7IPux1oFkK8Cfwt8JlSz6cDwuSjPwONZvpT1XUKUsovAl+03fwF0/1jwPurOQaNRqMplq0Ht5KSKdYvXj/ZQ5lwdJuLCvG1r32NU045hdWrV9PR0cFzzz1X0eM/9thjXH755Z5vL5f77ruPV155xfj9/PPP14sGNbOGTz78ST71+09N9jAmhWnX5mIq8swzz/DrX/+abdu2EQ6HOXLkCPF4fLKHVRb33Xcfl19+OatWrZrsoWg0E87hkcPUheomexiTglYKFeDQoUO0tLQQDocBaGlpYdGiRQBs3bqV8847jzPOOIN3v/vdHDp0CMhceX/iE59gw4YNnHrqqTz//PMAPP/882zYsIG1a9eyYcMGXn/9dc/jGBkZ4WMf+xhnnnkma9eu5f777wfgjjvu4Oqrr+bSSy9lxYoV3HzzzcZzbr/9dk466STOP/98brjhBv76r/+ap59+mgceeIBPfepTdHR08NZbbwFwzz33sH79ek466SSeeOKJ8t84jWaK0hftI56a3hd2pTLjlMInHvoEnd2dFT1mR1sH37n0O673X3LJJXzlK1/hpJNO4uKLL+aDH/wg5513HolEgptuuon777+f+fPnc/fdd/P3f//3/PjHPwYyk/jTTz/N448/zsc+9jF27NjBySefzOOPP04gEOCRRx7hc5/7HL/4xS88jfNrX/saF154IT/+8Y/p7+9n/fr1XHzxxQB0dnby4osvEg6HWblyJTfddBN+v5+vfvWrbNu2jYaGBi688ELWrFnDhg0buOKKK7j88su55pprjOMnk0mef/55HnzwQb785S/zyCOPlPGuajRTEyklR6NHmReZN9lDmRRmXFCYDOrr69m6dStPPPEEf/jDH/jgBz/I//2//5d169axY8cO3vWudwGQSqVYuHCh8bwPfehDAJx77rkMDg7S39/P0NAQGzduZOfOnQghSCQSnsfx8MMP88ADD/DNb34TyJTq7t27F4CLLrqIxsZGAFatWsWePXs4cuQI5513HvPmZf743//+9/PGG2+4Hv/qq68G4IwzzmD37t2ex6XRTCcGY4Mk00liydhkD2VSmHFBId8VfTXx+/2cf/75nH/++Zx22mls3ryZM844g1NOOYVnnnnG8Tn2Ek4hBJ///Oe54IIL+OUvf8nu3bs5//zzPY9BSskvfvELVq5cabn9ueeeM6wtNdZkMkmxS0LUMdTzNZqZSF+0D2DW2kc6p1ABXn/9dXbu3Gn83tnZybJly1i5ciW9vb1GUEgkErz88svG4+6++24AnnzySRobG2lsbGRgYIDFixcDmVxAMbz73e/me9/7njHZv/jii3kfv379ev74xz9y7NgxksmkxaZqaGhgaGioqPNrNDOBvlEdFDRl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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",
+ "number = np.arange(150)\n",
+ "sl = df['sepal length (cm)']\n",
+ "fig = plt.figure('Sepal length')\n",
+ "ax0 = fig.add_subplot(111)\n",
+ "ax0.plot(number, sl, c = 'g', label='Sepal length')\n",
+ "ax0.set_xlabel('instance')\n",
+ "ax0.set_ylabel('sepal length (cm)')\n",
+ "ax0.legend()\n",
+ "\n",
+ "plt.show()\n",
+ "### CODE HERE ###"
+ ]
+ },
+ {
+ "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": 88,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "NameError",
+ "evalue": "name 'shuffle' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mdf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mshuffle\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;31mNameError\u001b[0m: name 'shuffle' is not defined"
+ ]
+ }
+ ],
+ "source": [
+ "# Join target variable to dataframe\n",
+ "df['target']=y\n",
+ "# Randomly shuffle dataframe\n",
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "\n",
+ "df = shuffle(df)\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "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": 63,
+ "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": 64,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0, 0, 0, 2, 1, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 1, 2, 2, 0, 0, 1, 1,\n",
+ " 1, 0, 2, 2, 0, 2, 2, 1])"
+ ]
+ },
+ "execution_count": 64,
+ "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": 65,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.9333333333333333"
+ ]
+ },
+ "execution_count": 65,
+ "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": 66,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "dataframe.csv Kunal_Dudhavat-01.ipynb Kunal_Dudhavat-03.ipynb\r\n",
+ "Iris.csv Kunal_Dudhavat-02.ipynb model.pkl\r\n"
+ ]
+ }
+ ],
+ "source": [
+ "ls"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pickle\n",
+ "\n",
+ "# Save dataframe to csv\n",
+ "df.to_csv('dataframe.csv')\n",
+ "\n",
+ "# Save model to model.pkl\n",
+ "filename = 'model.pkl'\n",
+ "outfile = open('model.pkl','wb')\n",
+ "pickle.dump(clf,outfile)\n",
+ "outfile.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
+}