{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Pandas\n",
"\n",
"![pandas logo](https://pandas.pydata.org/static/img/pandas.svg)\n",
"\n",
"\"high-performance, easy-to-use data structures and data analysis tools\" https://pandas.pydata.org/\n",
"\n",
"Pandas is typically imported as `pd`."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# We will start with the Iris dataset from a previous lecture\n",
"iris_dataset = {'sepal length (cm)': [5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, 5.8, 5.7, 5.4, 5.1, 5.7, 5.1, 5.4, 5.1, 4.6, 5.1, 4.8, 5.0, 5.0, 5.2, 5.2, 4.7, 4.8, 5.4, 5.2, 5.5, 4.9, 5.0, 5.5, 4.9, 4.4, 5.1, 5.0, 4.5, 4.4, 5.0, 5.1, 4.8, 5.1, 4.6, 5.3, 5.0, 7.0, 6.4, 6.9, 5.5, 6.5, 5.7, 6.3, 4.9, 6.6, 5.2, 5.0, 5.9, 6.0, 6.1, 5.6, 6.7, 5.6, 5.8, 6.2, 5.6, 5.9, 6.1, 6.3, 6.1, 6.4, 6.6, 6.8, 6.7, 6.0, 5.7, 5.5, 5.5, 5.8, 6.0, 5.4, 6.0, 6.7, 6.3, 5.6, 5.5, 5.5, 6.1, 5.8, 5.0, 5.6, 5.7, 5.7, 6.2, 5.1, 5.7, 6.3, 5.8, 7.1, 6.3, 6.5, 7.6, 4.9, 7.3, 6.7, 7.2, 6.5, 6.4, 6.8, 5.7, 5.8, 6.4, 6.5, 7.7, 7.7, 6.0, 6.9, 5.6, 7.7, 6.3, 6.7, 7.2, 6.2, 6.1, 6.4, 7.2, 7.4, 7.9, 6.4, 6.3, 6.1, 7.7, 6.3, 6.4, 6.0, 6.9, 6.7, 6.9, 5.8, 6.8, 6.7, 6.7, 6.3, 6.5, 6.2, 5.9], 'sepal width (cm)': [3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4, 3.0, 3.0, 4.0, 4.4, 3.9, 3.5, 3.8, 3.8, 3.4, 3.7, 3.6, 3.3, 3.4, 3.0, 3.4, 3.5, 3.4, 3.2, 3.1, 3.4, 4.1, 4.2, 3.1, 3.2, 3.5, 3.6, 3.0, 3.4, 3.5, 2.3, 3.2, 3.5, 3.8, 3.0, 3.8, 3.2, 3.7, 3.3, 3.2, 3.2, 3.1, 2.3, 2.8, 2.8, 3.3, 2.4, 2.9, 2.7, 2.0, 3.0, 2.2, 2.9, 2.9, 3.1, 3.0, 2.7, 2.2, 2.5, 3.2, 2.8, 2.5, 2.8, 2.9, 3.0, 2.8, 3.0, 2.9, 2.6, 2.4, 2.4, 2.7, 2.7, 3.0, 3.4, 3.1, 2.3, 3.0, 2.5, 2.6, 3.0, 2.6, 2.3, 2.7, 3.0, 2.9, 2.9, 2.5, 2.8, 3.3, 2.7, 3.0, 2.9, 3.0, 3.0, 2.5, 2.9, 2.5, 3.6, 3.2, 2.7, 3.0, 2.5, 2.8, 3.2, 3.0, 3.8, 2.6, 2.2, 3.2, 2.8, 2.8, 2.7, 3.3, 3.2, 2.8, 3.0, 2.8, 3.0, 2.8, 3.8, 2.8, 2.8, 2.6, 3.0, 3.4, 3.1, 3.0, 3.1, 3.1, 3.1, 2.7, 3.2, 3.3, 3.0, 2.5, 3.0, 3.4, 3.0], 'petal length (cm)': [1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.6, 1.4, 1.1, 1.2, 1.5, 1.3, 1.4, 1.7, 1.5, 1.7, 1.5, 1.0, 1.7, 1.9, 1.6, 1.6, 1.5, 1.4, 1.6, 1.6, 1.5, 1.5, 1.4, 1.5, 1.2, 1.3, 1.4, 1.3, 1.5, 1.3, 1.3, 1.3, 1.6, 1.9, 1.4, 1.6, 1.4, 1.5, 1.4, 4.7, 4.5, 4.9, 4.0, 4.6, 4.5, 4.7, 3.3, 4.6, 3.9, 3.5, 4.2, 4.0, 4.7, 3.6, 4.4, 4.5, 4.1, 4.5, 3.9, 4.8, 4.0, 4.9, 4.7, 4.3, 4.4, 4.8, 5.0, 4.5, 3.5, 3.8, 3.7, 3.9, 5.1, 4.5, 4.5, 4.7, 4.4, 4.1, 4.0, 4.4, 4.6, 4.0, 3.3, 4.2, 4.2, 4.2, 4.3, 3.0, 4.1, 6.0, 5.1, 5.9, 5.6, 5.8, 6.6, 4.5, 6.3, 5.8, 6.1, 5.1, 5.3, 5.5, 5.0, 5.1, 5.3, 5.5, 6.7, 6.9, 5.0, 5.7, 4.9, 6.7, 4.9, 5.7, 6.0, 4.8, 4.9, 5.6, 5.8, 6.1, 6.4, 5.6, 5.1, 5.6, 6.1, 5.6, 5.5, 4.8, 5.4, 5.6, 5.1, 5.1, 5.9, 5.7, 5.2, 5.0, 5.2, 5.4, 5.1], 'petal width (cm)': [0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1, 0.2, 0.2, 0.1, 0.1, 0.2, 0.4, 0.4, 0.3, 0.3, 0.3, 0.2, 0.4, 0.2, 0.5, 0.2, 0.2, 0.4, 0.2, 0.2, 0.2, 0.2, 0.4, 0.1, 0.2, 0.2, 0.2, 0.2, 0.1, 0.2, 0.2, 0.3, 0.3, 0.2, 0.6, 0.4, 0.3, 0.2, 0.2, 0.2, 0.2, 1.4, 1.5, 1.5, 1.3, 1.5, 1.3, 1.6, 1.0, 1.3, 1.4, 1.0, 1.5, 1.0, 1.4, 1.3, 1.4, 1.5, 1.0, 1.5, 1.1, 1.8, 1.3, 1.5, 1.2, 1.3, 1.4, 1.4, 1.7, 1.5, 1.0, 1.1, 1.0, 1.2, 1.6, 1.5, 1.6, 1.5, 1.3, 1.3, 1.3, 1.2, 1.4, 1.2, 1.0, 1.3, 1.2, 1.3, 1.3, 1.1, 1.3, 2.5, 1.9, 2.1, 1.8, 2.2, 2.1, 1.7, 1.8, 1.8, 2.5, 2.0, 1.9, 2.1, 2.0, 2.4, 2.3, 1.8, 2.2, 2.3, 1.5, 2.3, 2.0, 2.0, 1.8, 2.1, 1.8, 1.8, 1.8, 2.1, 1.6, 1.9, 2.0, 2.2, 1.5, 1.4, 2.3, 2.4, 1.8, 1.8, 2.1, 2.4, 2.3, 1.9, 2.3, 2.5, 2.3, 1.9, 2.0, 2.3, 1.8], 'species': ['setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica']}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# pandas `DataFrame`\n",
"\n",
"The primary interest in pandas is the `DataFrame`. A `DataFrame` is a type, conceptually related to a numpy array, for containing large amounts of data and operating efficiently on it. With `DataFrame`s, however, there is typically more structure. A `DataFrame` is always two dimensional, with every element in a column having the same data type. There are multiple columns, each with a name and potentially different datatypes. The easiest way to think about a `DataFrame` is like a well-organized spreadsheet. Indeed, `DataFrame`s are great for doing the kind of calculations you might do in spreadsheets.\n",
"\n",
"## Creation\n",
"\n",
"One way to create a pandas `DataFrame` is by using its constructor, `DataFrame()`. If provided one argument, a dictionary, it will create a new `DataFrame` instance with a column from each item in the dict. The dict key becomes the column name and the dict value (a Python sequence) becomes are the column data values. Pandas will infer the datatype for the column. It is required that the length of all sequences in the dict are identical so that each column in the `DataFrame` has the same length.\n",
"\n",
"As an example, let's load our Iris dataset."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"df = pd.DataFrame(iris_dataset)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"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",
" species \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 5.1 \n",
" 3.5 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 1 \n",
" 4.9 \n",
" 3.0 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 2 \n",
" 4.7 \n",
" 3.2 \n",
" 1.3 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 3 \n",
" 4.6 \n",
" 3.1 \n",
" 1.5 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 4 \n",
" 5.0 \n",
" 3.6 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 145 \n",
" 6.7 \n",
" 3.0 \n",
" 5.2 \n",
" 2.3 \n",
" virginica \n",
" \n",
" \n",
" 146 \n",
" 6.3 \n",
" 2.5 \n",
" 5.0 \n",
" 1.9 \n",
" virginica \n",
" \n",
" \n",
" 147 \n",
" 6.5 \n",
" 3.0 \n",
" 5.2 \n",
" 2.0 \n",
" virginica \n",
" \n",
" \n",
" 148 \n",
" 6.2 \n",
" 3.4 \n",
" 5.4 \n",
" 2.3 \n",
" virginica \n",
" \n",
" \n",
" 149 \n",
" 5.9 \n",
" 3.0 \n",
" 5.1 \n",
" 1.8 \n",
" virginica \n",
" \n",
" \n",
"
\n",
"
150 rows × 5 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",
".. ... ... ... ... \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",
" species \n",
"0 setosa \n",
"1 setosa \n",
"2 setosa \n",
"3 setosa \n",
"4 setosa \n",
".. ... \n",
"145 virginica \n",
"146 virginica \n",
"147 virginica \n",
"148 virginica \n",
"149 virginica \n",
"\n",
"[150 rows x 5 columns]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The `head()` and `tail()` methods both return dataframes which are a subset of the original dataframe, with the top and bottom rows, respectively:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"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",
" species \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 5.1 \n",
" 3.5 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 1 \n",
" 4.9 \n",
" 3.0 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 2 \n",
" 4.7 \n",
" 3.2 \n",
" 1.3 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 3 \n",
" 4.6 \n",
" 3.1 \n",
" 1.5 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 4 \n",
" 5.0 \n",
" 3.6 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \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",
"\n",
" species \n",
"0 setosa \n",
"1 setosa \n",
"2 setosa \n",
"3 setosa \n",
"4 setosa "
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"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",
" species \n",
" \n",
" \n",
" \n",
" \n",
" 145 \n",
" 6.7 \n",
" 3.0 \n",
" 5.2 \n",
" 2.3 \n",
" virginica \n",
" \n",
" \n",
" 146 \n",
" 6.3 \n",
" 2.5 \n",
" 5.0 \n",
" 1.9 \n",
" virginica \n",
" \n",
" \n",
" 147 \n",
" 6.5 \n",
" 3.0 \n",
" 5.2 \n",
" 2.0 \n",
" virginica \n",
" \n",
" \n",
" 148 \n",
" 6.2 \n",
" 3.4 \n",
" 5.4 \n",
" 2.3 \n",
" virginica \n",
" \n",
" \n",
" 149 \n",
" 5.9 \n",
" 3.0 \n",
" 5.1 \n",
" 1.8 \n",
" virginica \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\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",
" species \n",
"145 virginica \n",
"146 virginica \n",
"147 virginica \n",
"148 virginica \n",
"149 virginica "
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.tail()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that jupyter and pandas work nicely together to give the nicely formatted output you see above. Here is plain `print()`:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\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",
" species \n",
"145 virginica \n",
"146 virginica \n",
"147 virginica \n",
"148 virginica \n",
"149 virginica \n"
]
}
],
"source": [
"print(df.tail())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"What's happening behind the scenes is that Pandas knows how to use the `diplay()` function from IPython."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"from IPython.display import display"
]
},
{
"cell_type": "code",
"execution_count": 15,
"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",
" species \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 5.1 \n",
" 3.5 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 1 \n",
" 4.9 \n",
" 3.0 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 2 \n",
" 4.7 \n",
" 3.2 \n",
" 1.3 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 3 \n",
" 4.6 \n",
" 3.1 \n",
" 1.5 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 4 \n",
" 5.0 \n",
" 3.6 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \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",
"\n",
" species \n",
"0 setosa \n",
"1 setosa \n",
"2 setosa \n",
"3 setosa \n",
"4 setosa "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display(df.head())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# The `DataFrame.groupby()` method\n",
"\n",
"One of the most useful aspects of dataframes is the `groupby()` method, which returns an iterator that steps through the original dataframe by returning subsets (groups) which all have been selected based on a common value. An example will make this more clear.\n",
"\n",
"Here we will step through our original dataframe grouping by species. The iterator from `groupby()` returns, on each iteration, a tuple of `(group_value, group_data_frame)`. Let's look at this in action:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"species: Iris setosa\n"
]
},
{
"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",
" species \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 5.1 \n",
" 3.5 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 1 \n",
" 4.9 \n",
" 3.0 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 2 \n",
" 4.7 \n",
" 3.2 \n",
" 1.3 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 3 \n",
" 4.6 \n",
" 3.1 \n",
" 1.5 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 4 \n",
" 5.0 \n",
" 3.6 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \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",
"\n",
" species \n",
"0 setosa \n",
"1 setosa \n",
"2 setosa \n",
"3 setosa \n",
"4 setosa "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"species: Iris versicolor\n"
]
},
{
"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",
" species \n",
" \n",
" \n",
" \n",
" \n",
" 50 \n",
" 7.0 \n",
" 3.2 \n",
" 4.7 \n",
" 1.4 \n",
" versicolor \n",
" \n",
" \n",
" 51 \n",
" 6.4 \n",
" 3.2 \n",
" 4.5 \n",
" 1.5 \n",
" versicolor \n",
" \n",
" \n",
" 52 \n",
" 6.9 \n",
" 3.1 \n",
" 4.9 \n",
" 1.5 \n",
" versicolor \n",
" \n",
" \n",
" 53 \n",
" 5.5 \n",
" 2.3 \n",
" 4.0 \n",
" 1.3 \n",
" versicolor \n",
" \n",
" \n",
" 54 \n",
" 6.5 \n",
" 2.8 \n",
" 4.6 \n",
" 1.5 \n",
" versicolor \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\n",
"50 7.0 3.2 4.7 1.4 \n",
"51 6.4 3.2 4.5 1.5 \n",
"52 6.9 3.1 4.9 1.5 \n",
"53 5.5 2.3 4.0 1.3 \n",
"54 6.5 2.8 4.6 1.5 \n",
"\n",
" species \n",
"50 versicolor \n",
"51 versicolor \n",
"52 versicolor \n",
"53 versicolor \n",
"54 versicolor "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"species: Iris virginica\n"
]
},
{
"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",
" species \n",
" \n",
" \n",
" \n",
" \n",
" 100 \n",
" 6.3 \n",
" 3.3 \n",
" 6.0 \n",
" 2.5 \n",
" virginica \n",
" \n",
" \n",
" 101 \n",
" 5.8 \n",
" 2.7 \n",
" 5.1 \n",
" 1.9 \n",
" virginica \n",
" \n",
" \n",
" 102 \n",
" 7.1 \n",
" 3.0 \n",
" 5.9 \n",
" 2.1 \n",
" virginica \n",
" \n",
" \n",
" 103 \n",
" 6.3 \n",
" 2.9 \n",
" 5.6 \n",
" 1.8 \n",
" virginica \n",
" \n",
" \n",
" 104 \n",
" 6.5 \n",
" 3.0 \n",
" 5.8 \n",
" 2.2 \n",
" virginica \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\n",
"100 6.3 3.3 6.0 2.5 \n",
"101 5.8 2.7 5.1 1.9 \n",
"102 7.1 3.0 5.9 2.1 \n",
"103 6.3 2.9 5.6 1.8 \n",
"104 6.5 3.0 5.8 2.2 \n",
"\n",
" species \n",
"100 virginica \n",
"101 virginica \n",
"102 virginica \n",
"103 virginica \n",
"104 virginica "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"my_iterator = df.groupby('species')\n",
"for x in my_iterator:\n",
" species, gdf = x\n",
" print(f\"species: Iris {species}\")\n",
" display(gdf.head())"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"species: Iris setosa\n"
]
},
{
"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",
" species \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 5.1 \n",
" 3.5 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 1 \n",
" 4.9 \n",
" 3.0 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 2 \n",
" 4.7 \n",
" 3.2 \n",
" 1.3 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 3 \n",
" 4.6 \n",
" 3.1 \n",
" 1.5 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 4 \n",
" 5.0 \n",
" 3.6 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \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",
"\n",
" species \n",
"0 setosa \n",
"1 setosa \n",
"2 setosa \n",
"3 setosa \n",
"4 setosa "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"species: Iris versicolor\n"
]
},
{
"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",
" species \n",
" \n",
" \n",
" \n",
" \n",
" 50 \n",
" 7.0 \n",
" 3.2 \n",
" 4.7 \n",
" 1.4 \n",
" versicolor \n",
" \n",
" \n",
" 51 \n",
" 6.4 \n",
" 3.2 \n",
" 4.5 \n",
" 1.5 \n",
" versicolor \n",
" \n",
" \n",
" 52 \n",
" 6.9 \n",
" 3.1 \n",
" 4.9 \n",
" 1.5 \n",
" versicolor \n",
" \n",
" \n",
" 53 \n",
" 5.5 \n",
" 2.3 \n",
" 4.0 \n",
" 1.3 \n",
" versicolor \n",
" \n",
" \n",
" 54 \n",
" 6.5 \n",
" 2.8 \n",
" 4.6 \n",
" 1.5 \n",
" versicolor \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\n",
"50 7.0 3.2 4.7 1.4 \n",
"51 6.4 3.2 4.5 1.5 \n",
"52 6.9 3.1 4.9 1.5 \n",
"53 5.5 2.3 4.0 1.3 \n",
"54 6.5 2.8 4.6 1.5 \n",
"\n",
" species \n",
"50 versicolor \n",
"51 versicolor \n",
"52 versicolor \n",
"53 versicolor \n",
"54 versicolor "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"species: Iris virginica\n"
]
},
{
"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",
" species \n",
" \n",
" \n",
" \n",
" \n",
" 100 \n",
" 6.3 \n",
" 3.3 \n",
" 6.0 \n",
" 2.5 \n",
" virginica \n",
" \n",
" \n",
" 101 \n",
" 5.8 \n",
" 2.7 \n",
" 5.1 \n",
" 1.9 \n",
" virginica \n",
" \n",
" \n",
" 102 \n",
" 7.1 \n",
" 3.0 \n",
" 5.9 \n",
" 2.1 \n",
" virginica \n",
" \n",
" \n",
" 103 \n",
" 6.3 \n",
" 2.9 \n",
" 5.6 \n",
" 1.8 \n",
" virginica \n",
" \n",
" \n",
" 104 \n",
" 6.5 \n",
" 3.0 \n",
" 5.8 \n",
" 2.2 \n",
" virginica \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\n",
"100 6.3 3.3 6.0 2.5 \n",
"101 5.8 2.7 5.1 1.9 \n",
"102 7.1 3.0 5.9 2.1 \n",
"103 6.3 2.9 5.6 1.8 \n",
"104 6.5 3.0 5.8 2.2 \n",
"\n",
" species \n",
"100 virginica \n",
"101 virginica \n",
"102 virginica \n",
"103 virginica \n",
"104 virginica "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"for species, gdf in df.groupby('species'):\n",
" print(f\"species: Iris {species}\")\n",
" display(gdf.head())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a closer look at this iteration aspect:"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"my_iter = df.groupby('species')\n",
"print(type(my_iter))"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"setosa 50\n",
"versicolor 50\n",
"virginica 50\n"
]
}
],
"source": [
"my_iter = df.groupby('species')\n",
"for x in my_iter:\n",
" # species = x[0]\n",
" # gdf = x[1]\n",
" species, gdf = x\n",
" # (species, gdf) = x\n",
" print(species, len(gdf))"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"setosa 50\n",
"versicolor 50\n",
"virginica 50\n"
]
}
],
"source": [
"for species, gdf in df.groupby('species'):\n",
" print(species, len(gdf))"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"=============== setosa ============\n"
]
},
{
"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",
" species \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 5.1 \n",
" 3.5 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 1 \n",
" 4.9 \n",
" 3.0 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 2 \n",
" 4.7 \n",
" 3.2 \n",
" 1.3 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 3 \n",
" 4.6 \n",
" 3.1 \n",
" 1.5 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 4 \n",
" 5.0 \n",
" 3.6 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 5 \n",
" 5.4 \n",
" 3.9 \n",
" 1.7 \n",
" 0.4 \n",
" setosa \n",
" \n",
" \n",
" 6 \n",
" 4.6 \n",
" 3.4 \n",
" 1.4 \n",
" 0.3 \n",
" setosa \n",
" \n",
" \n",
" 7 \n",
" 5.0 \n",
" 3.4 \n",
" 1.5 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 8 \n",
" 4.4 \n",
" 2.9 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 9 \n",
" 4.9 \n",
" 3.1 \n",
" 1.5 \n",
" 0.1 \n",
" setosa \n",
" \n",
" \n",
" 10 \n",
" 5.4 \n",
" 3.7 \n",
" 1.5 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 11 \n",
" 4.8 \n",
" 3.4 \n",
" 1.6 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 12 \n",
" 4.8 \n",
" 3.0 \n",
" 1.4 \n",
" 0.1 \n",
" setosa \n",
" \n",
" \n",
" 13 \n",
" 4.3 \n",
" 3.0 \n",
" 1.1 \n",
" 0.1 \n",
" setosa \n",
" \n",
" \n",
" 14 \n",
" 5.8 \n",
" 4.0 \n",
" 1.2 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 15 \n",
" 5.7 \n",
" 4.4 \n",
" 1.5 \n",
" 0.4 \n",
" setosa \n",
" \n",
" \n",
" 16 \n",
" 5.4 \n",
" 3.9 \n",
" 1.3 \n",
" 0.4 \n",
" setosa \n",
" \n",
" \n",
" 17 \n",
" 5.1 \n",
" 3.5 \n",
" 1.4 \n",
" 0.3 \n",
" setosa \n",
" \n",
" \n",
" 18 \n",
" 5.7 \n",
" 3.8 \n",
" 1.7 \n",
" 0.3 \n",
" setosa \n",
" \n",
" \n",
" 19 \n",
" 5.1 \n",
" 3.8 \n",
" 1.5 \n",
" 0.3 \n",
" setosa \n",
" \n",
" \n",
" 20 \n",
" 5.4 \n",
" 3.4 \n",
" 1.7 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 21 \n",
" 5.1 \n",
" 3.7 \n",
" 1.5 \n",
" 0.4 \n",
" setosa \n",
" \n",
" \n",
" 22 \n",
" 4.6 \n",
" 3.6 \n",
" 1.0 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 23 \n",
" 5.1 \n",
" 3.3 \n",
" 1.7 \n",
" 0.5 \n",
" setosa \n",
" \n",
" \n",
" 24 \n",
" 4.8 \n",
" 3.4 \n",
" 1.9 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 25 \n",
" 5.0 \n",
" 3.0 \n",
" 1.6 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 26 \n",
" 5.0 \n",
" 3.4 \n",
" 1.6 \n",
" 0.4 \n",
" setosa \n",
" \n",
" \n",
" 27 \n",
" 5.2 \n",
" 3.5 \n",
" 1.5 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 28 \n",
" 5.2 \n",
" 3.4 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 29 \n",
" 4.7 \n",
" 3.2 \n",
" 1.6 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 30 \n",
" 4.8 \n",
" 3.1 \n",
" 1.6 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 31 \n",
" 5.4 \n",
" 3.4 \n",
" 1.5 \n",
" 0.4 \n",
" setosa \n",
" \n",
" \n",
" 32 \n",
" 5.2 \n",
" 4.1 \n",
" 1.5 \n",
" 0.1 \n",
" setosa \n",
" \n",
" \n",
" 33 \n",
" 5.5 \n",
" 4.2 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 34 \n",
" 4.9 \n",
" 3.1 \n",
" 1.5 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 35 \n",
" 5.0 \n",
" 3.2 \n",
" 1.2 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 36 \n",
" 5.5 \n",
" 3.5 \n",
" 1.3 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 37 \n",
" 4.9 \n",
" 3.6 \n",
" 1.4 \n",
" 0.1 \n",
" setosa \n",
" \n",
" \n",
" 38 \n",
" 4.4 \n",
" 3.0 \n",
" 1.3 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 39 \n",
" 5.1 \n",
" 3.4 \n",
" 1.5 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 40 \n",
" 5.0 \n",
" 3.5 \n",
" 1.3 \n",
" 0.3 \n",
" setosa \n",
" \n",
" \n",
" 41 \n",
" 4.5 \n",
" 2.3 \n",
" 1.3 \n",
" 0.3 \n",
" setosa \n",
" \n",
" \n",
" 42 \n",
" 4.4 \n",
" 3.2 \n",
" 1.3 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 43 \n",
" 5.0 \n",
" 3.5 \n",
" 1.6 \n",
" 0.6 \n",
" setosa \n",
" \n",
" \n",
" 44 \n",
" 5.1 \n",
" 3.8 \n",
" 1.9 \n",
" 0.4 \n",
" setosa \n",
" \n",
" \n",
" 45 \n",
" 4.8 \n",
" 3.0 \n",
" 1.4 \n",
" 0.3 \n",
" setosa \n",
" \n",
" \n",
" 46 \n",
" 5.1 \n",
" 3.8 \n",
" 1.6 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 47 \n",
" 4.6 \n",
" 3.2 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 48 \n",
" 5.3 \n",
" 3.7 \n",
" 1.5 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 49 \n",
" 5.0 \n",
" 3.3 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \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 \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",
"30 4.8 3.1 1.6 0.2 \n",
"31 5.4 3.4 1.5 0.4 \n",
"32 5.2 4.1 1.5 0.1 \n",
"33 5.5 4.2 1.4 0.2 \n",
"34 4.9 3.1 1.5 0.2 \n",
"35 5.0 3.2 1.2 0.2 \n",
"36 5.5 3.5 1.3 0.2 \n",
"37 4.9 3.6 1.4 0.1 \n",
"38 4.4 3.0 1.3 0.2 \n",
"39 5.1 3.4 1.5 0.2 \n",
"40 5.0 3.5 1.3 0.3 \n",
"41 4.5 2.3 1.3 0.3 \n",
"42 4.4 3.2 1.3 0.2 \n",
"43 5.0 3.5 1.6 0.6 \n",
"44 5.1 3.8 1.9 0.4 \n",
"45 4.8 3.0 1.4 0.3 \n",
"46 5.1 3.8 1.6 0.2 \n",
"47 4.6 3.2 1.4 0.2 \n",
"48 5.3 3.7 1.5 0.2 \n",
"49 5.0 3.3 1.4 0.2 \n",
"\n",
" species \n",
"0 setosa \n",
"1 setosa \n",
"2 setosa \n",
"3 setosa \n",
"4 setosa \n",
"5 setosa \n",
"6 setosa \n",
"7 setosa \n",
"8 setosa \n",
"9 setosa \n",
"10 setosa \n",
"11 setosa \n",
"12 setosa \n",
"13 setosa \n",
"14 setosa \n",
"15 setosa \n",
"16 setosa \n",
"17 setosa \n",
"18 setosa \n",
"19 setosa \n",
"20 setosa \n",
"21 setosa \n",
"22 setosa \n",
"23 setosa \n",
"24 setosa \n",
"25 setosa \n",
"26 setosa \n",
"27 setosa \n",
"28 setosa \n",
"29 setosa \n",
"30 setosa \n",
"31 setosa \n",
"32 setosa \n",
"33 setosa \n",
"34 setosa \n",
"35 setosa \n",
"36 setosa \n",
"37 setosa \n",
"38 setosa \n",
"39 setosa \n",
"40 setosa \n",
"41 setosa \n",
"42 setosa \n",
"43 setosa \n",
"44 setosa \n",
"45 setosa \n",
"46 setosa \n",
"47 setosa \n",
"48 setosa \n",
"49 setosa "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"=============== versicolor ============\n"
]
},
{
"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",
" species \n",
" \n",
" \n",
" \n",
" \n",
" 50 \n",
" 7.0 \n",
" 3.2 \n",
" 4.7 \n",
" 1.4 \n",
" versicolor \n",
" \n",
" \n",
" 51 \n",
" 6.4 \n",
" 3.2 \n",
" 4.5 \n",
" 1.5 \n",
" versicolor \n",
" \n",
" \n",
" 52 \n",
" 6.9 \n",
" 3.1 \n",
" 4.9 \n",
" 1.5 \n",
" versicolor \n",
" \n",
" \n",
" 53 \n",
" 5.5 \n",
" 2.3 \n",
" 4.0 \n",
" 1.3 \n",
" versicolor \n",
" \n",
" \n",
" 54 \n",
" 6.5 \n",
" 2.8 \n",
" 4.6 \n",
" 1.5 \n",
" versicolor \n",
" \n",
" \n",
" 55 \n",
" 5.7 \n",
" 2.8 \n",
" 4.5 \n",
" 1.3 \n",
" versicolor \n",
" \n",
" \n",
" 56 \n",
" 6.3 \n",
" 3.3 \n",
" 4.7 \n",
" 1.6 \n",
" versicolor \n",
" \n",
" \n",
" 57 \n",
" 4.9 \n",
" 2.4 \n",
" 3.3 \n",
" 1.0 \n",
" versicolor \n",
" \n",
" \n",
" 58 \n",
" 6.6 \n",
" 2.9 \n",
" 4.6 \n",
" 1.3 \n",
" versicolor \n",
" \n",
" \n",
" 59 \n",
" 5.2 \n",
" 2.7 \n",
" 3.9 \n",
" 1.4 \n",
" versicolor \n",
" \n",
" \n",
" 60 \n",
" 5.0 \n",
" 2.0 \n",
" 3.5 \n",
" 1.0 \n",
" versicolor \n",
" \n",
" \n",
" 61 \n",
" 5.9 \n",
" 3.0 \n",
" 4.2 \n",
" 1.5 \n",
" versicolor \n",
" \n",
" \n",
" 62 \n",
" 6.0 \n",
" 2.2 \n",
" 4.0 \n",
" 1.0 \n",
" versicolor \n",
" \n",
" \n",
" 63 \n",
" 6.1 \n",
" 2.9 \n",
" 4.7 \n",
" 1.4 \n",
" versicolor \n",
" \n",
" \n",
" 64 \n",
" 5.6 \n",
" 2.9 \n",
" 3.6 \n",
" 1.3 \n",
" versicolor \n",
" \n",
" \n",
" 65 \n",
" 6.7 \n",
" 3.1 \n",
" 4.4 \n",
" 1.4 \n",
" versicolor \n",
" \n",
" \n",
" 66 \n",
" 5.6 \n",
" 3.0 \n",
" 4.5 \n",
" 1.5 \n",
" versicolor \n",
" \n",
" \n",
" 67 \n",
" 5.8 \n",
" 2.7 \n",
" 4.1 \n",
" 1.0 \n",
" versicolor \n",
" \n",
" \n",
" 68 \n",
" 6.2 \n",
" 2.2 \n",
" 4.5 \n",
" 1.5 \n",
" versicolor \n",
" \n",
" \n",
" 69 \n",
" 5.6 \n",
" 2.5 \n",
" 3.9 \n",
" 1.1 \n",
" versicolor \n",
" \n",
" \n",
" 70 \n",
" 5.9 \n",
" 3.2 \n",
" 4.8 \n",
" 1.8 \n",
" versicolor \n",
" \n",
" \n",
" 71 \n",
" 6.1 \n",
" 2.8 \n",
" 4.0 \n",
" 1.3 \n",
" versicolor \n",
" \n",
" \n",
" 72 \n",
" 6.3 \n",
" 2.5 \n",
" 4.9 \n",
" 1.5 \n",
" versicolor \n",
" \n",
" \n",
" 73 \n",
" 6.1 \n",
" 2.8 \n",
" 4.7 \n",
" 1.2 \n",
" versicolor \n",
" \n",
" \n",
" 74 \n",
" 6.4 \n",
" 2.9 \n",
" 4.3 \n",
" 1.3 \n",
" versicolor \n",
" \n",
" \n",
" 75 \n",
" 6.6 \n",
" 3.0 \n",
" 4.4 \n",
" 1.4 \n",
" versicolor \n",
" \n",
" \n",
" 76 \n",
" 6.8 \n",
" 2.8 \n",
" 4.8 \n",
" 1.4 \n",
" versicolor \n",
" \n",
" \n",
" 77 \n",
" 6.7 \n",
" 3.0 \n",
" 5.0 \n",
" 1.7 \n",
" versicolor \n",
" \n",
" \n",
" 78 \n",
" 6.0 \n",
" 2.9 \n",
" 4.5 \n",
" 1.5 \n",
" versicolor \n",
" \n",
" \n",
" 79 \n",
" 5.7 \n",
" 2.6 \n",
" 3.5 \n",
" 1.0 \n",
" versicolor \n",
" \n",
" \n",
" 80 \n",
" 5.5 \n",
" 2.4 \n",
" 3.8 \n",
" 1.1 \n",
" versicolor \n",
" \n",
" \n",
" 81 \n",
" 5.5 \n",
" 2.4 \n",
" 3.7 \n",
" 1.0 \n",
" versicolor \n",
" \n",
" \n",
" 82 \n",
" 5.8 \n",
" 2.7 \n",
" 3.9 \n",
" 1.2 \n",
" versicolor \n",
" \n",
" \n",
" 83 \n",
" 6.0 \n",
" 2.7 \n",
" 5.1 \n",
" 1.6 \n",
" versicolor \n",
" \n",
" \n",
" 84 \n",
" 5.4 \n",
" 3.0 \n",
" 4.5 \n",
" 1.5 \n",
" versicolor \n",
" \n",
" \n",
" 85 \n",
" 6.0 \n",
" 3.4 \n",
" 4.5 \n",
" 1.6 \n",
" versicolor \n",
" \n",
" \n",
" 86 \n",
" 6.7 \n",
" 3.1 \n",
" 4.7 \n",
" 1.5 \n",
" versicolor \n",
" \n",
" \n",
" 87 \n",
" 6.3 \n",
" 2.3 \n",
" 4.4 \n",
" 1.3 \n",
" versicolor \n",
" \n",
" \n",
" 88 \n",
" 5.6 \n",
" 3.0 \n",
" 4.1 \n",
" 1.3 \n",
" versicolor \n",
" \n",
" \n",
" 89 \n",
" 5.5 \n",
" 2.5 \n",
" 4.0 \n",
" 1.3 \n",
" versicolor \n",
" \n",
" \n",
" 90 \n",
" 5.5 \n",
" 2.6 \n",
" 4.4 \n",
" 1.2 \n",
" versicolor \n",
" \n",
" \n",
" 91 \n",
" 6.1 \n",
" 3.0 \n",
" 4.6 \n",
" 1.4 \n",
" versicolor \n",
" \n",
" \n",
" 92 \n",
" 5.8 \n",
" 2.6 \n",
" 4.0 \n",
" 1.2 \n",
" versicolor \n",
" \n",
" \n",
" 93 \n",
" 5.0 \n",
" 2.3 \n",
" 3.3 \n",
" 1.0 \n",
" versicolor \n",
" \n",
" \n",
" 94 \n",
" 5.6 \n",
" 2.7 \n",
" 4.2 \n",
" 1.3 \n",
" versicolor \n",
" \n",
" \n",
" 95 \n",
" 5.7 \n",
" 3.0 \n",
" 4.2 \n",
" 1.2 \n",
" versicolor \n",
" \n",
" \n",
" 96 \n",
" 5.7 \n",
" 2.9 \n",
" 4.2 \n",
" 1.3 \n",
" versicolor \n",
" \n",
" \n",
" 97 \n",
" 6.2 \n",
" 2.9 \n",
" 4.3 \n",
" 1.3 \n",
" versicolor \n",
" \n",
" \n",
" 98 \n",
" 5.1 \n",
" 2.5 \n",
" 3.0 \n",
" 1.1 \n",
" versicolor \n",
" \n",
" \n",
" 99 \n",
" 5.7 \n",
" 2.8 \n",
" 4.1 \n",
" 1.3 \n",
" versicolor \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\n",
"50 7.0 3.2 4.7 1.4 \n",
"51 6.4 3.2 4.5 1.5 \n",
"52 6.9 3.1 4.9 1.5 \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",
"56 6.3 3.3 4.7 1.6 \n",
"57 4.9 2.4 3.3 1.0 \n",
"58 6.6 2.9 4.6 1.3 \n",
"59 5.2 2.7 3.9 1.4 \n",
"60 5.0 2.0 3.5 1.0 \n",
"61 5.9 3.0 4.2 1.5 \n",
"62 6.0 2.2 4.0 1.0 \n",
"63 6.1 2.9 4.7 1.4 \n",
"64 5.6 2.9 3.6 1.3 \n",
"65 6.7 3.1 4.4 1.4 \n",
"66 5.6 3.0 4.5 1.5 \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",
"70 5.9 3.2 4.8 1.8 \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",
"74 6.4 2.9 4.3 1.3 \n",
"75 6.6 3.0 4.4 1.4 \n",
"76 6.8 2.8 4.8 1.4 \n",
"77 6.7 3.0 5.0 1.7 \n",
"78 6.0 2.9 4.5 1.5 \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",
"84 5.4 3.0 4.5 1.5 \n",
"85 6.0 3.4 4.5 1.6 \n",
"86 6.7 3.1 4.7 1.5 \n",
"87 6.3 2.3 4.4 1.3 \n",
"88 5.6 3.0 4.1 1.3 \n",
"89 5.5 2.5 4.0 1.3 \n",
"90 5.5 2.6 4.4 1.2 \n",
"91 6.1 3.0 4.6 1.4 \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",
"95 5.7 3.0 4.2 1.2 \n",
"96 5.7 2.9 4.2 1.3 \n",
"97 6.2 2.9 4.3 1.3 \n",
"98 5.1 2.5 3.0 1.1 \n",
"99 5.7 2.8 4.1 1.3 \n",
"\n",
" species \n",
"50 versicolor \n",
"51 versicolor \n",
"52 versicolor \n",
"53 versicolor \n",
"54 versicolor \n",
"55 versicolor \n",
"56 versicolor \n",
"57 versicolor \n",
"58 versicolor \n",
"59 versicolor \n",
"60 versicolor \n",
"61 versicolor \n",
"62 versicolor \n",
"63 versicolor \n",
"64 versicolor \n",
"65 versicolor \n",
"66 versicolor \n",
"67 versicolor \n",
"68 versicolor \n",
"69 versicolor \n",
"70 versicolor \n",
"71 versicolor \n",
"72 versicolor \n",
"73 versicolor \n",
"74 versicolor \n",
"75 versicolor \n",
"76 versicolor \n",
"77 versicolor \n",
"78 versicolor \n",
"79 versicolor \n",
"80 versicolor \n",
"81 versicolor \n",
"82 versicolor \n",
"83 versicolor \n",
"84 versicolor \n",
"85 versicolor \n",
"86 versicolor \n",
"87 versicolor \n",
"88 versicolor \n",
"89 versicolor \n",
"90 versicolor \n",
"91 versicolor \n",
"92 versicolor \n",
"93 versicolor \n",
"94 versicolor \n",
"95 versicolor \n",
"96 versicolor \n",
"97 versicolor \n",
"98 versicolor \n",
"99 versicolor "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"=============== virginica ============\n"
]
},
{
"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",
" species \n",
" \n",
" \n",
" \n",
" \n",
" 100 \n",
" 6.3 \n",
" 3.3 \n",
" 6.0 \n",
" 2.5 \n",
" virginica \n",
" \n",
" \n",
" 101 \n",
" 5.8 \n",
" 2.7 \n",
" 5.1 \n",
" 1.9 \n",
" virginica \n",
" \n",
" \n",
" 102 \n",
" 7.1 \n",
" 3.0 \n",
" 5.9 \n",
" 2.1 \n",
" virginica \n",
" \n",
" \n",
" 103 \n",
" 6.3 \n",
" 2.9 \n",
" 5.6 \n",
" 1.8 \n",
" virginica \n",
" \n",
" \n",
" 104 \n",
" 6.5 \n",
" 3.0 \n",
" 5.8 \n",
" 2.2 \n",
" virginica \n",
" \n",
" \n",
" 105 \n",
" 7.6 \n",
" 3.0 \n",
" 6.6 \n",
" 2.1 \n",
" virginica \n",
" \n",
" \n",
" 106 \n",
" 4.9 \n",
" 2.5 \n",
" 4.5 \n",
" 1.7 \n",
" virginica \n",
" \n",
" \n",
" 107 \n",
" 7.3 \n",
" 2.9 \n",
" 6.3 \n",
" 1.8 \n",
" virginica \n",
" \n",
" \n",
" 108 \n",
" 6.7 \n",
" 2.5 \n",
" 5.8 \n",
" 1.8 \n",
" virginica \n",
" \n",
" \n",
" 109 \n",
" 7.2 \n",
" 3.6 \n",
" 6.1 \n",
" 2.5 \n",
" virginica \n",
" \n",
" \n",
" 110 \n",
" 6.5 \n",
" 3.2 \n",
" 5.1 \n",
" 2.0 \n",
" virginica \n",
" \n",
" \n",
" 111 \n",
" 6.4 \n",
" 2.7 \n",
" 5.3 \n",
" 1.9 \n",
" virginica \n",
" \n",
" \n",
" 112 \n",
" 6.8 \n",
" 3.0 \n",
" 5.5 \n",
" 2.1 \n",
" virginica \n",
" \n",
" \n",
" 113 \n",
" 5.7 \n",
" 2.5 \n",
" 5.0 \n",
" 2.0 \n",
" virginica \n",
" \n",
" \n",
" 114 \n",
" 5.8 \n",
" 2.8 \n",
" 5.1 \n",
" 2.4 \n",
" virginica \n",
" \n",
" \n",
" 115 \n",
" 6.4 \n",
" 3.2 \n",
" 5.3 \n",
" 2.3 \n",
" virginica \n",
" \n",
" \n",
" 116 \n",
" 6.5 \n",
" 3.0 \n",
" 5.5 \n",
" 1.8 \n",
" virginica \n",
" \n",
" \n",
" 117 \n",
" 7.7 \n",
" 3.8 \n",
" 6.7 \n",
" 2.2 \n",
" virginica \n",
" \n",
" \n",
" 118 \n",
" 7.7 \n",
" 2.6 \n",
" 6.9 \n",
" 2.3 \n",
" virginica \n",
" \n",
" \n",
" 119 \n",
" 6.0 \n",
" 2.2 \n",
" 5.0 \n",
" 1.5 \n",
" virginica \n",
" \n",
" \n",
" 120 \n",
" 6.9 \n",
" 3.2 \n",
" 5.7 \n",
" 2.3 \n",
" virginica \n",
" \n",
" \n",
" 121 \n",
" 5.6 \n",
" 2.8 \n",
" 4.9 \n",
" 2.0 \n",
" virginica \n",
" \n",
" \n",
" 122 \n",
" 7.7 \n",
" 2.8 \n",
" 6.7 \n",
" 2.0 \n",
" virginica \n",
" \n",
" \n",
" 123 \n",
" 6.3 \n",
" 2.7 \n",
" 4.9 \n",
" 1.8 \n",
" virginica \n",
" \n",
" \n",
" 124 \n",
" 6.7 \n",
" 3.3 \n",
" 5.7 \n",
" 2.1 \n",
" virginica \n",
" \n",
" \n",
" 125 \n",
" 7.2 \n",
" 3.2 \n",
" 6.0 \n",
" 1.8 \n",
" virginica \n",
" \n",
" \n",
" 126 \n",
" 6.2 \n",
" 2.8 \n",
" 4.8 \n",
" 1.8 \n",
" virginica \n",
" \n",
" \n",
" 127 \n",
" 6.1 \n",
" 3.0 \n",
" 4.9 \n",
" 1.8 \n",
" virginica \n",
" \n",
" \n",
" 128 \n",
" 6.4 \n",
" 2.8 \n",
" 5.6 \n",
" 2.1 \n",
" virginica \n",
" \n",
" \n",
" 129 \n",
" 7.2 \n",
" 3.0 \n",
" 5.8 \n",
" 1.6 \n",
" virginica \n",
" \n",
" \n",
" 130 \n",
" 7.4 \n",
" 2.8 \n",
" 6.1 \n",
" 1.9 \n",
" virginica \n",
" \n",
" \n",
" 131 \n",
" 7.9 \n",
" 3.8 \n",
" 6.4 \n",
" 2.0 \n",
" virginica \n",
" \n",
" \n",
" 132 \n",
" 6.4 \n",
" 2.8 \n",
" 5.6 \n",
" 2.2 \n",
" virginica \n",
" \n",
" \n",
" 133 \n",
" 6.3 \n",
" 2.8 \n",
" 5.1 \n",
" 1.5 \n",
" virginica \n",
" \n",
" \n",
" 134 \n",
" 6.1 \n",
" 2.6 \n",
" 5.6 \n",
" 1.4 \n",
" virginica \n",
" \n",
" \n",
" 135 \n",
" 7.7 \n",
" 3.0 \n",
" 6.1 \n",
" 2.3 \n",
" virginica \n",
" \n",
" \n",
" 136 \n",
" 6.3 \n",
" 3.4 \n",
" 5.6 \n",
" 2.4 \n",
" virginica \n",
" \n",
" \n",
" 137 \n",
" 6.4 \n",
" 3.1 \n",
" 5.5 \n",
" 1.8 \n",
" virginica \n",
" \n",
" \n",
" 138 \n",
" 6.0 \n",
" 3.0 \n",
" 4.8 \n",
" 1.8 \n",
" virginica \n",
" \n",
" \n",
" 139 \n",
" 6.9 \n",
" 3.1 \n",
" 5.4 \n",
" 2.1 \n",
" virginica \n",
" \n",
" \n",
" 140 \n",
" 6.7 \n",
" 3.1 \n",
" 5.6 \n",
" 2.4 \n",
" virginica \n",
" \n",
" \n",
" 141 \n",
" 6.9 \n",
" 3.1 \n",
" 5.1 \n",
" 2.3 \n",
" virginica \n",
" \n",
" \n",
" 142 \n",
" 5.8 \n",
" 2.7 \n",
" 5.1 \n",
" 1.9 \n",
" virginica \n",
" \n",
" \n",
" 143 \n",
" 6.8 \n",
" 3.2 \n",
" 5.9 \n",
" 2.3 \n",
" virginica \n",
" \n",
" \n",
" 144 \n",
" 6.7 \n",
" 3.3 \n",
" 5.7 \n",
" 2.5 \n",
" virginica \n",
" \n",
" \n",
" 145 \n",
" 6.7 \n",
" 3.0 \n",
" 5.2 \n",
" 2.3 \n",
" virginica \n",
" \n",
" \n",
" 146 \n",
" 6.3 \n",
" 2.5 \n",
" 5.0 \n",
" 1.9 \n",
" virginica \n",
" \n",
" \n",
" 147 \n",
" 6.5 \n",
" 3.0 \n",
" 5.2 \n",
" 2.0 \n",
" virginica \n",
" \n",
" \n",
" 148 \n",
" 6.2 \n",
" 3.4 \n",
" 5.4 \n",
" 2.3 \n",
" virginica \n",
" \n",
" \n",
" 149 \n",
" 5.9 \n",
" 3.0 \n",
" 5.1 \n",
" 1.8 \n",
" virginica \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\n",
"100 6.3 3.3 6.0 2.5 \n",
"101 5.8 2.7 5.1 1.9 \n",
"102 7.1 3.0 5.9 2.1 \n",
"103 6.3 2.9 5.6 1.8 \n",
"104 6.5 3.0 5.8 2.2 \n",
"105 7.6 3.0 6.6 2.1 \n",
"106 4.9 2.5 4.5 1.7 \n",
"107 7.3 2.9 6.3 1.8 \n",
"108 6.7 2.5 5.8 1.8 \n",
"109 7.2 3.6 6.1 2.5 \n",
"110 6.5 3.2 5.1 2.0 \n",
"111 6.4 2.7 5.3 1.9 \n",
"112 6.8 3.0 5.5 2.1 \n",
"113 5.7 2.5 5.0 2.0 \n",
"114 5.8 2.8 5.1 2.4 \n",
"115 6.4 3.2 5.3 2.3 \n",
"116 6.5 3.0 5.5 1.8 \n",
"117 7.7 3.8 6.7 2.2 \n",
"118 7.7 2.6 6.9 2.3 \n",
"119 6.0 2.2 5.0 1.5 \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",
" species \n",
"100 virginica \n",
"101 virginica \n",
"102 virginica \n",
"103 virginica \n",
"104 virginica \n",
"105 virginica \n",
"106 virginica \n",
"107 virginica \n",
"108 virginica \n",
"109 virginica \n",
"110 virginica \n",
"111 virginica \n",
"112 virginica \n",
"113 virginica \n",
"114 virginica \n",
"115 virginica \n",
"116 virginica \n",
"117 virginica \n",
"118 virginica \n",
"119 virginica \n",
"120 virginica \n",
"121 virginica \n",
"122 virginica \n",
"123 virginica \n",
"124 virginica \n",
"125 virginica \n",
"126 virginica \n",
"127 virginica \n",
"128 virginica \n",
"129 virginica \n",
"130 virginica \n",
"131 virginica \n",
"132 virginica \n",
"133 virginica \n",
"134 virginica \n",
"135 virginica \n",
"136 virginica \n",
"137 virginica \n",
"138 virginica \n",
"139 virginica \n",
"140 virginica \n",
"141 virginica \n",
"142 virginica \n",
"143 virginica \n",
"144 virginica \n",
"145 virginica \n",
"146 virginica \n",
"147 virginica \n",
"148 virginica \n",
"149 virginica "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"for species, gdf in df.groupby('species'):\n",
" print(f\"=============== {species} ============\")\n",
" display(gdf)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"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.057333 \n",
" 3.758000 \n",
" 1.199333 \n",
" \n",
" \n",
" std \n",
" 0.828066 \n",
" 0.435866 \n",
" 1.765298 \n",
" 0.762238 \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.057333 3.758000 \n",
"std 0.828066 0.435866 1.765298 \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.199333 \n",
"std 0.762238 \n",
"min 0.100000 \n",
"25% 0.300000 \n",
"50% 1.300000 \n",
"75% 1.800000 \n",
"max 2.500000 "
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.describe()"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"=============== setosa ============\n"
]
},
{
"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",
" 50.00000 \n",
" 50.000000 \n",
" 50.000000 \n",
" 50.000000 \n",
" \n",
" \n",
" mean \n",
" 5.00600 \n",
" 3.428000 \n",
" 1.462000 \n",
" 0.246000 \n",
" \n",
" \n",
" std \n",
" 0.35249 \n",
" 0.379064 \n",
" 0.173664 \n",
" 0.105386 \n",
" \n",
" \n",
" min \n",
" 4.30000 \n",
" 2.300000 \n",
" 1.000000 \n",
" 0.100000 \n",
" \n",
" \n",
" 25% \n",
" 4.80000 \n",
" 3.200000 \n",
" 1.400000 \n",
" 0.200000 \n",
" \n",
" \n",
" 50% \n",
" 5.00000 \n",
" 3.400000 \n",
" 1.500000 \n",
" 0.200000 \n",
" \n",
" \n",
" 75% \n",
" 5.20000 \n",
" 3.675000 \n",
" 1.575000 \n",
" 0.300000 \n",
" \n",
" \n",
" max \n",
" 5.80000 \n",
" 4.400000 \n",
" 1.900000 \n",
" 0.600000 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" sepal length (cm) sepal width (cm) petal length (cm) \\\n",
"count 50.00000 50.000000 50.000000 \n",
"mean 5.00600 3.428000 1.462000 \n",
"std 0.35249 0.379064 0.173664 \n",
"min 4.30000 2.300000 1.000000 \n",
"25% 4.80000 3.200000 1.400000 \n",
"50% 5.00000 3.400000 1.500000 \n",
"75% 5.20000 3.675000 1.575000 \n",
"max 5.80000 4.400000 1.900000 \n",
"\n",
" petal width (cm) \n",
"count 50.000000 \n",
"mean 0.246000 \n",
"std 0.105386 \n",
"min 0.100000 \n",
"25% 0.200000 \n",
"50% 0.200000 \n",
"75% 0.300000 \n",
"max 0.600000 "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"=============== versicolor ============\n"
]
},
{
"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",
" 50.000000 \n",
" 50.000000 \n",
" 50.000000 \n",
" 50.000000 \n",
" \n",
" \n",
" mean \n",
" 5.936000 \n",
" 2.770000 \n",
" 4.260000 \n",
" 1.326000 \n",
" \n",
" \n",
" std \n",
" 0.516171 \n",
" 0.313798 \n",
" 0.469911 \n",
" 0.197753 \n",
" \n",
" \n",
" min \n",
" 4.900000 \n",
" 2.000000 \n",
" 3.000000 \n",
" 1.000000 \n",
" \n",
" \n",
" 25% \n",
" 5.600000 \n",
" 2.525000 \n",
" 4.000000 \n",
" 1.200000 \n",
" \n",
" \n",
" 50% \n",
" 5.900000 \n",
" 2.800000 \n",
" 4.350000 \n",
" 1.300000 \n",
" \n",
" \n",
" 75% \n",
" 6.300000 \n",
" 3.000000 \n",
" 4.600000 \n",
" 1.500000 \n",
" \n",
" \n",
" max \n",
" 7.000000 \n",
" 3.400000 \n",
" 5.100000 \n",
" 1.800000 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" sepal length (cm) sepal width (cm) petal length (cm) \\\n",
"count 50.000000 50.000000 50.000000 \n",
"mean 5.936000 2.770000 4.260000 \n",
"std 0.516171 0.313798 0.469911 \n",
"min 4.900000 2.000000 3.000000 \n",
"25% 5.600000 2.525000 4.000000 \n",
"50% 5.900000 2.800000 4.350000 \n",
"75% 6.300000 3.000000 4.600000 \n",
"max 7.000000 3.400000 5.100000 \n",
"\n",
" petal width (cm) \n",
"count 50.000000 \n",
"mean 1.326000 \n",
"std 0.197753 \n",
"min 1.000000 \n",
"25% 1.200000 \n",
"50% 1.300000 \n",
"75% 1.500000 \n",
"max 1.800000 "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"=============== virginica ============\n"
]
},
{
"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",
" 50.00000 \n",
" 50.000000 \n",
" 50.000000 \n",
" 50.00000 \n",
" \n",
" \n",
" mean \n",
" 6.58800 \n",
" 2.974000 \n",
" 5.552000 \n",
" 2.02600 \n",
" \n",
" \n",
" std \n",
" 0.63588 \n",
" 0.322497 \n",
" 0.551895 \n",
" 0.27465 \n",
" \n",
" \n",
" min \n",
" 4.90000 \n",
" 2.200000 \n",
" 4.500000 \n",
" 1.40000 \n",
" \n",
" \n",
" 25% \n",
" 6.22500 \n",
" 2.800000 \n",
" 5.100000 \n",
" 1.80000 \n",
" \n",
" \n",
" 50% \n",
" 6.50000 \n",
" 3.000000 \n",
" 5.550000 \n",
" 2.00000 \n",
" \n",
" \n",
" 75% \n",
" 6.90000 \n",
" 3.175000 \n",
" 5.875000 \n",
" 2.30000 \n",
" \n",
" \n",
" max \n",
" 7.90000 \n",
" 3.800000 \n",
" 6.900000 \n",
" 2.50000 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" sepal length (cm) sepal width (cm) petal length (cm) \\\n",
"count 50.00000 50.000000 50.000000 \n",
"mean 6.58800 2.974000 5.552000 \n",
"std 0.63588 0.322497 0.551895 \n",
"min 4.90000 2.200000 4.500000 \n",
"25% 6.22500 2.800000 5.100000 \n",
"50% 6.50000 3.000000 5.550000 \n",
"75% 6.90000 3.175000 5.875000 \n",
"max 7.90000 3.800000 6.900000 \n",
"\n",
" petal width (cm) \n",
"count 50.00000 \n",
"mean 2.02600 \n",
"std 0.27465 \n",
"min 1.40000 \n",
"25% 1.80000 \n",
"50% 2.00000 \n",
"75% 2.30000 \n",
"max 2.50000 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"for species, gdf in df.groupby('species'):\n",
" print(f\"=============== {species} ============\")\n",
" display(gdf.describe())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# More about Pandas `DataFrame`s\n",
"\n",
"Let's get started by making a sample dataframe with fake data:"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" number \n",
" color \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 1 \n",
" blue \n",
" \n",
" \n",
" 1 \n",
" 2 \n",
" blue \n",
" \n",
" \n",
" 2 \n",
" 3 \n",
" red \n",
" \n",
" \n",
" 3 \n",
" 6 \n",
" red \n",
" \n",
" \n",
" 4 \n",
" 2 \n",
" red \n",
" \n",
" \n",
" 5 \n",
" 3 \n",
" blue \n",
" \n",
" \n",
" 6 \n",
" 2 \n",
" blue \n",
" \n",
" \n",
" 7 \n",
" 2 \n",
" red \n",
" \n",
" \n",
" 8 \n",
" 1 \n",
" green \n",
" \n",
" \n",
" 9 \n",
" 2 \n",
" yellow \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" number color\n",
"0 1 blue\n",
"1 2 blue\n",
"2 3 red\n",
"3 6 red\n",
"4 2 red\n",
"5 3 blue\n",
"6 2 blue\n",
"7 2 red\n",
"8 1 green\n",
"9 2 yellow"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sample_df = pd.DataFrame({'number':[1,2,3,6,2,3,2,2,1,2], 'color':['blue','blue','red','red','red','blue','blue','red','green','yellow']})\n",
"display(sample_df)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Getting a `Series` from a `DataFrame` in Pandas\n",
"\n",
"You can get a `Series` (a Pandas 1D array) from a dataframe column by indexing with the column name:"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 blue\n",
"1 blue\n",
"2 red\n",
"3 red\n",
"4 red\n",
"5 blue\n",
"6 blue\n",
"7 red\n",
"8 green\n",
"9 yellow\n",
"Name: color, dtype: object"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"colors = sample_df['color']\n",
"display(colors)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Above we got a `Series` from a `DataFrame` column with dictionary-like get item using square brackets and a string with the name of the column. In addition to this approach, Pandas also has an ergonomic feature where columns with names that are valid Python can be used with a dot (`.`) as if they were variables (also called \"attributes\") of the `DataFrame` instance."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 blue\n",
"1 blue\n",
"2 red\n",
"3 red\n",
"4 red\n",
"5 blue\n",
"6 blue\n",
"7 red\n",
"8 green\n",
"9 yellow\n",
"Name: color, dtype: object"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# This does the same thing as above because \"color\" is a valid Python attribute name.\n",
"\n",
"colors = sample_df.color\n",
"display(colors)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"pandas.core.series.Series"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(colors)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A `Series` has many useful methods, such as `.unique()` and `.mean()`"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['blue', 'red', 'green', 'yellow'], dtype=object)"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"colors.unique()"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2.4"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sample_df['number'].mean()"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"blue\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" number \n",
" color \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 1 \n",
" blue \n",
" \n",
" \n",
" 1 \n",
" 2 \n",
" blue \n",
" \n",
" \n",
" 5 \n",
" 3 \n",
" blue \n",
" \n",
" \n",
" 6 \n",
" 2 \n",
" blue \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" number color\n",
"0 1 blue\n",
"1 2 blue\n",
"5 3 blue\n",
"6 2 blue"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"green\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" number \n",
" color \n",
" \n",
" \n",
" \n",
" \n",
" 8 \n",
" 1 \n",
" green \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" number color\n",
"8 1 green"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"red\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" number \n",
" color \n",
" \n",
" \n",
" \n",
" \n",
" 2 \n",
" 3 \n",
" red \n",
" \n",
" \n",
" 3 \n",
" 6 \n",
" red \n",
" \n",
" \n",
" 4 \n",
" 2 \n",
" red \n",
" \n",
" \n",
" 7 \n",
" 2 \n",
" red \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" number color\n",
"2 3 red\n",
"3 6 red\n",
"4 2 red\n",
"7 2 red"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"yellow\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" number \n",
" color \n",
" \n",
" \n",
" \n",
" \n",
" 9 \n",
" 2 \n",
" yellow \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" number color\n",
"9 2 yellow"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"for color_name, color_df in sample_df.groupby('color'):\n",
" print(color_name)\n",
" display(color_df)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pandas `read_csv`\n",
"\n",
"[CSV files](https://en.wikipedia.org/wiki/Comma-separated_values) are a very common and very good way to save data. Pandas has a good (and fast) reader for CSV files in the `read_csv()` function."
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_csv('iris.csv')"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" sepal_length \n",
" sepal_width \n",
" petal_length \n",
" petal_width \n",
" species \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 5.1 \n",
" 3.5 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 1 \n",
" 4.9 \n",
" 3.0 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 2 \n",
" 4.7 \n",
" 3.2 \n",
" 1.3 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 3 \n",
" 4.6 \n",
" 3.1 \n",
" 1.5 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 4 \n",
" 5.0 \n",
" 3.6 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 145 \n",
" 6.7 \n",
" 3.0 \n",
" 5.2 \n",
" 2.3 \n",
" virginica \n",
" \n",
" \n",
" 146 \n",
" 6.3 \n",
" 2.5 \n",
" 5.0 \n",
" 1.9 \n",
" virginica \n",
" \n",
" \n",
" 147 \n",
" 6.5 \n",
" 3.0 \n",
" 5.2 \n",
" 2.0 \n",
" virginica \n",
" \n",
" \n",
" 148 \n",
" 6.2 \n",
" 3.4 \n",
" 5.4 \n",
" 2.3 \n",
" virginica \n",
" \n",
" \n",
" 149 \n",
" 5.9 \n",
" 3.0 \n",
" 5.1 \n",
" 1.8 \n",
" virginica \n",
" \n",
" \n",
"
\n",
"
150 rows × 5 columns
\n",
"
"
],
"text/plain": [
" sepal_length sepal_width petal_length petal_width species\n",
"0 5.1 3.5 1.4 0.2 setosa\n",
"1 4.9 3.0 1.4 0.2 setosa\n",
"2 4.7 3.2 1.3 0.2 setosa\n",
"3 4.6 3.1 1.5 0.2 setosa\n",
"4 5.0 3.6 1.4 0.2 setosa\n",
".. ... ... ... ... ...\n",
"145 6.7 3.0 5.2 2.3 virginica\n",
"146 6.3 2.5 5.0 1.9 virginica\n",
"147 6.5 3.0 5.2 2.0 virginica\n",
"148 6.2 3.4 5.4 2.3 virginica\n",
"149 5.9 3.0 5.1 1.8 virginica\n",
"\n",
"[150 rows x 5 columns]"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" sepal_length \n",
" sepal_width \n",
" petal_length \n",
" petal_width \n",
" species \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 5.1 \n",
" 3.5 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 1 \n",
" 4.9 \n",
" 3.0 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 2 \n",
" 4.7 \n",
" 3.2 \n",
" 1.3 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 3 \n",
" 4.6 \n",
" 3.1 \n",
" 1.5 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 4 \n",
" 5.0 \n",
" 3.6 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" sepal_length sepal_width petal_length petal_width species\n",
"0 5.1 3.5 1.4 0.2 setosa\n",
"1 4.9 3.0 1.4 0.2 setosa\n",
"2 4.7 3.2 1.3 0.2 setosa\n",
"3 4.6 3.1 1.5 0.2 setosa\n",
"4 5.0 3.6 1.4 0.2 setosa"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['setosa', 'versicolor', 'virginica'], dtype=object)"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['species'].unique()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Conditions and selecting part of the data from a `DataFrame`.\n",
"\n",
"Let's consider an equality condition. Let's check every row to test if the 'color' column is equal to `'blue'`:"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" number \n",
" color \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 1 \n",
" blue \n",
" \n",
" \n",
" 1 \n",
" 2 \n",
" blue \n",
" \n",
" \n",
" 2 \n",
" 3 \n",
" red \n",
" \n",
" \n",
" 3 \n",
" 6 \n",
" red \n",
" \n",
" \n",
" 4 \n",
" 2 \n",
" red \n",
" \n",
" \n",
" 5 \n",
" 3 \n",
" blue \n",
" \n",
" \n",
" 6 \n",
" 2 \n",
" blue \n",
" \n",
" \n",
" 7 \n",
" 2 \n",
" red \n",
" \n",
" \n",
" 8 \n",
" 1 \n",
" green \n",
" \n",
" \n",
" 9 \n",
" 2 \n",
" yellow \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" number color\n",
"0 1 blue\n",
"1 2 blue\n",
"2 3 red\n",
"3 6 red\n",
"4 2 red\n",
"5 3 blue\n",
"6 2 blue\n",
"7 2 red\n",
"8 1 green\n",
"9 2 yellow"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sample_df"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 blue\n",
"1 blue\n",
"2 red\n",
"3 red\n",
"4 red\n",
"5 blue\n",
"6 blue\n",
"7 red\n",
"8 green\n",
"9 yellow\n",
"Name: color, dtype: object"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sample_df['color']"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 True\n",
"1 True\n",
"2 False\n",
"3 False\n",
"4 False\n",
"5 True\n",
"6 True\n",
"7 False\n",
"8 False\n",
"9 False\n",
"Name: color, dtype: bool"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sample_df['color']=='blue'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As usual, we can assign this result to a variable:"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [],
"source": [
"condition = sample_df['color']=='blue'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can see the type of this result is another `Series`"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"pandas.core.series.Series"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(condition)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"One very useful thing in Pandas is to create a new `DataFrame` based on a condition from an old one. Let's make a new `DataFrame` from only the rows with a blue color:"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" number \n",
" color \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 1 \n",
" blue \n",
" \n",
" \n",
" 1 \n",
" 2 \n",
" blue \n",
" \n",
" \n",
" 5 \n",
" 3 \n",
" blue \n",
" \n",
" \n",
" 6 \n",
" 2 \n",
" blue \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" number color\n",
"0 1 blue\n",
"1 2 blue\n",
"5 3 blue\n",
"6 2 blue"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"condition = sample_df['color']=='blue'\n",
"blue_sample_df = sample_df[ condition ]\n",
"display(blue_sample_df)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This could of course be written so:"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" number \n",
" color \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 1 \n",
" blue \n",
" \n",
" \n",
" 1 \n",
" 2 \n",
" blue \n",
" \n",
" \n",
" 5 \n",
" 3 \n",
" blue \n",
" \n",
" \n",
" 6 \n",
" 2 \n",
" blue \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" number color\n",
"0 1 blue\n",
"1 2 blue\n",
"5 3 blue\n",
"6 2 blue"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"blue_sample_df = sample_df[ sample_df['color']=='blue' ]\n",
"display(blue_sample_df)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## A key concept in Pandas is iterating over a dataframe, grouping by values in one (or more) columns\n",
"\n",
"This allows doing a lot of powerful datascience work which requires nothing more than storing your data in a well-organized format. This of course has other advantages as well. Let's have a look at our `groupby()` example again:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"=============== setosa ============\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" sepal_length \n",
" sepal_width \n",
" petal_length \n",
" petal_width \n",
" \n",
" \n",
" \n",
" \n",
" count \n",
" 50.00000 \n",
" 50.000000 \n",
" 50.000000 \n",
" 50.00000 \n",
" \n",
" \n",
" mean \n",
" 5.00600 \n",
" 3.418000 \n",
" 1.464000 \n",
" 0.24400 \n",
" \n",
" \n",
" std \n",
" 0.35249 \n",
" 0.381024 \n",
" 0.173511 \n",
" 0.10721 \n",
" \n",
" \n",
" min \n",
" 4.30000 \n",
" 2.300000 \n",
" 1.000000 \n",
" 0.10000 \n",
" \n",
" \n",
" 25% \n",
" 4.80000 \n",
" 3.125000 \n",
" 1.400000 \n",
" 0.20000 \n",
" \n",
" \n",
" 50% \n",
" 5.00000 \n",
" 3.400000 \n",
" 1.500000 \n",
" 0.20000 \n",
" \n",
" \n",
" 75% \n",
" 5.20000 \n",
" 3.675000 \n",
" 1.575000 \n",
" 0.30000 \n",
" \n",
" \n",
" max \n",
" 5.80000 \n",
" 4.400000 \n",
" 1.900000 \n",
" 0.60000 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" sepal_length sepal_width petal_length petal_width\n",
"count 50.00000 50.000000 50.000000 50.00000\n",
"mean 5.00600 3.418000 1.464000 0.24400\n",
"std 0.35249 0.381024 0.173511 0.10721\n",
"min 4.30000 2.300000 1.000000 0.10000\n",
"25% 4.80000 3.125000 1.400000 0.20000\n",
"50% 5.00000 3.400000 1.500000 0.20000\n",
"75% 5.20000 3.675000 1.575000 0.30000\n",
"max 5.80000 4.400000 1.900000 0.60000"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"=============== versicolor ============\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" sepal_length \n",
" sepal_width \n",
" petal_length \n",
" petal_width \n",
" \n",
" \n",
" \n",
" \n",
" count \n",
" 50.000000 \n",
" 50.000000 \n",
" 50.000000 \n",
" 50.000000 \n",
" \n",
" \n",
" mean \n",
" 5.936000 \n",
" 2.770000 \n",
" 4.260000 \n",
" 1.326000 \n",
" \n",
" \n",
" std \n",
" 0.516171 \n",
" 0.313798 \n",
" 0.469911 \n",
" 0.197753 \n",
" \n",
" \n",
" min \n",
" 4.900000 \n",
" 2.000000 \n",
" 3.000000 \n",
" 1.000000 \n",
" \n",
" \n",
" 25% \n",
" 5.600000 \n",
" 2.525000 \n",
" 4.000000 \n",
" 1.200000 \n",
" \n",
" \n",
" 50% \n",
" 5.900000 \n",
" 2.800000 \n",
" 4.350000 \n",
" 1.300000 \n",
" \n",
" \n",
" 75% \n",
" 6.300000 \n",
" 3.000000 \n",
" 4.600000 \n",
" 1.500000 \n",
" \n",
" \n",
" max \n",
" 7.000000 \n",
" 3.400000 \n",
" 5.100000 \n",
" 1.800000 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" sepal_length sepal_width petal_length petal_width\n",
"count 50.000000 50.000000 50.000000 50.000000\n",
"mean 5.936000 2.770000 4.260000 1.326000\n",
"std 0.516171 0.313798 0.469911 0.197753\n",
"min 4.900000 2.000000 3.000000 1.000000\n",
"25% 5.600000 2.525000 4.000000 1.200000\n",
"50% 5.900000 2.800000 4.350000 1.300000\n",
"75% 6.300000 3.000000 4.600000 1.500000\n",
"max 7.000000 3.400000 5.100000 1.800000"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"=============== virginica ============\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" sepal_length \n",
" sepal_width \n",
" petal_length \n",
" petal_width \n",
" \n",
" \n",
" \n",
" \n",
" count \n",
" 50.00000 \n",
" 50.000000 \n",
" 50.000000 \n",
" 50.00000 \n",
" \n",
" \n",
" mean \n",
" 6.58800 \n",
" 2.974000 \n",
" 5.552000 \n",
" 2.02600 \n",
" \n",
" \n",
" std \n",
" 0.63588 \n",
" 0.322497 \n",
" 0.551895 \n",
" 0.27465 \n",
" \n",
" \n",
" min \n",
" 4.90000 \n",
" 2.200000 \n",
" 4.500000 \n",
" 1.40000 \n",
" \n",
" \n",
" 25% \n",
" 6.22500 \n",
" 2.800000 \n",
" 5.100000 \n",
" 1.80000 \n",
" \n",
" \n",
" 50% \n",
" 6.50000 \n",
" 3.000000 \n",
" 5.550000 \n",
" 2.00000 \n",
" \n",
" \n",
" 75% \n",
" 6.90000 \n",
" 3.175000 \n",
" 5.875000 \n",
" 2.30000 \n",
" \n",
" \n",
" max \n",
" 7.90000 \n",
" 3.800000 \n",
" 6.900000 \n",
" 2.50000 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" sepal_length sepal_width petal_length petal_width\n",
"count 50.00000 50.000000 50.000000 50.00000\n",
"mean 6.58800 2.974000 5.552000 2.02600\n",
"std 0.63588 0.322497 0.551895 0.27465\n",
"min 4.90000 2.200000 4.500000 1.40000\n",
"25% 6.22500 2.800000 5.100000 1.80000\n",
"50% 6.50000 3.000000 5.550000 2.00000\n",
"75% 6.90000 3.175000 5.875000 2.30000\n",
"max 7.90000 3.800000 6.900000 2.50000"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"df = pd.read_csv('iris.csv')\n",
"for species, gdf in df.groupby('species'):\n",
" print(f\"=============== {species} ============\")\n",
" display(gdf.describe())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# matplotlib + pandas + ❤️ = seaborn\n",
"\n",
"[Seaborn](https://seaborn.pydata.org/) is \"a Python data visualization library based on matplotlib. It provides a high-level interface for drawing attractive and informative statistical graphics.\" It makes heavy use of pandas to make your life easy."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import seaborn as sns"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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oO5x9/Pb61vB6zKaGwAA6h53P7+9fojf6dOn9dJLL2nnzp2yWCxKT0/XmDFj1LRpU293CQAA4DOv5twUFBSobdu2mjVrlk6fPq1Tp05p1qxZatu2rQoKCvw9RgAAALd59bVUt27d1Lt3b82ZM0fh4eGSpMrKSo0bN05r167Vf//7X78P1J/4WgoAgLonoE8o3rdvn379619bGxtJCg8P18SJE7VvH09PBAAAweNVc/OjH/1IO3fuvGT5zp07lZWV5fZ+5syZox49eiguLk5xcXHKycnRe++953SbgoICZWdnq2HDhmrXrp3mzp3r6fABAICJeTWh+L777tP999+vvXv36sorr5QkbdiwQS+88IKeeuopbdu2zbpujx49HO6nVatWeuqpp9ShQwdJ0iuvvKJhw4Zp8+bNysjIuGT9AwcOaOjQobrrrru0aNEirV27VuPGjVPz5s110003efNXwfecJde6k2rrzvbVic7VSc6u0sZRv/gzXd5usrKkBuEX/n+uOklckvLe3alDp87KIukykpdhx8odRRfq5ORZVc/jsEgyJEWGhymhUQOVflfh0flRkh77x391vLTMul6YRYqKCCft3g+8mnMTFub8go/FYpFhGLJYLKqsrPRo302bNtUf//hH3XHHHZe8N3nyZC1fvtzmqtHYsWO1detWrV+/3u1jMOfGlrPkWkkuU2093d4Rkp3rL3+my7ubcl/94WRv+dx6nryMH7hbT9XcOT96uy8E+FbwAwcOeD0wRyorK/X3v/9d3377rXJycuyus379eg0aNMhm2eDBg/XSSy/p/PnzatCggd3tysrKVFb2Q3dcUlLiv4GbgNPkWju9b/V71f/gPN3ekZr7Rf3hbrq8O7Xhbsq9o8o0RB3iB+7WUzV3zo/e7gvu86q5ad26td8GsH37duXk5Oi7775TTEyMli1bpq5du9pdt6ioSMnJyTbLkpOTVVFRoa+//lqpqal2t8vLy9P06dP9NmazcZZc66g3uTiZ1pvtHSHxtn7yZxqyNyn33h4L5udNPblzfvRmX3CfVxOKJenVV19Vnz591KJFCx06dEiSNHPmTP3zn//0aD+dO3fWli1btGHDBt1zzz26/fbb9fnnnztc31IjVaz6W7Wayy82ZcoUFRcXW19HjhzxaIxm5yy51p1UW2+2d4TE2/rJn2nI3qTce3ssmJ83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N89ITU01li5dauzfv99YunSp0bRpU+Pll182DMMw/vOf/xiSjH//+99GYWGhcfLkScMwDOOZZ54x4uLijMWLFxu7du0yHn74YaNBgwbGF198YRiGYfzxj3800tLSjA8//NA4ePCg8dFHHxmvv/66dUzPPvus8cEHHxj79+833n//faNz587GPffcU/u/HPjNyZMnjcjISOPf//63ddmpU6eMyMhIY+XKlcaKFSuMuLg44+WXXzb27dtnrFq1ymjTpo3xxBNPWNeXZCQlJRkvvfSSsW/fPuPgwYPG+PHjjaysLOPTTz81Dhw4YKxevdpYvny5YRiGceDAAUOSsXnzZsMwDOPLL780mjZtatx4443Gp59+auzevdv461//auzatcswDNd1a29/jRo1MsaNG2fs3LnTWLZsmdGsWTPj8ccft465f//+RkxMjDFp0iRj165dxs6dOwP4W4avXNXp448/bmRmZlrfu/32242YmBhj1KhRxn//+19j+/btRklJidG0aVNj5MiRxo4dO4x3333X6NSpk03trFmzxpBknD592jAMw1iwYIHRoEED4+qrrzY+/fRTY+PGjUZ6erpx22232Rxr2LBh1p8ffvhho0mTJsbLL79s7N271/joo4+M+fPnW9+fMWOGsXbtWuPAgQPG8uXLjeTkZOP3v/99QH5vdQnNTT2xceNGQ5Jx8ODBS95LS0uzaToM48I/mJycHMMwLj3ZV2vRooXxu9/9zmbZ5ZdfbowbN84wDMO49957jZ/85CdGVVWVW2N84403jMTERHf/SghR119/vfHLX/7S+vOLL75opKSkGBUVFUbfvn2N//u//7NZ/9VXXzVSU1OtP0syHnjgAZt1rrvuOmPMmDF2j1ezPqdMmWK0bdvWKC8vt7u+q7qtub+pU6canTt3tqnjF154wYiJiTEqKysNw7jQ3GRlZTn6lSAEOatTe81NcnKyUVZWZl02Z84cIzEx0Th37px12fz58102N5KMvXv3Wrd54YUXjOTkZJtjVTc3JSUlRlRUlE0z48of/vAHIzs72+31zYqvpeqJzMxM5ebmqnv37vr5z3+u+fPn6/Tp0zpx4oSOHDmiO+64w/o9c0xMjJ588knrZXx7SkpK9NVXX6lPnz42y/v06aOdO3dKunB5dcuWLercubPuu+8+rVq1ymbdNWvW6JprrlHLli0VGxur//3f/9XJkyetX5WhbhoxYoSWLl2qsrIySdJrr72mW2+9VeHh4dq4caN++9vf2tTaXXfdpcLCQp09e9a6j169etns85577tGSJUuUlZWlhx9+WOvWrXN4/C1btqhv37525+m4U7c17dy5Uzk5OTYTQvv06aMzZ87oyy+/dDhmhDZndWpP9+7dbebZ7N69Wz169FDDhg2ty6644gqXx23UqJHat29v/Tk1NVXHjx+3u+7OnTtVVlam3Nxch/t78803ddVVVyklJUUxMTF67LHHdPjwYZfjMDuam3oiPDxcq1ev1nvvvaeuXbvq+eefV+fOnbV//35J0vz587Vlyxbr67///a82bNjgcr817wAwDMO67Ec/+pEOHDigGTNm6Ny5c/rFL36hm2++WZJ06NAhDR06VN26ddPSpUu1ceNGvfDCC5LE98V13HXXXaeqqiq98847OnLkiD766CONHDlS0oX5A9OnT7epte3bt2vPnj02HxKNGze22eeQIUN06NAhPfDAA/rqq6+Um5urhx56yO7xo6OjXY7RWd3WZO894/ubTC9eXnPMCG3O6tSemv99ndWFMzWbbovF4nA7V7W8YcMG3XrrrRoyZIj+9a9/afPmzXrkkUdUXl7uchxmx91S9YjFYlGfPn3Up08fTZs2Ta1bt9batWvVsmVL7d+/XyNGjLC7XfX/rVRWVlqXxcXFqUWLFvr444/Vr18/6/J169bZ/N9LXFycbrnlFt1yyy26+eab9dOf/lSnTp3SZ599poqKCv3pT39SWNiFHvuNN94IxF8btSw6Olo33nijXnvtNe3du1edOnVSdna2pAsN7+7du9WhQweP99u8eXONHj1ao0ePVt++fTVp0iQ9/fTTl6zXo0cPvfLKK3bvsnK3bi/WtWtXLV261ObDbN26dYqNjVXLli09/nsgNDirU3d06dJFr732msrKyqyBmJ999plfx9ixY0dFR0fr/fff15133nnJ+2vXrlXr1q31yCOPWJcdOnTIr2Ooq2hu6olPPvlE77//vgYNGqSkpCR98sknOnHihNLT0/XEE0/ovvvuU1xcnIYMGaKysjJ99tlnOn36tCZOnKikpCRFR0drxYoVatWqlRo2bKj4+HhNmjRJjz/+uNq3b6+srCwtWLBAW7Zs0WuvvSZJevbZZ5WamqqsrCyFhYXp73//u1JSUpSQkKD27duroqJCzz//vK677jqtXbtWc+fODfJvCf4yYsQIXXfdddqxY4fN/w1PmzZNP/vZz5SWlqaf//znCgsL07Zt27R9+3Y9+eSTDvc3bdo0ZWdnKyMjQ2VlZfrXv/6l9PR0u+tOmDBBzz//vG699VZNmTJF8fHx2rBhg6644gp17tzZZd3WNG7cOM2cOVP33nuvJkyYoN27d+vxxx/XxIkTrY056iZHdeqO2267TY888oh+9atf6Te/+Y0OHz5sbbbdfaaNKw0bNtTkyZP18MMPKzIyUn369NGJEye0Y8cO3XHHHerQoYMOHz6sJUuW6PLLL9c777yjZcuW+eXYdV7wpvugNn3++efG4MGDjebNmxtRUVFGp06djOeff976/muvvWZkZWUZkZGRRpMmTYx+/foZb731lvX9+fPnG2lpaUZYWJjRv39/wzAMo7Ky0pg+fbrRsmVLo0GDBkZmZqbx3nvvWbeZN2+ekZWVZTRu3NiIi4szcnNzjU2bNlnff+aZZ4zU1FQjOjraGDx4sLFw4UKbyXeouyoqKozU1FRDkrFv3z6b91asWGH07t3biI6ONuLi4owrrrjCmDdvnvV9ScayZctstpkxY4aRnp5uREdHG02bNjWGDRtm7N+/3zAM+xPet27dagwaNMho1KiRERsba/Tt29c6Dld1a29/+fn5xuWXX25ERkYaKSkpxuTJk43z589b3+/fv79x//33+/hbQ21zVKf2JhRffAdTtbVr1xo9evQwIiMjjezsbOP11183JFnvzLM3oTg+Pt5mH8uWLTMu/iiueazKykrjySefNFq3bm00aNDAuOyyy2wm5U+aNMlITEw0YmJijFtuucV49tlnLzlGfcQTigEA8IPXXntNY8aMUXFxsVtzvxA4fC0FAIAXFi5cqHbt2qlly5baunWrJk+erF/84hc0NiGA5gYAAC8UFRVp2rRpKioqUmpqqn7+85/bPD0YwcPXUgAAwFSY6g8AAEyF5gYAAJgKzQ0AADAVmhsAAGAqNDcAAMBUaG4A1BujR4/W8OHDgz0MAAHGreAA6o3i4mIZhqGEhIRgDwVAANHcAAAAU+FrKQC16s0331T37t0VHR2txMREXX311fr222+tXxlNnz5dSUlJiouL0913363y8nLrtoZh6A9/+IPatWun6OhoZWZm6s0337TZ/44dO3TttdcqLi5OsbGx6tu3r/bt2yfp0q+lXO3v9OnTGjFihJo3b67o6Gh17NhRCxYsCOwvCIDPiF8AUGsKCwv1P//zP/rDH/6gG264QaWlpfroo49UfQH5/fffV8OGDbVmzRodPHhQY8aMUbNmzayPtH/00Uf11ltvac6cOerYsaM+/PBDjRw5Us2bN1f//v119OhR9evXTwMGDNAHH3yguLg4rV27VhUVFXbH42p/jz32mD7//HO99957atasmfbu3atz587V2u8LgHf4WgpArdm0aZOys7N18OBBtW7d2ua90aNH6+2339aRI0fUqFEjSdLcuXM1adIkFRcX69y5c2rWrJk++OAD5eTkWLe78847dfbsWb3++uuaOnWqlixZot27d6tBgwaXHH/06NH65ptv9I9//EPffvuty/1df/31atasmf76178G6DcCIBC4cgOg1mRmZio3N1fdu3fX4MGDNWjQIN18881q0qSJ9f3qxkaScnJydObMGR05ckTHjx/Xd999p2uuucZmn+Xl5erZs6ckacuWLerbt6/dxqamzz//3OX+7rnnHt10003atGmTBg0apOHDh6t3794+/Q4ABB7NDYBaEx4ertWrV2vdunVatWqVnn/+eT3yyCP65JNPnG5nsVhUVVUlSXrnnXfUsmVLm/ejoqIkSdHR0W6PxZ39DRkyRIcOHdI777yjf//738rNzdX48eP19NNPu30cALWP5gZArbJYLOrTp4/69OmjadOmqXXr1lq2bJkkaevWrTp37py1SdmwYYNiYmLUqlUrNWnSRFFRUTp8+LD69+9vd989evTQK6+8ovPnz7u8etO1a1eX+5Ok5s2ba/To0Ro9erT69u2rSZMm0dwAIY7mBkCt+eSTT/T+++9r0KBBSkpK0ieffKITJ04oPT1d27ZtU3l5ue644w49+uijOnTokB5//HFNmDBBYWFhio2N1UMPPaQHH3xQVVVVuuqqq1RSUqJ169YpJiZGt99+uyZMmKDnn39et956q6ZMmaL4+Hht2LBBV1xxhTp37mwzFnf2N23aNGVnZysjI0NlZWX617/+pfT09CD99gC4i+YGQK2Ji4vThx9+qJkzZ6qkpEStW7fWn/70Jw0ZMkR/+9vflJubq44dO6pfv34qKyvTrbfeqieeeMK6/YwZM5SUlKS8vDzt379fCQkJ+tGPfqSpU6dKkhITE/XBBx9o0qRJ6t+/v8LDw5WVlaU+ffrYHY+r/UVGRmrKlCk6ePCgoqOj1bdvXy1ZsiTgvycAvuFuKQAh4eI7mQDAFzzEDwAAmArNDQAAMBW+lgIAAKbClRsAAGAqNDcAAMBUaG4AAICp0NwAAABTobkBAACmQnMDAABMheYGAACYCs0NAAAwlf8HrYxMqc0tNs8AAAAASUVORK5CYII=",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.stripplot(x=\"species\", y=\"sepal_width\", data=df);"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGzCAYAAADT4Tb9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA/rElEQVR4nO3deXhU5d3/8c8kISEhGwSyAJF9CVuCQWtAticKBatYta2P4CNUqWwu5REpqCDVPtHWKmIFhFoRUagVaWmVxSqJymJlpwjIDmICCJiAYALJ+f1BM79MmOVkMpOZOXm/rivXRc7c556b+OXk65lzzsdmGIYhAAAAiwgL9AIAAAB8ieYGAABYCs0NAACwFJobAABgKTQ3AADAUmhuAACApdDcAAAAS6G5AQAAlkJzAwAALIXmBgAAWEpEoBdQKS8vT1OnTtVDDz2kmTNnOh2Tn5+vgQMHXrF9165d6ty5s+n3qqio0Ndff624uDjZbDZvlwwAAOqQYRg6e/asmjdvrrAw1+dngqK5+fzzzzVv3jz16NHD1Pg9e/YoPj7e/n2zZs1q9H5ff/210tPTa7QPAAAIDkePHlXLli1dvh7w5ubcuXMaPny45s+fr6efftrUPsnJyUpMTPT6PePi4iRd/uFUbZIAAEDwKikpUXp6uv33uCsBb27Gjx+vm266STfccIPp5qZnz576/vvv1aVLFz3++ONOP6qqqrS0VKWlpfbvz549K0mKj4+nuQEAIMR4uqQkoM3NkiVLtHnzZn3++eemxqelpWnevHnKzs5WaWmp3njjDeXm5io/P1/9+vVzuV9eXp5mzJjhq2UDAIAgZjMMwwjEGx89elS9evXS6tWrlZmZKUkaMGCAsrKyXF5Q7MzNN98sm82m5cuXuxxT/cxN5Wmt4uJiztwAABAiSkpKlJCQ4PH3d8BuBd+0aZNOnDih7OxsRUREKCIiQgUFBZo1a5YiIiJUXl5uap7rrrtOe/fudTsmKirK/hEUH0UBAGBtAftYKjc3Vzt27HDYNmrUKHXu3FmTJ09WeHi4qXm2bNmitLQ0fywRAACEoIA1N3FxcerWrZvDtkaNGikpKcm+fcqUKTp27JgWLlwoSZo5c6Zat26trl27qqysTIsWLdLSpUu1dOnSOl8/AAAITgG/W8qdwsJCHTlyxP59WVmZHnnkER07dkzR0dHq2rWr3nvvPQ0dOjSAqwQAAMEkYBcUB5LZC5IAAEDwCPoLigEAAPyB5gYAAFgKzQ0AALAUmhsAAGApQX23FOrOqp1Fmr1mn748fk4dU2I1bmB7De6aGuhlAQBQY5y5gVbtLNL9b2zStq+KdeFiubZ9VawxizZp1c6iQC8NAIAao7mBZq/Zd8U2w5Bm5+8PwGoAAKgdmhvoy+PnnG7fe/xsHa8EAIDao7mBOqbEOt3eISWujlcCAEDt0dxA4wa2l83muM1mk8YPaBeYBQEAUAs0N9DgrqmaOyJbmemJiokMV2Z6ol4Zka1B3C0FAAhB3AoOSZcbHG79BgBYAWduAACApdDcAAAAS6G5AQAAlkJzAwAALIXmBgAAWArNDQAAsBSaGwAAYCk0NwAAwFJobgAAgKXQ3AAAAEuhuQEAAJZCcwMAACyF5gYAAFgKzQ0AALAUmhsAAGApNDcAAMBSaG4AAICl0NwAAABLobkBAACWQnMDAAAsJSLQC4A1rdpZpNlr9unL4+fUMSVW4wa21+CuqYFeFgCgHuDMDXxu1c4i3f/GJm37qlgXLpZr21fFGrNok1btLAr00gAA9QDNDXxu9pp9V2wzDGl2/v4ArAYAUN/Q3MDnvjx+zun2vcfP1vFKAAD1Ec0NfK5jSqzT7R1S4up4JQCA+ojmBj43bmB72WyO22w2afyAdoFZEACgXqG5gc8N7pqquSOylZmeqJjIcGWmJ+qVEdkaxN1SAIA6wK3g8IvBXVO59RsAEBCcuQEAAJZCcwMAACyF5gYAAFgKzQ0AALAUmhsAAGApNDcAAMBSuBUcPkMSOAAgGHDmBj5BEjgAIFjQ3MAnSAIHAAQLmhv4BEngAIBgQXMDnyAJHAAQLGhu4BMkgQMAggXNDXyCJHAAQLDgVnD4DEngAIBgwJkbAABgKTQ3AADAUmhuAACApdDcAAAAS6G5AQAAlhI0zU1eXp5sNpsefvhht+MKCgqUnZ2thg0bqm3btpo7d27dLBAAAISEoLgV/PPPP9e8efPUo0cPt+MOHjyooUOHavTo0Vq0aJHWrl2rcePGqVmzZrr99tvraLXwFqnhAIC6EPAzN+fOndPw4cM1f/58NW7c2O3YuXPn6qqrrtLMmTOVkZGh++67Tz//+c/13HPP1dFq4S1SwwEAdSXgzc348eN100036YYbbvA4dv369Ro0aJDDtsGDB2vjxo26ePGiy/1KS0tVUlLi8IW6RWo4AKCuBLS5WbJkiTZv3qy8vDxT44uKipSSkuKwLSUlRZcuXdI333zjcr+8vDwlJCTYv9LT02u1btQcqeEAgLoSsObm6NGjeuihh7Ro0SI1bNjQ9H62aumMhmE43V7VlClTVFxcbP86evSod4uG10gNBwDUlYA1N5s2bdKJEyeUnZ2tiIgIRUREqKCgQLNmzVJERITKy8uv2Cc1NVVFRY7XaJw4cUIRERFKSkpy+V5RUVGKj493+ELdIjUcAFBXAna3VG5urnbs2OGwbdSoUercubMmT56s8PDwK/bJycnR3//+d4dtq1evVq9evdSgQQO/rhe1U5kaPjt/v/YeP6sOKXEaP6AdqeEAAJ8LWHMTFxenbt26OWxr1KiRkpKS7NunTJmiY8eOaeHChZKkMWPG6A9/+IMmTpyo0aNHa/369Xr11Ve1ePHiOl8/ao7UcABAXQj43VLuFBYW6siRI/bv27Rpo/fff1/5+fnKysrSU089pVmzZvGMGwAAYGczKq/IrUdKSkqUkJCg4uJirr8BACBEmP39HdRnbgAAAGqK5gYAAFgKzQ0AALAUmhsAAGApQZEKjtBgJtWb5G8AQKBxtxR3S5lSmepdlc0mzR2RbW9ezIwBAMBb3C0FnzKT6k3yNwAgGNDcwBQzqd4kfwMAggHNDUwxk+pN8jcAIBjQ3MAUM6neJH8DAIIBzQ1MqUz1zkxPVExkuDLTE/XKiGyHVG8zYwAA8DfuluJuKQAAQgJ3SwEAgHqJ5gYAAFgKzQ0AALAUmhsAAGApNDcAAMBSaG4AAIClkApej1UmeO8qPKvwMJvKKwxlpMX5LMnbXUI46eEAQoG3xyqOcYHFc27q6XNunCV4V/JFkre7hHBJpIcDCHrujmPujlXe7gfPeM4N3HKW4F3JF0ne7hLCSQ8HEAq8PVZxjAs8Ppaqp1wleFeqbZK3u4RwV+cKSQ8HEEzcHcf8sR98hzM39ZSrBO9KtU3ydpcQTno4gFDg7bGKY1zg0dzUU84SvCv5IsnbXUI46eEAQoG3xyqOcYHHBcX19IJi6T9X8+fv1+7CEoWH2XSpwlBGWrzGD2jnkyTvyvn3Hj+rDilxDvO6ew0AgoW3xyqOcf5h9vc3zU09bm4AAAgl3C0FAADqJZobAABgKTQ3AADAUmhuAACApdDcAAAAS6G5AQAAlkL8AkyrmnKbEh8lSTpeUkriNwAgqPCcG55zY4q7FHGJxG8AgP+Z/f3NmRuY4i5FXKqSeOukV658jeYGAFAXaG5giqcUcYnEbwBAcOCCYpjiKUVcIvEbABAcaG5girsUcYnEbwBA8KC5gSmDu6Zq7ohsZaYnKiYyXK2TYtS6aSPFRIYrMz1Rr4zI1qCuqVeMq/oaAAB1gbuluFsKAICQQCo4AACol2huAACApdDcAAAAS6G5AQAAlkJzAwAALIXmBgAAWArxC/CK2YRwAIA5VY+rHEtrh+fc8JybGjObEM4/SgAwx9lxlWPplXjODfzGdEI4AMAUZ8dVjqXeo7lBjZlNCAcAmOPquMqx1Ds0N6gxswnhAABzXB1XOZZ6h+YGNWY2IRwAYI6z4yrHUu/R3KDGnCaEJ8WQAg4AXqp+XOVYWjvcLcXdUgAAhATulgIAAPUSzQ0AALAUmhsAAGApNDcAAMBSaG4AAIClBLS5mTNnjnr06KH4+HjFx8crJydHK1ascDk+Pz9fNpvtiq/du3fX4aoBAEAwC2gqeMuWLfXMM8+offv2kqTXX39dw4YN05YtW9S1a1eX++3Zs8fhFrBmzZr5fa31waqdRcp7f5cOnzovQ5JNUqukGA3plqZ1+79xm1T77IrdWrDukC5cLFd0g3CN7N1ak4d0DsjfAwBQvwXdc26aNGmi3/3ud7r33nuveC0/P18DBw7UmTNnlJiY6PV78JybK3lK+q6qelLtsyt2a07BleFuY/u3o8EBAPhMyD3npry8XEuWLNF3332nnJwct2N79uyptLQ05ebmas2aNR7nLi0tVUlJicMXHHlK+q6qelLtgnWHnI57fb3z7QAA+FPAm5sdO3YoNjZWUVFRGjNmjJYtW6YuXbo4HZuWlqZ58+Zp6dKlevfdd9WpUyfl5ubq448/dvseeXl5SkhIsH+lp6f7468S0swkfVdVNan2wsVyp2POlznfDgCAPwX8Y6mysjIdOXJE3377rZYuXao//vGPKigocNngVHfzzTfLZrNp+fLlLseUlpaqtLTU/n1JSYnS09P5WKqKYX/4VNu+KjY9PjM9UX8b30eSlPHESqcNTkxkuL749Q99tkYAQP0WMh9LRUZGqn379urVq5fy8vKUmZmpF1980fT+1113nfbu3et2TFRUlP2OrMovOBo3sL3cBH07qJ5UO7J3a6fjXG0HAMCfAt7cVGcYhsNZFk+2bNmitLQ0P66ofhjcNVVz785W66QYe5Njk9Q6KUZj+7dzm1Q7eUhnje3fTjGR4ZIun7EZN6CdHv0hFxMDAOqe17eCV1RUaN++fTpx4oQqKiocXuvXr5+pOaZOnaohQ4YoPT1dZ8+e1ZIlS5Sfn6+VK1dKkqZMmaJjx45p4cKFkqSZM2eqdevW6tq1q8rKyrRo0SItXbpUS5cu9favgSoGd0294hZvsyYP6cydUQCAoOBVc7NhwwbdddddOnz4sKpfsmOz2VRebu5C0uPHj+vuu+9WYWGhEhIS1KNHD61cuVI33nijJKmwsFBHjhyxjy8rK9MjjzyiY8eOKTo6Wl27dtV7772noUOHevPXAAAAFuTVBcVZWVnq2LGjZsyYobS0NNlsjldrJCQk+GyB/sBzbgAACD1mf397deZm7969euedd+xPFgYAAAgWXl1Q/IMf/ED79pl/6BsAAEBdMX3mZvv27fY/P/DAA/rf//1fFRUVqXv37mrQoIHD2B49evhuhQAAADVg+pqbsLAw2Wy2Ky4gtk/0n9dqckFxoHDNDQAAocfn19wcPHjQJwtDcFi1s0iT/rJNJd9fsm8Ls0ndWyQ4Tf2u3Cfv/V06cvq8DENqEH75U82MtDiHfVbtLNLsNfvcpogDzlA7CEZV6zIlPkqSdLyklBoNYl7dLfXxxx+rd+/eiohw7I0uXbqkdevWmX7OTaDU9zM3nhLAq6d+12QfSVeMczYfUJ2zGqN2EGjeHC/hP36NXxg4cKBOnz59xfbi4mINHDjQmylRhzwlgFdP/a7JPs7GOZsPqI7aQTDy5niJwPPqVvDKa2uqO3XqlBo1alTrRcG/zCSAV039rsk+rs4DVp8PqM5VjVE7CCRvjpcIvBo1N7fddpukyxcPjxw5UlFRUfbXysvLtX37dvXu3du3K4TPdUyJ9ZgA3iElzrt9DMPpuOrzAdW5qjFqB4HkzfESgVejj6USEhKUkJAgwzAUFxdn/z4hIUGpqan6xS9+oUWLFvlrrfCRcQPdP3yxeup35T7uUsMr9xk3sL2qn9RzNh9QHbWDYOSsLquiRoOTVxcUz5gxQ4888kjIfgRV3y8oltzcLdUyUeMHtHNI/a66j8PdUhFhsknqnBbvsM+qnUWanb9fe4+fVYeUOJfzAdVROwhGVesyOS5Kstl0ouR7ajQAzP7+9qq5CXU0NwAAhB6fP+emZ8+eTi8idmbz5s1mpwUAAPAp083Nrbfeav/z999/r9mzZ6tLly7KycmRJG3YsEE7d+7UuHHjfL5IAAAAs0w3N9OnT7f/+b777tODDz6op5566ooxR48e9d3qAAAAasira24SEhK0ceNGdejQwWH73r171atXLxUXu79tLtC45gYAgNDj1ycUR0dH69NPP71i+6effqqGDRt6MyUAAIBPePWE4ocfflhjx47Vpk2bdN1110m6fM3Nn/70J02bNs2nCwQAAKgJr5qbX/3qV2rbtq1efPFFvfXWW5KkjIwMLViwQD/96U99ukAEJ7PpzaQ8IxCoO/iDu7qqbc1Rs77Fc2645qbGzKY3k/KMQKDu4A/u6kpSrWqOmjXPr9fcoH4zm95MyjMCgbqDP7irq9rWHDXre6Y/lmrSpIm+/PJLNW3aVI0bN3b7QL/Tp0/7ZHEITmbTm0l5RiBQd/AHd3Xl6vMPszVHzfqe6ebmhRdeUFxcnP3PZp9WDOsxm95MyjMCgbqDP7itK8OoVc1Rs75nurm555577H8eOXKkP9aCEDFuYHuNWbTJ4f9WXCWJmxkH+BJ1B39wV1eGVKuao2Z9z6sLiocPH64BAwaof//+6tixoz/W5VdcUFx7ZtObSXlGIFB38Ad3dVXbmqNmzfFrKvj999+vgoICffnll0pNTVX//v3Vv39/DRgwQJ07d67VwusCzQ0AAKHHr81NpaKiIuXn5ys/P9/e7CQnJ6uwsNDbKesEzQ0AAKGnTm4Fj4uLU+PGjdW4cWMlJiYqIiJCqamcRgMAAIHjVXMzefJkXXfddWratKkef/xxlZWVacqUKTp+/Li2bNni6zUCAACY5tXHUmFhYWrWrJl++ctfatiwYcrIyPDH2vyGj6UAAAg9Zn9/e5UttWXLFhUUFCg/P1+///3vFR4ebr+geMCAASHX7AAAAOvwSbbUtm3bNHPmTC1atEgVFRUqLy/3xdr8hjM3AACEHr+euZEun72pvFPqk08+UUlJibKysjRw4EBvp0QAuUqkXbWzSHnv79KR0+dlSGrVJEZThmZ4DHOrnG9X4VmFh9lUXmEoIy2OpFvUmq/Sk6vP07tdU63b/w2pzHBQtU5S4qP0XdklfXOuTDZJV5k8Hrqaz12dkRJeO16duWncuLHOnTunzMxM+0dR/fr1C5mzIJy5ceQqkXZMv3aaU+A8uO2Vu12n1Tqbr+q8JN3CW75KT3ZXo7WZF9Ziqk4kzXVzPPQ0n7M6IyXcNb/eCv7GG2/o1KlT2rhxo5577jn96Ec/cvomX331lSoqKrx5C9QhV4m0C9Yfcr2Pm7RaZ/NVnZekW3jLV+nJ7mq0NvPCWkzViXyf/k1KeO151dy4amaq69Kliw4dOuTNW6AOuUqkvVDm+topd2m1ruYzsy/gjq/Skz3VqLfzwlp8XSdm65eU8Nqr1UP8PPHBtcqoAx1TYp1uj44Md7mPu7RaV/OZ2Rdwx1Vt1bSmPNWot/PCWnxdJ2br11d1Xp/5tblBaBg3sL1sNsdtNps0Mqe1bM53cZtW62y+qvOSdAtvuarVmtaUuxqtzbywFlN1opqlf5upX1/VeX3mk1vBXYmLi9O2bdvUtm1bf72FV7ig+EquEmmr3i0lSVclNdLUIZ09ptVWzrersEQR/7lbqnNaPEm3qDVfpSdXn6d3uySt23+KVGY4qFonyXGX75Y6da5M0uW7paYOzfBL+jcp4c7VSXCmJzQ3AADAV+okONMTm6fzeQAAAD7GBcUAAMBSvH5CsRlffPGFmjdv7s+3AAAAcGC6ubnttttMT/ruu+9KktLT02u+IgAAgFow3dwkJCT4cx0AAAA+Ybq5ee211/y5DgAAAJ/w6zU3CD2ekmjdvV49QbxpbKQaRUboeEkpqbaolZrUZUp8lCRRd6g1bxO80xKiVfDlSV24WK7oBuEa2bu1Jg/pHIC/Qf3l9XNu3nnnHb399ts6cuSIysrKHF7bvHmzTxbnLzznxjlPSbTuXpdEyjL8wpu6dDUWMKs2Cd7OjO3fjgbHB/z6nJtZs2Zp1KhRSk5O1pYtW3TttdcqKSlJBw4c0JAhQ7xeNALLUxKtu9dJWYa/eFOXrsYCZtUmwduZ19cf8sWyYJJXzc3s2bM1b948/eEPf1BkZKQeffRRffDBB3rwwQdVXFzs6zWijnhKonX3OinL8Bdv69LZWMCs2iZ4V3e+rLzWa4J5XjU3R44cUe/evSVJ0dHROnv28n/su+++W4sXL/bd6lCnPCXRunudlGX4i7d16WwsYFZtE7yri4kMr/WaYJ5XzU1qaqpOnTolSWrVqpU2bNggSTp48CBPJQ5hnpJo3b0+bmB7lwnizuYCzPKmLl2NBcyqTYK3MyN7t/bd4uCRVxcU33fffUpPT9f06dM1d+5cTZw4UX369NHGjRt122236dVXX/XHWn2GC4pd85RE6+716gniTWMjFRMZoRNnS0m1Ra3UpC6T46Ikm00nSr6n7lAr3iZ4p8U31Md7T+p8WbliIi/fLfXoD7mY2Bf8mgpeUVGhiooKRURcvpP87bff1qeffqr27dtrzJgxioyM9H7ldYDmBgCA0OPX5ibU0dwAABB6zP7+9vohfmfOnNGrr76qXbt2yWazKSMjQ6NGjVKTJk28nRIAAKDWvLqguKCgQG3atNGsWbN05swZnT59WrNmzVKbNm1UUFDg6zUCAACY5tXHUt26dVPv3r01Z84chYdfvr2tvLxc48aN09q1a/Xvf//b5wv1JT6WAgAg9Pj1CcX79+/X//7v/9obG0kKDw/XxIkTtX8/TwIFAACB41Vzc/XVV2vXrl1XbN+1a5eysrJMzzNnzhz16NFD8fHxio+PV05OjlasWOF2n4KCAmVnZ6thw4Zq27at5s6dW9PlAwAAC/PqguIHH3xQDz30kPbt26frrrtOkrRhwwa9/PLLeuaZZ7R9+3b72B49ericp2XLlnrmmWfUvn17SdLrr7+uYcOGacuWLeratesV4w8ePKihQ4dq9OjRWrRokdauXatx48apWbNmuv322735q8CDZ1fs1oJ1hxzSbbOuStTsNfu0q/CswsNsKq8w1DyxoSRzScxmk3aBSpU1U7XmMtLi7LVTPZG+VZMYTRma4bYG897fpcOnLo+3SWqVFKMh3dK0bv831CbsnB2vJDmtx97tmjrUT+92TbXi34U6fPq8bJKaxkYpJjJcX3/7/RV1XDnnzq9LVG4YMozLDw0Mt9nUtXk8tVhDXl1zExbm/oSPzWaTYRiy2WwqL69ZnkaTJk30u9/9Tvfee+8Vr02ePFnLly93OGs0ZswYbdu2TevXrzf9HlxzY86zK3ZrToF3HzO6SmI2m7QLVHKXumyzSWP6tXNZp6/cba4GXaE267ea1Iq/UYuX+fVW8IMHD3q9MFfKy8v1l7/8Rd99951ycnKcjlm/fr0GDRrksG3w4MF69dVXdfHiRTVo0MDpfqWlpSotLbV/X1JS4ruFW9iCdYe83rcyPbf6P0R3Sbv1/R8tnHOXumwY0gI3actma9Dd/NRm/VWTWvE3arFmvGpuWrVq5bMF7NixQzk5Ofr+++8VGxurZcuWqUuXLk7HFhUVKSUlxWFbSkqKLl26pG+++UZpaWlO98vLy9OMGTN8tub64sLF2qXYOktiNpu0C1TylLp8wU3ack1qsCZzoH6oaa34G7VonlcXFEvSG2+8oT59+qh58+Y6fPiwJGnmzJn629/+VqN5OnXqpK1bt2rDhg0aO3as7rnnHn3xxRcux9uqJZRVfqpWfXtVU6ZMUXFxsf3r6NGjNVpjfRXdoHYpts6SmM0m7QKVPKUuR7tJW65JDdZkDtQPNa0Vf6MWzfOquZkzZ44mTpyooUOH6ttvv7VfV5OYmKiZM2fWaK7IyEi1b99evXr1Ul5enjIzM/Xiiy86HZuamqqioiKHbSdOnFBERISSkpJcvkdUVJT9jqzKL3hWmxRbV0nMZpN2gUruUpdtNmlkTmuXifQua9Dke1Ob9Zur2jNbPzXhaU5qsWa8am5eeuklzZ8/X4899pjDs2569eqlHTt21GpBhmE4XB9TVU5Ojj744AOHbatXr1avXr1cXm8D700e0llj+7dTzH/+zzgmMlzjBrTTK3dnKzM9UVERYYqJDFdkRJhaJ8WodVKMYiLDlZmeqFdGZDtNzx3cNVVzR1ze39NYQHKsmcj/1FxURJi9diYP6ay5d2erdVKMwmxSmE1q3bSR5t3tpgb/M77yF4pNUuukGI0d0I7ahJ2z49W8u7M118kxMDM98Yr6Gdu/nUNdJsdFqXXTRlfUcdU5I8JsCvtPYYbZpIgwG7XoBa/uloqOjtbu3bvVqlUrxcXFadu2bWrbtq327t2rHj166MKFC6bmmTp1qoYMGaL09HSdPXtWS5Ys0TPPPKOVK1fqxhtv1JQpU3Ts2DEtXLhQ0uULmbt166b7779fo0eP1vr16zVmzBgtXry4RreCc7cUAAChx693S7Vp00Zbt2694sLiFStWuLwY2Jnjx4/r7rvvVmFhoRISEtSjRw97YyNJhYWFOnLkiMP7vv/++/rlL3+pl19+Wc2bN9esWbN4xg0AALDzqrmZNGmSxo8fr++//16GYehf//qXFi9erLy8PP3xj380Pc+rr77q9vUFCxZcsa1///7avHlzTZcMAADqCa+am1GjRunSpUt69NFHdf78ed11111q2bKlXnzxRd15552+XiMAAIBpXjU3Fy5c0PDhwzV69Gh98803OnDggNauXauWLVv6en0AAAA14tXdUsOGDbNf5BsREaFbbrlFzz//vG699VbNmTPHpwsEAACoCa+am82bN6tv376SpHfeeUcpKSk6fPiwFi5cqFmzZvl0gQAAADXh1cdS58+fV1zc5Sclrl69WrfddpvCwsJ03XXX2Z9WjNBBSjdCiad6rUz8PnTqvH1bZHiY7r2+jSYP6XzFfM+uuDL53tk4wNfs6fT/SQ2/ykOaPczz6sxN+/bt9de//lVHjx7VqlWr7GGWJ06c4LkxIaYy9XbbV8W6cLFc274q1phFm7RqZ5HnnYE65qleK1+v2thIUll5heYU7NezK3Y7bH92xeXk+8octQsXy52OA3ytaq0ahlRhSIdOndeYNzj++oJXzc20adP0yCOPqHXr1vrBD35gT/FevXq1evbs6dMFwr/cpXQDwcZTvXpKcX69WoL4gnWHTI0DfM1VrRri+OsLXn0sdccdd+j6669XYWGhMjMz7dtzc3P14x//2GeLg/+R0o1Q4qlePaU4n6+WIF55xsbTOMDX3NUqx9/a8zoVPDU1VT179lRY2P+f4tprr1XnznxWHUpI6UYo8VSvnlKcY6oliEc3cJ4oXn0c4GvuapXjb+153dzAGkjpRijxVK/jBrZ3u3/1pPvq33vaDviKq1q1ieOvL3gVnBnqCM50tGpnkWbn79fe42fVISVO4we0I30WQctTvTq9WyoiTPdd30aP/tD53VKvrz+k82Xliom8fLeUs3GAr1XW6pHTl2v1qiYxmjo0g+OvG2Z/f9Pc0NwAABASzP7+5mMpAABgKTQ3AADAUmhuAACApdDcAAAAS6G5AQAAlkJzAwAALMWr+AUAqCu1Ta2v3H9X4VmFh9lUXmEoIy3OPo89mfnUeRm6/BC1VkmkM+P/q2kNuhpffXtaQrQ+2n1CZeUVkqSEhhFq3ChSx0tKlRIfJUk6XlLqVd3XdzznhufcAEGrMjm5KptNmjsi29SB3tn+VecZ06+d5hS4Dil85W5z7wPrqmkNuhrvqdY8qUndWxnPuQEQ8mqbWu8uJdwwpAUe0r9JZ0ZNa9DV+NddJNCbVZO6B80NgCBW29R6TynhFzykf5POjJrWoKvx510k0NcE9WgezQ2AoFXb1HpPKeHRHtK/SWdGTWvQ1fgYFwn0NUE9mkdzAyBo1Ta13tn+VecZmdPa7f6kM6OmNehq/D19WrusRTNqUvfggmIuKAaCXG1T6yv3311YovAwmy5VGMpIi7fP4/RuqaaNNHVIZ9KZIanmNehqfPXtafEN9dGeEyq7VOVuqdgonSj5XslxUZLNphMl33tV91ZFKrgbNDcAAIQe7pYCAAD1Es0NAACwFJobAABgKTQ3AADAUmhuAACApdDcAAAASyEVHEBIqZqsXDU52dWfa5KoXNsEcliXr2rDU0q9P96zPuI5NzznBggZ7lK+3TGTqFzbBHJYl69qw1NKfdX5qEfneM4NAMtxl/LtjplE5domkMO6fFUbnlLqq85HPdYOzQ2AkOEp5dsdT4nKtU0gh3X5qjY81W/V+ajH2qG5ARAyPKV8u+MpUbm2CeSwLl/Vhqf6rTof9Vg7NDcAQoa7lG93zCQq1zaBHNblq9rwlFJfdT7qsXa4oJgLioGQUjVZOTnu8l1RJ86WXvlnLxKVa5tADuvyVW1UzrOrsEQR/7lbqnOVlHp/vKeVkAruBs0NAAChh7ulAABAvURzAwAALIXmBgAAWArNDQAAsBSaGwAAYCk0NwAAwFJIBQcQtPyRiuxsTkmkL8Pv3NUzCeC+xXNueM4NEJT8kYrsdE5J1Q+CpC/D19zVsyQSwE3iOTcAQpo/UpGdzulkHOnL8DV39UwCuO/xsRSAoOSPVOSapIqTvgxfclfPrj4/oQa9x5kbAEHJH6nINUkVJ30ZvuSunkkA9z2aGwBByR+pyE7ndDKO9GX4mrt6JgHc97igmAuKgaDlj1RkZ3MaEunL8Dt39UwCuDmkgrtBcwMAQOjhbikAAFAv0dwAAABLobkBAACWQnMDAAAsheYGAABYSkCbm7y8PF1zzTWKi4tTcnKybr31Vu3Zs8ftPvn5+bLZbFd87d69u45WDQAAgllA4xcKCgo0fvx4XXPNNbp06ZIee+wxDRo0SF988YUaNWrkdt89e/Y43AbWrFkzfy8XQIBVTU5OiY+SJB0vKa1Rujfpy6gtTzVU0xqrPr53u6Zat/8barQWguo5NydPnlRycrIKCgrUr18/p2Py8/M1cOBAnTlzRomJiV69D8+5AUKPs1Tlqsyke/sjaRz1i6caqmmNeaprT/vXNyH5nJvi4mJJUpMmTTyO7dmzp9LS0pSbm6s1a9a4HVtaWqqSkhKHLwChxVlyclVm0r1JX0ZteaqhmtaYp7r2tD+cC5rmxjAMTZw4Uddff726devmclxaWprmzZunpUuX6t1331WnTp2Um5urjz/+2OU+eXl5SkhIsH+lp6f7468AwI9qkuhdVdVkZX8kjaN+8VRDNa0xs3VNjdZM0DQ3EyZM0Pbt27V48WK34zp16qTRo0fr6quvVk5OjmbPnq2bbrpJzz33nMt9pkyZouLiYvvX0aNHfb18AH5Wk0TvqqomK5O+jNryVEM1rTGzdU2N1kxQNDcPPPCAli9frjVr1qhly5Y13v+6667T3r17Xb4eFRWl+Ph4hy8AocVZcnJVZtK9SV9GbXmqoZrWmKe69rQ/nAvoBcWGYeiBBx7QsmXLlJ+frw4dOng1zx133KHTp0/ro48+MjWeC4qB0FQ1OTk5Lkqy2XSi5PsapXuTvoza8lRDNa2x6uN7t0vSuv2nqFEnQiIVfNy4cXrrrbf0t7/9TZ06dbJvT0hIUHR0tKTLHykdO3ZMCxculCTNnDlTrVu3VteuXVVWVqZFixbpmWee0dKlS3XbbbeZel+aGwAAQo/Z398Bfc7NnDlzJEkDBgxw2P7aa69p5MiRkqTCwkIdOXLE/lpZWZkeeeQRHTt2TNHR0eratavee+89DR06tK6WDQAAglhQPeemrnDmBgCA0BOSz7kBAACoLZobAABgKTQ3AADAUmhuAACApQT0bikA8Ja3ScqkggPWx91S3C0FhBxvk5RJBQdCG3dLAbAsb5OUSQUH6geaGwAhx9skZVLBgfqB5gZAyPE2SZlUcKB+oLkBEHK8TVImFRyoH2huAIScwV1TNXdEtjLTExUTGa7M9ESN7d/O4ftXRmRfkaTsbD9n4wCENu6W4m4pAABCAndLAQCAeonmBgAAWArNDQAAsBSaGwAAYCk0NwAAwFJobgAAgKWQCo5aIWEZ/mC2rpyNk0RNAvUcz7nhOTdeI2EZ/mC2rpyOk1T9gEZNAtbBc27gdyQswx/M1pXTcU7moyaB+ofmBl4jYRn+YLauzCaDO9sXgLXR3MBrJCzDH8zWldlkcGf7ArA2mht4jYRl+IPZunI6zsl81CRQ/3BBMRcU18qqnUWanb9fe4+fVYeUOI0f0I6EZdSa2bpyNs6QqEnAosz+/qa5obkBACAkcLcUAACol2huAACApdDcAAAAS6G5AQAAlkJzAwAALIXmBgAAWAqp4ABCjrdp9KTYIxCou7rHc254zg0QUrxNoyfFHoFA3fkWz7kBYEneptGTYo9AoO4Cg+YGQEjxNo2eFHsEAnUXGDQ3AEKKt2n0pNgjEKi7wKC5ARBSvE2jJ8UegUDdBQYXFHNBMRByvE2jJ8UegUDd+Q6p4G7Q3AAAEHq4WwoAANRLNDcAAMBSaG4AAICl0NwAAABLobkBAACWQnMDAAAsheYGAABYCs0NAACwFJobAABgKTQ3AADAUmhuAACApdDcAAAAS6G5AQAAlkJzAwAALIXmBgAAWArNDQAAsBSaGwAAYCk0NwAAwFJobgAAgKUEtLnJy8vTNddco7i4OCUnJ+vWW2/Vnj17PO5XUFCg7OxsNWzYUG3bttXcuXPrYLUAACAUBLS5KSgo0Pjx47VhwwZ98MEHunTpkgYNGqTvvvvO5T4HDx7U0KFD1bdvX23ZskVTp07Vgw8+qKVLl9bhygEEm1U7izTsD58q44mVGvaHT7VqZ1GglwQgQGyGYRiBXkSlkydPKjk5WQUFBerXr5/TMZMnT9by5cu1a9cu+7YxY8Zo27ZtWr9+van3KSkpUUJCgoqLixUfH++TtQMInFU7i3T/G5scttls0twR2RrcNTVAqwLga2Z/fwfVNTfFxcWSpCZNmrgcs379eg0aNMhh2+DBg7Vx40ZdvHjR6T6lpaUqKSlx+AJgHbPX7Ltim2FIs/P3B2A1AAItaJobwzA0ceJEXX/99erWrZvLcUVFRUpJSXHYlpKSokuXLumbb75xuk9eXp4SEhLsX+np6T5dO4DA+vL4Oafb9x4/W8crARAMgqa5mTBhgrZv367Fixd7HGuz2Ry+r/xkrfr2SlOmTFFxcbH96+jRo7VfMICg0TEl1un2DilxdbwSAMEgKJqbBx54QMuXL9eaNWvUsmVLt2NTU1NVVOR4oeCJEycUERGhpKQkp/tERUUpPj7e4QuAdYwb2F7V/9/GZpPGD2gXmAUBCKiANjeGYWjChAl699139dFHH6lNmzYe98nJydEHH3zgsG316tXq1auXGjRo4K+lAghig7umau6IbGWmJyomMlyZ6Yl6ZUS2BnExMVAvBfRuqXHjxumtt97S3/72N3Xq1Mm+PSEhQdHR0ZIuf6R07NgxLVy4UNLlW8G7deum+++/X6NHj9b69es1ZswYLV68WLfffrup9+VuKQAAQk9I3C01Z84cFRcXa8CAAUpLS7N//fnPf7aPKSws1JEjR+zft2nTRu+//77y8/OVlZWlp556SrNmzTLd2AAAAGsLqufc1BXO3AAAEHpC4swNAACAr9HcAAAAS6G5AQAAlkJzAwAALIXmBgAAWArNDQAAsBSaGwAAYCk0NwAAwFJobgAAgKVEBHoBgVD5UOaSkpIArwQAAJhV+XvbU7hCvWxuzp49K0lKT08P8EoAAEBNnT17VgkJCS5fr5fZUhUVFfr6668VFxcnm80W6OWErJKSEqWnp+vo0aNkdCFoUJcINtSk7xiGobNnz6p58+YKC3N9ZU29PHMTFhamli1bBnoZlhEfH88/WAQd6hLBhpr0DXdnbCpxQTEAALAUmhsAAGApNDfwWlRUlKZPn66oqKhALwWwoy4RbKjJulcvLygGAADWxZkbAABgKTQ3AADAUmhuAACApdDcAAhphw4dks1m09atW4NyPoSeJ598UllZWbWeJz8/XzabTd9++63pfUaOHKlbb7211u9d33FBMTw6dOiQ2rRpoy1btvjkHzzgS+Xl5Tp58qSaNm2qiIjaP5eUese5c+dUWlqqpKSkWs1TVlam06dPKyUlxfTT8IuLi2UYhhITE2v13vVdvXxCMYDQcfHiRTVo0MDl6+Hh4UpNTa3DFXlWVlamyMjIQC8DXoqNjVVsbKzL183+942MjKxxbZp5+i4842OpeuSdd95R9+7dFR0draSkJN1www367rvvJEmvvfaaMjIy1LBhQ3Xu3FmzZ8+279emTRtJUs+ePWWz2TRgwABJlzO6fv3rX6tly5aKiopSVlaWVq5cad+vrKxMEyZMUFpamho2bKjWrVsrLy/P/vrzzz+v7t27q1GjRkpPT9e4ceN07ty5OvhJwF9eeeUVtWjRQhUVFQ7bb7nlFt1zzz2SpL///e/Kzs5Ww4YN1bZtW82YMUOXLl2yj7XZbJo7d66GDRumRo0a6emnn9aZM2c0fPhwNWvWTNHR0erQoYNee+01Sc4/Rtq5c6duuukmxcfHKy4uTn379tX+/fslea5bZwoKCnTttdcqKipKaWlp+tWvfuWw5gEDBmjChAmaOHGimjZtqhtvvLFWP0f4l6c6rf6xVOVHRXl5eWrevLk6duwoSVq3bp2ysrLUsGFD9erVS3/9618darH6x1ILFixQYmKiVq1apYyMDMXGxuqHP/yhCgsLr3ivShUVFXr22WfVvn17RUVF6aqrrtJvfvMb++uTJ09Wx44dFRMTo7Zt2+qJJ57QxYsXffsDC0UG6oWvv/7aiIiIMJ5//nnj4MGDxvbt242XX37ZOHv2rDFv3jwjLS3NWLp0qXHgwAFj6dKlRpMmTYwFCxYYhmEY//rXvwxJxj//+U+jsLDQOHXqlGEYhvH8888b8fHxxuLFi43du3cbjz76qNGgQQPjyy+/NAzDMH73u98Z6enpxscff2wcOnTI+OSTT4y33nrLvqYXXnjB+Oijj4wDBw4YH374odGpUydj7Nixdf/Dgc+cOnXKiIyMNP75z3/at50+fdqIjIw0Vq1aZaxcudKIj483FixYYOzfv99YvXq10bp1a+PJJ5+0j5dkJCcnG6+++qqxf/9+49ChQ8b48eONrKws4/PPPzcOHjxofPDBB8by5csNwzCMgwcPGpKMLVu2GIZhGF999ZXRpEkT47bbbjM+//xzY8+ePcaf/vQnY/fu3YZheK5bZ/PFxMQY48aNM3bt2mUsW7bMaNq0qTF9+nT7mvv372/ExsYakyZNMnbv3m3s2rXLjz9l1JanOp0+fbqRmZlpf+2ee+4xYmNjjbvvvtv497//bezYscMoKSkxmjRpYowYMcLYuXOn8f777xsdO3Z0qJ01a9YYkowzZ84YhmEYr732mtGgQQPjhhtuMD7//HNj06ZNRkZGhnHXXXc5vNewYcPs3z/66KNG48aNjQULFhj79u0zPvnkE2P+/Pn215966ilj7dq1xsGDB43ly5cbKSkpxrPPPuuXn1soobmpJzZt2mRIMg4dOnTFa+np6Q5Nh2Fc/geTk5NjGMaVB/tKzZs3N37zm984bLvmmmuMcePGGYZhGA888IDxX//1X0ZFRYWpNb799ttGUlKS2b8SgtQtt9xi/PznP7d//8orrxipqanGpUuXjL59+xr/93//5zD+jTfeMNLS0uzfSzIefvhhhzE333yzMWrUKKfvV70+p0yZYrRp08YoKytzOt5T3Vafb+rUqUanTp0c6vjll182YmNjjfLycsMwLjc3WVlZrn4kCELu6tRZc5OSkmKUlpbat82ZM8dISkoyLly4YN82f/58j82NJGPfvn32fV5++WUjJSXF4b0qm5uSkhIjKirKoZnx5Le//a2RnZ1terxV8bFUPZGZmanc3Fx1795dP/nJTzR//nydOXNGJ0+e1NGjR3XvvffaP2eOjY3V008/bT+N70xJSYm+/vpr9enTx2F7nz59tGvXLkmXT69u3bpVnTp10oMPPqjVq1c7jF2zZo1uvPFGtWjRQnFxcfqf//kfnTp1yv5RGULT8OHDtXTpUpWWlkqS3nzzTd15550KDw/Xpk2b9Otf/9qh1kaPHq3CwkKdP3/ePkevXr0c5hw7dqyWLFmirKwsPfroo1q3bp3L99+6dav69u3r9DodM3Vb3a5du5STk+NwQWifPn107tw5ffXVVy7XjODmrk6d6d69u8N1Nnv27FGPHj3UsGFD+7Zrr73W4/vGxMSoXbt29u/T0tJ04sQJp2N37dql0tJS5ebmupzvnXfe0fXXX6/U1FTFxsbqiSee0JEjRzyuw+pobuqJ8PBwffDBB1qxYoW6dOmil156SZ06ddKBAwckSfPnz9fWrVvtX//+97+1YcMGj/NWvwPAMAz7tquvvloHDx7UU089pQsXLuinP/2p7rjjDknS4cOHNXToUHXr1k1Lly7Vpk2b9PLLL0sSnxeHuJtvvlkVFRV67733dPToUX3yyScaMWKEpMvXD8yYMcOh1nbs2KG9e/c6/JJo1KiRw5xDhgzR4cOH9fDDD+vrr79Wbm6uHnnkEafvHx0d7XGN7uq2OmevGf+5ybTq9uprRnBzV6fOVP/v664u3KnedNtsNpf7earlDRs26M4779SQIUP0j3/8Q1u2bNFjjz2msrIyj+uwOu6WqkdsNpv69OmjPn36aNq0aWrVqpXWrl2rFi1a6MCBAxo+fLjT/Sr/b6W8vNy+LT4+Xs2bN9enn36qfv362bevW7fO4f9e4uPj9bOf/Uw/+9nPdMcdd+iHP/yhTp8+rY0bN+rSpUv6/e9/r7Cwyz3222+/7Y+/NupYdHS0brvtNr355pvat2+fOnbsqOzsbEmXG949e/aoffv2NZ63WbNmGjlypEaOHKm+fftq0qRJeu65564Y16NHD73++utO77IyW7dVdenSRUuXLnX4ZbZu3TrFxcWpRYsWNf57IDi4q1MzOnfurDfffFOlpaX2QMyNGzf6dI0dOnRQdHS0PvzwQ913331XvL527Vq1atVKjz32mH3b4cOHfbqGUEVzU0989tln+vDDDzVo0CAlJyfrs88+08mTJ5WRkaEnn3xSDz74oOLj4zVkyBCVlpZq48aNOnPmjCZOnKjk5GRFR0dr5cqVatmypRo2bKiEhARNmjRJ06dPV7t27ZSVlaXXXntNW7du1ZtvvilJeuGFF5SWlqasrCyFhYXpL3/5i1JTU5WYmKh27drp0qVLeumll3TzzTdr7dq1mjt3boB/SvCV4cOH6+abb9bOnTsd/m942rRp+tGPfqT09HT95Cc/UVhYmLZv364dO3bo6aefdjnftGnTlJ2dra5du6q0tFT/+Mc/lJGR4XTshAkT9NJLL+nOO+/UlClTlJCQoA0bNujaa69Vp06dPNZtdePGjdPMmTP1wAMPaMKECdqzZ4+mT5+uiRMn2htzhCZXdWrGXXfdpccee0y/+MUv9Ktf/UpHjhyxN9tmn2njScOGDTV58mQ9+uijioyMVJ8+fXTy5Ent3LlT9957r9q3b68jR45oyZIluuaaa/Tee+9p2bJlPnnvkBe4y31Ql7744gtj8ODBRrNmzYyoqCijY8eOxksvvWR//c033zSysrKMyMhIo3Hjxka/fv2Md9991/76/PnzjfT0dCMsLMzo37+/YRiGUV5ebsyYMcNo0aKF0aBBAyMzM9NYsWKFfZ958+YZWVlZRqNGjYz4+HgjNzfX2Lx5s/31559/3khLSzOio6ONwYMHGwsXLnS4+A6h69KlS0ZaWpohydi/f7/DaytXrjR69+5tREdHG/Hx8ca1115rzJs3z/66JGPZsmUO+zz11FNGRkaGER0dbTRp0sQYNmyYceDAAcMwnF/wvm3bNmPQoEFGTEyMERcXZ/Tt29e+Dk9162y+/Px845prrjEiIyON1NRUY/LkycbFixftr/fv39946KGHavlTQ11zVafOLiiuegdTpbVr1xo9evQwIiMjjezsbOOtt94yJNnvzHN2QXFCQoLDHMuWLTOq/iqu/l7l5eXG008/bbRq1cpo0KCBcdVVVzlclD9p0iQjKSnJiI2NNX72s58ZL7zwwhXvUR/xhGIAAHzgzTff1KhRo1RcXGzq2i/4Dx9LAQDghYULF6pt27Zq0aKFtm3bpsmTJ+unP/0pjU0QoLkBAMALRUVFmjZtmoqKipSWlqaf/OQnDk8PRuDwsRQAALAULvUHAACWQnMDAAAsheYGAABYCs0NAACwFJobAABgKTQ3AOqNkSNH6tZbbw30MgD4GbeCA6g3iouLZRiGEhMTA70UAH5EcwMAACyFj6UA1Kl33nlH3bt3V3R0tJKSknTDDTfou+++s39kNGPGDCUnJys+Pl7333+/ysrK7PsahqHf/va3atu2raKjo5WZmal33nnHYf6dO3fqpptuUnx8vOLi4tS3b1/t379f0pUfS3ma78yZMxo+fLiaNWum6OhodejQQa+99pp/f0AAao34BQB1prCwUP/93/+t3/72t/rxj3+ss2fP6pNPPlHlCeQPP/xQDRs21Jo1a3To0CGNGjVKTZs2tT/S/vHHH9e7776rOXPmqEOHDvr44481YsQINWvWTP3799exY8fUr18/DRgwQB999JHi4+O1du1aXbp0yel6PM33xBNP6IsvvtCKFSvUtGlT7du3TxcuXKiznxcA7/CxFIA6s3nzZmVnZ+vQoUNq1aqVw2sjR47U3//+dx09elQxMTGSpLlz52rSpEkqLi7WhQsX1LRpU3300UfKycmx73fffffp/PnzeuuttzR16lQtWbJEe/bsUYMGDa54/5EjR+rbb7/VX//6V3333Xce57vlllvUtGlT/elPf/LTTwSAP3DmBkCdyczMVG5urrp3767Bgwdr0KBBuuOOO9S4cWP765WNjSTl5OTo3LlzOnr0qE6cOKHvv/9eN954o8OcZWVl6tmzpyRp69at6tu3r9PGprovvvjC43xjx47V7bffrs2bN2vQoEG69dZb1bt371r9DAD4H80NgDoTHh6uDz74QOvWrdPq1av10ksv6bHHHtNnn33mdj+bzaaKigpJ0nvvvacWLVo4vB4VFSVJio6ONr0WM/MNGTJEhw8f1nvvvad//vOfys3N1fjx4/Xcc8+Zfh8AdY/mBkCdstls6tOnj/r06aNp06apVatWWrZsmSRp27ZtunDhgr1J2bBhg2JjY9WyZUs1btxYUVFROnLkiPr37+907h49euj111/XxYsXPZ696dKli8f5JKlZs2YaOXKkRo4cqb59+2rSpEk0N0CQo7kBUGc+++wzffjhhxo0aJCSk5P12Wef6eTJk8rIyND27dtVVlame++9V48//rgOHz6s6dOna8KECQoLC1NcXJweeeQR/fKXv1RFRYWuv/56lZSUaN26dYqNjdU999yjCRMm6KWXXtKdd96pKVOmKCEhQRs2bNC1116rTp06OazFzHzTpk1Tdna2unbtqtLSUv3jH/9QRkZGgH56AMyiuQFQZ+Lj4/Xxxx9r5syZKikpUatWrfT73/9eQ4YM0Z///Gfl5uaqQ4cO6tevn0pLS3XnnXfqySeftO//1FNPKTk5WXl5eTpw4IASExN19dVXa+rUqZKkpKQkffTRR5o0aZL69++v8PBwZWVlqU+fPk7X42m+yMhITZkyRYcOHVJ0dLT69u2rJUuW+P3nBKB2uFsKQFCoeicTANQGD/EDAACWQnMDAAAshY+lAACApXDmBgAAWArNDQAAsBSaGwAAYCk0NwAAwFJobgAAgKXQ3AAAAEuhuQEAAJZCcwMAACzl/wHXUBJgvSBvVgAAAABJRU5ErkJggg==",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.stripplot(x=\"species\", y=\"sepal_width\", data=pd.read_csv('iris.csv'));"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGzCAYAAADT4Tb9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB6+0lEQVR4nO3dd3zT1f7H8VdGk8500dLSlrJH2TIE2VRR4KJet+DAPRhucOK6iigiuEC5XhRU8Ke4UWQWZIlAAYGyRwtt6d5p2jT5/ZFLryVJm5S0SdPP8/HoQ/me5OT0S2g+/X7POW+F2Ww2I4QQQgjhJZTuHoAQQgghhCtJcSOEEEIIryLFjRBCCCG8ihQ3QgghhPAqUtwIIYQQwqtIcSOEEEIIryLFjRBCCCG8ihQ3QgghhPAqUtwIIYQQwqtIcSOEEEIIr6J29wDOmzVrFs8++yyPPPII8+bNs/mYpKQkRo4caXU8JSWFLl26OPxaJpOJ9PR0goKCUCgU9R2yEEIIIRqR2WymuLiYVq1aoVTavz7jEcXNn3/+yccff0zPnj0devzhw4fR6XTVf46IiHDq9dLT04mLi3PqOUIIIYTwDGlpacTGxtptd3txU1JSwsSJE1m0aBH/+te/HHpOZGQkISEh9X7NoKAgwHJy/l4kCSGEEMJzFRUVERcXV/05bo/bi5vJkyczbtw4Lr/8coeLmz59+lBeXk5CQgLPP/+8zVtVf2cwGDAYDNV/Li4uBkCn00lxI4QQQjQxdU0pcWtxs3z5cnbv3s2ff/7p0OOjo6P5+OOP6du3LwaDgaVLl5KYmEhSUhLDhg2z+7xZs2bx8ssvu2rYQgghhPBgCrPZbHbHC6elpdGvXz9Wr15Nr169ABgxYgS9e/e2O6HYlvHjx6NQKPjxxx/tPubCKzfnL2sVFhbKlRshhBCiiSgqKiI4OLjOz2+3LQXftWsXWVlZ9O3bF7VajVqtZuPGjbz77ruo1Wqqqqoc6mfgwIEcPXq01sdotdrqW1ByK0oIIYTwbm67LZWYmMhff/1V49hdd91Fly5dmDFjBiqVyqF+kpOTiY6OboghCiGEaCKqqqqorKx09zDERfLx8XH48782bitugoKC6N69e41jAQEBhIeHVx9/5plnOHv2LEuWLAFg3rx5tGnThm7dulFRUcHnn3/OihUrWLFiRaOPXwghhPuZzWYyMzMpKChw91CEi4SEhBAVFXVR+9C5fbVUbTIyMkhNTa3+c0VFBU8++SRnz57Fz8+Pbt26sXLlSsaOHevGUQohhHCX84VNZGQk/v7+sjFrE2Y2mykrKyMrKwvgou7KuG1CsTs5OiFJCCGE56qqquLIkSNERkYSHh7u7uEIF8nNzSUrK4tOnTpZ3aLy+AnFQgghxMU4P8fG39/fzSMRrnT+7/Ni5lBJcSOEEKJJk1tR3sUVf58ePedGeA6z2cy5YgPGKhMalZJIna+7hySEEELYJMWNqFNuiYFf92fy3vqjnCsyEBfmx1OjuzC0YwtCAzTuHp4QQjR7kyZNoqCggO+//97dQ/EIUtyIWpUajHyYdIxPNp+qPpaWp2fa8mSeH9eVOwbFo1Ff/J4EQggh6m/+/Pk0w/VBdsmcG1GrnBIDi7ecstk2d80RsooNNtuEEEI0nuDgYEJCQtw9DI8hxY2oVUZhOSY7vwyUVVRRUCY7ggohBMA333xDjx498PPzIzw8nMsvv5zS0lImTZrEtddey8svv0xkZCQ6nY4HHniAioqK6ueazWbefPNN2rVrh5+fH7169eKbb76p0f+BAwcYN24cOp2OoKAghg4dyvHjxwGqX8PR/vLz85k4cSIRERH4+fnRsWNHFi9e3LAnqBHJbSlRKz+f2m85adRSHwshREZGBrfeeitvvvkm//znPykuLub333+vvlW0bt06fH192bBhA6dOneKuu+6iRYsWvPbaawA8//zzfPvttyxYsICOHTuyadMmbrvtNiIiIhg+fDhnz55l2LBhjBgxgvXr16PT6diyZQtGo9HmeOrq74UXXuDgwYP8+uuvtGjRgmPHjqHX6xvtfDU0KW5ErSJ1WiKCtGTbuP3UqWUgYf4yoVgIITIyMjAajVx33XXEx8cD0KNHj+p2jUbDf/7zH/z9/enWrRuvvPIKTz31FK+++ip6vZ65c+eyfv16Bg0aBEC7du3YvHkzH330EcOHD+eDDz4gODiY5cuX4+PjA0CnTp1sjqW0tLTO/lJTU+nTpw/9+vUDoE2bNg11atxCihtRqyidL/++ox+3LtpOWcX/ktpD/X14f8IltAjSunF0QgjhGXr16kViYiI9evTgyiuvZPTo0dxwww2EhoZWt/99s8FBgwZRUlJCWloaWVlZlJeXc8UVV9Tos6Kigj59+gCwZ88ehg4dWl3Y1ObgwYN19vfQQw9x/fXXs3v3bkaPHs21117LZZdddlHnwJNIcSNqpVAo6B4TzG+PDmP7iVwOZxbTu3UIfeJCiQn1c/fwhBDCI6hUKtasWcPWrVtZvXo17733Hs899xx//PFHrc9TKBSYTCYAVq5cSUxMTI12rdbyC6Sfn+M/bx3pb8yYMZw+fZqVK1eydu1aEhMTmTx5MnPmzHH4dTyZFDeiTiqlgrgwf+LCZItzIYSwR6FQMHjwYAYPHszMmTOJj4/nu+++A2Dv3r3o9frqImX79u0EBgYSGxtLaGgoWq2W1NRUhg8fbrPvnj178tlnn1FZWVnn1ZuEhIQ6+wOIiIhg0qRJTJo0iaFDh/LUU09JcSOEEEIIiz/++IN169YxevRoIiMj+eOPP8jOzqZr167s27ePiooK7rnnHp5//nlOnz7Niy++yJQpU1AqlQQFBfHkk0/y2GOPYTKZGDJkCEVFRWzdupXAwEDuvPNOpkyZwnvvvcctt9zCM888Q3BwMNu3b2fAgAF07ty5xlgc6W/mzJn07duXbt26YTAY+Pnnn+nataubzp7rSXEjhBBCXCSdTsemTZuYN28eRUVFxMfH8/bbbzNmzBi++uorEhMT6dixI8OGDcNgMHDLLbfw0ksvVT//1VdfJTIyklmzZnHixAlCQkK45JJLePbZZwEIDw9n/fr1PPXUUwwfPhyVSkXv3r0ZPHiwzfHU1Z9Go+GZZ57h1KlT+Pn5MXToUJYvX97g56mxKMzNcEtDRyPThRBCeK7y8nJOnjxJ27Zt8fX13Lw7iUZwTm1/r45+fssmJUIIIYTwKlLcCCGEEMKryJwbIYQQogF9+umn7h5CsyNXboQQQgjhVaS4EUIIIYRXkeJGCCGEEF5FihshhBBCeBUpboQQQgjhVaS4EUIIIYRXkeJGCCGEEF5FihshhBCiiTh16hQKhYI9e/a4eygeTTbxE0II0awVllWQU1JBUXklOj8fWgRoCPbXuHtY4iLIlRshhBDNVnqBninLkkmcu5F/friVxLc3MnVZMukF+gZ93W+++YYePXrg5+dHeHg4l19+OaWlpQAsXryYrl274uvrS5cuXfjwww+rn9e2bVsA+vTpg0KhYMSIEQCYTCZeeeUVYmNj0Wq19O7dm1WrVlU/r6KigilTphAdHY2vry9t2rRh1qxZ1e1z586lR48eBAQEEBcXx8MPP0xJSUmDnoOGJMWNEEKIZqmwrIIZK/bx+9GcGsc3Hc3h6RX7KCyraJDXzcjI4NZbb+Xuu+8mJSWFpKQkrrvuOsxmM4sWLeK5557jtddeIyUlhddff50XXniBzz77DIAdO3YAsHbtWjIyMvj2228BmD9/Pm+//TZz5sxh3759XHnllVx99dUcPXoUgHfffZcff/yR//u//+Pw4cN8/vnntGnTpnpMSqWSd999l/379/PZZ5+xfv16pk+f3iDff2NQmM1ms7sH0dgcjUwXQgjhucrLyzl58iRt27bF19fX6ecfzyohce5Gu+3rHh9O+8jAixmiTbt376Zv376cOnWK+Pj4Gm2tW7dm9uzZ3HrrrdXH/vWvf/HLL7+wdetWTp06Rdu2bUlOTqZ3797Vj4mJiWHy5Mk8++yz1ccGDBhA//79+eCDD5g2bRoHDhxg7dq1KBSKOsf49ddf89BDD5GTk1PnY12ttr9XRz+/Zc6NByrSV1JcXolCoSAsQIOvj8rdQxJCCK9TVF5Za3txHe311atXLxITE+nRowdXXnklo0eP5oYbbsBoNJKWlsY999zDfffdV/14o9FIcHCw3f6KiopIT09n8ODBNY4PHjyYvXv3AjBp0iSuuOIKOnfuzFVXXcU//vEPRo8eXf3YDRs28Prrr3Pw4EGKioowGo2Ul5dTWlpKQECAi89Aw5PbUh6k0mgiJaOIh7/YzeDZGxg5J4mXfjzAmfwydw9NCCG8js7Xp9b2oDra60ulUrFmzRp+/fVXEhISeO+99+jcuTMnTpwAYNGiRezZs6f6a//+/Wzfvr3Ofi+8ImM2m6uPXXLJJZw8eZJXX30VvV7PTTfdxA033ADA6dOnGTt2LN27d2fFihXs2rWLDz74AIDKyoYp8BqaFDce5FRuKdd+sIXNxyyXAQ1GE8v/TOPWRdsbfHKbEEI0Ny0CNQzr2MJm27COLWgR2HArphQKBYMHD+bll18mOTkZjUbDli1biImJ4cSJE3To0KHG1/mJxBqNZUxVVVXVfel0Olq1asXmzZtrvMbWrVvp2rVrjcfdfPPNLFq0iK+++ooVK1aQl5fHzp07MRqNvP322wwcOJBOnTqRnp7eYN97Y5DbUh6i1GDknbVHMBhNVm1peXr+PJXHNb1j3DAyIYTwTsH+Gt64vidPr9jHpr9NKh7WsQWzr+/ZYMvB//jjD9atW8fo0aOJjIzkjz/+IDs7m65du/LSSy8xbdo0dDodY8aMwWAwsHPnTvLz83n88ceJjIzEz8+PVatWERsbi6+vL8HBwTz11FO8+OKLtG/fnt69e7N48WL27NnDF198AcA777xDdHQ0vXv3RqlU8vXXXxMVFUVISAjt27fHaDTy3nvvMX78eLZs2cLChQsb5HtvLFLceIjicmP1FRtbVu7LYFzPaNRKudgmhBCu0irEj/du7UNOSQXF5ZUE+frQIrBh97nR6XRs2rSJefPmUVRURHx8PG+//TZjxowBwN/fn7feeovp06cTEBBAjx49ePTRRwFQq9W8++67vPLKK8ycOZOhQ4eSlJTEtGnTKCoq4oknniArK4uEhAR+/PFHOnbsCEBgYCCzZ8/m6NGjqFQq+vfvzy+//IJSqaR3797MnTuX2bNn88wzzzBs2DBmzZrFHXfc0WDnoKHJaikPWS2VVVTO9Qu3kpZn+/bThAFxvPbPHg7NchdCiObgYldLCc/kitVSchnAQ0QEabl7cFu77RMujZfCRgghhHCAFDceQqFQMK5HNEM6WE9ue+KKTsSF+bthVEIIIUTTI3NuPEikzpd5N/fmdF4Zqw9kEqhVc2X3KKJ0vuj8GmZJohBCCOFtpLjxMC2CtLQI0tI3PtTdQxFCCCGaJLktJYQQQgivIsWNEEIIIbyKFDdCCCGE8CpS3AghhBDCq8iEYhfRVxrJL63EbAadn7rBAteEEEIIUTu5cuMCaXllvPD9AUa8lcSQN9cz9ctkjmQWY6yyzokSQgghGtupU6dQKBTs2bPHI/tzNblyc5HO5uu56aNtZBSWVx9LOpLNHyfzWDltCO0iAt04OiGEEALi4uLIyMigRQvbKejeRq7cXKRNR7JrFDbn6SurWJh0HH2F0Q2jEkII4TB9PuQcgTM7Ieeo5c9NTGVlZa3tKpWKqKgo1GrPuaZRUVHRYH1LcXMRyiuNrDqQabc96Ug2ReVS3AghhMcqPAtf3w3v94d/J8L7/eCbeyzHG8hHH31ETEwMJlPNqQtXX301d955JwA//fQTffv2xdfXl3bt2vHyyy9jNP7v80ShULBw4UKuueYaAgIC+Ne//kV+fj4TJ04kIiICPz8/OnbsyOLFiwHbt5EOHDjAuHHj0Ol0BAUFMXToUI4fPw6AyWTilVdeITY2Fq1WS+/evVm1alWt39fGjRsZMGAAWq2W6Ohonn766RpjHjFiBFOmTOHxxx+nRYsWXHHFFRd1Hmsjxc1FUCmVhPrbnzgc7OeDSilhl0II4ZH0+fDDFDixvubx4+vgx6kNdgXnxhtvJCcnhw0bNlQfy8/P57fffmPixIn89ttv3HbbbUybNo2DBw/y0Ucf8emnn/Laa6/V6OfFF1/kmmuu4a+//uLuu+/mhRde4ODBg/z666+kpKSwYMECu7ehzp49y7Bhw/D19WX9+vXs2rWLu+++u7oYmT9/Pm+//TZz5sxh3759XHnllVx99dUcPXrUbn9jx46lf//+7N27lwULFvDJJ5/wr3/9q8bjPvvsM9RqNVu2bOGjjz66mNNYK8+5PtUE+aiU3DGoDd/vSbfZfu/QtrQI1DbyqIQQQjikNNu6sDnv+DpLu5/ro3DCwsK46qqr+PLLL0lMTATg66+/JiwsjMTEREaOHMnTTz9dfRWnXbt2vPrqq0yfPp0XX3yxup8JEyZw9913V/85NTWVPn360K9fPwDatGljdwwffPABwcHBLF++HB8fyy/pnTp1qm6fM2cOM2bM4JZbbgFg9uzZbNiwgXnz5vHBBx9Y9ffhhx8SFxfH+++/j0KhoEuXLqSnpzNjxgxmzpyJUmm5ltKhQwfefPPN+pw2p8iVm4vULiKAySM7WB0f1SWSkV0i3TAiIYQQDikvurj2izBx4kRWrFiBwWAA4IsvvuCWW25BpVKxa9cuXnnlFQIDA6u/7rvvPjIyMigrK6vu43wRc95DDz3E8uXL6d27N9OnT2fr1q12X3/Pnj0MHTq0urD5u6KiItLT0xk8eHCN44MHDyYlJcVmfykpKQwaNAiFQlHj8SUlJZw5c8bumBuKXLm5SCH+Gu4f1o6re0Wzan8m5ZUmRndrSVyYv1y1EUIIT+aru7j2izB+/HhMJhMrV66kf//+/P7778ydOxewzHd5+eWXue6666yH5Otb/f8BAQE12saMGcPp06dZuXIla9euJTExkcmTJzNnzhyrfvz8/Ooc498LFQCz2Wx1rLY2s9ls1c+FY24oUty4QLCfD8F+PnSOarh/CEIIIVwsIALaJ1puQV2ofaKlvYH4+flx3XXX8cUXX3Ds2DE6depE3759Abjkkks4fPgwHTpY3xWoS0REBJMmTWLSpEkMHTqUp556ymZx07NnTz777DMqKyutrt7odDpatWrF5s2bGTZsWPXxrVu3MmDAAJuvm5CQwIoVK2oUOVu3biUoKIiYmBinv4+LJbelhBBCNE9+oXD1e5ZC5u/aJ1qON8B8m7+bOHEiK1eu5D//+Q+33XZb9fGZM2eyZMkSXnrpJQ4cOEBKSgpfffUVzz//fK39zZw5kx9++IFjx45x4MABfv75Z7p27WrzsVOmTKGoqIhbbrmFnTt3cvToUZYuXcrhw4cBeOqpp5g9ezZfffUVhw8f5umnn2bPnj088sgjNvt7+OGHSUtLY+rUqRw6dIgffviBF198kccff7x6vk1jkis3Qgghmq/gGLjhE8vk4fIiy62ogIgGL2wARo0aRVhYGIcPH2bChAnVx6+88kp+/vlnXnnlFd588018fHzo0qUL9957b639aTQannnmGU6dOoWfnx9Dhw5l+fLlNh8bHh7O+vXreeqppxg+fDgqlYrevXtXz7OZNm0aRUVFPPHEE2RlZZGQkMCPP/5Ix44dbfYXExPDL7/8wlNPPUWvXr0ICwvjnnvuqbMgaygK8/mbYs1IUVERwcHBFBYWotPJrSQhhGiKysvLOXnyJG3btq0xF0U0bbX9vTr6+S23pYQQQgjhVeS2lAcq0ldSXF6JQqEgLECDr4/K3UMSQgghmgyPuXIza9YsFAoFjz76aK2P27hxY40tqRcuXNg4A2wElUYTKRlFPPzFbgbP3sDIOUm89OMBzuSX1f1kIYQQQgAeUtz8+eeffPzxx/Ts2bPWx508eZKxY8cydOhQkpOTefbZZ5k2bRorVqxopJE2rFO5pVz7wRY2H8sBwGA0sfzPNG5dtJ30Ar2bRyeEEEI0DW4vbkpKSpg4cSKLFi0iNLT22ekLFy6kdevWzJs3j65du3Lvvfdy991321zD39SUGoy8s/YIBqPJqi0tT8+fp/LcMCohhBCi6XF7cTN58mTGjRvH5ZdfXudjt23bxujRo2scu/LKK9m5c2etce8Gg4GioqIaX56muNxYfcXGlpX7MjCarAsfIYQQQtTk1uJm+fLl7N69m1mzZjn0+MzMTFq2bFnjWMuWLTEajeTk2C8MZs2aRXBwcPVXXFzcRY27ISgVlp2O7WkRqEFlZ9trIYQQQvyP24qbtLQ0HnnkET7//HOn9idwJLviQs888wyFhYXVX2lpafUbdAOKCNJy9+C2dtsnXBpf6/cohBBCCAu3LQXftWsXWVlZ1VkaAFVVVWzatIn3338fg8GASlVzCXRUVBSZmZk1jmVlZaFWqwkPD7f7WlqtFq3Ws0MsFQoF43pEsy4ly+r21BNXdCIuzN9NIxNCCCGaFrcVN4mJifz11181jt1111106dKFGTNmWBU2AIMGDeKnn36qcWz16tX069fPZmx7UxOp82Xezb05nVfG6gOZBGrVXNk9iiidL7pablkJIYTwHi+99BLff/89e/bsuah+kpKSGDlyJPn5+YSEhDj0nEmTJlFQUMD3339/Ua/tbh4VvzBixAh69+7NvHnzAMvtpLNnz7JkyRLAshS8e/fuPPDAA9x3331s27aNBx98kGXLlnH99dc7/DoSvyCEEE2fq+IXCg2F5JXnUVxRTJAmiDDfMIK1wS4cqXNKSkowGAy13pFwREVFBXl5ebRs2dLhaQ2FhYWYzWaHi6GG4Ir4BY/eoTgjI4PU1NTqP7dt25ZffvmFxx57jA8++IBWrVrx7rvvOlXYCCGEEOdllmby4tYX2Zq+tfrY4FaDeemyl4gKiHLLmAIDAwkMDLTbXlFRgUajqbMfjUZDVJRz30NwsPuKOldy+1Lwv0tKSqq+agPw6aefkpSUVOMxw4cPZ/fu3RgMBk6ePMmDDz7YuIMUQgjhFQoNhVaFDcCW9C28tPUlCg2FDfK6H330ETExMZgu2N7j6quv5s477+Sll16id+/e1ccnTZrEtddey6xZs2jVqhWdOnUCYOvWrfTu3RtfX1/69evH999/j0KhqL6dlZSUhEKhoKCgALB8poaEhPDbb7/RtWtXAgMDueqqq8jIyLB6rfNMJhOzZ8+mQ4cOaLVaWrduzWuvvVbdPmPGDDp16oS/vz/t2rXjhRdeqHVrlsbiUcWNEEII0VjyyvOsCpvztqRvIa+8YTZPvfHGG8nJyWHDhg3Vx/Lz8/ntt9+YOHGizeesW7eOlJQU1qxZw88//0xxcTHjx4+nR48e7N69m1dffZUZM2bU+dplZWXMmTOHpUuXsmnTJlJTU3nyySftPv6ZZ55h9uzZvPDCCxw8eJAvv/yyxpYsQUFBfPrppxw8eJD58+ezaNEi3nnnHSfORsPw6NtSQgghREMprii+qPb6CgsL46qrruLLL78kMTERgK+//pqwsDASExPZutW64AoICODf//539e2ohQsXolAoWLRoEb6+viQkJHD27Fnuu+++Wl+7srKShQsX0r59ewCmTJnCK6+8YvOxxcXFzJ8/n/fff58777wTgPbt2zNkyJDqxzz//PPV/9+mTRueeOIJvvrqK6ZPn+7EGXE9uXIjHGIymUjNLeVETglpeRLkKYRo+oI0QRfVfjEmTpzIihUrMBgMAHzxxRfccsstNlcKA/To0aPGPJvDhw/Ts2fPGhNuBwwYUOfr+vv7Vxc2ANHR0WRlZdl8bEpKCgaDoboAs+Wbb75hyJAhREVFERgYyAsvvFBjrqy7SHEj6pReoGfx1lPc+NE2Rs3ZyIR/b+ebXWlkSJinEKIJC/MNY3CrwTbbBrcaTJhvWIO99vjx4zGZTKxcuZK0tDR+//13brvtNruPDwgIqPFns9lsd1Pb2ly4bYpCobD7PD8/v1r72r59O7fccgtjxozh559/Jjk5meeee46Kioo6x9HQpLgRtcovNbAg6Tiv/pzCuSLLbxhpeXqe/Hof3+05S5nB/RPHhBCiPoK1wbx02UtWBc751VINuRzcz8+P6667ji+++IJly5bRqVOnGpva1qVLly7s27ev+soPwM6dO106xo4dO+Ln58e6detstm/ZsoX4+Hiee+45+vXrR8eOHTl9+rRLx1BfMudG1Cq3tIIv/rD9Zn1//THGdIuibYRsMCiEaJqiAqKYPWy2W/a5mThxIuPHj+fAgQO1XrWxZcKECTz33HPcf//9PP3006SmpjJnzhyg9jgiZ/j6+jJjxgymT5+ORqNh8ODBZGdnc+DAAe655x46dOhAamoqy5cvp3///qxcuZLvvvvOJa99saS4EbVKLyjHZOdKZ1lFFfllldhPxBJCCM8XrA12y6Z9o0aNIiwsjMOHDzNhwgSnnqvT6fjpp5946KGH6N27Nz169GDmzJlMmDDhojY0vNALL7yAWq1m5syZpKenEx0dXb0FyzXXXMNjjz3GlClTMBgMjBs3jhdeeIGXXnrJZa9fXx61Q3FjkR2KHbfzVB43LNxmt/3nqUPoHuMdmz4JIZoWV+1Q7C2++OIL7rrrLgoLC+ucL+PJvH6HYuF+EUFaIoK0ZBcbrNo6tQwk1F9uSQkhhDssWbKEdu3aERMTw969e5kxYwY33XRTky5sXEUmFItaxYX6sWDiJfhrai5PDPX3Yd7NvYkJlbRyIYRwh8zMTG677Ta6du3KY489xo033sjHH3/s7mF5BLktJbel6lRpNJGWX8bW47kcPVdMz9gQ+saH0qZFQN1PFkKIBiK3pbyT3JYSjcJHraRdRCDtIuwHuQkhhBCeQm5LCSGEaNKa4Q0Ir+aKv08pboQQQjRJ53fbLSuTSBhvcv7v88LdlJ0ht6WEEEI0SSqVipCQkOpsJH9/f5dtYCcan9lspqysjKysLEJCQuzmbDlCihshhBBNVlRUFIDd8EfR9ISEhFT/vdaXFDceqEhfSXF5JQqFgrAADb4+9a9ezxaUYTCaUCkUROt80dSzL7PZzLliA8YqExqVkkidrEwQQrifQqEgOjqayMhIKiv/l3VXbiynyFAEQIBPAAEaz1jdmV+eT2VVJUqFklDfUFTK+v9890Y+Pj4XdcXmPCluPEil0cSx7BJeW5nC5mM5aNVK/tknhimjOhDr5H4yOcXl7Ekr5K3fDnP4XDEh/j7cPjCem/vHOd1XbomBX/dn8t76o5wrMhAX5sdTo7swtGMLQgM0TvUlhBANQaVSVX8ophWn8eGeD1l1chVV5iqGxQ7jsb6P0UbXxm3FRJGhiL3Ze5mzcw4nCk8Qqg3lzm53ck37a2jh38ItY/Jmss+NB+1zc/RcMf94bzMGo6nG8bgwP766fxCtQhzfdfKnvelMXZZsdXxE5whmXdeD6GDH+io1GJm75jCfbD5l1fb8uK7cMSgejVp+8xBCeIb0knQm/jKRHH1OjeP+an++Hv81rXWtG31MJrOJ3079xvRN063armpzFc9f+jzBvhJj4whHP79ltZSHKDUYeWftEavCBiAtT8+fp/Ic7is1t5RZv6TYbEs6nE2OjSgFe3JKDCzecspm29w1R8hyoi8hhGhIZrOZ9anrrQobgDJjGUtTllJRVdHo48ouy2b2jtk221adWkVOufV4xcWR4sZDFJcb2XzM/ht85b4MjCbrwseWEoOR9MJyu+3JqQUOjyujsPZU8IKyStuNQgjRyMoqy1iXus5u++Yzm6vn4TSm4opicstz7bYfzj/ciKNpHqS48RBKBQT72V/T3yJQg8rBJY4atZLaHurMPBm/OiYga9TyFhJCeAa1Uk2INsRuu06jc8ucGx9V7fu1BGvklpSrySeTh4gI0nL34LZ22ydcGu/w/g0h/hqGd4yw2aZVK+nWyvF5RpE6Syq4LZ1aBhLmLxOKhRCeQavWclvX2+y239ntTkJ9QxtxRBah2lAGRg+02ean9qNtsP2f/aJ+pLjxEAqFgnE9ohnSwXrW/BNXdCIuzPEVTi0Ctcwcn0BsaM1Jw2qlgvcn9CFKZ7tYsSVK58u/7+hnMxX8/QmX0MJO4SOEEO7QLqQdt3e93er4FfFXMCB6gBtGBDqtjhcGvkBL/5Y1jvsofXhv1HtE+kW6ZVzeTFZLedBqKYCcYgOn88pYfSCTQK2aK7tHEaXzRVfLLSt7TueWciC9iD9O5BIb5s/IzhFEB/sSoHWuryqTmfQCPdtP5HI4s5jerUPoExdKTKjjq7eEEKKxFBoKOVd6jrWpa6k0VZLYOpFWga0I8w1z67gySzNJyU1h57mdxOviuazVZbT0b1nnbSvxP45+fktx42HFjRBCCCFsk6XgQgghhGiWpLgRQgghhFeR4kYIIYQQXkWKGyGEEEJ4FQnO9EDZxQZKDJZU8PAADUG+7p9JL6ngQgghmgopbjyI3mDkWHYJr/96iG3Hc9GqlfyjZzRTR3WkTYsAt41LUsGFEEI0JXJbyoOczCvlhoXb2HbckkFiMJpYsfsst//nD07nlrplTKUGIx8mHeP57/dzrsgSkpmWp2fa8mRW7D5DhbHKLeMSQggh7JHixkPkl1Ywf+1Ru6ngf5x0PBXclSQVXAghRFMjxY2HKCqvZNsJ+6mxaw+ec8tVEkkFF0II0dRIceMhFNSeCh7ir0GtdCw405UkFVwIIURTI59MHiI21I+Jl8bbbb9lQBxKZeP/dUkquBBCiKZGihsPoVRaVkYNbGcd7DZ1VAdiQ9wTUimp4EIIIZoaCc70sODMs/llpObpWXMwkwCtmqu6RxEZpCUiyH37ykgquBBCCE/g6Oe37HPjYWJC/YkJ9WdQ+3B3D6WaSqkgLsyfuDB/dw9FCCGEqJPclhJCCCGEV5HiRgghhBBeRYobIYQQQngVKW6EEEII4VVkQrEH8sRUcCGEEKIuZZVlFBoKAdBpdQT4uCf0WYobD+KpqeBCCCFEbcxmM6eLTvPu7ndZn7YegFFxo3jkkkdorWuNQtG4O+zLPjcetM/NwYxC/vnBVqvwzLgwPz6/51Liw6XAEUII4XnOFJ/hlpW3VF+1OS9YG8xX474iJijGJa/j6Oe3zLnxEJ6aCi6EEELUxmgy8v2x760KG4BCQyE/HP+BKlPjBj9LceMhPDUVXAghhKhNSUUJSWlJdts3pG2guKK40cYDUtx4DE9NBRdCCCFqo1aq0Wnt3yLSaXSolY07xVeKGw/hqangQgghRG0CNYFM6jbJbvukbpMI1AQ23oCQ4sZjeGoquBBCCFGX7uHdubbDtVbHr+twHd1adGv08chqKQ9aLQWemQouhBBC1KWgvICM0gzWnF6DAgWXx19OdEA0Ib4hLnsNRz+/pbjxsOJGCCGEELbJUnAhhBBCNEtS3AghhBDCq0hxI4QQQgivIsWNEEIIIbyKBGd6oIxCPfqKKhQKCPXXEOKvqXdfZwvKMBhNqBQKonW+aHxULhyp+5UajBToKwEI9lMTqJUEdSGEaO7cWtwsWLCABQsWcOrUKQC6devGzJkzGTNmjM3HJyUlMXLkSKvjKSkpdOnSpSGH2ihK9JWcyC1l1gWp4FNGdaStk6ngOcXl7Ekr5K3fDnP4XDEh/j7cPjCem/vHERvq30DfQeM6lVPKnNWHWbU/E5PZzOVdWzJjTBfatQho9ARaIYQQnsOtxU1sbCxvvPEGHTp0AOCzzz7jmmuuITk5mW7d7G/6c/jw4RpLwCIiIhp8rI0hNb+MGxduqw7PNBhNrNh9lh2n8lhy96VOFTjbTuQxdVly9Z8Lyip5b/0x/jpbyKzrehAd3LQ3BTyTV8Z1C7aSV1pRfWz1wXNsP5HLT1OHSIK6EEI0Y26dczN+/HjGjh1Lp06d6NSpE6+99hqBgYFs37691udFRkYSFRVV/aVSNf1bLTnF5cxfZz8V/M9TjqeCp+aWMuuXFJttSYezySk21HucnqDKZObHvek1CpvzisqNfPFHKpVVEjIqhBDNlcdMKK6qqmL58uWUlpYyaNCgWh/bp08foqOjSUxMZMOGDXX2bTAYKCoqqvHlaYrLjXWmgpdXGh3qq8RgJL2w3G57cmqBs8PzKCUGI2sOnrPbvv5QFoV6x86VEEII7+P24uavv/4iMDAQrVbLgw8+yHfffUdCQoLNx0ZHR/Pxxx+zYsUKvv32Wzp37kxiYiKbNm2q9TVmzZpFcHBw9VdcXFxDfCsXRaGoOxXcx8FUcI1aSW1TTkID6j9B2RP4qBTo/O2fK52vDz4qt7+1hRBCuInb4xcqKipITU2loKCAFStW8O9//5uNGzfaLXAuNH78eBQKBT/++KPdxxgMBgyG/92KKSoqIi4uzqPiF6qqqli0+RRv/HrIZvu3D13GJfGhDvWVU2Lgyf/bS9KRbKs2rVrJr48MpV1E4ya0utrvR7O5/ZMdNtsW3taXq7pHNfKIhBBCNLQmE7+g0Wjo0KED/fr1Y9asWfTq1Yv58+c7/PyBAwdy9OjRWh+j1WrR6XQ1vjyNSqViXA/bqeBTRrUnKtjx4MwWgVpmjk8gNrTmpGG1UsH7E/oQpdNe9HjdrVsrHRMvbW11/JperejXxrEiUAghhHfyuH1uzGZzjassdUlOTiY6OroBR9R44sL8efP6npwt0LP64DkCtCrGdIsmLEBDdIhzq5vaRQTyxb2XciC9iD9O5BIb5s/IzhFEB/vi7wV7wYQFaHnqys5MvDSeVfszqDKbuapbFDGhfoQFNP3iTQghRP3Vu7gxmUwcO3aMrKwsTKaaK3yGDRvmUB/PPvssY8aMIS4ujuLiYpYvX05SUhKrVq0C4JlnnuHs2bMsWbIEgHnz5tGmTRu6detGRUUFn3/+OStWrGDFihX1/TY8TuvwAFqHBzCofYuL7is+PID48ADG9vCO4u9CIf/d4DChleddiRNCCOE+9Sputm/fzoQJEzh9+jQXTtlRKBRUObgM99y5c9x+++1kZGQQHBxMz549WbVqFVdccQUAGRkZpKamVj++oqKCJ598krNnz+Ln50e3bt1YuXIlY8eOrc+3IYQQQggvVK8Jxb1796ZTp068/PLLREdHW+0GGxwc7LIBNgRHJyQJIYQQwnM4+vldrys3R48e5ZtvvqneWVgIIYQQwlPUa7XUpZdeyrFjx1w9FiGEEEKIi+bwlZt9+/ZV///UqVN54oknyMzMpEePHvj41Fx907NnT9eNsBk6m29J8lYoIEirpkWQ48vAL5RTYqC8sgqVUkFkoBZVPTe3M5lMnMnXYzSb8VEqiQvzjvBNIZqU8kIoL7Ls+ukfBj7y77C5MplN5OhzMJqMaJQaWvjXfxFKRVUFeeV5mMwm/NX+hPiGuG6gbuLwnBulUolCobCaQFzd0X/bnJlQ7C6eOuemoMxAap7eJangxeWVJKcW8NrKlOpU8HsGt+Xm/nFE6pwrltIL9Py6P4OPN53gXJGBuDA/HknsyOD2LZxeoi6EqIcqI+QcgTUvwPF1oPSB7jfCiBkQGu/u0YlGlqvPZdXJVSz6axG55bm0DmrNo5c8yoDoAQRrnZvzmlmayZKDS/jmyDfojXp6RfRiRv8ZdAztiK+6/r9YNxRHP78dLm5Onz7t8IvHx3v2PzZPLW4Ophfyzw+3WoVnxoX5OZ0K/tuBTB5Yusvq+OVdI3nzhl6EORjBkF9qYO6aoyzdbv33P/2qzkwaFO8V++YI4dFyjsJHQ6FSX/N4cCzc/Zvlv6JZKKkoYe6uuXx95GurtucHPs/1Ha9HrXTspkxWWRaT103mUF7NnfFVChVLxyylR0QPl4zZlVy+Q3F8fHz11+nTp4mJialxLD4+npiYGKeKIPE/5wpdlwp+rqicl388YLNtbUoWWUX2QzUvlFtawRd/2P47fX/9Mc4VNe2EcSE8XmUZ/D7XurABKDwDx9Y3/piE2+SW5/LNkW9sts3fNZ/sMuvYHXuOFxy3KmwAqsxVvPXnWxSWF9Z7nO5WrwkYI0eOJC/P+sO2sLCQkSNHXvSgmqPSirpTwcsqHEu6Li6vrDUVfN8Zx9+w6QXlmOxc2yurqCK/rNLhvoQQ9aAvstyKsiflB6h0/BcW0bSlFadhxvYP5eLKYgorHP/5vumM/dDp5OxkyoxlTo/PU9SruDk/t+ZCubm5BAQ4NzdE/JcDqeBalWOp4D6q2lPBQ2pJ1L6Qv0ZVa7tG7fZ4MiG8m1IJvrXMo/APBwdvQ4imL8Cn9s9YjdKxKQcA4X7hdtv81f4oFU3357tT/yKuu+46wDJ5eNKkSWi1/8vwqaqqYt++fVx22WWuHWEz0TrEl4mXxttNBb+lfxwqVe2FxnlhARpGdYlkXUqWVZtWraSrE3EFEUFaIoK0ZBdb337q1DKQUCcKJSFEPQRGwqAp8NM02+0D7geVFDfNRXRANCHaEAoMBVZtCeEJhPo6Hhyc2DqR+bttB1Xf3Plmwnytg5ybCqfKsuDgYIKDgzGbzQQFBVX/OTg4mKioKO6//34+//zzhhqrV1Or1bWmgkcEOR4GGeTrw4vju9lMBf/49r60dKKvuFA/Fky8xOoKTqi/D/Nu7k1MqCxFFaLBdboKOo62Pj70SQhr1/jjEW4T4RfBe6Pew1dVcyVTuG84bwx9w6niJtIvkpcGvWR1PCE8gYldJ+Kjarq/vNYrfuHll1/mySefbLK3oDx1tRTA6dxS0i9IBQ/28yG2HvvKZBTqOZhexLbjubQO92d4J0squEbt2BWg8yqNJtLyy9h6PJej54rpGRtC3/hQ2ji5PF0IcRFKsqHgNKT8ZNnfJuFqCIoGvxB3j0w0MqPJSGZpJjsyd3C84Di9InrRI6IH0QHOhySXVpSSrc9mQ9oGcstzGR4znDbBbYjwj2iAkV88ly8F9yaeXNwIIYQQwjaXZ0v16dPH5iRiW3bv3u1ot0IIIYQQLuVwcXPttddW/395eTkffvghCQkJDBo0CIDt27dz4MABHn74YZcPUgghhBDCUQ4XNy+++GL1/997771MmzaNV1991eoxaWlprhudEEIIIYST6jXnJjg4mJ07d9KxY8cax48ePUq/fv0oLPTsXQ1lzo0QQgjR9Lh8zs3f+fn5sXnzZqviZvPmzfj6el7QVlNTpK+kuLwShUJBWIAGXx/nVjd5usqqKnJKKjCZzPhp1A7nXAnR7EkquFsUGgoprSxFqVASqg1Fq3Z8O43mpqC8gKKKIgB0Gp3bEsbrVdw8+uijPPTQQ+zatYuBAwcCljk3//nPf5g5c6ZLB9icVBpNHMsu4bWVKWw+loNWreSffWKYMqoDsV6yn0xGoZ5Pt5zi8+2nKa2ooldsMDPHdyMhOgg/jWxEJoRNkgruFhVVFRwvOM5bO9/iz8w/0aq0XNP+Gu7tcS/Rgc4vu/ZmJpOJE4UneC/5PTae2QjA8NjhTO0zlXbB7VAqG3e343ovBf+///s/5s+fT0pKCgBdu3blkUce4aabbnLpABuCp96WOnqumH+8t9lmKvhX9w+iVYifnWc2DdnF5dy3ZBd70gpqHFcq4P8eGES/Nk13N0whGpSkgrvFkbwj3LzyZoymmrl+8bp4Phn9CS0DWrppZJ7nVOEpbvv1NgoNNaelBGuD+XzM57QJbuOS13F5KviFbrrpJrZs2UJeXh55eXls2bKlSRQ2nqrUYOSdtUdckgruqU7klFoVNgAmM7z00wHySiVhXAgrkgruFiUVJcxPnm9V2ACcLjrN/tz9bhiVZzJUGfj26LdWhQ1Ybul9d+w7KqoqGnVMTTcVy8sUlxvZfCzHbvvKfRkYTdaFT1Py+xH739/+s0WUGqoacTRCNBGSCu4WpZWl7MjYYbd99anVjTgaz5Zfns/W9K1227embyW/PL8RR+TEnJuwsDCOHDlCixYtCA0NrXVDv7y8pn+VobEp/5sKXqS3/i0BoEWgBpWDmyh6qvBA+xOHfX2UqJRN+/sTokGcTwUvOWe7XVLBG4RCoSBIE0S53nbh2MKvRSOPyHNplBp0Wvu3iHQanVNp5a7g8L+Id955h6CgoOr/d3S3YuGYiCAtdw9uy8s/HbTZPuHS+CZ/zkd0juSVnw9ia5bXTf3iaBEoKxCEsCKp4G4R7hvOhK4T7KZmX93+6kYekecK8wtjQpcJ/Jn5p832CV0mEOrneKCnKzj8L+LOO++s/v9JkyY1xFiaNYVCwbge0axLybK6PfXEFZ2Iq0dwpqdpqdMy98ZePP713hoFTpeoIB4c3h6NWu6SCmHT+VTwoxfcCpFU8AajUqq4uv3VbD67mV3ndtVoe7Lfk7QKbOWmkXmmbuHdGNduHCtPrKxx/B/t/kFCeEKjj6deq6UmTpzIiBEjGD58OJ06dWqIcTUoT10tBZBTbOB0XhmrD2QSqFVzZfcoonS+6PyabvT835VVGMksLGfdoSyyisoZ0TmSjpGBROpkfyQhaiWp4G6Ro88htSiVDWkb0Gl0JLZOJMI/giBNkLuH5nHOlZ7jXNk51pxeA8AV8VfQ0r+lS1eVNWgq+AMPPMDGjRs5cuQIUVFRDB8+nOHDhzNixAi6dOlyUQNvDJ5c3AghhBDCtgYtbs7LzMwkKSmJpKSk6mInMjKSjIyM+nbZKKS4EUIIIZqeBt/nBiAoKIjQ0FBCQ0MJCQlBrVYTFRV1MV0KIYQQQlyUehU3M2bMYODAgbRo0YLnn3+eiooKnnnmGc6dO0dycrKrxyiEEEII4bB63ZZSKpVERETw2GOPcc0119C1a9eGGFuDkdtSQgghRNPToKngycnJbNy4kaSkJN5++21UKlX1hOIRI0Y0uWLH05zNL8NgNKFQgM5XTXigrCQSolFVVUHpOTAZQe0HgRH176tSD2W5YDaDNsjrVjeZTSayS85iNBnxUaqJ0MW5e0gA6I16CsoLAAjSBBGoCXTvgFyssqqS9NJ0TGYTaoWaOA85757ioiYUn7d3717mzZvH559/jslkoqrKs7fR99QrN4VlBk7n6Zn16yG2Hc9Fq1byj57RTBnVkbYtAtw9PCGah+JM2L0Etn8I+nyITIArX4OYfuDr5M+LglTY+Bb89RUYDdBuJIz+F7ToDOqmv71DXkkGG9I2sGD/fzhXdo5WAa2Y3OM+hsYMITTQffMv04rT+HDPh6w6uYoqcxXDYofxWN/HaKNrg0qpctu4XOVs8Vl+O/UbSw4uIbc8l9ZBrXm498NcEnmJ16eVN/hqqeTk5OqVUr///jtFRUX07t2bkSNH8tZbb9V74I3BU4ubg+mF/PPDrTZTwZfcfakUOEI0tNJc+OFhOLLKuu2WL6HLOMf7KjwDi8da9qb5O7UvPLAJIjpf3FjdTF9ewKK/FrHo4BKrtmk9HuCO7pPQuuFqSXpJOhN/mUiOvuZmqP5qf74e/zWtda0bfUyulFWaxXt73uP7Y99btU3vP50bO92Ir9p7r/Y36Gqp0NBQBgwYwBdffEHHjh1ZsmQJeXl57Ny50+MLG091rrCc+euOenUquBAerzjddmED8OsMKHJim4vTW6wLGwBjOSS9ARWl9Rujh8gtz2Nxypc22z46+Ck5ZdmNPCIwm82sT11vVdgAlBnLWJqytNHTqV2tqKKIH479YLNtwZ4FZJZmNvKIPFO95twsXbqUYcOG1XnV48yZM7Rq1QqlUrbVr0tphZFtJ3Lttq89eI5/9IzGXyMZMkI0mPRaVnsWpkFFMeDAZf8qIxz43n77iQ1QXgiapns1Nlefi9FsO+jXUGUgrzyPGNo26pjKKstYl2o/QX3zmc080OMBWvg33dDL1KJUzNi+4VJcWUxRRVEjj8gz1avq+Mc//uHQ7ZyEhAROnTpVn5dofv6bCm5PiL8GrappB2cK4fFqC/dTKMHRZGOFEgJqmYTsGwJNfO6HRlX7udCqGj8IV61UE6INsduu0+ia/JybgDoK4rr+XpqLBr2k4oK5ys1G6xBfJl4ab7f9lv5xqFRN+x+lEB4vqqdlTowtna6CgHDH+lEqod/d9tsHPgwBkc6Pz4OEa8OIDrB9FSteF09oLUVGQ9GqtdzW9Ta77Xd2u5NQ38ZNp3a1lv4t7RZwCeEJknn1X3K/yEOo1WrG9YhmYLswq7Ypo9oTEdT4vwUJ0ewERcPNn4Pygtu/IfFw1SzLUm5HhbaBkc9ZH2830hJ6qWjaV2Ijg+OYN2wOgT41Jw3rNDrmDp1NhC7WLeNqF9KO27vebnX8ivgrGBA9wA0jcq1o/2jmjpiLr6pmER7uG86rl71KTGCMm0bmWVyyFNyeoKAg9u7dS7t27RrqJerFU1dLAZzOLSW9QM/qg+cI0KoY0y2aYD8fYsP83T00IZqHynLLxOJjayE/FdoOhageoGvlfF/6QktfKT+DoRi6joPQthDYtK/anGeqMpJRcobdmX9yKP8ICWFd6dPyEqKDWqNw41zLQkMh50rPsTZ1LZWmShJbJ9IqsBVhvta/PDZF+ko9mWWZbE/fzsnCk/SI6EHPiJ7E6+xf/fcWjRKcWRcpboQQQgjhKo0SnFkXRRO/7CqEEEKIpkcmFAshhBDCqzTopikHDx6kVat63KcWQgghhKgnh4ub6667zuFOv/32WwDi4iTISwghhBCNy+HiJjg4uCHH0eTllxooKKvEDARoVLQM9qt3X9nFBkoMlSgUCsIDNAT5Nv2APSGaFFemgpcXQVmOJRVcEwhBLV03Tg9gNpvJ1mf/NxXchwj/izhXHqrQUEhpZSlKhZJQbShatfu35jCZTeToczCajGiUmovadbmiqoK88jxMZhP+an9CfENcN1A3cbi4Wbx4cUOOo0k7kV3Cu+uO8stfmVSaTAzt0IIZY7rQLtwfP63jhYneYORYdgmvX5AKPnVUR9pIaKYQjcOVqeC5x2HTW3DgW0sqeNvhcMXL0KILaOr/C5CnyCvPY0PqBhbsXfC/VPA+kxkaM7TJb5YHlg/94wXHeWvnW/yZ+SdalZZr2l/DvT3udWv6dq4+l1UnV7Hor0XVqeCPXvIoA6IHEKx17kJEZmkmSw4u4Zsj36A36ukV0YsZ/WfQMbRjkw7gbNCl4J7KlUvBT2aXMOHff5BRWF7juJ+Piu8nD6ZzlOObfh3MKOSfH9hOBf/8nkuJD5cCR4gG5cpU8LwTsORa26ng962Dlt0vaqjupjfqWbRvEYv+WmTVNq3PNO5IuMMjrnBcjCN5R7h55c0YTTUztOJ18Xwy+hNaBjT+VbiSihLm7prL10e+tmp7fuDzXN/xetQXbkJpR1ZZFpPXTeZQ3qEax1UKFUvHLKVHRA+XjNmVGnwp+DfffMNNN93EwIEDueSSS2p8NSdJR7KtChsAfWUVCzceJ7/U4FA/+aUVzF9rPxX8j5OSCi5Eg3NlKvipzbWkgs+2XBVqwnL1uSzeb/uK/kf7PrKZzN2UlFSUMD95vlVhA3C66DT7c/e7YVSQW57LN0e+sdk2f9d8sp1IYz9ecNyqsAGoMlfx1p9vUVheWO9xulu9ipt3332Xu+66i8jISJKTkxkwYADh4eGcOHGCMWPGuHqMHqugrIKkw/bfSFuO5VBQVulQX0XllXWmglcYq5weoxDCCQ6lgjvAaIDDv9pvP/W7VxQ3taaCG5r2L2SllaXsyNhht331qdWNOJr/SStOqzUVvLDC8YJk05lNdtuSs5MpM5Y5PT5PUa/i5sMPP+Tjjz/m/fffR6PRMH36dNasWcO0adMoLGy6lZ6zNGolOj/7l/+C/XxQKR3byFBB3angagf7EkLUk8tSwdXgV8tW/74hoGjaQbh1poIrm/YtKYVCUWsIZQu/+k/gvRgBPnWkgjv6HgXC/ewHwfqr/VEqmm78ZL1GnpqaymWXXQaAn58fxcWW32Zuv/12li1b5rrReTh/jZqJA+xnedw2MJ7WDs6TiQ31qz0VfEAcSjdmtQjRLLgqFVylgr532m/vfw8EN+2tMsL9wmtPBW/iE4rDfcOZ0HWC3far21/diKP5n+iA6FpTwZ0574mtE+223dz55iadxVWvT8uoqChycy23UOLj49m+fTsAJ0+ebHa7ErcO8+PeIW2tjg/r1IJRXRwPx1MqLSujbKWCTx3VgdiQpr+yQgiP58pU8JDWMPRJ6+NthkHCNdDEf1mJ9I9k3sh5tlPBh89t8kvCVUoVV7e/mr4t+1q1PdnvSVoFumeD2gi/CN4b9Z7NVPA3hr7hVHET6RfJS4NesjqeEJ7AxK4T8VE13W1I6rVa6t577yUuLo4XX3yRhQsX8vjjjzN48GB27tzJddddxyeffNIQY3UZVwdnns3Xk1dWwa9/ZWCorGJ0tyiiQ/xoXY8k77P5ZaTm6VlzMJMArZqrukcRGaQlIqjpLskToklxZSp48TkoOQcpP4KhxLLaKrQNhDTtqzbnmcwmMkoz2H1uN4fyDpEQnkCfyD5EB0R7TbZgjj6H1KJUNqRtQKfRkdg6kQj/iFpvWTU0o8lIZmkmOzJ3cLzgOL0ietEjoofdK2m1Ka0oJVufzYa0DeSW5zI8Zjhtgtt4bHHaoKngJpMJk8mEWm357eb//u//2Lx5Mx06dODBBx9Eo3H8np87SCq4EEII0fQ0aHHT1ElxI4QQQjQ9jn5+1zs4Mz8/n08++YSUlBQUCgVdu3blrrvuIiys6U5AEkIIIUTTV68ZbRs3bqRt27a8++675Ofnk5eXx7vvvkvbtm3ZuHGjq8cohBBCCOGwet2W6t69O5dddhkLFixApbLs1VBVVcXDDz/Mli1b2L/fPTs3OkpuSwkhhBBNT4POufHz82PPnj107ty5xvHDhw/Tu3dv9Hq98yNuRA1R3BTpK8grtaSCB2lVtLiI1U0ZhXr0FVUoFBDqryHEv/4TtHNKDJRXVqFSKogM1KJSNe3lp8ILleVCRZllk7zASLiY5afFmVBVAUofCIqC+q7YMVZA0VkwV4FKe3Grm8ryQZ9nSQX38Yfg+i8hLjYUU1JZAgoI0Ybgp76ILSJKs6FSD0oVBLQEVf1mKRiNRtLL0qkyV6FESXyw/f26GpPeqKegvACAIE0QgZrA2p9Qi8zSTMqN5ShQEOobik5b/8+NXH0uhioDKoWKFn4tUCnrt5mj0WQkozSDKlMVPkofYoJi6j2mpqRB59xccsklpKSkWBU3KSkp9O7d2+F+FixYwIIFCzh16hQA3bp1Y+bMmbVGOGzcuJHHH3+cAwcO0KpVK6ZPn86DDz5Yn2/DZeylgneICEDr4/gpLtFXciK3lFkXpIJPGdWRtk6mgheXV5KcWsBrK1M4fK6YEH8f7hnclpv7xxGpk2XlwgNUlELmflj1NKTvBk0g9LsHBj7o/LLrsjw4vg7W/wvyT1n2qxk+HbqMh0Anl7QWpMKuz2DnJ/9LBU98EWIusRRfzsg9Bpvm1EwFv/xlaNERtI5/2BpNRk4WnuTtnW+zNX0raqWasW3H8lCvh5z/UDOUWM73b89C5l+W3ZIvfQD63W0pCJ1wtuQsG9M28p/9/6lOBb+v530MjB5IbFCsc+NyobTiND7c8yGrTq6iylzFsNhhPNb3Mdro2jhVTBRXFHOy8CTv7HqHned2olVpGdt2LPf2uJfWutZOjanIUMTe7L3M2TmHE4UnCNWGcme3O7mm/TW08Hdut+OMkgxWnVrFZwc+q04Ff7j3w/Rv2Z/IACffo16qXlduvvrqK6ZPn87UqVMZOHAgANu3b+eDDz7gjTfeoGvXrtWP7dmzp91+fvrpJ1QqFR06dADgs88+46233iI5OZlu3bpZPf7kyZN0796d++67jwceeIAtW7bw8MMPs2zZMq6//nqHx+/KKzenckq5ddF216SCpxfyzw9tp4IvuftSpwqc3w5k8sDSXVbHL+8ayZs39CIswLOX64tm4PQ2+HSM5YrG38X0syRwBzmYuGw0wI6PYfXz1m0DJ8PI50Dr4L+dwrPw0zTLHjcXumExdL/OsX4Aco/D0n/aTgW/dx1EOZ4KfrLwJDf9dBPlVTV/zkQFRLHkqiVEBzqxv8nRNfDFDdbH242E6/8NAY590OaW5bL4wGI+O/iZVdsDPR/gtq63EeIb4vi4XCS9JJ2Jv0y0Cu70V/vz9fivnSpKDuQc4LZfb7OZCv5h4ocO92Uym/jt1G9M3zTdqu2qNlfx/KXPE+wb7FBfufpc5u2ex/fHvrdqm95/Ojd1vgmtqmlHX9SmQVPBb731VtLS0pg+fTrDhg1j2LBhTJ8+ndOnT3PrrbfSp08fevfuTZ8+fWrtZ/z48YwdO5ZOnTrRqVMnXnvtNQIDA6t3PL7QwoULad26NfPmzaNr167ce++93H333cyZM6c+34ZLbDicVWsqeJG+wqF+corLmb/Ofir4n6ccD6E7V1TOyz8esNm2NiWLrCLr8QrRqEpzYNUM68IG4OxOyDvheF8l52DD67bbdiyE0izn+rJV2ACsmQl5pxzvq7ZU8I2zLefAAXqjnn//9W+rwgYst0u2ZWxzfEzF5+CXp2y3ndgARWcc7qqwopAvUr6w2fbpgU/JNzR+MKjZbGZ96nqbieRlxjKWpiylosqxn8nZpdm8n/y+/VTwHMfnlmaXZTN7x2ybbatOrSKn3PEE9XxDPj8c+8Fm24I9C8gszXS4L29Wr+Lm5MmTtX6dOHGi+r+OqqqqYvny5ZSWljJo0CCbj9m2bRujR4+ucezKK69k586dVFbaT982GAwUFRXV+HKF4vLKOlPB8x1MBS8uN9aZCl5eaTuB19a40m0UXOftO9N8wk2Fh6oogYy99tuPr3e8r7I8qLSTXmyqgqJ0x/s6s9N+mzOp4JV6OLLKfvup3+G/80HqUlxRzNb0rXbb15xeg8FocGxcFcWQf9J+e+ofjvUD5JbXkQpe3vip4GWVZaxLXWe3ffOZzRQZHPv5X2YsY+c5+++HpLQkh8dVXFFMbrn9n++H8w873FdqUWrtqeAG+fkO9ZxzEx/vugljf/31F4MGDaK8vJzAwEC+++47EhISbD42MzOTli1rXqpu2bIlRqORnJwcoqNtX5qdNWsWL7/8ssvGfJ6PSlFnKrijSd4KheXxRXrbPyxC/DX4ONiXj0qJQmH7l2JLX003L0R4CYXKcnvGaKcID3Binoy6jkvwGidiUPxr2adLobRMLnaE0qfuVHAHf7dUKVQEaYJsXo0Ay8Rih+eRKNWWCcSmKtvtTsz9qOvWhztujaiVaruhkmDJvXL4XCksE5HL9bbfo87ccqsroylY49gtKcAqy+tC3nxLyhn1XjqzdOlSBg8eTKtWrTh92nLpdd68efzwg+3LZfZ07tyZPXv2sH37dh566CHuvPNODh48aPfxF+aVnJ8yVFuOyTPPPENhYWH1V1pamlNjtMfXR11rkvftA+OJCXXsB2tcXang/eOql93XJSxAYze0U6tW0rWVLH8XbhYYAb1vs92mUEAH+2nFVvzDIaKL7bagKAh0cO4OQHQv+6ngHa6ovfj5O5Ua+t5hv73/3ZYwTgeE+4VzR4L9vm7tcivqC4M+7QmIgK520qxVPhBrHRJpT7AmuNZUcJ2m8X/OaNVabutq530F3NntToeDJaP9o7mhk425Sf81vt14h8cVqg1lYPRAm21+aj/aBluHL9sTFRBVayp4sNbxQsmb1au4WbBgAY8//jhjx46loKCAqirLbwEhISHMmzfPqb40Gg0dOnSgX79+zJo1i169ejF//nybj42KiiIzs+b9xKysLNRqNeHh4XZfQ6vVotPpany5Sttwf+4baicVvKvjs9ZVKhXjethOBZ8yqj1RwY6vcAry9eHF8d2IDa25TFStVPDx7X1pGSSVvXAztS8MfRwiL1g4oFDAPz+CQCdW7QRGwo2fWhcemkC4ZZll5ZSjdK3ghv/YTgW/8jWHJ9ta+oqBoU9YH28zDLpeAw7+sgIwInYEw2KGWR2/v+f9zq3a0QTAFa9AWLuax5UquHGJU+c9PjieOcPn2EwFnz10ttOriVylXUg7bu96u9XxK+KvYED0AIf70ag1XN3+avpEWM8dndpnKhF+jl9d1Gl1vDDwBVr61yy0fZQ+vDfqPSL9HP+siPaPZu6IuTZTwV8d/CpRAc6tePNW9VotlZCQwOuvv861115LUFAQe/fupV27duzfv58RI0aQk+P45KgLJSYmEhcXx6effmrVNmPGDH766acaV3Yeeugh9uzZw7Ztjk+qc/U+N+eKyskuNvDLfksq+JXdoogJ8Scm1Pk9KFJzSzlboGf1wXMEaFWM6RZNWICG6BDn+8oo1HMwvYhtx3NpHe7P8E4RRAf7olHXb18FIVyuOAOyDlsm8Qa1hE5jQBdt+RB2VkEanNkBZ3ZZViLFD4bgWMsHtzPKiy2p4EdXW/psMwSie1rSvJ1VeBbKcuDgj5al713GQkjrevWVV57HmeIzrE9dj6/Kl8vjLyfSP7J+e64UpVuW4Z/cZNnDp8MVlsLOx7ltIiqMFaSXprPz3E6O5B2hS3gXLom8hNiA2OpgZXcoNBRyrvQca1PXUmmqJLF1Iq0CWxHm63w80JniM5wpPkPSmSQCfQK5PP5yQrWhtAxw4orgf2WWZpKSm8LOczuJ18VzWavLaOnfss7bVhcyGA1klGawLWMbJwtO0jOiJz0jerqtoGxMDb6J36FDh4iPj69R3Bw9epSePXs6vInfs88+y5gxY4iLi6O4uJjly5fzxhtvsGrVKq644gqeeeYZzp49y5IlS4D/LQV/4IEHuO+++9i2bRsPPvigW5eCCyGEEKJxNOgmfm3btmXPnj1WE4t//fVXu5OBbTl37hy33347GRkZBAcH07Nnz+rCBiAjI4PU1NQar/vLL7/w2GOP8cEHH9CqVSveffddpwobIYQQQni3ehU3Tz31FJMnT6a8vByz2cyOHTtYtmwZs2bN4t///rfD/XzyySe1ttu6NTV8+HB2797t7JCFEEII0UzUq7i56667MBqNTJ8+nbKyMiZMmEBsbCzz58/nlltucfUYhRBCCCEcVq/iRq/XM3HiRO677z5ycnI4ceIEW7ZsITbWfVkiQgghhBBQz+Lmmmuu4brrruPBBx9ErVZz9dVX4+PjQ05ODnPnzuWhhx5y9TiblSJ9JcXllSgUCsICNPj6yOomIRySexzMJsuGe8HxUN8VO1VVUHoOTEZQ+zkfvvl3lXpL8rnZDNog8Aupf18eyGQykV6ajtFkRK1UuzUwU4jz6vUvf/fu3bzzzjsAfPPNN7Rs2ZLk5GRWrFjBzJkzpbipp0qjiWPZJby2MoXNx3LQqpX8s08MU0Z1INbBzQCFaJbyT1mynDa99b9U8MumWZZeO7vsujgTdi+B7R/+LxX8ytcsgZ6+Tq6uLEiFjW/BX19ZAj7bjYTR/4IWnUHd9HcKzyzNZEPaBj7565PqVPD7e97P4JjBst+KcKt6LQX39/fn0KFDtG7dmptuuolu3brx4osvkpaWRufOnSkrs5Pz4iE8dSn40XPF/OO9zTZTwb+6fxCt6rHXjRBerzQfdn0C61+1bhtwHwx5wrJ3jkN95cIPD9vOhbrlS+gyzvFxFZ6BxWNtp4I/sAkiOjvelwcqMhTx8V8f89kB61TwB3s+yKRukwioz35FQtSiQVPBO3TowPfff09aWhq//fZbdZhlVlaWRxULTUmpwcg7a4+4JBVciGalLBt+f9t2287/gINBiYBl8z57gZe/zoCiDMf7Or3Ffip40huWTf2asNzyXL44aDsVfPGBxWTr7YcKC9HQ6lXczJw5kyeffJI2bdpw6aWXVqd4r169mj59rLeqFnUrLjey+Zj9nZ1X7svAaLIufIRo9vT5taeCF551vK/0ZPttzqSCVxnhwPf2209sgPKmnd6co8/xuFRwIc6r15ybG264gSFDhpCRkUGvXr2qjycmJvLPf/7TZYNrTpR1pIK3CNSgqiUcVIhmq85UcCdujfjVEqqoUIJS41g/CmXtyea+Ic7HQngYT0wFF+K8eqeCR0VF0adPH5TK/3UxYMAAunSxk84rahURpOXuwfaTYSdcGl9r8rkQzZZvcO2p4AH2Q3WtRPW0nwre6SrH+1Iqod/d9tsHPgwBjocleqJQ39BaU8HtJVcL0RjqXdwI11IoFIzrEc2QDtapw09c0Ym4MFktJYRNYW3huo9tp4Lf+Bno4m0/z5agaLj5c9up4FfNsizldlRoGxj5nPXxdiMh4WpLAnoTFhcUZzcV/M2hbxITFOOmkQlRz9VSTZ2nrpYCyCk2cDqvjNUHMgnUqrmyexRROl90fk1/2agQDSr3GKT+Ael7oGUXaDMMgmJB6+Qqw8pyy8TiY2shPxXaDoWoHpbUbGfpCy19pfwMhmLoOg5C20Jg075qc57RZORsyVl2Zu7kcN5huoR3oW9kX+KC4mpc1RfCVRo0Fbyp8+TiRgghhBC2NehScCGEEEIITyXFjRBCCCG8ihQ3QgghhPAqUtwIIYQQwqvUMzJXCCFcpCwXKsosG98FRoLqIlYG5p4Ac5Wlr5A2oKrnRnkuTAU3GIrJL8/DhJkgdQBBtW3u1wSZzWay9dkYTUZ8lD5E+Nf/+zNWGckpz8FkNuGn9iPUt5ZNFetQZCiiwFAAQKBPIGF+YbU/oRaFhkJKK0tRKpSEakPR1rVxZC1y9bkYqgyoFCpa+LVA5QGbOVZUVZBXnofJbMJf7U+Ib4i7h3TRpLgRQrhHRSlk7odVT0P6bsu+NP3ugYEPOr/suiAVTm6ykQr+Dwht7VxfLkwFP1t4mo/3fcTPp36jwlTBoKhLebLvY7TTtUetsbNZYBOSV57HhtQNLNi7oDoVfHKfyQyNGep0YZJVlsWyQ8tYfmg5JZUlJIQlMH3AdLqGdcXfx7l9vk4WnuTDPR+y9vRaqsxVDIkZwiOXPEI7XTt8nEhjr6iq4HjBcd7a+RZ/Zv6JVqXlmvbXcG+Pe4kOdDCM9b+KDEXszd7LnJ1zOFF4glBtKHd2u5Nr2l9DC3/r/c0aS2ZpJksOLuGbI9+gN+rpFdGLGf1n0DG0I772NrRsAmQpuCwFF8I9Tm+DT8fAhT+CYvpZEriDWjrWj74Q/lxkPxV86HQIcnBfGRemgmcWpjJp7f2cLamZbaVVafm/sV/QLqxpp4LrjXoW7VvEor8WWbVN6zONOxLucPgKR64+lyeSnmBX1q4axxUoWDR6EZdGX+rwuFKLUrlz1Z3k6Gtm9fmr/Vk2bhntQto53NeRvCPcvPJmjKaasTjxung+Gf0JLQMce4+azCZ+O/Ub0zdNt2q7qs1VPH/p8wT7Bjs8LlfJKsti8rrJHMo7VOO4SqFi6Zil9Ijo0ehjqossBRdCeK7SHFg1w7qwATi7E/JOON5XSVbtqeDl+Y735cJU8J2ZO6wKG7CESi7YuxB9eYHj4/JAufpcFu9fbLPto30fWRUXtTlTcsaqsAEwY+aNHW+Qq891qB+TycTa02ttvnaZsYylB5dSZi9k9QIlFSXMT55vVdgAnC46zf7c/Q71A5Bdls3sHbNttq06tYqccsfPlSsdLzhuVdgAVJmreOvPtyhswuGuUtwIIRpfRQlk7LXffny9433p8zwuFdxorGD12U1227dm7qDI0HQ/OMBS3NSaCm5wPBX8z8w/7bYdKzjmcEFSaCjk97O/223fnrHd4bTy0spSdmTssNu++tRqh/oBKK4oJrfcfoF2OP+ww3250qYz9t+jydnJlBkdO++eSIobIUTjU6jsB1RC7YnaF/LAVHClQkWYxv5tBp1Wh0rh/omkF0Ojqv1caJWOT7oN1do/7z5KH4cn3WpUGnQa+7cqdBod6gtzw+xQKBQEaexnibXwc3yejE8dk+SDa3mvNKRwP/tBsP5qf5SKplsiNN2RCyGarsAI6H2b7TaFAjokOt6XX0gdqeBOTNZ0USq4UqXipo7X222/o+PNhAfWI6vKg4T7hdeaCu7MhOL+Uf3tFnvj2o0jzNexlU4BmgBu6XKL3fZbu9xKVECUQ32F+4YzoesEu+1Xt7/aoX7AUrwNjB5os81P7Ufb4LYO9+VKia3t/zu7ufPNDp93TyTFjRCi8al9YejjENmt5nGFAv75EQQ69gEEWNK3a0sFD2njeF8uTAWPDWzF5O73WR0fFNWfy9tcgaKJB0tG+kcyb+Q8m6ngc4fPdWpJeKR/JLOHzba6UtAuuB0P93rYqVU7bYPbcnPnm62Oj4gdwYDoAQ73o1KquLr91fRt2deq7cl+T9LKieJUp9XxwsAXaOlfcwKyj9KH90a9R6Sfe4JUI/0ieWnQS1bHE8ITmNh1Yp1XnDyZrJaS1VJCuE9xBmQdtiRwB7WETmNAF+3craTzbKWCB7cGHyf3JHFhKnhRaTZZ5TmsO72W0spSRrUeRVxgLOFBTfuqzXkms4mM0gx2n9vNobxDJIQn0CeyD9EB0SgUCqf60lfqydZns/HMRs6VneOy6MvoENqBSH/nP/izSrPI1mez5vQaKk2VXB5/OVH+UU4v3wbI0eeQWpTKhrQN6DQ6ElsnEuEfUestK3sySzNJyU1h57mdxOviuazVZbT0b+nWIqK0opRsfTYb0jaQW57L8JjhtAluc1H7FTUkSQWvhRQ3QgghRNMjS8GFEEII0SxJcSOEEEIIryLFjRBCCCG8ihQ3QgghhPAqEpwpRHNhNFhiD8wmyzJp//onLruUK1PBizOhqgKUPpY9bpxcsVPNhangLlVeCOVFlu/LPwycDJRsCK5MBddX6MnSZ2HChEalISYwxoUjFc2JFDdCNAeFZ2DLfEheCpV6aH0ZXPW6JfHawXBDl3NlKnhZHhxfB+v/9b9U8OHToct45wsTF6aCu0yVEXKOwJoXLN+n0ge63wgjZkBovHvGhGtTwc8Un2HZoWV8e/Tb6lTwx/o+RoeQDm5NzRZNkywFl6XgwtsVZcDSayH7goA8pRru2wDRPd0yLJelghsNsONjWP28ddvAyTDyOdA6uG+OC1PBXSrnKHw01FKY/l1wLNz9m+W/jcyVqeBnis/w9O9Psze7Zt6YAgUfJn7IkNghLhmzaPpkKbgQwiJzn3VhA5ZbLmtmgr6g0Yfk2lTwc7DhddttOxZCaZbjfbkwFdxlKsvg97nWhQ1YrsgdcyJk1IVcmQqeUZphVdiAJRX87V1vc6b4TL3HKZonKW6E8HaHfrbfdmqT5fZQY3NlKnhZHangRemO9+WiVHCX0hdZbkXZk/KDZVflRubKVPAdmfbTt48VHKPc2Pjfn2japLgRwtsF1LJ9vW9w/SfdXoxGTQV3YtKti1LBXUqptPw92eMfbp2F1QhcmQoeog2x2+ZMKrgQ50lxI4S363GD/bb+90OAg3NbXMmVqeD+4bWnggc68f25KBXcpQIjYdAU++0D7gdV4xc3rkwFHxg90G4q+FVtrnJ6crIQUtwI4e10sTDmTevjsQOg7yRQueG3YlemggdGwo2f2k4Fv2WZZeWUo1yYCu5Sna6CjqOtjw99EsLaNf54cG0qeKg2lFcHv2qVCt42uC0P9nqw1is7Qtgiq6VktZRoDgzFlgTuQystc1Q6j4Gw9o6vSGoorkwFL0iDMzvgzC6I6g7xgy2riJy9peHCVHCXKsmGgtOQ8pNlf5uEqy3FmF+I24bkylTwPH0e+YZ81qetJ6csh4HRA2kf0p7WutYNNHrRFEkqeC2kuBFCCCGaHlkKLoQQQohmSYobIYQQQngVKW6EEEII4VWkuBFCCCGEV5HgTCGaC09NBS88C0a9ZWO/oCjw8XP3iKgyVZGjz6HKXIWvypcwv7C6nyREIzKZTeToczCajGiUGgkXvYAUN0I0B56YCl6WD+f2W/KtzqeC97kdBj7k1qTr7LJsvj36LUsOLqGoooiOIR15qv9TdG/RnSCNm/a5EeJvcvW5rDq5ikV/LSK3PJfWQa159JJHGRA9gGBtLbtZNyOyFFyWggtv56mp4Cc2wdKrrcMzW10CN34GoY2/v0l+eT4vbHmBjWc2WrXNHzmfUa1HNfqYhPi7kooS5u6ay9dHvrZqe37g81zf8XrUbojjaCyyFFwIYeGJqeCFZ2DN87ZTwdN3Q74TqeAulFWWZbOwAXhjxxtklTmRMC5EA8gtz+WbI9/YbJu/az7ZZdmNPCLPJMWNEN7OI1PBy+pIBa8lBbsBHcg5YLctozSD0ko3nCsh/iatOA0ztm+4FFcWU1hR2Mgj8kxS3Ajh7TwxFVxZRyq4E7lErlTbfAWlQunVl/tF0xDgU3s0icYdyfUeSIobIbydR6aCR0LPm2y3KRS2QyIbQZewLmhVtidYD4sdRqjWQ1aYiWYrOiDabpBoQniCJKj/lxQ3Qng7T0wF1wbBkCcsq7X+TqGA8e/WfrWpAUX4RzBvxDzUippXaGICY5jRfwaBmkA7zxSicUT4RfDeqPfwVdW88hnuG84bQ9+Q4ua/ZLWUrJYSzYGnpoLnn7ZMdj62znI1p8s4CGwJ/u7bV8ZQZSCrLIvNZzZztvQs/aP60yW0Cy3dcYVLCBuMJiOZpZnsyNzB8YLj9IroRY+IHkQHRLt7aA1OUsFrIcWNEEII0fTIUnAhhBBCNEtS3AghhBDCq0hxI4QQQgivIsWNEEIIIbyK7EglhHBeaS6UF1j+3y/McxLGizOhqgKUPpaEcXdsUHihSj2U5VqiJrRB4Bfi7hEBkFeeR7mxHJVCRbhfeL03KDSbzWTrszGajPgofYi4iA0YjVVGcspzMJlN+Kn9LmpZs96op+C/79EgTZAs429m3FrczJo1i2+//ZZDhw7h5+fHZZddxuzZs+ncubPd5yQlJTFy5Eir4ykpKXTp0qUhhyuEqDJCzmFY9yoc/Q0USsvy7ZHPQYT9f7cNrizPEtmw/l+QfwqComH4dOgyHgLds9sxAAWpsPEt+OsrMBqg3UgY/S9o0RnUPm4ZUmlFKftz9/PWn29xOP8wOo2OCV0ncFOnm5wuTPLK89iQuoEFexdwruwcrQJaMbnPZIbGDHW6MMkqy2LZoWUsP7ScksoSEsISmD5gOl3DuuLv4+9UX2nFaXy450NWnVxFlbmKYbHDeKzvY7TRtUGldMO+TqLRuXUp+FVXXcUtt9xC//79MRqNPPfcc/z1118cPHiQgADbW0yfL24OHz5cYxlYREQEKgc3I5Ol4ELUU/YR+ORyKL8gvyagBdy9GsLbN/6YjAbY8TGsft66beBkS+GlrX3L+gZReAYWj4WC0zWPq33hgU1uKwZ/P/M7D6972Or4oOhBvDHsDcJ8HdtjSG/Us2jfIhb9tciqbVqfadyRcAdate3dni+Uq8/liaQn2JW1q8ZxBQoWjV7EpdGXOtQPQHpJOhN/mUiOPqfGcX+1P1+P/5rWusZPmxeu0ySWgq9atYpJkybRrVs3evXqxeLFi0lNTWXXrl11PjcyMpKoqKjqL0cLGyFEPVWUwZ8fWxc2AKU58Nc3UFXV+OMqOQcbXrfdtmMhlLopyfv0FuvCBsBYDklvuCWwNLssm9d32D5X2zK2kVma6XBfufpcFu9fbLPto30fWRUXtTlTcsaqsAEwY+aNHW+Qq891qB+z2cz61PU2X7vMWMbSlKVUVFU4PC7RdHnUhOLCQssPzbCwun9z6NOnD9HR0SQmJrJhw4ZaH2swGCgqKqrxJYRwUlkOnNhov/3YGsvcksZWlgeVZbbbTFVQlN644wHL7bsD39tvP7HBdpHYwEorSzlTfMZu+56sPQ73lavPxWg22mwzVBnIM+Q53NefmX/abTtWcIwye3+/FyirLGNdqv1E+c1nNlNkkJ//zYHHFDdms5nHH3+cIUOG0L17d7uPi46O5uOPP2bFihV8++23dO7cmcTERDZt2mT3ObNmzSI4OLj6Ky4uriG+BSG8m9LHkiJuj1+Ie+aR1HXrQ+PcfA2XUCghoJb5K74hlmT0RqZWqlEp7L+uM/NkNKra06e1SsduSQG1BpL6KH0cniejVqrthkoC6DQ6mXPTTHhMcTNlyhT27dvHsmXLan1c586due+++7jkkksYNGgQH374IePGjWPOnDl2n/PMM89QWFhY/ZWWlubq4Qvh/XTRMOB+++397wM/N6ya8g+HCDuLCYKiLFlVjU2phH53228f+LBbwkHDfMO4PP5ym21qpZoeLXo43Fe4X7jdLKN4XbxThVL/qP52i65x7cY5PA9Iq9ZyW9fb7Lbf2e1OCZZsJjyiuJk6dSo//vgjGzZsIDY21unnDxw4kKNHj9pt12q16HS6Gl9CiHpoPQi6XmN9vM8d0LJb448HLIGbN35qHbapCYRblllWTrlDaBvLZOYLtRsJCVe7ZZm6v48/j/d9nLigmlevVQoVc4fPdWq1VKR/JPNGziPQp+YSa51GV6++Zg+bjVJR8yOpXXA7Hu71ML5qXzvPtNYupB23d73d6vgV8VcwIHqAw/2Ips2tq6XMZjNTp07lu+++IykpiY4dO9arnxtuuIG8vDzWr1/v0ONltZQQF6HwDBSdhYM/glJt+aAOjIbgVu4dV0EanNkBZ3ZBVHeIHwzBsW65/VNNXwjF6ZDysyWZves4CG1rKcjc6FzpOY7kH+GPzD9oFdCKITFDiPSPdKqIADCZTWSUZrD73G4O5R0iITyBPpF9iA6IRuFk8aav1JOtz2bjmY2cKzvHZdGX0SG0A5H+zp+rQkMh50rPsTZ1LZWmShJbJ9IqsJXDV4CE52oSqeAPP/wwX375JT/88EONvW2Cg4Px8/MDLLeUzp49y5IlSwCYN28ebdq0oVu3blRUVPD555/zxhtvsGLFCq677jqHXleKGyGEEKLpcfTz262b+C1YsACAESNG1Di+ePFiJk2aBEBGRgapqanVbRUVFTz55JOcPXsWPz8/unXrxsqVKxk7dmxjDVsIIYQQHsytV27cRa7cCCGEEE1Pk9jETwghhBDC1aS4EUIIIYRXkVRwIZqLihIoyQZzFfgEWPatqS9DMegLLP/vF+ae7CYhhLBDihshmoO8k7BlPuxbDpV6aD0QrngVIhNAG1j3888zmSD3GKx7CQ7/atmJN+EaGPU8hLVrsOELIYQzZEKxTCgW3i7vFCy7CbIP1zyuVMM9qyGmrxN9nYSPh9tOBb9vA4RI4rIQouHIhGIhhEXmPuvCBsBkhLUvQ/E5x/oxVsCORfZTwfd/a7myI4QQbibFjRDe7sgq+22nN9tP1L5QeaEl+dueQ//dhVcIIdxMihshvN2FmUt/V1vK94WU6jpSwcNAJdP4hBDuJ8WNEN6ux0322y6ZBLoYx/rxD4XLptpvH/QwaGTVlBDC/aS4EcLbBbWC0a9aH4/pC33vArXG8b5aD4LuN1gf738ftOxe/zEKIYQLyWopWS0lmoPSHCg5Byk/gT4fOl0FYe0htB6rm0pzoDANDv5kuQ3Vdbzl6k9tt7+EEMIFmkRwphCikQS0sHy17Oa6vlr1ufi+hBCiAchtKSGEEEJ4FSluhBBCCOFVpLgRQgghhFeR4kYIIYQQXkUmFHu5nBID5ZVVqJQKIgO1qFRSzzZbRoNlpZPZBJpAy7413ib/lCVWQqGCkHhQyvtdiOZIihsvVVxeSXJqAa+tTOHwuWJC/H24Z3Bbbu4fR6TO193DE42t8IwlFTx56X9TwS+Dq163pIKrte4e3cUrSofjG2DTm5YCJygaBj9iWaYeHOvu0QkhGpnsc+Ol+9z8diCTB5busjp+eddI3ryhF2EBTmzcJpq2ogxYei1kH6p5XKm2JHlH93TLsFzGUAJ/LIT1NjYqHHAfDH8WAmQPHiG8gaSCN2Pnisp5+ccDNtvWpmSRVVTeyCMSbpW5z7qwAcvtmzUzQV/Q6ENyqeJM+P1t2207/wNlOY07HiGE20lx44WKyytJL7RfwOw7U9iIoxFud+hn+22nNkFFaeONpSHo8+wnm5uqoOhs445HCOF2Utx4IR+VEoXCfnuIv0/jDUa4X0Ck/TbfYGp9szQFdc0ZkjBPIZodKW68UFiAhlFdbH+gadVKurbyznlGwo4eNoIuz+t/PwS0bLyxNAS/MIjoYrstKAoCIhp3PEIIt5PixgsF+frw4vhuxIb61TiuVir4+Pa+tAzygtUxwnG6WBjzpvXx2AHQdxKoVI0+JJcKiYPrFlkHd2oC4cYlliXhQohmRVZLeelqKYCMQj0H04vYdjyX1uH+DO8UQXSwLxp1E/8wE84zFENxBhxaCWV50HmMJRU8qIlftfm73OOQ+gekJ0PLrtBmmKWwUcttWCG8haOf31LceHFxI4QQQngTWQouhBBCiGZJihshhBBCeBUpboQQQgjhVaS4EUIIIYRXkeBMIZqL5pAK7oEMhmLyy/MwYSZIHUCQ7LsjRIOT4kaI5sDbU8E91NnC03y87yN+PvUbFaYKBkVdypN9H6Odrj1qja+7hyeE15Kl4LIUXHg7b08F91CZhalMWns/Z0tqZltpVVr+b+wXtAvr7KaRCdF0yVJwIYSFt6eCe6idmTusChsAQ5WBBXsXoi8vaPxBCdFMSHEjhLfz9lRwD2Q0VrD67Ca77Vszd1BkKGzEEQnRvEhxI4S38/ZUcA+kVKgI0wTbbddpdagUEoMiREOR4kYIb+ftqeAeSKlScVPH6+2239HxZsIDWzXiiIRoXqS4EcLbeXsquIeKDWzF5O73WR0fFNWfy9tcgUIpP36FaCiyWkpWS4nmoDmkgnugotJssspzWHd6LaWVpYxqPYq4wFjCg+SqjRD14ejnt+xzI0RzoA2yfA3p5O6RNCu6gAh0ARF0CO/q7qEI0azIdVEhhBBCeBUpboQQQgjhVaS4EUIIIYRXkeJGCCGEEF5FihshhBBCeBUpboQQQgjhVaS4EUIIIYRXkeJGCCGEEF5FihshhBBCeBUpboQQQgjhVaS4EUIIIYRXkeJGCCGEEF5FihshhBBCeBUpboQQQgjhVaS4EUIIIYRXkeJGCCGEEF5FihshhBBCeBUpboQQQgjhVdTuHoAQopEYDVCaA2YTaALBP9TdIxJCiAbh1is3s2bNon///gQFBREZGcm1117L4cOH63zexo0b6du3L76+vrRr146FCxc2wmiFaMIKz8Dq5+H9vjCvOyyfAOnJloJHCCG8jFuLm40bNzJ58mS2b9/OmjVrMBqNjB49mtLSUrvPOXnyJGPHjmXo0KEkJyfz7LPPMm3aNFasWNGIIxeiCSnKgM+vhx0fQ6Xecix1K/z7csiu+5cJIYRoahRms9ns7kGcl52dTWRkJBs3bmTYsGE2HzNjxgx+/PFHUlJSqo89+OCD7N27l23btjn0OkVFRQQHB1NYWIhOp3PJ2IXwWEd+gy9vst3WbiTc+Cn4hTTmiIQQol4c/fz2qAnFhYWFAISFhdl9zLZt2xg9enSNY1deeSU7d+6ksrLS5nMMBgNFRUU1voRoNg79bL/t1CaosH+lVAghmiKPKW7MZjOPP/44Q4YMoXv37nYfl5mZScuWLWsca9myJUajkZycHJvPmTVrFsHBwdVfcXFxLh27EB4tINJ+m28wKBSNNxYhhGgEHlPcTJkyhX379rFs2bI6H6u44Ifx+TtrFx4/75lnnqGwsLD6Ky0t7eIHLERT0eMG+23974eAlvbbhRCiCfKI4mbq1Kn8+OOPbNiwgdjY2FofGxUVRWZmZo1jWVlZqNVqwsPDbT5Hq9Wi0+lqfAnRbOhiYcyb1sdjB0DfSaBSNfqQhBCiIbl1nxuz2czUqVP57rvvSEpKom3btnU+Z9CgQfz00081jq1evZp+/frh4+PTUEMVounyDYLeE6D9SDi0EsryoPMYCGsPQXLVRgjhfdxa3EyePJkvv/ySH374gaCgoOorMsHBwfj5+QGWW0pnz55lyZIlgGVl1Pvvv8/jjz/Offfdx7Zt2/jkk08cup0lRLOlDbJ8Denk7pEIIUSDc+ttqQULFlBYWMiIESOIjo6u/vrqq6+qH5ORkUFqamr1n9u2bcsvv/xCUlISvXv35tVXX+Xdd9/l+uuvd8e3IIQQQggP41H73DQW2edGCCGEaHqa5D43QgghhBAXS4obIYQQQngVKW6EEEII4VWkuBFCCCGEV5HiRgghhBBeRYobIYQQQngVKW6EEEII4VWkuBFCCCGEV5HiRgghhBBexa3ZUu5yflPmoqIiN49ECCGEEI46/7ldV7hCsyxuiouLAYiLi3PzSIQQQgjhrOLiYoKDg+22N8tsKZPJRHp6OkFBQRQXFxMXF0daWprkTDWioqIiOe9uIOfdPeS8u4ecd/doyPNuNpspLi6mVatWKJX2Z9Y0yys3SqWS2NhYABQKBQA6nU7e/G4g59095Ly7h5x395Dz7h4Ndd5ru2JznkwoFkIIIYRXkeJGCCGEEF6l2Rc3Wq2WF198Ea1W6+6hNCty3t1Dzrt7yHl3Dznv7uEJ571ZTigWQgghhPdq9lduhBBCCOFdpLgRQgghhFeR4kYIIYQQXkWKGyGEEEJ4lWZR3Hz44Ye0bdsWX19f+vbty++//17r4zdu3Ejfvn3x9fWlXbt2LFy4sJFG6l2cOe9JSUkoFAqrr0OHDjXiiJu+TZs2MX78eFq1aoVCoeD777+v8znyfr94zp53eb9fvFmzZtG/f3+CgoKIjIzk2muv5fDhw3U+T97vF6c+590d73evL26++uorHn30UZ577jmSk5MZOnQoY8aMITU11ebjT548ydixYxk6dCjJyck8++yzTJs2jRUrVjTyyJs2Z8/7eYcPHyYjI6P6q2PHjo00Yu9QWlpKr169eP/99x16vLzfXcPZ836evN/rb+PGjUyePJnt27ezZs0ajEYjo0ePprS01O5z5P1+8epz3s9r1Pe72csNGDDA/OCDD9Y41qVLF/PTTz9t8/HTp083d+nSpcaxBx54wDxw4MAGG6M3cva8b9iwwQyY8/PzG2F0zQNg/u6772p9jLzfXc+R8y7vd9fLysoyA+aNGzfafYy8313PkfPujve7V1+5qaioYNeuXYwePbrG8dGjR7N161abz9m2bZvV46+88kp27txJZWVlg43Vm9TnvJ/Xp08foqOjSUxMZMOGDQ05TIG8391N3u+uU1hYCEBYWJjdx8j73fUcOe/nNeb73auLm5ycHKqqqmjZsmWN4y1btiQzM9PmczIzM20+3mg0kpOT02Bj9Sb1Oe/R0dF8/PHHrFixgm+//ZbOnTuTmJjIpk2bGmPIzZa8391D3u+uZTabefzxxxkyZAjdu3e3+zh5v7uWo+fdHe/3ZpEKfj75+zyz2Wx1rK7H2zouaufMee/cuTOdO3eu/vOgQYNIS0tjzpw5DBs2rEHH2dzJ+73xyfvdtaZMmcK+ffvYvHlznY+V97vrOHre3fF+9+orNy1atEClUlldLcjKyrKq3s+Lioqy+Xi1Wk14eHiDjdWb1Oe82zJw4ECOHj3q6uGJv5H3u+eQ93v9TJ06lR9//JENGzYQGxtb62Pl/e46zpx3Wxr6/e7VxY1Go6Fv376sWbOmxvE1a9Zw2WWX2XzOoEGDrB6/evVq+vXrh4+PT4ON1ZvU57zbkpycTHR0tKuHJ/5G3u+eQ97vzjGbzUyZMoVvv/2W9evX07Zt2zqfI+/3i1ef825Lg7/fG23qspssX77c7OPjY/7kk0/MBw8eND/66KPmgIAA86lTp8xms9n89NNPm2+//fbqx584ccLs7+9vfuyxx8wHDx40f/LJJ2YfHx/zN998465voUly9ry/88475u+++8585MgR8/79+81PP/20GTCvWLHCXd9Ck1RcXGxOTk42JycnmwHz3LlzzcnJyebTp0+bzWZ5vzcUZ8+7vN8v3kMPPWQODg42JyUlmTMyMqq/ysrKqh8j73fXq895d8f73euLG7PZbP7ggw/M8fHxZo1GY77kkktqLFm78847zcOHD6/x+KSkJHOfPn3MGo3G3KZNG/OCBQsaecTewZnzPnv2bHP79u3Nvr6+5tDQUPOQIUPMK1eudMOom7bzSy4v/LrzzjvNZrO83xuKs+dd3u8Xz9b5BsyLFy+ufoy8312vPufdHe93xX8HK4QQQgjhFbx6zo0QQgghmh8pboQQQgjhVaS4EUIIIYRXkeJGCCGEEF5FihshhBBCeBUpboQQQgjhVaS4EUIIIYRXkeJGCCGEEF5FihshRJORlJSEQqGgoKDA5X0rFAq+//57u+2nTp1CoVCwZ8+eWvsZMWIEjz76qEvHJoRwjhQ3QohG9+mnnxISEuLuYdSQkZHBmDFjHH58QxZaQoiLo3b3AIQQwhNERUW5ewhCCBeRKzdCCKeNGDGCKVOmMGXKFEJCQggPD+f555/nfFRdRUUF06dPJyYmhoCAAC699FKSkpIAyxWPu+66i8LCQhQKBQqFgpdeegmAzz//nH79+hEUFERUVBQTJkwgKyvL6fGZzWYiIiJYsWJF9bHevXsTGRlZ/edt27bh4+NDSUkJYH1baseOHfTp0wdfX1/69etHcnJyddupU6cYOXIkAKGhoSgUCiZNmlTdbjKZmD59OmFhYURFRVV/f0KIxiHFjRCiXj777DPUajV//PEH7777Lu+88w7//ve/AbjrrrvYsmULy5cvZ9++fdx4441cddVVHD16lMsuu4x58+ah0+nIyMggIyODJ598ErAURa+++ip79+7l+++/5+TJkzWKBkcpFAqGDRtWXVDl5+dz8OBBKisrOXjwIGApsvr27UtgYKDV80tLS/nHP/5B586d2bVrFy+99FL1GAHi4uKqC6fDhw+TkZHB/Pnza5ybgIAA/vjjD958801eeeUV1qxZ4/T3IYSoH7ktJYSol7i4ON555x0UCgWdO3fmr7/+4p133mHUqFEsW7aMM2fO0KpVKwCefPJJVq1axeLFi3n99dcJDg5GoVBY3Qq6++67q/+/Xbt2vPvuuwwYMICSkhKbRUhtRowYwccffwzApk2b6NWrF61btyYpKYmEhASSkpIYMWKEzed+8cUXVFVV8Z///Ad/f3+6devGmTNneOihhwBQqVSEhYUBEBkZaTV/qGfPnrz44osAdOzYkffff59169ZxxRVXOPU9CCHqR67cCCHqZeDAgSgUiuo/Dxo0iKNHj7Jz507MZjOdOnUiMDCw+mvjxo0cP3681j6Tk5O55ppriI+PJygoqLr4SE1NdXp8I0aM4MCBA+Tk5LBx40ZGjBjBiBEj2LhxI0ajka1btzJ8+HCbz01JSaFXr174+/vX+P4c1bNnzxp/jo6OrtftNSFE/ciVGyGEy6lUKnbt2oVKpapxvLarL6WlpYwePZrRo0fz+eefExERQWpqKldeeSUVFRVOj6F79+6Eh4ezceNGNm7cyCuvvEJcXByvvfYaf/75J3q9niFDhth87vm5Q/Xl4+NT488KhQKTyXRRfQohHCfFjRCiXrZv3271544dO9KnTx+qqqrIyspi6NChNp+r0WioqqqqcezQoUPk5OTwxhtvEBcXB8DOnTvrPb7z825++OEH9u/fz9ChQwkKCqKyspKFCxdyySWXEBQUZPO5CQkJLF26FL1ej5+fn83vV6PRAFh9H0II95PbUkKIeklLS+Pxxx/n8OHDLFu2jPfee49HHnmETp06MXHiRO644w6+/fZbTp48yZ9//sns2bP55ZdfAGjTpg0lJSWsW7eOnJwcysrKaN26NRqNhvfee48TJ07w448/8uqrr17UGEeMGMGXX35Jz5490el01QXPF198YXe+DcCECRNQKpXcc889HDx4kF9++YU5c+bUeEx8fDwKhYKff/6Z7Ozs6lVXQgj3k+JGCFEvd9xxB3q9ngEDBjB58mSmTp3K/fffD8DixYu54447eOKJJ+jcuTNXX301f/zxR/UVmcsuu4wHH3yQm2++mYiICN58800iIiL49NNP+frrr0lISOCNN96wKiicNXLkSKqqqmoUMsOHD6eqqsrufBuw3D776aefOHjwIH369OG5555j9uzZNR4TExPDyy+/zNNPP03Lli2ZMmXKRY1VCOE6CvPF3lwWQjQ7I0aMoHfv3sybN8/dQxFCCCty5UYIIYQQXkWKGyFEkzRmzJgaS83//vX666+7e3hCCDeS21JCiCbp7Nmz6PV6m21hYWHVm+wJIZofKW6EEEII4VXktpQQQgghvIoUN0IIIYTwKlLcCCGEEMKrSHEjhBBCCK8ixY0QQgghvIoUN0IIIYTwKlLcCCGEEMKr/D9wUpK9tPl1GAAAAABJRU5ErkJggg==",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.scatterplot(x=\"petal_width\", y=\"sepal_width\", data=pd.read_csv('iris.csv'), hue=\"species\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a minute to look at the [seaborn gallery](https://seaborn.pydata.org/examples/index.html).\n",
"\n",
"And while we are at it, we should not forget the [matplotlib gallery](https://matplotlib.org/stable/gallery/index.html)."
]
}
],
"metadata": {
"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.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}