diff --git a/key.ipynb b/key.ipynb index 5206254..4381df0 100644 --- a/key.ipynb +++ b/key.ipynb @@ -1,170 +1,1865 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "import matplotlib as mpl\n", + "from matplotlib import pyplot as plt\n", + "\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Customize" + ] + }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Customize Pandas settings (eg: DataFrame display)\n", + "\n", + "# Columns\n", + "pd.options.display.max_columns = 10\n", + "pd.options.display.max_colwidth = 15\n", + "pd.options.display.width = 150\n", + "# Rows\n", + "pd.options.display.max_rows = pd.options.display.min_rows = 12\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Customize matplotlib\n", + "\n", + "# plt.style.use('ggplot')\n", + "plt.style.use('default')\n", + "plt.rcParams['figure.figsize'] = (12, 8)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Load Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will be using ugly holiday sweater data crowdsourced from R-Ladies (and friends) in November/December 2020. If you would like to contribute your own ugly holiday sweater info to this dataset, please fill out this Google Form! See a summary of the data attributes here:\n", + "\n", + " sweater: entry number\n", + " hs_tf: Do you have a holiday sweater? (Yes/No/NA)\n", + " sparkly: is it sparkly? (Yes/No/NA)\n", + " noise: does it make noise? (Yes/No/NA)\n", + " lights: does it light up? (Yes/No/NA)\n", + " objects: does it have anything attached to it? (Yes/No/NA)\n", + " colors: What colors does it have?\n", + " image_tf: Does it have an image on it? (Yes/No/NA)\n", + " image_desc: User-provided image description\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " hs_tf sparkly noise lights objects \\\n", - "sweater \n", - "sweater1 Yes Yes No No No \n", - "sweater2 Yes No No No No \n", - "sweater3 Yes No No No No \n", - "sweater5 Yes No No No No \n", - "sweater8 Yes No Yes Yes Yes \n", - "... ... ... ... ... ... \n", - "sweater100 Yes Yes No No Yes \n", - "sweater103 Yes No Yes No Yes \n", - "sweater104 Yes Yes No No Yes \n", - "sweater105 Yes No No No No \n", - "sweater107 Yes No No No Yes \n", + "df shape:\n", + "(105, 8)\n", + "\n", + "Column names:\n", + "['hs_tf', 'sparkly', 'noise', 'lights', 'objects', 'colors', 'image_tf', 'image_desc']\n", "\n", - " colors image_tf \\\n", - "sweater \n", - "sweater1 Red, Yellow, Blue, White, teal Yes \n", - "sweater2 Green No \n", - "sweater3 Red, Yellow, Green, Brown, White, Black Yes \n", - "sweater5 Blue, White, Black Yes \n", - "sweater8 Red, Green, Blue, Purple, White, Grey No \n", - "... ... ... \n", - "sweater100 Orange, Yellow, Blue Yes \n", - "sweater103 Red, Yellow, White, Black Yes \n", - "sweater104 Red, White, Black Yes \n", - "sweater105 Red, Green, Blue, Grey No \n", - "sweater107 Red, Green, White, Black Yes \n", + " hs_tf sparkly noise lights objects colors image_tf image_desc\n", + "sweater \n", + "sweater1 Yes Yes No No No Red, Yellow... Yes octopus dre...\n", + "sweater2 Yes No No No No Green No NaN\n", + "sweater3 Yes No No No No Red, Yellow... Yes Houses\n", + "sweater4 No No No No No the limit d... No NaN\n", + "sweater5 Yes No No No No Blue, White... Yes T-rex\n", + "sweater6 No NaN NaN NaN NaN NaN NaN NaN\n", + "... ... ... ... ... ... ... ... ...\n", + "sweater102 No NaN NaN NaN NaN NaN NaN NaN\n", + "sweater103 Yes No Yes No Yes Red, Yellow... Yes Sloth\n", + "sweater104 Yes Yes No No Yes Red, White,... Yes R2D2 wearin...\n", + "sweater105 Yes No No No No Red, Green,... No NaN\n", + "sweater106 No No No No No NaN No NaN\n", + "sweater107 Yes No No No Yes Red, Green,... Yes a llama wea...\n", "\n", - " image_desc \n", - "sweater \n", - "sweater1 octopus dressed like santa \n", - "sweater2 NaN \n", - "sweater3 Houses \n", - "sweater5 T-rex \n", - "sweater8 NaN \n", - "... ... \n", - "sweater100 Menorah \n", - "sweater103 Sloth \n", - "sweater104 R2D2 wearing a Santa hat \n", - "sweater105 NaN \n", - "sweater107 a llama wearing a scarf \n", + "[105 rows x 8 columns]\n" + ] + } + ], + "source": [ + "fnm = 'ugly_sweaters.csv'\n", + "df = pd.read_csv(fnm, index_col='sweater')\n", + "# Show the dataframe\n", + "print(f'df shape:\\n{df.shape}')\n", + "print(f'\\nColumn names:\\n{df.columns.to_list()}\\n')\n", + "print(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " hs_tf sparkly noise lights objects colors image_tf image_desc\n", + "sweater \n", + "sweater1 Yes Yes No No No Red, Yellow... Yes octopus dre...\n", + "sweater2 Yes No No No No Green No NaN\n", + "sweater3 Yes No No No No Red, Yellow... Yes Houses\n", + "sweater5 Yes No No No No Blue, White... Yes T-rex\n", + "sweater8 Yes No Yes Yes Yes Red, Green,... No NaN\n", + "sweater11 Yes No No No No Red, Yellow... Yes Santa Claus...\n", + "... ... ... ... ... ... ... ... ...\n", + "sweater99 Yes Yes No No No Red, Blue, ... Yes Reindeer\n", + "sweater100 Yes Yes No No Yes Orange, Yel... Yes Menorah\n", + "sweater103 Yes No Yes No Yes Red, Yellow... Yes Sloth\n", + "sweater104 Yes Yes No No Yes Red, White,... Yes R2D2 wearin...\n", + "sweater105 Yes No No No No Red, Green,... No NaN\n", + "sweater107 Yes No No No Yes Red, Green,... Yes a llama wea...\n", "\n", "[68 rows x 8 columns]\n" ] } ], "source": [ - "import pandas as pd\n", - "\n", - "# Step 1 Load Data\n", - "data = pd.read_csv('ugly_sweaters.csv', index_col='sweater')\n", - "data = data[data['hs_tf'] == 'Yes']\n", + "# Filter to only include Holiday Sweaters\n", + "data_orig = df.loc[df.hs_tf == 'Yes']\n", + "# Make a copy (instead of working on the view) since we'll be changing\n", + "# col dtypes later and don't want to get SettingWithCopyWarning\n", + "data = data_orig.copy()\n", "print(data)" ] }, { "cell_type": "code", - "execution_count": 49, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inspect the data" + ] + }, + { + "cell_type": "code", + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " hs_tf sparkly noise lights objects \\\n", - "sweater \n", - "sweater1 Yes Yes No No No \n", - "sweater2 Yes No No No No \n", - "sweater3 Yes No No No No \n", - "sweater5 Yes No No No No \n", - "sweater8 Yes No Yes Yes Yes \n", - "... ... ... ... ... ... \n", - "sweater100 Yes Yes No No Yes \n", - "sweater103 Yes No Yes No Yes \n", - "sweater104 Yes Yes No No Yes \n", - "sweater105 Yes No No No No \n", - "sweater107 Yes No No No Yes \n", - "\n", - " colors image_tf \\\n", - "sweater \n", - "sweater1 [Red, Yellow, Blue, White, teal] Yes \n", - "sweater2 [Green] No \n", - "sweater3 [Red, Yellow, Green, Brown, White, Black] Yes \n", - "sweater5 [Blue, White, Black] Yes \n", - "sweater8 [Red, Green, Blue, Purple, White, Grey] No \n", - "... ... ... \n", - "sweater100 [Orange, Yellow, Blue] Yes \n", - "sweater103 [Red, Yellow, White, Black] Yes \n", - "sweater104 [Red, White, Black] Yes \n", - "sweater105 [Red, Green, Blue, Grey] No \n", - "sweater107 [Red, Green, White, Black] Yes \n", + "Index(['hs_tf', 'sparkly', 'noise', 'lights', 'objects', 'colors', 'image_tf', 'image_desc'], dtype='object')\n", "\n", - " image_desc num_colors num_words \n", - "sweater \n", - "sweater1 [octopus, dressed, like, santa] 5 4 \n", - "sweater2 NaN 1 1 \n", - "sweater3 [Houses] 6 1 \n", - "sweater5 [T-rex] 3 1 \n", - "sweater8 NaN 6 1 \n", - "... ... ... ... \n", - "sweater100 [Menorah] 3 1 \n", - "sweater103 [Sloth] 4 1 \n", - "sweater104 [R2D2, wearing, a, Santa, hat] 3 5 \n", - "sweater105 NaN 4 1 \n", - "sweater107 [a, llama, wearing, a, scarf] 4 5 \n", + "Data shape: (68, 8)\n", "\n", - "[68 rows x 10 columns]\n" + "Column dtypes:\n", + "hs_tf object\n", + "sparkly object\n", + "noise object\n", + "lights object\n", + "objects object\n", + "colors object\n", + "image_tf object\n", + "image_desc object\n", + "dtype: object\n" ] } ], "source": [ - "# Step 2 Wrangle Data\n", - "data['colors'] = data['colors'].str.split(',')\n", - "color_data = data.explode('colors').groupby('sweater').count()\n", - "data['num_colors'] = color_data['hs_tf']\n", + "# List the columns\n", + "print(data.columns)\n", "\n", - "data['image_desc'] = data['image_desc'].str.split(' ')\n", - "description_data = data.explode('image_desc').groupby('sweater').count()\n", + "# Show df shape\n", + "print(f\"\\nData shape: {data.shape}\")\n", "\n", - "data['num_words'] = description_data['hs_tf']\n", - "print(data)" + "# Show column datatypes (Numpy 'dtype')\n", + "print(\"\\nColumn dtypes:\")\n", + "print(data.dtypes)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "object\n", + "sweater1\t \tRed, Yellow, Blue, White, teal\n", + "sweater2\t \tGreen\n", + "sweater3\t \tRed, Yellow, Green, Brown, White, Black\n", + "sweater5\t \tBlue, White, Black\n", + "sweater8\t \tRed, Green, Blue, Purple, White, Grey\n" + ] + } + ], + "source": [ + "# Inspect the 'colors' data column\n", + "print(data.colors.dtype)\n", + "for idx, val in data.colors.head().items():\n", + " print(f\"{idx}\\t {type(val)}\\t{val}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sweater1\t \toctopus dressed like santa\n", + "sweater2\t \tnan\n", + "sweater3\t \tHouses\n", + "sweater5\t \tT-rex\n", + "sweater8\t \tnan\n" + ] + } + ], + "source": [ + "# Inspect the 'image_desc' data column\n", + "# Note how this heterogeneous data... str and float (NaN)\n", + "for idx, val in data.image_desc.head().items():\n", + " print(f\"{idx}\\t {type(val)}\\t{val}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Wrangle Data -- convert to long-form\n", + "Make data tidy and then analyze in a general way (using groupby + aggregations)" ] }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 9, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
hs_tfsparklynoiselightsobjectscolorsimage_tfimage_desc
sweater
sweater1YesYesNoNoNoRed, Yellow...Yesoctopus dre...
sweater2YesNoNoNoNoGreenNo
sweater3YesNoNoNoNoRed, Yellow...YesHouses
sweater5YesNoNoNoNoBlue, White...YesT-rex
sweater8YesNoYesYesYesRed, Green,...No
sweater11YesNoNoNoNoRed, Yellow...YesSanta Claus...
...........................
sweater99YesYesNoNoNoRed, Blue, ...YesReindeer
sweater100YesYesNoNoYesOrange, Yel...YesMenorah
sweater103YesNoYesNoYesRed, Yellow...YesSloth
sweater104YesYesNoNoYesRed, White,...YesR2D2 wearin...
sweater105YesNoNoNoNoRed, Green,...No
sweater107YesNoNoNoYesRed, Green,...Yesa llama wea...
\n", + "

