{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Pandas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `Pandas` module is Python's fundamental data analytics library and it provides high-performance, easy-to-use data structures and tools for data analysis. Pandas allows for creating pivot tables, computing new columns based on other columns, etc. Pandas also facilitates grouping rows by column values and joining tables as in SQL. \n", "\n", "A good cheat sheet for Pandas can be found [here](https://pandas.pydata.org/Pandas_Cheat_Sheet.pdf). \n", "\n", "Pandas is a very comprehensive and mature module that can be used for advanced data analytics, and this tutorial presents just a very basic overview of Pandas' capabilities. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Table of Contents\n", " * [Data Structures](#Data-Structures)\n", " * [Loading Data: Course Grades](#Loading-Data:-Course-Grades)\n", " * [Data Exploration](#Data-Exploration)\n", " + [Preview](#Preview)\n", " + [Sorting](#Sort)\n", " + [Summary](#Summary)\n", " + [Selecting specific columns](#Selecting-specific-columns)\n", " + [Filtering for particular values](#Filtering-for-particular-values)\n", " + [Group By](#Group-By)\n", " * [Data Manipulation](#Data-Manipulation)\n", " + [Handling missing values](#Handling-missing-values)\n", " + [Handling irregular cardinality](#Handling-irregular-cardinality)\n", " + [Detecting outliers](#Detecting-outliers)\n", " * [Saving a DataFrame](#Saving-a-DataFrame)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before we start, let's suppress warnings as they can get annoying sometimes." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import warnings\n", "warnings.filterwarnings('ignore')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's import `Pandas` with the usual convention as `pd` and `NumPy` as `np`." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Series and Data Frames" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are two main data structures in Pandas: `Series` and `DataFrame`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`Series` is like a Python list: it is a one-dimensional data structure that can store values with labels (or index). We can initialize a Series with a list as below." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 34\n", "1 23\n", "2 -5\n", "3 0\n", "dtype: int64\n" ] } ], "source": [ "x = pd.Series([34, 23, -5, 0])\n", "print(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you would like to see the list of methods that you can use with a Series, use the code completion feature in Jupyter Notebook: type \"x.\" in a cell and then hit the Tab button." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A `DataFrame` is just a table with rows and columns, much like an Excel spreadsheet.\n", "\n", "An easy way to create a DataFrame object is by using a dictionary:" ] }, { "cell_type": "code", "execution_count": 4, "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", "
namestatebirthyear
0MaryVIC1980
1DavidNSW1992
2JackVIC2000
3JohnSA1980
4RobinQLD1995
\n", "
" ], "text/plain": [ " name state birthyear\n", "0 Mary VIC 1980\n", "1 David NSW 1992\n", "2 Jack VIC 2000\n", "3 John SA 1980\n", "4 Robin QLD 1995" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = {'name': ['Mary', 'David', 'Jack', 'John', 'Robin'],\n", " 'state': ['VIC', 'NSW', 'VIC', 'SA', 'QLD'],\n", " 'birthyear': [1980, 1992, 2000, 1980, 1995]}\n", "df = pd.DataFrame(data)\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An alternative is to first define an empty data frame with column names and then append rows to it as dictionaries whose keys are the columns." ] }, { "cell_type": "code", "execution_count": 5, "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", "
namestatebirthyear
0MaryVIC1980
1DavidNSW1992
\n", "
" ], "text/plain": [ " name state birthyear\n", "0 Mary VIC 1980\n", "1 David NSW 1992" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(columns=['name', 'state', 'birthyear'])\n", "\n", "# Add rows using loc with dictionaries\n", "df.loc[len(df)] = {'name': 'Mary', 'state': 'VIC', 'birthyear': 1980}\n", "df.loc[len(df)] = {'name': 'David', 'state': 'NSW', 'birthyear': 1992}\n", "\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A second alternative, which is a bit shorter, is to append rows as lists at the end of the data frame." ] }, { "cell_type": "code", "execution_count": 6, "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", "
namestatebirthyear
0MaryVIC1980
1DavidNSW1992
\n", "
" ], "text/plain": [ " name state birthyear\n", "0 Mary VIC 1980\n", "1 David NSW 1992" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(columns=['name', 'state', 'birthyear'])\n", "df.loc[len(df)] = ['Mary', 'VIC', 1980]\n", "df.loc[len(df)] = ['David', 'NSW', 1992]\n", "\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This tutorial will mostly focus on data frames, since real-world datasets are generally multi-dimensional tables rather than just one dimensional arrays." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Loading Data: Course Grades" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This sample data contains course assessment results and students' final grades (Pass or Fail) for a class with 40 students. \n", "\n", "- `Student ID`: Unique ID number for each student in the data.\n", "\n", "\n", "- `Gender`: The gender of student.\n", "\n", "\n", "- `Project Phase 1`: The mark student received by completing the first part of project. The marks are out of 20.\n", "\n", "\n", "- `Project Phase 2`: The mark student received by completing the second part of project. The marks are out of 30.\n", "\n", "\n", "- `Mid-Semester Test`: The mark student received from the mid-semester test. The marks are out of 100.\n", "\n", "\n", "- `Final Exam`: The mark student received from the final exam. The marks are out of 100.\n", "\n", "\n", "- `Grade`: The grade student received indicating whether they passed or failed.\n", "\n", "Now let's load the data into a DataFrame object from the Cloud." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "import warnings\n", "warnings.filterwarnings(\"ignore\")\n", "\n", "import io\n", "import requests\n", "\n", "# so that we can see all the columns\n", "pd.set_option('display.max_columns', None) \n", "\n", "# how to read a csv file from a github account\n", "url_name = 'https://raw.githubusercontent.com/akmand/datasets/master/sample_grades.csv'\n", "url_content = requests.get(url_name, verify=False).content\n", "grades = pd.read_csv(io.StringIO(url_content.decode('utf-8')))\n", "\n", "# alternatively, you can download this CSV file to \n", "# where this notebook is on your computer\n", "# and then use the read_csv() method:\n", "# ### grades = pd.read_csv('sample_grades.csv', header=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data Exploration" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Preview" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are different approaches to viewing the data we are interested in exploring." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " The method `head()` prints the first five rows by default." ] }, { "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", "
Student IDGenderProject Phase 1Project Phase 2Mid-Semester TestFinal ExamGrade
0101Male18.2515.59461.0PA
1102Female17.7530.07962.0PA
2103Male0.000.07815.0NN
3104Male20.0025.06965.0PA
4105Male18.7530.09651.0PA
\n", "
" ], "text/plain": [ " Student ID Gender Project Phase 1 Project Phase 2 Mid-Semester Test \\\n", "0 101 Male 18.25 15.5 94 \n", "1 102 Female 17.75 30.0 79 \n", "2 103 Male 0.00 0.0 78 \n", "3 104 Male 20.00 25.0 69 \n", "4 105 Male 18.75 30.0 96 \n", "\n", " Final Exam Grade \n", "0 61.0 PA \n", "1 62.0 PA \n", "2 15.0 NN \n", "3 65.0 PA \n", "4 51.0 PA " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Alternatively, we can define the number of header rows we want to print." ] }, { "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", "
Student IDGenderProject Phase 1Project Phase 2Mid-Semester TestFinal ExamGrade
0101Male18.2515.59461.0PA
1102Female17.7530.07962.0PA
\n", "
" ], "text/plain": [ " Student ID Gender Project Phase 1 Project Phase 2 Mid-Semester Test \\\n", "0 101 Male 18.25 15.5 94 \n", "1 102 Female 17.75 30.0 79 \n", "\n", " Final Exam Grade \n", "0 61.0 PA \n", "1 62.0 PA " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.head(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " `tail()` prints the last five rows by default." ] }, { "cell_type": "code", "execution_count": 10, "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", "
Student IDGenderProject Phase 1Project Phase 2Mid-Semester TestFinal ExamGrade
35136Male18.5022.02668.0PA
36137Female20.0026.08963.0PA
37138Male18.7530.05952.0PA
38139Male19.0030.070NaNPA
39140Male20.0029.08477.0PA
\n", "
" ], "text/plain": [ " Student ID Gender Project Phase 1 Project Phase 2 Mid-Semester Test \\\n", "35 136 Male 18.50 22.0 26 \n", "36 137 Female 20.00 26.0 89 \n", "37 138 Male 18.75 30.0 59 \n", "38 139 Male 19.00 30.0 70 \n", "39 140 Male 20.00 29.0 84 \n", "\n", " Final Exam Grade \n", "35 68.0 PA \n", "36 63.0 PA \n", "37 52.0 PA \n", "38 NaN PA \n", "39 77.0 PA " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.tail()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`sample()` randomly selects rows from the entire data." ] }, { "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", "
Student IDGenderProject Phase 1Project Phase 2Mid-Semester TestFinal ExamGrade
25126Female20.0022.58356.0PA
36137Female20.0026.08963.0PA
29130Male19.5013.06239.0NN
22123Male19.7530.07461.0PA
28129Male20.0030.06486.0PA
\n", "
" ], "text/plain": [ " Student ID Gender Project Phase 1 Project Phase 2 Mid-Semester Test \\\n", "25 126 Female 20.00 22.5 83 \n", "36 137 Female 20.00 26.0 89 \n", "29 130 Male 19.50 13.0 62 \n", "22 123 Male 19.75 30.0 74 \n", "28 129 Male 20.00 30.0 64 \n", "\n", " Final Exam Grade \n", "25 56.0 PA \n", "36 63.0 PA \n", "29 39.0 NN \n", "22 61.0 PA \n", "28 86.0 PA " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.sample(5, random_state=99)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sorting" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can sort the data with respect to a particular column by calling `sort_values()`. Let's sort the data by Final Exam scores in descending order. \n", "\n", "If you want the sorting to be permanent, you must specifically set the `inplace` argument to `True`. This is a **fundamental rule** in Pandas: in most cases, if you don't set the `inplace` argument to `True`, you will need to set the output of the command to another variable to save its effect.\n", "\n", "Another nice feature of Pandas is **method chaining**: notice below how we chain two methods together." ] }, { "cell_type": "code", "execution_count": 12, "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", "
Student IDGenderProject Phase 1Project Phase 2Mid-Semester TestFinal ExamGrade
27128Female20.030.008491.0PA
28129Male20.030.006486.0PA
26127Female20.035.008483.0PA
14115Male19.526.0010079.0PA
13114Male20.022.758578.0PA
\n", "
" ], "text/plain": [ " Student ID Gender Project Phase 1 Project Phase 2 Mid-Semester Test \\\n", "27 128 Female 20.0 30.00 84 \n", "28 129 Male 20.0 30.00 64 \n", "26 127 Female 20.0 35.00 84 \n", "14 115 Male 19.5 26.00 100 \n", "13 114 Male 20.0 22.75 85 \n", "\n", " Final Exam Grade \n", "27 91.0 PA \n", "28 86.0 PA \n", "26 83.0 PA \n", "14 79.0 PA \n", "13 78.0 PA " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.sort_values(by='Final Exam', ascending=False).head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Summary" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The function `shape` counts the number of rows and columns. Thus, number of rows and columns can be obtained as `grade.shape[0]` and `grade.shape[1]` respectively." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(40, 7)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`info()` provides a concise summary of the columns." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 40 entries, 0 to 39\n", "Data columns (total 7 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 Student ID 40 non-null int64 \n", " 1 Gender 37 non-null object \n", " 2 Project Phase 1 40 non-null float64\n", " 3 Project Phase 2 37 non-null float64\n", " 4 Mid-Semester Test 40 non-null int64 \n", " 5 Final Exam 36 non-null float64\n", " 6 Grade 40 non-null object \n", "dtypes: float64(3), int64(2), object(2)\n", "memory usage: 2.3+ KB\n" ] } ], "source": [ "grades.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`describe()` generates descriptive statistics. Keep in mind that this function excludes *null* values." ] }, { "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", "
Student IDProject Phase 1Project Phase 2Mid-Semester TestFinal Exam
count40.00000040.00000037.00000040.00000036.000000
mean120.50000016.98750023.75000072.10000056.055556
std11.6904525.9646267.50971619.66488520.520296
min101.0000000.0000000.00000026.0000006.000000
25%110.75000017.68750020.00000059.75000045.500000
50%120.50000019.50000025.50000076.00000060.000000
75%130.25000020.00000030.00000086.00000071.750000
max140.00000020.00000035.000000100.00000091.000000
\n", "
" ], "text/plain": [ " Student ID Project Phase 1 Project Phase 2 Mid-Semester Test \\\n", "count 40.000000 40.000000 37.000000 40.000000 \n", "mean 120.500000 16.987500 23.750000 72.100000 \n", "std 11.690452 5.964626 7.509716 19.664885 \n", "min 101.000000 0.000000 0.000000 26.000000 \n", "25% 110.750000 17.687500 20.000000 59.750000 \n", "50% 120.500000 19.500000 25.500000 76.000000 \n", "75% 130.250000 20.000000 30.000000 86.000000 \n", "max 140.000000 20.000000 35.000000 100.000000 \n", "\n", " Final Exam \n", "count 36.000000 \n", "mean 56.055556 \n", "std 20.520296 \n", "min 6.000000 \n", "25% 45.500000 \n", "50% 60.000000 \n", "75% 71.750000 \n", "max 91.000000 " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To ensure all the columns are listed (including categoricals), we can add the `include = all` parameter." ] }, { "cell_type": "code", "execution_count": 16, "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", "
Student IDGenderProject Phase 1Project Phase 2Mid-Semester TestFinal ExamGrade
count40.0000003740.00000037.00000040.00000036.00000040
uniqueNaN4NaNNaNNaNNaN2
topNaNMaleNaNNaNNaNNaNPA
freqNaN22NaNNaNNaNNaN29
mean120.500000NaN16.98750023.75000072.10000056.055556NaN
std11.690452NaN5.9646267.50971619.66488520.520296NaN
min101.000000NaN0.0000000.00000026.0000006.000000NaN
25%110.750000NaN17.68750020.00000059.75000045.500000NaN
50%120.500000NaN19.50000025.50000076.00000060.000000NaN
75%130.250000NaN20.00000030.00000086.00000071.750000NaN
max140.000000NaN20.00000035.000000100.00000091.000000NaN
\n", "
" ], "text/plain": [ " Student ID Gender Project Phase 1 Project Phase 2 \\\n", "count 40.000000 37 40.000000 37.000000 \n", "unique NaN 4 NaN NaN \n", "top NaN Male NaN NaN \n", "freq NaN 22 NaN NaN \n", "mean 120.500000 NaN 16.987500 23.750000 \n", "std 11.690452 NaN 5.964626 7.509716 \n", "min 101.000000 NaN 0.000000 0.000000 \n", "25% 110.750000 NaN 17.687500 20.000000 \n", "50% 120.500000 NaN 19.500000 25.500000 \n", "75% 130.250000 NaN 20.000000 30.000000 \n", "max 140.000000 NaN 20.000000 35.000000 \n", "\n", " Mid-Semester Test Final Exam Grade \n", "count 40.000000 36.000000 40 \n", "unique NaN NaN 2 \n", "top NaN NaN PA \n", "freq NaN NaN 29 \n", "mean 72.100000 56.055556 NaN \n", "std 19.664885 20.520296 NaN \n", "min 26.000000 6.000000 NaN \n", "25% 59.750000 45.500000 NaN \n", "50% 76.000000 60.000000 NaN \n", "75% 86.000000 71.750000 NaN \n", "max 100.000000 91.000000 NaN " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.describe(include='all')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also use the following functions to summarize the data. All these methods exclude null values by default.\n", "- `count()` to count the number of elements.\n", "- `value_counts()` to get a frequency distribution of unique values.\n", "- `nunique()` to get the number of unique values.\n", "- `mean()` to calculate the arithmetic mean of a given set of numbers.\n", "- `std()` to calculate the sample standard deviation of a given set of numbers.\n", "- `max()` to return the maximum of the provided values.\n", "- `min()` to return minimum of the provided values." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Student ID 40\n", "Gender 37\n", "Project Phase 1 40\n", "Project Phase 2 37\n", "Mid-Semester Test 40\n", "Final Exam 36\n", "Grade 40\n", "dtype: int64" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.count()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Gender\n", "Male 22\n", "Female 13\n", "M 1\n", "F 1\n", "Name: count, dtype: int64" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades['Gender'].value_counts()" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades['Gender'].nunique()" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(56.05555555555556)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades['Final Exam'].mean()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(19.66488475195551)" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades['Mid-Semester Test'].std()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(35.0)" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades['Project Phase 2'].max()" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(0.0)" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades['Project Phase 1'].min()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Selecting specific columns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When there are many columns, we may prefer to select only the ones we are interested in. Let's say we want to select the \"Gender\" and the \"Grade\" columns only." ] }, { "cell_type": "code", "execution_count": 24, "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", "
GenderGrade
0MalePA
1FemalePA
2MaleNN
3MalePA
4MalePA
\n", "
" ], "text/plain": [ " Gender Grade\n", "0 Male PA\n", "1 Female PA\n", "2 Male NN\n", "3 Male PA\n", "4 Male PA" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# notice the double brackets\n", "grades[['Gender', 'Grade']].head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also get a single column as a Series object from a data frame." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "# notice the single bracket\n", "gender_series = grades['Gender']" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas.core.series.Series" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(gender_series)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 Male\n", "1 Female\n", "2 Male\n", "3 Male\n", "4 Male\n", "Name: Gender, dtype: object" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gender_series.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Filtering for particular values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can subset the data based on a particular criterion. Let's say we want the list of students who have failed this class." ] }, { "cell_type": "code", "execution_count": 28, "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", "
Student IDGenderProject Phase 1Project Phase 2Mid-Semester TestFinal ExamGrade
2103Male0.000.07815.0NN
8109M18.0023.05033.0NN
12113Female0.00NaN67NaNNN
16117NaN15.7510.08134.0NN
17118Male12.5010.03022.0NN
18119Male17.5020.06131.0NN
21122Female20.0023.03725.0NN
29130Male19.5013.06239.0NN
30131Male0.00NaN60NaNNN
31132Female17.5020.04247.0NN
34135Male20.0030.0616.0NN
\n", "
" ], "text/plain": [ " Student ID Gender Project Phase 1 Project Phase 2 Mid-Semester Test \\\n", "2 103 Male 0.00 0.0 78 \n", "8 109 M 18.00 23.0 50 \n", "12 113 Female 0.00 NaN 67 \n", "16 117 NaN 15.75 10.0 81 \n", "17 118 Male 12.50 10.0 30 \n", "18 119 Male 17.50 20.0 61 \n", "21 122 Female 20.00 23.0 37 \n", "29 130 Male 19.50 13.0 62 \n", "30 131 Male 0.00 NaN 60 \n", "31 132 Female 17.50 20.0 42 \n", "34 135 Male 20.00 30.0 61 \n", "\n", " Final Exam Grade \n", "2 15.0 NN \n", "8 33.0 NN \n", "12 NaN NN \n", "16 34.0 NN \n", "17 22.0 NN \n", "18 31.0 NN \n", "21 25.0 NN \n", "29 39.0 NN \n", "30 NaN NN \n", "31 47.0 NN \n", "34 6.0 NN " ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades[grades['Grade'] == 'NN']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We could also filter based on multiple conditions. Let's see who failed the class even though their final exam scores were higher than 45, but let's only look at a few of the columns using the `loc` method." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Student IDFinal ExamGrade
3113247.0NN
\n", "
" ], "text/plain": [ " Student ID Final Exam Grade\n", "31 132 47.0 NN" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.loc[(grades['Grade'] == 'NN') & (grades['Final Exam'] > 45), ['Student ID', 'Final Exam', 'Grade']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's select the last 2 columns and all the rows between 10 and 15 using the `iloc` method. Notice the use of the negative sign for negative indexing." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Final ExamGrade
1052.0PA
11NaNPA
12NaNNN
1378.0PA
1479.0PA
1552.0PA
\n", "
" ], "text/plain": [ " Final Exam Grade\n", "10 52.0 PA\n", "11 NaN PA\n", "12 NaN NN\n", "13 78.0 PA\n", "14 79.0 PA\n", "15 52.0 PA" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.iloc[10:16, -2:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Group By" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas allows aggregation of data into groups to run calculations over each group. Let's group the data by `Grade`:" ] }, { "cell_type": "code", "execution_count": 31, "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", "
Student IDGenderProject Phase 1Project Phase 2Mid-Semester TestFinal Exam
Grade
NN1110119119
PA292729282927
\n", "
" ], "text/plain": [ " Student ID Gender Project Phase 1 Project Phase 2 \\\n", "Grade \n", "NN 11 10 11 9 \n", "PA 29 27 29 28 \n", "\n", " Mid-Semester Test Final Exam \n", "Grade \n", "NN 11 9 \n", "PA 29 27 " ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.groupby(['Grade']).count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, the `size()` method makes more sense." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Grade\n", "NN 11\n", "PA 29\n", "dtype: int64" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.groupby(['Grade']).size()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This time, let's first group by `Gender` and then by `Grade`." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Student IDProject Phase 1Project Phase 2Mid-Semester TestFinal Exam
GenderGrade
FPA11111
FemaleNN33232
PA10109109
MNN11111
MaleNN66565
PA1616161615
\n", "
" ], "text/plain": [ " Student ID Project Phase 1 Project Phase 2 Mid-Semester Test \\\n", "Gender Grade \n", "F PA 1 1 1 1 \n", "Female NN 3 3 2 3 \n", " PA 10 10 9 10 \n", "M NN 1 1 1 1 \n", "Male NN 6 6 5 6 \n", " PA 16 16 16 16 \n", "\n", " Final Exam \n", "Gender Grade \n", "F PA 1 \n", "Female NN 2 \n", " PA 9 \n", "M NN 1 \n", "Male NN 5 \n", " PA 15 " ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.groupby(['Gender','Grade']).count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that there are unexpected multiple levels defining the same category (e.g., *F* also represents *Female*). We will take care of this in Data Manipulation section.\n", "\n", "So, how do we make the above grouping a data frame? For this, we use the `reset_index` method." ] }, { "cell_type": "code", "execution_count": 34, "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", "
GenderGradeStudent IDProject Phase 1Project Phase 2Mid-Semester TestFinal Exam
0FPA11111
1FemaleNN33232
2FemalePA10109109
3MNN11111
4MaleNN66565
5MalePA1616161615
\n", "
" ], "text/plain": [ " Gender Grade Student ID Project Phase 1 Project Phase 2 \\\n", "0 F PA 1 1 1 \n", "1 Female NN 3 3 2 \n", "2 Female PA 10 10 9 \n", "3 M NN 1 1 1 \n", "4 Male NN 6 6 5 \n", "5 Male PA 16 16 16 \n", "\n", " Mid-Semester Test Final Exam \n", "0 1 1 \n", "1 3 2 \n", "2 10 9 \n", "3 1 1 \n", "4 6 5 \n", "5 16 15 " ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.groupby(['Gender','Grade']).count().reset_index()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data Manipulation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Handling missing values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dealing with missing values is a time consuming but crucial task. We should first identify the missing values and then try to determine why they are missing.\n", "\n", "There are two basic strategies to handle missing values:\n", "1. Remove rows and columns with missing values.\n", "2. Impute missing values, replacing them with predefined values.\n", "\n", "Missing values are a bit complicated in Python as they can be denoted by either \"na\" or \"null\" in Pandas (both mean the same thing). Furthermore, `NumPy` denotes missing values as \"NaN\" (that is, \"not a number\")." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, let's count the number of missing values in each column." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Student ID 0\n", "Gender 3\n", "Project Phase 1 0\n", "Project Phase 2 3\n", "Mid-Semester Test 0\n", "Final Exam 4\n", "Grade 0\n", "dtype: int64" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.isna().sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The function `dropna()` drops rows with at least one missing value." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(33, 7)" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades_no_na = grades.dropna()\n", "grades_no_na.shape" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Student ID 0\n", "Gender 0\n", "Project Phase 1 0\n", "Project Phase 2 0\n", "Mid-Semester Test 0\n", "Final Exam 0\n", "Grade 0\n", "dtype: int64" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades_no_na.isna().sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's look at the `Gender` column. " ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Gender\n", "Male 22\n", "Female 13\n", "M 1\n", "F 1\n", "Name: count, dtype: int64" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades['Gender'].value_counts()" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.int64(3)" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades['Gender'].isna().sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So this column has 3 missing values. Let's use the `fillna()` method to replace these missing values with \"Unknown\":" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "Gender\n", "Male 22\n", "Female 13\n", "Unknown 3\n", "M 1\n", "F 1\n", "Name: count, dtype: int64" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades['Gender'].fillna('Unknown', inplace=True)\n", "\n", "# this also works:\n", "# ## grades[['Gender']] = grades[['Gender']].fillna('Unknown')\n", "\n", "grades['Gender'].value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's go back and check the missing values in our modified data." ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Student ID 0\n", "Gender 0\n", "Project Phase 1 0\n", "Project Phase 2 3\n", "Mid-Semester Test 0\n", "Final Exam 4\n", "Grade 0\n", "dtype: int64" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.isna().sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Some assessments have missing values. We know for a fact that these missing values are due to students missing these assessments, and therefore we set these missing values to zero." ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "grades = grades.fillna(0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now confirm that there are no more missing values." ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Student ID 0\n", "Gender 0\n", "Project Phase 1 0\n", "Project Phase 2 0\n", "Mid-Semester Test 0\n", "Final Exam 0\n", "Grade 0\n", "dtype: int64" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.isna().sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Handling irregular cardinality" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The cardinality is the number of different values we have for a particular feature. Sometimes we might have unexpected number of distinct values for a feature and this is called **irregular cardinality**. Let's start by counting the unique number of observations for each column by using the `nunique()` method:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Student ID 40\n", "Gender 5\n", "Project Phase 1 15\n", "Project Phase 2 19\n", "Mid-Semester Test 34\n", "Final Exam 31\n", "Grade 2\n", "dtype: int64" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.nunique()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, it is clear that all the values in the `Student ID` column are unique for each student. Therefore, we will remove it since **ID-type columns are not useful in statistical modeling**." ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "grades.drop(columns=['Student ID'], inplace=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we notice `Gender` has a cardinality of 4, which is more than expected. This issue often arises when multiple levels are used to represent the same thing (e.g., *M, male, MALE, Male* all represent the \"male\" gender). For Gender, in this case, there should be only three different values: `Female`, `Male`, and `Unknown`. Let's print the unique elements in Gender using the `value_counts()` method:" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Gender\n", "Male 22\n", "Female 13\n", "Unknown 3\n", "M 1\n", "F 1\n", "Name: count, dtype: int64" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades['Gender'].value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's use the `replace()` method to replace all the problematic levels to a standard set of levels." ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "grades.replace(['M', 'male'], 'Male', inplace=True)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "grades.replace(['F', 'female'], 'Female', inplace=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's check again the unique elements in Gender." ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Gender\n", "Male 23\n", "Female 14\n", "Unknown 3\n", "Name: count, dtype: int64" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades['Gender'].value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Detecting outliers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Outliers are values that significantly differ from other values and they lie far away from the central tendency of a variable. The best way to visually detect outliers is by using boxplots. Pandas allows for direct visualization of a data frame's columns.\n", "\n", "First, let's prepare the plotting environment as Pandas' plotting functions actually use Matplotlib." ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline \n", "%config InlineBackend.figure_format = 'retina'\n", "plt.style.use(\"seaborn-v0_8\")" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABUEAAAOkCAYAAACIwfWrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAB7CAAAewgFu0HU+AAB5uklEQVR4nOzdeZyVdf3//+cs7MOqkAqftE+fSHEps6w0NdQsM0tMrTQXUhNTv2am6cds1cLKyoWi+iiKGbnkvptKkuZWmSjuZAouoOwgwzAzvz/4MUlsKgPnzNv7/XbzxuGc6zrzOmfOXB4ec53rqmltbW0NAAAAAEChais9AAAAAADA2iSCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFq6/0AKWaPn1upUfgLaBv3+6pr6/L4sXNmTlzQaXHAVhjtmtAaWzXgNLYrrEu9e/fs93uy56g0IHV1NQs8ydAR2e7BpTGdg0oje0aHZUICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICiiaAAAAAAQNFEUAAAAACgaCIoAAAAAFA0ERQAAAAAKJoICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICiiaAAAAAAQNFEUAAAAACgaCIoAAAAAFA0ERQAAAAAKJoICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICiiaAAAAAAQNFEUAAAAACgaCIoAAAAAFA0ERQAAAAAKJoICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICirfMIetppp+Xd7353rrjiitUu29TUlLFjx2afffbJ1ltvnfe+973ZY4898rOf/SyzZs1a7fqPP/54TjjhhOy4447ZYost8pGPfCQjRozInXfe2Q6PBAAAAADoCOrX5Rf74x//mIsvvvh1LdvY2JjDDjss99133zLXP/XUU3nqqadyxRVX5LzzzsvgwYNXuP5tt92WY489Nk1NTW3XTZ8+PXfccUfuuOOOHHjggfnmN7/55h8MAAAAANAhrLM9QW+//fZ89atfTUtLy+ta/uSTT859992XTp065bjjjsttt92WCRMm5LTTTkvv3r0zbdq0jBgxIgsWLFhu3UmTJuVrX/tampqasuWWW+aiiy7KPffck8svvzy77rprkuSiiy563UEWAAAAAOi41noEbWlpydlnn52jjjpqmb0yV2XixIm5/vrrkySnnHJKRowYkUGDBmXAgAHZd999c8EFF6RTp06ZOnVqxo4du9z6Z511VhYuXJiNN944F154Ybbddtv07ds3W265Zc4999x84hOfSJKcffbZmTdvXvs9WAAAAACg6qzVCDphwoR85jOfyahRo9LS0pLNN9/8da03ZsyYJMmgQYOy3377LXf7kCFDstdeeyVJLrvssmVue/rppzN+/PgkyRFHHJEePXosc3tNTU1OOumk1NbWZtasWbn11lvf4KMCAAAAADqStRpBDzvssDzxxBPp1KlTjjnmmPz85z9f7Tqtra2ZMGFCkmTo0KGpq6tb4XK77LJLkmTKlCl57LHH2q5fum5NTU2GDh26wnU33HDDbLbZZkmWHKcUAAAAACjXWo2gNTU12W233XL11Vfn6KOPTm3t6r/clClTMmfOnCRZ5Z6jQ4YMabv88MMPt11+9NFHkyQbbbRR+vXrt9r1H3nkkdXOBAAAAAB0XGv17PA33nhj3vGOd7yhdaZOndp2edCgQStdrn///unUqVOampoyZcqU5dZf1brJkkiaJC+++GIWL16c+vq1+lQAAAAAABWyVsvfGw2gSTJz5sy2y7169VrpcrW1tenRo0dmzZrVtufoa9fv3bv3Kr9Oz549kyz5+P2cOXNWudfom9G3b/fU1NS0633Cf6qtrWn7s1+/HqtZGqD62a4B7eHyyy/Ld77zncydO7fSo2RRU3NebVycbl3q07nTig/1tS717Nkz3/3ud/PZz+5T6VGADsr7NTqqqtv9sbGxse1y165dV7lsly5dlltn6eWlt63Ma+970aJFb3jO1amvr/wbHN46ampqUlcnugPlsF0D1sSZZ565zHkDqsG8Sg/wGmeeeeYKT0AL8EZ4v0ZHU3URdGUnQlpX67eXxYub7QnKWldbW5Oampq0trampaW10uMArDHbNaA9fP3rX8+3v/3tqtgTdObcxrS0tKa2tiZ9e656R411oWfPnjn++OPT3NxS6VGADsr7Ndalurr2O51R1UXQbt26tV1+7R6eK7L09tfu1bl0/dXt3blw4cK2y6vba/TNmDlzQbvfJ/ynfv16pK6uJi0trZkxY36lxwFYY7ZrQHsYOnT3DB26e6XHSJKc8Mu788rshVmvd9f8+MjtKj1OG9tY4M3yfo11qX//nu12X2v17PBvxmuPA7qq39y2tLRk/vwlP2x9+/Ztu37psT5X91vfpccRraurW+3xQwEAAACAjqvqIugmm2zSdvn5559f6XLTp09PU1NTkmTDDTdsu37pyZhWtW6SvPDCC0mSt73tbamtrbqnAQAAAABoJ1VX/wYMGJA+ffokSSZNmrTS5R555JG2y0OGDGm7PHjw4CTJc889l3nzVn748aX3vdlmm63JuAAAAABAlau6CJokO+20U5Jk/PjxaW1d8UF2b7/99iRJ//79s+mmmy63bnNzc8aPH7/CdV944YU8+uijSZIddtihvcYGAAAAAKpQVUbQYcOGJUkmT56c3/3ud8vdPmnSpFx11VVJkoMPPniZs7D/13/9V7bZZpskyTnnnLPcsUFbW1szcuTItLS0pG/fvvnMZz6zlh4FAAAAAFANqjKCfvjDH87OO++cJDn99NPzs5/9LM8991ymT5+eyy+/PMOHD09TU1MGDRqUL3zhC8utf/LJJ6e2tjbPPPNM9t9///z5z3/OjBkz8sgjj+SYY47JTTfdlCQ55phj0r1793X62AAAAACAdau+0gOszMiRI3PooYdm4sSJGT16dEaPHr3M7euvv37OP//8NDQ0LLfulltumdNPPz2nnnpqnnjiiRx66KHLLTN8+PAccMABa21+AAAAAKA6VG0E7d27d8aNG5dx48bl2muvzdNPP51FixZl4MCBGTp0aA4//PCst956K11/7733zuabb57zzjsv9957b1555ZV07949W2yxRfbff//suuuu6/DRAAAAAACVUtO6sjMPsUamT5+7+oVgDfXr1yN1dbVpbm7JjBnzKz0OwBqzXQNKc8Iv784rsxdmvd5d8+Mjt6v0OABrzPs11qX+/Xu2231V5TFBAQAAAADaiwgKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAULT6Sg8AAAAAwMpdc82VOeOM0zNv3rxKj5LFzS15tXFxunWpT31d5feta2hoyEknfTN77rlXpUehyomgAAAAAFVs1Kiz8uSTT1R6jGVUPsf+26hRZ4mgrJYICgAAAFDFjj76qxk58rSq2BN09vxFaWlpTW1tTXr36FzpcdLQ0JCjjjq20mPQAYigAAAAAFVszz33qpo9HU/45d15ZfbCrNe7a3585HaVHgdet8ofvAEAAAAAYC0SQQEAAACAoomgAAAAAEDRRFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEUTQQEAAACAoomgAAAAAEDRRFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEUTQQEAAACAoomgAAAAAEDRRFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEUTQQEAAACAoomgAAAAAEDRRFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEUTQQEAAACAoomgAAAAAEDR6is9AAAA0PHd/9i0XDVhchYuaq70KFVl9rzGJMnMOQtz/Ki7KjxNdenauS7DdvjvvH/TAZUeBYC3ABEUAABYY1dNmJwXXllQ6TGqVktrMnNuY6XHqDpXTpgsggKwToigAADAGlu6B2hNTdKnoUuFp6keTc0tWdi4OF271KdTnaORLTVrXmNaW2PPYQDWGREUAABoN30auuTMo7av9BhVo1+/Hqmrq01zc0tmzJhf6XGqxvGj7rJnLADrlF9FAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFq6/0AKvzl7/8Jb/97W/zj3/8I7NmzUqPHj2y6aabZtiwYfn0pz+d2toVd9ympqaMGzcu11xzTZ5++um0trZm4MCB2XXXXTN8+PD06dNn3T4QAAAAAKAiqjqCnnHGGTn//POXuW7WrFm55557cs899+Taa6/NqFGj0rVr12WWaWxszGGHHZb77rtvmeufeuqpPPXUU7niiity3nnnZfDgwWv9MQAAAAAAlVW1H4e/7LLL2gLoe9/73lxwwQW566678oc//CGf+tSnkiR//vOf873vfW+5dU8++eTcd9996dSpU4477rjcdtttmTBhQk477bT07t0706ZNy4gRI7JgwYJ1+pgAAAAAgHWvaiPor3/96yTJ4MGDM3bs2Hz4wx/O+uuvny222CJnnnlmWwi94oor8tJLL7WtN3HixFx//fVJklNOOSUjRozIoEGDMmDAgOy777654IIL0qlTp0ydOjVjx45d9w8MAAAAAFinqjKCzpo1K88++2yS5NOf/nS6dOmy3DJf+MIXkiStra156KGH2q4fM2ZMkmTQoEHZb7/9lltvyJAh2WuvvZIs2dsUAAAAAChbVUbQ157saPHixStcplOnTsst39ramgkTJiRJhg4dmrq6uhWuu8suuyRJpkyZkscee6xdZgYAAAAAqlNVRtBevXplk002SZJcf/31WbRo0XLL/OEPf0iyJIZuueWWSZZEzTlz5iRJNt9885Xe/5AhQ9ouP/zww+01NgAAAABQhaoygibJ8ccfn9ra2jz55JMZPnx47rnnnrzyyit57LHHcuqpp+aSSy5Jkhx55JEZMGBAkmTq1Klt6w8aNGil992/f/+2PUmnTJmyFh8FAAAAAFBp9ZUeYGV22223nHvuufnRj36UBx54IAcffPAyt2+44Yb56le/2nZ8zySZOXNm2+VevXqt9L5ra2vTo0ePzJo1q23PUQAAAACgTFUbQZNk3rx56d69+wpve+WVV/K3v/0tO+64Y/r165ckaWxsbLu9a9euq7zvpSdbeu067alv3+6pqalZK/cNS9XW1rT92a9fjwpPA7DmbNeg4/Lzu2KelxXzvEAZ/PzSkVRtBD3ttNNy0UUXJVlyJvgDDzww//Vf/5WZM2fmlltuyc9//vNccskleeCBBzJ27Nisv/76Kz0RUiXU11fPLJSvpqYmdXWiO1AO2zXo2OrqqvaoWxVju7ZyXi/Qcfn5pSOpygh69913twXQ448/Pl/+8pfbbnvb296WAw88MB/4wAfyhS98IU8//XR++tOf5gc/+EG6devWttzq9vBcevvq9hh9sxYvbrYnKGtdbW1Nampq0trampaW1kqPA7DGbNegDM3NLZUeoWrYrq2e1wt0XH5+WdvaM7RXZQS99NJLkyw57uehhx66wmU23XTTfP7zn8/555+fq6++OqeeeuoyxwGdO3fuSu+/paUl8+fPT5L07du3HSf/t5kzF6yV+4XX6tevR+rqatLS0poZM+ZXehyANWa7Bh3X0sDn53dZtmsr5vUCZfDzy9rWv3/Pdruvqtxv+ZlnnkmSvOc971nlR9y33XbbJMnixYvz7LPPZpNNNmm77fnnn1/petOnT09TU1OSJaEVAAAAAChXVUbQpYFy0aJFr3udRYsWZcCAAenTp0+SZNKkSStd9pFHHmm7PGTIkDc3JAAAAADQIVRlBH3HO96RJPnb3/62yhD6wAMPJEnq6+uz8cYbJ0l22mmnJMn48ePT2rriY+7cfvvtSZL+/ftn0003bbe5AQAAAIDqU5UR9JOf/GSSZNasWfnZz362wmWeeuqp/O53v0uS7Ljjjm3HAx02bFiSZPLkyW23v9akSZNy1VVXJUkOPvhgJy8CAAAAgMJVZQTdfffd86EPfShJcv755+eYY47J/fffnxkzZmTKlCm56KKLsv/++2fBggXp2bNnTjzxxLZ1P/zhD2fnnXdOkpx++un52c9+lueeey7Tp0/P5ZdfnuHDh6epqSmDBg3KF77whYo8PgAAAABg3anKs8PX1NTknHPOybHHHpu77747t9xyS2655Zblllt//fVz9tlnt318fqmRI0fm0EMPzcSJEzN69OiMHj16ufXOP//8NDQ0rNXHAQAAAABUXlVG0CTp1atXzjvvvNxyyy256qqr8vDDD2fWrFnp2rVrNtlkk+y888454IAD0rt37+XW7d27d8aNG5dx48bl2muvzdNPP51FixZl4MCBGTp0aA4//PCst956FXhUAAAAAMC6VrURNElqa2vziU98Ip/4xCfe8LqdOnXKQQcdlIMOOmgtTAYAAAAAdBRVeUxQAAAAAID2IoICAAAAAEUTQQEAAACAoomgAAAAAEDRRFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEUTQQEAAACAoomgAAAAAEDRRFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEUTQQEAAACAotVXegAAAKAMH5g5KR/816OZfMLllR6lajxTU5PUJGlNWlpbKz1O1Thg3qLc22uzPNVz60qPAsBbhAgKAAC0iy4ti9LQND+LZ86v9ChUuYYseb0AwLoiggIAAO2isbZz5nXqkT4NnSs9StWotSfoCs2atyiNtV4nAKw7IigAANAu7u87JE+9feucedT2lR6lavTr1yN1dbVpbm7JjBn2kF3q+FF3ZebcxvSt9CAAvGU4MRIAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAilZf6QEAAAAAqs39j03LVRMmZ+Gi5kqPUlVmz2tMksycszDHj7qrwtNUl66d6zJsh//O+zcdUOlRWAERFAAAAOA/XDVhcl54ZUGlx6haLa3JzLmNlR6j6lw5YbIIWqVEUAAAAID/sHQP0JqapE9DlwpPUz2amluysHFxunapT6c6R1lcata8xrS2xp7DVUwEBQAAAFiJPg1dcuZR21d6jKrRr1+P1NXVprm5JTNmzK/0OFXj+FF32TO2ykn2AAAAAEDRRFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEUTQQEAAACAoomgAAAAAEDRRFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEUTQQEAAACAoomgAAAAAEDRRFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEUTQQEAAACAoomgAAAAAEDRRFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEUTQQEAAACAoomgAAAAAEDRRFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEUTQQEAAACAoomgAAAAAEDRRFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEUTQQEAAACAoomgAAAAAEDRRFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEWrr/QAqzNv3ryMHTs2f/zjH/Pss8+msbExG220UXbaaacceuihedvb3rbSdRcsWJAxY8bkpptuyrPPPpu6urpsvPHG2X333XPQQQela9eu6/CRAAAAAACVUNUR9LHHHsvhhx+eadOmLXP9M888k2eeeSZXX311fvOb32SrrbZabt2ZM2fmgAMOyNNPP73M9ZMmTcqkSZNy5ZVX5oILLlhlRAUAAAAAOr6q/Tj89OnTc/DBB2fatGnp2bNnvvWtb+X222/PLbfckpNPPjndunXLrFmzctRRR2XevHnLrNvS0pIjjzwyTz/9dHr06JFvf/vbufPOO3PHHXfkhBNOSJcuXTJ58uQcffTRaWlpqdAjBAAAAADWhaqNoCNHjsysWbPSvXv3jBkzJgcccEAGDhyYjTfeOIccckh+/vOfJ0mmTZuWq6++epl1b7nllvz9739Pkvz85z/P/vvvn7e97W3ZaKONcthhh+Xss89Okjz00EO5/vrr1+njAgAAAADWraqMoC+//HJuvPHGJMmRRx6ZLbfccrllPvrRj2aTTTZJp06d8sgjjyxz25gxY5IkH/jAB7LjjjuucN3tttsuSXLppZe29/gAAAAAQBWpymOC3nzzzWlubk63bt3yxS9+caXLXXPNNenSpcsy182aNSv/+Mc/kiS77LLLStfdZZddcvfdd+eBBx7I7Nmz07t37/YZHgAAAACoKlW5J+hDDz2UJNlyyy3TvXv3ZW5rampqu/yfATRZcjKl1tbWJMnmm2++0q+x2WabJVly/NBJkyat8cwAAAAAQHWqyj1Bn3zyySTJJptskiS57bbb8tvf/jYPPvhgFixYkP79+2fXXXfNkUceudzZ3adOndp2edCgQSv9GgMHDmy7PGXKlHacHgAAAACoJlUZQadNm5Yk6d27d771rW/lkksuWeb26dOnZ9y4cbnxxhszevTobL311m23zZw5s+1yr169Vvo1Ghoa2i7PmTOnvUZv07dv99TU1LT7/cJr1dbWtP3Zr1+PCk8DsOZs16Dj8vO7Yp6XFfO80BF4na6Y52XFPC/Vryoj6Pz585MkV111VaZPn573v//9Oe6447Lllltm/vz5ufHGG/OTn/wks2bNyle+8pVcffXVGTBgQJKksbGx7X66du260q/x2tteu057qa+va/f7hJWpqalJXZ3oDpTDdg06trq6qjzqVkXZrq2c1wsdgdfp8mzXVs7rpTpVZQRduHBhkiV7fH7wgx/Meeedl06dOiVZchzQAw44IIMHD85BBx2UGTNm5Ne//nW++c1vJknq6qojPi5e3GxPUNa62tqa1NTUpLW1NS0trZUeB2CN2a5Bx/XK7IVtfx7yvZsrPE31aGxqzquNi9OtS326dKqOf6tUg5lzFrZdbm5uqeAk8Pp4nf6b92ur5/XSftozKFdlBO3atWsWLFiQJDnppJPaAuhrfeADH8hOO+2UO+64I7fccktbBO3WrVvbMo2NjamvX/FDXBpal3699jZz5oJ2v0/4T/369UhdXU1aWlozY8b8So8DsMZs16AMS4Mo/zZvQVPmpWn1C77FdK6vtb2nai0NfN6XLMv7tRXzelk7+vfv2W73VZURtEePHlmwYEF69uyZIUOGrHS5bbfdNnfccUdeeumlzJs3Lw0NDcscB3TevHnp0WPFx2GYO3du2+W+ffu23/AAAPAWtO1mA3Lfo0uO7d+3Z5cKT1M9Zs9rTEtrUluT9G7wvLxW1851GbbDf1d6DADeIqoygg4aNCjTp09Ply6rfpPw2pMbLVy4MA0NDW1nlE+WnCn+P88ev9Tzzz/fdnnDDTdcs4EBAOAtbsRntsiIz1R6iupzwi/vziuzF6Zvr6758ZHbVXocAHjLqsojtW622WZJkhkzZmTevHkrXe7ll19OknTq1Cn9+vVLkrzrXe9qOxbno48+utJ1J02alGTJgXw33XTTdpkbAAAAAKg+VRlBP/rRjyZJWlpa8sc//nGly911111Jkq222iq1tUseSkNDQ7bZZpskye23377SdZfettVWW6VPnz7tMDUAAAAAUI2qMoJuv/32GThwYJLkZz/7Wdsen69100035YEHHkiSDBs2bJnb9tprryTJn//854wfP365dcePH5+77747SXLIIYe03+AAAAAAQNWpyghaX1+f733ve6mtrc2LL76Y/fbbL1dffXVeeumlTJ06NaNHj87Xv/71JMl73/ve7L333susv/fee7edUOnYY4/N+eefnxdffDEvvvhizj///Bx77LFJkve85z35xCc+sW4fHAAAAACwTlXliZGS5CMf+Uh+8pOf5H//938zderUnHjiicsts/nmm+ess85KXV3dMtfX1dXl3HPPzcEHH5znnnsuZ5xxRs4444xllnnHO96R0aNHt32MHgAAAAAoU9VG0CTZY489svXWW2fMmDG588478+KLL6ZLly55xzvekU9/+tP57Gc/m65du65w3YEDB+bqq6/OBRdckJtvvjnPPfdcmpubs/HGG+fjH/94hg8fnh49eqzjRwQAAAAArGtVHUGTZKONNsopp5ySU0455Q2v26NHjxx11FE56qij1sJkAAAAAEBH4LPgAAAAAEDRRFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEUTQQEAAACAoomgAAAAAEDRRFAAAAAAoGj1lR4AAAAAoBp9YOakfPBfj2byCZdXepSq8UxNTVKTpDVpaW2t9DhV44B5i3Jvr83yVM+tKz0KKyGCAgAAAKxAl5ZFaWian8Uz51d6FKpcQ5a8XqheIigAAADACjTWds68Tj3Sp6FzpUepGrX2BF2hWfMWpbHW66SaiaAAAAAAK3B/3yF56u1b58yjtq/0KFWjX78eqaurTXNzS2bMsIfsUsePuisz5zamb6UHYaWcGAkAAAAAKJoICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICiiaAAAAAAQNFEUAAAAACgaCIoAAAAAFA0ERQAAAAAKJoICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICiiaAAAAAAQNFEUAAAAACgaCIoAAAAAFA0ERQAAAAAKJoICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICiiaAAAAAAQNFEUAAAAACgaCIoAAAAAFA0ERQAAAAAKJoICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICiiaAAAAAAQNFEUAAAAACgaCIoAAAAAFA0ERQAAAAAKJoICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICiiaAAAAAAQNFEUAAAAACgaCIoAAAAAFA0ERQAAAAAKJoICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICiiaAAAAAAQNFEUAAAAACgaCIoAAAAAFA0ERQAAAAAKJoICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICiiaAAAAAAQNFEUAAAAACgaCIoAAAAAFA0ERQAAAAAKJoICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICiiaAAAAAAQNFEUAAAAACgaCIoAAAAAFA0ERQAAAAAKJoICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICiiaAAAAAAQNFEUAAAAACgaCIoAAAAAFA0ERQAAAAAKJoICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICiiaAAAAAAQNFEUAAAAACgaCIoAAAAAFA0ERQAAAAAKJoICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICiiaAAAAAAQNFEUAAAAACgaCIoAAAAAFA0ERQAAAAAKJoICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICiiaAAAAAAQNFEUAAAAACgaCIoAAAAAFA0ERQAAAAAKJoICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICiiaAAAAAAQNFEUAAAAACgaCIoAAAAAFA0ERQAAAAAKJoICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICiiaAAAAAAQNFEUAAAAACgaCIoAAAAAFA0ERQAAAAAKJoICgAAAAAUTQQFAAAAAIomggIAAAAARRNBAQAAAICiiaAAAAAAQNE6XARdsGBBPv7xj+fd7353zjnnnJUu19TUlLFjx2afffbJ1ltvnfe+973ZY4898rOf/SyzZs1adwMDAAAAABVVX+kB3qiRI0fmmWeeWeUyjY2NOeyww3Lfffctc/1TTz2Vp556KldccUXOO++8DB48eC1OCgAAAABUgw61J+j48eNzySWXrHa5k08+Offdd186deqU4447LrfddlsmTJiQ0047Lb179860adMyYsSILFiwYB1MDQAAAABUUoeJoDNmzMgpp5yy2uUmTpyY66+/PklyyimnZMSIERk0aFAGDBiQfffdNxdccEE6deqUqVOnZuzYsWt7bAAAAACgwjpMBP3mN7+Zl19+OXvvvfcqlxszZkySZNCgQdlvv/2Wu33IkCHZa6+9kiSXXXZZu88JAAAAAFSXDhFBL7vsstx2220ZOHDgKvcGbW1tzYQJE5IkQ4cOTV1d3QqX22WXXZIkU6ZMyWOPPdb+AwMAAAAAVaPqI+izzz6bH/zgB6mpqckPf/jDNDQ0rHTZKVOmZM6cOUmSzTfffKXLDRkypO3yww8/3H7DAgAAAABVp6ojaHNzc0488cQsWLAgBx10UD74wQ+ucvmpU6e2XR40aNBKl+vfv386deqUZEk4BQAAAADKVdUR9Fe/+lX+/ve/553vfGeOP/741S4/c+bMtsu9evVa6XK1tbXp0aNHkrTtOQoAAAAAlKm+0gOszMMPP5xf/OIXqa+vz49+9KN06dJltes0Nja2Xe7atesql116f69dpz317ds9NTU1a+W+Yana2pq2P/v161HhaQDWnO0aUDLbNehYvC9ZMc/Linleql9VRtCFCxfmhBNOSFNTU4455phsscUWr2u9lZ0IqRLq66tnFspXU1OTujrRHSiH7RpQorq6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jPmVHgcAAChE5XexAAAAAABYi0RQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKKJoAAAAABA0URQAAAAAKBoIigAAAAAUDQRFAAAAAAomggKAAAAABRNBAUAAAAAiiaCAgAAAABFE0EBAAAAgKLVV3qAtenxxx/P//3f/+Xee+/NjBkz0qdPn2yxxRbZf//9s+OOO1Z6PFgjf//7XzN+/K158cUXssEGG+ajH/1Ytt56m0qPBfCm2a4BAABrS01ra2trpYdYG2677bYce+yxaWpqWuHtBx54YL75zW+uta8/ffrctXbfvHUtXrw4w4cfkFtvvTktLS3L3V5bW5uPfezjGTPm4tTXF/07DqAQtmtA6fr165G6uto0N7dkxoz5lR4HYI2d8Mu788rshVmvd9f8+MjtKj0Ohevfv2e73VeRH4efNGlSvva1r6WpqSlbbrllLrrootxzzz25/PLLs+uuuyZJLrroolx88cUVnhRev29847hstFG/3HzzjSsMBUnS0tKSm2++MRtt1C/f+MZx63hCgDfGdg0AAFhXioygZ511VhYuXJiNN944F154Ybbddtv07ds3W265Zc4999x84hOfSJKcffbZmTdvXoWnhdX73OeGZcyY85a7vr6+Pl27dl3h3lFjxpyXz31u2LoYD+ANs10DAADWpeIi6NNPP53x48cnSY444oj06NFjmdtrampy0kknpba2NrNmzcqtt95agSnh9fvGN47LHXfctsx1W2yxVR566IksXNiYV199NQsXNuahh57I5ptvscxyd9xxmz2ngKpjuwYAAKxrxUXQCRMmJFkSO4cOHbrCZTbccMNsttlmSZI//vGP62w2eKMWL168zJ5StbW1eeCBibn99j9ngw02WGbZDTbYIHfccXceeGBiamr+/aM9Zsx5Wbx48TqbGWBVbNcAAIBKKC6CPvroo0mSjTbaKP369VvpckOGDEmSPPLII+tkLngzhg8/YJm/33ffP/L2t2+8ynXe/vaNc//9/1jmukMPPbDdZwN4M2zXAACASigugk6dOjVJMmjQoFUut9FGGyVJXnzxRXuTULVuvfXmtsubb77FakPBUm9/+8YZMmTztr/ffPNN7T4bwJthuwYAAFRCcRF05syZSZLevXuvcrmePXsmSVpbWzNnzpy1Phe8UX//+1+XOVvyuHFXvKH1f//7K9sut7Q05+9//2u7zQbwZtiuAQAAlbL8qVc7uMbGxiRJly5dVrlc165d2y4vWrSo3efo27d7ampq2v1+eesYP/7fJ+2qr6/PkCHvXG6Z2tqatj/79Vv2JGD9+r0z9fX1bXs6T5hwW3bZZce1ODHAqtmuAW9Fq9quAbxel19+Wb7zne9k7ty5lR4lM+c2pqWlNbW1Nfnjr1fdXtaFnj175rvf/W4++9l9Kj0KVa64CFpXV1fpEZIk9fXVMQcd14svvtB2ub6+PnV1K99xu6amJnV1y0f3urq6tlgwderUVd4HwNpmuwa8la1suwbwepx55pl57LHHKj3GchZUyQdrzzzzzOy3336VHoMqV1wE7datW5LV7925cOHCtsur22v0zVi8uNmeoKyRDTbYsO3y4sWL09zcstwytbU1qampSWtra1paWpe7vbm5ue3ywIEDV3gfAOuK7RrwVrS67RrA6/H1r3893/72t6tiT9BFTc15tXFxunWpT+dOld8BrGfPnjn++OO9LyxUe+70UFwEXXqsz9VtGJYeB7Surm61xw99M2bOXNDu98lby0c/+rH88Ic/SLIkFkya9HQ22GCDZZbp169H6upq0tLSmhkz5i9z23+e9GuHHXZZbhmAdcl2DXgrWtV2DeD1Gjp09wwdunulx0iydLtWm+bmlqrarlXTLLSf/v17ttt9FfcZsne84x1Jkueff36Vy73wwpKP5L3tbW9LbW1xTwMF2HrrbZZ5bX7hC3u/ofU///lhbZdra+uy9dbbtNtsAG+G7RoAAFApxdW/wYMHJ0mee+65zJs3b6XLTZo0KUmy2WabrZO54M342Mc+3nb5kUcezrPP/ut1rffPf07OpEmPtP394x//RLvPBvBm2K4BAACVUFwE3WmnnZIsOWbY+PHjV7jMCy+8kEcffTRJssMOO6yr0eANGzPm4mX+/oEPvGe1weDZZ/+VD33ofctcd955F7X7bABvhu0aAABQCcVF0P/6r//KNtss+XjcOeecs9yxQVtbWzNy5Mi0tLSkb9+++cxnPlOJMeF1qa+vz/Dhh7b9vbW1Je9//5YZOnS7vPjii8ss++KLL+ajH/1w3v/+LdPa+u8DQg8ffmjq64s7/C/QQdmuAQAAlVDT2tpa3CkKJ06cmP322y8tLS0ZPHhwvvGNb2TIkCF54YUX8stf/jK33nprkuRb3/pWDjjggLUyw/TplT9jG+X43OeG5Y47blvu+vr6+tTV1aW5uXmZk4UsNXToLrnkkivXxYgAb4jtGvBWUa0nEAF4s2zXWJfa88RIRUbQJLniiity6qmnrvAfUEkyfPjwnHTSSWvt64ugtLdvfOO4jBlz3utefvjwQ3PGGT9bixMBrBnbNeCtQCwASmO7xrokgr5Ojz/+eM4777zce++9eeWVV9K9e/dsscUW2X///bPrrruu1a8tgrI2LF68OIceemBuvvnGtLS0LHd7bW1dPv7xT+S88y7yUVGgQ7BdA0onFgClsV1jXRJBOwARlLXt73//ayZMuC1Tp07NwIEDs8MOu2Trrbep9FgAb5rtGlAisQAoje0a65II2gGIoKwL/ucDlMZ2DSiN7RpQGts11qX2jKDFnR0eAAAAAOC1RFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEUTQQEAAACAoomgAAAAAEDRRFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEUTQQEAAACAoomgAAAAAEDRRFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEUTQQEAAACAoomgAAAAAEDRRFAAAAAAoGg1ra2trZUeAgAAAABgbbEnKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEUTQQEAAACAoomgAAAAAEDRRFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAAAAFE0EBQAAAACKJoICAAAAAEUTQQEAAACAoomgAAAAAEDRRFAAAAAAoGgiKAAAAABQNBEUAAAAACiaCAoAAFCglpaWSo9QhObm5kqPAEA7qK/0AMCSN1Z1dXWVHgOg3diuQft597vf3Xa5pqYmf/rTn/K2t73tda37la98Jbfddlvb3x9//PEV3vfRRx+dY4455g3Ndc455+Tcc8/NwIEDc/vtt7+hdf/TbbfdlltvvTV///vfM3369CxevDj9+vXLxhtvnO233z7Dhg1L//791+hrvJX861//yne+8518//vfz6BBgyo9TpJ/v17erLFjx+aDH/xgO060ei0tLfnd736XZ555Jt/85jfX6dem+hx44IG577773tA6w4YNy8iRI5Mk9957bw466KAklXk9r8iUKVOyyy67JEl++MMfZu+9937d65500km58sor3/DX3HbbbXPRRRe94fWgPYigrLGdd945U6dOXentnTp1Svfu3bPRRhvl/e9/fz73uc/lXe961zqc8N/W5I3+2jBv3rz89Kc/zVZbbZW99trrDa3bXs/70v95tcc/YEr2/PPP51Of+lT69OnjeXoLsF1782zXqteMGTPy29/+NuPHj8+//vWvNDY2pm/fvnnPe96TfffdNzvttFOlR+R1aG1tzY033phDDjlktcvOnTs3d95559ofag28+OKLOfbYY/Pggw8ud9sLL7yQF154Iffcc09++ctf5vjjj88Xv/jFdT9kB/PYY49lv/32S2NjY6VH6fBOOOGEXHfddRk2bFilRwGgHYigrHVNTU2ZPXt2Zs+enUcffTQXX3xxTjzxxAwfPrzSo1Xc7rvvnmnTpmWLLbZo9/v2vLefhQsX5utf/3rmz5+fPn36VHocqoCfr5WzXatODzzwQI4++ujMnDlzmeunTZuWW2+9NbfeemuGDRuW008/3R68HcBNN930uiLoLbfckqamplUu8/a3vz1J0rt37/YY7Q1ZsGBBvvSlL+Xpp59OQ0NDhg8fno9+9KPZaKONUldXl5dffjn3339/fv3rX2fq1Kn5/ve/n/r6+nz+859f57N2JLNnz67KAHrEEUfkS1/60gpve9/73pck2XPPPfPd7353hct07dp1rc22MtOmTVvnX5Pqt9FGG+W66657Xct26tSp7XLXrl3btrmVeD2vTX/7299e97LeZ1BJIijtZptttslvfvOb5a5vaWnJ3Llzc9ddd+XMM8/MzJkzM3LkyLzrXe/KRz7ykXU649KPjjU0NKzTr7sy7fHGqiM87x3Z/Pnzc8wxx+Svf/1rpUehAjrCz5ftmu3a6rz44osZMWJE5s6dmz59+uTYY4/NjjvumC5duuTJJ5/MqFGj8sADD+TKK6/M+uuvn69//euVHpmVGDx4cJ544ok8+OCDefHFF7PBBhuscvkbbrghSdK/f/9Mnz59hcvceuut7T7n63XppZfm6aefTqdOnXLRRRdlyJAhy9zeu3fvvPOd78xuu+2Wz372s3n++edz5pln5lOf+lTVbPN4/Tp37pzOnTuvcpn6+vr06NFjHU0Eb05NTc2bep2+5z3vqeg2d23yc0tH4cRItJu6urr06NFjuf969uyZjTbaKPvuu29+8YtfpKamJsmS4wKta3feeWfuvPPOovYa6gjPe0f15JNPZp999sldd91V6VGokI7w82W7Zru2OqNHj87cuXPTpUuXjB07Nvvvv38GDRqU/v37Z7vttstvf/vbfOxjH0uSXHDBBfZ8qmI77bRTevTokdbW1tx0002rXHbGjBm55557Ul9f3/b9rTZLD1fxkY98ZLkA+lr9+vXLiSeemCSZM2dO/vznP6+T+QCAstgTlHXqfe97Xz74wQ/mnnvuyYMPPphXXnkl6623XqXHKp7n/Y2ZPXt2fvGLX+Tiiy9OU1NTunfvng022CCTJ0+u9GhUIT9fleF5f/1uvvnmJMkee+yxzAl2lqqpqclXv/rV3HrrrWlqaspdd93l+HdVqkuXLtl5551z7bXXrvYj8TfeeGMWL16cj3zkI+nXr99Kl1vdcYWffPLJnH/++XnggQfy0ksvZf3118/OO++cr3zlK2v8eJbunfp6Prq9/fbbZ/DgwenTp0/q61f8T5impqZcfvnlueGGG/LEE09k/vz5WW+99fL+978/Bx54YN773vcut85rTwpy2223pbW1Nb/61a8yYcKEzJgxI+uvv36GDh2ao446qm0bc9VVV+X3v/99nnjiibS2tmbw4ME55JBDsvvuu690/qeeeioXXnhh/vKXv2TatGnp3LlzNtlkk3z84x/PF7/4xXTr1m2F673wwgsZO3ZsJkyYkOeeey5Jst566+V973tf9ttvv2y77bYrfCxLLf37ir6/f//733PxxRfngQceyCuvvJJu3bpl8ODB2WOPPbLPPvss8zHepZYeu/m0007LhhtumB/96EeZPHlyevfunQ996EM588wzV/octIc38z1O/n0s3auuuioPP/xwZs+enYaGhrzjHe/I0KFDs//++6dnz55ty//nCV+uvPLKtr//58nF4PVa1YmRlm6Lx44dmyFDhuT//u//csstt+T5559P586ds9lmm+Vzn/tc9thjj5Xe/9SpU/P73/8+f/nLXzJlypTMnTu37Vjq2223XQ4++ODVfoJgXbvgggvywx/+MElywAEH5Fvf+tZyy9xwww057rjjkiw5OdV/nqTsySefzCWXXJL7778/L7zwQubPn5+Ghoa8/e1vz4477pgDDzxwuUOarattP9VHBGWd22yzzXLPPfckWbKhXrpRWXq2vREjRmS33XbL9773vUyaNCndu3fPFltskV/+8pdtH6FpbGzMH/7wh9x4441tb4D69u2brbfeOvvss0923HHHFX7t1b3RnzlzZi688MLccccdee6559Lc3JwNN9wwO+ywQ770pS9lww03XOnjamlpyR//+Mf84Q9/yOOPP56XX345vXr1ylZbbZX9999/mZn+8+QfJ598ck4++eS1eqa8lT3v/+mGG27IJZdckkcffTSNjY3ZaKONsttuu+XQQw9Nr169VrjOokWLcvXVV+e2227LpEmTMmvWrNTW1qZv377Zaqutsu+++670o6pv5M39f1qT79eqjB07NhdccEGSZMiQIRk5cmTGjBkjgrJStmu2a69VTdu1pccArampyVZbbbXS5ZYeoyxxDLxqt8cee+Taa69d7Ufil34U/lOf+lSmTJnypr7WH/7wh3zrW9/K4sWL266bOnVqLrrootx000358Ic//Kbud6lBgwZl8uTJuffee3PnnXeudDuXJL169cq111670ttfeOGFfPnLX84TTzyxzPUvvvhirrvuulx33XU5/PDDc/zxx7ftRf6fHnjggXz/+9/PvHnz2q57/vnnc/HFF2fChAm58sor853vfGe5OR588MF89atfzcsvv5wDDzxwufsdM2ZMfvzjH6e5ubntusbGxkycODETJ07MuHHj8utf/zr/8z//s8x6EydOzJe+9KXMmTNnmeunTp2aqVOn5tprr82hhx7atpfs69XS0pIf/ehHGTNmzDLXL1q0KPfff3/uv//+XHrppRk9enTbIVf+04MPPpjvfve7bcecffnll9f6x2HX5Ht8wgknLPd9mzVrVv7+97+3xeCxY8dmk002WauPAVZnypQp+cY3vpEXXnih7bqFCxfm3nvvzb333pt77rkn3//+95db77LLLlvmZ3KpOXPmZM6cOXnsscdy+eWX58ILL1zlnvfr2kEHHZRbb701DzzwQMaNG5dPf/rTy/wyY9q0aW3HCX7Xu96VE044YZn1zz333Jx77rlpbW1d5vpZs2Zl1qxZeeihh/KHP/wh48aNW+l7qLW17ac6iaCsc699U7KigyI/99xzOfjggzN37twkS96QJWkLBc8880yOOuqoPPXUU8usN23atNx88825+eab88lPfjIjR45Mly5dXvdc99xzT/7f//t/mT179jLX//Of/8w///nPXHrppfnRj36Uj3/848utO3v27Hzta19b7uNZr7zySu64447ccccd+eIXv5hTTz31dc/T3lb3vC9evDjHH3/8cgf5njx5ckaPHp3rrrsul1566XKR4bnnnsthhx2WZ555Zrn7fPXVV/P888/npptuWmGgWZM392vy/Xo9+vfvnyOPPDKf+9znVrrHCSxlu1YZtmur17dv3/zlL3/JokWLlvsHwms9++yzbZdXFoapDttvv3169eqVOXPmrHRv0Jdeeil//etf07lz53zsYx9bLna9Hvfee2/+93//N8mSY5F+/etfz5ZbbpmZM2fm8ssvz5gxY3LNNdes0WMZNmxY7rzzzjQ3N+fLX/5ydtxxx+y+++7ZfvvtM2DAgNd9P0tPsDR58uR07949Rx55ZHbbbbf06dMn//rXv3LhhRfm+uuvz29+85v06tUrX/7yl1d4P9/61rfSrVu3/OAHP8hHPvKRzJ07N6NGjcoNN9yQZ599Nvvss0/++c9/Zu+9984hhxySAQMG5KGHHsp3vvOdPP/88znrrLOy7777LnPCk8suuywjR45Mkmy77bYZMWJENttsszQ2NubPf/5zzjrrrEydOjWHHnporrzyyra9dltbW3PiiSdmzpw52WSTTXLCCSdkyJAh6dKlS5544on89Kc/zUMPPZTzzjsvu+66a973vvdl4MCB+dvf/pYHHnig7TFef/312XDDDZfZq/Pss89ue03stttuOeSQQ/LOd74zc+fOzR//+Mece+65mTRpUo444ohccsklK/z/zuWXX54NNtggP/jBD7LpppvmwQcfXOaXKe1tTb7H1113XVu8OPjgg/PZz342AwYMyOzZs3PTTTflnHPOyUsvvZTvfe97Of/885Mk3/ve93Lqqafm8MMPz1//+tdVnrAJ2tP3v//9tLS05Nhjj80ee+yRnj175sEHH8zpp5+eKVOm5NJLL82nP/3pfOADH2hb56GHHsqpp56a1tbWbLHFFjnmmGMyePDgdO7cOc8991x+//vf56qrrsqcOXMycuTIjB07toKPcFm1tbX54Q9/mM985jNZsGBBTj311Fx55ZVt//765je/mVmzZqVTp075yU9+ssz2aOnPb7Lk/41f/vKX8453vCPJkvdOY8aMyfjx4/PCCy/k7LPPbtvj9D+tjW0/1csxQVnnJk6cmGTJgc833njj5W6//vrr09ramrPOOit33313LrjggraPXM2cOTOHHnponnrqqXTq1CkjRozIDTfckHvvvTeXXHJJ2z8Mb7jhhpx88smve6YnnngiRxxxRGbPnp1BgwblRz/6Ue6888785S9/ya9//etsscUWWbhwYb72ta+t8AQ5rw0Fn//853PVVVflL3/5S37/+99nu+22S5L89re/zWWXXdb2GF97Br3vfve7+dvf/rbCE4G0l9U97y+99FKuu+66fPCDH8wFF1yQu+++O1dccUXbczplypT85Cc/WWad5ubmHH300XnmmWfSvXv3nHzyybnxxhtzzz335LrrrsvJJ5/c9tGDX/ziF217RCXLv7kfNWpU7rjjjrbv+dI9ls4777zlzja4pt+v1Rk2bFhuv/32HHDAAQIor4vtmu1aUt3btc6dO68yoP/+979vu7zNNtu84ftn3encuXN23XXXJFnpcUFvuOGGtLa2ZqeddnrTJxA6/fTTkySbbLJJfve732WnnXZKv3798s53vjPf+MY33tD2aGU++clPZr/99kuy5OfnT3/6U0466aTssMMO2W233XLyySfnqquuyssvv7zK+/nNb36TyZMnp1OnTrngggvy5S9/OZtsskn69OmT97zn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4Pz587h79y4qKipgaWmJoUOHwsPDA87Ozmq3s7OzA6D5Bq+oqAjHjh3D5cuXkZubi6qqKpiZmcHe3h5z586Fi4uLxmOqra3Ft99+i9jYWGRmZqK8vBxisRiOjo5YvHix2tG2srIybN26FQkJCaioqED37t0RHx/fpMrArXXe/f39cfbs2QYDFWfOnMHnn38OQHX0u6ioCAcOHEBCQgIeP34MkUgECwsLvPPOO5g1axYmTZokVCM2NDTEpUuXlEbgnjx50uzOveJ7t/R6vY7zRLqD7ZoM27X2365t2bJFbTGQhjAISkRERES6iEFQ+l2RBwt8fHywevXqt3w0RETaY7tGRERERETUOBZGot8NxeIV+vr6b/FIiIhaB9s1IiIiIiKipmEQlH43fv31V+FxeyrSQUSkCds1IiIiIiKipmFhJNJ5aWlpkEqliIqKEp7r37//WzwiIiLtsF0jIiIiIiJqHuYEJZ03ffp0SCQS4d8DBw7E2bNnoafHidBE1D6xXSMiIiIiImoe3i2RTqupqUF1dTX09fXRpUsXuLm5ITw8nIECImq32K4RERERERE1H2eCEhERERERERERkU7jtBEiIiIiIiIiIiLSaQyCEhERERERERERkU5jEJSIiIiIiIiIiIh0GoOgREREREREREREpNMYBCUiIiIiIiIiIiKdxiAoERERERERERER6TQGQYmIiIiIiIiIiEinMQhKREREREREREREOo1BUCIiIiIiIiIiItJpDIISERERERERERGRTmMQlIiIiIiIiIiIiHQag6BERERERERERESk0xgEJSIiIiIiIiIiIp3GICgRERERERERERHpNAZBiYiIiIiIiIiISKcxCEpEREREREREREQ6jUFQIiIiIiIiIiIi0mkMghIREREREREREZFO+z9sD9eGXO6UQQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": { "image/png": { "height": 466, "width": 672 } }, "output_type": "display_data" } ], "source": [ "grades.boxplot(column=['Project Phase 1', 'Project Phase 2', 'Mid-Semester Test', 'Final Exam']);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Alternatively, we can examine the histogram of these columns." ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "image/png": "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167pvffe09mzZzVhwgQnV39/CwgIyHch5gMPPKC333470/XHjh0zwv9KlSqpd+/embZ95JFH7F7f3fr5558VGRnp7DIAAEAGihcvrldffTVX2xQtWtRB1eRfvXr10gMPPJDr7erUqeOAagAUBASZwF0qVKiQ4uLilJiYqF27dqlHjx452u7MmTM6ceJEjtqePHnyXkp0iFOnTmn8+PGy2Wxyd3fXv/71L/Xs2TPDKy0TEhL05Zdf6qOPPpLNZtPSpUtVtWpV9enTxwmVw6wqVKiggQMHZrp+3bp1RpCZXVsAAICc8Pb2vucxRbdu3Qr87dEdO3a022OrACAnmOwHuEvNmjUzlrdt25bj7VICGXd3d+MZNfnJwoULjSv+Ro0aleXt4u7u7nr11Vf1xhtvGK/Nnz8/310xCAAAAAAAnI8gE7hLDz/8sHEb64EDB3J8C2lKkNm0aVMVL17cYfU5yv79+43lnE5eMmjQIBUrVkyS9Ndff+nYsWOOKA0AAAAAANzHuLUcuAcdOnTQ77//nuPby48fP66zZ89Kkp599lmtWrUqy/Y5nVVw7969+vbbb3X48GFFR0erZMmSql+/vvr376/69evn8rvKWnR0tLH8999/52gbDw8PPf744/rpp59UokQJ3bhxI8v2Z86c0erVq7V//35duXJFt2/fVqlSpVS3bl116NBBzzzzTKZXgaaejfLjjz/WM888oyNHjmjFihX6+eefdfXqVRUvXlyPPPKIevbsqWeeecbYNjIyUsuXL9eOHTsUFhYmi8Wihx56SM8995z69OkjN7es/8n8+++/tWbNGgUEBOj06dOKjo6Wt7e3qlSpohYtWqh3794qUaJElvuIj4/Xpk2btHPnTh07dkzR0dEqVKiQSpcurXr16qldu3Zq1apVuu0ymj2ydevWxvLu3bsznMH8yJEjWrdunQ4cOKCrV68qKSlJpUuXVoMGDfSPf/xDTZs2zbTWuXPnat68eZKkffv2KS4uTjNmzND+/fvl7u6uKlWqqFu3brmeDMsebDabtm/frq1bt+q3337TtWvX5OHhoQoVKujJJ59Ur1699NBDD2W7n3379mnjxo06dOiQwsPDZbFY5OPjo+rVq6tFixbq2rWrChUqlGabcePGaf369WleGz9+vDGrKbN0AgBwf8hu1vKUsXzPnj01efJkRUREaMWKFQoICNClS5eUkJCg8uXLq2nTpvrnP/+pypUrZ3vMo0ePasuWLfr55591+fJlRUdHy93dXcWLF1f16tXVsmVLde3aVR4eHvb/hh3kt99+U69evZSUlCRJevvttzO97f+PP/5Q165djb9DPvjgAz3//PPp2l25ckXr169XcHCw/vjjD0VHRyspKUnFixdX5cqV1bhxY/Xu3VulSpXK8Dgp4zlPT08dOnRIiYmJWr9+vTZu3KgzZ87o1q1bKlu2rBo3bqyXXnpJDz74oLHt4cOHtWzZMv3666+KiIhQ8eLFVa9ePb388st2/9sMKIgIMoF70KFDB33yySeSkm8vzy7ITJnkp0iRImrVqlW2QWZ24uPjNWbMmHS3tl+9elXbtm3T9u3b9frrr9/TMe5Uvnx5XbhwQZK0YsUKjRkzJkfbffrpp9nOWG61WjV79mwtWbLEGMikuHz5si5fvqzt27erTp06+uSTT1SxYsVsj/vRRx/p888/l9VqNV6LiIhQRESE9u/fr969e+u9997T4cOHNXz4cF29ejXN9r/99pt+++03BQYG6vPPP5erq2uGx9m/f7/efvttRUREpHk9KipKUVFROnTokBYtWqT3339fnTp1ynAfFy5c0ODBg42wO0VCQoJiYmJ07tw5rV+/Xo899pg+++yzXE0wdae4uDhNnDhRGzZsSLcuLCxMYWFh2rBhg5o1a6Y5c+Zke/Xw9evXNXjw4DRh6uHDh50yWLt48aLefPNNHT16NM3rcXFxunnzpk6dOqXly5drwIABGj16tFxc0t+ccPv2bY0ePVq7du1Kt+7SpUu6dOmSAgICNH/+fM2fP19169Z12PcDAADyv6CgIL311ltpLgqQkoO5P/74Q998842mTp2a6R1PMTExGjdunHbu3JluXUJCgmJjY3X58mXt2bNHX3zxhb744gtVrVrVAd+J/dWtW1evvPKKFixYICn5w/L27dun+xA+KSlJY8eONULM9u3bZxhizp07V59//rni4+PTrUv5O+Dnn3/WokWLNHv2bLVp0ybL+sLDwzVs2DD99ttvaV4/f/68zp8/r02bNunTTz9V48aNNW/ePM2fPz/N3x5//fWXdu7cqYCAAE2bNk1du3bN2Q8GQIYIMoF78OCDD6p69eo6ceKEDhw4oKioKJUsWTLT9lu3bpUktWzZUp6envd0bKvVqldeeUU//fSTJMnFxUUtWrRQ7dq1FR8fr3379ikkJETz58/P9irA3GjRooW+/vprSdKiRYt048YNvfTSS9le3ZZdiClJo0ePNm69t1gsaty4sR599FF5eHjo/Pnz2rNnj6Kjo3X06FH16NFDa9euVbly5TLd31dffaVDhw5Jkp544gnVr19fiYmJ+umnnxQSEiJJWrlypapWrapPP/1U0dHRqlGjhpo1a6ZChQopODhYBw4ckJR8Zd7y5cuNqz1T2717t958803j2Z+VK1dW8+bNVaZMGUVHR2vfvn06deqUbt68qdGjRys2Nlbdu3dPs4/4+HgNGTLECDErVKigp59+WhUqVFBsbKxOnTqlvXv3ymq16vDhwxo2bJhWrFhhbD9kyBDdvHlTK1euNILmIUOGGLf0pz4H4uPjNWDAAP3yyy+Skp9l2qxZM9WsWVMWi0VnzpzR3r17FRsbq6CgIPXt21fffPONvL29M/1Zz5gxI90VoZLSXPGaFy5cuKDevXsbgXKJEiXUsmVLVa5cWbdv39Zvv/2mH3/8UUlJSVq4cKEiIiI0a9asdPuZMmWKEWJ6eXmpZcuWqlq1qiwWi8LCwrR9+3bdunVLV69e1cCBA7Vjxw7jvd+xY0c98sgj+uGHH/TDDz8Yr9WuXVsSs3QCAFDQnDhxQhs3btTff/8tPz8/tWzZUqVLl9alS5e0bds2Xb9+XQkJCXrnnXdUu3ZtPfzww2m2t1qtGjRokDGuLVy4sFq0aKGHH35YhQsXVlRUlIKDg43HN124cEFvvvmmvvvuuww/sDWjoUOHas+ePTp58qT+/vtvvf/++/riiy/StPnPf/6jI0eOSJLKlSunyZMnp9vPnDlz9Pnnn0tK/nuiUaNGqlu3rooWLapbt24pNDRUP/zwg5KSkhQbG6u33npLW7ZsyfQCiaSkJL322msKCQmRp6en2rZtqwceeEBXrlzRzp07FR0drdjYWI0fP169evXS3Llz5ebmprZt26p69eq6efOmNm/erPDwcCUlJem9995Ts2bNVLp0aTv/BIGCgyATuEcdO3bUiRMnjNvL7wyoUhw5ckRhYWGSlOkVebmxZs0aI8QsUaKEPvvsszRXv40aNUorV67U5MmT033yey9efvllbdq0SdevX5fNZtPq1au1evVqPfzww2rSpImeeOIJNWjQINdXCy5dutQIMf38/PTJJ5+oVq1aadrcvHlT//rXv7Rt2zZFRERo9OjRRqiakUOHDsnT01P//ve/1aJFC+P1pKQkjR492giWP/jgA0nJt5AMGDAgzT5S3z69du3adEHmpUuXNG7cOCUkJMjFxUVjx45Vv3790gwax44dq3Xr1mnSpElKSEjQ5MmTVb9+/TTh7/bt23X69GlJUsOGDbVw4cJ0tyz/9ttv6t+/v2JjY/XLL7/o4MGDeuKJJyTJuBp47969RpDZvXv3DG8nnzNnjhFi1qxZUx9//LEeeOCBNG2uXr2q0aNHKzg4WL///rumTJmimTNnZvqzDgoKUpkyZfT+++/rySefVGRkpHbs2KFHH300023sLSkpSSNHjjRCzOeee07vvfdeugD2t99+07BhwxQeHq4NGzaoUaNGaT7Nv3z5statWydJKlOmjFauXKlKlSql2ceYMWPUr18//f7777px44aWL1+uYcOGSZKaN2+u5s2bKzY21ggymzVrxu3kAAAUUCnh2xtvvKEhQ4akucNnxIgRGjhwoEJDQ5WUlKQlS5ZoypQpabZfv369EWL6+vpq6dKlGY7xNm/erLfeektWq1UnT57UL7/8YowVzc7Dw0MzZ85U9+7dlZCQoP/+97/asmWLOnbsKEkKDQ3Vp59+Kik5oJwxY0a6izX++OMPffnll5KSP6j/z3/+oyZNmqQ71smTJzVgwABdu3ZNf//9t9atW2eM4+4UFxenkJAQPfroo/rss8/S3Io+ZMgQPf/884qOjtbly5f10UcfqWzZslq4cGGaSV1ff/119e3bVydPntTt27f1/fff66WXXrqXHxdQoOWPj2cAE+vQoYOxnNXs5Sm3lRctWlTNmze/p2NarVbjlnZJmj17doa38Pbu3VtDhw69p2PdydfXV59++mm6gcPp06e1ZMkSDRs2TI0bN9Yzzzyj9957T7t379bt27ez3Oft27eNgYmHh4cWLlyYLsSUkn92//d//2cMDA4ePKgff/wxy32PGjUqTYgpSa6urukGKx06dEgXYkrJAxQvLy9J0qlTp9LdovL5558bz/wcOnSoXnrppQw/+e7WrZtGjhwpKfmKyJRbZ1KkDHAlqX///ulCTCn5tpuXX35ZUvIVuHfe3pIT4eHhWr58uSTJx8dHixYtShdiSlLZsmX12WefqUyZMpKkjRs36ty5c1nue+7cuWrdurW8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OrVptGZ1dXXTvvfG3BR0c/3bv/1bZsyYscnzdejQId/85jeb/nvy5Mlr3KjnX/7lX9Y4uyVZeePRadOmpba2Nq+88kpGjhyZc889N8nKH5CPO+64jB07Nkly55135umnn87++++fHj16ZN68efn973+ff//3f0+SVFVVZcWKFWlsbGyV/09A8xFkQjP74he/mCuvvLLpVNKddtqpxU5//slPfpLu3bvntttuS5JMnz59rVOFjz/++PzjP/5jrr766mZ73csvvzx77bVX/vVf/7XpZjOzZs3aYFh68MEH57LLLlsj3FldVVVVbr/99vzkJz/JuHHj0tjYmFdffXWdoz27d++e4cOH54gjjmiW97O5jj/++HTr1i3//M//nLq6utTV1WXcuHHrbPvVr341P/7xj9e6fuJWW22V22+/PWeffXbTzuDTTz+9ztGSPXv2zJVXXrnOMOy4447L3Xffnfr6+rz33ntNp+HvtNNOTafBd+3aNffdd18uuuiipjvJ/9//+3/XeQOnT37yk/nXf/3XNa6PWmS77LJL/vf//t85//zz8+abb6a+vj6//e1v1zl6Yc8998wNN9ywxvVaV7n88suzbNmy/J//83+SpOnmVx9VXV2dc845J2ecccZa0/7pn/4p/+2//bfMnj07S5cubTpN/5RTThFkAgAbpbKyMjfddFO+/e1vN+13P/XUU3nqqafWavvZz342F1xwQU4++eQkKy/Z1NJWnXW1qbp169YUZNbW1q5xLfbvfve7a5wts8o222yTSy65JD/84Q+TJCNHjswhhxySXXbZJcnKM9b++te/Nt0c6c9//vNap6AnK880uuaaa/KjH/0ob7/9dhYsWJA5c+bkk5/85H/pvQCtS5AJzewTn/hE9t133zzzzDNJWmY05iqlUikXXnhhvvCFL+See+7JH//4x8yfPz9du3bNzjvvnBNPPDGHH374Gnfway5HHXVUDj300EydOjVPPfVUZs6cmffee6/ptOqePXumd+/e2W+//XL44Ydv1DVCt9pqq/z0pz/NKaecknHjxuUPf/hD5syZk8WLF6dr1675x3/8xwwePDhf+9rX1hk+ldMRRxyRAw44IA888ECeeOKJvPHGG6mrq0t1dXW222677LXXXjn++OOz++67r3cZ2267be6///48+uijeeyxxzJz5sy8//77Wb58eWpq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+uubRl6u7tFHH8306dOTJMcee2yr1gcAUESCTAAAaGVVVVUZPnx4KioqMmfOnJxwwgkZP3585s6dm3fffTcjR47MD37wgyTJHnvskeOOO67MFQMAlJ+7lgMAQBkccMAB+dnPfpYf/ehHeffdd3PRRRet1WbXXXfNL37xi1RWVpahQgCAYhFkAgBAmXzpS1/KnnvumTvvvDNPPPFE5syZkw4dOmTAgAEZMmRIvvrVr6Zjx47lLhMAoBAEmQAAUEbbb799Lr300lx66aXlLgUAoNBcIxMAAAAAKDxBJgAAAABQeIU/tXzRokUZPXp0Jk+enNmzZ2fp0qXZfvvtM3jw4Jx++unp3bt3uUsEAAAAAFpYoYPM1157LWeccUbmzZu3xvOzZs3KrFmzMn78+PzqV7/K7rvvXqYKAQAAAIDWUNhTy+fPn5/TTjst8+bNS7du3XLFFVfk8ccfz6RJk3LJJZekU6dOqaury/e+970sWrSo3OUCAAAAAC2osEHmiBEjUldXl86dO+fOO+/MySefnD59+qRfv3751re+lRtuuCFJMm/evIwfP768xQIAAAAALaqQQeb777+fiRMnJknOPvvsDBo0aK02Bx10UPr375/q6uq88sorrV0iAAAAANCKCnmNzMceeywrVqxIp06d8s1vfnO97R5++OF06NChFSsDAAAAAMqhkCMyX3755STJoEGD0rlz5zWm1dfXNz0WYgIAAADAlqGQIzLfeOONJEn//v2TJFOmTMndd9+dF198MUuWLEmvXr1y2GGH5eyzz07v3r3LWCkAAAAA0BoKOSJz3rx5SZLu3bvniiuuyDnnnJNnnnkmS5YsSbLyjub33XdfhgwZkhdeeKGcpQIAAAAAraCQIzIXL16cJHnooYcyf/78fPazn80FF1yQQYMGZfHixZk4cWJ+9rOfpa6uLuecc07Gjx+fbbfdtllr6NGjc0qlUrMuk/KqqCg1/a2p6VLmamiPrFc0F+tScdhmAABAcRQyyPzwww+TrBx5ue++++aOO+5IdXV1kpXXxTz55JMzcODAnHrqqamtrc1tt92Wyy67rFlrqKqqbNblURylUimVlUJqml9lZSEHudMGWZeKwzYDAACKo5BBZseOHZtOI7/44oubQszV7b333hk8eHCmTp2aSZMmNXuQuXz5CiMy25mKilJKpVIaGxvT0NBY7nJoh1asaCh3CbQT1qXiaOlthtAaAAA2XiGDzC5dumTJkiXp1q1bdtlll/W222effTJ16tTMnTs3ixYtSteuXZuthoULlzTbsiiGmpouqawspaGhMbW1i8tdDu2Q9YrmYl0qjpbeZvTq1a3Flg0AAO1NIYcB9O3bN8nK08g3ZPXgctXp6AAAAABA+1PIIHPnnXdOktTW1mbRokXrbff+++8nSaqrq1NTU9MqtQEAAAAAra+QQeZBBx2UJGloaMjkyZPX2+7pp59Okuy+++6pqCjkWwEAAAAAmkEh07/Pfe5z6dOnT5Lk+uuvbxp5ubpHH30006dPT5Ice+yxrVofAAAAANC6ChlkVlVVZfjw4amoqMicOXNywgknZPz48Zk7d27efffdjBw5Mj/4wQ+SJHvssUeOO+64MlcMAAAAALSkQt61PEkOOOCA/OxnP8uPfvSjvPvuu7nooovWarPrrrvmF7/4RSorK8tQIQAAAADQWgobZCbJl770pey55565884788QTT2TOnDnp0KFDBgwYkCFDhuSrX/1qOnbsWO4yAQAAAIAWVuggM0m23377XHrppbn00kvLXQoAAAAAUCaFvEYmAAAAAMDqBJkAAAAAQOEJMgEAAACAwhNkAgAAAACFJ8gEAAAAAAqv8HctBwAA2q4vXzi+3CVstlEXH1LuEgCAGJEJAAAAALQBgkwAAAAAoPAEmQAAAABA4QkyAQAAAIDCE2QCAAAAAIUnyAQAAAAACk+QCQAAAAAUniATAAAAACg8QSYAAAAAUHiCTAAAAACg8ASZAAAAAEDhCTIBAAAAgMITZAIAAAAAhSfIBAAAAAAKT5AJAAAAABSeIBMAAAAAKDxBJgAAAABQeIJMAAAAAKDwqspdAEB78e0Rj5e7hM026uJDyl0CAAAArJMRmQAAAABA4QkyAQAAAIDCE2QCAAAAAIUnyAQAAAAACk+QCQAAAAAUniATAAAAACg8QSYAAAAAUHiCTAAAAACg8ASZAAAAAEDhCTIBAKBglixZki9+8YvZcccdc9NNN5W7HACAQhBkAgBAwYwYMSKzZs0qdxkAAIUiyAQAgAKZNm1axo4dW+4yAAAKR5AJAAAFUVtbm0svvbTcZQAAFJIgEwAACuKyyy7L+++/n+OOO67cpQAAFI4gEwAACuCBBx7IlClT0qdPH6MyAQDWQZAJAABlNnv27Fx11VUplUq5+uqr07Vr13KXBABQOIJMAAAooxUrVuSiiy7KkiVLcuqpp2bfffctd0kAAIUkyAQAgDL65S9/mRdeeCE77LBDLrzwwnKXAwBQWFXlLgAAALZUM2bMyK233pqqqqpce+216dChQ6u+fo8enVMqlVps+RUVLbfs1lRT06XcJbSKVf1VUVHaYt5zW6Wv0O/FoB9anyATAADK4MMPP8wPf/jD1NfXZ9iwYdltt91avYaqqspWf822qLJyyzqRrVQqpbKyfYTQ7Z2+2nJtad9LRaUfWp8gEwAAyuDaa6/NW2+9lUGDBuWss84qSw3Ll68wInMjrFjRUO4SWkVFRSmlUimNjY1paGgsdzlsgL5iS/leKjr98PGaO+wVZAIAQCt78sknc88996RDhw655pprUlVVnt3yhQuXtOjy28spd7W1i8tdQquoqemSyspSGhoat5j33FbpK/R7MeiHj9erV7dmXZ4gEwAAWtkjjzySJFm6dGmOOuqoDba9+eabc/PNNydJpkyZkr59+7Z4fQAAReRkfgAAAACg8IzIBACAVjZ8+PBcfvnlG2zzmc98Jkly5pln5swzz0ySdO7cucVrAwAoqjY3InPJkiX54he/mB133DE33XRTucsBAIBNttVWW6VLly4b/LdKdXV103MteWMeAICia3NB5ogRIzJr1qxylwEAAAAAtKI2FWROmzYtY8eOLXcZAAAAAEArazNBZm1tbS699NJylwEAAAAAlEGbudnPZZddlvfffz/HHXdcHnzwwXKXAwAALer1118vdwkAAIXSJkZkPvDAA5kyZUr69OljVCYAAAAAbIEKH2TOnj07V111VUqlUq6++up07dq13CUBAAAAAK2s0EHmihUrctFFF2XJkiU59dRTs++++5a7JAAAAACgDAp9jcxf/vKXeeGFF7LDDjvkwgsvbNXX7tGjc0qlUqu+Ji2roqLU9LempkuZq4Fi8tkoBv1QHLYZAABQHIUNMmfMmJFbb701VVVVufbaa9OhQ4dWff2qqspWfT1aT6lUSmWlkBrWpbKy0AP1txj6oThsMwAAoDgKGWR++OGH+eEPf5j6+voMGzYsu+22W6vXsHz5CiMy25mKilJKpVIaGxvT0NBY7nKgkFasaCh3CUQ/FElLbzOE1gAAsPEKGWRee+21eeuttzJo0KCcddZZZalh4cIl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s9tuu+Wkk07KYYcdVu7yAABgs9jfBQDYOIUPMgEAAAAACnuNTAAAAACAVQSZAAAAAEDhCTIBAAAAgMITZAIAAAAAhSfIBAAAAAAKT5AJAAAAABSeIBMAAAAAKDxBJgAAAABQeFXlLgCa25IlS3Lsscdm1qxZOffcczNs2LB1tquvr899992Xhx9+OG+++WYaGxvTp0+fHHbYYRk6dGi22Wab1i2cZrFo0aKMHj06kydPzuzZs7N06dJsv/32GTx4cE4//fT07t17vfMuWbIkd955Zx599NHMnj07lZWV6devX4488siceuqp6dixYyu+E5rD73//+9x999156aWXUldXly5dumSnnXbKsccemyFDhqSiYt2/5/l+aD+uvPLKjBkzJldffXWOO+64Dbbd3H5//fXXc/vtt+cPf/hDamtrs80222S33XbLSSedlAMPPLAZ3xUUm89C8fzud7/LuHHj8uKLL6a2tjZbbbVV+vXrl8GDB+fUU09NTU3NOuezPSw/xzbF5tij7XBc0H6UGhsbG8tdBDSnK664ImPHjk2S9W7sly5dmu985zv54x//uM5lbLvttrnjjjsycODAFq2V5vXaa6/ljDPOyLx589Y5fZtttsmvfvWr7L777mtNW7hwYU4++eS8+eab65z3H/7hH3LXXXdtcGeEYrnmmmsyatSo9U4/4IADcsstt6y1k+j7of2YPHlyhg0bloaGho8NMje336dMmZLzzjsv9fX165x+yimn5LLLLtv0NwFtjM9CsSxfvjwXX3xxJkyYsN42n/jEJ3LLLbdkzz33XON528NicGxTXI492g7HBe2LU8tpV6ZNm9a0od+QSy65JH/84x9TXV2dCy64IFOmTMmTTz6ZK6+8Mt27d8+8efNy1llnZcmSJa1QNc1h/vz5Oe200zJv3rx069YtV1xxRR5//PFMmjQpl1xySTp16pS6urp873vfy6JFi9aYt6GhIWeffXbefPPNdOnSJf/8z/+cJ554IlOnTs0Pf/jDdOjQIW+99VbOPffcNDQ0lOkdsikeeOCBpp2VPfbYI3fddVeefvrpjBs3LkcffXSS5Kmnnsrw4cPXmtf3Q/vw+OOP5/zzz9/oz+zm9PvMmTPz/e9/P/X19Rk0aFDGjBmTZ599Nr/5zW9y2GGHJUnGjBmTe+65p1nfIxSNz0LxXHfddU0h5qGHHpr77rsvzz77bCZMmJAf/OAH6dy5cxYsWJCzzjorc+fOXWNe28Pyc2xTXI492g7HBe1QI7QTCxYsaPynf/qnxoEDBzb9u/HGG9dq9/LLLzdNv/fee9ea/sorrzTuuuuujQMHDmz8X//rf7VG6TSD73//+40DBw5s3GOPPRpffvnltaZPnTq1qd/vvvvuNaZNnDixadrvfve7Dc778MMPt9h7oPkcdthhjQMHDmw8+uijGz/88MO1pq9aX3bcccfGOXPmND3v+6HtW7FiReMvfvGLxp122mmN7cG4cePWO8/m9vt3v/vdxoEDBzZ+4QtfaFy0aNEa0xoaGhr/x//4H40DBw5s3GeffRr//ve/b/6bhILyWSiWOXPmNO6yyy6NAwcObLzwwgvX2ebll19uavOTn/xkjedtD8vLsU2xOfZoOxwXtD9GZNJuXHbZZXn//fc/9hpod955Z5Kkb9++OeGEE9aavssuu+SYY45JsvLXG4rv/fffz8SJE5MkZ599dgYNGrRWm4MOOij9+/dPdXV1XnnllTWmrVon9t5773Veu+uggw7KP/3TPyVJ7r///uYun2ZWV1eX2bNnJ0mGDBmSDh06rNXmxBNPTJI0Njbm5Zdfbnre90Pb9uSTT+YrX/lKbrnlljQ0NGTXXXfdqPk2p9/ffPPNTJs2LUly5plnpkuXLmtML5VKufjii1NRUZG6urr89re/3cR3BW2Dz0LxTJ48OcuXL0+SXHDBBetsM2jQoKbRsqv6L7E9LALHNsXl2KPtcFzQPgkyaRceeOCBTJkyJX369Mmll1663naNjY158sknkyQHH3xwKisr19nu0EMPTZK88847ee2115q/YJrVY489lhUrVqRTp0755je/ud52Dz/8cGbMmJGrrrqq6bm6urq89NJLSf5fv6/LqmnTp0/Pf/zHfzRT5bSE1S/UveoA7qOqq6vXau/7oe37zne+kz//+c+prq7OsGHDcsMNN3zsPJvb76vmLZVKOfjgg9c573bbbZedd945ycpgAdojn4XimTdvXjp27JiePXumT58+623Xr1+/pvaJ7WEROLYpNscebYfjgvZJkEmbN3v27Fx11VUplUq5+uqr07Vr1/W2feedd/LBBx8kyQZH6uyyyy5Nj2fMmNF8xdIiVv1yNmjQoHTu3HmNaavfbGBdv8C99tprafz/73m2oXVi1YFXQ0NDZs6cudk103K23nrr9O/fP0nyyCOPZNmyZWu1GTduXJKVOy6rfkX3/dD2lUqlHH744Rk/fnzOPffc9d59cnWb2++vvvpqkmT77bdf711/V5//o6MyoL3wWSieCy64IC+99FIee+yxDbb761//miTp3r17EtvDcnNsU3yOPdoOxwXtkyCTNm3FihW56KKLsmTJkpx66qnZd999N9j+3XffbXrct2/f9bbr1atX0y8z77zzTvMUS4t54403kqRpIzVlypQMHTo0e+65Z3bbbbcccMAB+fGPf7zWReyTjV8nVh/JYJ0ovgsvvDAVFRV54403MnTo0Dz77LNZsGBBXnvttVx++eVNF84/++yzs+222ybx/dAeTJw4MTfddFN22GGHjZ5nc/t91fwbmjdZGe4kyZw5c9Y7IgDaMp+F4tpQEDZ37txMnTo1SbLXXnslsT0sJ8c2bYNjj7bFcUH7U1XuAmBz/PKXv8wLL7yQHXbYIRdeeOHHtl+4cGHT46233nq97SoqKtKlS5fU1dU1/RJDca06Fap79+654oor1rq74/z583Pfffdl4sSJGTlyZPbcc8+maRu7Tqx+EGCdKL7DDz88N998c6699tpMnz49p5122hrTt9tuu5x//vlN17VJfD+0BwMGDNjkeTa331fNv2ok0/p069YtycpTlT744IMNjliDtshnoe1pbGzMFVdckaVLlyZJTjrppCS2h+Xk2KZtcOzRtjguaH+MyKTNmjFjRm699dZUVVXl2muvXefQ/Y9ataOWJB07dtxg21XLW30eimnx4sVJkoceeihjx47NZz/72dxzzz15+eWX8/vf/z5XXHFFOnfunLq6upxzzjlNOx/Jxq8Tq0+zTrQNixYtWut0n1UWLFiQ559/PrW1tU3P+X7YMm1uv696/HHboNWXva7TmqCt81loe66++uqmG/wcffTR2W+//ZLYHpaLY5u2w7FH2+O4oH0RZNImffjhh/nhD3+Y+vr6nH322dltt902ar71XaSXtu3DDz9MsvLXz3333Td33XVXPvvZz6ZDhw6pqanJySefnNtuuy0VFRWpra3Nbbfd1jSvdaJ9uvLKK3PRRRdl5syZOfHEE/Nv//Zv+dOf/pQnnngil112WbbaaquMHTs23/zmN/P+++8nsS5sqTa33603sJLPQtvR2NiYq6++Or/+9a+T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", "text/plain": [ "
" ] }, "metadata": { "image/png": { "height": 486, "width": 665 } }, "output_type": "display_data" } ], "source": [ "grades.hist(column=['Project Phase 1', 'Project Phase 2', 'Mid-Semester Test', 'Final Exam']);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Saving a DataFrame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas allows for saving DataFrame objects in various formats, including CSV, Excel, JSON, HTML, and SQL. Let's save `grades` as a new file in CSV format with all the modifications we performed. Before saving, let's shorten the long column names and then take a peak at the final data." ] }, { "cell_type": "code", "execution_count": 53, "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", "
GenderProject 1Project 2TestFinal ExamGrade
0Male18.2515.59461.0PA
1Female17.7530.07962.0PA
2Male0.000.07815.0NN
3Male20.0025.06965.0PA
4Male18.7530.09651.0PA
5Male17.0023.58059.0PA
6Unknown19.7519.58276.0PA
7Male20.0028.09544.0PA
8Male18.0023.05033.0NN
9Female20.0030.09263.0PA
\n", "
" ], "text/plain": [ " Gender Project 1 Project 2 Test Final Exam Grade\n", "0 Male 18.25 15.5 94 61.0 PA\n", "1 Female 17.75 30.0 79 62.0 PA\n", "2 Male 0.00 0.0 78 15.0 NN\n", "3 Male 20.00 25.0 69 65.0 PA\n", "4 Male 18.75 30.0 96 51.0 PA\n", "5 Male 17.00 23.5 80 59.0 PA\n", "6 Unknown 19.75 19.5 82 76.0 PA\n", "7 Male 20.00 28.0 95 44.0 PA\n", "8 Male 18.00 23.0 50 33.0 NN\n", "9 Female 20.00 30.0 92 63.0 PA" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.rename(columns={'Project Phase 1': 'Project 1',\n", " 'Project Phase 2': 'Project 2',\n", " 'Mid-Semester Test': 'Test'}, \n", " inplace=True)\n", "grades.head(10)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "grades.to_csv(\"grades_saved.csv\", index=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can now open this CSV file in Excel (or your favorite text editor) to see its contents." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***" ] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.11.9" }, "toc": { "toc_cell": false, "toc_number_sections": true, "toc_section_display": "none", "toc_threshold": 6, "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 4 }