diff --git a/.gitignore b/.gitignore
index c9a03a4..4e75673 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,8 @@ admin/opentofu/.terraform.tfstate.lock.info
admin/opentofu/generated/
admin/opentofu/terraform.tfstate*
admin/opentofu/terraform.tfvars
+
+team_private_key.pem
+clean_train.ipynb
+weather_transformation.py
+submission/clean.py
\ No newline at end of file
diff --git a/main.ipynb b/main.ipynb
new file mode 100644
index 0000000..64ab829
--- /dev/null
+++ b/main.ipynb
@@ -0,0 +1,1267 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1194,
+ "id": "76f1553e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import re\n",
+ "from urllib.parse import unquote\n",
+ "\n",
+ "\n",
+ "import sys\n",
+ "sys.path.append(\"./submission\")\n",
+ "import clean\n",
+ "\n",
+ "df = pd.read_csv(\"./data/test_features.csv\")\n",
+ "df = df[['record_id','origin_station',\n",
+ " 'destination_station',\n",
+ " 'district',\n",
+ " 'encoded_transport',\n",
+ " 'day_of_week',\n",
+ " 'is_holiday',\n",
+ " 'weather_condition',\n",
+ " 'country_code']]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "59f0d260",
+ "metadata": {},
+ "source": [
+ "Lucciano: Cleaning Origin and Destination"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1195,
+ "id": "63db2f09",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Canonical station -> ordered regexes matched against the SQUASHED key\n",
+ "# (lowercased, url-decoded, wrappers stripped, all non-alphanumerics removed).\n",
+ "# Order matters: more specific patterns first. ^x$ pins the short codes.\n",
+ "_STATION_RULES = [\n",
+ " (\"Causeway Bay\", r\"causewaybay|cwbhub|^cwb$|^cb$\"),\n",
+ " (\"Central\", r\"central|stncentral|censt|^cstation$|^cstn$|^cs$\"),\n",
+ " (\"Admiralty\", r\"admiralt|admxfer|^adm$\"),\n",
+ " (\"Sha Tin\", r\"shatin|shatinterm|^stin$|^stn$|^st$\"),\n",
+ " (\"Mong Kok\", r\"mongkok|mkhub|^mk$\"),\n",
+ " (\"Tsim Sha Tsui\", r\"tsimshatsui|tsteast|^tst$\"),\n",
+ " (\"North Point\", r\"northpoint|northpt|npferry|^np$\"),\n",
+ " (\"Tsuen Wan\", r\"tsuenwan|tswline|^twn$|^tswan$|^tw$\"),\n",
+ " (\"Kennedy Town\", r\"kennedyt|ktownstop|^ktown$|^kt$\"),\n",
+ " (\"Wan Chai\", r\"wanchai|wanchaistop|^wchai$|^wc$\"),\n",
+ "]\n",
+ "# Markers/non-stations to skip. unk = unknown placeholder; depot/workshop/audithub\n",
+ "# are internal sites, not passenger stations -> treated as missing.\n",
+ "_NOISE = re.compile(r\"^(unk|audithub|depot|workshop)$\")\n",
+ "\n",
+ "\n",
+ "def clean_station(s: pd.Series) -> pd.Series:\n",
+ " def clean_value(v):\n",
+ " if not isinstance(v, str):\n",
+ " return pd.NA\n",
+ " x = unquote(unquote(v)).strip().lower() # decode (handles %2520), trim\n",
+ " for tok in re.split(r\"[:|=\\-]+\", x):\n",
+ " key = re.sub(r\"[^a-z0-9]\", \"\", tok) # squash: drop spaces/./%20 etc\n",
+ " if not key or _NOISE.match(key):\n",
+ " continue\n",
+ " for canon, pat in _STATION_RULES:\n",
+ " if re.search(pat, key):\n",
+ " return canon\n",
+ " return pd.NA # no station token -> missing\n",
+ "\n",
+ " return s.map(clean_value)\n",
+ "\n",
+ "df['origin_station'] = clean_station(df['origin_station'])\n",
+ "df['destination_station'] = clean_station(df['destination_station'])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2b19ab53",
+ "metadata": {},
+ "source": [
+ "Cleaning District"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1196,
+ "id": "f84f4f73",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Clean district column values of prefix/suffix patterns\n",
+ "\n",
+ "def clean_district(df):\n",
+ " # Strip whitespace\n",
+ " df['district'] = df['district'].str.strip()\n",
+ " \n",
+ " # Remove prefix patterns (e.g., \"D123\" → \"123\")\n",
+ " prefix_pattern = r'(D|zone|hold|district|Legacy|region|Leg|LEG)[^a-zA-Z0-9]+'\n",
+ " df['district'] = df['district'].str.replace(prefix_pattern, '', regex=True)\n",
+ " \n",
+ " # Remove suffix patterns (e.g., \"central_zone\" → \"central\")\n",
+ " suffix_pattern = r'[_|](?:new|core|zone|cluster|sector|OPS)'\n",
+ " df['district'] = df['district'].str.replace(suffix_pattern, '', regex=True)\n",
+ " \n",
+ " # Normalize missing/weird values into NaN\n",
+ " unknown_values = [\n",
+ " 'Legacy', 'unknown', '??', 'mismatch', 'Null', 'legacy',\n",
+ " 'Internal', 'operations', 'audit', 'eh', 'unk', ''\n",
+ " ]\n",
+ " df['district'] = df['district'].str.replace(r'^(operations|audit|unk|eh)\\s*$', '', regex=True, case=False)\n",
+ "\n",
+ " df['district'] = df['district'].replace(unknown_values, np.nan)\n",
+ "\n",
+ " return df\n",
+ "\n",
+ "df = clean_district(df)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1197,
+ "id": "3be9e915",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#map district variants into unified category\n",
+ "\n",
+ "district_variant_mapping = [\n",
+ " (\"Central and Western\", r\"cw|cwbhub|^cwb$|^cb$|central_and_western|central and western\"),\n",
+ " (\"Tsuen Wan\", r\"tw|tsw|tsuen_wan|tsuen wan\"),\n",
+ " (\"Yau Tsim Mong\", r\"YTM|ytm|yau tsim mong|yau_tsim_mong\"),\n",
+ " (\"Sha Tin\", r\"ST|sha tin|shatin|st|sha_tin\"),\n",
+ " (\"Eastern\", r\"eastern|east_harbour\"), \n",
+ " (\"Wan Chai\", r\"wanchai|wanchaistop|^wchai$|^wc$|wan chai|wan_chai\")\n",
+ "]\n",
+ "\n",
+ "def map_district(value):\n",
+ " if pd.isna(value):\n",
+ " return value\n",
+ " value = str(value).lower().strip()\n",
+ " for full_name, pattern in district_variant_mapping:\n",
+ " if pattern and re.search(pattern, value):\n",
+ " return full_name\n",
+ " return value # return original if no match\n",
+ "\n",
+ "df['district'] = df['district'].apply(map_district)\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1198,
+ "id": "9a9bc0f9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "district\n",
+ "Central and Western 543\n",
+ "Yau Tsim Mong 431\n",
+ "Wan Chai 405\n",
+ "Sha Tin 281\n",
+ "Tsuen Wan 193\n",
+ "NaN 127\n",
+ "Eastern 113\n",
+ "Name: count, dtype: int64"
+ ]
+ },
+ "execution_count": 1198,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# map district NANs from known origin station:\n",
+ "\n",
+ "station_district_mapping = {\n",
+ " 'Central and Western': ('Central', 'Admiralty', 'Kennedy Town'),\n",
+ " 'Wan Chai': ('Wan Chai', 'Causeway Bay'),\n",
+ " 'Yau Tsim Mong': ('Mong Kok', 'Tsim Sha Tsui'),\n",
+ " 'Sha Tin': ('Sha Tin',),\n",
+ " 'Tsuen Wan': ('Tsuen Wan',),\n",
+ " 'Eastern': ('North Point',)\n",
+ "}\n",
+ "\n",
+ "\n",
+ "def fill_district_from_station(df, station_col='origin_station', district_col='district'):\n",
+ " # Build reverse lookup: station -> district\n",
+ " station_to_district = {\n",
+ " station.lower(): district\n",
+ " for district, stations in station_district_mapping.items()\n",
+ " for station in stations\n",
+ " }\n",
+ " \n",
+ " # Fill nulls with station lookup\n",
+ " df[district_col] = df[district_col].fillna(\n",
+ " df[station_col].str.lower().str.strip().map(station_to_district)\n",
+ " )\n",
+ " return df\n",
+ "\n",
+ "# Usage\n",
+ "df = fill_district_from_station(df)\n",
+ "\n",
+ "df['district'].value_counts(dropna=False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1199,
+ "id": "8bc21583",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " origin_station | \n",
+ " destination_station | \n",
+ " district | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 516 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 40 | \n",
+ " Kennedy Town | \n",
+ " Mong Kok | \n",
+ " Central and Western | \n",
+ "
\n",
+ " \n",
+ " | 1176 | \n",
+ " Central | \n",
+ " Kennedy Town | \n",
+ " Central and Western | \n",
+ "
\n",
+ " \n",
+ " | 429 | \n",
+ " Mong Kok | \n",
+ " Central | \n",
+ " Yau Tsim Mong | \n",
+ "
\n",
+ " \n",
+ " | 736 | \n",
+ " Tsim Sha Tsui | \n",
+ " North Point | \n",
+ " Yau Tsim Mong | \n",
+ "
\n",
+ " \n",
+ " | 150 | \n",
+ " Kennedy Town | \n",
+ " Mong Kok | \n",
+ " Central and Western | \n",
+ "
\n",
+ " \n",
+ " | 368 | \n",
+ " Tsim Sha Tsui | \n",
+ " Causeway Bay | \n",
+ " Yau Tsim Mong | \n",
+ "
\n",
+ " \n",
+ " | 1897 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 674 | \n",
+ " North Point | \n",
+ " Kennedy Town | \n",
+ " Eastern | \n",
+ "
\n",
+ " \n",
+ " | 1322 | \n",
+ " Kennedy Town | \n",
+ " Admiralty | \n",
+ " Central and Western | \n",
+ "
\n",
+ " \n",
+ " | 1252 | \n",
+ " Causeway Bay | \n",
+ " North Point | \n",
+ " Wan Chai | \n",
+ "
\n",
+ " \n",
+ " | 1801 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 807 | \n",
+ " Causeway Bay | \n",
+ " Tsim Sha Tsui | \n",
+ " Wan Chai | \n",
+ "
\n",
+ " \n",
+ " | 1534 | \n",
+ " Central | \n",
+ " North Point | \n",
+ " Central and Western | \n",
+ "
\n",
+ " \n",
+ " | 896 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 842 | \n",
+ " Sha Tin | \n",
+ " Tsim Sha Tsui | \n",
+ " Sha Tin | \n",
+ "
\n",
+ " \n",
+ " | 1985 | \n",
+ " Tsuen Wan | \n",
+ " Admiralty | \n",
+ " Tsuen Wan | \n",
+ "
\n",
+ " \n",
+ " | 1792 | \n",
+ " Central | \n",
+ " Mong Kok | \n",
+ " Central and Western | \n",
+ "
\n",
+ " \n",
+ " | 47 | \n",
+ " North Point | \n",
+ " Tsim Sha Tsui | \n",
+ " Eastern | \n",
+ "
\n",
+ " \n",
+ " | 621 | \n",
+ " Mong Kok | \n",
+ " Causeway Bay | \n",
+ " Yau Tsim Mong | \n",
+ "
\n",
+ " \n",
+ " | 177 | \n",
+ " Central | \n",
+ " Mong Kok | \n",
+ " Central and Western | \n",
+ "
\n",
+ " \n",
+ " | 388 | \n",
+ " North Point | \n",
+ " Tsuen Wan | \n",
+ " Eastern | \n",
+ "
\n",
+ " \n",
+ " | 1502 | \n",
+ " Causeway Bay | \n",
+ " North Point | \n",
+ " Wan Chai | \n",
+ "
\n",
+ " \n",
+ " | 1958 | \n",
+ " Admiralty | \n",
+ " Tsuen Wan | \n",
+ " Central and Western | \n",
+ "
\n",
+ " \n",
+ " | 1494 | \n",
+ " Mong Kok | \n",
+ " North Point | \n",
+ " Yau Tsim Mong | \n",
+ "
\n",
+ " \n",
+ " | 156 | \n",
+ " Central | \n",
+ " Tsuen Wan | \n",
+ " Central and Western | \n",
+ "
\n",
+ " \n",
+ " | 1704 | \n",
+ " Central | \n",
+ " Sha Tin | \n",
+ " Central and Western | \n",
+ "
\n",
+ " \n",
+ " | 1753 | \n",
+ " Causeway Bay | \n",
+ " Kennedy Town | \n",
+ " Wan Chai | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " North Point | \n",
+ " Central | \n",
+ " Sha Tin | \n",
+ "
\n",
+ " \n",
+ " | 2003 | \n",
+ " Wan Chai | \n",
+ " Mong Kok | \n",
+ " Wan Chai | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " origin_station destination_station district\n",
+ "516 NaN NaN NaN\n",
+ "40 Kennedy Town Mong Kok Central and Western\n",
+ "1176 Central Kennedy Town Central and Western\n",
+ "429 Mong Kok Central Yau Tsim Mong\n",
+ "736 Tsim Sha Tsui North Point Yau Tsim Mong\n",
+ "150 Kennedy Town Mong Kok Central and Western\n",
+ "368 Tsim Sha Tsui Causeway Bay Yau Tsim Mong\n",
+ "1897 NaN NaN NaN\n",
+ "674 North Point Kennedy Town Eastern\n",
+ "1322 Kennedy Town Admiralty Central and Western\n",
+ "1252 Causeway Bay North Point Wan Chai\n",
+ "1801 NaN NaN NaN\n",
+ "807 Causeway Bay Tsim Sha Tsui Wan Chai\n",
+ "1534 Central North Point Central and Western\n",
+ "896 NaN NaN NaN\n",
+ "842 Sha Tin Tsim Sha Tsui Sha Tin\n",
+ "1985 Tsuen Wan Admiralty Tsuen Wan\n",
+ "1792 Central Mong Kok Central and Western\n",
+ "47 North Point Tsim Sha Tsui Eastern\n",
+ "621 Mong Kok Causeway Bay Yau Tsim Mong\n",
+ "177 Central Mong Kok Central and Western\n",
+ "388 North Point Tsuen Wan Eastern\n",
+ "1502 Causeway Bay North Point Wan Chai\n",
+ "1958 Admiralty Tsuen Wan Central and Western\n",
+ "1494 Mong Kok North Point Yau Tsim Mong\n",
+ "156 Central Tsuen Wan Central and Western\n",
+ "1704 Central Sha Tin Central and Western\n",
+ "1753 Causeway Bay Kennedy Town Wan Chai\n",
+ "4 North Point Central Sha Tin\n",
+ "2003 Wan Chai Mong Kok Wan Chai"
+ ]
+ },
+ "execution_count": 1199,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df[['origin_station','destination_station','district']].sample(30)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "82df77a7",
+ "metadata": {},
+ "source": [
+ "Cleaning Day of Week"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1200,
+ "id": "60b0a2db",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "day_of_week\n",
+ "Fri 366\n",
+ "Thu 329\n",
+ "Wed 324\n",
+ "Mon 308\n",
+ "Tue 290\n",
+ "Sat 281\n",
+ "Sun 195\n",
+ "Name: count, dtype: int64"
+ ]
+ },
+ "execution_count": 1200,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df['day_of_week'] = df['day_of_week'].str.title()\n",
+ "df['day_of_week'].value_counts(dropna=False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1201,
+ "id": "c69375a5",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['origin_station',\n",
+ " 'destination_station',\n",
+ " 'district',\n",
+ " 'transport_type',\n",
+ " 'transport_detail',\n",
+ " 'mode',\n",
+ " 'service_level',\n",
+ " 'operator',\n",
+ " 'day_of_week',\n",
+ " 'is_holiday',\n",
+ " 'weather_condition',\n",
+ " 'country_code']"
+ ]
+ },
+ "execution_count": 1201,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "clean.SUBMISSION_FEATURES"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a02d34cf",
+ "metadata": {},
+ "source": [
+ "Cleaning encode_transport"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1202,
+ "id": "30a35039",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " encoded_transport | \n",
+ " transport_type | \n",
+ " transport_detail | \n",
+ " mode | \n",
+ " service_level | \n",
+ " operator | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 229 | \n",
+ " UNK::bus::loc::kowloon | \n",
+ " bus | \n",
+ " general | \n",
+ " local | \n",
+ " NaN | \n",
+ " kowloon | \n",
+ "
\n",
+ " \n",
+ " | 1861 | \n",
+ " kind,tram-apt,mode,loc,tier,std,op,citybus | \n",
+ " NaN | \n",
+ " general | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " citybus | \n",
+ "
\n",
+ " \n",
+ " | 1715 | \n",
+ " srcfeed::bus::loc::prem::citybus::delta | \n",
+ " bus | \n",
+ " general | \n",
+ " local | \n",
+ " premium | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 226 | \n",
+ " bus-apt__MISS__citybus | \n",
+ " bus | \n",
+ " airport | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " citybus | \n",
+ "
\n",
+ " \n",
+ " | 1685 | \n",
+ " type=bus-xhbr;mode=exp;tier=missing;op=unknown | \n",
+ " bus | \n",
+ " crossharbour | \n",
+ " express | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 930 | \n",
+ " feed=OPS|kind=bus|run=loc|tier=prem|op=citybus | \n",
+ " bus | \n",
+ " general | \n",
+ " local | \n",
+ " premium | \n",
+ " citybus | \n",
+ "
\n",
+ " \n",
+ " | 1397 | \n",
+ " bus-loc-std-citybus-c | \n",
+ " bus | \n",
+ " general | \n",
+ " local | \n",
+ " standard | \n",
+ " citybus | \n",
+ "
\n",
+ " \n",
+ " | 1118 | \n",
+ " ferry-apt.loc.std.ferryhk | \n",
+ " ferry | \n",
+ " airport | \n",
+ " local | \n",
+ " standard | \n",
+ " ferryhk | \n",
+ "
\n",
+ " \n",
+ " | 1592 | \n",
+ " kind,tram,mode,loc,tier,std,op,citybus | \n",
+ " NaN | \n",
+ " general | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " citybus | \n",
+ "
\n",
+ " \n",
+ " | 709 | \n",
+ " UNK::bus::loc::citybus | \n",
+ " bus | \n",
+ " general | \n",
+ " local | \n",
+ " NaN | \n",
+ " citybus | \n",
+ "
\n",
+ " \n",
+ " | 1824 | \n",
+ " kind,bus,mode,exp,tier,prem,op,citybus | \n",
+ " NaN | \n",
+ " general | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " citybus | \n",
+ "
\n",
+ " \n",
+ " | 1979 | \n",
+ " UNK::bus::loc::kowloon | \n",
+ " bus | \n",
+ " general | \n",
+ " local | \n",
+ " NaN | \n",
+ " kowloon | \n",
+ "
\n",
+ " \n",
+ " | 140 | \n",
+ " L2::bus::loc::std::kowloon::tail | \n",
+ " bus | \n",
+ " general | \n",
+ " local | \n",
+ " standard | \n",
+ " kowloon | \n",
+ "
\n",
+ " \n",
+ " | 2072 | \n",
+ " [bus][run=loc][tier=std][op=citybus][sys=L2] | \n",
+ " NaN | \n",
+ " general | \n",
+ " local | \n",
+ " standard | \n",
+ " citybus | \n",
+ "
\n",
+ " \n",
+ " | 2084 | \n",
+ " ferry-loc-std-ferryhk-c | \n",
+ " ferry | \n",
+ " general | \n",
+ " local | \n",
+ " standard | \n",
+ " ferryhk | \n",
+ "
\n",
+ " \n",
+ " | 177 | \n",
+ " kind=bus-night|kind=alt|run=?|tier=?|op=citybus | \n",
+ " bus | \n",
+ " night | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " citybus | \n",
+ "
\n",
+ " \n",
+ " | 1319 | \n",
+ " bus-loc-std-kowloon-c | \n",
+ " bus | \n",
+ " general | \n",
+ " local | \n",
+ " standard | \n",
+ " kowloon | \n",
+ "
\n",
+ " \n",
+ " | 1132 | \n",
+ " busexpstdkowloon | \n",
+ " bus | \n",
+ " general | \n",
+ " express | \n",
+ " standard | \n",
+ " kowloon | \n",
+ "
\n",
+ " \n",
+ " | 941 | \n",
+ " feed=OPS|kind=bus|run=loc|tier=std|op=citybus | \n",
+ " bus | \n",
+ " general | \n",
+ " local | \n",
+ " standard | \n",
+ " citybus | \n",
+ "
\n",
+ " \n",
+ " | 1852 | \n",
+ " kind,bus,mode,loc,tier,std,op,kowloon | \n",
+ " NaN | \n",
+ " general | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " kowloon | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " encoded_transport transport_type \\\n",
+ "229 UNK::bus::loc::kowloon bus \n",
+ "1861 kind,tram-apt,mode,loc,tier,std,op,citybus NaN \n",
+ "1715 srcfeed::bus::loc::prem::citybus::delta bus \n",
+ "226 bus-apt__MISS__citybus bus \n",
+ "1685 type=bus-xhbr;mode=exp;tier=missing;op=unknown bus \n",
+ "930 feed=OPS|kind=bus|run=loc|tier=prem|op=citybus bus \n",
+ "1397 bus-loc-std-citybus-c bus \n",
+ "1118 ferry-apt.loc.std.ferryhk ferry \n",
+ "1592 kind,tram,mode,loc,tier,std,op,citybus NaN \n",
+ "709 UNK::bus::loc::citybus bus \n",
+ "1824 kind,bus,mode,exp,tier,prem,op,citybus NaN \n",
+ "1979 UNK::bus::loc::kowloon bus \n",
+ "140 L2::bus::loc::std::kowloon::tail bus \n",
+ "2072 [bus][run=loc][tier=std][op=citybus][sys=L2] NaN \n",
+ "2084 ferry-loc-std-ferryhk-c ferry \n",
+ "177 kind=bus-night|kind=alt|run=?|tier=?|op=citybus bus \n",
+ "1319 bus-loc-std-kowloon-c bus \n",
+ "1132 busexpstdkowloon bus \n",
+ "941 feed=OPS|kind=bus|run=loc|tier=std|op=citybus bus \n",
+ "1852 kind,bus,mode,loc,tier,std,op,kowloon NaN \n",
+ "\n",
+ " transport_detail mode service_level operator \n",
+ "229 general local NaN kowloon \n",
+ "1861 general NaN NaN citybus \n",
+ "1715 general local premium NaN \n",
+ "226 airport NaN NaN citybus \n",
+ "1685 crossharbour express NaN NaN \n",
+ "930 general local premium citybus \n",
+ "1397 general local standard citybus \n",
+ "1118 airport local standard ferryhk \n",
+ "1592 general NaN NaN citybus \n",
+ "709 general local NaN citybus \n",
+ "1824 general NaN NaN citybus \n",
+ "1979 general local NaN kowloon \n",
+ "140 general local standard kowloon \n",
+ "2072 general local standard citybus \n",
+ "2084 general local standard ferryhk \n",
+ "177 night NaN NaN citybus \n",
+ "1319 general local standard kowloon \n",
+ "1132 general express standard kowloon \n",
+ "941 general local standard citybus \n",
+ "1852 general NaN NaN kowloon "
+ ]
+ },
+ "execution_count": 1202,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Parse encoded_transport into 5 columns\n",
+ "_SPECIAL_NO_TRANSPORT = {\n",
+ " 'maintenance_shift', 'admin_move', 'staff_shuttle', 'test_run',\n",
+ " 'unk', 'encoded_transport'\n",
+ "}\n",
+ "\n",
+ "def parse_encoded_transport(s):\n",
+ " if not isinstance(s, str):\n",
+ " return {'transport_type': pd.NA, 'transport_detail': pd.NA,\n",
+ " 'mode': pd.NA, 'service_level': pd.NA, 'operator': pd.NA}\n",
+ " v = s.strip().lower()\n",
+ " if v in _SPECIAL_NO_TRANSPORT or not v:\n",
+ " return {'transport_type': pd.NA, 'transport_detail': pd.NA,\n",
+ " 'mode': pd.NA, 'service_level': pd.NA, 'operator': pd.NA}\n",
+ "\n",
+ " # transport_type - use flexible separators, handle word boundaries around them\n",
+ " m = re.search(r'(?:^|[_\\-|\\.::=])(tram|ferry|bus)(?:[_\\-|\\.::]|$)', v)\n",
+ " if not m:\n",
+ " # Try concatenated at start (e.g., buslocstdkowloon)\n",
+ " m = re.search(r'^(tram|ferry|bus)(loc|exp)(std|prem)', v)\n",
+ " if m:\n",
+ " transport_type = m.group(1)\n",
+ " else:\n",
+ " transport_type = pd.NA\n",
+ "\n",
+ " # transport_detail\n",
+ " m = re.search(r'(?:^|[_\\-|\\.::=])(tram|ferry|bus)[_\\-]?(apt|ngt|night|xhbr)', v)\n",
+ " if m:\n",
+ " detail_map = {'apt': 'airport', 'ngt': 'night', 'night': 'night', 'xhbr': 'crossharbour'}\n",
+ " transport_detail = detail_map.get(m.group(2), 'general')\n",
+ " else:\n",
+ " transport_detail = 'general'\n",
+ "\n",
+ " # mode - check multiple patterns\n",
+ " m = re.search(r'\\b(?:run|mode)[=:](\\w+)', v)\n",
+ " if m:\n",
+ " mode_map = {'loc': 'local', 'exp': 'express'}\n",
+ " mode = mode_map.get(m.group(1), pd.NA)\n",
+ " else:\n",
+ " # Try standalone patterns with various separators: _loc_, .loc., |loc|, ::loc::\n",
+ " m = re.search(r'(?:^|[_\\-|\\.::])(loc|exp)(?:[_\\-|\\.::]|$)', v)\n",
+ " if m:\n",
+ " mode = 'local' if m.group(1) == 'loc' else 'express'\n",
+ " else:\n",
+ " # Concatenated: buslocstdkowloon, busexppremcitybus\n",
+ " m = re.search(r'(tram|ferry|bus)(loc|exp)(std|prem)', v)\n",
+ " if m:\n",
+ " mode = 'local' if m.group(2) == 'loc' else 'express'\n",
+ " else:\n",
+ " mode = pd.NA\n",
+ "\n",
+ " # service_level - check multiple patterns\n",
+ " m = re.search(r'\\b(?:tier|svc)[=:](\\w+)', v)\n",
+ " if m:\n",
+ " sl_map = {'std': 'standard', 'prem': 'premium', 'missing': pd.NA}\n",
+ " service_level = sl_map.get(m.group(1), pd.NA)\n",
+ " else:\n",
+ " # Try standalone patterns with various separators: _std_, .std., |std|, ::std::\n",
+ " m = re.search(r'(?:^|[_\\-|\\.::,])(std|prem)(?:[_\\-|\\.::]|$)', v)\n",
+ " if m:\n",
+ " service_level = 'standard' if m.group(1) == 'std' else 'premium'\n",
+ " else:\n",
+ " # Concatenated: buslocstdkowloon, busexppremcitybus\n",
+ " m = re.search(r'(tram|ferry|bus)(loc|exp)(std|prem)', v)\n",
+ " if m:\n",
+ " service_level = 'standard' if m.group(3) == 'std' else 'premium'\n",
+ " else:\n",
+ " service_level = pd.NA\n",
+ "\n",
+ " # operator\n",
+ " m = re.search(r'\\b(?:op|owner)[=:](\\w+)', v)\n",
+ " if m:\n",
+ " operator = m.group(1)\n",
+ " else:\n",
+ " m = re.search(r'(? extract operator at end\n",
+ " m = re.search(r'(citybus|kowloon|ferryhk)$', str(operator))\n",
+ " if m:\n",
+ " operator = m.group(1)\n",
+ "\n",
+ " # Fix truncated operators (missing first letter)\n",
+ " if operator == 'itybus':\n",
+ " operator = 'citybus'\n",
+ " elif operator == 'owloon':\n",
+ " operator = 'kowloon'\n",
+ " elif operator == 'erryhk':\n",
+ " operator = 'ferryhk'\n",
+ "\n",
+ " # Normalize garbage/invalid operators to NaN\n",
+ " invalid_operators = {'unknown', 'delta', 'endcap)(batch', ''}\n",
+ " if operator in invalid_operators:\n",
+ " operator = pd.NA\n",
+ "\n",
+ " return {'transport_type': transport_type, 'transport_detail': transport_detail,\n",
+ " 'mode': mode, 'service_level': service_level, 'operator': operator}\n",
+ "\n",
+ "parsed = df['encoded_transport'].apply(parse_encoded_transport).apply(pd.Series)\n",
+ "df = pd.concat([df, parsed], axis=1)\n",
+ "\n",
+ "df[['encoded_transport', 'transport_type',\n",
+ " 'transport_detail',\n",
+ " 'mode',\n",
+ " 'service_level',\n",
+ " 'operator']].sample(20)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1203,
+ "id": "ea054597",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "mode\n",
+ "local 1097\n",
+ "NaN 651\n",
+ "express 345\n",
+ "Name: count, dtype: int64"
+ ]
+ },
+ "execution_count": 1203,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df['mode'].value_counts(dropna=False).head(30)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1204,
+ "id": "3720f5af",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " record_id | \n",
+ " origin_station | \n",
+ " destination_station | \n",
+ " district | \n",
+ " day_of_week | \n",
+ " is_holiday | \n",
+ " weather_condition | \n",
+ " country_code | \n",
+ " transport_type | \n",
+ " transport_detail | \n",
+ " mode | \n",
+ " service_level | \n",
+ " operator | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " R08001 | \n",
+ " Sha Tin | \n",
+ " Tsuen Wan | \n",
+ " Sha Tin | \n",
+ " Fri | \n",
+ " 0 | \n",
+ " NaN | \n",
+ " UNK | \n",
+ " tram | \n",
+ " general | \n",
+ " local | \n",
+ " standard | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " R08002 | \n",
+ " Tsuen Wan | \n",
+ " Kennedy Town | \n",
+ " Tsuen Wan | \n",
+ " Thu | \n",
+ " 0 | \n",
+ " NaN | \n",
+ " 852 | \n",
+ " tram | \n",
+ " crossharbour | \n",
+ " local | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " R08003 | \n",
+ " Causeway Bay | \n",
+ " Wan Chai | \n",
+ " Wan Chai | \n",
+ " Wed | \n",
+ " 0 | \n",
+ " NaN | \n",
+ " territory-hk | \n",
+ " NaN | \n",
+ " general | \n",
+ " local | \n",
+ " standard | \n",
+ " citybus | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " R08004 | \n",
+ " Admiralty | \n",
+ " Causeway Bay | \n",
+ " Central and Western | \n",
+ " Thu | \n",
+ " 0 | \n",
+ " wx_unknown | \n",
+ " legacy | \n",
+ " NaN | \n",
+ " general | \n",
+ " express | \n",
+ " standard | \n",
+ " citybus | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " R08005 | \n",
+ " North Point | \n",
+ " Central | \n",
+ " Sha Tin | \n",
+ " Sat | \n",
+ " 1 | \n",
+ " NaN | \n",
+ " legacy | \n",
+ " bus | \n",
+ " general | \n",
+ " express | \n",
+ " standard | \n",
+ " citybus | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 2088 | \n",
+ " R09170 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Sha Tin | \n",
+ " Sun | \n",
+ " 0 | \n",
+ " SUNNY | \n",
+ " TST | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 2089 | \n",
+ " R08975 | \n",
+ " Wan Chai | \n",
+ " Central | \n",
+ " Yau Tsim Mong | \n",
+ " Sat | \n",
+ " 0 | \n",
+ " SUNNY | \n",
+ " cc=852|OPS | \n",
+ " tram | \n",
+ " night | \n",
+ " express | \n",
+ " standard | \n",
+ " citybus | \n",
+ "
\n",
+ " \n",
+ " | 2090 | \n",
+ " R09878 | \n",
+ " Sha Tin | \n",
+ " Tsuen Wan | \n",
+ " Wan Chai | \n",
+ " Tue | \n",
+ " 0 | \n",
+ " heavy-rn | \n",
+ " legacy-null | \n",
+ " ferry | \n",
+ " general | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " ferryhk | \n",
+ "
\n",
+ " \n",
+ " | 2091 | \n",
+ " R08338 | \n",
+ " Mong Kok | \n",
+ " Wan Chai | \n",
+ " Yau Tsim Mong | \n",
+ " Mon | \n",
+ " 0 | \n",
+ " heavy-rn | \n",
+ " territory-hk | \n",
+ " tram | \n",
+ " general | \n",
+ " express | \n",
+ " standard | \n",
+ " citybus | \n",
+ "
\n",
+ " \n",
+ " | 2092 | \n",
+ " R09934 | \n",
+ " Admiralty | \n",
+ " Kennedy Town | \n",
+ " Central and Western | \n",
+ " Thu | \n",
+ " 0 | \n",
+ " Unknown | \n",
+ " N/A-HK | \n",
+ " NaN | \n",
+ " general | \n",
+ " express | \n",
+ " standard | \n",
+ " citybus | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
2093 rows × 13 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " record_id origin_station destination_station district \\\n",
+ "0 R08001 Sha Tin Tsuen Wan Sha Tin \n",
+ "1 R08002 Tsuen Wan Kennedy Town Tsuen Wan \n",
+ "2 R08003 Causeway Bay Wan Chai Wan Chai \n",
+ "3 R08004 Admiralty Causeway Bay Central and Western \n",
+ "4 R08005 North Point Central Sha Tin \n",
+ "... ... ... ... ... \n",
+ "2088 R09170 NaN NaN Sha Tin \n",
+ "2089 R08975 Wan Chai Central Yau Tsim Mong \n",
+ "2090 R09878 Sha Tin Tsuen Wan Wan Chai \n",
+ "2091 R08338 Mong Kok Wan Chai Yau Tsim Mong \n",
+ "2092 R09934 Admiralty Kennedy Town Central and Western \n",
+ "\n",
+ " day_of_week is_holiday weather_condition country_code transport_type \\\n",
+ "0 Fri 0 NaN UNK tram \n",
+ "1 Thu 0 NaN 852 tram \n",
+ "2 Wed 0 NaN territory-hk NaN \n",
+ "3 Thu 0 wx_unknown legacy NaN \n",
+ "4 Sat 1 NaN legacy bus \n",
+ "... ... ... ... ... ... \n",
+ "2088 Sun 0 SUNNY TST NaN \n",
+ "2089 Sat 0 SUNNY cc=852|OPS tram \n",
+ "2090 Tue 0 heavy-rn legacy-null ferry \n",
+ "2091 Mon 0 heavy-rn territory-hk tram \n",
+ "2092 Thu 0 Unknown N/A-HK NaN \n",
+ "\n",
+ " transport_detail mode service_level operator \n",
+ "0 general local standard NaN \n",
+ "1 crossharbour local NaN NaN \n",
+ "2 general local standard citybus \n",
+ "3 general express standard citybus \n",
+ "4 general express standard citybus \n",
+ "... ... ... ... ... \n",
+ "2088 NaN NaN NaN NaN \n",
+ "2089 night express standard citybus \n",
+ "2090 general NaN NaN ferryhk \n",
+ "2091 general express standard citybus \n",
+ "2092 general express standard citybus \n",
+ "\n",
+ "[2093 rows x 13 columns]"
+ ]
+ },
+ "execution_count": 1204,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.drop(columns='encoded_transport', inplace=True)\n",
+ "df"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "dataclean-workshop",
+ "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.7"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/pyproject.toml b/pyproject.toml
index 68128b4..84d74c4 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -5,6 +5,7 @@ description = "HKPUG data cleaning tournament starter"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
+ "ipykernel>=7.2.0",
"pandas>=3.0.2",
"scikit-learn>=1.7.2",
]
diff --git a/submission/clean.py b/submission/clean.py
deleted file mode 100644
index b1a07f9..0000000
--- a/submission/clean.py
+++ /dev/null
@@ -1,64 +0,0 @@
-from __future__ import annotations
-
-import argparse
-import re
-from pathlib import Path
-
-import pandas as pd
-
-SUBMISSION_FEATURES = [
- "origin_station",
- "destination_station",
- "district",
- "transport_type",
- "transport_detail",
- "mode",
- "service_level",
- "operator",
- "day_of_week",
- "is_holiday",
- "weather_condition",
- "country_code",
-]
-
-OUTPUT_COLUMNS = ["record_id", *SUBMISSION_FEATURES]
-
-
-def parse_args() -> argparse.Namespace:
- parser = argparse.ArgumentParser()
- parser.add_argument("--train-input", required=True)
- parser.add_argument("--train-output", required=True)
- parser.add_argument("--test-input")
- parser.add_argument("--test-output")
- return parser.parse_args()
-
-
-# Start input your code
-#
-#
-#
-# End of your code
-
-
-def main() -> None:
- args = parse_args()
- train = pd.read_csv(args.train_input)
- # Start input your code
- #
- #
- #
- # End of your code
- Path(args.train_output).parent.mkdir(parents=True, exist_ok=True)
- cleaned_train.to_csv(args.train_output, index=False)
-
- if args.test_input or args.test_output:
- if not args.test_input or not args.test_output:
- raise ValueError("--test-input and --test-output must be provided together")
- test = pd.read_csv(args.test_input)
- cleaned_test = _clean_frame(test)
- Path(args.test_output).parent.mkdir(parents=True, exist_ok=True)
- cleaned_test.to_csv(args.test_output, index=False)
-
-
-if __name__ == "__main__":
- main()
diff --git a/submission/clean.py.cms b/submission/clean.py.cms
new file mode 100644
index 0000000..76665a0
Binary files /dev/null and b/submission/clean.py.cms differ
diff --git a/submission/manifest.json b/submission/manifest.json
new file mode 100644
index 0000000..d3366b5
--- /dev/null
+++ b/submission/manifest.json
@@ -0,0 +1,6 @@
+{
+ "team_id": "team-01",
+ "code_path": "submission/clean.py.cms",
+ "code_sha256": "2a2c5d865ffeadf4894f146662929444733db7b36afc1f223f2a2a08edceb03b",
+ "notes": "Replace team_id with your assigned team identity before signing."
+}
diff --git a/submission/manifest.sig b/submission/manifest.sig
new file mode 100644
index 0000000..40d0a24
Binary files /dev/null and b/submission/manifest.sig differ
diff --git a/uv.lock b/uv.lock
index 4ffae69..be9369e 100644
--- a/uv.lock
+++ b/uv.lock
@@ -1,5 +1,5 @@
version = 1
-revision = 3
+revision = 2
requires-python = ">=3.13"
resolution-markers = [
"python_full_version >= '3.14' and sys_platform == 'win32'",
@@ -10,6 +10,69 @@ resolution-markers = [
"python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'",
]
+[[package]]
+name = "appnope"
+version = "0.1.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" },
+]
+
+[[package]]
+name = "asttokens"
+version = "3.0.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" },
+]
+
+[[package]]
+name = "cffi"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pycparser", marker = "implementation_name != 'PyPy'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" },
+ { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" },
+ { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" },
+ { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" },
+ { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" },
+ { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" },
+ { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" },
+ { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" },
+ { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" },
+ { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" },
+]
+
[[package]]
name = "colorama"
version = "0.4.6"
@@ -19,11 +82,21 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
]
+[[package]]
+name = "comm"
+version = "0.2.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" },
+]
+
[[package]]
name = "dataclean-workshop"
version = "0.1.0"
source = { virtual = "." }
dependencies = [
+ { name = "ipykernel" },
{ name = "pandas" },
{ name = "scikit-learn" },
]
@@ -35,6 +108,7 @@ dev = [
[package.metadata]
requires-dist = [
+ { name = "ipykernel", specifier = ">=7.2.0" },
{ name = "pandas", specifier = ">=3.0.2" },
{ name = "scikit-learn", specifier = ">=1.7.2" },
]
@@ -42,6 +116,41 @@ requires-dist = [
[package.metadata.requires-dev]
dev = [{ name = "pytest", specifier = ">=8.4.2" }]
+[[package]]
+name = "debugpy"
+version = "1.8.20"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e0/b7/cd8080344452e4874aae67c40d8940e2b4d47b01601a8fd9f44786c757c7/debugpy-1.8.20.tar.gz", hash = "sha256:55bc8701714969f1ab89a6d5f2f3d40c36f91b2cbe2f65d98bf8196f6a6a2c33", size = 1645207, upload-time = "2026-01-29T23:03:28.199Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/15/e2/fc500524cc6f104a9d049abc85a0a8b3f0d14c0a39b9c140511c61e5b40b/debugpy-1.8.20-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:5dff4bb27027821fdfcc9e8f87309a28988231165147c31730128b1c983e282a", size = 2539560, upload-time = "2026-01-29T23:03:48.738Z" },
+ { url = "https://files.pythonhosted.org/packages/90/83/fb33dcea789ed6018f8da20c5a9bc9d82adc65c0c990faed43f7c955da46/debugpy-1.8.20-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:84562982dd7cf5ebebfdea667ca20a064e096099997b175fe204e86817f64eaf", size = 4293272, upload-time = "2026-01-29T23:03:50.169Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/25/b1e4a01bfb824d79a6af24b99ef291e24189080c93576dfd9b1a2815cd0f/debugpy-1.8.20-cp313-cp313-win32.whl", hash = "sha256:da11dea6447b2cadbf8ce2bec59ecea87cc18d2c574980f643f2d2dfe4862393", size = 5331208, upload-time = "2026-01-29T23:03:51.547Z" },
+ { url = "https://files.pythonhosted.org/packages/13/f7/a0b368ce54ffff9e9028c098bd2d28cfc5b54f9f6c186929083d4c60ba58/debugpy-1.8.20-cp313-cp313-win_amd64.whl", hash = "sha256:eb506e45943cab2efb7c6eafdd65b842f3ae779f020c82221f55aca9de135ed7", size = 5372930, upload-time = "2026-01-29T23:03:53.585Z" },
+ { url = "https://files.pythonhosted.org/packages/33/2e/f6cb9a8a13f5058f0a20fe09711a7b726232cd5a78c6a7c05b2ec726cff9/debugpy-1.8.20-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:9c74df62fc064cd5e5eaca1353a3ef5a5d50da5eb8058fcef63106f7bebe6173", size = 2538066, upload-time = "2026-01-29T23:03:54.999Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/56/6ddca50b53624e1ca3ce1d1e49ff22db46c47ea5fb4c0cc5c9b90a616364/debugpy-1.8.20-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:077a7447589ee9bc1ff0cdf443566d0ecf540ac8aa7333b775ebcb8ce9f4ecad", size = 4269425, upload-time = "2026-01-29T23:03:56.518Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/d9/d64199c14a0d4c476df46c82470a3ce45c8d183a6796cfb5e66533b3663c/debugpy-1.8.20-cp314-cp314-win32.whl", hash = "sha256:352036a99dd35053b37b7803f748efc456076f929c6a895556932eaf2d23b07f", size = 5331407, upload-time = "2026-01-29T23:03:58.481Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/d9/1f07395b54413432624d61524dfd98c1a7c7827d2abfdb8829ac92638205/debugpy-1.8.20-cp314-cp314-win_amd64.whl", hash = "sha256:a98eec61135465b062846112e5ecf2eebb855305acc1dfbae43b72903b8ab5be", size = 5372521, upload-time = "2026-01-29T23:03:59.864Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl", hash = "sha256:5be9bed9ae3be00665a06acaa48f8329d2b9632f15fd09f6a9a8c8d9907e54d7", size = 5337658, upload-time = "2026-01-29T23:04:17.404Z" },
+]
+
+[[package]]
+name = "decorator"
+version = "5.3.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/60/8b/32f9823da46cde7df2087faa08cd98d01b908f8dcab982cdba9c84e85355/decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82", size = 58084, upload-time = "2026-05-18T06:03:28.057Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl", hash = "sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c", size = 10365, upload-time = "2026-05-18T06:03:26.517Z" },
+]
+
+[[package]]
+name = "executing"
+version = "2.2.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" },
+]
+
[[package]]
name = "iniconfig"
version = "2.3.0"
@@ -51,6 +160,76 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
]
+[[package]]
+name = "ipykernel"
+version = "7.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "appnope", marker = "sys_platform == 'darwin'" },
+ { name = "comm" },
+ { name = "debugpy" },
+ { name = "ipython" },
+ { name = "jupyter-client" },
+ { name = "jupyter-core" },
+ { name = "matplotlib-inline" },
+ { name = "nest-asyncio" },
+ { name = "packaging" },
+ { name = "psutil" },
+ { name = "pyzmq" },
+ { name = "tornado" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ca/8d/b68b728e2d06b9e0051019640a40a9eb7a88fcd82c2e1b5ce70bef5ff044/ipykernel-7.2.0.tar.gz", hash = "sha256:18ed160b6dee2cbb16e5f3575858bc19d8f1fe6046a9a680c708494ce31d909e", size = 176046, upload-time = "2026-02-06T16:43:27.403Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/82/b9/e73d5d9f405cba7706c539aa8b311b49d4c2f3d698d9c12f815231169c71/ipykernel-7.2.0-py3-none-any.whl", hash = "sha256:3bbd4420d2b3cc105cbdf3756bfc04500b1e52f090a90716851f3916c62e1661", size = 118788, upload-time = "2026-02-06T16:43:25.149Z" },
+]
+
+[[package]]
+name = "ipython"
+version = "9.14.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "decorator" },
+ { name = "ipython-pygments-lexers" },
+ { name = "jedi" },
+ { name = "matplotlib-inline" },
+ { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
+ { name = "prompt-toolkit" },
+ { name = "psutil", marker = "sys_platform != 'emscripten'" },
+ { name = "pygments" },
+ { name = "stack-data" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/21/c2/c0064cf15d026501a1ef70e42efd9c3f818663089399aacc5e37a82901c1/ipython-9.14.0.tar.gz", hash = "sha256:6f27ff0f1d9ea050e0551f71568bc4b34d8aba579e8f111c5b4175f44ac6b4aa", size = 4432601, upload-time = "2026-05-29T15:13:24.611Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/14/a3/9e59340f02c1dc8f8c0a05b09244712b8609eb5439f9996e887e2b82f452/ipython-9.14.0-py3-none-any.whl", hash = "sha256:8fd984a3372c14b12790b084ba6b5cff5678c0cb063244a0034f06a51f20d6c2", size = 627457, upload-time = "2026-05-29T15:13:22.942Z" },
+]
+
+[[package]]
+name = "ipython-pygments-lexers"
+version = "1.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" },
+]
+
+[[package]]
+name = "jedi"
+version = "0.20.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "parso" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/46/b7/a3635f6a2d7cf5b5dd98064fc1d5fbbafcb25477bcea204a3a92145d158b/jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011", size = 3119416, upload-time = "2026-05-01T23:38:47.814Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl", hash = "sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67", size = 4884812, upload-time = "2026-05-01T23:38:43.919Z" },
+]
+
[[package]]
name = "joblib"
version = "1.5.3"
@@ -60,6 +239,56 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" },
]
+[[package]]
+name = "jupyter-client"
+version = "8.8.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "jupyter-core" },
+ { name = "python-dateutil" },
+ { name = "pyzmq" },
+ { name = "tornado" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/05/e4/ba649102a3bc3fbca54e7239fb924fd434c766f855693d86de0b1f2bec81/jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e", size = 348020, upload-time = "2026-01-08T13:55:47.938Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a", size = 107371, upload-time = "2026-01-08T13:55:45.562Z" },
+]
+
+[[package]]
+name = "jupyter-core"
+version = "5.9.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "platformdirs" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" },
+]
+
+[[package]]
+name = "matplotlib-inline"
+version = "0.2.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/bd/c0/9f7c9a46090390368a4d7bcb76bb87a4a36c421e4c0792cdb53486ffac7a/matplotlib_inline-0.2.2.tar.gz", hash = "sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79", size = 8150, upload-time = "2026-05-08T17:33:33.49Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl", hash = "sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6", size = 9534, upload-time = "2026-05-08T17:33:32.055Z" },
+]
+
+[[package]]
+name = "nest-asyncio"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" },
+]
+
[[package]]
name = "numpy"
version = "2.4.4"
@@ -163,6 +392,36 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/cb/2b/f8434233fab2bd66a02ec014febe4e5adced20e2693e0e90a07d118ed30e/pandas-3.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:5371b72c2d4d415d08765f32d689217a43227484e81b2305b52076e328f6f482", size = 9455341, upload-time = "2026-03-31T06:48:28.418Z" },
]
+[[package]]
+name = "parso"
+version = "0.8.7"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/30/4b/90c937815137d43ce71ba043cd3566221e9df6b9c805f24b5d138c9d40a7/parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1", size = 401824, upload-time = "2026-05-01T23:13:02.138Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c", size = 107025, upload-time = "2026-05-01T23:12:58.867Z" },
+]
+
+[[package]]
+name = "pexpect"
+version = "4.9.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "ptyprocess", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" },
+]
+
+[[package]]
+name = "platformdirs"
+version = "4.10.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", size = 31224, upload-time = "2026-05-28T03:32:53.587Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" },
+]
+
[[package]]
name = "pluggy"
version = "1.6.0"
@@ -172,6 +431,73 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
]
+[[package]]
+name = "prompt-toolkit"
+version = "3.0.52"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "wcwidth" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" },
+]
+
+[[package]]
+name = "psutil"
+version = "7.2.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" },
+ { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" },
+ { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" },
+ { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" },
+ { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" },
+ { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" },
+ { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" },
+ { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" },
+]
+
+[[package]]
+name = "ptyprocess"
+version = "0.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" },
+]
+
+[[package]]
+name = "pure-eval"
+version = "0.2.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" },
+]
+
+[[package]]
+name = "pycparser"
+version = "3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" },
+]
+
[[package]]
name = "pygments"
version = "2.20.0"
@@ -209,6 +535,49 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
]
+[[package]]
+name = "pyzmq"
+version = "27.1.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cffi", marker = "implementation_name == 'pypy'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" },
+ { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" },
+ { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" },
+ { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436, upload-time = "2025-09-08T23:08:20.801Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301, upload-time = "2025-09-08T23:08:22.47Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197, upload-time = "2025-09-08T23:08:24.286Z" },
+ { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload-time = "2025-09-08T23:08:26.063Z" },
+ { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload-time = "2025-09-08T23:08:27.623Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload-time = "2025-09-08T23:08:29.672Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload-time = "2025-09-08T23:08:31.349Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload-time = "2025-09-08T23:08:33.543Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload-time = "2025-09-08T23:08:35.51Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload-time = "2025-09-08T23:08:37.178Z" },
+ { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload-time = "2025-09-08T23:08:40.595Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload-time = "2025-09-08T23:08:42.668Z" },
+ { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload-time = "2025-09-08T23:08:44.973Z" },
+ { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload-time = "2025-09-08T23:08:49.76Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload-time = "2025-09-08T23:08:51.7Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload-time = "2025-09-08T23:08:53.393Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload-time = "2025-09-08T23:08:55.702Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload-time = "2025-09-08T23:08:58.18Z" },
+ { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload-time = "2025-09-08T23:08:59.802Z" },
+ { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" },
+]
+
[[package]]
name = "scikit-learn"
version = "1.8.0"
@@ -307,6 +676,20 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
]
+[[package]]
+name = "stack-data"
+version = "0.6.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "asttokens" },
+ { name = "executing" },
+ { name = "pure-eval" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" },
+]
+
[[package]]
name = "threadpoolctl"
version = "3.6.0"
@@ -316,6 +699,32 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" },
]
+[[package]]
+name = "tornado"
+version = "6.5.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/50/57/6d7303a77ae439d9189108f76c0c4fd89ee5e2cc8387bffb55232565c4ed/tornado-6.5.6.tar.gz", hash = "sha256:9a365179fe8ff6b8766f602c0f67c185d778193e9bdd828b19f0b6ed7764177d", size = 518139, upload-time = "2026-05-27T15:35:54.646Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1b/0d/b4f481e18c5a51864e6d12b9a05ecf72919696680b747c958c3fc1f4fbae/tornado-6.5.6-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:65fcfaafb079435c2c19dc9e07c0f1cf0fa9051759ed0a7d0a3ba7ea7f64919c", size = 447737, upload-time = "2026-05-27T15:35:38.122Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/9c/5430c39fcab1144d35860f457b15e9c08b4bc7ac86764354204e983d6183/tornado-6.5.6-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:38bc01b4acacded2de63ae78023548e41ebe6fbed3ec05a796d7ae3ad893887e", size = 445899, upload-time = "2026-05-27T15:35:40.519Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/79/fa7e14a2f939c807a8d30619b4eb604eab219601b78792516ebe22d40cf9/tornado-6.5.6-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b942e6a137fda31ff54bf8e6e2c8d1c37f1f50583f3ed53fb840b53b9601d104", size = 448964, upload-time = "2026-05-27T15:35:42.106Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/71/bd67d5f5199f937dafe03a49a37989f60f600ff6fef34c79412a829d97bd/tornado-6.5.6-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8666946e70171b8c3f1fc9b7876fac492e84822c4c7f3746f4e8f8bc9ac92a79", size = 449935, upload-time = "2026-05-27T15:35:43.906Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/a4/c24388c9cf5b3c3a513b56a158af9f23092c9a2810d789e294310797df21/tornado-6.5.6-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1c34cfab7ad6d104f052f55de06d39bbafc5885cfeb4da688803308dbcfa90b7", size = 449767, upload-time = "2026-05-27T15:35:45.793Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/eb/6a07ad550c3f7b37244bd0becdf293ec3d3e961783d8b720a97df50de1b2/tornado-6.5.6-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:385f35e4e22fb52551dfcda4cdc8c30c61c2c001aef5ddad99cdfe116952efd3", size = 449174, upload-time = "2026-05-27T15:35:47.485Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/84/3469e098dccdb6763130e06aacd786bb4363fca7b590a55c101ddf34ed30/tornado-6.5.6-cp39-abi3-win32.whl", hash = "sha256:db475f1b67b2809b10bb16264829087724ca8d24fe4ed47f7b8675cae453ef86", size = 450230, upload-time = "2026-05-27T15:35:49.322Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/3c/273a04e0b9dd9016f1685cca0c1c8795a71ac88a34a8c889a0b443483226/tornado-6.5.6-cp39-abi3-win_amd64.whl", hash = "sha256:6739bf1e8eb09230f1280ddbd3236f0309db70f2c551a8dbc40f62babdf82f79", size = 450667, upload-time = "2026-05-27T15:35:51.194Z" },
+ { url = "https://files.pythonhosted.org/packages/02/98/0cffe22a224f60c5fb1e3aa0b76f9da2e1ca78b0e9545e3d077c68ce60a7/tornado-6.5.6-cp39-abi3-win_arm64.whl", hash = "sha256:2543597b24a695d72338a9a77818362d72387c03ae173f1f169eadc5c91466ac", size = 449690, upload-time = "2026-05-27T15:35:52.902Z" },
+]
+
+[[package]]
+name = "traitlets"
+version = "5.15.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1b/22/40f55b26baeab80c2d7b3f1db0682f8954e4617fee7d90ce634022ef05c6/traitlets-5.15.0.tar.gz", hash = "sha256:4fead733f81cf1c4c938e06f8ca4633896833c9d89eff878159457f4d4392971", size = 163197, upload-time = "2026-05-06T08:05:58.016Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl", hash = "sha256:fb36a18867a6803deab09f3c5e0fa81bb7b26a5c9e82501c9933f759166eff40", size = 85877, upload-time = "2026-05-06T08:05:55.853Z" },
+]
+
[[package]]
name = "tzdata"
version = "2026.2"
@@ -324,3 +733,12 @@ sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35c
wheels = [
{ url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7", size = 349321, upload-time = "2026-04-24T15:22:05.876Z" },
]
+
+[[package]]
+name = "wcwidth"
+version = "0.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/2c/ee/afaf0f85a9a18fe47a67f1e4422ed6cf1fe642f0ae0a2f81166231303c52/wcwidth-0.7.0.tar.gz", hash = "sha256:90e3a7ea092341c44b99562e75d09e4d5160fe7a3974c6fb842a101a95e7eed0", size = 182132, upload-time = "2026-05-02T16:04:12.653Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl", hash = "sha256:5d69154c429a82910e241c738cd0e2976fac8a2dd47a1a805f4afed1c0f136f2", size = 110825, upload-time = "2026-05-02T16:04:11.033Z" },
+]