├── tests ├── __init__.py └── unit_tests │ └── test_something.py ├── pyproject.toml ├── check_poetry_version.sh ├── Makefile ├── .github └── workflows │ └── workflow.yaml ├── README.md ├── .gitignore ├── kaggle-workshops.ipynb └── poetry.lock /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/unit_tests/test_something.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | def test_zeros(): 5 | matrix = np.array([[0, 0, 0], [0, 0, 0]]) 6 | assert np.array_equal(matrix, np.zeros_like(matrix)) 7 | 8 | 9 | def test_random_matrix(): 10 | matrix = np.ones((3, 3)) 11 | assert matrix.shape == (3, 3) 12 | assert np.array_equal(matrix, np.ones((3, 3))) # Do not change this line 13 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "kaggle-tutorial" 3 | version = "0.5.1" 4 | description = "" 5 | authors = ["Jan Karas "] 6 | readme = "README.md" 7 | 8 | [tool.poetry.dependencies] 9 | python = "^3.12" 10 | kaggle = "^1.6.17" 11 | ruff = "^0.8.1" 12 | pytest = "^8.3.4" 13 | numpy = "^2.1.3" 14 | 15 | 16 | [build-system] 17 | requires = ["poetry-core"] 18 | build-backend = "poetry.core.masonry.api" 19 | -------------------------------------------------------------------------------- /check_poetry_version.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | base_version=$(git show origin/main:pyproject.toml | grep '^version = ' | cut -d '"' -f2) 4 | branch_version=$(grep '^version = ' pyproject.toml | cut -d '"' -f2) 5 | 6 | if [ "$(printf '%s\n' "$base_version" "$branch_version" | sort -V | tail -n 1)" = "$base_version" ]; then 7 | echo "Version in pyproject.toml on branch must be higher than on main." 8 | exit 1 9 | else 10 | echo "Version check passed: branch version is higher." 11 | fi 12 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | COMPETITION = "titanic" 2 | FILE = "gender_submission.csv" 3 | MESSAGE = "Submittion of Kaggle Titanic!" 4 | 5 | ifeq ($(OS),Windows_NT) 6 | MKDIR := powershell -Command "if (!(Test-Path './data/$(COMPETITION)')) { New-Item -ItemType Directory -Path './data/$(COMPETITION)' }" 7 | RM := del /q 8 | UNZIP := powershell -Command "Expand-Archive -Path" 9 | DEST := -DestinationPath 10 | else 11 | MKDIR := mkdir -p ./data/$(COMPETITION) 12 | RM := rm -f 13 | UNZIP := unzip 14 | DEST := -d 15 | endif 16 | 17 | install: 18 | poetry install --no-root 19 | 20 | test: 21 | poetry run pytest ./tests -vv 22 | 23 | update: 24 | poetry update 25 | 26 | format: 27 | poetry run ruff format . 28 | poetry run ruff check . --fix 29 | 30 | check: 31 | poetry run ruff format --check . 32 | 33 | kaggle-download: 34 | kaggle competitions download -c $(COMPETITION) 35 | $(MKDIR) 36 | $(UNZIP) $(COMPETITION).zip $(DEST) ./data/$(COMPETITION) 37 | $(RM) $(COMPETITION).zip 38 | 39 | kaggle-submit: 40 | kaggle competitions submit -c $(COMPETITION) -f ./data/$(COMPETITION)/$(FILE) -m $(MESSAGE) -------------------------------------------------------------------------------- /.github/workflows/workflow.yaml: -------------------------------------------------------------------------------- 1 | name: Check formatting, version bumping and unit tests 2 | 3 | on: 4 | pull_request: 5 | branches: [main] 6 | 7 | jobs: 8 | test: 9 | runs-on: ubuntu-latest 10 | 11 | steps: 12 | - name: Checkout code 13 | uses: actions/checkout@v3 14 | 15 | - name: Set up Python 16 | uses: actions/setup-python@v4 17 | with: 18 | python-version: '3.12' 19 | 20 | - name: Install Poetry 21 | uses: abatilo/actions-poetry@v2.1.0 22 | with: 23 | poetry-version: '1.8.3' 24 | 25 | - name: Install dependencies 26 | run: poetry install --no-root 27 | 28 | - name: Fetch all branches 29 | run: git fetch --all 30 | 31 | - name: Make version check script executable 32 | run: chmod +x check_poetry_version.sh 33 | 34 | - name: Check version bump in pyproject.toml 35 | run: bash ./check_poetry_version.sh 36 | 37 | - name: Check code formatting 38 | run: make check 39 | 40 | - name: Run tests 41 | run: make test 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🌊 Kaggle Tutorial 🚢 2 | > Welcome to the **Kaggle Titanic Tutorial**! This repository is designed as a starter guide for Kaggle competitions, created by **Świta Znachora** for WAVE 3 Workshops. 🚀 3 | 4 | The Titanic Competition is a great way to start with Kaggle and machine learning. Your goal is to predict which passengers survived the Titanic tragedy based on various attributes such as age, class, and gender. 5 | 6 | Helpful links: 7 | - [How to Use Kaggle](https://www.kaggle.com/docs/api#getting-started-installation-&-authentication) - official guide 8 | how to use Kaggle via API. 9 | - [Titanic Competition](https://www.kaggle.com/competitions/titanic/overview/evaluation) 10 | 11 | ### 📋 Prerequisites 12 | 13 | **Kaggle Account**: Make sure you have a Kaggle account. Sign up [here](https://www.kaggle.com/account/login) if you don’t already have one. 14 | 15 | **Kaggle API Token**: 16 | - Go to [Account Settings](https://www.kaggle.com/account). 17 | - Scroll to "API" and click "Create New API Token." 18 | - Save the `kaggle.json` file in the folder: `~/.kaggle/`. 19 | 20 | **Install Poetry**: 21 | Poetry is used to manage dependencies. Follow the installation instructions [here](https://python-poetry.org/docs/). 22 | 23 | ### ⭐ Repository Setup 24 | 25 | **Star and Fork the Repository**: 26 | - Click the "Star" button at the top of this repository. 🌟 27 | - Click the "Fork" button to create your own copy of the repository. 28 | 29 | **Clone Your Fork**: 30 | Once you've forked the repository, clone it to your local machine: 31 | ```shell 32 | git clone https://github.com/knsiczarnamagia/kaggle-tutorial.git 33 | ```` 34 | Install dependencies 35 | ```shell 36 | make install 37 | ``` 38 | ### 🚀 Using the Repository 39 | Download the Titanic Dataset 40 | Run the following command to download and prepare the dataset: 41 | ```shell 42 | make kaggle-download 43 | ``` 44 | Submit Your Solution 45 | Once you've prepared your solution (e.g., edited gender_submission.csv), you can submit it to Kaggle: 46 | ```shell 47 | make kaggle-submit 48 | ``` -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # pdm 105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 106 | #pdm.lock 107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 108 | # in version control. 109 | # https://pdm.fming.dev/latest/usage/project/#working-with-version-control 110 | .pdm.toml 111 | .pdm-python 112 | .pdm-build/ 113 | 114 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 115 | __pypackages__/ 116 | 117 | # Celery stuff 118 | celerybeat-schedule 119 | celerybeat.pid 120 | 121 | # SageMath parsed files 122 | *.sage.py 123 | 124 | # Environments 125 | .env 126 | .venv 127 | env/ 128 | venv/ 129 | ENV/ 130 | env.bak/ 131 | venv.bak/ 132 | 133 | # Spyder project settings 134 | .spyderproject 135 | .spyproject 136 | 137 | # Rope project settings 138 | .ropeproject 139 | 140 | # mkdocs documentation 141 | /site 142 | 143 | # mypy 144 | .mypy_cache/ 145 | .dmypy.json 146 | dmypy.json 147 | 148 | # Pyre type checker 149 | .pyre/ 150 | 151 | # pytype static type analyzer 152 | .pytype/ 153 | 154 | # Cython debug symbols 155 | cython_debug/ 156 | 157 | # PyCharm 158 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 159 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 160 | # and can be added to the global gitignore or merged into this file. For a more nuclear 161 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 162 | .idea 163 | *.csv 164 | *.zip 165 | /data -------------------------------------------------------------------------------- /kaggle-workshops.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "id": "93c4d7cc", 7 | "metadata": { 8 | "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19", 9 | "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5", 10 | "execution": { 11 | "iopub.execute_input": "2024-11-11T16:20:38.699516Z", 12 | "iopub.status.busy": "2024-11-11T16:20:38.699033Z", 13 | "iopub.status.idle": "2024-11-11T16:20:39.653991Z", 14 | "shell.execute_reply": "2024-11-11T16:20:39.652822Z" 15 | }, 16 | "papermill": { 17 | "duration": 0.964664, 18 | "end_time": "2024-11-11T16:20:39.656393", 19 | "exception": false, 20 | "start_time": "2024-11-11T16:20:38.691729", 21 | "status": "completed" 22 | }, 23 | "tags": [] 24 | }, 25 | "outputs": [], 26 | "source": [ 27 | "# This Python 3 environment comes with many helpful analytics libraries installed\n", 28 | "# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n", 29 | "# For example, here's several helpful packages to load\n", 30 | "\n", 31 | "import numpy as np # linear algebra\n", 32 | "import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n", 33 | "\n", 34 | "# Input data files are available in the read-only \"../input/\" directory\n", 35 | "# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n", 36 | "\n", 37 | "import os\n", 38 | "\n", 39 | "for dirname, _, filenames in os.walk(\"data/titanic\"):\n", 40 | " for filename in filenames:\n", 41 | " print(os.path.join(dirname, filename))\n", 42 | "\n", 43 | "# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\"\n", 44 | "# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session" 45 | ] 46 | }, 47 | { 48 | "cell_type": "markdown", 49 | "id": "80c511a1", 50 | "metadata": { 51 | "papermill": { 52 | "duration": 0.00487, 53 | "end_time": "2024-11-11T16:20:39.666646", 54 | "exception": false, 55 | "start_time": "2024-11-11T16:20:39.661776", 56 | "status": "completed" 57 | }, 58 | "tags": [] 59 | }, 60 | "source": [ 61 | "# Typical workflow: \n", 62 | "1. data exploration (visualization, understanding the data/problem)\n", 63 | "2. cleaning/imputation (e.g. `fillna`, removal of redundant/least important columns etc.). \n", 64 | "3. model selection, training (is this problem classification or regression; selection of the most efficient model)\n", 65 | "4. submit prediction" 66 | ] 67 | }, 68 | { 69 | "cell_type": "markdown", 70 | "id": "d3b469eb", 71 | "metadata": { 72 | "papermill": { 73 | "duration": 0.004755, 74 | "end_time": "2024-11-11T16:20:39.676508", 75 | "exception": false, 76 | "start_time": "2024-11-11T16:20:39.671753", 77 | "status": "completed" 78 | }, 79 | "tags": [] 80 | }, 81 | "source": [ 82 | "# 1. EDA - Exploratory Data Analysis" 83 | ] 84 | }, 85 | { 86 | "cell_type": "markdown", 87 | "id": "fac3b8c6", 88 | "metadata": { 89 | "papermill": { 90 | "duration": 0.004779, 91 | "end_time": "2024-11-11T16:20:39.686395", 92 | "exception": false, 93 | "start_time": "2024-11-11T16:20:39.681616", 94 | "status": "completed" 95 | }, 96 | "tags": [] 97 | }, 98 | "source": [ 99 | "## Read datacard of competition\n", 100 | "\n", 101 | "https://www.kaggle.com/competitions/titanic/data" 102 | ] 103 | }, 104 | { 105 | "cell_type": "markdown", 106 | "id": "5c0c21f6", 107 | "metadata": { 108 | "papermill": { 109 | "duration": 0.004784, 110 | "end_time": "2024-11-11T16:20:39.696374", 111 | "exception": false, 112 | "start_time": "2024-11-11T16:20:39.691590", 113 | "status": "completed" 114 | }, 115 | "tags": [] 116 | }, 117 | "source": [ 118 | "## Read data" 119 | ] 120 | }, 121 | { 122 | "cell_type": "code", 123 | "execution_count": null, 124 | "id": "8fd1acf3", 125 | "metadata": { 126 | "execution": { 127 | "iopub.execute_input": "2024-11-11T16:20:39.708406Z", 128 | "iopub.status.busy": "2024-11-11T16:20:39.707839Z", 129 | "iopub.status.idle": "2024-11-11T16:20:39.774945Z", 130 | "shell.execute_reply": "2024-11-11T16:20:39.773766Z" 131 | }, 132 | "papermill": { 133 | "duration": 0.075999, 134 | "end_time": "2024-11-11T16:20:39.777576", 135 | "exception": false, 136 | "start_time": "2024-11-11T16:20:39.701577", 137 | "status": "completed" 138 | }, 139 | "tags": [] 140 | }, 141 | "outputs": [], 142 | "source": [ 143 | "train = pd.read_csv(\"data/titanic/train.csv\", index_col=\"PassengerId\")\n", 144 | "test = pd.read_csv(\"data/titanic/test.csv\", index_col=\"PassengerId\")\n", 145 | "train.head(10)" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": null, 151 | "id": "5777d7b4", 152 | "metadata": { 153 | "execution": { 154 | "iopub.execute_input": "2024-11-11T16:20:39.791905Z", 155 | "iopub.status.busy": "2024-11-11T16:20:39.791505Z", 156 | "iopub.status.idle": "2024-11-11T16:20:39.823247Z", 157 | "shell.execute_reply": "2024-11-11T16:20:39.822240Z" 158 | }, 159 | "papermill": { 160 | "duration": 0.042229, 161 | "end_time": "2024-11-11T16:20:39.825569", 162 | "exception": false, 163 | "start_time": "2024-11-11T16:20:39.783340", 164 | "status": "completed" 165 | }, 166 | "tags": [] 167 | }, 168 | "outputs": [], 169 | "source": [ 170 | "train.describe() # stats of each column" 171 | ] 172 | }, 173 | { 174 | "cell_type": "code", 175 | "execution_count": null, 176 | "id": "2b307511", 177 | "metadata": { 178 | "execution": { 179 | "iopub.execute_input": "2024-11-11T16:20:39.838748Z", 180 | "iopub.status.busy": "2024-11-11T16:20:39.838355Z", 181 | "iopub.status.idle": "2024-11-11T16:20:39.846803Z", 182 | "shell.execute_reply": "2024-11-11T16:20:39.845690Z" 183 | }, 184 | "papermill": { 185 | "duration": 0.017705, 186 | "end_time": "2024-11-11T16:20:39.849102", 187 | "exception": false, 188 | "start_time": "2024-11-11T16:20:39.831397", 189 | "status": "completed" 190 | }, 191 | "tags": [] 192 | }, 193 | "outputs": [], 194 | "source": [ 195 | "train.dtypes # any suggestions/conclusions at this step?" 196 | ] 197 | }, 198 | { 199 | "cell_type": "code", 200 | "execution_count": null, 201 | "id": "0b56fd2f", 202 | "metadata": { 203 | "execution": { 204 | "iopub.execute_input": "2024-11-11T16:20:39.862565Z", 205 | "iopub.status.busy": "2024-11-11T16:20:39.862178Z", 206 | "iopub.status.idle": "2024-11-11T16:20:39.870811Z", 207 | "shell.execute_reply": "2024-11-11T16:20:39.869755Z" 208 | }, 209 | "papermill": { 210 | "duration": 0.017944, 211 | "end_time": "2024-11-11T16:20:39.873086", 212 | "exception": false, 213 | "start_time": "2024-11-11T16:20:39.855142", 214 | "status": "completed" 215 | }, 216 | "tags": [] 217 | }, 218 | "outputs": [], 219 | "source": [ 220 | "print(train.isnull().sum(), \"\\n\")\n", 221 | "print(test.isnull().sum())" 222 | ] 223 | }, 224 | { 225 | "cell_type": "code", 226 | "execution_count": null, 227 | "id": "b11a5a99", 228 | "metadata": { 229 | "execution": { 230 | "iopub.execute_input": "2024-11-11T16:20:39.886646Z", 231 | "iopub.status.busy": "2024-11-11T16:20:39.886263Z", 232 | "iopub.status.idle": "2024-11-11T16:20:43.948505Z", 233 | "shell.execute_reply": "2024-11-11T16:20:43.947125Z" 234 | }, 235 | "papermill": { 236 | "duration": 4.072432, 237 | "end_time": "2024-11-11T16:20:43.951467", 238 | "exception": false, 239 | "start_time": "2024-11-11T16:20:39.879035", 240 | "status": "completed" 241 | }, 242 | "tags": [] 243 | }, 244 | "outputs": [], 245 | "source": [ 246 | "import pandas as pd\n", 247 | "import seaborn as sns\n", 248 | "import matplotlib.pyplot as plt\n", 249 | "\n", 250 | "\n", 251 | "def eda_titanic_data(df):\n", 252 | " # Distribution of target variable 'Survived'\n", 253 | " plt.figure(figsize=(6, 4))\n", 254 | " sns.countplot(x=\"Survived\", data=df)\n", 255 | " plt.title(\"Survival Distribution\")\n", 256 | " plt.show()\n", 257 | "\n", 258 | " # Distribution of 'Age'\n", 259 | " plt.figure(figsize=(6, 4))\n", 260 | " sns.histplot(df[\"Age\"], kde=True, bins=10)\n", 261 | " plt.title(\"Age Distribution\")\n", 262 | " plt.show()\n", 263 | "\n", 264 | " # Distribution of 'Fare'\n", 265 | " plt.figure(figsize=(6, 4))\n", 266 | " sns.histplot(df[\"Fare\"], kde=True, bins=10)\n", 267 | " plt.title(\"Fare Distribution\")\n", 268 | " plt.show()\n", 269 | "\n", 270 | " plt.figure(figsize=(6, 4))\n", 271 | " sns.histplot(np.log1p(df[\"Fare\"]), kde=True, bins=30)\n", 272 | " plt.title(\"log(1+Fare) Distribution\")\n", 273 | " plt.show()\n", 274 | "\n", 275 | " # Survival rate by Sex\n", 276 | " plt.figure(figsize=(6, 4))\n", 277 | " sns.countplot(x=\"Sex\", hue=\"Survived\", data=df)\n", 278 | " plt.title(\"Survival Rate by Sex\")\n", 279 | " plt.show()\n", 280 | "\n", 281 | " # Survival rate by Pclass\n", 282 | " plt.figure(figsize=(6, 4))\n", 283 | " sns.countplot(x=\"Pclass\", hue=\"Survived\", data=df)\n", 284 | " plt.title(\"Survival Rate by Pclass\")\n", 285 | " plt.show()\n", 286 | "\n", 287 | " # Box Plot for Age vs Survived\n", 288 | " plt.figure(figsize=(6, 4))\n", 289 | " sns.boxplot(x=\"Survived\", y=\"Age\", data=df, palette=\"coolwarm\")\n", 290 | " plt.title(\"Age Distribution by Survival\")\n", 291 | " plt.show()\n", 292 | "\n", 293 | " # Correlation heatmap of numeric features\n", 294 | " plt.figure(figsize=(8, 6))\n", 295 | " corr = df.select_dtypes(include=[np.number]).corr()\n", 296 | " sns.heatmap(corr, annot=True, cmap=\"coolwarm\", fmt=\".2f\")\n", 297 | " plt.title(\"Correlation Heatmap\")\n", 298 | " plt.show()\n", 299 | "\n", 300 | "\n", 301 | "eda_titanic_data(train)" 302 | ] 303 | }, 304 | { 305 | "cell_type": "markdown", 306 | "id": "f79ae7b8", 307 | "metadata": { 308 | "papermill": { 309 | "duration": 0.009793, 310 | "end_time": "2024-11-11T16:20:43.972276", 311 | "exception": false, 312 | "start_time": "2024-11-11T16:20:43.962483", 313 | "status": "completed" 314 | }, 315 | "tags": [] 316 | }, 317 | "source": [ 318 | "# 2. Preprocessing" 319 | ] 320 | }, 321 | { 322 | "cell_type": "code", 323 | "execution_count": null, 324 | "id": "6349cc66", 325 | "metadata": { 326 | "execution": { 327 | "iopub.execute_input": "2024-11-11T16:20:43.994535Z", 328 | "iopub.status.busy": "2024-11-11T16:20:43.993668Z", 329 | "iopub.status.idle": "2024-11-11T16:20:44.196437Z", 330 | "shell.execute_reply": "2024-11-11T16:20:44.195268Z" 331 | }, 332 | "papermill": { 333 | "duration": 0.216821, 334 | "end_time": "2024-11-11T16:20:44.198997", 335 | "exception": false, 336 | "start_time": "2024-11-11T16:20:43.982176", 337 | "status": "completed" 338 | }, 339 | "tags": [] 340 | }, 341 | "outputs": [], 342 | "source": [ 343 | "from sklearn.preprocessing import LabelEncoder, StandardScaler\n", 344 | "\n", 345 | "\n", 346 | "def preprocess_data(train_df, test_df):\n", 347 | " # Drop the 'Name', 'Cabin', 'Ticket' columns from both train and test datasets\n", 348 | " train_df = train_df.drop([\"Name\", \"Cabin\", \"Ticket\"], axis=1)\n", 349 | " test_df = test_df.drop([\"Name\", \"Cabin\", \"Ticket\"], axis=1)\n", 350 | "\n", 351 | " # Fill missing Age values with the median\n", 352 | " median = train_df[\"Age\"].median()\n", 353 | " train_df[\"Age\"] = train_df[\"Age\"].fillna(median)\n", 354 | " test_df[\"Age\"] = test_df[\"Age\"].fillna(median)\n", 355 | "\n", 356 | " # Fill missing Embarked values with the most frequent value (mode)\n", 357 | " mode = train_df[\"Embarked\"].mode()[0]\n", 358 | " train_df[\"Embarked\"] = train_df[\"Embarked\"].fillna(mode)\n", 359 | " test_df[\"Embarked\"] = test_df[\"Embarked\"].fillna(mode)\n", 360 | "\n", 361 | " # Fill missing Fare values with the median and log\n", 362 | " median = train_df[\"Fare\"].median()\n", 363 | " train_df[\"Fare\"] = np.log1p(train_df[\"Fare\"].fillna(median))\n", 364 | " test_df[\"Fare\"] = np.log1p(test_df[\"Fare\"].fillna(median))\n", 365 | "\n", 366 | " # Encoding categorical features: 'Sex', 'Embarked'\n", 367 | " label_encoder = LabelEncoder()\n", 368 | " train_df[\"Sex\"] = label_encoder.fit_transform(train_df[\"Sex\"])\n", 369 | " test_df[\"Sex\"] = label_encoder.transform(test_df[\"Sex\"])\n", 370 | "\n", 371 | " train_df[\"Embarked\"] = label_encoder.fit_transform(train_df[\"Embarked\"])\n", 372 | " test_df[\"Embarked\"] = label_encoder.transform(test_df[\"Embarked\"])\n", 373 | "\n", 374 | " # Scale numeric features: Age, Fare\n", 375 | " scaler = StandardScaler()\n", 376 | " train_df[[\"Age\", \"Fare\"]] = scaler.fit_transform(train_df[[\"Age\", \"Fare\"]])\n", 377 | " test_df[[\"Age\", \"Fare\"]] = scaler.transform(test_df[[\"Age\", \"Fare\"]])\n", 378 | "\n", 379 | " return train_df, test_df\n", 380 | "\n", 381 | "\n", 382 | "train, test = preprocess_data(train, test)" 383 | ] 384 | }, 385 | { 386 | "cell_type": "code", 387 | "execution_count": null, 388 | "id": "df0624f0", 389 | "metadata": { 390 | "execution": { 391 | "iopub.execute_input": "2024-11-11T16:20:44.220760Z", 392 | "iopub.status.busy": "2024-11-11T16:20:44.219754Z", 393 | "iopub.status.idle": "2024-11-11T16:20:44.347070Z", 394 | "shell.execute_reply": "2024-11-11T16:20:44.345985Z" 395 | }, 396 | "papermill": { 397 | "duration": 0.140843, 398 | "end_time": "2024-11-11T16:20:44.349554", 399 | "exception": false, 400 | "start_time": "2024-11-11T16:20:44.208711", 401 | "status": "completed" 402 | }, 403 | "tags": [] 404 | }, 405 | "outputs": [], 406 | "source": [ 407 | "# Features and labels\n", 408 | "from sklearn.model_selection import train_test_split\n", 409 | "\n", 410 | "X = train.drop(\"Survived\", axis=1)\n", 411 | "y = train[\"Survived\"]\n", 412 | "X_train, X_valid, y_train, y_valid = train_test_split(\n", 413 | " X, y, test_size=0.3, random_state=42\n", 414 | ")" 415 | ] 416 | }, 417 | { 418 | "cell_type": "code", 419 | "execution_count": null, 420 | "id": "be3c6167", 421 | "metadata": { 422 | "execution": { 423 | "iopub.execute_input": "2024-11-11T16:20:44.371673Z", 424 | "iopub.status.busy": "2024-11-11T16:20:44.371277Z", 425 | "iopub.status.idle": "2024-11-11T16:20:44.386195Z", 426 | "shell.execute_reply": "2024-11-11T16:20:44.384990Z" 427 | }, 428 | "papermill": { 429 | "duration": 0.029273, 430 | "end_time": "2024-11-11T16:20:44.388492", 431 | "exception": false, 432 | "start_time": "2024-11-11T16:20:44.359219", 433 | "status": "completed" 434 | }, 435 | "tags": [] 436 | }, 437 | "outputs": [], 438 | "source": [ 439 | "X" 440 | ] 441 | }, 442 | { 443 | "cell_type": "code", 444 | "execution_count": null, 445 | "id": "7dc41960", 446 | "metadata": { 447 | "execution": { 448 | "iopub.execute_input": "2024-11-11T16:20:44.410917Z", 449 | "iopub.status.busy": "2024-11-11T16:20:44.409836Z", 450 | "iopub.status.idle": "2024-11-11T16:20:44.418000Z", 451 | "shell.execute_reply": "2024-11-11T16:20:44.417007Z" 452 | }, 453 | "papermill": { 454 | "duration": 0.021541, 455 | "end_time": "2024-11-11T16:20:44.420164", 456 | "exception": false, 457 | "start_time": "2024-11-11T16:20:44.398623", 458 | "status": "completed" 459 | }, 460 | "tags": [] 461 | }, 462 | "outputs": [], 463 | "source": [ 464 | "y" 465 | ] 466 | }, 467 | { 468 | "cell_type": "markdown", 469 | "id": "1a1744ec", 470 | "metadata": { 471 | "papermill": { 472 | "duration": 0.009957, 473 | "end_time": "2024-11-11T16:20:44.440675", 474 | "exception": false, 475 | "start_time": "2024-11-11T16:20:44.430718", 476 | "status": "completed" 477 | }, 478 | "tags": [] 479 | }, 480 | "source": [ 481 | "# 3. Model selection & training" 482 | ] 483 | }, 484 | { 485 | "cell_type": "code", 486 | "execution_count": null, 487 | "id": "ccc7b8f5", 488 | "metadata": { 489 | "execution": { 490 | "iopub.execute_input": "2024-11-11T16:20:44.463329Z", 491 | "iopub.status.busy": "2024-11-11T16:20:44.462367Z", 492 | "iopub.status.idle": "2024-11-11T16:20:44.960618Z", 493 | "shell.execute_reply": "2024-11-11T16:20:44.959564Z" 494 | }, 495 | "papermill": { 496 | "duration": 0.511938, 497 | "end_time": "2024-11-11T16:20:44.962806", 498 | "exception": false, 499 | "start_time": "2024-11-11T16:20:44.450868", 500 | "status": "completed" 501 | }, 502 | "tags": [] 503 | }, 504 | "outputs": [], 505 | "source": [ 506 | "from sklearn.metrics import accuracy_score, confusion_matrix, classification_report\n", 507 | "from sklearn.linear_model import LogisticRegression\n", 508 | "\n", 509 | "# Logistic Regression model\n", 510 | "logreg = LogisticRegression(max_iter=200)\n", 511 | "\n", 512 | "# Train the model\n", 513 | "logreg.fit(X_train, y_train)\n", 514 | "\n", 515 | "# Make predictions\n", 516 | "y_pred = logreg.predict(X_valid)\n", 517 | "\n", 518 | "# Evaluate the model\n", 519 | "print(\"Logistic Regression Accuracy: \", accuracy_score(y_valid, y_pred))\n", 520 | "sns.heatmap(confusion_matrix(y_valid, y_pred), annot=True, cmap=\"coolwarm\", fmt=\".2f\")\n", 521 | "print(\"Classification Report:\\n\", classification_report(y_valid, y_pred))" 522 | ] 523 | }, 524 | { 525 | "cell_type": "code", 526 | "execution_count": null, 527 | "id": "20ea5c88", 528 | "metadata": { 529 | "execution": { 530 | "iopub.execute_input": "2024-11-11T16:20:44.985812Z", 531 | "iopub.status.busy": "2024-11-11T16:20:44.985397Z", 532 | "iopub.status.idle": "2024-11-11T16:20:45.670887Z", 533 | "shell.execute_reply": "2024-11-11T16:20:45.669891Z" 534 | }, 535 | "papermill": { 536 | "duration": 0.699704, 537 | "end_time": "2024-11-11T16:20:45.673240", 538 | "exception": false, 539 | "start_time": "2024-11-11T16:20:44.973536", 540 | "status": "completed" 541 | }, 542 | "tags": [] 543 | }, 544 | "outputs": [], 545 | "source": [ 546 | "from sklearn.ensemble import RandomForestClassifier\n", 547 | "\n", 548 | "# Random Forest model\n", 549 | "rf = RandomForestClassifier(n_estimators=100, random_state=42)\n", 550 | "\n", 551 | "# Train the model\n", 552 | "rf.fit(X_train, y_train)\n", 553 | "\n", 554 | "# Make predictions\n", 555 | "y_pred = rf.predict(X_valid)\n", 556 | "\n", 557 | "# Evaluate the model\n", 558 | "print(\"Random Forest Accuracy: \", accuracy_score(y_valid, y_pred))\n", 559 | "sns.heatmap(confusion_matrix(y_valid, y_pred), annot=True, cmap=\"coolwarm\", fmt=\".2f\")\n", 560 | "print(\"Classification Report:\\n\", classification_report(y_valid, y_pred))" 561 | ] 562 | }, 563 | { 564 | "cell_type": "markdown", 565 | "id": "41c4c9c6", 566 | "metadata": { 567 | "papermill": { 568 | "duration": 0.014352, 569 | "end_time": "2024-11-11T16:20:45.699620", 570 | "exception": false, 571 | "start_time": "2024-11-11T16:20:45.685268", 572 | "status": "completed" 573 | }, 574 | "tags": [] 575 | }, 576 | "source": [ 577 | "# 4. Submit prediction" 578 | ] 579 | }, 580 | { 581 | "cell_type": "code", 582 | "execution_count": null, 583 | "id": "0055882e", 584 | "metadata": { 585 | "execution": { 586 | "iopub.execute_input": "2024-11-11T16:20:45.725949Z", 587 | "iopub.status.busy": "2024-11-11T16:20:45.724992Z", 588 | "iopub.status.idle": "2024-11-11T16:20:45.737489Z", 589 | "shell.execute_reply": "2024-11-11T16:20:45.736435Z" 590 | }, 591 | "papermill": { 592 | "duration": 0.027928, 593 | "end_time": "2024-11-11T16:20:45.740192", 594 | "exception": false, 595 | "start_time": "2024-11-11T16:20:45.712264", 596 | "status": "completed" 597 | }, 598 | "tags": [] 599 | }, 600 | "outputs": [], 601 | "source": [ 602 | "# Make prediction for test data\n", 603 | "test_preds = logreg.predict(test)\n", 604 | "\n", 605 | "# Save prediction in required format\n", 606 | "pd.DataFrame({\"PassengerId\": test.index, \"Survived\": test_preds}).to_csv(\n", 607 | " \"./submission.csv\", index=False\n", 608 | ")" 609 | ] 610 | }, 611 | { 612 | "cell_type": "code", 613 | "execution_count": null, 614 | "id": "d6a3a4a9", 615 | "metadata": { 616 | "execution": { 617 | "iopub.execute_input": "2024-11-11T16:20:45.764733Z", 618 | "iopub.status.busy": "2024-11-11T16:20:45.763695Z", 619 | "iopub.status.idle": "2024-11-11T16:20:45.778585Z", 620 | "shell.execute_reply": "2024-11-11T16:20:45.777425Z" 621 | }, 622 | "papermill": { 623 | "duration": 0.030873, 624 | "end_time": "2024-11-11T16:20:45.782101", 625 | "exception": false, 626 | "start_time": "2024-11-11T16:20:45.751228", 627 | "status": "completed" 628 | }, 629 | "tags": [] 630 | }, 631 | "outputs": [], 632 | "source": [ 633 | "pd.read_csv(\"./submission.csv\")" 634 | ] 635 | } 636 | ], 637 | "metadata": { 638 | "kaggle": { 639 | "accelerator": "none", 640 | "dataSources": [ 641 | { 642 | "databundleVersionId": 26502, 643 | "sourceId": 3136, 644 | "sourceType": "competition" 645 | } 646 | ], 647 | "dockerImageVersionId": 30786, 648 | "isGpuEnabled": false, 649 | "isInternetEnabled": true, 650 | "language": "python", 651 | "sourceType": "notebook" 652 | }, 653 | "kernelspec": { 654 | "display_name": "kaggle-tutorial-SRy77tqL-py3.12", 655 | "language": "python", 656 | "name": "python3" 657 | }, 658 | "language_info": { 659 | "codemirror_mode": { 660 | "name": "ipython", 661 | "version": 3 662 | }, 663 | "file_extension": ".py", 664 | "mimetype": "text/x-python", 665 | "name": "python", 666 | "nbconvert_exporter": "python", 667 | "pygments_lexer": "ipython3", 668 | "version": "3.12.7" 669 | }, 670 | "papermill": { 671 | "default_parameters": {}, 672 | "duration": 10.704561, 673 | "end_time": "2024-11-11T16:20:46.517311", 674 | "environment_variables": {}, 675 | "exception": null, 676 | "input_path": "__notebook__.ipynb", 677 | "output_path": "__notebook__.ipynb", 678 | "parameters": {}, 679 | "start_time": "2024-11-11T16:20:35.812750", 680 | "version": "2.6.0" 681 | } 682 | }, 683 | "nbformat": 4, 684 | "nbformat_minor": 5 685 | } 686 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "bleach" 5 | version = "6.2.0" 6 | description = "An easy safelist-based HTML-sanitizing tool." 7 | optional = false 8 | python-versions = ">=3.9" 9 | files = [ 10 | {file = "bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e"}, 11 | {file = "bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f"}, 12 | ] 13 | 14 | [package.dependencies] 15 | webencodings = "*" 16 | 17 | [package.extras] 18 | css = ["tinycss2 (>=1.1.0,<1.5)"] 19 | 20 | [[package]] 21 | name = "certifi" 22 | version = "2024.8.30" 23 | description = "Python package for providing Mozilla's CA Bundle." 24 | optional = false 25 | python-versions = ">=3.6" 26 | files = [ 27 | {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, 28 | {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, 29 | ] 30 | 31 | [[package]] 32 | name = "charset-normalizer" 33 | version = "3.4.0" 34 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 35 | optional = false 36 | python-versions = ">=3.7.0" 37 | files = [ 38 | {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, 39 | {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, 40 | {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, 41 | {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, 42 | {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, 43 | {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, 44 | {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, 45 | {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, 46 | {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, 47 | {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, 48 | {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, 49 | {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, 50 | {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, 51 | {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, 52 | {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, 53 | {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, 54 | {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, 55 | {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, 56 | {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, 57 | {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, 58 | {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, 59 | {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, 60 | {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, 61 | {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, 62 | {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, 63 | {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, 64 | {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, 65 | {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, 66 | {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, 67 | {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, 68 | {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, 69 | {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, 70 | {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, 71 | {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, 72 | {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, 73 | {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, 74 | {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, 75 | {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, 76 | {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, 77 | {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, 78 | {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, 79 | {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, 80 | {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, 81 | {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, 82 | {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, 83 | {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, 84 | {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, 85 | {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, 86 | {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, 87 | {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, 88 | {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, 89 | {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, 90 | {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, 91 | {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, 92 | {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, 93 | {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, 94 | {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, 95 | {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, 96 | {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, 97 | {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, 98 | {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, 99 | {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, 100 | {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, 101 | {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, 102 | {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, 103 | {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, 104 | {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, 105 | {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, 106 | {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, 107 | {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, 108 | {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, 109 | {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, 110 | {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, 111 | {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, 112 | {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, 113 | {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, 114 | {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, 115 | {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, 116 | {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, 117 | {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, 118 | {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, 119 | {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, 120 | {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, 121 | {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, 122 | {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, 123 | {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, 124 | {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, 125 | {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, 126 | {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, 127 | {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, 128 | {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, 129 | {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, 130 | {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, 131 | {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, 132 | {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, 133 | {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, 134 | {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, 135 | {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, 136 | {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, 137 | {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, 138 | {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, 139 | {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, 140 | {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, 141 | {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, 142 | {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, 143 | ] 144 | 145 | [[package]] 146 | name = "colorama" 147 | version = "0.4.6" 148 | description = "Cross-platform colored terminal text." 149 | optional = false 150 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 151 | files = [ 152 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 153 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 154 | ] 155 | 156 | [[package]] 157 | name = "idna" 158 | version = "3.10" 159 | description = "Internationalized Domain Names in Applications (IDNA)" 160 | optional = false 161 | python-versions = ">=3.6" 162 | files = [ 163 | {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, 164 | {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, 165 | ] 166 | 167 | [package.extras] 168 | all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] 169 | 170 | [[package]] 171 | name = "iniconfig" 172 | version = "2.0.0" 173 | description = "brain-dead simple config-ini parsing" 174 | optional = false 175 | python-versions = ">=3.7" 176 | files = [ 177 | {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, 178 | {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, 179 | ] 180 | 181 | [[package]] 182 | name = "kaggle" 183 | version = "1.6.17" 184 | description = "Kaggle API" 185 | optional = false 186 | python-versions = "*" 187 | files = [ 188 | {file = "kaggle-1.6.17.tar.gz", hash = "sha256:439a7dea1d5039f320fd6ad5ec21b688dcfa70d405cb42095b81f41edc401b81"}, 189 | ] 190 | 191 | [package.dependencies] 192 | bleach = "*" 193 | certifi = ">=2023.7.22" 194 | python-dateutil = "*" 195 | python-slugify = "*" 196 | requests = "*" 197 | six = ">=1.10" 198 | tqdm = "*" 199 | urllib3 = "*" 200 | 201 | [[package]] 202 | name = "numpy" 203 | version = "2.1.3" 204 | description = "Fundamental package for array computing in Python" 205 | optional = false 206 | python-versions = ">=3.10" 207 | files = [ 208 | {file = "numpy-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff"}, 209 | {file = "numpy-2.1.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5"}, 210 | {file = "numpy-2.1.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1"}, 211 | {file = "numpy-2.1.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd"}, 212 | {file = "numpy-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3"}, 213 | {file = "numpy-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098"}, 214 | {file = "numpy-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c"}, 215 | {file = "numpy-2.1.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4"}, 216 | {file = "numpy-2.1.3-cp310-cp310-win32.whl", hash = "sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23"}, 217 | {file = "numpy-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0"}, 218 | {file = "numpy-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d"}, 219 | {file = "numpy-2.1.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41"}, 220 | {file = "numpy-2.1.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9"}, 221 | {file = "numpy-2.1.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09"}, 222 | {file = "numpy-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a"}, 223 | {file = "numpy-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b"}, 224 | {file = "numpy-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee"}, 225 | {file = "numpy-2.1.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0"}, 226 | {file = "numpy-2.1.3-cp311-cp311-win32.whl", hash = "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9"}, 227 | {file = "numpy-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2"}, 228 | {file = "numpy-2.1.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e"}, 229 | {file = "numpy-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958"}, 230 | {file = "numpy-2.1.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8"}, 231 | {file = "numpy-2.1.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564"}, 232 | {file = "numpy-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512"}, 233 | {file = "numpy-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b"}, 234 | {file = "numpy-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc"}, 235 | {file = "numpy-2.1.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0"}, 236 | {file = "numpy-2.1.3-cp312-cp312-win32.whl", hash = "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9"}, 237 | {file = "numpy-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a"}, 238 | {file = "numpy-2.1.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f"}, 239 | {file = "numpy-2.1.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598"}, 240 | {file = "numpy-2.1.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57"}, 241 | {file = "numpy-2.1.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe"}, 242 | {file = "numpy-2.1.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43"}, 243 | {file = "numpy-2.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56"}, 244 | {file = "numpy-2.1.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a"}, 245 | {file = "numpy-2.1.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef"}, 246 | {file = "numpy-2.1.3-cp313-cp313-win32.whl", hash = "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f"}, 247 | {file = "numpy-2.1.3-cp313-cp313-win_amd64.whl", hash = "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed"}, 248 | {file = "numpy-2.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f"}, 249 | {file = "numpy-2.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4"}, 250 | {file = "numpy-2.1.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e"}, 251 | {file = "numpy-2.1.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0"}, 252 | {file = "numpy-2.1.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408"}, 253 | {file = "numpy-2.1.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6"}, 254 | {file = "numpy-2.1.3-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f"}, 255 | {file = "numpy-2.1.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17"}, 256 | {file = "numpy-2.1.3-cp313-cp313t-win32.whl", hash = "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48"}, 257 | {file = "numpy-2.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4"}, 258 | {file = "numpy-2.1.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f"}, 259 | {file = "numpy-2.1.3-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4"}, 260 | {file = "numpy-2.1.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d"}, 261 | {file = "numpy-2.1.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb"}, 262 | {file = "numpy-2.1.3.tar.gz", hash = "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761"}, 263 | ] 264 | 265 | [[package]] 266 | name = "packaging" 267 | version = "24.2" 268 | description = "Core utilities for Python packages" 269 | optional = false 270 | python-versions = ">=3.8" 271 | files = [ 272 | {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, 273 | {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, 274 | ] 275 | 276 | [[package]] 277 | name = "pluggy" 278 | version = "1.5.0" 279 | description = "plugin and hook calling mechanisms for python" 280 | optional = false 281 | python-versions = ">=3.8" 282 | files = [ 283 | {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, 284 | {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, 285 | ] 286 | 287 | [package.extras] 288 | dev = ["pre-commit", "tox"] 289 | testing = ["pytest", "pytest-benchmark"] 290 | 291 | [[package]] 292 | name = "pytest" 293 | version = "8.3.4" 294 | description = "pytest: simple powerful testing with Python" 295 | optional = false 296 | python-versions = ">=3.8" 297 | files = [ 298 | {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, 299 | {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, 300 | ] 301 | 302 | [package.dependencies] 303 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 304 | iniconfig = "*" 305 | packaging = "*" 306 | pluggy = ">=1.5,<2" 307 | 308 | [package.extras] 309 | dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] 310 | 311 | [[package]] 312 | name = "python-dateutil" 313 | version = "2.9.0.post0" 314 | description = "Extensions to the standard Python datetime module" 315 | optional = false 316 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 317 | files = [ 318 | {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, 319 | {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, 320 | ] 321 | 322 | [package.dependencies] 323 | six = ">=1.5" 324 | 325 | [[package]] 326 | name = "python-slugify" 327 | version = "8.0.4" 328 | description = "A Python slugify application that also handles Unicode" 329 | optional = false 330 | python-versions = ">=3.7" 331 | files = [ 332 | {file = "python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"}, 333 | {file = "python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8"}, 334 | ] 335 | 336 | [package.dependencies] 337 | text-unidecode = ">=1.3" 338 | 339 | [package.extras] 340 | unidecode = ["Unidecode (>=1.1.1)"] 341 | 342 | [[package]] 343 | name = "requests" 344 | version = "2.32.3" 345 | description = "Python HTTP for Humans." 346 | optional = false 347 | python-versions = ">=3.8" 348 | files = [ 349 | {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, 350 | {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, 351 | ] 352 | 353 | [package.dependencies] 354 | certifi = ">=2017.4.17" 355 | charset-normalizer = ">=2,<4" 356 | idna = ">=2.5,<4" 357 | urllib3 = ">=1.21.1,<3" 358 | 359 | [package.extras] 360 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 361 | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] 362 | 363 | [[package]] 364 | name = "ruff" 365 | version = "0.8.1" 366 | description = "An extremely fast Python linter and code formatter, written in Rust." 367 | optional = false 368 | python-versions = ">=3.7" 369 | files = [ 370 | {file = "ruff-0.8.1-py3-none-linux_armv6l.whl", hash = "sha256:fae0805bd514066f20309f6742f6ee7904a773eb9e6c17c45d6b1600ca65c9b5"}, 371 | {file = "ruff-0.8.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b8a4f7385c2285c30f34b200ca5511fcc865f17578383db154e098150ce0a087"}, 372 | {file = "ruff-0.8.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cd054486da0c53e41e0086e1730eb77d1f698154f910e0cd9e0d64274979a209"}, 373 | {file = "ruff-0.8.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2029b8c22da147c50ae577e621a5bfbc5d1fed75d86af53643d7a7aee1d23871"}, 374 | {file = "ruff-0.8.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2666520828dee7dfc7e47ee4ea0d928f40de72056d929a7c5292d95071d881d1"}, 375 | {file = "ruff-0.8.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:333c57013ef8c97a53892aa56042831c372e0bb1785ab7026187b7abd0135ad5"}, 376 | {file = "ruff-0.8.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:288326162804f34088ac007139488dcb43de590a5ccfec3166396530b58fb89d"}, 377 | {file = "ruff-0.8.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b12c39b9448632284561cbf4191aa1b005882acbc81900ffa9f9f471c8ff7e26"}, 378 | {file = "ruff-0.8.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:364e6674450cbac8e998f7b30639040c99d81dfb5bbc6dfad69bc7a8f916b3d1"}, 379 | {file = "ruff-0.8.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b22346f845fec132aa39cd29acb94451d030c10874408dbf776af3aaeb53284c"}, 380 | {file = "ruff-0.8.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b2f2f7a7e7648a2bfe6ead4e0a16745db956da0e3a231ad443d2a66a105c04fa"}, 381 | {file = "ruff-0.8.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:adf314fc458374c25c5c4a4a9270c3e8a6a807b1bec018cfa2813d6546215540"}, 382 | {file = "ruff-0.8.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a885d68342a231b5ba4d30b8c6e1b1ee3a65cf37e3d29b3c74069cdf1ee1e3c9"}, 383 | {file = "ruff-0.8.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d2c16e3508c8cc73e96aa5127d0df8913d2290098f776416a4b157657bee44c5"}, 384 | {file = "ruff-0.8.1-py3-none-win32.whl", hash = "sha256:93335cd7c0eaedb44882d75a7acb7df4b77cd7cd0d2255c93b28791716e81790"}, 385 | {file = "ruff-0.8.1-py3-none-win_amd64.whl", hash = "sha256:2954cdbe8dfd8ab359d4a30cd971b589d335a44d444b6ca2cb3d1da21b75e4b6"}, 386 | {file = "ruff-0.8.1-py3-none-win_arm64.whl", hash = "sha256:55873cc1a473e5ac129d15eccb3c008c096b94809d693fc7053f588b67822737"}, 387 | {file = "ruff-0.8.1.tar.gz", hash = "sha256:3583db9a6450364ed5ca3f3b4225958b24f78178908d5c4bc0f46251ccca898f"}, 388 | ] 389 | 390 | [[package]] 391 | name = "six" 392 | version = "1.16.0" 393 | description = "Python 2 and 3 compatibility utilities" 394 | optional = false 395 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 396 | files = [ 397 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 398 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 399 | ] 400 | 401 | [[package]] 402 | name = "text-unidecode" 403 | version = "1.3" 404 | description = "The most basic Text::Unidecode port" 405 | optional = false 406 | python-versions = "*" 407 | files = [ 408 | {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, 409 | {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, 410 | ] 411 | 412 | [[package]] 413 | name = "tqdm" 414 | version = "4.67.1" 415 | description = "Fast, Extensible Progress Meter" 416 | optional = false 417 | python-versions = ">=3.7" 418 | files = [ 419 | {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, 420 | {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, 421 | ] 422 | 423 | [package.dependencies] 424 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 425 | 426 | [package.extras] 427 | dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] 428 | discord = ["requests"] 429 | notebook = ["ipywidgets (>=6)"] 430 | slack = ["slack-sdk"] 431 | telegram = ["requests"] 432 | 433 | [[package]] 434 | name = "urllib3" 435 | version = "2.2.3" 436 | description = "HTTP library with thread-safe connection pooling, file post, and more." 437 | optional = false 438 | python-versions = ">=3.8" 439 | files = [ 440 | {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, 441 | {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, 442 | ] 443 | 444 | [package.extras] 445 | brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] 446 | h2 = ["h2 (>=4,<5)"] 447 | socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] 448 | zstd = ["zstandard (>=0.18.0)"] 449 | 450 | [[package]] 451 | name = "webencodings" 452 | version = "0.5.1" 453 | description = "Character encoding aliases for legacy web content" 454 | optional = false 455 | python-versions = "*" 456 | files = [ 457 | {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, 458 | {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, 459 | ] 460 | 461 | [metadata] 462 | lock-version = "2.0" 463 | python-versions = "^3.12" 464 | content-hash = "4b041cd78dd9c6493c5f824e6b7306eed6d6fca8a67b731a28d7c883585ea63d" 465 | --------------------------------------------------------------------------------