From 9d60b068c1bd960e144722b7e96ac8ad216d51fb Mon Sep 17 00:00:00 2001 From: luckycarms Date: Fri, 18 Jul 2025 14:05:18 -0400 Subject: [PATCH 1/7] removed file with space and added file with underscore and jupyter notebook --- ...C Employment.xlsx => WORC_Employment.xlsx} | Bin data/worc_cleaning.ipynb | 86 ++++++++++++++++++ 2 files changed, 86 insertions(+) rename data/{WORC Employment.xlsx => WORC_Employment.xlsx} (100%) create mode 100644 data/worc_cleaning.ipynb diff --git a/data/WORC Employment.xlsx b/data/WORC_Employment.xlsx similarity index 100% rename from data/WORC Employment.xlsx rename to data/WORC_Employment.xlsx diff --git a/data/worc_cleaning.ipynb b/data/worc_cleaning.ipynb new file mode 100644 index 0000000..1fada8e --- /dev/null +++ b/data/worc_cleaning.ipynb @@ -0,0 +1,86 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Best Practice\n", + "\n", + "Be sure to set up a virtual environment as there were lots of imports in this project\n", + "| Command | Linux/Mac | GitBash |\n", + "| ------- | --------- | ------- |\n", + "| Create | python3 -m venv venv | python -m venv venv |\n", + "| Activate | source venv/bin/activate | source venv/Scripts/activate |\n", + "| Install | pip install -r requirements.txt or pip install packages | pip install -r requirements.txt or pip install packages|\n", + "| Deactivate | deactivate | deactivate |" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## WORC Employment\n", + "\n", + "1. Import libraries\n", + "2. Read in the data" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: 'data/WORC_Employment.xlsx'", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mFileNotFoundError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[7]\u001b[39m\u001b[32m, line 2\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;66;03m# Read in data\u001b[39;00m\n\u001b[32m----> \u001b[39m\u001b[32m2\u001b[39m worc = \u001b[43mpd\u001b[49m\u001b[43m.\u001b[49m\u001b[43mread_excel\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mdata/WORC_Employment.xlsx\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/PROJECTS/CodeYouDataProject/venv/lib/python3.13/site-packages/pandas/io/excel/_base.py:495\u001b[39m, in \u001b[36mread_excel\u001b[39m\u001b[34m(io, sheet_name, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skiprows, nrows, na_values, keep_default_na, na_filter, verbose, parse_dates, date_parser, date_format, thousands, decimal, comment, skipfooter, storage_options, dtype_backend, engine_kwargs)\u001b[39m\n\u001b[32m 493\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(io, ExcelFile):\n\u001b[32m 494\u001b[39m should_close = \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m495\u001b[39m io = \u001b[43mExcelFile\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 496\u001b[39m \u001b[43m \u001b[49m\u001b[43mio\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 497\u001b[39m \u001b[43m \u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 498\u001b[39m \u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[43m=\u001b[49m\u001b[43mengine\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 499\u001b[39m \u001b[43m \u001b[49m\u001b[43mengine_kwargs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mengine_kwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 500\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 501\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m engine \u001b[38;5;129;01mand\u001b[39;00m engine != io.engine:\n\u001b[32m 502\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 503\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mEngine should not be specified when passing \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 504\u001b[39m \u001b[33m\"\u001b[39m\u001b[33man ExcelFile - ExcelFile already has the engine set\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 505\u001b[39m )\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/PROJECTS/CodeYouDataProject/venv/lib/python3.13/site-packages/pandas/io/excel/_base.py:1550\u001b[39m, in \u001b[36mExcelFile.__init__\u001b[39m\u001b[34m(self, path_or_buffer, engine, storage_options, engine_kwargs)\u001b[39m\n\u001b[32m 1548\u001b[39m ext = \u001b[33m\"\u001b[39m\u001b[33mxls\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 1549\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1550\u001b[39m ext = \u001b[43minspect_excel_format\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 1551\u001b[39m \u001b[43m \u001b[49m\u001b[43mcontent_or_path\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstorage_options\u001b[49m\n\u001b[32m 1552\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1553\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m ext \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 1554\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 1555\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mExcel file format cannot be determined, you must specify \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 1556\u001b[39m \u001b[33m\"\u001b[39m\u001b[33man engine manually.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 1557\u001b[39m )\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/PROJECTS/CodeYouDataProject/venv/lib/python3.13/site-packages/pandas/io/excel/_base.py:1402\u001b[39m, in \u001b[36minspect_excel_format\u001b[39m\u001b[34m(content_or_path, storage_options)\u001b[39m\n\u001b[32m 1399\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(content_or_path, \u001b[38;5;28mbytes\u001b[39m):\n\u001b[32m 1400\u001b[39m content_or_path = BytesIO(content_or_path)\n\u001b[32m-> \u001b[39m\u001b[32m1402\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[43mget_handle\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 1403\u001b[39m \u001b[43m \u001b[49m\u001b[43mcontent_or_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mrb\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mis_text\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\n\u001b[32m 1404\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m handle:\n\u001b[32m 1405\u001b[39m stream = handle.handle\n\u001b[32m 1406\u001b[39m stream.seek(\u001b[32m0\u001b[39m)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/PROJECTS/CodeYouDataProject/venv/lib/python3.13/site-packages/pandas/io/common.py:882\u001b[39m, in \u001b[36mget_handle\u001b[39m\u001b[34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[39m\n\u001b[32m 873\u001b[39m handle = \u001b[38;5;28mopen\u001b[39m(\n\u001b[32m 874\u001b[39m handle,\n\u001b[32m 875\u001b[39m ioargs.mode,\n\u001b[32m (...)\u001b[39m\u001b[32m 878\u001b[39m newline=\u001b[33m\"\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 879\u001b[39m )\n\u001b[32m 880\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 881\u001b[39m \u001b[38;5;66;03m# Binary mode\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m882\u001b[39m handle = \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mhandle\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mioargs\u001b[49m\u001b[43m.\u001b[49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 883\u001b[39m handles.append(handle)\n\u001b[32m 885\u001b[39m \u001b[38;5;66;03m# Convert BytesIO or file objects passed with an encoding\u001b[39;00m\n", + "\u001b[31mFileNotFoundError\u001b[39m: [Errno 2] No such file or directory: 'data/WORC_Employment.xlsx'" + ] + } + ], + "source": [ + "# Read in data\n", + "worc = pd.read_excel(\"data/WORC_Employment.xlsx\")\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "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.13.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 6e2dca934da3be7af4418eed40cc8e7f56c2f6fb Mon Sep 17 00:00:00 2001 From: luckycarms Date: Fri, 18 Jul 2025 16:25:40 -0400 Subject: [PATCH 2/7] updating worc_cleaning notebook --- data/worc_cleaning.ipynb | 583 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 567 insertions(+), 16 deletions(-) diff --git a/data/worc_cleaning.ipynb b/data/worc_cleaning.ipynb index 1fada8e..150f9ef 100644 --- a/data/worc_cleaning.ipynb +++ b/data/worc_cleaning.ipynb @@ -25,13 +25,281 @@ "2. Read in the data" ] }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import os\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Read in file\n", + "import os\n", + "\n", + "file_path = \"WORC_Employment.xlsx\"\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# read in file\n", + "worc = pd.read_excel(file_path)" + ] + }, { "cell_type": "code", "execution_count": 4, "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Auto IdFull NameEmailEnrollmentIdEmployment History NameCompany NameJob TitleStart DateProgram: Program NameMailing CityMailing Zip/Postal CodeATP Placement TypeSalaryGenderRaceKY Region
0202203-7853name namename@gmail.comEnrollment-6442EH-001676Appalachian Regional HealthcareNetwork Coordinator2023-10-09Code Kentucky 22-23Lost Creek41348First ATP Placement - New to Tech16.00MaleWhiteSOAR
1202207-8826name namename@gmail.comEnrollment-6188EH-001824MCHC - Mountain Comprehensive Health CorporationJunior IT systems administrator2024-02-12Code Kentucky 22-23Greys Knob40808First ATP Placement - New to Tech18.00FemaleWhiteSOAR
2202306-12150name namename@gmail.comEnrollment-7740EH-002555University of KentuckyTechnical Support Specialist II2024-04-01Code Kentucky 23-24Richmond40475First ATP Placement - Promotion25.00MaleWhiteSOAR
3202207-9034name namename@gmail.comEnrollment-6146EH-002207Childers oil companyWeb developer2024-04-23Code Kentucky 22-23Hazard41701First ATP Placement - New to Tech26.92MaleWhiteSOAR
4202306-12149name namename@gmail.comEnrollment-7701EH-002294Code:YouStudent Community Coordinator2024-05-20Code Kentucky 23-24Eubank42567First ATP Placement - New to Tech25.48FemaleWhiteSOAR
\n", + "
" + ], + "text/plain": [ + " Auto Id Full Name Email EnrollmentId \\\n", + "0 202203-7853 name name name@gmail.com Enrollment-6442 \n", + "1 202207-8826 name name name@gmail.com Enrollment-6188 \n", + "2 202306-12150 name name name@gmail.com Enrollment-7740 \n", + "3 202207-9034 name name name@gmail.com Enrollment-6146 \n", + "4 202306-12149 name name name@gmail.com Enrollment-7701 \n", + "\n", + " Employment History Name Company Name \\\n", + "0 EH-001676 Appalachian Regional Healthcare \n", + "1 EH-001824 MCHC - Mountain Comprehensive Health Corporation \n", + "2 EH-002555 University of Kentucky \n", + "3 EH-002207 Childers oil company \n", + "4 EH-002294 Code:You \n", + "\n", + " Job Title Start Date Program: Program Name \\\n", + "0 Network Coordinator 2023-10-09 Code Kentucky 22-23 \n", + "1 Junior IT systems administrator 2024-02-12 Code Kentucky 22-23 \n", + "2 Technical Support Specialist II 2024-04-01 Code Kentucky 23-24 \n", + "3 Web developer 2024-04-23 Code Kentucky 22-23 \n", + "4 Student Community Coordinator 2024-05-20 Code Kentucky 23-24 \n", + "\n", + " Mailing City Mailing Zip/Postal Code ATP Placement Type \\\n", + "0 Lost Creek 41348 First ATP Placement - New to Tech \n", + "1 Greys Knob 40808 First ATP Placement - New to Tech \n", + "2 Richmond 40475 First ATP Placement - Promotion \n", + "3 Hazard 41701 First ATP Placement - New to Tech \n", + "4 Eubank 42567 First ATP Placement - New to Tech \n", + "\n", + " Salary Gender Race KY Region \n", + "0 16.00 Male White SOAR \n", + "1 18.00 Female White SOAR \n", + "2 25.00 Male White SOAR \n", + "3 26.92 Male White SOAR \n", + "4 25.48 Female White SOAR " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# review top 5\n", + "worc.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(25, 16)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "worc.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Review of data \n", + "\n", + "1. Check for unique values in name, email, ATP Placement Type column - to determine if necessary to keep\n", + "2. Check for null values - remove" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, "outputs": [], "source": [ - "import pandas as pd\n" + "def unique(df, column='column'):\n", + " \"\"\"\n", + " Check for unique values in a specified DataFrame column.\n", + "\n", + " Parameters:\n", + " df: The DataFrame that contains the data.\n", + " column: The name of the column to check for uniqueness.\n", + "\n", + " Returns:\n", + " numpy.ndarray: An array of unique values in the specified column.\n", + " \"\"\"\n", + " unique_values = df[column].unique()\n", + " print(f\"Unique values in '{column}': {unique_values}\")\n", + " \n", + " return unique_values\n" ] }, { @@ -40,25 +308,308 @@ "metadata": {}, "outputs": [ { - "ename": "FileNotFoundError", - "evalue": "[Errno 2] No such file or directory: 'data/WORC_Employment.xlsx'", - "output_type": "error", - "traceback": [ - "\u001b[31m---------------------------------------------------------------------------\u001b[39m", - "\u001b[31mFileNotFoundError\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[7]\u001b[39m\u001b[32m, line 2\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;66;03m# Read in data\u001b[39;00m\n\u001b[32m----> \u001b[39m\u001b[32m2\u001b[39m worc = \u001b[43mpd\u001b[49m\u001b[43m.\u001b[49m\u001b[43mread_excel\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mdata/WORC_Employment.xlsx\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/PROJECTS/CodeYouDataProject/venv/lib/python3.13/site-packages/pandas/io/excel/_base.py:495\u001b[39m, in \u001b[36mread_excel\u001b[39m\u001b[34m(io, sheet_name, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skiprows, nrows, na_values, keep_default_na, na_filter, verbose, parse_dates, date_parser, date_format, thousands, decimal, comment, skipfooter, storage_options, dtype_backend, engine_kwargs)\u001b[39m\n\u001b[32m 493\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(io, ExcelFile):\n\u001b[32m 494\u001b[39m should_close = \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m495\u001b[39m io = \u001b[43mExcelFile\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 496\u001b[39m \u001b[43m \u001b[49m\u001b[43mio\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 497\u001b[39m \u001b[43m \u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 498\u001b[39m \u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[43m=\u001b[49m\u001b[43mengine\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 499\u001b[39m \u001b[43m \u001b[49m\u001b[43mengine_kwargs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mengine_kwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 500\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 501\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m engine \u001b[38;5;129;01mand\u001b[39;00m engine != io.engine:\n\u001b[32m 502\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 503\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mEngine should not be specified when passing \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 504\u001b[39m \u001b[33m\"\u001b[39m\u001b[33man ExcelFile - ExcelFile already has the engine set\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 505\u001b[39m )\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/PROJECTS/CodeYouDataProject/venv/lib/python3.13/site-packages/pandas/io/excel/_base.py:1550\u001b[39m, in \u001b[36mExcelFile.__init__\u001b[39m\u001b[34m(self, path_or_buffer, engine, storage_options, engine_kwargs)\u001b[39m\n\u001b[32m 1548\u001b[39m ext = \u001b[33m\"\u001b[39m\u001b[33mxls\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 1549\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1550\u001b[39m ext = \u001b[43minspect_excel_format\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 1551\u001b[39m \u001b[43m \u001b[49m\u001b[43mcontent_or_path\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstorage_options\u001b[49m\n\u001b[32m 1552\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1553\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m ext \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 1554\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 1555\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mExcel file format cannot be determined, you must specify \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 1556\u001b[39m \u001b[33m\"\u001b[39m\u001b[33man engine manually.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 1557\u001b[39m )\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/PROJECTS/CodeYouDataProject/venv/lib/python3.13/site-packages/pandas/io/excel/_base.py:1402\u001b[39m, in \u001b[36minspect_excel_format\u001b[39m\u001b[34m(content_or_path, storage_options)\u001b[39m\n\u001b[32m 1399\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(content_or_path, \u001b[38;5;28mbytes\u001b[39m):\n\u001b[32m 1400\u001b[39m content_or_path = BytesIO(content_or_path)\n\u001b[32m-> \u001b[39m\u001b[32m1402\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[43mget_handle\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 1403\u001b[39m \u001b[43m \u001b[49m\u001b[43mcontent_or_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mrb\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mis_text\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\n\u001b[32m 1404\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m handle:\n\u001b[32m 1405\u001b[39m stream = handle.handle\n\u001b[32m 1406\u001b[39m stream.seek(\u001b[32m0\u001b[39m)\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/PROJECTS/CodeYouDataProject/venv/lib/python3.13/site-packages/pandas/io/common.py:882\u001b[39m, in \u001b[36mget_handle\u001b[39m\u001b[34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[39m\n\u001b[32m 873\u001b[39m handle = \u001b[38;5;28mopen\u001b[39m(\n\u001b[32m 874\u001b[39m handle,\n\u001b[32m 875\u001b[39m ioargs.mode,\n\u001b[32m (...)\u001b[39m\u001b[32m 878\u001b[39m newline=\u001b[33m\"\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 879\u001b[39m )\n\u001b[32m 880\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 881\u001b[39m \u001b[38;5;66;03m# Binary mode\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m882\u001b[39m handle = \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mhandle\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mioargs\u001b[49m\u001b[43m.\u001b[49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 883\u001b[39m handles.append(handle)\n\u001b[32m 885\u001b[39m \u001b[38;5;66;03m# Convert BytesIO or file objects passed with an encoding\u001b[39;00m\n", - "\u001b[31mFileNotFoundError\u001b[39m: [Errno 2] No such file or directory: 'data/WORC_Employment.xlsx'" + "name": "stdout", + "output_type": "stream", + "text": [ + "Unique values in 'Full Name': ['name name']\n", + "Unique values in 'Email': ['name@gmail.com']\n", + "Unique values in 'ATP Placement Type': ['First ATP Placement - New to Tech' 'First ATP Placement - Promotion'\n", + " 'First ATP Placement - Already in Tech']\n" ] + }, + { + "data": { + "text/plain": [ + "array(['First ATP Placement - New to Tech',\n", + " 'First ATP Placement - Promotion',\n", + " 'First ATP Placement - Already in Tech'], dtype=object)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "# Read in data\n", - "worc = pd.read_excel(\"data/WORC_Employment.xlsx\")\n", - "\n" + "unique(worc,'Full Name')\n", + "unique(worc, 'Email')\n", + "unique(worc, 'ATP Placement Type')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.True_" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Check for isnull\n", + "worc.isnull().any().any()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Auto Id 0\n", + "Full Name 0\n", + "Email 0\n", + "EnrollmentId 0\n", + "Employment History Name 0\n", + "Company Name 0\n", + "Job Title 0\n", + "Start Date 0\n", + "Program: Program Name 0\n", + "Mailing City 0\n", + "Mailing Zip/Postal Code 0\n", + "ATP Placement Type 0\n", + "Salary 3\n", + "Gender 0\n", + "Race 0\n", + "KY Region 0\n", + "dtype: int64" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Checking where isnull values are located\n", + "worc.isnull().sum()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Which Columns to Drop\n", + "- Will drop name and email since there is no uniqueness\n", + "- Will drop na/null as well" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# Dropping multiple columns based including those with no unique values as well as those that seem unnecessary\n", + "cols_to_drop = ['Full Name', 'Email', 'Auto Id','Employment History Name']\n", + "\n", + "worc_cols_dropped = worc.drop(columns=cols_to_drop, axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "worc_cols_dropped_nulls = worc_cols_dropped.dropna()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "worc_cleaned = worc_cols_dropped_nulls" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(22, 12)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "worc_cleaned.shape" + ] + }, + { + "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", + "
EnrollmentIdCompany NameJob TitleStart DateProgram: Program NameMailing CityMailing Zip/Postal CodeATP Placement TypeSalaryGenderRaceKY Region
0Enrollment-6442Appalachian Regional HealthcareNetwork Coordinator2023-10-09Code Kentucky 22-23Lost Creek41348First ATP Placement - New to Tech16.00MaleWhiteSOAR
1Enrollment-6188MCHC - Mountain Comprehensive Health CorporationJunior IT systems administrator2024-02-12Code Kentucky 22-23Greys Knob40808First ATP Placement - New to Tech18.00FemaleWhiteSOAR
2Enrollment-7740University of KentuckyTechnical Support Specialist II2024-04-01Code Kentucky 23-24Richmond40475First ATP Placement - Promotion25.00MaleWhiteSOAR
3Enrollment-6146Childers oil companyWeb developer2024-04-23Code Kentucky 22-23Hazard41701First ATP Placement - New to Tech26.92MaleWhiteSOAR
4Enrollment-7701Code:YouStudent Community Coordinator2024-05-20Code Kentucky 23-24Eubank42567First ATP Placement - New to Tech25.48FemaleWhiteSOAR
\n", + "
" + ], + "text/plain": [ + " EnrollmentId Company Name \\\n", + "0 Enrollment-6442 Appalachian Regional Healthcare \n", + "1 Enrollment-6188 MCHC - Mountain Comprehensive Health Corporation \n", + "2 Enrollment-7740 University of Kentucky \n", + "3 Enrollment-6146 Childers oil company \n", + "4 Enrollment-7701 Code:You \n", + "\n", + " Job Title Start Date Program: Program Name \\\n", + "0 Network Coordinator 2023-10-09 Code Kentucky 22-23 \n", + "1 Junior IT systems administrator 2024-02-12 Code Kentucky 22-23 \n", + "2 Technical Support Specialist II 2024-04-01 Code Kentucky 23-24 \n", + "3 Web developer 2024-04-23 Code Kentucky 22-23 \n", + "4 Student Community Coordinator 2024-05-20 Code Kentucky 23-24 \n", + "\n", + " Mailing City Mailing Zip/Postal Code ATP Placement Type \\\n", + "0 Lost Creek 41348 First ATP Placement - New to Tech \n", + "1 Greys Knob 40808 First ATP Placement - New to Tech \n", + "2 Richmond 40475 First ATP Placement - Promotion \n", + "3 Hazard 41701 First ATP Placement - New to Tech \n", + "4 Eubank 42567 First ATP Placement - New to Tech \n", + "\n", + " Salary Gender Race KY Region \n", + "0 16.00 Male White SOAR \n", + "1 18.00 Female White SOAR \n", + "2 25.00 Male White SOAR \n", + "3 26.92 Male White SOAR \n", + "4 25.48 Female White SOAR " + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "worc_cleaned.head()" ] } ], From ac09aa88ad475fbc63566ffdc2594be908b2476c Mon Sep 17 00:00:00 2001 From: luckycarms Date: Mon, 21 Jul 2025 12:59:39 -0400 Subject: [PATCH 3/7] updated file to add Full name and Email since it is still needed --- data/worc_cleaning.ipynb | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/data/worc_cleaning.ipynb b/data/worc_cleaning.ipynb index 150f9ef..50975bf 100644 --- a/data/worc_cleaning.ipynb +++ b/data/worc_cleaning.ipynb @@ -399,7 +399,7 @@ "metadata": {}, "source": [ "# Which Columns to Drop\n", - "- Will drop name and email since there is no uniqueness\n", + "- Even though there are no unique values for name and email will keep those items as requested\n", "- Will drop na/null as well" ] }, @@ -410,7 +410,7 @@ "outputs": [], "source": [ "# Dropping multiple columns based including those with no unique values as well as those that seem unnecessary\n", - "cols_to_drop = ['Full Name', 'Email', 'Auto Id','Employment History Name']\n", + "cols_to_drop = ['Auto Id','Employment History Name']\n", "\n", "worc_cols_dropped = worc.drop(columns=cols_to_drop, axis=1)" ] @@ -441,7 +441,7 @@ { "data": { "text/plain": [ - "(22, 12)" + "(22, 14)" ] }, "execution_count": 13, @@ -479,6 +479,8 @@ " \n", " \n", " \n", + " Full Name\n", + " Email\n", " EnrollmentId\n", " Company Name\n", " Job Title\n", @@ -496,6 +498,8 @@ " \n", " \n", " 0\n", + " name name\n", + " name@gmail.com\n", " Enrollment-6442\n", " Appalachian Regional Healthcare\n", " Network Coordinator\n", @@ -511,6 +515,8 @@ " \n", " \n", " 1\n", + " name name\n", + " name@gmail.com\n", " Enrollment-6188\n", " MCHC - Mountain Comprehensive Health Corporation\n", " Junior IT systems administrator\n", @@ -526,6 +532,8 @@ " \n", " \n", " 2\n", + " name name\n", + " name@gmail.com\n", " Enrollment-7740\n", " University of Kentucky\n", " Technical Support Specialist II\n", @@ -541,6 +549,8 @@ " \n", " \n", " 3\n", + " name name\n", + " name@gmail.com\n", " Enrollment-6146\n", " Childers oil company\n", " Web developer\n", @@ -556,6 +566,8 @@ " \n", " \n", " 4\n", + " name name\n", + " name@gmail.com\n", " Enrollment-7701\n", " Code:You\n", " Student Community Coordinator\n", @@ -574,12 +586,19 @@ "" ], "text/plain": [ - " EnrollmentId Company Name \\\n", - "0 Enrollment-6442 Appalachian Regional Healthcare \n", - "1 Enrollment-6188 MCHC - Mountain Comprehensive Health Corporation \n", - "2 Enrollment-7740 University of Kentucky \n", - "3 Enrollment-6146 Childers oil company \n", - "4 Enrollment-7701 Code:You \n", + " Full Name Email EnrollmentId \\\n", + "0 name name name@gmail.com Enrollment-6442 \n", + "1 name name name@gmail.com Enrollment-6188 \n", + "2 name name name@gmail.com Enrollment-7740 \n", + "3 name name name@gmail.com Enrollment-6146 \n", + "4 name name name@gmail.com Enrollment-7701 \n", + "\n", + " Company Name \\\n", + "0 Appalachian Regional Healthcare \n", + "1 MCHC - Mountain Comprehensive Health Corporation \n", + "2 University of Kentucky \n", + "3 Childers oil company \n", + "4 Code:You \n", "\n", " Job Title Start Date Program: Program Name \\\n", "0 Network Coordinator 2023-10-09 Code Kentucky 22-23 \n", From 903c2c508ac3ed52a6f4f3eb742725cd02e0fcb9 Mon Sep 17 00:00:00 2001 From: luckycarms Date: Tue, 22 Jul 2025 18:34:39 -0400 Subject: [PATCH 4/7] added the cleaning-worc as python file --- data/Carmen_WORCEmployment.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 data/Carmen_WORCEmployment.py diff --git a/data/Carmen_WORCEmployment.py b/data/Carmen_WORCEmployment.py new file mode 100644 index 0000000..1ab64f4 --- /dev/null +++ b/data/Carmen_WORCEmployment.py @@ -0,0 +1,33 @@ +import pandas as pd +import os + +file_path = "data/WORC_Employment.xlsx" +worc = pd.read_excel(file_path) + +def unique(df, column='column'): + """ + Check for unique values in a specified DataFrame column. + + Parameters: + df: The DataFrame that contains the data. + column: The name of the column to check for uniqueness. + + Returns: + numpy.ndarray: An array of unique values in the specified column. + """ + unique_values = df[column].unique() + print(f"Unique values in '{column}': {unique_values}") + + return unique_values + +unique(worc, 'ATP Placement Type') + +worc.isnull().any().any() + +cols_to_drop = ['Auto Id','Employment History Name'] + +worc_cols_dropped = worc.drop(columns=cols_to_drop, axis=1) + +worc_cols_dropped_nulls = worc_cols_dropped.dropna() + +worc_cleaned = worc_cols_dropped_nulls \ No newline at end of file From b1678b797bb49495e86d9c3a17b808cdc9996e18 Mon Sep 17 00:00:00 2001 From: luckycarms Date: Tue, 22 Jul 2025 20:45:05 -0400 Subject: [PATCH 5/7] saved file --- data/worc_cleaning.ipynb | 1 - 1 file changed, 1 deletion(-) diff --git a/data/worc_cleaning.ipynb b/data/worc_cleaning.ipynb index 50975bf..f71dd2e 100644 --- a/data/worc_cleaning.ipynb +++ b/data/worc_cleaning.ipynb @@ -42,7 +42,6 @@ "outputs": [], "source": [ "# Read in file\n", - "import os\n", "\n", "file_path = \"WORC_Employment.xlsx\"\n", "\n" From 8d825042ff141b752f1881723e10f48bac8ce38c Mon Sep 17 00:00:00 2001 From: luckycarms Date: Wed, 23 Jul 2025 10:11:44 -0400 Subject: [PATCH 6/7] updated to only cleaning info of column and null removals --- data/Carmen_WORCEmployment.py | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/data/Carmen_WORCEmployment.py b/data/Carmen_WORCEmployment.py index 1ab64f4..92f9cb3 100644 --- a/data/Carmen_WORCEmployment.py +++ b/data/Carmen_WORCEmployment.py @@ -4,26 +4,6 @@ file_path = "data/WORC_Employment.xlsx" worc = pd.read_excel(file_path) -def unique(df, column='column'): - """ - Check for unique values in a specified DataFrame column. - - Parameters: - df: The DataFrame that contains the data. - column: The name of the column to check for uniqueness. - - Returns: - numpy.ndarray: An array of unique values in the specified column. - """ - unique_values = df[column].unique() - print(f"Unique values in '{column}': {unique_values}") - - return unique_values - -unique(worc, 'ATP Placement Type') - -worc.isnull().any().any() - cols_to_drop = ['Auto Id','Employment History Name'] worc_cols_dropped = worc.drop(columns=cols_to_drop, axis=1) From 203efe95c415c7cc1e05f0de376473d5cd4e32db Mon Sep 17 00:00:00 2001 From: luckycarms Date: Fri, 25 Jul 2025 17:45:26 -0400 Subject: [PATCH 7/7] exported cleaned data to excel to create dashboard --- data/WORC_Employment.xlsx | Bin 8882 -> 7520 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/data/WORC_Employment.xlsx b/data/WORC_Employment.xlsx index 1e5f8007f75b0745f82b0b3ce92e9b4ad048d0c9..6afd7d51ae31c220b4f18277852bf4195d3cee75 100644 GIT binary patch literal 7520 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