diff --git a/integration/databricks/notebooks/databricks_feature_store.ipynb b/integration/databricks/notebooks/databricks_feature_store.ipynb new file mode 100644 index 0000000..c5a34c9 --- /dev/null +++ b/integration/databricks/notebooks/databricks_feature_store.ipynb @@ -0,0 +1,11417 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c2f4eb79", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "Before running this notebook:\n", + "\n", + "1. Authenticate with Databricks:\n", + "```bash\n", + "databricks auth login\n", + "```\n", + "\n", + "2. Prepare the data:\n", + "```bash\n", + "uv run --group databricks python -m integration.databricks.prepare_jaffle_shop_data_for_databricks\n", + "```\n", + "\n", + "This will load raw data from GCS and create the weekly sales forecasting population table." + ] + }, + { + "cell_type": "markdown", + "id": "78191b84", + "metadata": {}, + "source": [ + "## Setup and Data Loading" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "37c73e30", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[2K Loading pipelines... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", + "\u001b[?25h" + ] + }, + { + "data": { + "text/html": [ + "
Connected to project 'databricks_feature_store'.\n",
+       "
\n" + ], + "text/plain": [ + "Connected to project \u001b[32m'databricks_feature_store'\u001b[0m.\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import getml\n", + "from databricks.connect import DatabricksSession\n", + "\n", + "getml.set_project(\"databricks_feature_store\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "5c743187", + "metadata": {}, + "outputs": [], + "source": [ + "spark = DatabricksSession.builder.serverless().getOrCreate()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "99bd4e16", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/awais/code17/projects/getML/github/getml-demo/.venv/lib/python3.12/site-packages/getml/data/_io/arrow.py:326: UserWarning: \n", + "Column 'next_week_sales' has been converted from decimal to float. This may\n", + " result in a loss of precision!\n", + " \n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "weekly_sales_by_store_spark = spark.table(\n", + " \"workspace.prepared.weekly_sales_by_store_with_target\"\n", + ")\n", + "\n", + "weekly_sales_by_store = getml.DataFrame.from_arrow(\n", + " weekly_sales_by_store_spark.toArrow(), name=\"weekly_sales_by_store\"\n", + ")\n", + "\n", + "# # Load orders table\n", + "orders_spark = spark.table(\"workspace.raw.raw_orders\")\n", + "orders = getml.DataFrame.from_arrow(orders_spark.toArrow(), name=\"orders\")" + ] + }, + { + "cell_type": "markdown", + "id": "a3148e93", + "metadata": {}, + "source": [ + "## getML Annotations" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "b824b21e", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/awais/code17/projects/getML/github/getml-demo/.venv/lib/python3.12/site-packages/getml/data/_io/arrow.py:348: UserWarning: \n", + "Column 'reference_date' has UTC timezone. Dropping the timezone.\n", + "\n", + " Currently, getML doesn't support the handling of explicit timezones for\n", + "timestamps. If you need timezone information to be available for your models, you\n", + "can encode the timezone explicitly in a separate column.\n", + " \n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name reference_date store_idsnapshot_idnext_week_salesstore_name year month week_numberis_full_week_after_openinghas_order_activityhas_min_historydays_since_opennext_week_orders
role time_stamp join_key join_key targetcategorical categoricalcategoricalcategoricalcategorical categorical categorical numerical numerical
unittime stamp, comparison only
02022-09-19eafbd328-0434-4f46-9c2d-cc97a46f...778\n", + " 26020.74\n", + " Brooklyn2022938truetruetrue\n", + " 1287 \n", + " \n", + " 2389 \n", + "
12023-10-16fc7707c0-2f1e-48d4-b870-7cbeddfc...1115\n", + " 19807.07\n", + " Philadelphia20231042truetruetrue\n", + " 1871 \n", + " \n", + " 1627 \n", + "
22024-07-15eafbd328-0434-4f46-9c2d-cc97a46f...1348\n", + " 21198.29\n", + " Brooklyn2024729truetruetrue\n", + " 1952 \n", + " \n", + " 2066 \n", + "
32023-08-14eafbd328-0434-4f46-9c2d-cc97a46f...1060\n", + " 20418.27\n", + " Brooklyn2023833truetruetrue\n", + " 1616 \n", + " \n", + " 2054 \n", + "
42020-01-27eafbd328-0434-4f46-9c2d-cc97a46f...119\n", + " 25682.76\n", + " Brooklyn202015truetruetrue\n", + " 321 \n", + " \n", + " 2382 \n", + "
.........\n", + " ... \n", + " .....................\n", + " ... \n", + " \n", + " ... \n", + "
13742022-08-29abfcc332-1eaf-42f6-b8e4-569bf6a3...758\n", + " 18024.09\n", + " Chicago2022835truetruetrue\n", + " 853 \n", + " \n", + " 1685 \n", + "
13752024-04-08fc7707c0-2f1e-48d4-b870-7cbeddfc...1265\n", + " 18632.58\n", + " Philadelphia2024415truetruetrue\n", + " 2046 \n", + " \n", + " 1589 \n", + "
13762022-03-28abfcc332-1eaf-42f6-b8e4-569bf6a3...626\n", + " 23063.98\n", + " Chicago2022313truetruetrue\n", + " 699 \n", + " \n", + " 2093 \n", + "
13772022-08-01abfcc332-1eaf-42f6-b8e4-569bf6a3...734\n", + " 18610.37\n", + " Chicago2022831truetruetrue\n", + " 825 \n", + " \n", + " 1704 \n", + "
13782022-11-28abfcc332-1eaf-42f6-b8e4-569bf6a3...836\n", + " 25652.78\n", + " Chicago20221148truetruetrue\n", + " 944 \n", + " \n", + " 2221 \n", + "
\n", + "\n", + "

\n", + " 1379 rows x 13 columns
\n", + " memory usage: 0.09 MB
\n", + " name: weekly_sales_by_store
\n", + " type: getml.DataFrame
\n", + " \n", + "

\n" + ], + "text/plain": [ + "name reference_date store_id snapshot_id next_week_sales ...\n", + "role time_stamp join_key join_key target ...\n", + "unit time stamp, comparison only ...\n", + " 0 2022-09-19 eafbd328-0434-4f46-9c2d-cc97a46f... 778 26020.74 ...\n", + " 1 2023-10-16 fc7707c0-2f1e-48d4-b870-7cbeddfc... 1115 19807.07 ...\n", + " 2 2024-07-15 eafbd328-0434-4f46-9c2d-cc97a46f... 1348 21198.29 ...\n", + " 3 2023-08-14 eafbd328-0434-4f46-9c2d-cc97a46f... 1060 20418.27 ...\n", + " 4 2020-01-27 eafbd328-0434-4f46-9c2d-cc97a46f... 119 25682.76 ...\n", + " ... ... ... ... \n", + "1374 2022-08-29 abfcc332-1eaf-42f6-b8e4-569bf6a3... 758 18024.09 ...\n", + "1375 2024-04-08 fc7707c0-2f1e-48d4-b870-7cbeddfc... 1265 18632.58 ...\n", + "1376 2022-03-28 abfcc332-1eaf-42f6-b8e4-569bf6a3... 626 23063.98 ...\n", + "1377 2022-08-01 abfcc332-1eaf-42f6-b8e4-569bf6a3... 734 18610.37 ...\n", + "1378 2022-11-28 abfcc332-1eaf-42f6-b8e4-569bf6a3... 836 25652.78 ...\n", + "\n", + "name is_full_week_after_opening has_order_activity has_min_history days_since_open next_week_orders\n", + "role categorical categorical categorical numerical numerical\n", + "unit \n", + " 0 true true true 1287 2389\n", + " 1 true true true 1871 1627\n", + " 2 true true true 1952 2066\n", + " 3 true true true 1616 2054\n", + " 4 true true true 321 2382\n", + " ... ... ... ... ...\n", + "1374 true true true 853 1685\n", + "1375 true true true 2046 1589\n", + "1376 true true true 699 2093\n", + "1377 true true true 825 1704\n", + "1378 true true true 944 2221\n", + "\n", + "\n", + "1379 rows x 13 columns\n", + "memory usage: 0.09 MB\n", + "type: getml.DataFrame" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "weekly_sales_by_store.set_role(\n", + " cols=[\"store_id\", \"snapshot_id\"], role=getml.data.roles.join_key\n", + ")\n", + "weekly_sales_by_store.set_role(cols=\"reference_date\", role=getml.data.roles.time_stamp)\n", + "weekly_sales_by_store.set_role(cols=\"next_week_sales\", role=getml.data.roles.target)\n", + "weekly_sales_by_store.set_role(\n", + " cols=[\n", + " \"store_name\",\n", + " \"year\",\n", + " \"month\",\n", + " \"week_number\",\n", + " \"is_full_week_after_opening\",\n", + " \"has_order_activity\",\n", + " \"has_min_history\",\n", + " ],\n", + " role=getml.data.roles.categorical,\n", + ")\n", + "weekly_sales_by_store.set_role(\n", + " cols=[\"days_since_open\", \"next_week_orders\"], role=getml.data.roles.numerical\n", + ")\n", + "weekly_sales_by_store\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "99e49252", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name ordered_at store_id id customer subtotalorder_total tax_paid
role time_stamp join_key join_key join_keynumerical numericalnumerical
unittime stamp, comparison only
02018-09-01 09:07:00fc7707c0-2f1e-48d4-b870-7cbeddfc...2dfe5624-4340-4ae0-af9f-01edf04c...304f8066-3937-42ab-9edc-5e2c937e...\n", + " 4000 \n", + " \n", + " 4240 \n", + " \n", + " 240 \n", + "
12018-09-01 08:32:00fc7707c0-2f1e-48d4-b870-7cbeddfc...80c27a4c-7d23-49fe-864e-1859a166...ab45b9b0-e8cb-4eed-b1c7-5b3a70cd...\n", + " 500 \n", + " \n", + " 530 \n", + " \n", + " 30 \n", + "
22018-09-01 13:00:00fc7707c0-2f1e-48d4-b870-7cbeddfc...bd7d415c-a44e-47ba-bf35-727ecf8b...530d100f-15de-49ea-93bb-28b570a7...\n", + " 3200 \n", + " \n", + " 3392 \n", + " \n", + " 192 \n", + "
32018-09-01 11:14:00fc7707c0-2f1e-48d4-b870-7cbeddfc...ed02759f-4d40-44c5-8583-2eddaf1e...5603ee30-171b-4f23-a0b3-3b4cd282...\n", + " 5300 \n", + " \n", + " 5618 \n", + " \n", + " 318 \n", + "
42018-09-01 12:49:00fc7707c0-2f1e-48d4-b870-7cbeddfc...ff48d20e-7294-4ca1-9baa-85821bda...5512b3a7-632d-4daa-94a3-d24533fc...\n", + " 600 \n", + " \n", + " 636 \n", + " \n", + " 36 \n", + "
............\n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + "
23095982024-08-29 13:01:0061743c9b-2394-4d36-8062-8a6820fa...479b3bbd-170c-4fe6-9b83-19e9dd15...6ab94c27-8718-4907-854b-c8a4892e...\n", + " 400 \n", + " \n", + " 432 \n", + " \n", + " 32 \n", + "
23095992024-08-29 10:27:0061743c9b-2394-4d36-8062-8a6820fa...8e1feeb5-b8a6-47fc-8432-f8b7aea3...a866ff38-808f-458d-9c15-bb87b383...\n", + " 600 \n", + " \n", + " 648 \n", + " \n", + " 48 \n", + "
23096002024-08-29 08:56:0061743c9b-2394-4d36-8062-8a6820fa...919345f8-0577-4d73-a191-06a29216...34f910be-3d58-41e6-9d68-0f07789f...\n", + " 400 \n", + " \n", + " 432 \n", + " \n", + " 32 \n", + "
23096012024-08-29 08:01:0061743c9b-2394-4d36-8062-8a6820fa...6ca68a2c-b962-4e81-9f82-3f347cc3...78ab9d2c-dcd4-4b5e-a4d9-d4a86633...\n", + " 400 \n", + " \n", + " 432 \n", + " \n", + " 32 \n", + "
23096022024-08-29 11:20:0061743c9b-2394-4d36-8062-8a6820fa...1b56cdd3-345d-488f-9a4a-6c4322b6...f54357ad-5473-4601-ad54-8d3a758d...\n", + " 1100 \n", + " \n", + " 1188 \n", + " \n", + " 88 \n", + "
\n", + "\n", + "

\n", + " 2309603 rows x 7 columns
\n", + " memory usage: 101.62 MB
\n", + " name: orders
\n", + " type: getml.DataFrame
\n", + " \n", + "

\n" + ], + "text/plain": [ + " name ordered_at store_id id\n", + " role time_stamp join_key join_key\n", + " unit time stamp, comparison only \n", + " 0 2018-09-01 09:07:00 fc7707c0-2f1e-48d4-b870-7cbeddfc... 2dfe5624-4340-4ae0-af9f-01edf04c...\n", + " 1 2018-09-01 08:32:00 fc7707c0-2f1e-48d4-b870-7cbeddfc... 80c27a4c-7d23-49fe-864e-1859a166...\n", + " 2 2018-09-01 13:00:00 fc7707c0-2f1e-48d4-b870-7cbeddfc... bd7d415c-a44e-47ba-bf35-727ecf8b...\n", + " 3 2018-09-01 11:14:00 fc7707c0-2f1e-48d4-b870-7cbeddfc... ed02759f-4d40-44c5-8583-2eddaf1e...\n", + " 4 2018-09-01 12:49:00 fc7707c0-2f1e-48d4-b870-7cbeddfc... ff48d20e-7294-4ca1-9baa-85821bda...\n", + " ... ... ...\n", + "2309598 2024-08-29 13:01:00 61743c9b-2394-4d36-8062-8a6820fa... 479b3bbd-170c-4fe6-9b83-19e9dd15...\n", + "2309599 2024-08-29 10:27:00 61743c9b-2394-4d36-8062-8a6820fa... 8e1feeb5-b8a6-47fc-8432-f8b7aea3...\n", + "2309600 2024-08-29 08:56:00 61743c9b-2394-4d36-8062-8a6820fa... 919345f8-0577-4d73-a191-06a29216...\n", + "2309601 2024-08-29 08:01:00 61743c9b-2394-4d36-8062-8a6820fa... 6ca68a2c-b962-4e81-9f82-3f347cc3...\n", + "2309602 2024-08-29 11:20:00 61743c9b-2394-4d36-8062-8a6820fa... 1b56cdd3-345d-488f-9a4a-6c4322b6...\n", + "\n", + " name customer subtotal order_total tax_paid\n", + " role join_key numerical numerical numerical\n", + " unit \n", + " 0 304f8066-3937-42ab-9edc-5e2c937e... 4000 4240 240\n", + " 1 ab45b9b0-e8cb-4eed-b1c7-5b3a70cd... 500 530 30\n", + " 2 530d100f-15de-49ea-93bb-28b570a7... 3200 3392 192\n", + " 3 5603ee30-171b-4f23-a0b3-3b4cd282... 5300 5618 318\n", + " 4 5512b3a7-632d-4daa-94a3-d24533fc... 600 636 36\n", + " ... ... ... ...\n", + "2309598 6ab94c27-8718-4907-854b-c8a4892e... 400 432 32\n", + "2309599 a866ff38-808f-458d-9c15-bb87b383... 600 648 48\n", + "2309600 34f910be-3d58-41e6-9d68-0f07789f... 400 432 32\n", + "2309601 78ab9d2c-dcd4-4b5e-a4d9-d4a86633... 400 432 32\n", + "2309602 f54357ad-5473-4601-ad54-8d3a758d... 1100 1188 88\n", + "\n", + "\n", + "2309603 rows x 7 columns\n", + "memory usage: 101.62 MB\n", + "type: getml.DataFrame" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "orders.set_role(cols=[\"store_id\", \"id\", \"customer\"], role=getml.data.roles.join_key)\n", + "orders.set_role(\n", + " cols=\"ordered_at\",\n", + " role=getml.data.roles.time_stamp,\n", + " time_formats=[\"%Y-%m-%dT%H:%M:%S\"],\n", + ")\n", + "orders.set_role(\n", + " cols=[\"subtotal\", \"order_total\", \"tax_paid\"], role=getml.data.roles.numerical\n", + ")\n", + "orders" + ] + }, + { + "cell_type": "markdown", + "id": "7811cb8c", + "metadata": {}, + "source": [ + "## getML Data Model" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "e14a2cdd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training set size: 863\n", + "Validation set size: 312\n", + "Test set size: 204\n" + ] + } + ], + "source": [ + "validation_begin = getml.data.time.datetime(2023, 1, 1)\n", + "test_begin = getml.data.time.datetime(2024, 1, 1)\n", + "\n", + "split = getml.data.split.time(\n", + " population=weekly_sales_by_store,\n", + " time_stamp=\"reference_date\",\n", + " validation=validation_begin,\n", + " test=test_begin,\n", + ")\n", + "\n", + "# Filter dataframes using the split column\n", + "weekly_sales_by_store_train = weekly_sales_by_store[split == \"train\"]\n", + "weekly_sales_by_store_validation = weekly_sales_by_store[split == \"validation\"]\n", + "weekly_sales_by_store_test = weekly_sales_by_store[split == \"test\"]\n", + "\n", + "print(\n", + " f\"Training set size: {len(weekly_sales_by_store_train)}\"\n", + " f\"\\nValidation set size: {len(weekly_sales_by_store_validation)}\"\n", + " f\"\\nTest set size: {len(weekly_sales_by_store_test)}\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "39d77442", + "metadata": {}, + "outputs": [], + "source": [ + "data_model = getml.data.DataModel(\n", + " population=weekly_sales_by_store_train.to_placeholder(\"weekly_sales_by_store\")\n", + ")\n", + "\n", + "# Add all peripheral tables\n", + "data_model.add(\n", + " getml.data.to_placeholder(\n", + " orders=orders,\n", + " )\n", + ")\n", + "\n", + "# Define relationships using joins\n", + "data_model.weekly_sales_by_store.join(\n", + " right=data_model.orders,\n", + " on=\"store_id\",\n", + " time_stamps=(\"reference_date\", \"ordered_at\"),\n", + " relationship=getml.data.relationship.one_to_many,\n", + " memory=getml.data.time.days(30),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "9fa470a8", + "metadata": {}, + "outputs": [], + "source": [ + "container = getml.data.Container(\n", + " train=weekly_sales_by_store_train,\n", + " validation=weekly_sales_by_store_validation,\n", + " test=weekly_sales_by_store_test,\n", + ")\n", + "\n", + "# Add peripheral tables with aliases matching the data model placeholders\n", + "container.add(\n", + " orders=orders,\n", + ")\n", + "# container.save()\n", + "# getml.project.data_frames.save()" + ] + }, + { + "cell_type": "markdown", + "id": "67dd6b3b", + "metadata": {}, + "source": [ + "## Training" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "a704cacb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Checking data model...\n",
+       "
\n" + ], + "text/plain": [ + "Checking data model\u001b[33m...\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[2K Staging... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", + "\u001b[2K Checking... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", + "\u001b[?25h" + ] + }, + { + "data": { + "text/html": [ + "
The pipeline check generated 0 issues labeled INFO and 2 issues labeled WARNING.\n",
+       "
\n" + ], + "text/plain": [ + "The pipeline check generated \u001b[1;36m0\u001b[0m issues labeled INFO and \u001b[1;36m2\u001b[0m issues labeled WARNING.\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
To see the issues in full, run .check() on the pipeline.\n",
+       "
\n" + ], + "text/plain": [ + "To see the issues in full, run \u001b[1;35m.check\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m on the pipeline.\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[2K Staging... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", + "\u001b[2K FastProp: Trying 50 features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", + "\u001b[2K FastProp: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:02\n", + "\u001b[2K XGBoost: Training as predictor... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:02\n", + "\u001b[?25h" + ] + }, + { + "data": { + "text/html": [ + "
Trained pipeline.\n",
+       "
\n" + ], + "text/plain": [ + "Trained pipeline.\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time taken: 0:00:05.661075.\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "
Pipeline(data_model='weekly_sales_by_store',\n",
+       "         feature_learners=['FastProp'],\n",
+       "         feature_selectors=[],\n",
+       "         include_categorical=False,\n",
+       "         loss_function='SquareLoss',\n",
+       "         peripheral=['orders'],\n",
+       "         predictors=['XGBoostRegressor'],\n",
+       "         preprocessors=[],\n",
+       "         share_selected_features=0.5,\n",
+       "         tags=['container-NQBpU0'])
" + ], + "text/plain": [ + "Pipeline(data_model='weekly_sales_by_store',\n", + " feature_learners=['FastProp'],\n", + " feature_selectors=[],\n", + " include_categorical=False,\n", + " loss_function='SquareLoss',\n", + " peripheral=['orders'],\n", + " predictors=['XGBoostRegressor'],\n", + " preprocessors=[],\n", + " share_selected_features=0.5,\n", + " tags=['container-NQBpU0'])" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fast_prop = getml.feature_learning.FastProp()\n", + "\n", + "predictor = getml.predictors.XGBoostRegressor(\n", + " n_jobs=0,\n", + ")\n", + "\n", + "pipe = getml.Pipeline(\n", + " data_model=data_model,\n", + " feature_learners=[\n", + " fast_prop,\n", + " ],\n", + " predictors=[predictor],\n", + ")\n", + "\n", + "pipe.fit(container.train)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4270ad2d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[2K Staging... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", + "\u001b[2K Preprocessing... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", + "\u001b[2K FastProp: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:03\n", + "\u001b[2K Staging... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", + "\u001b[2K Preprocessing... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", + "\u001b[2K FastProp: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:03\n", + "\u001b[?25h" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
date time set usedtarget mae rmsersquared
02025-12-16 08:08:11trainnext_week_sales249.6961319.02790.9973
12025-12-16 08:08:23testnext_week_sales470.8753613.08910.9862
" + ], + "text/plain": [ + " date time set used target mae rmse rsquared\n", + "0 2025-12-16 08:08:11 train next_week_sales 249.6961 319.0279 0.9973\n", + "1 2025-12-16 08:08:23 test next_week_sales 470.8753 613.0891 0.9862" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# predictions = pipe.predict(container.test)\n", + "\n", + "# # Calculate metrics\n", + "# scores = pipe.score(container.test)\n", + "# scores" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "ef68c68d", + "metadata": {}, + "outputs": [], + "source": [ + "pipe = getml.pipeline.load(\"CzNABb\")" + ] + }, + { + "cell_type": "markdown", + "id": "b0814670", + "metadata": {}, + "source": [ + "## Feature Export" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "410d49db", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[2K Staging... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", + "\u001b[2K Preprocessing... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", + "\u001b[?25h" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name reference_date store_idsnapshot_idnext_week_salesfeature_1_1feature_1_2feature_1_3feature_1_4feature_1_5feature_1_6feature_1_7feature_1_8feature_1_9feature_1_10feature_1_11feature_1_12feature_1_13feature_1_14feature_1_15feature_1_16feature_1_17feature_1_18feature_1_19feature_1_20feature_1_21feature_1_22feature_1_23feature_1_24feature_1_25feature_1_26feature_1_27feature_1_28feature_1_29feature_1_30feature_1_31feature_1_32feature_1_33feature_1_34feature_1_35feature_1_36feature_1_37feature_1_38feature_1_39feature_1_40feature_1_41feature_1_42feature_1_43feature_1_44feature_1_45feature_1_46feature_1_47feature_1_48feature_1_49feature_1_50days_since_opennext_week_orders
role time_stamp join_key join_key target numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical numerical
unittime stamp, comparison only
02022-09-19eafbd328-0434-4f46-9c2d-cc97a46f...778\n", + " 26020.74\n", + " \n", + " 0 \n", + " \n", + " 8544000 \n", + " \n", + " 85 \n", + " \n", + " 1186.2928\n", + " \n", + " 1800 \n", + " \n", + " 600 \n", + " \n", + " 3600 \n", + " \n", + " 9800 \n", + " \n", + " 1032.1334\n", + " \n", + " 600 \n", + " \n", + " 8193 \n", + " \n", + " 1065.3569\n", + " \n", + " 0 \n", + " \n", + " 8885742 \n", + " \n", + " 85 \n", + " \n", + " 1233.7408\n", + " \n", + " 1872 \n", + " \n", + " 624 \n", + " \n", + " 3744 \n", + " \n", + " 10192 \n", + " \n", + " 1073.4165\n", + " \n", + " 624 \n", + " \n", + " 8193 \n", + " \n", + " 1107.9689\n", + " \n", + " 0 \n", + " \n", + " 341742 \n", + " \n", + " 85 \n", + " \n", + " 47.448\n", + " \n", + " 72 \n", + " \n", + " 24 \n", + " \n", + " 144 \n", + " \n", + " 392 \n", + " \n", + " 41.2832\n", + " \n", + " 24 \n", + " \n", + " 8193 \n", + " \n", + " 42.612\n", + " \n", + " 32460 \n", + " \n", + " 10726380900 \n", + " \n", + " 5554 \n", + " \n", + " 709850.1638\n", + " \n", + " 2563200 \n", + " \n", + " 1255740 \n", + " \n", + " 32460 \n", + " \n", + " 2563200 \n", + " \n", + " 1295769.6183\n", + " \n", + " 234000 \n", + " \n", + " 2724 \n", + " \n", + " 0 \n", + " \n", + " 305.7557\n", + " \n", + " 8278 \n", + " \n", + " 1287 \n", + " \n", + " 2389 \n", + "
12023-10-16fc7707c0-2f1e-48d4-b870-7cbeddfc...1115\n", + " 19807.07\n", + " \n", + " 0 \n", + " \n", + " 7243000 \n", + " \n", + " 88 \n", + " \n", + " 1274.3324\n", + " \n", + " 700 \n", + " \n", + " 600 \n", + " \n", + " 1900 \n", + " \n", + " 9800 \n", + " \n", + " 1140.2708\n", + " \n", + " 600 \n", + " \n", + " 6264 \n", + " \n", + " 1163.8545\n", + " \n", + " 0 \n", + " \n", + " 7677154 \n", + " \n", + " 88 \n", + " \n", + " 1350.7264\n", + " \n", + " 742 \n", + " \n", + " 636 \n", + " \n", + " 2013 \n", + " \n", + " 10388 \n", + " \n", + " 1208.62\n", + " \n", + " 636 \n", + " \n", + " 6264 \n", + " \n", + " 1233.6033\n", + " \n", + " 0 \n", + " \n", + " 434154 \n", + " \n", + " 88 \n", + " \n", + " 76.3944\n", + " \n", + " 42 \n", + " \n", + " 36 \n", + " \n", + " 113 \n", + " \n", + " 588 \n", + " \n", + " 68.3492\n", + " \n", + " 36 \n", + " \n", + " 6264 \n", + " \n", + " 69.7488\n", + " \n", + " 32520 \n", + " \n", + " 7991762700 \n", + " \n", + " 4899 \n", + " \n", + " 699016.8555\n", + " \n", + " 2562060 \n", + " \n", + " 1181490 \n", + " \n", + " 32520 \n", + " \n", + " 2562060 \n", + " \n", + " 1258149.0397\n", + " \n", + " 2221200 \n", + " \n", + " 1453 \n", + " \n", + " 0 \n", + " \n", + " 398.29\n", + " \n", + " 6352 \n", + " \n", + " 1871 \n", + " \n", + " 1627 \n", + "
22024-07-15eafbd328-0434-4f46-9c2d-cc97a46f...1348\n", + " 21198.29\n", + " \n", + " 0 \n", + " \n", + " 9457700 \n", + " \n", + " 85 \n", + " \n", + " 1216.411\n", + " \n", + " 1300 \n", + " \n", + " 600 \n", + " \n", + " 600 \n", + " \n", + " 9500 \n", + " \n", + " 1059.0929\n", + " \n", + " 600 \n", + " \n", + " 8845 \n", + " \n", + " 1043.2765\n", + " \n", + " 0 \n", + " \n", + " 9835985 \n", + " \n", + " 85 \n", + " \n", + " 1265.0631\n", + " \n", + " 1352 \n", + " \n", + " 624 \n", + " \n", + " 624 \n", + " \n", + " 9880 \n", + " \n", + " 1101.4541\n", + " \n", + " 624 \n", + " \n", + " 8845 \n", + " \n", + " 1085.0047\n", + " \n", + " 0 \n", + " \n", + " 378285 \n", + " \n", + " 85 \n", + " \n", + " 48.652\n", + " \n", + " 52 \n", + " \n", + " 24 \n", + " \n", + " 24 \n", + " \n", + " 380 \n", + " \n", + " 42.3611\n", + " \n", + " 24 \n", + " \n", + " 8845 \n", + " \n", + " 41.7281\n", + " \n", + " 32700 \n", + " \n", + " 12030424140 \n", + " \n", + " 5990 \n", + " \n", + " 728065.9826\n", + " \n", + " 2563200 \n", + " \n", + " 1423410 \n", + " \n", + " 32700 \n", + " \n", + " 2563200 \n", + " \n", + " 1347191.953\n", + " \n", + " 2394000 \n", + " \n", + " 2940 \n", + " \n", + " 0 \n", + " \n", + " 283.4024\n", + " \n", + " 8930 \n", + " \n", + " 1952 \n", + " \n", + " 2066 \n", + "
32023-08-14eafbd328-0434-4f46-9c2d-cc97a46f...1060\n", + " 20418.27\n", + " \n", + " 0 \n", + " \n", + " 8849900 \n", + " \n", + " 84 \n", + " \n", + " 1228.2472\n", + " \n", + " 1100 \n", + " \n", + " 600 \n", + " \n", + " 8900 \n", + " \n", + " 9700 \n", + " \n", + " 1046.0875\n", + " \n", + " 600 \n", + " \n", + " 8376 \n", + " \n", + " 1061.4084\n", + " \n", + " 0 \n", + " \n", + " 9203877 \n", + " \n", + " 84 \n", + " \n", + " 1277.3731\n", + " \n", + " 1144 \n", + " \n", + " 624 \n", + " \n", + " 9256 \n", + " \n", + " 10088 \n", + " \n", + " 1087.9287\n", + " \n", + " 624 \n", + " \n", + " 8376 \n", + " \n", + " 1103.8616\n", + " \n", + " 0 \n", + " \n", + " 353977 \n", + " \n", + " 84 \n", + " \n", + " 49.126\n", + " \n", + " 44 \n", + " \n", + " 24 \n", + " \n", + " 356 \n", + " \n", + " 388 \n", + " \n", + " 41.8413\n", + " \n", + " 24 \n", + " \n", + " 8376 \n", + " \n", + " 42.4532\n", + " \n", + " 33300 \n", + " \n", + " 10951381140 \n", + " \n", + " 5676 \n", + " \n", + " 712443.903\n", + " \n", + " 2563200 \n", + " \n", + " 1264200 \n", + " \n", + " 33300 \n", + " \n", + " 2563200 \n", + " \n", + " 1294489.4965\n", + " \n", + " 1530000 \n", + " \n", + " 2784 \n", + " \n", + " 0 \n", + " \n", + " 299.0779\n", + " \n", + " 8460 \n", + " \n", + " 1616 \n", + " \n", + " 2054 \n", + "
42020-01-27eafbd328-0434-4f46-9c2d-cc97a46f...119\n", + " 25682.76\n", + " \n", + " 0 \n", + " \n", + " 9917500 \n", + " \n", + " 82 \n", + " \n", + " 1106.4951\n", + " \n", + " 700 \n", + " \n", + " 600 \n", + " \n", + " 8400 \n", + " \n", + " 9500 \n", + " \n", + " 1047.4757\n", + " \n", + " 600 \n", + " \n", + " 9386 \n", + " \n", + " 1064.6682\n", + " \n", + " 0 \n", + " \n", + " 10314184 \n", + " \n", + " 82 \n", + " \n", + " 1150.7521\n", + " \n", + " 728 \n", + " \n", + " 624 \n", + " \n", + " 8736 \n", + " \n", + " 9880 \n", + " \n", + " 1089.373\n", + " \n", + " 624 \n", + " \n", + " 9386 \n", + " \n", + " 1107.2526\n", + " \n", + " 0 \n", + " \n", + " 396684 \n", + " \n", + " 82 \n", + " \n", + " 44.257\n", + " \n", + " 28 \n", + " \n", + " 24 \n", + " \n", + " 336 \n", + " \n", + " 380 \n", + " \n", + " 41.8973\n", + " \n", + " 24 \n", + " \n", + " 9386 \n", + " \n", + " 42.5844\n", + " \n", + " 32580 \n", + " \n", + " 12205065960 \n", + " \n", + " 6631 \n", + " \n", + " 706466.9565\n", + " \n", + " 2560560 \n", + " \n", + " 1251690 \n", + " \n", + " 32580 \n", + " \n", + " 2560560 \n", + " \n", + " 1289085.9696\n", + " \n", + " 1530000 \n", + " \n", + " 2837 \n", + " \n", + " 0 \n", + " \n", + " 267.0307\n", + " \n", + " 9468 \n", + " \n", + " 321 \n", + " \n", + " 2382 \n", + "
.........\n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + " \n", + " ... \n", + "
13742022-08-29abfcc332-1eaf-42f6-b8e4-569bf6a3...758\n", + " 18024.09\n", + " \n", + " 0 \n", + " \n", + " 7586500 \n", + " \n", + " 84 \n", + " \n", + " 1251.6585\n", + " \n", + " 3400 \n", + " \n", + " 600 \n", + " \n", + " 1800 \n", + " \n", + " 9600 \n", + " \n", + " 1075.6416\n", + " \n", + " 600 \n", + " \n", + " 6969 \n", + " \n", + " 1130.5452\n", + " \n", + " 0 \n", + " \n", + " 8057901 \n", + " \n", + " 84 \n", + " \n", + " 1329.8809\n", + " \n", + " 3612 \n", + " \n", + " 637 \n", + " \n", + " 1912 \n", + " \n", + " 10200 \n", + " \n", + " 1142.4785\n", + " \n", + " 637 \n", + " \n", + " 6969 \n", + " \n", + " 1200.8109\n", + " \n", + " 0 \n", + " \n", + " 471401 \n", + " \n", + " 84 \n", + " \n", + " 78.2229\n", + " \n", + " 212 \n", + " \n", + " 37 \n", + " \n", + " 112 \n", + " \n", + " 600 \n", + " \n", + " 66.8369\n", + " \n", + " 37 \n", + " \n", + " 6969 \n", + " \n", + " 70.2656\n", + " \n", + " 32520 \n", + " \n", + " 9147625920 \n", + " \n", + " 5047 \n", + " \n", + " 715254.7768\n", + " \n", + " 2563200 \n", + " \n", + " 1256640 \n", + " \n", + " 32520 \n", + " \n", + " 2563200 \n", + " \n", + " 1296983.6835\n", + " \n", + " 1530000 \n", + " \n", + " 2006 \n", + " \n", + " 0 \n", + " \n", + " 358.8599\n", + " \n", + " 7053 \n", + " \n", + " 853 \n", + " \n", + " 1685 \n", + "
13752024-04-08fc7707c0-2f1e-48d4-b870-7cbeddfc...1265\n", + " 18632.58\n", + " \n", + " 0 \n", + " \n", + " 7778000 \n", + " \n", + " 86 \n", + " \n", + " 1302.6833\n", + " \n", + " 5500 \n", + " \n", + " 600 \n", + " \n", + " 1600 \n", + " \n", + " 9600 \n", + " \n", + " 1163.6744\n", + " \n", + " 600 \n", + " \n", + " 6598 \n", + " \n", + " 1165.2821\n", + " \n", + " 0 \n", + " \n", + " 8244240 \n", + " \n", + " 86 \n", + " \n", + " 1380.7896\n", + " \n", + " 5830 \n", + " \n", + " 636 \n", + " \n", + " 1696 \n", + " \n", + " 10176 \n", + " \n", + " 1233.4291\n", + " \n", + " 636 \n", + " \n", + " 6598 \n", + " \n", + " 1235.1382\n", + " \n", + " 0 \n", + " \n", + " 466240 \n", + " \n", + " 86 \n", + " \n", + " 78.1067\n", + " \n", + " 330 \n", + " \n", + " 36 \n", + " \n", + " 96 \n", + " \n", + " 576 \n", + " \n", + " 69.7546\n", + " \n", + " 36 \n", + " \n", + " 6598 \n", + " \n", + " 69.8561\n", + " \n", + " 32820 \n", + " \n", + " 8674491180 \n", + " \n", + " 5202 \n", + " \n", + " 710175.6533\n", + " \n", + " 2563200 \n", + " \n", + " 1265970 \n", + " \n", + " 32820 \n", + " \n", + " 2563200 \n", + " \n", + " 1297799.3986\n", + " \n", + " 1616400 \n", + " \n", + " 1482 \n", + " \n", + " 0 \n", + " \n", + " 378.6294\n", + " \n", + " 6684 \n", + " \n", + " 2046 \n", + " \n", + " 1589 \n", + "
13762022-03-28abfcc332-1eaf-42f6-b8e4-569bf6a3...626\n", + " 23063.98\n", + " \n", + " 0 \n", + " \n", + " 9907200 \n", + " \n", + " 84 \n", + " \n", + " 1190.0945\n", + " \n", + " 700 \n", + " \n", + " 600 \n", + " \n", + " 700 \n", + " \n", + " 9500 \n", + " \n", + " 1117.3114\n", + " \n", + " 600 \n", + " \n", + " 8783 \n", + " \n", + " 1121.3832\n", + " \n", + " 0 \n", + " \n", + " 10522985 \n", + " \n", + " 84 \n", + " \n", + " 1264.4637\n", + " \n", + " 743 \n", + " \n", + " 637 \n", + " \n", + " 743 \n", + " \n", + " 10093 \n", + " \n", + " 1186.7582\n", + " \n", + " 637 \n", + " \n", + " 8783 \n", + " \n", + " 1191.0778\n", + " \n", + " 0 \n", + " \n", + " 615785 \n", + " \n", + " 84 \n", + " \n", + " 74.3697\n", + " \n", + " 43 \n", + " \n", + " 37 \n", + " \n", + " 43 \n", + " \n", + " 593 \n", + " \n", + " 69.4468\n", + " \n", + " 37 \n", + " \n", + " 8783 \n", + " \n", + " 69.6946\n", + " \n", + " 32580 \n", + " \n", + " 11513869140 \n", + " \n", + " 6426 \n", + " \n", + " 713163.0356\n", + " \n", + " 2563200 \n", + " \n", + " 1329660 \n", + " \n", + " 32580 \n", + " \n", + " 2563200 \n", + " \n", + " 1298507.8538\n", + " \n", + " 234000 \n", + " \n", + " 2441 \n", + " \n", + " 0 \n", + " \n", + " 285.4297\n", + " \n", + " 8867 \n", + " \n", + " 699 \n", + " \n", + " 2093 \n", + "
13772022-08-01abfcc332-1eaf-42f6-b8e4-569bf6a3...734\n", + " 18610.37\n", + " \n", + " 0 \n", + " \n", + " 7528900 \n", + " \n", + " 85 \n", + " \n", + " 1258.1564\n", + " \n", + " 1500 \n", + " \n", + " 600 \n", + " \n", + " 1100 \n", + " \n", + " 9800 \n", + " \n", + " 1077.8669\n", + " \n", + " 600 \n", + " \n", + " 6900 \n", + " \n", + " 1103.9622\n", + " \n", + " 0 \n", + " \n", + " 7996761 \n", + " \n", + " 85 \n", + " \n", + " 1336.7815\n", + " \n", + " 1593 \n", + " \n", + " 637 \n", + " \n", + " 1168 \n", + " \n", + " 10412 \n", + " \n", + " 1144.8477\n", + " \n", + " 637 \n", + " \n", + " 6900 \n", + " \n", + " 1172.5738\n", + " \n", + " 0 \n", + " \n", + " 467861 \n", + " \n", + " 85 \n", + " \n", + " 78.6255\n", + " \n", + " 93 \n", + " \n", + " 37 \n", + " \n", + " 68 \n", + " \n", + " 612 \n", + " \n", + " 66.9808\n", + " \n", + " 37 \n", + " \n", + " 6900 \n", + " \n", + " 68.6116\n", + " \n", + " 32640 \n", + " \n", + " 9047799420 \n", + " \n", + " 4962 \n", + " \n", + " 714708.3595\n", + " \n", + " 2563200 \n", + " \n", + " 1254180 \n", + " \n", + " 32640 \n", + " \n", + " 2563200 \n", + " \n", + " 1295318.4567\n", + " \n", + " 922020 \n", + " \n", + " 2023 \n", + " \n", + " 0 \n", + " \n", + " 362.3368\n", + " \n", + " 6985 \n", + " \n", + " 825 \n", + " \n", + " 1704 \n", + "
13782022-11-28abfcc332-1eaf-42f6-b8e4-569bf6a3...836\n", + " 25652.78\n", + " \n", + " 0 \n", + " \n", + " 10403700 \n", + " \n", + " 87 \n", + " \n", + " 1186.0723\n", + " \n", + " 1800 \n", + " \n", + " 600 \n", + " \n", + " 2000 \n", + " \n", + " 9600 \n", + " \n", + " 1125.2109\n", + " \n", + " 600 \n", + " \n", + " 9159 \n", + " \n", + " 1142.3112\n", + " \n", + " 0 \n", + " \n", + " 11050351 \n", + " \n", + " 87 \n", + " \n", + " 1260.1947\n", + " \n", + " 1912 \n", + " \n", + " 637 \n", + " \n", + " 2125 \n", + " \n", + " 10200 \n", + " \n", + " 1195.1494\n", + " \n", + " 637 \n", + " \n", + " 9159 \n", + " \n", + " 1213.315\n", + " \n", + " 0 \n", + " \n", + " 646651 \n", + " \n", + " 87 \n", + " \n", + " 74.1228\n", + " \n", + " 112 \n", + " \n", + " 37 \n", + " \n", + " 125 \n", + " \n", + " 600 \n", + " \n", + " 69.9385\n", + " \n", + " 37 \n", + " \n", + " 9159 \n", + " \n", + " 71.0038\n", + " \n", + " 32580 \n", + " \n", + " 11969343420 \n", + " \n", + " 6666 \n", + " \n", + " 717253.3896\n", + " \n", + " 2563200 \n", + " \n", + " 1258920 \n", + " \n", + " 32580 \n", + " \n", + " 2563200 \n", + " \n", + " 1294542.8748\n", + " \n", + " 1184400 \n", + " \n", + " 2580 \n", + " \n", + " 0 \n", + " \n", + " 273.7285\n", + " \n", + " 9246 \n", + " \n", + " 944 \n", + " \n", + " 2221 \n", + "
\n", + "\n", + "

\n", + " 1379 rows x 56 columns
\n", + " memory usage: 0.61 MB
\n", + " name: features
\n", + " type: getml.DataFrame
\n", + " \n", + "

\n" + ], + "text/plain": [ + "name reference_date store_id snapshot_id next_week_sales ... feature_1_48\n", + "role time_stamp join_key join_key target ... numerical\n", + "unit time stamp, comparison only ... \n", + " 0 2022-09-19 eafbd328-0434-4f46-9c2d-cc97a46f... 778 26020.74 ... 0\n", + " 1 2023-10-16 fc7707c0-2f1e-48d4-b870-7cbeddfc... 1115 19807.07 ... 0\n", + " 2 2024-07-15 eafbd328-0434-4f46-9c2d-cc97a46f... 1348 21198.29 ... 0\n", + " 3 2023-08-14 eafbd328-0434-4f46-9c2d-cc97a46f... 1060 20418.27 ... 0\n", + " 4 2020-01-27 eafbd328-0434-4f46-9c2d-cc97a46f... 119 25682.76 ... 0\n", + " ... ... ... ... ...\n", + "1374 2022-08-29 abfcc332-1eaf-42f6-b8e4-569bf6a3... 758 18024.09 ... 0\n", + "1375 2024-04-08 fc7707c0-2f1e-48d4-b870-7cbeddfc... 1265 18632.58 ... 0\n", + "1376 2022-03-28 abfcc332-1eaf-42f6-b8e4-569bf6a3... 626 23063.98 ... 0\n", + "1377 2022-08-01 abfcc332-1eaf-42f6-b8e4-569bf6a3... 734 18610.37 ... 0\n", + "1378 2022-11-28 abfcc332-1eaf-42f6-b8e4-569bf6a3... 836 25652.78 ... 0\n", + "\n", + "name feature_1_49 feature_1_50 days_since_open next_week_orders\n", + "role numerical numerical numerical numerical\n", + "unit \n", + " 0 305.7557 8278 1287 2389\n", + " 1 398.29 6352 1871 1627\n", + " 2 283.4024 8930 1952 2066\n", + " 3 299.0779 8460 1616 2054\n", + " 4 267.0307 9468 321 2382\n", + " ... ... ... ...\n", + "1374 358.8599 7053 853 1685\n", + "1375 378.6294 6684 2046 1589\n", + "1376 285.4297 8867 699 2093\n", + "1377 362.3368 6985 825 1704\n", + "1378 273.7285 9246 944 2221\n", + "\n", + "\n", + "1379 rows x 56 columns\n", + "memory usage: 0.61 MB\n", + "type: getml.DataFrame" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Transform features using getML pipeline\n", + "features_df = pipe.transform(\n", + " population_table=weekly_sales_by_store,\n", + " peripheral_tables=[orders],\n", + " df_name=\"features\",\n", + ")\n", + "\n", + "\n", + "features_spark = spark.createDataFrame(features_df.to_arrow())\n", + "\n", + "features_df" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "0e25b455", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "DataFrame[]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "spark.sql(\"DROP TABLE IF EXISTS workspace.getml_fs.getml_features\")\n", + "\n", + "features_spark.write.format(\"delta\").mode(\"overwrite\").option(\n", + " \"overwriteSchema\", \"true\"\n", + ").saveAsTable(\"workspace.getml_fs.getml_features\")\n", + "\n", + "spark.sql(\"\"\"\n", + " ALTER TABLE workspace.getml_fs.getml_features\n", + " ALTER COLUMN snapshot_id SET NOT NULL\n", + "\"\"\")\n", + "\n", + "spark.sql(\"\"\"\n", + " ALTER TABLE workspace.getml_fs.getml_features\n", + " ADD CONSTRAINT getml_features_pk PRIMARY KEY(snapshot_id)\n", + "\"\"\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "e08b11a7", + "metadata": {}, + "outputs": [], + "source": [ + "for feature in pipe.features:\n", + " spark.sql(\n", + " f\"ALTER TABLE workspace.getml_fs.getml_features CHANGE COLUMN {feature.name} COMMENT '{feature.sql}'\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9e07629d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Table schema:\n", + "+----------------+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "|col_name |data_type|comment |\n", + "+----------------+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "|store_id |string |NULL |\n", + "|snapshot_id |string |NULL |\n", + "|feature_1_1 |double |DROP TABLE IF EXISTS \"FEATURE_1_1\";\\n\\nCREATE TABLE \"FEATURE_1_1\" AS\\nSELECT MIN( t2.\"subtotal\" ) AS \"feature_1_1\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_2 |double |DROP TABLE IF EXISTS \"FEATURE_1_2\";\\n\\nCREATE TABLE \"FEATURE_1_2\" AS\\nSELECT SUM( t2.\"subtotal\" ) AS \"feature_1_2\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_3 |double |DROP TABLE IF EXISTS \"FEATURE_1_3\";\\n\\nCREATE TABLE \"FEATURE_1_3\" AS\\nSELECT COUNT( DISTINCT t2.\"subtotal\" ) AS \"feature_1_3\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_4 |double |DROP TABLE IF EXISTS \"FEATURE_1_4\";\\n\\nCREATE TABLE \"FEATURE_1_4\" AS\\nSELECT STDDEV( t2.\"subtotal\" ) AS \"feature_1_4\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_5 |double |DROP TABLE IF EXISTS \"FEATURE_1_5\";\\n\\nCREATE TABLE \"FEATURE_1_5\" AS\\nSELECT FIRST( t2.\"subtotal\", t2.\"ordered_at\" ) AS \"feature_1_5\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_6 |double |DROP TABLE IF EXISTS \"FEATURE_1_6\";\\n\\nCREATE TABLE \"FEATURE_1_6\" AS\\nSELECT MEDIAN( t2.\"subtotal\" ) AS \"feature_1_6\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_7 |double |DROP TABLE IF EXISTS \"FEATURE_1_7\";\\n\\nCREATE TABLE \"FEATURE_1_7\" AS\\nSELECT LAST( t2.\"subtotal\", t2.\"ordered_at\" ) AS \"feature_1_7\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_8 |double |DROP TABLE IF EXISTS \"FEATURE_1_8\";\\n\\nCREATE TABLE \"FEATURE_1_8\" AS\\nSELECT MAX( t2.\"subtotal\" ) AS \"feature_1_8\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_9 |double |DROP TABLE IF EXISTS \"FEATURE_1_9\";\\n\\nCREATE TABLE \"FEATURE_1_9\" AS\\nSELECT AVG( t2.\"subtotal\" ) AS \"feature_1_9\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_10 |double |DROP TABLE IF EXISTS \"FEATURE_1_10\";\\n\\nCREATE TABLE \"FEATURE_1_10\" AS\\nSELECT MODE( t2.\"subtotal\" ) AS \"feature_1_10\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_11 |double |DROP TABLE IF EXISTS \"FEATURE_1_11\";\\n\\nCREATE TABLE \"FEATURE_1_11\" AS\\nSELECT COUNT( t2.\"subtotal\" ) - COUNT( DISTINCT t2.\"subtotal\" ) AS \"feature_1_11\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_12 |double |DROP TABLE IF EXISTS \"FEATURE_1_12\";\\n\\nCREATE TABLE \"FEATURE_1_12\" AS\\nSELECT TREND( t2.\"subtotal\", t1.\"reference_date\" - t2.\"ordered_at\" ) AS \"feature_1_12\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_13 |double |DROP TABLE IF EXISTS \"FEATURE_1_13\";\\n\\nCREATE TABLE \"FEATURE_1_13\" AS\\nSELECT MIN( t2.\"order_total\" ) AS \"feature_1_13\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_14 |double |DROP TABLE IF EXISTS \"FEATURE_1_14\";\\n\\nCREATE TABLE \"FEATURE_1_14\" AS\\nSELECT SUM( t2.\"order_total\" ) AS \"feature_1_14\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_15 |double |DROP TABLE IF EXISTS \"FEATURE_1_15\";\\n\\nCREATE TABLE \"FEATURE_1_15\" AS\\nSELECT COUNT( DISTINCT t2.\"order_total\" ) AS \"feature_1_15\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_16 |double |DROP TABLE IF EXISTS \"FEATURE_1_16\";\\n\\nCREATE TABLE \"FEATURE_1_16\" AS\\nSELECT STDDEV( t2.\"order_total\" ) AS \"feature_1_16\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_17 |double |DROP TABLE IF EXISTS \"FEATURE_1_17\";\\n\\nCREATE TABLE \"FEATURE_1_17\" AS\\nSELECT FIRST( t2.\"order_total\", t2.\"ordered_at\" ) AS \"feature_1_17\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_18 |double |DROP TABLE IF EXISTS \"FEATURE_1_18\";\\n\\nCREATE TABLE \"FEATURE_1_18\" AS\\nSELECT MEDIAN( t2.\"order_total\" ) AS \"feature_1_18\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_19 |double |DROP TABLE IF EXISTS \"FEATURE_1_19\";\\n\\nCREATE TABLE \"FEATURE_1_19\" AS\\nSELECT LAST( t2.\"order_total\", t2.\"ordered_at\" ) AS \"feature_1_19\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_20 |double |DROP TABLE IF EXISTS \"FEATURE_1_20\";\\n\\nCREATE TABLE \"FEATURE_1_20\" AS\\nSELECT MAX( t2.\"order_total\" ) AS \"feature_1_20\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_21 |double |DROP TABLE IF EXISTS \"FEATURE_1_21\";\\n\\nCREATE TABLE \"FEATURE_1_21\" AS\\nSELECT AVG( t2.\"order_total\" ) AS \"feature_1_21\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_22 |double |DROP TABLE IF EXISTS \"FEATURE_1_22\";\\n\\nCREATE TABLE \"FEATURE_1_22\" AS\\nSELECT MODE( t2.\"order_total\" ) AS \"feature_1_22\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_23 |double |DROP TABLE IF EXISTS \"FEATURE_1_23\";\\n\\nCREATE TABLE \"FEATURE_1_23\" AS\\nSELECT COUNT( t2.\"order_total\" ) - COUNT( DISTINCT t2.\"order_total\" ) AS \"feature_1_23\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_24 |double |DROP TABLE IF EXISTS \"FEATURE_1_24\";\\n\\nCREATE TABLE \"FEATURE_1_24\" AS\\nSELECT TREND( t2.\"order_total\", t1.\"reference_date\" - t2.\"ordered_at\" ) AS \"feature_1_24\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_25 |double |DROP TABLE IF EXISTS \"FEATURE_1_25\";\\n\\nCREATE TABLE \"FEATURE_1_25\" AS\\nSELECT MIN( t2.\"tax_paid\" ) AS \"feature_1_25\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_26 |double |DROP TABLE IF EXISTS \"FEATURE_1_26\";\\n\\nCREATE TABLE \"FEATURE_1_26\" AS\\nSELECT SUM( t2.\"tax_paid\" ) AS \"feature_1_26\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_27 |double |DROP TABLE IF EXISTS \"FEATURE_1_27\";\\n\\nCREATE TABLE \"FEATURE_1_27\" AS\\nSELECT COUNT( DISTINCT t2.\"tax_paid\" ) AS \"feature_1_27\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_28 |double |DROP TABLE IF EXISTS \"FEATURE_1_28\";\\n\\nCREATE TABLE \"FEATURE_1_28\" AS\\nSELECT STDDEV( t2.\"tax_paid\" ) AS \"feature_1_28\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_29 |double |DROP TABLE IF EXISTS \"FEATURE_1_29\";\\n\\nCREATE TABLE \"FEATURE_1_29\" AS\\nSELECT FIRST( t2.\"tax_paid\", t2.\"ordered_at\" ) AS \"feature_1_29\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_30 |double |DROP TABLE IF EXISTS \"FEATURE_1_30\";\\n\\nCREATE TABLE \"FEATURE_1_30\" AS\\nSELECT MEDIAN( t2.\"tax_paid\" ) AS \"feature_1_30\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_31 |double |DROP TABLE IF EXISTS \"FEATURE_1_31\";\\n\\nCREATE TABLE \"FEATURE_1_31\" AS\\nSELECT LAST( t2.\"tax_paid\", t2.\"ordered_at\" ) AS \"feature_1_31\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_32 |double |DROP TABLE IF EXISTS \"FEATURE_1_32\";\\n\\nCREATE TABLE \"FEATURE_1_32\" AS\\nSELECT MAX( t2.\"tax_paid\" ) AS \"feature_1_32\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_33 |double |DROP TABLE IF EXISTS \"FEATURE_1_33\";\\n\\nCREATE TABLE \"FEATURE_1_33\" AS\\nSELECT AVG( t2.\"tax_paid\" ) AS \"feature_1_33\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_34 |double |DROP TABLE IF EXISTS \"FEATURE_1_34\";\\n\\nCREATE TABLE \"FEATURE_1_34\" AS\\nSELECT MODE( t2.\"tax_paid\" ) AS \"feature_1_34\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_35 |double |DROP TABLE IF EXISTS \"FEATURE_1_35\";\\n\\nCREATE TABLE \"FEATURE_1_35\" AS\\nSELECT COUNT( t2.\"tax_paid\" ) - COUNT( DISTINCT t2.\"tax_paid\" ) AS \"feature_1_35\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_36 |double |DROP TABLE IF EXISTS \"FEATURE_1_36\";\\n\\nCREATE TABLE \"FEATURE_1_36\" AS\\nSELECT TREND( t2.\"tax_paid\", t1.\"reference_date\" - t2.\"ordered_at\" ) AS \"feature_1_36\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_37 |double |DROP TABLE IF EXISTS \"FEATURE_1_37\";\\n\\nCREATE TABLE \"FEATURE_1_37\" AS\\nSELECT MIN( t1.\"reference_date\" - t2.\"ordered_at\" ) AS \"feature_1_37\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_38 |double |DROP TABLE IF EXISTS \"FEATURE_1_38\";\\n\\nCREATE TABLE \"FEATURE_1_38\" AS\\nSELECT SUM( t1.\"reference_date\" - t2.\"ordered_at\" ) AS \"feature_1_38\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_39 |double |DROP TABLE IF EXISTS \"FEATURE_1_39\";\\n\\nCREATE TABLE \"FEATURE_1_39\" AS\\nSELECT COUNT( DISTINCT t1.\"reference_date\" - t2.\"ordered_at\" ) AS \"feature_1_39\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_40 |double |DROP TABLE IF EXISTS \"FEATURE_1_40\";\\n\\nCREATE TABLE \"FEATURE_1_40\" AS\\nSELECT STDDEV( t1.\"reference_date\" - t2.\"ordered_at\" ) AS \"feature_1_40\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_41 |double |DROP TABLE IF EXISTS \"FEATURE_1_41\";\\n\\nCREATE TABLE \"FEATURE_1_41\" AS\\nSELECT FIRST( t1.\"reference_date\" - t2.\"ordered_at\", t2.\"ordered_at\" ) AS \"feature_1_41\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_42 |double |DROP TABLE IF EXISTS \"FEATURE_1_42\";\\n\\nCREATE TABLE \"FEATURE_1_42\" AS\\nSELECT MEDIAN( t1.\"reference_date\" - t2.\"ordered_at\" ) AS \"feature_1_42\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_43 |double |DROP TABLE IF EXISTS \"FEATURE_1_43\";\\n\\nCREATE TABLE \"FEATURE_1_43\" AS\\nSELECT LAST( t1.\"reference_date\" - t2.\"ordered_at\", t2.\"ordered_at\" ) AS \"feature_1_43\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_44 |double |DROP TABLE IF EXISTS \"FEATURE_1_44\";\\n\\nCREATE TABLE \"FEATURE_1_44\" AS\\nSELECT MAX( t1.\"reference_date\" - t2.\"ordered_at\" ) AS \"feature_1_44\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_45 |double |DROP TABLE IF EXISTS \"FEATURE_1_45\";\\n\\nCREATE TABLE \"FEATURE_1_45\" AS\\nSELECT AVG( t1.\"reference_date\" - t2.\"ordered_at\" ) AS \"feature_1_45\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_46 |double |DROP TABLE IF EXISTS \"FEATURE_1_46\";\\n\\nCREATE TABLE \"FEATURE_1_46\" AS\\nSELECT MODE( t1.\"reference_date\" - t2.\"ordered_at\" ) AS \"feature_1_46\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_47 |double |DROP TABLE IF EXISTS \"FEATURE_1_47\";\\n\\nCREATE TABLE \"FEATURE_1_47\" AS\\nSELECT COUNT( t1.\"reference_date\" - t2.\"ordered_at\" ) - COUNT( DISTINCT t1.\"reference_date\" - t2.\"ordered_at\" ) AS \"feature_1_47\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_48 |double |DROP TABLE IF EXISTS \"FEATURE_1_48\";\\n\\nCREATE TABLE \"FEATURE_1_48\" AS\\nSELECT TREND( t1.\"reference_date\" - t2.\"ordered_at\", t1.\"reference_date\" - t2.\"ordered_at\" ) AS \"feature_1_48\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|feature_1_49 |double |DROP TABLE IF EXISTS \"FEATURE_1_49\";\\n\\nCREATE TABLE \"FEATURE_1_49\" AS\\nSELECT CASE WHEN COUNT( * ) > 1 THEN ( MAX( t2.\"ordered_at\" ) - MIN ( t2.\"ordered_at\" ) ) / ( COUNT( * ) - 1 ) ELSE 0 END AS \"feature_1_49\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid;|\n", + "|feature_1_50 |double |DROP TABLE IF EXISTS \"FEATURE_1_50\";\\n\\nCREATE TABLE \"FEATURE_1_50\" AS\\nSELECT COUNT( * ) AS \"feature_1_50\",\\n t1.rowid AS rownum\\nFROM \"WEEKLY_SALES_BY_STORE__STAGING_TABLE_1\" t1\\nINNER JOIN \"ORDERS__STAGING_TABLE_2\" t2\\nON t1.\"store_id\" = t2.\"store_id\"\\nWHERE t2.\"ordered_at\" <= t1.\"reference_date\"\\nAND ( t2.\"ordered_at__30_000000_days\" > t1.\"reference_date\" OR t2.\"ordered_at__30_000000_days\" IS NULL )\\nGROUP BY t1.rowid; |\n", + "|days_since_open |double | |\n", + "|next_week_orders|double | |\n", + "|next_week_sales |double |NULL |\n", + "|reference_date |timestamp|NULL |\n", + "+----------------+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "\n" + ] + } + ], + "source": [ + "# Verify the Feature Table was created\n", + "print(\"Table schema:\")\n", + "spark.sql(\"DESCRIBE TABLE workspace.getml_fs.getml_features\").show(100, truncate=False)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "getml-demo", + "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.12.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/integration/databricks/notebooks/databricks_feature_store.py b/integration/databricks/notebooks/databricks_feature_store.py new file mode 100644 index 0000000..0fb6e45 --- /dev/null +++ b/integration/databricks/notebooks/databricks_feature_store.py @@ -0,0 +1,229 @@ +# --- +# jupyter: +# jupytext: +# text_representation: +# extension: .py +# format_name: percent +# format_version: '1.3' +# jupytext_version: 1.18.1 +# kernelspec: +# display_name: getml-demo +# language: python +# name: python3 +# --- + +# %% [markdown] +# ## Prerequisites +# +# Before running this notebook: +# +# 1. Authenticate with Databricks: +# ```bash +# databricks auth login +# ``` +# +# 2. Prepare the data: +# ```bash +# uv run --group databricks python -m integration.databricks.prepare_jaffle_shop_data_for_databricks +# ``` +# +# This will load raw data from GCS and create the weekly sales forecasting population table. + +# %% [markdown] +# ## Setup and Data Loading + +# %% +import getml +from databricks.connect import DatabricksSession + +getml.set_project("databricks_feature_store") + +# %% +spark = DatabricksSession.builder.serverless().getOrCreate() + +# %% +weekly_sales_by_store_spark = spark.table( + "workspace.prepared.weekly_sales_by_store_with_target" +) + +weekly_sales_by_store = getml.DataFrame.from_arrow( + weekly_sales_by_store_spark.toArrow(), name="weekly_sales_by_store" +) + +# # Load orders table +orders_spark = spark.table("workspace.raw.raw_orders") +orders = getml.DataFrame.from_arrow(orders_spark.toArrow(), name="orders") + +# %% [markdown] +# ## getML Annotations + +# %% +weekly_sales_by_store.set_role( + cols=["store_id", "snapshot_id"], role=getml.data.roles.join_key +) +weekly_sales_by_store.set_role(cols="reference_date", role=getml.data.roles.time_stamp) +weekly_sales_by_store.set_role(cols="next_week_sales", role=getml.data.roles.target) +weekly_sales_by_store.set_role( + cols=[ + "store_name", + "year", + "month", + "week_number", + "is_full_week_after_opening", + "has_order_activity", + "has_min_history", + ], + role=getml.data.roles.categorical, +) +weekly_sales_by_store.set_role( + cols=["days_since_open", "next_week_orders"], role=getml.data.roles.numerical +) +weekly_sales_by_store + + +# %% +orders.set_role(cols=["store_id", "id", "customer"], role=getml.data.roles.join_key) +orders.set_role( + cols="ordered_at", + role=getml.data.roles.time_stamp, + time_formats=["%Y-%m-%dT%H:%M:%S"], +) +orders.set_role( + cols=["subtotal", "order_total", "tax_paid"], role=getml.data.roles.numerical +) +orders + +# %% [markdown] +# ## getML Data Model + +# %% +validation_begin = getml.data.time.datetime(2023, 1, 1) +test_begin = getml.data.time.datetime(2024, 1, 1) + +split = getml.data.split.time( + population=weekly_sales_by_store, + time_stamp="reference_date", + validation=validation_begin, + test=test_begin, +) + +# Filter dataframes using the split column +weekly_sales_by_store_train = weekly_sales_by_store[split == "train"] +weekly_sales_by_store_validation = weekly_sales_by_store[split == "validation"] +weekly_sales_by_store_test = weekly_sales_by_store[split == "test"] + +print( + f"Training set size: {len(weekly_sales_by_store_train)}" + f"\nValidation set size: {len(weekly_sales_by_store_validation)}" + f"\nTest set size: {len(weekly_sales_by_store_test)}" +) + +# %% +data_model = getml.data.DataModel( + population=weekly_sales_by_store_train.to_placeholder("weekly_sales_by_store") +) + +# Add all peripheral tables +data_model.add( + getml.data.to_placeholder( + orders=orders, + ) +) + +# Define relationships using joins +data_model.weekly_sales_by_store.join( + right=data_model.orders, + on="store_id", + time_stamps=("reference_date", "ordered_at"), + relationship=getml.data.relationship.one_to_many, + memory=getml.data.time.days(30), +) + +# %% +container = getml.data.Container( + train=weekly_sales_by_store_train, + validation=weekly_sales_by_store_validation, + test=weekly_sales_by_store_test, +) + +# Add peripheral tables with aliases matching the data model placeholders +container.add( + orders=orders, +) +# container.save() +# getml.project.data_frames.save() + +# %% [markdown] +# ## Training + +# %% +fast_prop = getml.feature_learning.FastProp() + +predictor = getml.predictors.XGBoostRegressor( + n_jobs=0, +) + +pipe = getml.Pipeline( + data_model=data_model, + feature_learners=[ + fast_prop, + ], + predictors=[predictor], +) + +pipe.fit(container.train) + +# %% +# predictions = pipe.predict(container.test) + +# # Calculate metrics +# scores = pipe.score(container.test) +# scores + +# %% +pipe = getml.pipeline.load("CzNABb") + +# %% [markdown] +# ## Feature Export + +# %% +# Transform features using getML pipeline +features_df = pipe.transform( + population_table=weekly_sales_by_store, + peripheral_tables=[orders], + df_name="features", +) + + +features_spark = spark.createDataFrame(features_df.to_arrow()) + +features_df + +# %% +spark.sql("DROP TABLE IF EXISTS workspace.getml_fs.getml_features") + +features_spark.write.format("delta").mode("overwrite").option( + "overwriteSchema", "true" +).saveAsTable("workspace.getml_fs.getml_features") + +spark.sql(""" + ALTER TABLE workspace.getml_fs.getml_features + ALTER COLUMN snapshot_id SET NOT NULL +""") + +spark.sql(""" + ALTER TABLE workspace.getml_fs.getml_features + ADD CONSTRAINT getml_features_pk PRIMARY KEY(snapshot_id) +""") + +# %% +for feature in pipe.features: + spark.sql( + f"ALTER TABLE workspace.getml_fs.getml_features CHANGE COLUMN {feature.name} COMMENT '{feature.sql}'" + ) + +# %% +# Verify the Feature Table was created +print("Table schema:") +spark.sql("DESCRIBE TABLE workspace.getml_fs.getml_features").show(100, truncate=False) + diff --git a/pyproject.toml b/pyproject.toml index a124d3c..e05bfc6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,4 +27,13 @@ databricks = [ "requests==2.32.5", "pydantic==2.12.5", "sqlglot==28.4.1", -] \ No newline at end of file +] + +dev = [ + "basedpyright>=1.36.1", + "jupytext>=1.18.1", + "ruff>=0.14.9", +] + +[tool.basedpyright] +typeCheckingMode = "standard" \ No newline at end of file diff --git a/uv.lock b/uv.lock index e4b42ea..4beda41 100644 --- a/uv.lock +++ b/uv.lock @@ -115,6 +115,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, ] +[[package]] +name = "basedpyright" +version = "1.36.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nodejs-wheel-binaries" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/32/29/d42d543a1637e692ac557bfc6d6fcf50e9a7061c1cb4da403378d6a70453/basedpyright-1.36.1.tar.gz", hash = "sha256:20c9a24e2a4c95d5b6d46c78a6b6c7e3dc7cbba227125256431d47c595b15fd4", size = 22834851, upload-time = "2025-12-11T14:55:47.463Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/7f/f0133313bffa303d32aa74468981eb6b2da7fadda6247c9aa0aeab8391b1/basedpyright-1.36.1-py3-none-any.whl", hash = "sha256:3d738484fe9681cdfe35dd98261f30a9a7aec64208bc91f8773a9aaa9b89dd16", size = 11881725, upload-time = "2025-12-11T14:55:43.805Z" }, +] + [[package]] name = "beautifulsoup4" version = "4.14.3" @@ -468,6 +480,11 @@ databricks = [ { name = "requests" }, { name = "sqlglot" }, ] +dev = [ + { name = "basedpyright" }, + { name = "jupytext" }, + { name = "ruff" }, +] spark = [ { name = "pyspark" }, ] @@ -492,6 +509,11 @@ databricks = [ { name = "requests", specifier = "==2.32.5" }, { name = "sqlglot", specifier = "==28.4.1" }, ] +dev = [ + { name = "basedpyright", specifier = ">=1.36.1" }, + { name = "jupytext", specifier = ">=1.18.1" }, + { name = "ruff", specifier = ">=0.14.9" }, +] spark = [{ name = "pyspark", specifier = "==4.0.1" }] [[package]] @@ -959,6 +981,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8", size = 914926, upload-time = "2025-11-01T21:11:28.008Z" }, ] +[[package]] +name = "jupytext" +version = "1.18.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "mdit-py-plugins" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/5d/82a614a49493fa84b2019a3e03020a8b9927208ae177b81f7e0b30330c82/jupytext-1.18.1.tar.gz", hash = "sha256:5c0962ca8d222db45cbe1848b4805dbbe3ddb957603fc96651b6cd7fd403fafb", size = 4270997, upload-time = "2025-10-19T15:06:30.992Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/0d/2d240e7098e0cafba4d25e9530e7596b1bb1bd4476e41b10346bcaaa36d6/jupytext-1.18.1-py3-none-any.whl", hash = "sha256:24f999400726a1c658beae55e15fdd2a6255ab1a418697864cd779874e6011ab", size = 167143, upload-time = "2025-10-19T15:06:28.975Z" }, +] + [[package]] name = "kiwisolver" version = "1.4.9" @@ -1070,6 +1108,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, ] +[[package]] +name = "mdit-py-plugins" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload-time = "2025-08-11T07:25:47.597Z" }, +] + [[package]] name = "mdurl" version = "0.1.2" @@ -1152,6 +1202,22 @@ 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 = "nodejs-wheel-binaries" +version = "24.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/35/d806c2ca66072e36dc340ccdbeb2af7e4f1b5bcc33f1481f00ceed476708/nodejs_wheel_binaries-24.12.0.tar.gz", hash = "sha256:f1b50aa25375e264697dec04b232474906b997c2630c8f499f4caf3692938435", size = 8058, upload-time = "2025-12-11T21:12:26.856Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/3b/9d6f044319cd5b1e98f07c41e2465b58cadc1c9c04a74c891578f3be6cb5/nodejs_wheel_binaries-24.12.0-py2.py3-none-macosx_13_0_arm64.whl", hash = "sha256:7564ddea0a87eff34e9b3ef71764cc2a476a8f09a5cccfddc4691148b0a47338", size = 55125859, upload-time = "2025-12-11T21:11:58.132Z" }, + { url = "https://files.pythonhosted.org/packages/48/a5/f5722bf15c014e2f476d7c76bce3d55c341d19122d8a5d86454db32a61a4/nodejs_wheel_binaries-24.12.0-py2.py3-none-macosx_13_0_x86_64.whl", hash = "sha256:8ff929c4669e64613ceb07f5bbd758d528c3563820c75d5de3249eb452c0c0ab", size = 55309035, upload-time = "2025-12-11T21:12:01.754Z" }, + { url = "https://files.pythonhosted.org/packages/a9/61/68d39a6f1b5df67805969fd2829ba7e80696c9af19537856ec912050a2be/nodejs_wheel_binaries-24.12.0-py2.py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:6ebacefa8891bc456ad3655e6bce0af7e20ba08662f79d9109986faeb703fd6f", size = 59661017, upload-time = "2025-12-11T21:12:05.268Z" }, + { url = "https://files.pythonhosted.org/packages/16/a1/31aad16f55a5e44ca7ea62d1367fc69f4b6e1dba67f58a0a41d0ed854540/nodejs_wheel_binaries-24.12.0-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:3292649a03682ccbfa47f7b04d3e4240e8c46ef04dc941b708f20e4e6a764f75", size = 60159770, upload-time = "2025-12-11T21:12:08.696Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5e/b7c569aa1862690ca4d4daf3a64cafa1ea6ce667a9e3ae3918c56e127d9b/nodejs_wheel_binaries-24.12.0-py2.py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7fb83df312955ea355ba7f8cbd7055c477249a131d3cb43b60e4aeb8f8c730b1", size = 61653561, upload-time = "2025-12-11T21:12:12.575Z" }, + { url = "https://files.pythonhosted.org/packages/71/87/567f58d7ba69ff0208be849b37be0f2c2e99c69e49334edd45ff44f00043/nodejs_wheel_binaries-24.12.0-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:2473c819448fedd7b036dde236b09f3c8bbf39fbbd0c1068790a0498800f498b", size = 62238331, upload-time = "2025-12-11T21:12:16.143Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9d/c6492188ce8de90093c6755a4a63bb6b2b4efb17094cb4f9a9a49c73ed3b/nodejs_wheel_binaries-24.12.0-py2.py3-none-win_amd64.whl", hash = "sha256:2090d59f75a68079fabc9b86b14df8238b9aecb9577966dc142ce2a23a32e9bb", size = 41342076, upload-time = "2025-12-11T21:12:20.618Z" }, + { url = "https://files.pythonhosted.org/packages/df/af/cd3290a647df567645353feed451ef4feaf5844496ced69c4dcb84295ff4/nodejs_wheel_binaries-24.12.0-py2.py3-none-win_arm64.whl", hash = "sha256:d0c2273b667dd7e3f55e369c0085957b702144b1b04bfceb7ce2411e58333757", size = 39048104, upload-time = "2025-12-11T21:12:23.495Z" }, +] + [[package]] name = "notebook-shim" version = "0.2.4" @@ -1716,6 +1782,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" }, ] +[[package]] +name = "ruff" +version = "0.14.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/1b/ab712a9d5044435be8e9a2beb17cbfa4c241aa9b5e4413febac2a8b79ef2/ruff-0.14.9.tar.gz", hash = "sha256:35f85b25dd586381c0cc053f48826109384c81c00ad7ef1bd977bfcc28119d5b", size = 5809165, upload-time = "2025-12-11T21:39:47.381Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/1c/d1b1bba22cffec02351c78ab9ed4f7d7391876e12720298448b29b7229c1/ruff-0.14.9-py3-none-linux_armv6l.whl", hash = "sha256:f1ec5de1ce150ca6e43691f4a9ef5c04574ad9ca35c8b3b0e18877314aba7e75", size = 13576541, upload-time = "2025-12-11T21:39:14.806Z" }, + { url = "https://files.pythonhosted.org/packages/94/ab/ffe580e6ea1fca67f6337b0af59fc7e683344a43642d2d55d251ff83ceae/ruff-0.14.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ed9d7417a299fc6030b4f26333bf1117ed82a61ea91238558c0268c14e00d0c2", size = 13779363, upload-time = "2025-12-11T21:39:20.29Z" }, + { url = "https://files.pythonhosted.org/packages/7d/f8/2be49047f929d6965401855461e697ab185e1a6a683d914c5c19c7962d9e/ruff-0.14.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d5dc3473c3f0e4a1008d0ef1d75cee24a48e254c8bed3a7afdd2b4392657ed2c", size = 12925292, upload-time = "2025-12-11T21:39:38.757Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e9/08840ff5127916bb989c86f18924fd568938b06f58b60e206176f327c0fe/ruff-0.14.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84bf7c698fc8f3cb8278830fb6b5a47f9bcc1ed8cb4f689b9dd02698fa840697", size = 13362894, upload-time = "2025-12-11T21:39:02.524Z" }, + { url = "https://files.pythonhosted.org/packages/31/1c/5b4e8e7750613ef43390bb58658eaf1d862c0cc3352d139cd718a2cea164/ruff-0.14.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aa733093d1f9d88a5d98988d8834ef5d6f9828d03743bf5e338bf980a19fce27", size = 13311482, upload-time = "2025-12-11T21:39:17.51Z" }, + { url = "https://files.pythonhosted.org/packages/5b/3a/459dce7a8cb35ba1ea3e9c88f19077667a7977234f3b5ab197fad240b404/ruff-0.14.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a1cfb04eda979b20c8c19550c8b5f498df64ff8da151283311ce3199e8b3648", size = 14016100, upload-time = "2025-12-11T21:39:41.948Z" }, + { url = "https://files.pythonhosted.org/packages/a6/31/f064f4ec32524f9956a0890fc6a944e5cf06c63c554e39957d208c0ffc45/ruff-0.14.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1e5cb521e5ccf0008bd74d5595a4580313844a42b9103b7388eca5a12c970743", size = 15477729, upload-time = "2025-12-11T21:39:23.279Z" }, + { url = "https://files.pythonhosted.org/packages/7a/6d/f364252aad36ccd443494bc5f02e41bf677f964b58902a17c0b16c53d890/ruff-0.14.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd429a8926be6bba4befa8cdcf3f4dd2591c413ea5066b1e99155ed245ae42bb", size = 15122386, upload-time = "2025-12-11T21:39:33.125Z" }, + { url = "https://files.pythonhosted.org/packages/20/02/e848787912d16209aba2799a4d5a1775660b6a3d0ab3944a4ccc13e64a02/ruff-0.14.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab208c1b7a492e37caeaf290b1378148f75e13c2225af5d44628b95fd7834273", size = 14497124, upload-time = "2025-12-11T21:38:59.33Z" }, + { url = "https://files.pythonhosted.org/packages/f3/51/0489a6a5595b7760b5dbac0dd82852b510326e7d88d51dbffcd2e07e3ff3/ruff-0.14.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72034534e5b11e8a593f517b2f2f2b273eb68a30978c6a2d40473ad0aaa4cb4a", size = 14195343, upload-time = "2025-12-11T21:39:44.866Z" }, + { url = "https://files.pythonhosted.org/packages/f6/53/3bb8d2fa73e4c2f80acc65213ee0830fa0c49c6479313f7a68a00f39e208/ruff-0.14.9-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:712ff04f44663f1b90a1195f51525836e3413c8a773574a7b7775554269c30ed", size = 14346425, upload-time = "2025-12-11T21:39:05.927Z" }, + { url = "https://files.pythonhosted.org/packages/ad/04/bdb1d0ab876372da3e983896481760867fc84f969c5c09d428e8f01b557f/ruff-0.14.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a111fee1db6f1d5d5810245295527cda1d367c5aa8f42e0fca9a78ede9b4498b", size = 13258768, upload-time = "2025-12-11T21:39:08.691Z" }, + { url = "https://files.pythonhosted.org/packages/40/d9/8bf8e1e41a311afd2abc8ad12be1b6c6c8b925506d9069b67bb5e9a04af3/ruff-0.14.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8769efc71558fecc25eb295ddec7d1030d41a51e9dcf127cbd63ec517f22d567", size = 13326939, upload-time = "2025-12-11T21:39:53.842Z" }, + { url = "https://files.pythonhosted.org/packages/f4/56/a213fa9edb6dd849f1cfbc236206ead10913693c72a67fb7ddc1833bf95d/ruff-0.14.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:347e3bf16197e8a2de17940cd75fd6491e25c0aa7edf7d61aa03f146a1aa885a", size = 13578888, upload-time = "2025-12-11T21:39:35.988Z" }, + { url = "https://files.pythonhosted.org/packages/33/09/6a4a67ffa4abae6bf44c972a4521337ffce9cbc7808faadede754ef7a79c/ruff-0.14.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7715d14e5bccf5b660f54516558aa94781d3eb0838f8e706fb60e3ff6eff03a8", size = 14314473, upload-time = "2025-12-11T21:39:50.78Z" }, + { url = "https://files.pythonhosted.org/packages/12/0d/15cc82da5d83f27a3c6b04f3a232d61bc8c50d38a6cd8da79228e5f8b8d6/ruff-0.14.9-py3-none-win32.whl", hash = "sha256:df0937f30aaabe83da172adaf8937003ff28172f59ca9f17883b4213783df197", size = 13202651, upload-time = "2025-12-11T21:39:26.628Z" }, + { url = "https://files.pythonhosted.org/packages/32/f7/c78b060388eefe0304d9d42e68fab8cffd049128ec466456cef9b8d4f06f/ruff-0.14.9-py3-none-win_amd64.whl", hash = "sha256:c0b53a10e61df15a42ed711ec0bda0c582039cf6c754c49c020084c55b5b0bc2", size = 14702079, upload-time = "2025-12-11T21:39:11.954Z" }, + { url = "https://files.pythonhosted.org/packages/26/09/7a9520315decd2334afa65ed258fed438f070e31f05a2e43dd480a5e5911/ruff-0.14.9-py3-none-win_arm64.whl", hash = "sha256:8e821c366517a074046d92f0e9213ed1c13dbc5b37a7fc20b07f79b64d62cc84", size = 13744730, upload-time = "2025-12-11T21:39:29.659Z" }, +] + [[package]] name = "scikit-learn" version = "1.7.2"