68 rows × 8 columns

\n", + "
" + ], "text/plain": [ - "" + " hs_tf sparkly noise lights objects colors image_tf image_desc\n", + "sweater \n", + "sweater1 Yes Yes No No No Red, Yellow... Yes octopus dre...\n", + "sweater2 Yes No No No No Green No \n", + "sweater3 Yes No No No No Red, Yellow... Yes Houses\n", + "sweater5 Yes No No No No Blue, White... Yes T-rex\n", + "sweater8 Yes No Yes Yes Yes Red, Green,... No \n", + "sweater11 Yes No No No No Red, Yellow... Yes Santa Claus...\n", + "... ... ... ... ... ... ... ... ...\n", + "sweater99 Yes Yes No No No Red, Blue, ... Yes Reindeer\n", + "sweater100 Yes Yes No No Yes Orange, Yel... Yes Menorah\n", + "sweater103 Yes No Yes No Yes Red, Yellow... Yes Sloth\n", + "sweater104 Yes Yes No No Yes Red, White,... Yes R2D2 wearin...\n", + "sweater105 Yes No No No No Red, Green,... No \n", + "sweater107 Yes No No No Yes Red, Green,... Yes a llama wea...\n", + "\n", + "[68 rows x 8 columns]" ] }, - "execution_count": 50, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" - }, + } + ], + "source": [ + "# Refresh dataframe from original data\n", + "data = data_orig.copy()\n", + "\n", + "# Replace NaN with empty str\n", + "data.image_desc.fillna('', inplace=True)\n", + "data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Convert str to list of str" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ { "data": { - "image/png": "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\n", "text/plain": [ - "
" + "sweater\n", + "sweater1 [Red, Yell...\n", + "sweater2 [Green]\n", + "sweater3 [Red, Yell...\n", + "sweater5 [Blue, Whi...\n", + "sweater8 [Red, Gree...\n", + "sweater11 [Red, Yell...\n", + " ... \n", + "sweater99 [Red, Blue...\n", + "sweater100 [Orange, Y...\n", + "sweater103 [Red, Yell...\n", + "sweater104 [Red, Whit...\n", + "sweater105 [Red, Gree...\n", + "sweater107 [Red, Gree...\n", + "Name: colors_ls, Length: 68, dtype: object" ] }, - "metadata": { - "needs_background": "light" + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Convert 'colors' column from single comma-delim str to list\n", + "# of string\n", + "data['colors_ls'] = data.colors.str.split(',')\n", + "data.colors_ls" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "sweater\n", + "sweater1 [octopus, d...\n", + "sweater2 []\n", + "sweater3 [Houses]\n", + "sweater5 [T-rex]\n", + "sweater8 []\n", + "sweater11 [Santa, Cla...\n", + " ... \n", + "sweater99 [Reindeer]\n", + "sweater100 [Menorah]\n", + "sweater103 [Sloth]\n", + "sweater104 [R2D2, wear...\n", + "sweater105 []\n", + "sweater107 [a, llama, ...\n", + "Name: image_desc_ls, Length: 68, dtype: object" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Convert 'image_desc' column from single space-delim str to list\n", + "data['image_desc_ls'] = data.image_desc.str.split()\n", + "data.image_desc_ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tidy & analyze 'colors'" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
hs_tfsparklynoiselightsobjectscolorsimage_tfimage_desccolors_lsimage_desc_ls
sweater
sweater1YesYesNoNoNoRed, Yellow...Yesoctopus dre...Red[octopus, d...
sweater1YesYesNoNoNoRed, Yellow...Yesoctopus dre...Yellow[octopus, d...
sweater1YesYesNoNoNoRed, Yellow...Yesoctopus dre...Blue[octopus, d...
sweater1YesYesNoNoNoRed, Yellow...Yesoctopus dre...White[octopus, d...
sweater1YesYesNoNoNoRed, Yellow...Yesoctopus dre...teal[octopus, d...
sweater2YesNoNoNoNoGreenNoGreen[]
.................................
sweater105YesNoNoNoNoRed, Green,...NoBlue[]
sweater105YesNoNoNoNoRed, Green,...NoGrey[]
sweater107YesNoNoNoYesRed, Green,...Yesa llama wea...Red[a, llama, ...
sweater107YesNoNoNoYesRed, Green,...Yesa llama wea...Green[a, llama, ...
sweater107YesNoNoNoYesRed, Green,...Yesa llama wea...White[a, llama, ...
sweater107YesNoNoNoYesRed, Green,...Yesa llama wea...Black[a, llama, ...
\n", + "

273 rows × 10 columns

\n", + "
" + ], + "text/plain": [ + " hs_tf sparkly noise lights objects colors image_tf image_desc colors_ls image_desc_ls\n", + "sweater \n", + "sweater1 Yes Yes No No No Red, Yellow... Yes octopus dre... Red [octopus, d...\n", + "sweater1 Yes Yes No No No Red, Yellow... Yes octopus dre... Yellow [octopus, d...\n", + "sweater1 Yes Yes No No No Red, Yellow... Yes octopus dre... Blue [octopus, d...\n", + "sweater1 Yes Yes No No No Red, Yellow... Yes octopus dre... White [octopus, d...\n", + "sweater1 Yes Yes No No No Red, Yellow... Yes octopus dre... teal [octopus, d...\n", + "sweater2 Yes No No No No Green No Green []\n", + "... ... ... ... ... ... ... ... ... ... ...\n", + "sweater105 Yes No No No No Red, Green,... No Blue []\n", + "sweater105 Yes No No No No Red, Green,... No Grey []\n", + "sweater107 Yes No No No Yes Red, Green,... Yes a llama wea... Red [a, llama, ...\n", + "sweater107 Yes No No No Yes Red, Green,... Yes a llama wea... Green [a, llama, ...\n", + "sweater107 Yes No No No Yes Red, Green,... Yes a llama wea... White [a, llama, ...\n", + "sweater107 Yes No No No Yes Red, Green,... Yes a llama wea... Black [a, llama, ...\n", + "\n", + "[273 rows x 10 columns]" + ] }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Tidy colors data (1 color per row)\n", + "df_colors = data.explode('colors_ls')\n", + "df_colors" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "sweater\n", + "sweater1 5\n", + "sweater2 1\n", + "sweater3 6\n", + "sweater5 3\n", + "sweater8 6\n", + "sweater11 8\n", + " ..\n", + "sweater99 4\n", + "sweater100 3\n", + "sweater103 4\n", + "sweater104 3\n", + "sweater105 4\n", + "sweater107 4\n", + "Name: num_colors, Length: 68, dtype: int64" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Calc how many colors for each sweater & add to dataframe\n", + "data['num_colors'] = df_colors.groupby('sweater', sort=False).colors_ls.count()\n", + "data.num_colors" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tidy & analyze 'image_desc'" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
hs_tfsparklynoiselightsobjects...image_tfimage_desccolors_lsimage_desc_lsnum_colors
sweater
sweater1YesYesNoNoNo...Yesoctopus dre...[Red, Yell...octopus5
sweater1YesYesNoNoNo...Yesoctopus dre...[Red, Yell...dressed5
sweater1YesYesNoNoNo...Yesoctopus dre...[Red, Yell...like5
sweater1YesYesNoNoNo...Yesoctopus dre...[Red, Yell...santa5
sweater2YesNoNoNoNo...No[Green]NaN1
sweater3YesNoNoNoNo...YesHouses[Red, Yell...Houses6
....................................
sweater105YesNoNoNoNo...No[Red, Gree...NaN4
sweater107YesNoNoNoYes...Yesa llama wea...[Red, Gree...a4
sweater107YesNoNoNoYes...Yesa llama wea...[Red, Gree...llama4
sweater107YesNoNoNoYes...Yesa llama wea...[Red, Gree...wearing4
sweater107YesNoNoNoYes...Yesa llama wea...[Red, Gree...a4
sweater107YesNoNoNoYes...Yesa llama wea...[Red, Gree...scarf4
\n", + "

278 rows × 11 columns

\n", + "
" + ], + "text/plain": [ + " hs_tf sparkly noise lights objects ... image_tf image_desc colors_ls image_desc_ls num_colors\n", + "sweater ... \n", + "sweater1 Yes Yes No No No ... Yes octopus dre... [Red, Yell... octopus 5\n", + "sweater1 Yes Yes No No No ... Yes octopus dre... [Red, Yell... dressed 5\n", + "sweater1 Yes Yes No No No ... Yes octopus dre... [Red, Yell... like 5\n", + "sweater1 Yes Yes No No No ... Yes octopus dre... [Red, Yell... santa 5\n", + "sweater2 Yes No No No No ... No [Green] NaN 1\n", + "sweater3 Yes No No No No ... Yes Houses [Red, Yell... Houses 6\n", + "... ... ... ... ... ... ... ... ... ... ... ...\n", + "sweater105 Yes No No No No ... No [Red, Gree... NaN 4\n", + "sweater107 Yes No No No Yes ... Yes a llama wea... [Red, Gree... a 4\n", + "sweater107 Yes No No No Yes ... Yes a llama wea... [Red, Gree... llama 4\n", + "sweater107 Yes No No No Yes ... Yes a llama wea... [Red, Gree... wearing 4\n", + "sweater107 Yes No No No Yes ... Yes a llama wea... [Red, Gree... a 4\n", + "sweater107 Yes No No No Yes ... Yes a llama wea... [Red, Gree... scarf 4\n", + "\n", + "[278 rows x 11 columns]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Tidy image_desc data (1 word per row)\n", + "df_image_desc = data.explode('image_desc_ls')\n", + "df_image_desc" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "sweater\n", + "sweater1 4\n", + "sweater2 0\n", + "sweater3 1\n", + "sweater5 1\n", + "sweater8 0\n", + "sweater11 10\n", + " ..\n", + "sweater99 1\n", + "sweater100 1\n", + "sweater103 1\n", + "sweater104 5\n", + "sweater105 0\n", + "sweater107 5\n", + "Name: num_words, Length: 68, dtype: int64" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Calc how many description words for each sweater & add to dataframe\n", + "data['num_words'] = df_image_desc.groupby('sweater', sort=False).image_desc_ls.count()\n", + "data.num_words" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inspect results" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
hs_tfsparklynoiselightsobjects...image_desccolors_lsimage_desc_lsnum_colorsnum_words
sweater
sweater1YesYesNoNoNo...octopus dre...[Red, Yell...[octopus, d...54
sweater2YesNoNoNoNo...[Green][]10
sweater3YesNoNoNoNo...Houses[Red, Yell...[Houses]61
sweater5YesNoNoNoNo...T-rex[Blue, Whi...[T-rex]31
sweater8YesNoYesYesYes...[Red, Gree...[]60
sweater11YesNoNoNoNo...Santa Claus...[Red, Yell...[Santa, Cla...810
....................................
sweater99YesYesNoNoNo...Reindeer[Red, Blue...[Reindeer]41
sweater100YesYesNoNoYes...Menorah[Orange, Y...[Menorah]31
sweater103YesNoYesNoYes...Sloth[Red, Yell...[Sloth]41
sweater104YesYesNoNoYes...R2D2 wearin...[Red, Whit...[R2D2, wear...35
sweater105YesNoNoNoNo...[Red, Gree...[]40
sweater107YesNoNoNoYes...a llama wea...[Red, Gree...[a, llama, ...45
\n", + "

68 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " hs_tf sparkly noise lights objects ... image_desc colors_ls image_desc_ls num_colors num_words\n", + "sweater ... \n", + "sweater1 Yes Yes No No No ... octopus dre... [Red, Yell... [octopus, d... 5 4\n", + "sweater2 Yes No No No No ... [Green] [] 1 0\n", + "sweater3 Yes No No No No ... Houses [Red, Yell... [Houses] 6 1\n", + "sweater5 Yes No No No No ... T-rex [Blue, Whi... [T-rex] 3 1\n", + "sweater8 Yes No Yes Yes Yes ... [Red, Gree... [] 6 0\n", + "sweater11 Yes No No No No ... Santa Claus... [Red, Yell... [Santa, Cla... 8 10\n", + "... ... ... ... ... ... ... ... ... ... ... ...\n", + "sweater99 Yes Yes No No No ... Reindeer [Red, Blue... [Reindeer] 4 1\n", + "sweater100 Yes Yes No No Yes ... Menorah [Orange, Y... [Menorah] 3 1\n", + "sweater103 Yes No Yes No Yes ... Sloth [Red, Yell... [Sloth] 4 1\n", + "sweater104 Yes Yes No No Yes ... R2D2 wearin... [Red, Whit... [R2D2, wear... 3 5\n", + "sweater105 Yes No No No No ... [Red, Gree... [] 4 0\n", + "sweater107 Yes No No No Yes ... a llama wea... [Red, Gree... [a, llama, ... 4 5\n", + "\n", + "[68 rows x 12 columns]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Show whole dataframe\n", + "data" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
num_colorsnum_words
sweater
sweater154
sweater210
sweater361
sweater531
sweater860
sweater11810
.........
sweater9941
sweater10031
sweater10341
sweater10435
sweater10540
sweater10745
\n", + "

68 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " num_colors num_words\n", + "sweater \n", + "sweater1 5 4\n", + "sweater2 1 0\n", + "sweater3 6 1\n", + "sweater5 3 1\n", + "sweater8 6 0\n", + "sweater11 8 10\n", + "... ... ...\n", + "sweater99 4 1\n", + "sweater100 3 1\n", + "sweater103 4 1\n", + "sweater104 3 5\n", + "sweater105 4 0\n", + "sweater107 4 5\n", + "\n", + "[68 rows x 2 columns]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Inspect calculated columns only\n", + "data[['num_colors', 'num_words']]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Visualize\n", + "There are several ways to visualize our results... most are built on top of the Matplotlib package." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# Change default plot size\n", + "plt.rcParams['figure.figsize'] = (12, 8)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pandas' plotter tools" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+UAAAKnCAYAAADgJOxZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAA9hAAAPYQGoP6dpAABBI0lEQVR4nO3de3hV9Z3o/88GIhIkEZKAULlKvE5RvA4GUafWy2l1+Gk7leNUrbbT6UEZtdVKz1gv1Wrbp44tWnuzXmqh1el4OZ5ptVIhQm2LQqzWFoPc64UkQCJJBST794clh3CJIYR8d3Zer+fZz9N8V7L54OreO2/22mtlstlsNgAAAIAu1yv1AAAAANBTiXIAAABIRJQDAABAIqIcAAAAEhHlAAAAkIgoBwAAgEREOQAAACQiygEAACCRPqkH2Nuam5vj9ddfjwEDBkQmk0k9DgAAAHkum83G22+/HcOGDYtevdp+Lzzvo/z111+P4cOHpx4DAACAHmbVqlVx4IEHtvk9eR/lAwYMiIj3/mMUFRUlngYAAIB819DQEMOHD2/p0bbkfZRvPWS9qKhIlAMAANBl2vMRaid6AwAAgEREOQAAACQiygEAACARUQ4AAACJiHIAAABIRJQDAABAIqIcAAAAEhHlAAAAkIgoBwAAgEREOQAAACQiygEAACARUQ4AAACJiHIAAABIRJQDAABAIqIcAAAAEhHlAAAAkIgoBwAAgEREOQAAACQiygEAACARUQ4AAACJiHIAAABIpE/qAQA629KaDbFibVOMKukfo0v7px4HAAB2SZQDeWN906aYNqsqKqtrWtYmlZfFjCnjo7iwIOFkAACwcw5fB/LGtFlVMX9Jbau1+Utq4/JZixJNBAAAbRPlQF5YWrMhKqtrYks222p9SzYbldU1say2MdFkAACwa6IcyAsr1ja1uX15nSgHACD3iHIgL4wcVNjm9lElTvgGAEDuEeVAXhhTtl9MKi+L3plMq/XemUxMKi9zFnYAAHKSKAfyxowp46NibGmrtYqxpTFjyvhEEwEAQNtcEg3IG8WFBfHApcfHstrGWF7X6DrlAADkPFEO5J3RpWIcAIDuweHrAAAAkIgoBwAAgEREOQAAACQiygEAACARUQ4AAACJiHIAAABIRJQDAABAIqIcAAAAEhHlAAAAkIgoBwAAgEREOQAAACQiygEAACARUQ4AAACJiHIAAABIRJQDAABAIqIcAAAAEhHlAAAAkIgoBwAAgEREOQAAACQiygEAACARUQ4AAACJiHIAAABIRJQDAABAIqIcAAAAEhHlAAAAkIgoBwAAgEREOQAAACQiygEAACARUQ4AAACJiHIAAABIRJQDAABAIqIcAAAAEhHlAAAAkIgoBwAAgEREOQAAACQiygEAACARUQ4AAACJiHIAAABIRJQDAABAIqIcAAAAEhHlAAAAkIgoBwAAgEREOQAAACQiygEAACARUQ4AAACJiHIAAABIRJQDAABAIqIcAAAAEhHlAAAAkIgoBwAAgEREOQAAACQiygEAACARUQ4AAACJiHIAAABIRJQDAABAIqIcAAAAEhHlAAAAkIgoBwAAgEREOQAAACQiygEAACARUQ4AAACJiHIAAABIRJQDAABAIkmj/NZbb43jjjsuBgwYEIMHD47JkyfH4sWLW33PO++8E1OnTo2SkpLYb7/94rzzzou33nor0cQAAADQeZJG+dy5c2Pq1Knx29/+Nn71q1/F5s2b4/TTT4/GxsaW77nyyivj//yf/xMPP/xwzJ07N15//fU499xzE04NAAAAnSOTzWazqYfYqqamJgYPHhxz586NSZMmRX19fZSVlcXMmTPjYx/7WERE/PnPf47DDjssnnvuufj7v//7973PhoaGKC4ujvr6+igqKtrbfwUAAAB6uN3p0Jz6THl9fX1ERAwaNCgiIl544YXYvHlznHbaaS3fc+ihh8aIESPiueee2+l9bNy4MRoaGlrdAAAAIBflTJQ3NzfHFVdcERUVFfF3f/d3ERHx5ptvxj777BP7779/q+8dMmRIvPnmmzu9n1tvvTWKi4tbbsOHD9/bowMAAECH5EyUT506NV5++eX46U9/ukf3M3369Kivr2+5rVq1qpMmBAAAgM7VJ/UAERGXXXZZPPHEE1FZWRkHHnhgy/oBBxwQmzZtivXr17d6t/ytt96KAw44YKf31bdv3+jbt+/eHhkAAAD2WNJ3yrPZbFx22WXxyCOPxK9//esYPXp0q+3HHHNMFBQUxOzZs1vWFi9eHCtXrowJEyZ09bgAAADQqZK+Uz516tSYOXNmPPbYYzFgwICWz4kXFxdHv379ori4OC699NK46qqrYtCgQVFUVBSXX355TJgwoV1nXgcAAIBclvSSaJlMZqfr9957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VFRUxKmnnhq/+MUvoqysLKqrq2PgwIGpR2MbCxYsiC1btrR8/fLLL8eHP/zh+PjHP55wKrb3ta99Le6+++64//7744gjjojnn38+PvWpT0VxcXFMmzYt9Xj8zac//el4+eWX48c//nEMGzYsHnzwwTjttNPilVdeiQ984AOpx9sjLomWQzKZTDzyyCMxefLk1KPwPmpqamLw4MExd+7cmDRpUupx2IVBgwbFN77xjbj00ktTj8J2NmzYEEcffXR85zvfiZtvvjmOOuqouOOOO1KPxd/ccMMN8eijj0ZVVVXqUdiFa6+9NubPnx/PPvts6lHYDVdccUU88cQTUV1dHZlMJvU4/M1HP/rRGDJkSNxzzz0ta+edd17069cvHnzwwYSTsdVf//rXGDBgQDz22GPxkY98pGX9mGOOibPOOituvvnmhNPtOYevQwfU19dHxHvRR+7ZsmVL/PSnP43GxsaYMGFC6nHYialTp8ZHPvKROO2001KPwi5UV1fHsGHDYsyYMXHBBRfEypUrU4/ENh5//PE49thj4+Mf/3gMHjw4xo8fHz/4wQ9Sj0UbNm3aFA8++GBccsklgjzHnHjiiTF79ux49dVXIyLixRdfjHnz5sVZZ52VeDK2evfdd2PLli2x7777tlrv169fzJs3L9FUncexaLCbmpub44orroiKior4u7/7u9TjsI2XXnopJkyYEO+8807st99+8cgjj8Thhx+eeiy289Of/jQWLlyYN58Dy0cnnHBC3HfffXHIIYfEG2+8ETfeeGOcdNJJ8fLLL8eAAQNSj0dELF26NO6+++646qqr4ktf+lIsWLAgpk2bFvvss09cdNFFqcdjJx599NFYv359XHzxxalHYTvXXnttNDQ0xKGHHhq9e/eOLVu2xC233BIXXHBB6tH4mwEDBsSECRPiK1/5Shx22GExZMiQmDVrVjz33HMxduzY1OPtMVEOu2nq1Knx8ssv58W/yuWbQw45JKqqqqK+vj7+8z//My666KKYO3euMM8hq1atin/7t3+LX/3qVzv8aze5Y9t3h8aNGxcnnHBCjBw5Mh566CEfB8kRzc3Nceyxx8ZXv/rViIgYP358vPzyy/Hd735XlOeoe+65J84666wYNmxY6lHYzkMPPRQ/+clPYubMmXHEEUdEVVVVXHHFFTFs2DCPpxzy4x//OC655JL4wAc+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3iH5f/zjH+MjH/lI/PrXv47DDz88HnnkkUTTAUDnEuUAkOPKysoiIuKNN95oWdv2pG97Q3l5efTr1y9mz5690+2HHXZYvPjii9HY2NiyNn/+/OjVq1cccsghO3z/QQcdFPvss0/Mnz+/ZW3z5s2xYMGCOPzww993noMPPjiuvPLKeOqpp+Lcc8+Ne++9twN/KwDIPaIcAHJcv3794u///u9bTn42d+7c+Pd///e9+mfuu+++8cUvfjGuueaaeOCBB+K1116L3/72t3HPPfdERMQFF1wQ++67b1x00UXx8ssvxzPPPBOXX355fPKTn9zh8+QR7737/bnPfS6uvvrq+OUvfxmvvPJKfOYzn4mmpqa49NJLdznHX//617jssstizpw5sWLFipg/f34sWLAgDjvssL32dweAruREbwDQDfzoRz+KSy+9NI455pg45JBD4utf/3qcfvrpe/XPvO6666JPnz7x5S9/OV5//fUYOnRo/Ou//mtERBQWFsaTTz4Z//Zv/xbHHXdcFBYWxnnnnRe33377Lu/vtttui+bm5vjkJz8Zb7/9dhx77LHx5JNPxsCBA3f5M7179466urq48MIL46233orS0tI499xz48Ybb+z0vy8ApJDJbvsBNQAAAKDLOHwdAAAAEhHlANADrVy5Mvbbb79d3lauXJl6RADoERy+DgA90LvvvhvLly/f5fZRo0ZFnz5OPQMAe5soBwAAgEQcvg4AAACJiHIAAABIRJQDAABAIqIcAAAAEhHlAAAAkIgoBwAAgEREOQAAACQiygEAACCR/x+Bl/b5ZsvORQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Pandas built-in plot tools (which use Matplotlib under the hood)\n", + "# This is convenient, but doesn't give as much control as using the Matplotlib API\n", + "data.plot.scatter('num_colors', 'num_words');" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Matplotlib API" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Solarize_Light2', '_classic_test_patch', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']\n" + ] + } + ], + "source": [ + "# There are many pre-defined styles... view the available options\n", + "print(mpl.style.available)\n", + "# or use the default style\n", + "plt.style.use('default')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# Matplotlib scatter plot doesn't have built-in jitter option...\n", + "# but it's not too hard\n", + "\n", + "def jitterify(arr, factor=0.01):\n", + " \"\"\"Add jitter 'factor' to 'arr' data\n", + " :param arr: array-like, eg: list, ndarray\n", + " :param factor: float, 0.0 -> 1.0\n", + " :return: arr with added jitter\n", + " \"\"\"\n", + " assert 0.0 <= factor <= 1.0, f\"Error, invalid factor {factor}\"\n", + " arr = np.array(arr)\n", + " assert arr.ndim == 1, f\"Expected 1-d array, got {arr.ndim}\"\n", + " ptp = arr.ptp()\n", + " jitter = np.random.randn(arr.size) * factor * ptp\n", + " return arr + jitter\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "code_folding": [] + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, "output_type": "display_data" } ], "source": [ - "# Step 3 Visualize\n", - "data.plot.scatter('num_colors', 'num_words')" + "# Scatterplot docs:\n", + "# https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html\n", + "\n", + "fontsize = 12\n", + "markersize = 75\n", + "color = '#424242'\n", + "alpha = 0.4\n", + "jitter = 0.01\n", + "\n", + "# Instantiate plot objects\n", + "fig, ax = plt.subplots()\n", + "\n", + "# Add labels to axes\n", + "ax.set_xlabel('Number of colors on sweater', fontsize=fontsize, color='k')\n", + "ax.set_ylabel('Number of words\\nin sweater description', fontsize=fontsize, color='k')\n", + "# Add figure title\n", + "fig.suptitle(\"Relationship between the number of colors and\\nlength of description for ugly holiday sweaters\",\n", + " color='k', fontsize=fontsize + 2)\n", + "\n", + "# Specify what data to plot\n", + "x = data.num_colors\n", + "y = data.num_words\n", + "# Add jitter to data so completely overlapping\n", + "x = jitterify(x, jitter)\n", + "y = jitterify(y, jitter)\n", + "\n", + "# Plot\n", + "ax.scatter(x, y,\n", + " c=color,\n", + " s=markersize,\n", + " alpha=alpha,\n", + " edgecolors=color,\n", + " linewidths=1.\n", + " )\n", + "\n", + "# Add polyfit curve\n", + "coeffs = np.polyfit(data.num_colors, data.num_words, 1)\n", + "xlim = ax.get_xlim()\n", + "ax.plot(xlim, np.polyval(coeffs, xlim), color='k', alpha=0.9)\n", + "\n", + "# Set tick increment\n", + "incr_x = 2\n", + "incr_y = 5\n", + "ax.xaxis.set_major_locator(mpl.ticker.MultipleLocator(incr_x))\n", + "ax.yaxis.set_major_locator(mpl.ticker.MultipleLocator(incr_y))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Seaborn library\n", + "This library is designed with data-science and clean asthetics in mind... check it out!
\n", + "https://seaborn.pydata.org/" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, @@ -175,7 +1870,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -189,7 +1884,20 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.8.10" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "My cool stuff", + "title_sidebar": "My cool stuff", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true } }, "nbformat": 4,