diff --git a/integration/databricks/notebooks/.gitignore b/integration/databricks/notebooks/.gitignore new file mode 100644 index 0000000..46236da --- /dev/null +++ b/integration/databricks/notebooks/.gitignore @@ -0,0 +1 @@ +.getml_context \ No newline at end of file diff --git a/integration/databricks/notebooks/annotations.yml b/integration/databricks/notebooks/annotations.yml new file mode 100644 index 0000000..87cf1e6 --- /dev/null +++ b/integration/databricks/notebooks/annotations.yml @@ -0,0 +1,475 @@ +tables: +- name: customers + description: Customer overview data mart, offering key details for each unique customer. One row per customer. + columns: + - name: customer_id + description: The unique key of the orders mart. + - name: customer_name + description: Customers' full name. + - name: count_lifetime_orders + description: Total number of orders a customer has ever placed. + - name: first_ordered_at + description: The timestamp when a customer placed their first order. + - name: last_ordered_at + description: The timestamp of a customer's most recent order. + - name: lifetime_spend_pretax + description: The sum of all the pre-tax subtotals of every order a customer has placed. + - name: lifetime_tax_paid + description: The sum of all the tax portion of every order a customer has placed. + - name: lifetime_spend + description: The sum of all the order totals (including tax) that a customer has ever placed. + - name: customer_type + description: Options are 'new' or 'returning', indicating if a customer has ordered more than once or has only placed + their first order to date. +- name: order_items + description: null + columns: + - name: order_item_id + description: null + - name: order_id + description: null +- name: orders + description: Order overview data mart, offering key details for each order inlcluding if it's a customer's first order and + a food vs. drink item breakdown. One row per order. + columns: + - name: order_id + description: The unique key of the orders mart. + - name: customer_id + description: The foreign key relating to the customer who placed the order. + - name: order_total + description: The total amount of the order in USD including tax. + - name: ordered_at + description: The timestamp the order was placed at. + - name: order_cost + description: The sum of supply expenses to fulfill the order. + - name: is_food_order + description: A boolean indicating if this order included any food items. + - name: is_drink_order + description: A boolean indicating if this order included any drink items. +- name: raw_customers + description: One record per person who has purchased one or more items +- name: raw_orders + description: One record per order (consisting of one or more order items) +- name: raw_items + description: Items included in an order +- name: raw_stores + description: null +- name: raw_products + description: One record per SKU for items sold in stores +- name: raw_supplies + description: One record per supply per SKU of items sold in stores +- name: stg_customers + description: Customer data with basic cleaning and transformation applied, one row per customer. + columns: + - name: customer_id + description: The unique key for each customer. +- name: stg_locations + description: List of open locations with basic cleaning and transformation applied, one row per location. + columns: + - name: location_id + description: The unique key for each location. +- name: stg_order_items + description: Individual food and drink items that make up our orders, one row per item. + columns: + - name: order_item_id + description: The unique key for each order item. + - name: order_id + description: The corresponding order each order item belongs to +- name: stg_orders + description: Order data with basic cleaning and transformation applied, one row per order. + columns: + - name: order_id + description: The unique key for each order. +- name: stg_products + description: Product (food and drink items that can be ordered) data with basic cleaning and transformation applied, one + row per product. + columns: + - name: product_id + description: The unique key for each product. +- name: stg_supplies + description: 'List of our supply expenses data with basic cleaning and transformation applied. + + One row per supply cost, not per supply. As supply costs fluctuate they receive a new row with a new UUID. Thus there + can be multiple rows per supply_id. + + ' + columns: + - name: supply_uuid + description: The unique key of our supplies per cost. +semantic_models: +- name: customers + defaults: + agg_time_dimension: first_ordered_at + description: 'Customer grain mart. + + ' + model: ref('customers') + entities: + - name: customer + expr: customer_id + type: primary + dimensions: + - name: customer_name + type: categorical + - name: customer_type + type: categorical + - name: first_ordered_at + type: time + type_params: + time_granularity: day + - name: last_ordered_at + type: time + type_params: + time_granularity: day + measures: + - name: customers + description: Count of unique customers + agg: count_distinct + expr: customer_id + - name: count_lifetime_orders + description: Total count of orders per customer. + agg: sum + - name: lifetime_spend_pretax + description: Customer lifetime spend before taxes. + agg: sum + - name: lifetime_spend + agg: sum + description: Gross customer lifetime spend inclusive of taxes. +- name: locations + description: 'Location dimension table. The grain of the table is one row per location. + + ' + model: ref('locations') + defaults: + agg_time_dimension: opened_date + entities: + - name: location + type: primary + expr: location_id + dimensions: + - name: location_name + type: categorical + - name: opened_date + expr: opened_date + type: time + type_params: + time_granularity: day + measures: + - name: average_tax_rate + description: Average tax rate. + expr: tax_rate + agg: average +- name: order_item + defaults: + agg_time_dimension: ordered_at + description: 'Items contatined in each order. The grain of the table is one row per order item. + + ' + model: ref('order_items') + entities: + - name: order_item + type: primary + expr: order_item_id + - name: order_id + type: foreign + expr: order_id + - name: product + type: foreign + expr: product_id + dimensions: + - name: ordered_at + expr: ordered_at + type: time + type_params: + time_granularity: day + - name: is_food_item + type: categorical + - name: is_drink_item + type: categorical + measures: + - name: revenue + description: The revenue generated for each order item. Revenue is calculated as a sum of revenue associated with each + product in an order. + agg: sum + expr: product_price + - name: food_revenue + description: The revenue generated for each order item. Revenue is calculated as a sum of revenue associated with each + product in an order. + agg: sum + expr: case when is_food_item then product_price else 0 end + - name: drink_revenue + description: The revenue generated for each order item. Revenue is calculated as a sum of revenue associated with each + product in an order. + agg: sum + expr: case when is_drink_item then product_price else 0 end + - name: median_revenue + description: The median revenue generated for each order item. + agg: median + expr: product_price +- name: orders + defaults: + agg_time_dimension: ordered_at + description: 'Order fact table. This table is at the order grain with one row per order. + + ' + model: ref('orders') + entities: + - name: order_id + type: primary + - name: location + type: foreign + expr: location_id + - name: customer + type: foreign + expr: customer_id + dimensions: + - name: ordered_at + expr: ordered_at + type: time + type_params: + time_granularity: day + - name: order_total_dim + type: categorical + expr: order_total + - name: is_food_order + type: categorical + - name: is_drink_order + type: categorical + - name: customer_order_number + type: categorical + measures: + - name: order_total + description: The total amount for each order including taxes. + agg: sum + - name: order_count + expr: 1 + agg: sum + - name: tax_paid + description: The total tax paid on each order. + agg: sum + - name: order_cost + description: The cost for each order item. Cost is calculated as a sum of the supply cost for each order item. + agg: sum +- name: products + description: 'Product dimension table. The grain of the table is one row per product. + + ' + model: ref('products') + entities: + - name: product + type: primary + expr: product_id + dimensions: + - name: product_name + type: categorical + - name: product_type + type: categorical + - name: product_description + type: categorical + - name: is_food_item + type: categorical + - name: is_drink_item + type: categorical + - name: product_price + type: categorical +- name: supplies + description: 'Supplies dimension table. The grain of the table is one row per supply and product combination. + + ' + model: ref('supplies') + entities: + - name: supply + type: primary + expr: supply_uuid + dimensions: + - name: supply_id + type: categorical + - name: product_id + type: categorical + - name: supply_name + type: categorical + - name: supply_cost + type: categorical + - name: is_perishable_supply + type: categorical +metrics: +- name: lifetime_spend_pretax + description: Customer's lifetime spend before tax + label: LTV Pre-tax + type: simple + type_params: + measure: lifetime_spend_pretax +- name: count_lifetime_orders + description: Count of lifetime orders + label: Count Lifetime Orders + type: simple + type_params: + measure: count_lifetime_orders +- name: average_order_value + description: LTV pre-tax / number of orders + label: Average Order Value + type: derived + type_params: + metrics: + - count_lifetime_orders + - lifetime_spend_pretax + expr: lifetime_spend_pretax / count_lifetime_orders +- name: revenue + description: Sum of the product revenue for each order item. Excludes tax. + type: simple + label: Revenue + type_params: + measure: revenue +- name: order_cost + description: Sum of cost for each order item. + label: Order Cost + type: simple + type_params: + measure: order_cost +- name: median_revenue + description: The median revenue for each order item. Excludes tax. + type: simple + label: Median Revenue + type_params: + measure: median_revenue +- name: food_revenue + description: The revenue from food in each order + label: Food Revenue + type: simple + type_params: + measure: food_revenue +- name: drink_revenue + description: The revenue from drinks in each order + label: Drink Revenue + type: simple + type_params: + measure: drink_revenue +- name: food_revenue_pct + description: The % of order revenue from food. + label: Food Revenue % + type: ratio + type_params: + numerator: food_revenue + denominator: revenue +- name: drink_revenue_pct + description: The % of order revenue from drinks. + label: Drink Revenue % + type: ratio + type_params: + numerator: drink_revenue + denominator: revenue +- name: revenue_growth_mom + description: Percentage growth of revenue compared to 1 month ago. Excluded tax + type: derived + label: Revenue Growth % M/M + type_params: + expr: (current_revenue - revenue_prev_month)*100/revenue_prev_month + metrics: + - name: revenue + alias: current_revenue + - name: revenue + offset_window: 1 month + alias: revenue_prev_month +- name: order_gross_profit + description: Gross profit from each order. + type: derived + label: Order Gross Profit + type_params: + expr: revenue - cost + metrics: + - name: revenue + - name: order_cost + alias: cost +- name: cumulative_revenue + description: The cumulative revenue for all orders. + label: Cumulative Revenue (All Time) + type: cumulative + type_params: + measure: revenue +- name: order_total + description: Sum of total order amonunt. Includes tax + revenue. + type: simple + label: Order Total + type_params: + measure: order_total +- name: new_customer_orders + description: New customer's first order count + label: New Customers + type: simple + type_params: + measure: order_count + filter: '{{ Dimension(''order_id__customer_order_number'') }} = 1 + + ' +- name: large_orders + description: Count of orders with order total over 20. + type: simple + label: Large Orders + type_params: + measure: order_count + filter: '{{ Dimension(''order_id__order_total_dim'') }} >= 20 + + ' +- name: orders + description: Count of orders. + label: Orders + type: simple + type_params: + measure: order_count +- name: food_orders + description: Count of orders that contain food order items + label: Food Orders + type: simple + type_params: + measure: order_count + filter: '{{ Dimension(''order_id__is_food_order'') }} = true + + ' +- name: drink_orders + description: Count of orders that contain drink order items + label: Drink Orders + type: simple + type_params: + measure: order_count + filter: '{{ Dimension(''order_id__is_drink_order'') }} = true + + ' +saved_queries: +- name: customer_order_metrics + query_params: + metrics: + - count_lifetime_orders + - lifetime_spend_pretax + - average_order_value + group_by: + - Entity('customer') + exports: + - name: customer_order_metrics + config: + export_as: table +- name: revenue_metrics + query_params: + metrics: + - revenue + - food_revenue + - drink_revenue + group_by: + - TimeDimension('metric_time', 'day') + exports: + - name: revenue_metrics + config: + export_as: table +- name: order_metrics + query_params: + metrics: + - orders + - new_customer_orders + - order_total + - food_orders + - drink_orders + group_by: + - TimeDimension('metric_time', 'day') + exports: + - name: order_metrics + config: + export_as: table diff --git a/integration/databricks/notebooks/column_descriptions_report.json b/integration/databricks/notebooks/column_descriptions_report.json new file mode 100644 index 0000000..1c1f5f3 --- /dev/null +++ b/integration/databricks/notebooks/column_descriptions_report.json @@ -0,0 +1,108 @@ +{ + "column_descriptions": { + "weekly_sales_by_store": { + "reference_date": { + "name": "reference_date", + "description": "Weekly snapshot timestamp that anchors the observation window and target week; used as the reference point for trailing 30-day aggregations and chronological train/validation/test splits. Values span 2018–2024 and include timezone-naive timestamps. [timestamp]", + "description_confidence": "high" + }, + "store_id": { + "name": "store_id", + "description": "Unique store identifier (UUID) used as the primary join key to link weekly snapshots with order-level records and store metadata; there are six distinct locations in the dataset. [UUID]", + "description_confidence": "high" + }, + "snapshot_id": { + "name": "snapshot_id", + "description": "Identifier for the specific weekly snapshot row (string); acts as an additional join/index key that distinguishes repeated snapshots per store across time (many unique values). Useful for traceability and aligning predictions with snapshot records. [string/id]", + "description_confidence": "medium" + }, + "next_week_sales": { + "name": "next_week_sales", + "description": "Weekly revenue to be predicted (model target). Monetary units are stored in cents (e.g., 17742 ≈ $177.42). Summary stats: mean ≈ 17,700, wide range reflecting seasonality and store maturity. Strongly correlated with order volume and used to evaluate model performance. [cents]", + "description_confidence": "high" + }, + "store_name": { + "name": "store_name", + "description": "Categorical label for physical location (human-readable city/area names). Low cardinality (six values) and useful for grouping, stratified evaluation and store-level analysis; could be used as a categorical feature or to join external store metadata. [categorical]", + "description_confidence": "high" + }, + "year": { + "name": "year", + "description": "Calendar year derived from the snapshot timestamp. Stored as a categorical value for modeling seasonality and splitting/backtesting across years. Useful for detecting long-term trends and concept drift. [YYYY, categorical]", + "description_confidence": "high" + }, + "month": { + "name": "month", + "description": "Calendar month derived from the timestamp (1–12), represented as a categorical value in the dataset. Helps capture monthly seasonality and calendar effects when aggregated at the weekly level. [1-12, categorical]", + "description_confidence": "high" + }, + "week_number": { + "name": "week_number", + "description": "Week-of-period identifier (categorical) that encodes the weekly position within the year or reporting period; useful for weekly seasonality and alignment with calendar-based events. [categorical]", + "description_confidence": "high" + }, + "is_full_week_after_opening": { + "name": "is_full_week_after_opening", + "description": "Boolean-like flag (stored as string) indicating whether the snapshot corresponds to a full trading week after store opening; used to exclude partial weeks or to control for initial ramp effects. In provided subsets this flag is mostly true. [boolean/string]", + "description_confidence": "medium" + }, + "has_order_activity": { + "name": "has_order_activity", + "description": "Indicator (boolean-like) showing if any orders occurred in the trailing window used for feature aggregation. Can be used to filter out inactive snapshots or to treat cold-start periods differently; present values are typically true in training/validation/test subsets. [boolean/string]", + "description_confidence": "high" + }, + "has_min_history": { + "name": "has_min_history", + "description": "Flag (boolean-like) denoting whether a minimum required historical record exists for the store at the snapshot date (e.g., sufficient prior days/orders for stable aggregates). Helps identify early ramp weeks vs. mature weeks. [boolean/string]", + "description_confidence": "medium" + }, + "days_since_open": { + "name": "days_since_open", + "description": "Numeric count of days between store opening and the snapshot date; measures maturity/ramp stage of a location. Range and distribution vary by subset (e.g., median ~510 in train, larger in validation/test). Positively correlated with the target, useful to model maturation effects. [days]", + "description_confidence": "high" + }, + "next_week_orders": { + "name": "next_week_orders", + "description": "Forecasted or observed order volume for the target week (numeric count). Acts as the primary driver of revenue in the model (very high feature importance and correlation with the target). Ensure upstream order forecasts are generated without leakage when used at inference. [count/orders]", + "description_confidence": "high" + } + }, + "orders": { + "ordered_at": { + "name": "ordered_at", + "description": "Exact timestamp when each order was placed. Used to determine inclusion in trailing lookback windows (30 days in this pipeline), compute recency features, and align orders to weekly snapshots. Range: 2018-09-01 to 2024-08-29. [timestamp]", + "description_confidence": "high" + }, + "store_id": { + "name": "store_id", + "description": "Store-level join key (UUID) that links each transaction to the corresponding weekly snapshot and store attributes; same domain as the population join key, enabling one-to-many joins. [UUID]", + "description_confidence": "high" + }, + "id": { + "name": "id", + "description": "Unique order identifier (UUID/string) for the transaction record. Primary key at the order level; used to deduplicate and to compute order counts. High cardinality consistent with the number of transactions. [UUID/string]", + "description_confidence": "high" + }, + "customer": { + "name": "customer", + "description": "Customer identifier (UUID/string). Low cardinality relative to order volume, indicating many repeat customers; useful for customer-level aggregates (frequency, recency) and loyalty analysis if privacy/compliance allows. [UUID/string]", + "description_confidence": "high" + }, + "subtotal": { + "name": "subtotal", + "description": "Monetary amount before tax for the individual order. Stored in cents (e.g., 1063 ≈ $10.63). Distribution shows discrete menu-driven pricing (limited unique values, strong modes) and occasional zeros (comps/refunds). Widely used to build rolling AOV, sums, means, and variability features. [cents]", + "description_confidence": "high" + }, + "order_total": { + "name": "order_total", + "description": "Total charged for the order including tax (subtotal + tax component). Stored in cents (e.g., 1124 ≈ $11.24). Used for revenue aggregates and to validate consistency with subtotal and tax components. [cents]", + "description_confidence": "high" + }, + "tax_paid": { + "name": "tax_paid", + "description": "Tax amount applied to the order. Stored in cents (mean ≈ 60.7). Useful to compute effective tax rates, to reconcile order_total with subtotal, and as a low-magnitude feature for mix/price analyses; zeros exist for some transactions. [cents]", + "description_confidence": "high" + } + } + } +} \ No newline at end of file diff --git a/integration/databricks/notebooks/databricks_feature_store.ipynb b/integration/databricks/notebooks/databricks_feature_store.ipynb index c5a34c9..cd13815 100644 --- a/integration/databricks/notebooks/databricks_feature_store.ipynb +++ b/integration/databricks/notebooks/databricks_feature_store.ipynb @@ -32,7 +32,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "37c73e30", "metadata": {}, "outputs": [ @@ -40,7 +40,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[2K Loading pipelines... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", + "\u001b[2K Loading pipelines... ━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[?25h" ] }, @@ -59,15 +59,19 @@ } ], "source": [ + "from pathlib import Path\n", + "\n", "import getml\n", "from databricks.connect import DatabricksSession\n", "\n", - "getml.set_project(\"databricks_feature_store\")" + "PROJECT_NAME = \"databricks_feature_store\"\n", + "\n", + "getml.set_project(PROJECT_NAME)" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 41, "id": "5c743187", "metadata": {}, "outputs": [], @@ -77,7 +81,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "99bd4e16", "metadata": {}, "outputs": [ @@ -85,7 +89,7 @@ "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", + "/Users/awais/code17/projects/getML/github/getml-demo/.venv/lib/python3.12/site-packages/getml/data/_io/arrow.py:371: UserWarning: \n", "Column 'next_week_sales' has been converted from decimal to float. This may\n", " result in a loss of precision!\n", " \n", @@ -94,6 +98,7 @@ } ], "source": [ + "# Load population table\n", "weekly_sales_by_store_spark = spark.table(\n", " \"workspace.prepared.weekly_sales_by_store_with_target\"\n", ")\n", @@ -102,7 +107,7 @@ " weekly_sales_by_store_spark.toArrow(), name=\"weekly_sales_by_store\"\n", ")\n", "\n", - "# # Load orders table\n", + "# Load peripheral table\n", "orders_spark = spark.table(\"workspace.raw.raw_orders\")\n", "orders = getml.DataFrame.from_arrow(orders_spark.toArrow(), name=\"orders\")" ] @@ -125,7 +130,7 @@ "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", + "/Users/awais/code17/projects/getML/github/getml-demo/.venv/lib/python3.12/site-packages/getml/data/_io/arrow.py:393: 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", @@ -2260,7 +2265,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 8, "id": "e14a2cdd", "metadata": {}, "outputs": [ @@ -2299,7 +2304,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 38, "id": "39d77442", "metadata": {}, "outputs": [], @@ -2327,7 +2332,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": null, "id": "9fa470a8", "metadata": {}, "outputs": [], @@ -2342,8 +2347,30 @@ "container.add(\n", " orders=orders,\n", ")\n", - "# container.save()\n", - "# getml.project.data_frames.save()" + "\n", + "getml.project.data_frames.save()\n", + "container.save()" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "a91afdf2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'uzNVUz'" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "container._id" ] }, { @@ -2356,7 +2383,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 9, "id": "a704cacb", "metadata": {}, "outputs": [ @@ -2377,8 +2404,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[2K Staging... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", - "\u001b[2K Checking... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", + "\u001b[2K Staging... ━━━━━━━━━━━━━━━ 100% • 00:00\n", + "\u001b[2K Checking... ━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[?25h" ] }, @@ -2412,10 +2439,10 @@ "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[2K Staging... ━━━━━━━━━━━━━━━ 100% • 00:01\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" ] }, @@ -2436,76 +2463,11 @@ "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", + "Time taken: 0:00:06.494403.\n", + "\n", + "\u001b[2K Staging... ━━━━━━━━━━━━━━━ 100% • 00:00\n", + "\u001b[2K Preprocessing... ━━━━━━━━━━━━━━━ 100% • 00:00\n", + "\u001b[2K FastProp: Building features... ━━━━━━━━━━━━━━━ 100% • 00:01\n", "\u001b[?25h" ] }, @@ -2578,7 +2540,7 @@ " 0\n", " \n", " \n", - " 2025-12-16 08:08:11\n", + " 2026-01-06 15:39:45\n", " \n", " \n", " \n", @@ -2607,7 +2569,7 @@ " 1\n", " \n", " \n", - " 2025-12-16 08:08:23\n", + " 2026-01-06 15:39:49\n", " \n", " \n", " \n", @@ -2619,11 +2581,11 @@ " \n", " \n", " \n", - " 470.8753\n", + " 472.4813\n", " \n", " \n", " \n", - " 613.0891\n", + " 613.3892\n", " \n", " \n", " \n", @@ -2637,31 +2599,43 @@ ], "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" + "0 2026-01-06 15:39:45 train next_week_sales 249.6961 319.0279 0.9973\n", + "1 2026-01-06 15:39:49 test next_week_sales 472.4813 613.3892 0.9862" ] }, - "execution_count": 16, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# predictions = pipe.predict(container.test)\n", + "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", - "# # Calculate metrics\n", - "# scores = pipe.score(container.test)\n", - "# scores" + "pipe.fit(container.train)\n", + "pipe.score(container.test)" ] }, { "cell_type": "code", - "execution_count": 7, - "id": "ef68c68d", + "execution_count": null, + "id": "33230bb2", "metadata": {}, "outputs": [], "source": [ - "pipe = getml.pipeline.load(\"CzNABb\")" + "# container = getml.data.load_container(\"uzNVUz\")\n", + "# pipe = getml.pipeline.load(\"2aj2Dm\")" ] }, { @@ -2674,7 +2648,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "410d49db", "metadata": {}, "outputs": [ @@ -2682,8 +2656,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[2K Staging... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", - "\u001b[2K Preprocessing... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", + "\u001b[2K Staging... ━━━━━━━━━━━━━━━ 100% • 00:00\n", + "\u001b[2K Preprocessing... ━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[?25h" ] }, @@ -3462,9 +3436,22 @@ " \n", " \n", " \n", + " \n", + " \n", + " 1032.1334\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " 085 \n", @@ -3477,7 +3464,7 @@ " \n", " \n", " \n", - " 85440008193 \n", @@ -3490,7 +3477,7 @@ " \n", " \n", " \n", - " 851800 \n", @@ -3501,11 +3488,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1186.29283600 \n", " \n", " \n", @@ -3516,7 +3503,7 @@ " \n", " \n", " \n", - " 18009800 \n", @@ -3542,7 +3529,7 @@ " \n", " \n", " \n", - " 36000 \n", @@ -3555,7 +3542,7 @@ " \n", " \n", " \n", - " 9800600 \n", @@ -3568,9 +3555,9 @@ " \n", " \n", " \n", - " 10321186.1334.2928\n", " \n", " \n", @@ -3581,7 +3568,7 @@ " \n", " \n", " \n", - " 6008544000 \n", @@ -3592,11 +3579,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 8193 1065.3569\n", " \n", " \n", @@ -3607,9 +3594,9 @@ " \n", " \n", " \n", - " 10651073.3569.4165\n", " \n", " \n", @@ -3620,7 +3607,7 @@ " \n", " \n", " \n", - " 085 \n", @@ -3633,7 +3620,7 @@ " \n", " \n", " \n", - " 88857428193 \n", @@ -3646,7 +3633,7 @@ " \n", " \n", " \n", - " 851872 \n", @@ -3657,11 +3644,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1233.74083744 \n", " \n", " \n", @@ -3672,7 +3659,7 @@ " \n", " \n", " \n", - " 187210192 \n", @@ -3698,7 +3685,7 @@ " \n", " \n", " \n", - " 37440 \n", @@ -3711,7 +3698,7 @@ " \n", " \n", " \n", - " 10192624 \n", @@ -3724,9 +3711,9 @@ " \n", " \n", " \n", - " 10731233.4165.7408\n", " \n", " \n", @@ -3737,7 +3724,7 @@ " \n", " \n", " \n", - " 6248885742 \n", @@ -3748,11 +3735,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 8193 1107.9689\n", " \n", " \n", @@ -3763,9 +3750,9 @@ " \n", " \n", " \n", - " 110741.9689.2832\n", " \n", " \n", @@ -3776,7 +3763,7 @@ " \n", " \n", " \n", - " 085 \n", @@ -3789,7 +3776,7 @@ " \n", " \n", " \n", - " 3417428193 \n", @@ -3802,7 +3789,7 @@ " \n", " \n", " \n", - " 8572 \n", @@ -3813,11 +3800,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 47.448144 \n", " \n", " \n", @@ -3828,7 +3815,7 @@ " \n", " \n", " \n", - " 72392 \n", @@ -3854,7 +3841,7 @@ " \n", " \n", " \n", - " 1440 \n", @@ -3867,7 +3854,7 @@ " \n", " \n", " \n", - " 39224 \n", @@ -3880,9 +3867,9 @@ " \n", " \n", " \n", - " 4147.2832.448\n", " \n", " \n", @@ -3893,7 +3880,7 @@ " \n", " \n", " \n", - " 24341742 \n", @@ -3904,11 +3891,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 8193 42.612\n", " \n", " \n", @@ -3919,9 +3906,9 @@ " \n", " \n", " \n", - " 421295769.612.6183\n", " \n", " \n", @@ -3932,7 +3919,7 @@ " \n", " \n", " \n", - " 324605554 \n", @@ -3945,7 +3932,7 @@ " \n", " \n", " \n", - " 107263809002724 \n", @@ -3958,7 +3945,7 @@ " \n", " \n", " \n", - " 55542563200 \n", @@ -3969,11 +3956,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 709850.163832460 \n", " \n", " \n", @@ -4023,7 +4010,7 @@ " \n", " \n", " \n", - " 2563200234000 \n", @@ -4036,22 +4023,9 @@ " \n", " \n", " \n", - " 1295769709850.6183\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 234000 .1638\n", " \n", " \n", @@ -4062,7 +4036,7 @@ " \n", " \n", " \n", - " 272410726380900 \n", @@ -4168,11 +4142,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 0 1140.2708\n", " \n", " \n", @@ -4183,7 +4157,7 @@ " \n", " \n", " \n", - " 724300088 \n", @@ -4196,7 +4170,7 @@ " \n", " \n", " \n", - " 886264 \n", @@ -4207,11 +4181,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1274.3324700 \n", " \n", " \n", @@ -4222,7 +4196,20 @@ " \n", " \n", " \n", - " 7001900 \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 9800 \n", @@ -4248,7 +4235,7 @@ " \n", " \n", " \n", - " 19000 \n", @@ -4261,7 +4248,7 @@ " \n", " \n", " \n", - " 9800600 \n", @@ -4274,9 +4261,9 @@ " \n", " \n", " \n", - " 11401274.2708.3324\n", " \n", " \n", @@ -4287,7 +4274,7 @@ " \n", " \n", " \n", - " 6007243000 \n", @@ -4298,11 +4285,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 6264 1163.8545\n", " \n", " \n", @@ -4313,9 +4300,9 @@ " \n", " \n", " \n", - " 11631208.8545.62\n", " \n", " \n", @@ -4326,7 +4313,7 @@ " \n", " \n", " \n", - " 088 \n", @@ -4339,7 +4326,7 @@ " \n", " \n", " \n", - " 76771546264 \n", @@ -4352,7 +4339,7 @@ " \n", " \n", " \n", - " 88742 \n", @@ -4363,11 +4350,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1350.72642013 \n", " \n", " \n", @@ -4378,7 +4365,7 @@ " \n", " \n", " \n", - " 74210388 \n", @@ -4404,7 +4391,7 @@ " \n", " \n", " \n", - " 20130 \n", @@ -4417,7 +4404,7 @@ " \n", " \n", " \n", - " 10388636 \n", @@ -4430,9 +4417,9 @@ " \n", " \n", " \n", - " 12081350.62.7264\n", " \n", " \n", @@ -4443,7 +4430,7 @@ " \n", " \n", " \n", - " 6367677154 \n", @@ -4454,11 +4441,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 6264 1233.6033\n", " \n", " \n", @@ -4469,9 +4456,9 @@ " \n", " \n", " \n", - " 123368.6033.3492\n", " \n", " \n", @@ -4482,7 +4469,7 @@ " \n", " \n", " \n", - " 088 \n", @@ -4495,7 +4482,7 @@ " \n", " \n", " \n", - " 4341546264 \n", @@ -4508,7 +4495,7 @@ " \n", " \n", " \n", - " 8842 \n", @@ -4519,11 +4506,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 76.3944113 \n", " \n", " \n", @@ -4534,7 +4521,7 @@ " \n", " \n", " \n", - " 42588 \n", @@ -4560,7 +4547,7 @@ " \n", " \n", " \n", - " 1130 \n", @@ -4573,7 +4560,7 @@ " \n", " \n", " \n", - " 58836 \n", @@ -4586,9 +4573,9 @@ " \n", " \n", " \n", - " 6876.3492.3944\n", " \n", " \n", @@ -4599,7 +4586,7 @@ " \n", " \n", " \n", - " 36434154 \n", @@ -4610,11 +4597,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 6264 69.7488\n", " \n", " \n", @@ -4625,9 +4612,9 @@ " \n", " \n", " \n", - " 691258149.7488.0397\n", " \n", " \n", @@ -4638,7 +4625,7 @@ " \n", " \n", " \n", - " 325204899 \n", @@ -4651,7 +4638,7 @@ " \n", " \n", " \n", - " 79917627001453 \n", @@ -4664,7 +4651,7 @@ " \n", " \n", " \n", - " 48992562060 \n", @@ -4675,11 +4662,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 699016.855532520 \n", " \n", " \n", @@ -4729,7 +4716,7 @@ " \n", " \n", " \n", - " 25620602221200 \n", @@ -4742,22 +4729,9 @@ " \n", " \n", " \n", - " 1258149699016.0397\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 2221200 .8555\n", " \n", " \n", @@ -4768,7 +4742,7 @@ " \n", " \n", " \n", - " 14537991762700 \n", @@ -4874,9 +4848,22 @@ " \n", " \n", " \n", + " \n", + " \n", + " 1059.0929\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " 085 \n", @@ -4889,7 +4876,7 @@ " \n", " \n", " \n", - " 94577008845 \n", @@ -4902,7 +4889,7 @@ " \n", " \n", " \n", - " 851300 \n", @@ -4913,11 +4900,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1216.411600 \n", " \n", " \n", @@ -4928,7 +4915,7 @@ " \n", " \n", " \n", - " 13009500 \n", @@ -4954,7 +4941,7 @@ " \n", " \n", " \n", - " 6000 \n", @@ -4967,7 +4954,7 @@ " \n", " \n", " \n", - " 9500600 \n", @@ -4980,9 +4967,9 @@ " \n", " \n", " \n", - " 10591216.0929.411\n", " \n", " \n", @@ -4993,7 +4980,7 @@ " \n", " \n", " \n", - " 6009457700 \n", @@ -5004,11 +4991,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 8845 1043.2765\n", " \n", " \n", @@ -5019,9 +5006,9 @@ " \n", " \n", " \n", - " 10431101.2765.4541\n", " \n", " \n", @@ -5032,7 +5019,7 @@ " \n", " \n", " \n", - " 085 \n", @@ -5045,7 +5032,7 @@ " \n", " \n", " \n", - " 98359858845 \n", @@ -5058,7 +5045,7 @@ " \n", " \n", " \n", - " 851352 \n", @@ -5069,11 +5056,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1265.0631624 \n", " \n", " \n", @@ -5084,7 +5071,7 @@ " \n", " \n", " \n", - " 13529880 \n", @@ -5110,7 +5097,7 @@ " \n", " \n", " \n", - " 6240 \n", @@ -5123,7 +5110,7 @@ " \n", " \n", " \n", - " 9880624 \n", @@ -5136,9 +5123,9 @@ " \n", " \n", " \n", - " 11011265.4541.0631\n", " \n", " \n", @@ -5149,7 +5136,7 @@ " \n", " \n", " \n", - " 6249835985 \n", @@ -5160,11 +5147,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 8845 1085.0047\n", " \n", " \n", @@ -5175,9 +5162,9 @@ " \n", " \n", " \n", - " 108542.0047.3611\n", " \n", " \n", @@ -5188,7 +5175,7 @@ " \n", " \n", " \n", - " 085 \n", @@ -5201,7 +5188,7 @@ " \n", " \n", " \n", - " 3782858845 \n", @@ -5214,7 +5201,7 @@ " \n", " \n", " \n", - " 8552 \n", @@ -5225,11 +5212,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 48.65224 \n", " \n", " \n", @@ -5240,7 +5227,7 @@ " \n", " \n", " \n", - " 52380 \n", @@ -5266,7 +5253,7 @@ " \n", " \n", " \n", - " 240 \n", @@ -5279,7 +5266,7 @@ " \n", " \n", " \n", - " 38024 \n", @@ -5292,9 +5279,9 @@ " \n", " \n", " \n", - " 4248.3611.652\n", " \n", " \n", @@ -5305,7 +5292,7 @@ " \n", " \n", " \n", - " 24378285 \n", @@ -5316,11 +5303,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 8845 41.7281\n", " \n", " \n", @@ -5331,9 +5318,9 @@ " \n", " \n", " \n", - " 411347191.7281.953\n", " \n", " \n", @@ -5344,7 +5331,7 @@ " \n", " \n", " \n", - " 327005990 \n", @@ -5357,7 +5344,7 @@ " \n", " \n", " \n", - " 120304241402940 \n", @@ -5370,7 +5357,7 @@ " \n", " \n", " \n", - " 59902563200 \n", @@ -5381,11 +5368,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 728065.982632700 \n", " \n", " \n", @@ -5435,7 +5422,7 @@ " \n", " \n", " \n", - " 25632002394000 \n", @@ -5448,22 +5435,9 @@ " \n", " \n", " \n", - " 1347191728065.953\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 2394000 .9826\n", " \n", " \n", @@ -5474,7 +5448,7 @@ " \n", " \n", " \n", - " 294012030424140 \n", @@ -5580,9 +5554,22 @@ " \n", " \n", " \n", + " \n", + " \n", + " 1046.0875\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " 084 \n", @@ -5595,7 +5582,7 @@ " \n", " \n", " \n", - " 88499008376 \n", @@ -5608,7 +5595,7 @@ " \n", " \n", " \n", - " 841100 \n", @@ -5619,11 +5606,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1228.24728900 \n", " \n", " \n", @@ -5634,7 +5621,7 @@ " \n", " \n", " \n", - " 11009700 \n", @@ -5660,7 +5647,7 @@ " \n", " \n", " \n", - " 89000 \n", @@ -5673,7 +5660,7 @@ " \n", " \n", " \n", - " 9700600 \n", @@ -5686,9 +5673,9 @@ " \n", " \n", " \n", - " 10461228.0875.2472\n", " \n", " \n", @@ -5699,7 +5686,7 @@ " \n", " \n", " \n", - " 6008849900 \n", @@ -5710,11 +5697,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 8376 1061.4084\n", " \n", " \n", @@ -5725,9 +5712,9 @@ " \n", " \n", " \n", - " 10611087.4084.9287\n", " \n", " \n", @@ -5738,7 +5725,7 @@ " \n", " \n", " \n", - " 084 \n", @@ -5751,7 +5738,7 @@ " \n", " \n", " \n", - " 92038778376 \n", @@ -5764,7 +5751,7 @@ " \n", " \n", " \n", - " 841144 \n", @@ -5775,11 +5762,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1277.37319256 \n", " \n", " \n", @@ -5790,7 +5777,7 @@ " \n", " \n", " \n", - " 114410088 \n", @@ -5816,7 +5803,7 @@ " \n", " \n", " \n", - " 92560 \n", @@ -5829,7 +5816,7 @@ " \n", " \n", " \n", - " 10088624 \n", @@ -5842,9 +5829,9 @@ " \n", " \n", " \n", - " 10871277.9287.3731\n", " \n", " \n", @@ -5855,7 +5842,7 @@ " \n", " \n", " \n", - " 6249203877 \n", @@ -5866,11 +5853,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 8376 1103.8616\n", " \n", " \n", @@ -5881,9 +5868,9 @@ " \n", " \n", " \n", - " 110341.8616.8413\n", " \n", " \n", @@ -5894,7 +5881,7 @@ " \n", " \n", " \n", - " 084 \n", @@ -5907,7 +5894,7 @@ " \n", " \n", " \n", - " 3539778376 \n", @@ -5920,7 +5907,7 @@ " \n", " \n", " \n", - " 8444 \n", @@ -5931,11 +5918,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 49.126356 \n", " \n", " \n", @@ -5946,7 +5933,7 @@ " \n", " \n", " \n", - " 44388 \n", @@ -5972,7 +5959,7 @@ " \n", " \n", " \n", - " 3560 \n", @@ -5985,7 +5972,7 @@ " \n", " \n", " \n", - " 38824 \n", @@ -5998,9 +5985,9 @@ " \n", " \n", " \n", - " 4149.8413.126\n", " \n", " \n", @@ -6011,7 +5998,7 @@ " \n", " \n", " \n", - " 24353977 \n", @@ -6022,11 +6009,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 8376 42.4532\n", " \n", " \n", @@ -6037,9 +6024,9 @@ " \n", " \n", " \n", - " 421294489.4532.4965\n", " \n", " \n", @@ -6050,7 +6037,7 @@ " \n", " \n", " \n", - " 333005676 \n", @@ -6063,7 +6050,7 @@ " \n", " \n", " \n", - " 109513811402784 \n", @@ -6076,7 +6063,7 @@ " \n", " \n", " \n", - " 56762563200 \n", @@ -6087,11 +6074,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 712443.90333300 \n", " \n", " \n", @@ -6141,7 +6128,7 @@ " \n", " \n", " \n", - " 25632001530000 \n", @@ -6154,22 +6141,9 @@ " \n", " \n", " \n", - " 1294489712443.4965\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 1530000 .903\n", " \n", " \n", @@ -6180,7 +6154,7 @@ " \n", " \n", " \n", - " 278410951381140 \n", @@ -6286,9 +6260,22 @@ " \n", " \n", " \n", + " \n", + " \n", + " 1047.4757\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " 082 \n", @@ -6301,7 +6288,7 @@ " \n", " \n", " \n", - " 99175009386 \n", @@ -6314,7 +6301,7 @@ " \n", " \n", " \n", - " 82700 \n", @@ -6325,11 +6312,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1106.49518400 \n", " \n", " \n", @@ -6340,7 +6327,7 @@ " \n", " \n", " \n", - " 7009500 \n", @@ -6366,7 +6353,7 @@ " \n", " \n", " \n", - " 84000 \n", @@ -6379,7 +6366,7 @@ " \n", " \n", " \n", - " 9500600 \n", @@ -6392,9 +6379,9 @@ " \n", " \n", " \n", - " 10471106.4757.4951\n", " \n", " \n", @@ -6405,7 +6392,7 @@ " \n", " \n", " \n", - " 6009917500 \n", @@ -6416,11 +6403,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 9386 1064.6682\n", " \n", " \n", @@ -6431,9 +6418,9 @@ " \n", " \n", " \n", - " 10641089.6682.373\n", " \n", " \n", @@ -6444,7 +6431,7 @@ " \n", " \n", " \n", - " 082 \n", @@ -6457,7 +6444,7 @@ " \n", " \n", " \n", - " 103141849386 \n", @@ -6470,7 +6457,7 @@ " \n", " \n", " \n", - " 82728 \n", @@ -6481,11 +6468,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1150.75218736 \n", " \n", " \n", @@ -6496,7 +6483,7 @@ " \n", " \n", " \n", - " 7289880 \n", @@ -6522,7 +6509,7 @@ " \n", " \n", " \n", - " 87360 \n", @@ -6535,7 +6522,7 @@ " \n", " \n", " \n", - " 9880624 \n", @@ -6548,9 +6535,9 @@ " \n", " \n", " \n", - " 10891150.373.7521\n", " \n", " \n", @@ -6561,7 +6548,7 @@ " \n", " \n", " \n", - " 62410314184 \n", @@ -6572,11 +6559,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 9386 1107.2526\n", " \n", " \n", @@ -6587,9 +6574,9 @@ " \n", " \n", " \n", - " 110741.2526.8973\n", " \n", " \n", @@ -6600,7 +6587,7 @@ " \n", " \n", " \n", - " 082 \n", @@ -6613,7 +6600,7 @@ " \n", " \n", " \n", - " 3966849386 \n", @@ -6626,7 +6613,7 @@ " \n", " \n", " \n", - " 8228 \n", @@ -6637,11 +6624,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 44.257336 \n", " \n", " \n", @@ -6652,7 +6639,7 @@ " \n", " \n", " \n", - " 28380 \n", @@ -6678,7 +6665,7 @@ " \n", " \n", " \n", - " 3360 \n", @@ -6691,7 +6678,7 @@ " \n", " \n", " \n", - " 38024 \n", @@ -6704,9 +6691,9 @@ " \n", " \n", " \n", - " 4144.8973.257\n", " \n", " \n", @@ -6717,7 +6704,7 @@ " \n", " \n", " \n", - " 24396684 \n", @@ -6728,11 +6715,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 9386 42.5844\n", " \n", " \n", @@ -6743,9 +6730,9 @@ " \n", " \n", " \n", - " 421289085.5844.9696\n", " \n", " \n", @@ -6756,7 +6743,7 @@ " \n", " \n", " \n", - " 325806631 \n", @@ -6769,7 +6756,7 @@ " \n", " \n", " \n", - " 122050659602837 \n", @@ -6782,7 +6769,7 @@ " \n", " \n", " \n", - " 66312560560 \n", @@ -6793,11 +6780,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 706466.956532580 \n", " \n", " \n", @@ -6847,7 +6834,7 @@ " \n", " \n", " \n", - " 25605601530000 \n", @@ -6860,22 +6847,9 @@ " \n", " \n", " \n", - " 1289085706466.9696\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 1530000 .9565\n", " \n", " \n", @@ -6886,7 +6860,7 @@ " \n", " \n", " \n", - " 283712205065960 \n", @@ -6995,7 +6969,7 @@ " \n", " \n", " ... \n", " \n", @@ -7034,7 +7008,7 @@ " \n", " \n", " ... \n", " \n", @@ -7099,7 +7073,7 @@ " \n", " \n", " ... \n", " \n", @@ -7112,7 +7086,7 @@ " \n", " \n", " ... \n", " \n", @@ -7151,7 +7125,7 @@ " \n", " \n", " ... \n", " \n", @@ -7190,7 +7164,7 @@ " \n", " \n", " ... \n", " \n", @@ -7255,7 +7229,7 @@ " \n", " \n", " ... \n", " \n", @@ -7268,7 +7242,7 @@ " \n", " \n", " ... \n", " \n", @@ -7307,7 +7281,7 @@ " \n", " \n", " ... \n", " \n", @@ -7346,7 +7320,7 @@ " \n", " \n", " ... \n", " \n", @@ -7411,7 +7385,7 @@ " \n", " \n", " ... \n", " \n", @@ -7424,7 +7398,7 @@ " \n", " \n", " ... \n", " \n", @@ -7463,7 +7437,7 @@ " \n", " \n", " ... \n", " \n", @@ -7502,7 +7476,7 @@ " \n", " \n", " ... \n", " \n", @@ -7567,7 +7541,7 @@ " \n", " \n", " ... \n", " \n", @@ -7580,7 +7554,7 @@ " \n", " \n", " ... \n", " \n", @@ -7698,9 +7672,22 @@ " \n", " \n", " \n", + " \n", + " \n", + " 1075.6416\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " 084 \n", @@ -7713,7 +7700,7 @@ " \n", " \n", " \n", - " 75865006969 \n", @@ -7726,7 +7713,7 @@ " \n", " \n", " \n", - " 843400 \n", @@ -7737,11 +7724,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1251.65851800 \n", " \n", " \n", @@ -7752,7 +7739,7 @@ " \n", " \n", " \n", - " 34009600 \n", @@ -7778,7 +7765,7 @@ " \n", " \n", " \n", - " 18000 \n", @@ -7791,7 +7778,7 @@ " \n", " \n", " \n", - " 9600600 \n", @@ -7804,9 +7791,9 @@ " \n", " \n", " \n", - " 10751251.6416.6585\n", " \n", " \n", @@ -7817,7 +7804,7 @@ " \n", " \n", " \n", - " 6007586500 \n", @@ -7828,11 +7815,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 6969 1130.5452\n", " \n", " \n", @@ -7843,9 +7830,9 @@ " \n", " \n", " \n", - " 11301142.5452.4785\n", " \n", " \n", @@ -7856,7 +7843,7 @@ " \n", " \n", " \n", - " 084 \n", @@ -7869,7 +7856,7 @@ " \n", " \n", " \n", - " 80579016969 \n", @@ -7882,7 +7869,7 @@ " \n", " \n", " \n", - " 843612 \n", @@ -7893,11 +7880,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1329.88091912 \n", " \n", " \n", @@ -7908,7 +7895,7 @@ " \n", " \n", " \n", - " 361210200 \n", @@ -7934,7 +7921,7 @@ " \n", " \n", " \n", - " 19120 \n", @@ -7947,7 +7934,7 @@ " \n", " \n", " \n", - " 10200637 \n", @@ -7960,9 +7947,9 @@ " \n", " \n", " \n", - " 11421329.4785.8809\n", " \n", " \n", @@ -7973,7 +7960,7 @@ " \n", " \n", " \n", - " 6378057901 \n", @@ -7984,11 +7971,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 6969 1200.8109\n", " \n", " \n", @@ -7999,9 +7986,9 @@ " \n", " \n", " \n", - " 120066.8109.8369\n", " \n", " \n", @@ -8012,7 +7999,7 @@ " \n", " \n", " \n", - " 084 \n", @@ -8025,7 +8012,7 @@ " \n", " \n", " \n", - " 4714016969 \n", @@ -8038,7 +8025,7 @@ " \n", " \n", " \n", - " 84212 \n", @@ -8049,11 +8036,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 78.2229112 \n", " \n", " \n", @@ -8064,7 +8051,7 @@ " \n", " \n", " \n", - " 212600 \n", @@ -8090,7 +8077,7 @@ " \n", " \n", " \n", - " 1120 \n", @@ -8103,7 +8090,7 @@ " \n", " \n", " \n", - " 60037 \n", @@ -8116,9 +8103,9 @@ " \n", " \n", " \n", - " 6678.8369.2229\n", " \n", " \n", @@ -8129,7 +8116,7 @@ " \n", " \n", " \n", - " 37471401 \n", @@ -8140,11 +8127,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 6969 70.2656\n", " \n", " \n", @@ -8155,9 +8142,9 @@ " \n", " \n", " \n", - " 701296983.2656.6835\n", " \n", " \n", @@ -8168,7 +8155,7 @@ " \n", " \n", " \n", - " 325205047 \n", @@ -8181,7 +8168,7 @@ " \n", " \n", " \n", - " 91476259202006 \n", @@ -8194,7 +8181,7 @@ " \n", " \n", " \n", - " 50472563200 \n", @@ -8205,11 +8192,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 715254.776832520 \n", " \n", " \n", @@ -8259,7 +8246,7 @@ " \n", " \n", " \n", - " 25632001530000 \n", @@ -8272,22 +8259,9 @@ " \n", " \n", " \n", - " 1296983715254.6835\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 1530000 .7768\n", " \n", " \n", @@ -8298,7 +8272,7 @@ " \n", " \n", " \n", - " 20069147625920 \n", @@ -8404,9 +8378,22 @@ " \n", " \n", " \n", + " \n", + " \n", + " 1163.6744\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " 086 \n", @@ -8419,7 +8406,7 @@ " \n", " \n", " \n", - " 77780006598 \n", @@ -8432,7 +8419,7 @@ " \n", " \n", " \n", - " 865500 \n", @@ -8443,11 +8430,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1302.68331600 \n", " \n", " \n", @@ -8458,7 +8445,7 @@ " \n", " \n", " \n", - " 55009600 \n", @@ -8484,7 +8471,7 @@ " \n", " \n", " \n", - " 16000 \n", @@ -8497,7 +8484,7 @@ " \n", " \n", " \n", - " 9600600 \n", @@ -8510,9 +8497,9 @@ " \n", " \n", " \n", - " 11631302.6744.6833\n", " \n", " \n", @@ -8523,7 +8510,7 @@ " \n", " \n", " \n", - " 6007778000 \n", @@ -8534,11 +8521,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 6598 1165.2821\n", " \n", " \n", @@ -8549,9 +8536,9 @@ " \n", " \n", " \n", - " 11651233.2821.4291\n", " \n", " \n", @@ -8562,7 +8549,7 @@ " \n", " \n", " \n", - " 086 \n", @@ -8575,7 +8562,7 @@ " \n", " \n", " \n", - " 82442406598 \n", @@ -8588,7 +8575,7 @@ " \n", " \n", " \n", - " 865830 \n", @@ -8599,11 +8586,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1380.78961696 \n", " \n", " \n", @@ -8614,7 +8601,7 @@ " \n", " \n", " \n", - " 583010176 \n", @@ -8640,7 +8627,7 @@ " \n", " \n", " \n", - " 16960 \n", @@ -8653,7 +8640,7 @@ " \n", " \n", " \n", - " 10176636 \n", @@ -8666,9 +8653,9 @@ " \n", " \n", " \n", - " 12331380.4291.7896\n", " \n", " \n", @@ -8679,7 +8666,7 @@ " \n", " \n", " \n", - " 6368244240 \n", @@ -8690,11 +8677,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 6598 1235.1382\n", " \n", " \n", @@ -8705,9 +8692,9 @@ " \n", " \n", " \n", - " 123569.1382.7546\n", " \n", " \n", @@ -8718,7 +8705,7 @@ " \n", " \n", " \n", - " 086 \n", @@ -8731,7 +8718,7 @@ " \n", " \n", " \n", - " 4662406598 \n", @@ -8744,7 +8731,7 @@ " \n", " \n", " \n", - " 86330 \n", @@ -8755,11 +8742,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 78.106796 \n", " \n", " \n", @@ -8770,7 +8757,7 @@ " \n", " \n", " \n", - " 330576 \n", @@ -8796,7 +8783,7 @@ " \n", " \n", " \n", - " 960 \n", @@ -8809,7 +8796,7 @@ " \n", " \n", " \n", - " 57636 \n", @@ -8822,9 +8809,9 @@ " \n", " \n", " \n", - " 6978.7546.1067\n", " \n", " \n", @@ -8835,7 +8822,7 @@ " \n", " \n", " \n", - " 36466240 \n", @@ -8846,11 +8833,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 6598 69.8561\n", " \n", " \n", @@ -8861,9 +8848,9 @@ " \n", " \n", " \n", - " 691297799.8561.3986\n", " \n", " \n", @@ -8874,7 +8861,7 @@ " \n", " \n", " \n", - " 328205202 \n", @@ -8887,7 +8874,7 @@ " \n", " \n", " \n", - " 86744911801482 \n", @@ -8900,7 +8887,7 @@ " \n", " \n", " \n", - " 52022563200 \n", @@ -8911,11 +8898,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 710175.653332820 \n", " \n", " \n", @@ -8965,7 +8952,7 @@ " \n", " \n", " \n", - " 25632001616400 \n", @@ -8978,22 +8965,9 @@ " \n", " \n", " \n", - " 1297799710175.3986\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 1616400 .6533\n", " \n", " \n", @@ -9004,7 +8978,7 @@ " \n", " \n", " \n", - " 14828674491180 \n", @@ -9110,9 +9084,22 @@ " \n", " \n", " \n", + " \n", + " \n", + " 1117.3114\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " 084 \n", @@ -9125,7 +9112,7 @@ " \n", " \n", " \n", - " 99072008783 \n", @@ -9138,7 +9125,7 @@ " \n", " \n", " \n", - " 84700 \n", @@ -9149,11 +9136,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1190.0945700 \n", " \n", " \n", @@ -9164,7 +9151,7 @@ " \n", " \n", " \n", - " 7009500 \n", @@ -9190,7 +9177,7 @@ " \n", " \n", " \n", - " 7000 \n", @@ -9203,7 +9190,7 @@ " \n", " \n", " \n", - " 9500600 \n", @@ -9216,9 +9203,9 @@ " \n", " \n", " \n", - " 11171190.3114.0945\n", " \n", " \n", @@ -9229,7 +9216,7 @@ " \n", " \n", " \n", - " 6009907200 \n", @@ -9240,11 +9227,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 8783 1121.3832\n", " \n", " \n", @@ -9255,9 +9242,9 @@ " \n", " \n", " \n", - " 11211186.3832.7582\n", " \n", " \n", @@ -9268,7 +9255,7 @@ " \n", " \n", " \n", - " 084 \n", @@ -9281,7 +9268,7 @@ " \n", " \n", " \n", - " 105229858783 \n", @@ -9294,7 +9281,7 @@ " \n", " \n", " \n", - " 84743 \n", @@ -9305,11 +9292,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1264.4637743 \n", " \n", " \n", @@ -9320,7 +9307,7 @@ " \n", " \n", " \n", - " 74310093 \n", @@ -9346,7 +9333,7 @@ " \n", " \n", " \n", - " 7430 \n", @@ -9359,7 +9346,7 @@ " \n", " \n", " \n", - " 10093637 \n", @@ -9372,9 +9359,9 @@ " \n", " \n", " \n", - " 11861264.7582.4637\n", " \n", " \n", @@ -9385,7 +9372,7 @@ " \n", " \n", " \n", - " 63710522985 \n", @@ -9396,11 +9383,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 8783 1191.0778\n", " \n", " \n", @@ -9411,9 +9398,9 @@ " \n", " \n", " \n", - " 119169.0778.4468\n", " \n", " \n", @@ -9424,7 +9411,7 @@ " \n", " \n", " \n", - " 084 \n", @@ -9437,7 +9424,7 @@ " \n", " \n", " \n", - " 6157858783 \n", @@ -9450,7 +9437,7 @@ " \n", " \n", " \n", - " 8443 \n", @@ -9461,11 +9448,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 74.369743 \n", " \n", " \n", @@ -9476,7 +9463,7 @@ " \n", " \n", " \n", - " 43593 \n", @@ -9502,7 +9489,7 @@ " \n", " \n", " \n", - " 430 \n", @@ -9515,7 +9502,7 @@ " \n", " \n", " \n", - " 59337 \n", @@ -9528,9 +9515,9 @@ " \n", " \n", " \n", - " 6974.4468.3697\n", " \n", " \n", @@ -9541,7 +9528,7 @@ " \n", " \n", " \n", - " 37615785 \n", @@ -9552,11 +9539,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 8783 69.6946\n", " \n", " \n", @@ -9567,9 +9554,9 @@ " \n", " \n", " \n", - " 691298507.6946.8538\n", " \n", " \n", @@ -9580,7 +9567,7 @@ " \n", " \n", " \n", - " 325806426 \n", @@ -9593,7 +9580,7 @@ " \n", " \n", " \n", - " 115138691402441 \n", @@ -9606,7 +9593,7 @@ " \n", " \n", " \n", - " 64262563200 \n", @@ -9617,11 +9604,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 713163.035632580 \n", " \n", " \n", @@ -9671,7 +9658,7 @@ " \n", " \n", " \n", - " 2563200234000 \n", @@ -9684,22 +9671,9 @@ " \n", " \n", " \n", - " 1298507713163.8538\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 234000 .0356\n", " \n", " \n", @@ -9710,7 +9684,7 @@ " \n", " \n", " \n", - " 244111513869140 \n", @@ -9816,9 +9790,22 @@ " \n", " \n", " \n", + " \n", + " \n", + " 1077.8669\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " 085 \n", @@ -9831,7 +9818,7 @@ " \n", " \n", " \n", - " 75289006900 \n", @@ -9844,7 +9831,7 @@ " \n", " \n", " \n", - " 851500 \n", @@ -9855,11 +9842,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1258.15641100 \n", " \n", " \n", @@ -9870,7 +9857,7 @@ " \n", " \n", " \n", - " 15009800 \n", @@ -9896,7 +9883,7 @@ " \n", " \n", " \n", - " 11000 \n", @@ -9909,7 +9896,7 @@ " \n", " \n", " \n", - " 9800600 \n", @@ -9922,9 +9909,9 @@ " \n", " \n", " \n", - " 10771258.8669.1564\n", " \n", " \n", @@ -9935,7 +9922,7 @@ " \n", " \n", " \n", - " 6007528900 \n", @@ -9946,11 +9933,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 6900 1103.9622\n", " \n", " \n", @@ -9961,9 +9948,9 @@ " \n", " \n", " \n", - " 11031144.9622.8477\n", " \n", " \n", @@ -9974,7 +9961,7 @@ " \n", " \n", " \n", - " 085 \n", @@ -9987,7 +9974,7 @@ " \n", " \n", " \n", - " 79967616900 \n", @@ -10000,7 +9987,7 @@ " \n", " \n", " \n", - " 851593 \n", @@ -10011,11 +9998,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1336.78151168 \n", " \n", " \n", @@ -10026,7 +10013,7 @@ " \n", " \n", " \n", - " 159310412 \n", @@ -10052,7 +10039,7 @@ " \n", " \n", " \n", - " 11680 \n", @@ -10065,7 +10052,7 @@ " \n", " \n", " \n", - " 10412637 \n", @@ -10078,9 +10065,9 @@ " \n", " \n", " \n", - " 11441336.8477.7815\n", " \n", " \n", @@ -10091,7 +10078,7 @@ " \n", " \n", " \n", - " 6377996761 \n", @@ -10102,11 +10089,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 6900 1172.5738\n", " \n", " \n", @@ -10117,9 +10104,9 @@ " \n", " \n", " \n", - " 117266.5738.9808\n", " \n", " \n", @@ -10130,7 +10117,7 @@ " \n", " \n", " \n", - " 085 \n", @@ -10143,7 +10130,7 @@ " \n", " \n", " \n", - " 4678616900 \n", @@ -10156,7 +10143,7 @@ " \n", " \n", " \n", - " 8593 \n", @@ -10167,11 +10154,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 78.625568 \n", " \n", " \n", @@ -10182,7 +10169,7 @@ " \n", " \n", " \n", - " 93612 \n", @@ -10208,7 +10195,7 @@ " \n", " \n", " \n", - " 680 \n", @@ -10221,7 +10208,7 @@ " \n", " \n", " \n", - " 61237 \n", @@ -10234,9 +10221,9 @@ " \n", " \n", " \n", - " 6678.9808.6255\n", " \n", " \n", @@ -10247,7 +10234,7 @@ " \n", " \n", " \n", - " 37467861 \n", @@ -10258,11 +10245,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 6900 68.6116\n", " \n", " \n", @@ -10273,9 +10260,9 @@ " \n", " \n", " \n", - " 681295318.6116.4567\n", " \n", " \n", @@ -10286,7 +10273,7 @@ " \n", " \n", " \n", - " 326404962 \n", @@ -10299,7 +10286,7 @@ " \n", " \n", " \n", - " 90477994202023 \n", @@ -10312,7 +10299,7 @@ " \n", " \n", " \n", - " 49622563200 \n", @@ -10323,11 +10310,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 714708.359532640 \n", " \n", " \n", @@ -10377,7 +10364,7 @@ " \n", " \n", " \n", - " 2563200922020 \n", @@ -10390,22 +10377,9 @@ " \n", " \n", " \n", - " 1295318714708.4567\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 922020 .3595\n", " \n", " \n", @@ -10416,7 +10390,7 @@ " \n", " \n", " \n", - " 20239047799420 \n", @@ -10522,9 +10496,22 @@ " \n", " \n", " \n", + " \n", + " \n", + " 1125.2109\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " 087 \n", @@ -10537,7 +10524,7 @@ " \n", " \n", " \n", - " 104037009159 \n", @@ -10550,7 +10537,7 @@ " \n", " \n", " \n", - " 871800 \n", @@ -10561,11 +10548,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1186.07232000 \n", " \n", " \n", @@ -10576,7 +10563,7 @@ " \n", " \n", " \n", - " 18009600 \n", @@ -10602,7 +10589,7 @@ " \n", " \n", " \n", - " 20000 \n", @@ -10615,7 +10602,7 @@ " \n", " \n", " \n", - " 9600600 \n", @@ -10628,9 +10615,9 @@ " \n", " \n", " \n", - " 11251186.2109.0723\n", " \n", " \n", @@ -10641,7 +10628,7 @@ " \n", " \n", " \n", - " 60010403700 \n", @@ -10652,11 +10639,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 9159 1142.3112\n", " \n", " \n", @@ -10667,9 +10654,9 @@ " \n", " \n", " \n", - " 11421195.3112.1494\n", " \n", " \n", @@ -10680,7 +10667,7 @@ " \n", " \n", " \n", - " 087 \n", @@ -10693,7 +10680,7 @@ " \n", " \n", " \n", - " 110503519159 \n", @@ -10706,7 +10693,7 @@ " \n", " \n", " \n", - " 871912 \n", @@ -10717,11 +10704,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 1260.19472125 \n", " \n", " \n", @@ -10732,7 +10719,7 @@ " \n", " \n", " \n", - " 191210200 \n", @@ -10758,7 +10745,7 @@ " \n", " \n", " \n", - " 21250 \n", @@ -10771,7 +10758,7 @@ " \n", " \n", " \n", - " 10200637 \n", @@ -10784,9 +10771,9 @@ " \n", " \n", " \n", - " 11951260.1494.1947\n", " \n", " \n", @@ -10797,7 +10784,7 @@ " \n", " \n", " \n", - " 63711050351 \n", @@ -10808,11 +10795,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 9159 1213.315\n", " \n", " \n", @@ -10823,9 +10810,9 @@ " \n", " \n", " \n", - " 121369.315.9385\n", " \n", " \n", @@ -10836,7 +10823,7 @@ " \n", " \n", " \n", - " 087 \n", @@ -10849,7 +10836,7 @@ " \n", " \n", " \n", - " 6466519159 \n", @@ -10862,7 +10849,7 @@ " \n", " \n", " \n", - " 87112 \n", @@ -10873,11 +10860,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 74.1228125 \n", " \n", " \n", @@ -10888,7 +10875,7 @@ " \n", " \n", " \n", - " 112600 \n", @@ -10914,7 +10901,7 @@ " \n", " \n", " \n", - " 1250 \n", @@ -10927,7 +10914,7 @@ " \n", " \n", " \n", - " 60037 \n", @@ -10940,9 +10927,9 @@ " \n", " \n", " \n", - " 6974.9385.1228\n", " \n", " \n", @@ -10953,7 +10940,7 @@ " \n", " \n", " \n", - " 37646651 \n", @@ -10964,11 +10951,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 9159 71.0038\n", " \n", " \n", @@ -10979,9 +10966,9 @@ " \n", " \n", " \n", - " 711294542.0038.8748\n", " \n", " \n", @@ -10992,7 +10979,7 @@ " \n", " \n", " \n", - " 325806666 \n", @@ -11005,7 +10992,7 @@ " \n", " \n", " \n", - " 119693434202580 \n", @@ -11018,7 +11005,7 @@ " \n", " \n", " \n", - " 66662563200 \n", @@ -11029,11 +11016,11 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " 717253.389632580 \n", " \n", " \n", @@ -11083,7 +11070,7 @@ " \n", " \n", " \n", - " 25632001184400 \n", @@ -11096,22 +11083,9 @@ " \n", " \n", " \n", - " 1294542717253.8748\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 1184400 .3896\n", " \n", " \n", @@ -11122,7 +11096,7 @@ " \n", " \n", " \n", - " 258011969343420 \n", @@ -11244,7 +11218,7 @@ "type: getml.DataFrame" ] }, - "execution_count": 9, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -11265,7 +11239,102 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 28, + "id": "f6750f14", + "metadata": {}, + "outputs": [], + "source": [ + "from getml_interpretations import (\n", + " ColumnDescriptionsReport,\n", + " generate_column_descriptions_report,\n", + ")\n", + "\n", + "column_descriptions_report_path = Path(\"column_descriptions_report.json\")\n", + "jaffle_shop_annotations = Path(\"annotations.yml\")\n", + "user_prompt = f\"\"\"\n", + "Please use the following annotations as source of truth for generating the\n", + "column descriptions report:\n", + "\n", + "{jaffle_shop_annotations.read_text()}.\n", + "\"\"\"\n", + "\n", + "if column_descriptions_report_path.exists():\n", + " column_descriptions_report = ColumnDescriptionsReport.from_json(\n", + " column_descriptions_report_path\n", + " )\n", + "else:\n", + " column_descriptions_report: ColumnDescriptionsReport = (\n", + " await generate_column_descriptions_report(\n", + " project_name=PROJECT_NAME,\n", + " pipeline=pipe,\n", + " container=container,\n", + " model=\"gpt-5-mini\",\n", + " user_prompt=user_prompt,\n", + " )\n", + " )\n", + " column_descriptions_report.to_json(column_descriptions_report_path)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "ac9c5ef1", + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "\n", + "from getml_interpretations import (\n", + " FeatureDescriptionsReport,\n", + " generate_feature_descriptions_report,\n", + ")\n", + "\n", + "feature_descriptions_report_path = Path(\"feature_descriptions_report.json\")\n", + "\n", + "user_prompt = \"\"\"\n", + "Feature descriptions are limited to max. 256 characters and 2-3 sentences.\n", + "Please ensure that each feature description does not exceed this limit.\n", + "Also no bullet points, new lines or line breaks etc.\n", + "Keep the descriptions concise, straight-forward and informative.\n", + "\"\"\"\n", + "\n", + "if feature_descriptions_report_path.exists():\n", + " feature_descriptions_report = FeatureDescriptionsReport.from_json(\n", + " feature_descriptions_report_path\n", + " )\n", + "else:\n", + " feature_descriptions_report: FeatureDescriptionsReport = (\n", + " await generate_feature_descriptions_report(\n", + " project_name=PROJECT_NAME,\n", + " pipeline=pipe,\n", + " container=container,\n", + " user_prompt=user_prompt,\n", + " model=\"gpt-5-mini\",\n", + " batch_size=20,\n", + " )\n", + " )\n", + " feature_descriptions_report.to_json(feature_descriptions_report_path)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19dcb7e1", + "metadata": {}, + "outputs": [], + "source": [ + "column_mapping = {\n", + " desc.name: desc.title\n", + " for desc in feature_descriptions_report.feature_descriptions.values()\n", + "}\n", + "\n", + "for old_name, new_name in column_mapping.items():\n", + " features_spark = features_spark.withColumnRenamed(old_name, new_name)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, "id": "0e25b455", "metadata": {}, "outputs": [ @@ -11275,45 +11344,82 @@ "DataFrame[]" ] }, - "execution_count": 10, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "spark.sql(\"DROP TABLE IF EXISTS workspace.getml_fs.getml_features\")\n", + "FEATURES_TABLE_FULL_NAME = \"workspace.getml_fs.getml_features_explained\"\n", + "spark.sql(f\"DROP TABLE IF EXISTS {FEATURES_TABLE_FULL_NAME}\")\n", "\n", "features_spark.write.format(\"delta\").mode(\"overwrite\").option(\n", " \"overwriteSchema\", \"true\"\n", - ").saveAsTable(\"workspace.getml_fs.getml_features\")\n", + ").saveAsTable(FEATURES_TABLE_FULL_NAME)\n", "\n", - "spark.sql(\"\"\"\n", - " ALTER TABLE workspace.getml_fs.getml_features\n", + "spark.sql(f\"\"\"\n", + " ALTER TABLE {FEATURES_TABLE_FULL_NAME}\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", + "FEATURES_TABLE_NAME = FEATURES_TABLE_FULL_NAME.split(\".\")[-1]\n", + "\n", + "spark.sql(f\"\"\"\n", + " ALTER TABLE {FEATURES_TABLE_FULL_NAME}\n", + " ADD CONSTRAINT {FEATURES_TABLE_NAME}_pk PRIMARY KEY(snapshot_id)\n", "\"\"\")" ] }, { "cell_type": "code", - "execution_count": 11, - "id": "e08b11a7", + "execution_count": 39, + "id": "02fabd6c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Updating description for column: reference_date\n", + "Updating description for column: store_id\n", + "Updating description for column: snapshot_id\n", + "Updating description for column: next_week_sales\n", + "Updating description for column: days_since_open\n", + "Updating description for column: next_week_orders\n", + "Updating description for column: store_id\n" + ] + } + ], + "source": [ + "for tables in column_descriptions_report.column_descriptions.values():\n", + " for column_name, column_description in tables.items():\n", + " if column_name in features_df.colnames:\n", + " # Escape single quotes to prevent SQL syntax errors\n", + " description = column_description.description.replace(\"'\", \"\\\\'\")\n", + " spark.sql(\n", + " f\"ALTER TABLE {FEATURES_TABLE_FULL_NAME} CHANGE COLUMN {column_name} COMMENT '{description}'\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "60f53f63", "metadata": {}, "outputs": [], "source": [ - "for feature in pipe.features:\n", + "for feature_description in feature_descriptions_report.feature_descriptions.values():\n", + " # Escape single quotes to prevent SQL syntax errors\n", + " description = feature_description.description.replace(\"'\", \"\\\\'\")\n", + " description_with_original_name = f\"({feature_description.name}) {description}\"\n", " spark.sql(\n", - " f\"ALTER TABLE workspace.getml_fs.getml_features CHANGE COLUMN {feature.name} COMMENT '{feature.sql}'\"\n", - " )" + " f\"ALTER TABLE {FEATURES_TABLE_FULL_NAME} CHANGE COLUMN {feature_description.title} COMMENT '{description_with_original_name}'\"\n", + " )\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "id": "9e07629d", "metadata": {}, "outputs": [ @@ -11322,66 +11428,66 @@ "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", + "|col_name |data_type|comment |\n", + "+-------------------------------+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "|store_id |string |NULL |\n", + "|snapshot_id |string |NULL |\n", + "|avg_subtotal_30d |double |Computes the average order subtotal across all transactions for the same store observed up to the snapshot date, restricted to the recent 30‑day memory window. Implemented by joining transaction rows on store identifier and averaging the subtotal values for orders with ordered_at ≤ reference_date (and within the 30‑day truncation). Captures recent typical order size [monetary, e.g., USD?]; useful as a proxy for average basket value. Low correlation with the target in this model, so treat as a secondary signal and verify monetary units and scaling before use. |\n", + "|distinct_subtotal_count_30d |double |Counts the number of distinct subtotal amounts observed for the store in the 30‑day window prior to the snapshot. Built via a grouped join on store_id and distinct counting of the subtotal field for orders up to reference_date. Serves as a measure of heterogeneity in order sizes (higher counts indicate more variety in basket sizes) [count]. Shows modest positive correlation with the target here; consider as a diversity/variability indicator rather than a direct revenue estimate. |\n", + "|duplicate_subtotal_count_30d |double |Measures how many order subtotals repeat by computing total order count minus distinct subtotal count within the 30‑day window. Derived from joined order rows for the store up to the snapshot date, it highlights frequency of repeated identical subtotals (e.g., common basket sizes or recurring order templates) [count]. Highly correlated with revenue-related aggregates in this dataset — may capture promotional or repeated-order behavior — but could be redundant with total/count features, so check multicollinearity before including in parsimonious models. |\n", + "|first_subtotal_30d |double |Selects the subtotal value of the earliest order in the 30‑day lookback (earliest ordered_at ≤ reference_date). Computed by joining orders to the snapshot and choosing the first subtotal by timestamp. Provides a simple recency-ordered snapshot of an older order within the window [monetary, e.g., USD?]; useful to detect shifts in basket size over the window when compared with the latest value. Low predictive contribution on its own in this model, but can be informative in combination with last/avg measures. |\n", + "|last_subtotal_30d |double |Returns the subtotal of the most recent order before the snapshot within the 30‑day memory window (latest ordered_at ≤ reference_date). Obtained by joining transaction rows on store_id and selecting the value associated with the maximum timestamp. Acts as a short-term recency indicator of order size [monetary, e.g., USD?]; in this dataset it has a modest negative correlation with the target, so consider using alongside aggregates (sum/avg) to capture trend and recent shifts. |\n", + "|max_subtotal_30d |double |Returns the maximum subtotal observed in the 30‑day window preceding the snapshot for the given store. Calculated by grouping joined orders (by store) and taking the maximum subtotal for orders with ordered_at ≤ reference_date. Captures occasional large baskets or outlier transactions [monetary, e.g., USD?]; can identify high-value events but may be sensitive to single outliers, so robustify (winsorize) or pair with median/stddev for stability. |\n", + "|median_subtotal_30d |double |Computes the median subtotal among all orders for the store in the 30‑day lookback prior to the snapshot. Built from joined orders filtered by timestamp and grouped by snapshot row. Provides a robust central tendency of order size that is less influenced by outliers than the mean [monetary, e.g., USD?]. In cases with many identical small orders the median can be more stable and useful than mean-based signals. |\n", + "|min_subtotal_30d |double |Returns the minimum observed subtotal among orders up to the snapshot within the 30‑day memory window. Computed by grouping joined transactions on store_id and taking the minimum subtotal where ordered_at ≤ reference_date. Indicates the floor of observed basket values [monetary, e.g., USD?]; often 0 for refunded or zero-value orders and so should be interpreted with caution (treat zeros separately if they indicate returns/cancellations). |\n", + "|mode_subtotal_30d |double |Selects the most frequent subtotal value within the 30‑day window ending at the snapshot. Implemented by grouping orders for the store and returning the modal subtotal among orders with ordered_at ≤ reference_date. Useful to detect a common basket size (e.g., a menu item or standardized purchase) [monetary, e.g., USD?]; modal values can be informative for understanding typical transaction patterns but may be non-unique or unstable for small samples. |\n", + "|stddev_subtotal_30d |double |Computes the standard deviation of order subtotals across the 30‑day lookback prior to the snapshot. Produced by aggregating joined order rows for the store and calculating sample dispersion of the subtotal field for orders with ordered_at ≤ reference_date. Captures variability in basket sizes [monetary dispersion]; negatively correlated with the target in this model, indicating that higher variability in subtotals within the window is associated with lower next‑week sales here — could reflect inconsistent demand or mixed transaction types. |\n", + "|sum_subtotal_30d |double |Sums all order subtotals for the store within the 30‑day window leading up to the snapshot (orders with ordered_at ≤ reference_date). Implemented via a grouped join on store_id and summation of the subtotal field. Acts as a recent-revenue proxy over the month‑to‑date period [monetary, e.g., USD?] and is highly correlated with the target in this dataset — one of the stronger historical revenue signals. Validate units/scaling and beware redundancy with other sum/count features. |\n", + "|trend_subtotal_30d |double |Estimates a trend coefficient of subtotal values versus recency by regressing subtotal on time‑difference (reference_date − ordered_at) within the 30‑day window. Computed using a trend aggregation on joined orders for the store and captures whether average basket sizes are increasing or decreasing as orders approach the snapshot [trend in monetary units per time]. Use to detect momentum in order value; implementation specifics of the TREND operator (slope units and normalization) should be reviewed before interpretation. |\n", + "|avg_order_total_30d |double |Calculates the average full order amount (order_total) for transactions in the 30‑day lookback prior to the snapshot. Built by joining orders on store_id and averaging order_total for orders with ordered_at ≤ reference_date. Serves as an AOV-style indicator that includes taxes/fees [monetary, e.g., USD?]; can complement subtotal-based signals where fees or rounding matter. Has modest predictive value and should be checked for unit consistency. |\n", + "|distinct_order_total_count_30d |double |Counts distinct values of the full order amount (order_total) observed for the store in the 30‑day window preceding the snapshot. Computed via grouped join and distinct counting of order_total for orders ≤ reference_date. Indicates variability in final charged amounts (including taxes/fees) [count]; useful as a complement to subtotal distinct counts to detect pricing or fee heterogeneity. |\n", + "|duplicate_order_total_count_30d|double |Quantifies repeated identical full-order amounts by taking the total count of orders minus the number of distinct order_total values within the 30‑day window. Derived from joined transactions filtered by timestamp; highlights repeated standardized charges or frequent identical purchases [count]. Highly correlated with total/order-sum aggregates in this dataset, so evaluate redundancy and potential collinearity when using together with sum/count features. |\n", + "|first_order_total_30d |double |Returns the order_total associated with the earliest transaction in the 30‑day lookback prior to the snapshot. Obtained by joining orders on store_id and selecting the first value by ordered_at ≤ reference_date. Can serve as a baseline older-order amount to compare against the most recent order (useful for short‑term trend detection) [monetary, e.g., USD?]. |\n", + "|last_order_total_30d |double |Provides the order_total for the most recent transaction before the snapshot within the 30‑day memory window. Computed via grouped join selecting the last order_total by timestamp. Acts as a short‑term recency indicator of final charged amounts [monetary, e.g., USD?] and shows modest negative correlation with next‑week sales in this model; combine with aggregate signals for richer interpretation. |\n", + "|max_order_total_30d |double |Returns the maximum observed final order amount for the store within the 30‑day window before the snapshot. Calculated by grouping joined orders and taking the maximum order_total for orders with ordered_at ≤ reference_date. Captures one-off large transactions or high-value baskets [monetary, e.g., USD?]; sensitive to outliers and should be interpreted with supporting robust statistics (median/stddev). |\n", + "|median_order_total_30d |double |Computes the median of order_total values across the 30‑day lookback window for the store. Obtained from joined order rows filtered by timestamp and grouped by snapshot. Provides a robust central tendency for final amounts paid [monetary, e.g., USD?]; useful when distributions are skewed by a few very large or zero-value orders. |\n", + "|min_order_total_30d |double |Returns the minimum final order amount observed in the 30‑day window up to the snapshot. Computed by grouping orders for the store and taking the minimum order_total among orders with ordered_at ≤ reference_date. Identifies floor values which may indicate low‑value, zero, or refunded transactions [monetary, e.g., USD?]; interpret zeros carefully and consider excluding refunds or cancellations if they are not predictive of future sales. |\n", + "|mode_order_total |double |Most frequently observed order_total value from transactions for the store in the lookback window ending at the snapshot. Computed by finding the modal order amount across orders joined to the weekly snapshot (orders where ordered_at <= reference_date and within the 30‑day memory window). Captures the typical single-order charge [USD]. Shows a modest negative relationship with the target (corr ≈ -0.25), so it can act as a simple measure of the common order size when predicting weekly revenue. Use as a robust central-value indicator; be careful when many orders share identical amounts (ties) or when monetary units need validation. |\n", + "|stddev_order_total |double |Statistical dispersion of order_total within the recent transactional history for the store. Calculated as the standard deviation of order amount across orders joined to each weekly snapshot (orders up to reference_date and limited by the 30‑day memory). Measures variability in order sizes [USD]. Has a relatively strong negative correlation with the target (corr ≈ -0.58), indicating that higher variability in recent order amounts is associated with lower next‑week sales in this dataset. Useful to capture heterogeneity of purchase behavior; consider scaling or robustifying if outliers exist. |\n", + "|sum_order_total |double |Total of order_total across all transactions for the store in the lookback window up to the snapshot. Computed by summing order amounts for orders where ordered_at <= reference_date (and within the configured 30‑day memory). Represents recent realized revenue flow from transactions [USD]. Very strongly positively correlated with the target (corr ≈ 0.98) and among the more important aggregate predictors, so it effectively acts like a short‑term revenue history signal. Verify units and aggregation horizon before use (large magnitudes may require normalization). |\n", + "|trend_order_total |double |Slope-like trend of order_total as a function of recency relative to the snapshot. Computed using a TREND aggregation that regresses order amount on (reference_date - ordered_at) for orders up to the snapshot (30‑day window), producing a measure of whether recent orders are increasing or decreasing in size over time [USD per day]. Indicates short-term directionality in per-order value; weakly negatively correlated with the target here. Use to capture momentum in order sizes (rising/falling AOV) but interpret scale cautiously (depends on time units used in the TREND computation). |\n", + "|avg_tax_paid |double |Average tax amount charged per order in the recent lookback for the store. Computed as the mean of tax_paid over orders joined to the weekly snapshot (orders up to reference_date and within the 30‑day memory). Serves as a proxy for typical tax per transaction and, indirectly, per-order dollar size [USD]. Shows a moderate negative correlation with the target (corr ≈ -0.22). Useful as an auxiliary monetary feature; check for zeros and tax regime changes which can shift interpretation. |\n", + "|count_distinct_tax_paid |double |Number of unique tax_paid values observed in the recent transactions for the store. Computed by counting distinct tax amounts among orders up to the snapshot (30‑day window). Acts as a measure of tax-value diversity across orders [count]. Can indicate whether transactions have heterogeneous tax items (e.g., varied item mixes or rounding effects). Low direct importance here but useful for data‑quality checks (many identical zeros or a small distinct set). |\n", + "|repeated_tax_value_count |double |Count of non-unique tax_paid occurrences in the lookback (total orders minus distinct tax values). Calculated as COUNT(tax_paid) - COUNT(DISTINCT tax_paid) for orders up to the snapshot within the 30‑day window. Captures the degree to which the same tax amounts repeat across transactions [count]. May reflect standardized pricing/rounding or a dominance of similar order types; interpret alongside total order count and distinct counts. Confidence in interpretation is slightly lower because the business meaning depends on why tax values repeat. |\n", + "|first_tax_paid |double |Tax amount of the earliest transaction (by ordered_at) included in the lookback window for the snapshot. Computed using FIRST(tax_paid, ordered_at) over orders where ordered_at <= reference_date and within the 30‑day memory. Provides a recency-ordered snapshot of initial tax values in the window [USD]. Useful when earliest behavior (start of the window) matters for trend or seasonality checks; treat as descriptive rather than a primary predictive signal in isolation. |\n", + "|last_tax_paid |double |Tax amount from the most recent transaction (by ordered_at) before the snapshot. Computed using LAST(tax_paid, ordered_at) across orders up to reference_date within the 30‑day window. Reflects the latest tax charged and can capture recent shifts in order composition or pricing [USD]. Shows modest negative correlation with the target; combine with averages or sums for more stable signals. |\n", + "|max_tax_paid |double |Largest tax_paid observed across transactions in the lookback window for the store. Computed as the maximum tax amount for orders up to reference_date (30‑day memory). Highlights unusually large tax line items which may correspond to large orders or data issues [USD]. Negative correlation with the target here suggests isolated large-tax orders do not necessarily imply higher next‑week revenue; inspect outliers before using directly. |\n", + "|median_tax_paid |double |Median tax amount among recent transactions for the store. Obtained via MEDIAN aggregation over tax_paid for orders where ordered_at <= reference_date in the 30‑day memory. Provides a robust center measure less sensitive to outliers than the mean [USD]. Useful for capturing the typical tax experienced per order; use together with average and sum to separate scale from skewness. |\n", + "|min_tax_paid |double |Smallest tax amount observed across orders in the lookback window. Calculated as the minimum tax_paid among orders up to the snapshot (30‑day memory). Useful to detect zero‑tax transactions or unusually low tax lines that may indicate refunds, exemptions, or data anomalies [USD]. Interpret in context of count/sum features to avoid overemphasizing rare values. |\n", + "|mode_tax_paid |double |Most common tax_paid amount in the recent transaction history for the store. Computed as the modal tax value across orders up to reference_date within the 30‑day window. Acts as a simple indicator of the typical tax bucket applied to most orders [USD]. Helpful for quickly identifying the dominant tax bracket or rounding pattern; combine with distributional features to assess heterogeneity. |\n", + "|stddev_tax_paid |double |Standard deviation of tax_paid across recent transactions for the store. Computed over orders up to the snapshot within the 30‑day memory window. Measures variability in tax amounts [USD]. The negative correlation (corr ≈ -0.32) implies that greater variability in tax lines aligns with lower next‑week sales in this dataset. Use to quantify stability of tax-related order behavior and as an input to detect mix changes. |\n", + "|sum_tax_paid |double |Total tax charged across all transactions in the lookback window for the store. Computed by summing tax_paid for orders with ordered_at <= reference_date (30‑day memory). Acts as a partial proxy for recent revenue volume (since tax scales with order_total) and shows moderate positive correlation with the target (corr ≈ 0.54). Useful when combined with order counts to derive average tax or to cross-check revenue aggregates [USD]. |\n", + "|trend_tax_paid |double |Trend measure of tax_paid over recency in the lookback window relative to the snapshot. Computed with the TREND aggregation that relates tax amount to (reference_date - ordered_at) for orders up to the snapshot (30‑day window), producing a directional indicator of whether tax amounts are increasing or decreasing over time [USD per day]. Useful to capture momentum in order composition or price/tax changes, but interpret magnitude cautiously because it depends on time unit normalization. |\n", + "|avg_recency_days |double |Average elapsed time between each transaction and the snapshot (reference_date) across recent orders. Calculated as the mean of (reference_date - ordered_at) for orders up to the snapshot within the 30‑day window [days]. Captures average recency of activity: higher values mean the window contains older orders on average. Moderately negatively correlated with the target (corr ≈ -0.26), indicating that fresher recent activity tends to align with higher next‑week sales. Useful for measuring recency-driven demand signals. |\n", + "|count_distinct_recency |double |Number of distinct recency values (reference_date - ordered_at) among transactions in the lookback window. Computed by counting distinct time differences for orders up to the snapshot within the 30‑day memory [count of distinct days/intervals]. Reflects temporal diversity of order timestamps (e.g., many distinct recency values implies frequent ordering at different days); highly correlated with other recency/volume aggregates and useful to quantify order-timing richness. |\n", + "|repeated_recency_count |double |Number of non-unique recency occurrences in the lookback (total recency counts minus distinct recency counts). Computed as COUNT(reference_date - ordered_at) - COUNT(DISTINCT reference_date - ordered_at) across orders up to the snapshot (30‑day window). Quantifies how often identical recency intervals repeat (e.g., multiple orders on the same day) [count]. Useful to capture clumping of orders in time (burstiness); interpret together with total order count and average recency. |\n", + "|first_recency_days |double |Recency (reference_date - ordered_at) of the earliest transaction inside the lookback window, selected by ordering on ordered_at. Computed using FIRST(reference_date - ordered_at, ordered_at) for orders where ordered_at <= reference_date and within the 30‑day memory. Represents how far back the earliest included order lies relative to the snapshot [days]. Use to detect window edge behavior (e.g., whether the window contains very stale or very recent first events); interpret alongside average and min recency. |\n", + "|last_order_age |double |Computes the age of the most recent order prior to the snapshot by taking the time difference between the snapshot timestamp and the latest order timestamp within the 30‑day lookback. Implemented by joining the snapshot row to transactions via store_id, filtering orders to ordered_at <= reference_date and within the 30‑day memory window, and returning the last (most recent) reference_date - ordered_at value. Captures short‑term recency of activity [time delta]. Distribution (train avg ≈ 32,695; min ≈ 32,460; max ≈ 35,280) reflects the dataset's timestamp units — interpret units with caution (see usage guidance). Negative relationship with weekly revenue in the model (moderate negative correlation ≈ -0.257), indicating that more recent last orders (smaller values) tend to accompany higher next‑week sales. Use as a recency indicator; verify the time-unit convention (seconds vs. days) before interpretation or scaling, and keep the 30‑day window in mind when comparing across snapshots.|\n", + "|max_order_age |double |Returns the maximum time difference between the snapshot timestamp and any order timestamp within the 30‑day lookback (i.e., the oldest order in the window) by joining snapshots to orders on store_id and grouping per snapshot. Acts as a measure of how stale the earliest recent transaction is within the memory window [time delta]. Observed correlation with next‑week revenue is small-to-moderate positive (≈ 0.139) and importance in the model is negligible, suggesting limited direct predictive value alone. Use to detect presence of long gaps inside the 30‑day window (data quality / activity pattern signal); confirm time-unit semantics before combining with other time features. |\n", + "|median_order_age |double |Computes the median time elapsed between the snapshot timestamp and orders within the 30‑day lookback by joining population rows to transaction rows and taking the median of reference_date - ordered_at per snapshot [time delta]. Provides a robust central measure of recency that is less sensitive to outliers than min/max. Shows a modest negative correlation with next‑week sales (≈ -0.160), indicating that snapshots with generally more recent orders tend to have higher future sales. Useful as a stable recency metric for feature sets or as an input to segmentation (active vs. inactive recent windows). |\n", + "|min_order_age |double |Returns the smallest time difference between the snapshot timestamp and any order timestamp in the 30‑day lookback (i.e., the most recent order offset), computed via a join on store_id and grouped per snapshot [time delta]. Acts as a direct indicator of whether an order occurred immediately before the snapshot. Demonstrates a modest negative association with next‑week revenue (similar sign to other recency measures). Use together with counts and interval metrics to distinguish an isolated recent order from sustained activity. |\n", + "|mode_order_age |double |Identifies the most frequently occurring time-difference between snapshot and order timestamps within the 30‑day lookback (mode of reference_date - ordered_at) after joining snapshots to orders on store_id. Acts as a measure of the dominant recency bucket (common inter-event timing) in the snapshot's recent history [time delta]. Low direct importance to the model (small correlation), but can reveal regular cadence in ordering behavior (e.g., daily vs weekly peaks). Interpret with caution when the distribution is multimodal or when counts are low. |\n", + "|stddev_order_age |double |Measures variability of order ages within the 30‑day lookback by computing the standard deviation of reference_date - ordered_at per snapshot after joining on store_id. Captures dispersion in transaction recency (consistent vs. bursty ordering patterns) [time delta]. Very small observed relationship with next‑week sales in this model (near-zero correlation), but useful for characterizing volatility in recent activity and for interaction with count-based features (e.g., high variability + high count implies bursty demand). |\n", + "|sum_order_ages |double |Sums the time differences between the snapshot timestamp and each order timestamp within the 30‑day memory window (i.e., aggregate of reference_date - ordered_at across orders for the snapshot) after joining on store_id. Because the sum scales with both the number of orders and their ages, it implicitly mixes frequency and recency signals [time delta × count]. It shows a strong positive correlation with next‑week revenue in the dataset (≈ 0.956) — this may be due to implicit coupling with order counts or other aggregate volume signals. Use with care: disentangle count vs. age effects (e.g., pair with explicit order count or average inter-order interval) and normalize units appropriately before interpretation. |\n", + "|trend_order_age |double |Computed as a TREND over the per-order age values (reference_date - ordered_at) within the 30‑day window. The SQL uses the age as both the series and the time axis, producing a slope-like statistic for how order ages change across the window. Implementation details and unit semantics are dataset-dependent and the operation as generated is not straightforward to interpret without inspecting raw values and TREND definition in the feature engine. Because of that ambiguity, there is no meaningful observed relationship with the target in this run. Not enough context to fully interpret numeric units or edge cases for this transform. |\n", + "|avg_inter_order_interval |double |Estimates the average time between consecutive orders inside the 30‑day lookback: when more than one order exists, it divides (latest_order_time - earliest_order_time) by (count - 1); otherwise returns 0. Computed by joining snapshots to orders on store_id and grouping per snapshot. Represents mean inter-order interval [time delta / gap] and is a direct timing-frequency metric. Strong negative correlation with next‑week revenue (≈ -0.950) indicates that shorter average intervals (more frequent orders) are associated with higher upcoming weekly sales. Use as a primary activity-frequency indicator; confirm time units (seconds/days) and handle single-order cases as designed. |\n", + "|orders_count |double |Counts the number of orders for the store within the 30‑day lookback by joining snapshots to transaction rows on store_id and grouping per snapshot [count]. This is a straightforward activity-volume metric and shows a very strong positive association with next‑week revenue (high correlation ≈ 0.965), reflecting that recent order volume is a primary driver of weekly sales. Use as a core predictor (or baseline) for revenue forecasts; ensure the lookback window and filtering rules match production logic to avoid leakage. |\n", + "|days_since_open |double |Represents the number of days elapsed between the store opening date and the snapshot date at the population level [days]. Captures store maturity effects (growth or stabilization over time). Distribution shows wide spread across splits (train avg ≈ 577 days; test avg ≈ 1,490 days) and a moderate positive relationship with next‑week revenue (correlation ≈ 0.35). Useful as a structural feature to capture lifecycle and baseline demand differences between newer and established stores. |\n", + "|next_week_orders |double |Provides the order count for the upcoming week at the population snapshot level [count]. In this model run it is the dominant predictor of weekly revenue (very high importance ≈ 0.965 and correlation ≈ 0.989), indicating the target is largely driven by expected order volume. Critical usage guidance: verify whether this value is available at inference time (it may be a forecast from a separate model or a future-derived value). If it is derived from future ground-truth, it represents data leakage and must be removed or replaced with a legitimately forecasted input in production. When legitimately available (predicted externally), it can be used in a two-stage pipeline (forecast orders → forecast sales). |\n", + "|next_week_sales |double |NULL |\n", + "|reference_date |timestamp|NULL |\n", + "+-------------------------------+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", "\n" ] } @@ -11389,7 +11495,7 @@ "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" + "spark.sql(f\"DESCRIBE TABLE {FEATURES_TABLE_FULL_NAME}\").show(100, truncate=False)\n" ] } ], diff --git a/integration/databricks/notebooks/databricks_feature_store.py b/integration/databricks/notebooks/databricks_feature_store.py index 0fb6e45..d3469a6 100644 --- a/integration/databricks/notebooks/databricks_feature_store.py +++ b/integration/databricks/notebooks/databricks_feature_store.py @@ -33,15 +33,20 @@ # ## Setup and Data Loading # %% +from pathlib import Path + import getml from databricks.connect import DatabricksSession -getml.set_project("databricks_feature_store") +PROJECT_NAME = "databricks_feature_store" + +getml.set_project(PROJECT_NAME) # %% spark = DatabricksSession.builder.serverless().getOrCreate() # %% +# Load population table weekly_sales_by_store_spark = spark.table( "workspace.prepared.weekly_sales_by_store_with_target" ) @@ -50,7 +55,7 @@ weekly_sales_by_store_spark.toArrow(), name="weekly_sales_by_store" ) -# # Load orders table +# Load peripheral table orders_spark = spark.table("workspace.raw.raw_orders") orders = getml.DataFrame.from_arrow(orders_spark.toArrow(), name="orders") @@ -150,8 +155,12 @@ container.add( orders=orders, ) -# container.save() -# getml.project.data_frames.save() + +getml.project.data_frames.save() +container.save() + +# %% +container._id # %% [markdown] # ## Training @@ -172,16 +181,11 @@ ) pipe.fit(container.train) +pipe.score(container.test) # %% -# predictions = pipe.predict(container.test) - -# # Calculate metrics -# scores = pipe.score(container.test) -# scores - -# %% -pipe = getml.pipeline.load("CzNABb") +# container = getml.data.load_container("uzNVUz") +# pipe = getml.pipeline.load("2aj2Dm") # %% [markdown] # ## Feature Export @@ -200,30 +204,123 @@ features_df # %% -spark.sql("DROP TABLE IF EXISTS workspace.getml_fs.getml_features") +from getml_interpretations import ( + ColumnDescriptionsReport, + generate_column_descriptions_report, +) + +column_descriptions_report_path = Path("column_descriptions_report.json") +jaffle_shop_annotations = Path("annotations.yml") +user_prompt = f""" +Please use the following annotations as source of truth for generating the +column descriptions report: + +{jaffle_shop_annotations.read_text()}. +""" + +if column_descriptions_report_path.exists(): + column_descriptions_report = ColumnDescriptionsReport.from_json( + column_descriptions_report_path + ) +else: + column_descriptions_report: ColumnDescriptionsReport = ( + await generate_column_descriptions_report( + project_name=PROJECT_NAME, + pipeline=pipe, + container=container, + model="gpt-5-mini", + user_prompt=user_prompt, + ) + ) + column_descriptions_report.to_json(column_descriptions_report_path) + + +# %% +from pathlib import Path + +from getml_interpretations import ( + FeatureDescriptionsReport, + generate_feature_descriptions_report, +) + +feature_descriptions_report_path = Path("feature_descriptions_report.json") + +user_prompt = """ +Feature descriptions are limited to max. 256 characters and 2-3 sentences. +Please ensure that each feature description does not exceed this limit. +Also no bullet points, new lines or line breaks etc. +Keep the descriptions concise, straight-forward and informative. +""" + +if feature_descriptions_report_path.exists(): + feature_descriptions_report = FeatureDescriptionsReport.from_json( + feature_descriptions_report_path + ) +else: + feature_descriptions_report: FeatureDescriptionsReport = ( + await generate_feature_descriptions_report( + project_name=PROJECT_NAME, + pipeline=pipe, + container=container, + user_prompt=user_prompt, + model="gpt-5-mini", + batch_size=20, + ) + ) + feature_descriptions_report.to_json(feature_descriptions_report_path) + +# %% +column_mapping = { + desc.name: desc.title + for desc in feature_descriptions_report.feature_descriptions.values() +} + +for old_name, new_name in column_mapping.items(): + features_spark = features_spark.withColumnRenamed(old_name, new_name) + + +# %% +FEATURES_TABLE_FULL_NAME = "workspace.getml_fs.getml_features_explained" +spark.sql(f"DROP TABLE IF EXISTS {FEATURES_TABLE_FULL_NAME}") features_spark.write.format("delta").mode("overwrite").option( "overwriteSchema", "true" -).saveAsTable("workspace.getml_fs.getml_features") +).saveAsTable(FEATURES_TABLE_FULL_NAME) -spark.sql(""" - ALTER TABLE workspace.getml_fs.getml_features +spark.sql(f""" + ALTER TABLE {FEATURES_TABLE_FULL_NAME} 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) +FEATURES_TABLE_NAME = FEATURES_TABLE_FULL_NAME.split(".")[-1] + +spark.sql(f""" + ALTER TABLE {FEATURES_TABLE_FULL_NAME} + ADD CONSTRAINT {FEATURES_TABLE_NAME}_pk PRIMARY KEY(snapshot_id) """) # %% -for feature in pipe.features: +for tables in column_descriptions_report.column_descriptions.values(): + for column_name, column_description in tables.items(): + if column_name in features_df.colnames: + # Escape single quotes to prevent SQL syntax errors + description = column_description.description.replace("'", "\\'") + spark.sql( + f"ALTER TABLE {FEATURES_TABLE_FULL_NAME} CHANGE COLUMN {column_name} COMMENT '{description}'" + ) + +# %% +for feature_description in feature_descriptions_report.feature_descriptions.values(): + # Escape single quotes to prevent SQL syntax errors + description = feature_description.description.replace("'", "\\'") + description_with_original_name = f"({feature_description.name}) {description}" spark.sql( - f"ALTER TABLE workspace.getml_fs.getml_features CHANGE COLUMN {feature.name} COMMENT '{feature.sql}'" + f"ALTER TABLE {FEATURES_TABLE_FULL_NAME} CHANGE COLUMN {feature_description.title} COMMENT '{description_with_original_name}'" ) + # %% # Verify the Feature Table was created print("Table schema:") -spark.sql("DESCRIBE TABLE workspace.getml_fs.getml_features").show(100, truncate=False) +spark.sql(f"DESCRIBE TABLE {FEATURES_TABLE_FULL_NAME}").show(100, truncate=False) diff --git a/integration/databricks/notebooks/feature_descriptions_report.json b/integration/databricks/notebooks/feature_descriptions_report.json new file mode 100644 index 0000000..a49ad20 --- /dev/null +++ b/integration/databricks/notebooks/feature_descriptions_report.json @@ -0,0 +1,734 @@ +{ + "features": { + "feature_1_1": { + "name": "feature_1_1", + "index": 0, + "target": "next_week_sales", + "importance": 0.0016220259088300607, + "correlation": -0.007932532921587966, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_1\";\n\nCREATE TABLE \"FEATURE_1_1\" AS\nSELECT AVG( 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;" + }, + "feature_1_2": { + "name": "feature_1_2", + "index": 1, + "target": "next_week_sales", + "importance": 0.000022890544815615405, + "correlation": 0.24344268179234033, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_2\";\n\nCREATE TABLE \"FEATURE_1_2\" AS\nSELECT COUNT( DISTINCT 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;" + }, + "feature_1_3": { + "name": "feature_1_3", + "index": 2, + "target": "next_week_sales", + "importance": 0.0001987396280832341, + "correlation": 0.9653679314249123, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_3\";\n\nCREATE TABLE \"FEATURE_1_3\" AS\nSELECT COUNT( t2.\"subtotal\" ) - 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;" + }, + "feature_1_4": { + "name": "feature_1_4", + "index": 3, + "target": "next_week_sales", + "importance": 0.00006465506945253373, + "correlation": -0.0007336477628100011, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_4\";\n\nCREATE TABLE \"FEATURE_1_4\" AS\nSELECT FIRST( t2.\"subtotal\", t2.\"ordered_at\" ) 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;" + }, + "feature_1_5": { + "name": "feature_1_5", + "index": 4, + "target": "next_week_sales", + "importance": 0.00002031052956299087, + "correlation": -0.22789566519580387, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_5\";\n\nCREATE TABLE \"FEATURE_1_5\" AS\nSELECT LAST( 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;" + }, + "feature_1_6": { + "name": "feature_1_6", + "index": 5, + "target": "next_week_sales", + "importance": 0.00002454117712436059, + "correlation": -0.08743340977226723, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_6\";\n\nCREATE TABLE \"FEATURE_1_6\" AS\nSELECT MAX( 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;" + }, + "feature_1_7": { + "name": "feature_1_7", + "index": 6, + "target": "next_week_sales", + "importance": 0.0, + "correlation": 0.0, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_7\";\n\nCREATE TABLE \"FEATURE_1_7\" AS\nSELECT MEDIAN( t2.\"subtotal\" ) 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;" + }, + "feature_1_8": { + "name": "feature_1_8", + "index": 7, + "target": "next_week_sales", + "importance": 0.0, + "correlation": 0.0, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_8\";\n\nCREATE TABLE \"FEATURE_1_8\" AS\nSELECT MIN( 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;" + }, + "feature_1_9": { + "name": "feature_1_9", + "index": 8, + "target": "next_week_sales", + "importance": 0.0, + "correlation": 0.0, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_9\";\n\nCREATE TABLE \"FEATURE_1_9\" AS\nSELECT MODE( 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;" + }, + "feature_1_10": { + "name": "feature_1_10", + "index": 9, + "target": "next_week_sales", + "importance": 0.000060791898434359936, + "correlation": -0.5321045343016308, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_10\";\n\nCREATE TABLE \"FEATURE_1_10\" AS\nSELECT STDDEV( 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;" + }, + "feature_1_11": { + "name": "feature_1_11", + "index": 10, + "target": "next_week_sales", + "importance": 0.010992461100171538, + "correlation": 0.9738315473174026, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_11\";\n\nCREATE TABLE \"FEATURE_1_11\" AS\nSELECT SUM( 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;" + }, + "feature_1_12": { + "name": "feature_1_12", + "index": 11, + "target": "next_week_sales", + "importance": 0.0004837497492659694, + "correlation": -0.0048654555583356515, + "sql": "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;" + }, + "feature_1_13": { + "name": "feature_1_13", + "index": 12, + "target": "next_week_sales", + "importance": 0.0014740871973266314, + "correlation": -0.10770892213296689, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_13\";\n\nCREATE TABLE \"FEATURE_1_13\" AS\nSELECT AVG( 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;" + }, + "feature_1_14": { + "name": "feature_1_14", + "index": 13, + "target": "next_week_sales", + "importance": 0.0, + "correlation": 0.24344268179234033, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_14\";\n\nCREATE TABLE \"FEATURE_1_14\" AS\nSELECT COUNT( DISTINCT 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;" + }, + "feature_1_15": { + "name": "feature_1_15", + "index": 14, + "target": "next_week_sales", + "importance": 0.0, + "correlation": 0.9653679314249123, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_15\";\n\nCREATE TABLE \"FEATURE_1_15\" AS\nSELECT COUNT( t2.\"order_total\" ) - 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;" + }, + "feature_1_16": { + "name": "feature_1_16", + "index": 15, + "target": "next_week_sales", + "importance": 9.072210432143641e-6, + "correlation": -0.0034817403436009225, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_16\";\n\nCREATE TABLE \"FEATURE_1_16\" AS\nSELECT FIRST( t2.\"order_total\", t2.\"ordered_at\" ) 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;" + }, + "feature_1_17": { + "name": "feature_1_17", + "index": 16, + "target": "next_week_sales", + "importance": 6.569184290588832e-6, + "correlation": -0.22994991135356005, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_17\";\n\nCREATE TABLE \"FEATURE_1_17\" AS\nSELECT LAST( 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;" + }, + "feature_1_18": { + "name": "feature_1_18", + "index": 17, + "target": "next_week_sales", + "importance": 0.000022508403222203726, + "correlation": -0.24669692538827728, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_18\";\n\nCREATE TABLE \"FEATURE_1_18\" AS\nSELECT MAX( 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;" + }, + "feature_1_19": { + "name": "feature_1_19", + "index": 18, + "target": "next_week_sales", + "importance": 0.0, + "correlation": -0.24931540544301853, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_19\";\n\nCREATE TABLE \"FEATURE_1_19\" AS\nSELECT MEDIAN( t2.\"order_total\" ) 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;" + }, + "feature_1_20": { + "name": "feature_1_20", + "index": 19, + "target": "next_week_sales", + "importance": 0.0, + "correlation": 0.0, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_20\";\n\nCREATE TABLE \"FEATURE_1_20\" AS\nSELECT MIN( 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;" + }, + "feature_1_21": { + "name": "feature_1_21", + "index": 20, + "target": "next_week_sales", + "importance": 0.0, + "correlation": -0.24931540544301853, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_21\";\n\nCREATE TABLE \"FEATURE_1_21\" AS\nSELECT MODE( 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;" + }, + "feature_1_22": { + "name": "feature_1_22", + "index": 21, + "target": "next_week_sales", + "importance": 0.00006876079344971183, + "correlation": -0.5784073006760982, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_22\";\n\nCREATE TABLE \"FEATURE_1_22\" AS\nSELECT STDDEV( 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;" + }, + "feature_1_23": { + "name": "feature_1_23", + "index": 22, + "target": "next_week_sales", + "importance": 0.01065361416681395, + "correlation": 0.9753017397987611, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_23\";\n\nCREATE TABLE \"FEATURE_1_23\" AS\nSELECT SUM( 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;" + }, + "feature_1_24": { + "name": "feature_1_24", + "index": 23, + "target": "next_week_sales", + "importance": 0.000040194837643060845, + "correlation": -0.09280999571475798, + "sql": "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;" + }, + "feature_1_25": { + "name": "feature_1_25", + "index": 24, + "target": "next_week_sales", + "importance": 0.0002469935761874096, + "correlation": -0.22399014881974527, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_25\";\n\nCREATE TABLE \"FEATURE_1_25\" AS\nSELECT AVG( 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;" + }, + "feature_1_26": { + "name": "feature_1_26", + "index": 25, + "target": "next_week_sales", + "importance": 0.0, + "correlation": 0.24344268179234033, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_26\";\n\nCREATE TABLE \"FEATURE_1_26\" AS\nSELECT COUNT( DISTINCT 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;" + }, + "feature_1_27": { + "name": "feature_1_27", + "index": 26, + "target": "next_week_sales", + "importance": 0.0, + "correlation": 0.9653679314249123, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_27\";\n\nCREATE TABLE \"FEATURE_1_27\" AS\nSELECT COUNT( t2.\"tax_paid\" ) - 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;" + }, + "feature_1_28": { + "name": "feature_1_28", + "index": 27, + "target": "next_week_sales", + "importance": 0.000040949078556653685, + "correlation": -0.048911990577103506, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_28\";\n\nCREATE TABLE \"FEATURE_1_28\" AS\nSELECT FIRST( t2.\"tax_paid\", t2.\"ordered_at\" ) 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;" + }, + "feature_1_29": { + "name": "feature_1_29", + "index": 28, + "target": "next_week_sales", + "importance": 0.0000400370974987918, + "correlation": -0.24990180604216752, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_29\";\n\nCREATE TABLE \"FEATURE_1_29\" AS\nSELECT LAST( 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;" + }, + "feature_1_30": { + "name": "feature_1_30", + "index": 29, + "target": "next_week_sales", + "importance": 0.00001526573921048488, + "correlation": -0.24507195262112205, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_30\";\n\nCREATE TABLE \"FEATURE_1_30\" AS\nSELECT MAX( 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;" + }, + "feature_1_31": { + "name": "feature_1_31", + "index": 30, + "target": "next_week_sales", + "importance": 0.0, + "correlation": -0.24931540544301437, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_31\";\n\nCREATE TABLE \"FEATURE_1_31\" AS\nSELECT MEDIAN( t2.\"tax_paid\" ) 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;" + }, + "feature_1_32": { + "name": "feature_1_32", + "index": 31, + "target": "next_week_sales", + "importance": 0.0, + "correlation": 0.0, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_32\";\n\nCREATE TABLE \"FEATURE_1_32\" AS\nSELECT MIN( 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;" + }, + "feature_1_33": { + "name": "feature_1_33", + "index": 32, + "target": "next_week_sales", + "importance": 0.0, + "correlation": -0.24931540544301437, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_33\";\n\nCREATE TABLE \"FEATURE_1_33\" AS\nSELECT MODE( 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;" + }, + "feature_1_34": { + "name": "feature_1_34", + "index": 33, + "target": "next_week_sales", + "importance": 0.0001724203873726834, + "correlation": -0.3226018643942477, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_34\";\n\nCREATE TABLE \"FEATURE_1_34\" AS\nSELECT STDDEV( 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;" + }, + "feature_1_35": { + "name": "feature_1_35", + "index": 34, + "target": "next_week_sales", + "importance": 0.007417190266110778, + "correlation": 0.5354993211888672, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_35\";\n\nCREATE TABLE \"FEATURE_1_35\" AS\nSELECT SUM( 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;" + }, + "feature_1_36": { + "name": "feature_1_36", + "index": 35, + "target": "next_week_sales", + "importance": 0.00010178268514546668, + "correlation": -0.22338752623418145, + "sql": "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;" + }, + "feature_1_37": { + "name": "feature_1_37", + "index": 36, + "target": "next_week_sales", + "importance": 0.000241417081670983, + "correlation": -0.25977484191473577, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_37\";\n\nCREATE TABLE \"FEATURE_1_37\" AS\nSELECT AVG( 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;" + }, + "feature_1_38": { + "name": "feature_1_38", + "index": 37, + "target": "next_week_sales", + "importance": 0.00004492440084047605, + "correlation": 0.9737799873974003, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_38\";\n\nCREATE TABLE \"FEATURE_1_38\" AS\nSELECT COUNT( DISTINCT 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;" + }, + "feature_1_39": { + "name": "feature_1_39", + "index": 38, + "target": "next_week_sales", + "importance": 0.00015209013708671182, + "correlation": 0.9268947164615704, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_39\";\n\nCREATE TABLE \"FEATURE_1_39\" AS\nSELECT COUNT( t1.\"reference_date\" - t2.\"ordered_at\" ) - 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;" + }, + "feature_1_40": { + "name": "feature_1_40", + "index": 39, + "target": "next_week_sales", + "importance": 0.000020485730978232782, + "correlation": 0.1386914224088003, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_40\";\n\nCREATE TABLE \"FEATURE_1_40\" AS\nSELECT FIRST( t1.\"reference_date\" - t2.\"ordered_at\", 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;" + }, + "feature_1_41": { + "name": "feature_1_41", + "index": 40, + "target": "next_week_sales", + "importance": 0.000042216556229996094, + "correlation": -0.2568762309289105, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_41\";\n\nCREATE TABLE \"FEATURE_1_41\" AS\nSELECT LAST( 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;" + }, + "feature_1_42": { + "name": "feature_1_42", + "index": 41, + "target": "next_week_sales", + "importance": 0.0, + "correlation": 0.1386914224088003, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_42\";\n\nCREATE TABLE \"FEATURE_1_42\" AS\nSELECT MAX( 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;" + }, + "feature_1_43": { + "name": "feature_1_43", + "index": 42, + "target": "next_week_sales", + "importance": 0.0002140922272545032, + "correlation": -0.15958861415518996, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_43\";\n\nCREATE TABLE \"FEATURE_1_43\" AS\nSELECT MEDIAN( t1.\"reference_date\" - 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;" + }, + "feature_1_44": { + "name": "feature_1_44", + "index": 43, + "target": "next_week_sales", + "importance": 0.0, + "correlation": -0.2568762309289105, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_44\";\n\nCREATE TABLE \"FEATURE_1_44\" AS\nSELECT MIN( 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;" + }, + "feature_1_45": { + "name": "feature_1_45", + "index": 44, + "target": "next_week_sales", + "importance": 0.00006494842042363201, + "correlation": 0.045729289558634166, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_45\";\n\nCREATE TABLE \"FEATURE_1_45\" AS\nSELECT MODE( 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;" + }, + "feature_1_46": { + "name": "feature_1_46", + "index": 45, + "target": "next_week_sales", + "importance": 0.00003787481039321512, + "correlation": 0.012617435063890792, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_46\";\n\nCREATE TABLE \"FEATURE_1_46\" AS\nSELECT STDDEV( 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;" + }, + "feature_1_47": { + "name": "feature_1_47", + "index": 46, + "target": "next_week_sales", + "importance": 0.00005556592336693547, + "correlation": 0.9562271988412165, + "sql": "DROP TABLE IF EXISTS \"FEATURE_1_47\";\n\nCREATE TABLE \"FEATURE_1_47\" AS\nSELECT SUM( 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;" + }, + "feature_1_48": { + "name": "feature_1_48", + "index": 47, + "target": "next_week_sales", + "importance": 0.0, + "correlation": 0.0, + "sql": "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;" + }, + "feature_1_49": { + "name": "feature_1_49", + "index": 48, + "target": "next_week_sales", + "importance": 0.0000427120238763987, + "correlation": -0.9502064301241298, + "sql": "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;" + }, + "feature_1_50": { + "name": "feature_1_50", + "index": 49, + "target": "next_week_sales", + "importance": 0.0, + "correlation": 0.9653493895621845, + "sql": "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;" + }, + "days_since_open": { + "name": "days_since_open", + "index": 50, + "target": "next_week_sales", + "importance": 0.000572851204431073, + "correlation": 0.3497799019800917, + "sql": "" + }, + "next_week_orders": { + "name": "next_week_orders", + "index": 51, + "target": "next_week_sales", + "importance": 0.9647112102544466, + "correlation": 0.9885752362918915, + "sql": "" + } + }, + "feature_descriptions": { + "feature_1_1": { + "name": "feature_1_1", + "title": "avg_subtotal_30d", + "description": "Computes the average order subtotal across all transactions for the same store observed up to the snapshot date, restricted to the recent 30‑day memory window. Implemented by joining transaction rows on store identifier and averaging the subtotal values for orders with ordered_at ≤ reference_date (and within the 30‑day truncation). Captures recent typical order size [monetary, e.g., USD?]; useful as a proxy for average basket value. Low correlation with the target in this model, so treat as a secondary signal and verify monetary units and scaling before use.", + "description_confidence": "medium" + }, + "feature_1_2": { + "name": "feature_1_2", + "title": "distinct_subtotal_count_30d", + "description": "Counts the number of distinct subtotal amounts observed for the store in the 30‑day window prior to the snapshot. Built via a grouped join on store_id and distinct counting of the subtotal field for orders up to reference_date. Serves as a measure of heterogeneity in order sizes (higher counts indicate more variety in basket sizes) [count]. Shows modest positive correlation with the target here; consider as a diversity/variability indicator rather than a direct revenue estimate.", + "description_confidence": "high" + }, + "feature_1_3": { + "name": "feature_1_3", + "title": "duplicate_subtotal_count_30d", + "description": "Measures how many order subtotals repeat by computing total order count minus distinct subtotal count within the 30‑day window. Derived from joined order rows for the store up to the snapshot date, it highlights frequency of repeated identical subtotals (e.g., common basket sizes or recurring order templates) [count]. Highly correlated with revenue-related aggregates in this dataset — may capture promotional or repeated-order behavior — but could be redundant with total/count features, so check multicollinearity before including in parsimonious models.", + "description_confidence": "high" + }, + "feature_1_4": { + "name": "feature_1_4", + "title": "first_subtotal_30d", + "description": "Selects the subtotal value of the earliest order in the 30‑day lookback (earliest ordered_at ≤ reference_date). Computed by joining orders to the snapshot and choosing the first subtotal by timestamp. Provides a simple recency-ordered snapshot of an older order within the window [monetary, e.g., USD?]; useful to detect shifts in basket size over the window when compared with the latest value. Low predictive contribution on its own in this model, but can be informative in combination with last/avg measures.", + "description_confidence": "medium" + }, + "feature_1_5": { + "name": "feature_1_5", + "title": "last_subtotal_30d", + "description": "Returns the subtotal of the most recent order before the snapshot within the 30‑day memory window (latest ordered_at ≤ reference_date). Obtained by joining transaction rows on store_id and selecting the value associated with the maximum timestamp. Acts as a short-term recency indicator of order size [monetary, e.g., USD?]; in this dataset it has a modest negative correlation with the target, so consider using alongside aggregates (sum/avg) to capture trend and recent shifts.", + "description_confidence": "medium" + }, + "feature_1_6": { + "name": "feature_1_6", + "title": "max_subtotal_30d", + "description": "Returns the maximum subtotal observed in the 30‑day window preceding the snapshot for the given store. Calculated by grouping joined orders (by store) and taking the maximum subtotal for orders with ordered_at ≤ reference_date. Captures occasional large baskets or outlier transactions [monetary, e.g., USD?]; can identify high-value events but may be sensitive to single outliers, so robustify (winsorize) or pair with median/stddev for stability.", + "description_confidence": "medium" + }, + "feature_1_7": { + "name": "feature_1_7", + "title": "median_subtotal_30d", + "description": "Computes the median subtotal among all orders for the store in the 30‑day lookback prior to the snapshot. Built from joined orders filtered by timestamp and grouped by snapshot row. Provides a robust central tendency of order size that is less influenced by outliers than the mean [monetary, e.g., USD?]. In cases with many identical small orders the median can be more stable and useful than mean-based signals.", + "description_confidence": "medium" + }, + "feature_1_8": { + "name": "feature_1_8", + "title": "min_subtotal_30d", + "description": "Returns the minimum observed subtotal among orders up to the snapshot within the 30‑day memory window. Computed by grouping joined transactions on store_id and taking the minimum subtotal where ordered_at ≤ reference_date. Indicates the floor of observed basket values [monetary, e.g., USD?]; often 0 for refunded or zero-value orders and so should be interpreted with caution (treat zeros separately if they indicate returns/cancellations).", + "description_confidence": "medium" + }, + "feature_1_9": { + "name": "feature_1_9", + "title": "mode_subtotal_30d", + "description": "Selects the most frequent subtotal value within the 30‑day window ending at the snapshot. Implemented by grouping orders for the store and returning the modal subtotal among orders with ordered_at ≤ reference_date. Useful to detect a common basket size (e.g., a menu item or standardized purchase) [monetary, e.g., USD?]; modal values can be informative for understanding typical transaction patterns but may be non-unique or unstable for small samples.", + "description_confidence": "medium" + }, + "feature_1_10": { + "name": "feature_1_10", + "title": "stddev_subtotal_30d", + "description": "Computes the standard deviation of order subtotals across the 30‑day lookback prior to the snapshot. Produced by aggregating joined order rows for the store and calculating sample dispersion of the subtotal field for orders with ordered_at ≤ reference_date. Captures variability in basket sizes [monetary dispersion]; negatively correlated with the target in this model, indicating that higher variability in subtotals within the window is associated with lower next‑week sales here — could reflect inconsistent demand or mixed transaction types.", + "description_confidence": "high" + }, + "feature_1_11": { + "name": "feature_1_11", + "title": "sum_subtotal_30d", + "description": "Sums all order subtotals for the store within the 30‑day window leading up to the snapshot (orders with ordered_at ≤ reference_date). Implemented via a grouped join on store_id and summation of the subtotal field. Acts as a recent-revenue proxy over the month‑to‑date period [monetary, e.g., USD?] and is highly correlated with the target in this dataset — one of the stronger historical revenue signals. Validate units/scaling and beware redundancy with other sum/count features.", + "description_confidence": "medium" + }, + "feature_1_12": { + "name": "feature_1_12", + "title": "trend_subtotal_30d", + "description": "Estimates a trend coefficient of subtotal values versus recency by regressing subtotal on time‑difference (reference_date − ordered_at) within the 30‑day window. Computed using a trend aggregation on joined orders for the store and captures whether average basket sizes are increasing or decreasing as orders approach the snapshot [trend in monetary units per time]. Use to detect momentum in order value; implementation specifics of the TREND operator (slope units and normalization) should be reviewed before interpretation.", + "description_confidence": "medium" + }, + "feature_1_13": { + "name": "feature_1_13", + "title": "avg_order_total_30d", + "description": "Calculates the average full order amount (order_total) for transactions in the 30‑day lookback prior to the snapshot. Built by joining orders on store_id and averaging order_total for orders with ordered_at ≤ reference_date. Serves as an AOV-style indicator that includes taxes/fees [monetary, e.g., USD?]; can complement subtotal-based signals where fees or rounding matter. Has modest predictive value and should be checked for unit consistency.", + "description_confidence": "medium" + }, + "feature_1_14": { + "name": "feature_1_14", + "title": "distinct_order_total_count_30d", + "description": "Counts distinct values of the full order amount (order_total) observed for the store in the 30‑day window preceding the snapshot. Computed via grouped join and distinct counting of order_total for orders ≤ reference_date. Indicates variability in final charged amounts (including taxes/fees) [count]; useful as a complement to subtotal distinct counts to detect pricing or fee heterogeneity.", + "description_confidence": "high" + }, + "feature_1_15": { + "name": "feature_1_15", + "title": "duplicate_order_total_count_30d", + "description": "Quantifies repeated identical full-order amounts by taking the total count of orders minus the number of distinct order_total values within the 30‑day window. Derived from joined transactions filtered by timestamp; highlights repeated standardized charges or frequent identical purchases [count]. Highly correlated with total/order-sum aggregates in this dataset, so evaluate redundancy and potential collinearity when using together with sum/count features.", + "description_confidence": "high" + }, + "feature_1_16": { + "name": "feature_1_16", + "title": "first_order_total_30d", + "description": "Returns the order_total associated with the earliest transaction in the 30‑day lookback prior to the snapshot. Obtained by joining orders on store_id and selecting the first value by ordered_at ≤ reference_date. Can serve as a baseline older-order amount to compare against the most recent order (useful for short‑term trend detection) [monetary, e.g., USD?].", + "description_confidence": "medium" + }, + "feature_1_17": { + "name": "feature_1_17", + "title": "last_order_total_30d", + "description": "Provides the order_total for the most recent transaction before the snapshot within the 30‑day memory window. Computed via grouped join selecting the last order_total by timestamp. Acts as a short‑term recency indicator of final charged amounts [monetary, e.g., USD?] and shows modest negative correlation with next‑week sales in this model; combine with aggregate signals for richer interpretation.", + "description_confidence": "medium" + }, + "feature_1_18": { + "name": "feature_1_18", + "title": "max_order_total_30d", + "description": "Returns the maximum observed final order amount for the store within the 30‑day window before the snapshot. Calculated by grouping joined orders and taking the maximum order_total for orders with ordered_at ≤ reference_date. Captures one-off large transactions or high-value baskets [monetary, e.g., USD?]; sensitive to outliers and should be interpreted with supporting robust statistics (median/stddev).", + "description_confidence": "medium" + }, + "feature_1_19": { + "name": "feature_1_19", + "title": "median_order_total_30d", + "description": "Computes the median of order_total values across the 30‑day lookback window for the store. Obtained from joined order rows filtered by timestamp and grouped by snapshot. Provides a robust central tendency for final amounts paid [monetary, e.g., USD?]; useful when distributions are skewed by a few very large or zero-value orders.", + "description_confidence": "medium" + }, + "feature_1_20": { + "name": "feature_1_20", + "title": "min_order_total_30d", + "description": "Returns the minimum final order amount observed in the 30‑day window up to the snapshot. Computed by grouping orders for the store and taking the minimum order_total among orders with ordered_at ≤ reference_date. Identifies floor values which may indicate low‑value, zero, or refunded transactions [monetary, e.g., USD?]; interpret zeros carefully and consider excluding refunds or cancellations if they are not predictive of future sales.", + "description_confidence": "medium" + }, + "feature_1_21": { + "name": "feature_1_21", + "title": "mode_order_total", + "description": "Most frequently observed order_total value from transactions for the store in the lookback window ending at the snapshot. Computed by finding the modal order amount across orders joined to the weekly snapshot (orders where ordered_at <= reference_date and within the 30‑day memory window). Captures the typical single-order charge [USD]. Shows a modest negative relationship with the target (corr ≈ -0.25), so it can act as a simple measure of the common order size when predicting weekly revenue. Use as a robust central-value indicator; be careful when many orders share identical amounts (ties) or when monetary units need validation.", + "description_confidence": "high" + }, + "feature_1_22": { + "name": "feature_1_22", + "title": "stddev_order_total", + "description": "Statistical dispersion of order_total within the recent transactional history for the store. Calculated as the standard deviation of order amount across orders joined to each weekly snapshot (orders up to reference_date and limited by the 30‑day memory). Measures variability in order sizes [USD]. Has a relatively strong negative correlation with the target (corr ≈ -0.58), indicating that higher variability in recent order amounts is associated with lower next‑week sales in this dataset. Useful to capture heterogeneity of purchase behavior; consider scaling or robustifying if outliers exist.", + "description_confidence": "high" + }, + "feature_1_23": { + "name": "feature_1_23", + "title": "sum_order_total", + "description": "Total of order_total across all transactions for the store in the lookback window up to the snapshot. Computed by summing order amounts for orders where ordered_at <= reference_date (and within the configured 30‑day memory). Represents recent realized revenue flow from transactions [USD]. Very strongly positively correlated with the target (corr ≈ 0.98) and among the more important aggregate predictors, so it effectively acts like a short‑term revenue history signal. Verify units and aggregation horizon before use (large magnitudes may require normalization).", + "description_confidence": "high" + }, + "feature_1_24": { + "name": "feature_1_24", + "title": "trend_order_total", + "description": "Slope-like trend of order_total as a function of recency relative to the snapshot. Computed using a TREND aggregation that regresses order amount on (reference_date - ordered_at) for orders up to the snapshot (30‑day window), producing a measure of whether recent orders are increasing or decreasing in size over time [USD per day]. Indicates short-term directionality in per-order value; weakly negatively correlated with the target here. Use to capture momentum in order sizes (rising/falling AOV) but interpret scale cautiously (depends on time units used in the TREND computation).", + "description_confidence": "medium" + }, + "feature_1_25": { + "name": "feature_1_25", + "title": "avg_tax_paid", + "description": "Average tax amount charged per order in the recent lookback for the store. Computed as the mean of tax_paid over orders joined to the weekly snapshot (orders up to reference_date and within the 30‑day memory). Serves as a proxy for typical tax per transaction and, indirectly, per-order dollar size [USD]. Shows a moderate negative correlation with the target (corr ≈ -0.22). Useful as an auxiliary monetary feature; check for zeros and tax regime changes which can shift interpretation.", + "description_confidence": "high" + }, + "feature_1_26": { + "name": "feature_1_26", + "title": "count_distinct_tax_paid", + "description": "Number of unique tax_paid values observed in the recent transactions for the store. Computed by counting distinct tax amounts among orders up to the snapshot (30‑day window). Acts as a measure of tax-value diversity across orders [count]. Can indicate whether transactions have heterogeneous tax items (e.g., varied item mixes or rounding effects). Low direct importance here but useful for data‑quality checks (many identical zeros or a small distinct set).", + "description_confidence": "high" + }, + "feature_1_27": { + "name": "feature_1_27", + "title": "repeated_tax_value_count", + "description": "Count of non-unique tax_paid occurrences in the lookback (total orders minus distinct tax values). Calculated as COUNT(tax_paid) - COUNT(DISTINCT tax_paid) for orders up to the snapshot within the 30‑day window. Captures the degree to which the same tax amounts repeat across transactions [count]. May reflect standardized pricing/rounding or a dominance of similar order types; interpret alongside total order count and distinct counts. Confidence in interpretation is slightly lower because the business meaning depends on why tax values repeat.", + "description_confidence": "medium" + }, + "feature_1_28": { + "name": "feature_1_28", + "title": "first_tax_paid", + "description": "Tax amount of the earliest transaction (by ordered_at) included in the lookback window for the snapshot. Computed using FIRST(tax_paid, ordered_at) over orders where ordered_at <= reference_date and within the 30‑day memory. Provides a recency-ordered snapshot of initial tax values in the window [USD]. Useful when earliest behavior (start of the window) matters for trend or seasonality checks; treat as descriptive rather than a primary predictive signal in isolation.", + "description_confidence": "high" + }, + "feature_1_29": { + "name": "feature_1_29", + "title": "last_tax_paid", + "description": "Tax amount from the most recent transaction (by ordered_at) before the snapshot. Computed using LAST(tax_paid, ordered_at) across orders up to reference_date within the 30‑day window. Reflects the latest tax charged and can capture recent shifts in order composition or pricing [USD]. Shows modest negative correlation with the target; combine with averages or sums for more stable signals.", + "description_confidence": "high" + }, + "feature_1_30": { + "name": "feature_1_30", + "title": "max_tax_paid", + "description": "Largest tax_paid observed across transactions in the lookback window for the store. Computed as the maximum tax amount for orders up to reference_date (30‑day memory). Highlights unusually large tax line items which may correspond to large orders or data issues [USD]. Negative correlation with the target here suggests isolated large-tax orders do not necessarily imply higher next‑week revenue; inspect outliers before using directly.", + "description_confidence": "high" + }, + "feature_1_31": { + "name": "feature_1_31", + "title": "median_tax_paid", + "description": "Median tax amount among recent transactions for the store. Obtained via MEDIAN aggregation over tax_paid for orders where ordered_at <= reference_date in the 30‑day memory. Provides a robust center measure less sensitive to outliers than the mean [USD]. Useful for capturing the typical tax experienced per order; use together with average and sum to separate scale from skewness.", + "description_confidence": "high" + }, + "feature_1_32": { + "name": "feature_1_32", + "title": "min_tax_paid", + "description": "Smallest tax amount observed across orders in the lookback window. Calculated as the minimum tax_paid among orders up to the snapshot (30‑day memory). Useful to detect zero‑tax transactions or unusually low tax lines that may indicate refunds, exemptions, or data anomalies [USD]. Interpret in context of count/sum features to avoid overemphasizing rare values.", + "description_confidence": "high" + }, + "feature_1_33": { + "name": "feature_1_33", + "title": "mode_tax_paid", + "description": "Most common tax_paid amount in the recent transaction history for the store. Computed as the modal tax value across orders up to reference_date within the 30‑day window. Acts as a simple indicator of the typical tax bucket applied to most orders [USD]. Helpful for quickly identifying the dominant tax bracket or rounding pattern; combine with distributional features to assess heterogeneity.", + "description_confidence": "high" + }, + "feature_1_34": { + "name": "feature_1_34", + "title": "stddev_tax_paid", + "description": "Standard deviation of tax_paid across recent transactions for the store. Computed over orders up to the snapshot within the 30‑day memory window. Measures variability in tax amounts [USD]. The negative correlation (corr ≈ -0.32) implies that greater variability in tax lines aligns with lower next‑week sales in this dataset. Use to quantify stability of tax-related order behavior and as an input to detect mix changes.", + "description_confidence": "high" + }, + "feature_1_35": { + "name": "feature_1_35", + "title": "sum_tax_paid", + "description": "Total tax charged across all transactions in the lookback window for the store. Computed by summing tax_paid for orders with ordered_at <= reference_date (30‑day memory). Acts as a partial proxy for recent revenue volume (since tax scales with order_total) and shows moderate positive correlation with the target (corr ≈ 0.54). Useful when combined with order counts to derive average tax or to cross-check revenue aggregates [USD].", + "description_confidence": "high" + }, + "feature_1_36": { + "name": "feature_1_36", + "title": "trend_tax_paid", + "description": "Trend measure of tax_paid over recency in the lookback window relative to the snapshot. Computed with the TREND aggregation that relates tax amount to (reference_date - ordered_at) for orders up to the snapshot (30‑day window), producing a directional indicator of whether tax amounts are increasing or decreasing over time [USD per day]. Useful to capture momentum in order composition or price/tax changes, but interpret magnitude cautiously because it depends on time unit normalization.", + "description_confidence": "medium" + }, + "feature_1_37": { + "name": "feature_1_37", + "title": "avg_recency_days", + "description": "Average elapsed time between each transaction and the snapshot (reference_date) across recent orders. Calculated as the mean of (reference_date - ordered_at) for orders up to the snapshot within the 30‑day window [days]. Captures average recency of activity: higher values mean the window contains older orders on average. Moderately negatively correlated with the target (corr ≈ -0.26), indicating that fresher recent activity tends to align with higher next‑week sales. Useful for measuring recency-driven demand signals.", + "description_confidence": "high" + }, + "feature_1_38": { + "name": "feature_1_38", + "title": "count_distinct_recency", + "description": "Number of distinct recency values (reference_date - ordered_at) among transactions in the lookback window. Computed by counting distinct time differences for orders up to the snapshot within the 30‑day memory [count of distinct days/intervals]. Reflects temporal diversity of order timestamps (e.g., many distinct recency values implies frequent ordering at different days); highly correlated with other recency/volume aggregates and useful to quantify order-timing richness.", + "description_confidence": "high" + }, + "feature_1_39": { + "name": "feature_1_39", + "title": "repeated_recency_count", + "description": "Number of non-unique recency occurrences in the lookback (total recency counts minus distinct recency counts). Computed as COUNT(reference_date - ordered_at) - COUNT(DISTINCT reference_date - ordered_at) across orders up to the snapshot (30‑day window). Quantifies how often identical recency intervals repeat (e.g., multiple orders on the same day) [count]. Useful to capture clumping of orders in time (burstiness); interpret together with total order count and average recency.", + "description_confidence": "high" + }, + "feature_1_40": { + "name": "feature_1_40", + "title": "first_recency_days", + "description": "Recency (reference_date - ordered_at) of the earliest transaction inside the lookback window, selected by ordering on ordered_at. Computed using FIRST(reference_date - ordered_at, ordered_at) for orders where ordered_at <= reference_date and within the 30‑day memory. Represents how far back the earliest included order lies relative to the snapshot [days]. Use to detect window edge behavior (e.g., whether the window contains very stale or very recent first events); interpret alongside average and min recency.", + "description_confidence": "medium" + }, + "feature_1_41": { + "name": "feature_1_41", + "title": "last_order_age", + "description": "Computes the age of the most recent order prior to the snapshot by taking the time difference between the snapshot timestamp and the latest order timestamp within the 30‑day lookback. Implemented by joining the snapshot row to transactions via store_id, filtering orders to ordered_at <= reference_date and within the 30‑day memory window, and returning the last (most recent) reference_date - ordered_at value. Captures short‑term recency of activity [time delta]. Distribution (train avg ≈ 32,695; min ≈ 32,460; max ≈ 35,280) reflects the dataset's timestamp units — interpret units with caution (see usage guidance). Negative relationship with weekly revenue in the model (moderate negative correlation ≈ -0.257), indicating that more recent last orders (smaller values) tend to accompany higher next‑week sales. Use as a recency indicator; verify the time-unit convention (seconds vs. days) before interpretation or scaling, and keep the 30‑day window in mind when comparing across snapshots.", + "description_confidence": "high" + }, + "feature_1_42": { + "name": "feature_1_42", + "title": "max_order_age", + "description": "Returns the maximum time difference between the snapshot timestamp and any order timestamp within the 30‑day lookback (i.e., the oldest order in the window) by joining snapshots to orders on store_id and grouping per snapshot. Acts as a measure of how stale the earliest recent transaction is within the memory window [time delta]. Observed correlation with next‑week revenue is small-to-moderate positive (≈ 0.139) and importance in the model is negligible, suggesting limited direct predictive value alone. Use to detect presence of long gaps inside the 30‑day window (data quality / activity pattern signal); confirm time-unit semantics before combining with other time features.", + "description_confidence": "medium" + }, + "feature_1_43": { + "name": "feature_1_43", + "title": "median_order_age", + "description": "Computes the median time elapsed between the snapshot timestamp and orders within the 30‑day lookback by joining population rows to transaction rows and taking the median of reference_date - ordered_at per snapshot [time delta]. Provides a robust central measure of recency that is less sensitive to outliers than min/max. Shows a modest negative correlation with next‑week sales (≈ -0.160), indicating that snapshots with generally more recent orders tend to have higher future sales. Useful as a stable recency metric for feature sets or as an input to segmentation (active vs. inactive recent windows).", + "description_confidence": "high" + }, + "feature_1_44": { + "name": "feature_1_44", + "title": "min_order_age", + "description": "Returns the smallest time difference between the snapshot timestamp and any order timestamp in the 30‑day lookback (i.e., the most recent order offset), computed via a join on store_id and grouped per snapshot [time delta]. Acts as a direct indicator of whether an order occurred immediately before the snapshot. Demonstrates a modest negative association with next‑week revenue (similar sign to other recency measures). Use together with counts and interval metrics to distinguish an isolated recent order from sustained activity.", + "description_confidence": "medium" + }, + "feature_1_45": { + "name": "feature_1_45", + "title": "mode_order_age", + "description": "Identifies the most frequently occurring time-difference between snapshot and order timestamps within the 30‑day lookback (mode of reference_date - ordered_at) after joining snapshots to orders on store_id. Acts as a measure of the dominant recency bucket (common inter-event timing) in the snapshot's recent history [time delta]. Low direct importance to the model (small correlation), but can reveal regular cadence in ordering behavior (e.g., daily vs weekly peaks). Interpret with caution when the distribution is multimodal or when counts are low.", + "description_confidence": "medium" + }, + "feature_1_46": { + "name": "feature_1_46", + "title": "stddev_order_age", + "description": "Measures variability of order ages within the 30‑day lookback by computing the standard deviation of reference_date - ordered_at per snapshot after joining on store_id. Captures dispersion in transaction recency (consistent vs. bursty ordering patterns) [time delta]. Very small observed relationship with next‑week sales in this model (near-zero correlation), but useful for characterizing volatility in recent activity and for interaction with count-based features (e.g., high variability + high count implies bursty demand).", + "description_confidence": "medium" + }, + "feature_1_47": { + "name": "feature_1_47", + "title": "sum_order_ages", + "description": "Sums the time differences between the snapshot timestamp and each order timestamp within the 30‑day memory window (i.e., aggregate of reference_date - ordered_at across orders for the snapshot) after joining on store_id. Because the sum scales with both the number of orders and their ages, it implicitly mixes frequency and recency signals [time delta × count]. It shows a strong positive correlation with next‑week revenue in the dataset (≈ 0.956) — this may be due to implicit coupling with order counts or other aggregate volume signals. Use with care: disentangle count vs. age effects (e.g., pair with explicit order count or average inter-order interval) and normalize units appropriately before interpretation.", + "description_confidence": "medium" + }, + "feature_1_48": { + "name": "feature_1_48", + "title": "trend_order_age", + "description": "Computed as a TREND over the per-order age values (reference_date - ordered_at) within the 30‑day window. The SQL uses the age as both the series and the time axis, producing a slope-like statistic for how order ages change across the window. Implementation details and unit semantics are dataset-dependent and the operation as generated is not straightforward to interpret without inspecting raw values and TREND definition in the feature engine. Because of that ambiguity, there is no meaningful observed relationship with the target in this run. Not enough context to fully interpret numeric units or edge cases for this transform.", + "description_confidence": "low" + }, + "feature_1_49": { + "name": "feature_1_49", + "title": "avg_inter_order_interval", + "description": "Estimates the average time between consecutive orders inside the 30‑day lookback: when more than one order exists, it divides (latest_order_time - earliest_order_time) by (count - 1); otherwise returns 0. Computed by joining snapshots to orders on store_id and grouping per snapshot. Represents mean inter-order interval [time delta / gap] and is a direct timing-frequency metric. Strong negative correlation with next‑week revenue (≈ -0.950) indicates that shorter average intervals (more frequent orders) are associated with higher upcoming weekly sales. Use as a primary activity-frequency indicator; confirm time units (seconds/days) and handle single-order cases as designed.", + "description_confidence": "high" + }, + "feature_1_50": { + "name": "feature_1_50", + "title": "orders_count", + "description": "Counts the number of orders for the store within the 30‑day lookback by joining snapshots to transaction rows on store_id and grouping per snapshot [count]. This is a straightforward activity-volume metric and shows a very strong positive association with next‑week revenue (high correlation ≈ 0.965), reflecting that recent order volume is a primary driver of weekly sales. Use as a core predictor (or baseline) for revenue forecasts; ensure the lookback window and filtering rules match production logic to avoid leakage.", + "description_confidence": "high" + }, + "days_since_open": { + "name": "days_since_open", + "title": "days_since_open", + "description": "Represents the number of days elapsed between the store opening date and the snapshot date at the population level [days]. Captures store maturity effects (growth or stabilization over time). Distribution shows wide spread across splits (train avg ≈ 577 days; test avg ≈ 1,490 days) and a moderate positive relationship with next‑week revenue (correlation ≈ 0.35). Useful as a structural feature to capture lifecycle and baseline demand differences between newer and established stores.", + "description_confidence": "high" + }, + "next_week_orders": { + "name": "next_week_orders", + "title": "next_week_orders", + "description": "Provides the order count for the upcoming week at the population snapshot level [count]. In this model run it is the dominant predictor of weekly revenue (very high importance ≈ 0.965 and correlation ≈ 0.989), indicating the target is largely driven by expected order volume. Critical usage guidance: verify whether this value is available at inference time (it may be a forecast from a separate model or a future-derived value). If it is derived from future ground-truth, it represents data leakage and must be removed or replaced with a legitimately forecasted input in production. When legitimately available (predicted externally), it can be used in a two-stage pipeline (forecast orders → forecast sales).", + "description_confidence": "high" + } + } +} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index e05bfc6..112fe7b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ requires-python = "==3.12.*" dependencies = [ "jupyterlab==4.1.1", - "getml==1.5.0", + "getml==1.5.1", "featuretools==1.31.0", "tsfresh==0.20.3", "seaborn==0.13.2", @@ -25,8 +25,9 @@ spark = [ databricks = [ "databricks-connect==17.3.2", "requests==2.32.5", - "pydantic==2.12.5", + "pydantic==2.11.7", "sqlglot==28.4.1", + "getml-interpretations", ] dev = [ @@ -36,4 +37,7 @@ dev = [ ] [tool.basedpyright] -typeCheckingMode = "standard" \ No newline at end of file +typeCheckingMode = "standard" + +[tool.uv.sources] +getml-interpretations = { path = "../getml-interpretations", editable = true } diff --git a/uv.lock b/uv.lock index 4beda41..2149605 100644 --- a/uv.lock +++ b/uv.lock @@ -223,6 +223,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, ] +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, +] + [[package]] name = "cloudpickle" version = "3.1.2" @@ -363,6 +375,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, ] +[[package]] +name = "deigma" +version = "0.1.0" +source = { git = "https://github.com/getml/deigma.git#caf173108357f42671a0c06493160f63467bbbeb" } +dependencies = [ + { name = "jinja2" }, + { name = "pydantic" }, +] + +[[package]] +name = "duckdb" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/24/a2e7fb78fba577641c286fe33185789ab1e1569ccdf4d142e005995991d2/duckdb-1.3.2.tar.gz", hash = "sha256:c658df8a1bc78704f702ad0d954d82a1edd4518d7a04f00027ec53e40f591ff5", size = 11627775, upload-time = "2025-07-08T10:41:14.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/5d/77f15528857c2b186ebec07778dc199ccc04aafb69fb7b15227af4f19ac9/duckdb-1.3.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2455b1ffef4e3d3c7ef8b806977c0e3973c10ec85aa28f08c993ab7f2598e8dd", size = 15538413, upload-time = "2025-07-08T10:40:29.551Z" }, + { url = "https://files.pythonhosted.org/packages/78/67/7e4964f688b846676c813a4acc527cd3454be8a9cafa10f3a9aa78d0d165/duckdb-1.3.2-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:9d0ae509713da3461c000af27496d5413f839d26111d2a609242d9d17b37d464", size = 32535307, upload-time = "2025-07-08T10:40:31.632Z" }, + { url = "https://files.pythonhosted.org/packages/95/3d/2d7f8078194130dbf30b5ae154ce454bfc208c91aa5f3e802531a3e09bca/duckdb-1.3.2-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:72ca6143d23c0bf6426396400f01fcbe4785ad9ceec771bd9a4acc5b5ef9a075", size = 17110219, upload-time = "2025-07-08T10:40:34.072Z" }, + { url = "https://files.pythonhosted.org/packages/cd/05/36ff9000b9c6d2a68c1b248f133ee316fcac10c0ff817112cbf5214dbe91/duckdb-1.3.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b49a11afba36b98436db83770df10faa03ebded06514cb9b180b513d8be7f392", size = 19178569, upload-time = "2025-07-08T10:40:35.995Z" }, + { url = "https://files.pythonhosted.org/packages/ac/73/f85acbb3ac319a86abbf6b46103d58594d73529123377219980f11b388e9/duckdb-1.3.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36abdfe0d1704fe09b08d233165f312dad7d7d0ecaaca5fb3bb869f4838a2d0b", size = 21129975, upload-time = "2025-07-08T10:40:38.3Z" }, + { url = "https://files.pythonhosted.org/packages/32/40/9aa3267f3631ae06b30fb1045a48628f4dba7beb2efb485c0282b4a73367/duckdb-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3380aae1c4f2af3f37b0bf223fabd62077dd0493c84ef441e69b45167188e7b6", size = 22781859, upload-time = "2025-07-08T10:40:41.691Z" }, + { url = "https://files.pythonhosted.org/packages/8c/8d/47bf95f6999b327cf4da677e150cfce802abf9057b61a93a1f91e89d748c/duckdb-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:11af73963ae174aafd90ea45fb0317f1b2e28a7f1d9902819d47c67cc957d49c", size = 11395337, upload-time = "2025-07-08T10:40:43.651Z" }, +] + [[package]] name = "executing" version = "2.2.1" @@ -429,7 +465,7 @@ wheels = [ [[package]] name = "getml" -version = "1.5.0" +version = "1.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jinja2" }, @@ -440,21 +476,24 @@ dependencies = [ { name = "typing-extensions" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/0e/86a7b1e10be76bf475e554314707c56c4705f412420fc420fe3ddb0f865e/getml-1.5.0-1-py3-none-any.whl", hash = "sha256:db4ec89712c15c02108df484bf975668ccbe159d85197f5e2a81c0cf31cbad1e", size = 701263, upload-time = "2024-10-24T11:55:26.648Z" }, - { url = "https://files.pythonhosted.org/packages/e0/8b/19ad8e2a9efc49fd583e3fbef90f3c12d5f467f817d38e511303ca16e21a/getml-1.5.0-1-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:7c25537a08d8a2e2ccfdac4a910fb26e11250943ee8ff5cb84aec6f0f1b80801", size = 17385514, upload-time = "2024-10-24T11:55:38.16Z" }, - { url = "https://files.pythonhosted.org/packages/b4/f6/dda6dcd259607e0d0c73f5f7e81abbd5d95d3a190e1d1b2ca1043849b780/getml-1.5.0-1-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:83d13eecc2bacfd38d39a6324cf2170b759a64abeabe5efcf4e88a33d3d308f0", size = 20445826, upload-time = "2024-10-24T11:55:49.165Z" }, - { url = "https://files.pythonhosted.org/packages/3e/08/8975cc1e9917aa6ee085d886bad5c3a6c800d03cb9220b381f6a03ae3841/getml-1.5.0-2-py3-none-any.whl", hash = "sha256:b877a67286d34d55c69c266a398c3443b7ef668b1c3d2885a7a4ccf6dd877275", size = 364678, upload-time = "2024-11-18T16:46:58.735Z" }, - { url = "https://files.pythonhosted.org/packages/22/35/b9f1356e7562f777b007fcf4e3a710ea6e57f39966fe947afd858ce2eca4/getml-1.5.0-2-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:ecde322d88bf2ec0e633c1d2dbbd472c05a52696b06fd5092a97d5d88e99a1fe", size = 17048951, upload-time = "2024-11-18T16:47:16.438Z" }, - { url = "https://files.pythonhosted.org/packages/de/a3/a8967be93c110590f2a893e5de3b6407b6d73529407e99a840455779f044/getml-1.5.0-2-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:c49fdb38be3b91bf6c7cc1c00290ecc0103d2298aeecf6f1c7200214fb5c76c7", size = 20109263, upload-time = "2024-11-18T16:47:27.116Z" }, - { url = "https://files.pythonhosted.org/packages/89/98/8fc1b408e48c89281f772de2ab1b313c11c0e9632dbf467c8cb40024e577/getml-1.5.0-3-py3-none-any.whl", hash = "sha256:b3649d41601c1c1698224c617ac24d6de468bb03ed5d0097cf24397bb03e41ac", size = 364764, upload-time = "2024-12-13T16:57:06.44Z" }, - { url = "https://files.pythonhosted.org/packages/14/eb/958349c63d26d581c81618ea867d022f3a0eb3044b2fb13eae2c81731695/getml-1.5.0-3-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:b7e3677c229533d335cbe1947c3d640e7e5d0e0f131cd8c96dc76d5ec4da4ba5", size = 17020383, upload-time = "2024-12-13T16:57:25.358Z" }, - { url = "https://files.pythonhosted.org/packages/6e/0c/e41d4a9fe469d186a08cb670282c7002b146699a6ebcce1599cafa440a67/getml-1.5.0-3-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:91c2d8ebc9667ee57525f9eac77884dbf20a0b522c48d08aa2652f79e67e5f23", size = 20077550, upload-time = "2024-12-13T16:57:36.198Z" }, - { url = "https://files.pythonhosted.org/packages/e9/92/1914fd9bd69a38aeaaae7b64f4ef6f82ceb4b1c0007afa699bc26f964e52/getml-1.5.0-4-py3-none-any.whl", hash = "sha256:75f77143e6e4257e6f8b1737b2cbf7a3520b9395995ea6c5fcffe39e640b842f", size = 364776, upload-time = "2024-12-16T15:11:44.042Z" }, - { url = "https://files.pythonhosted.org/packages/76/28/0366237ca75be06b4cbe72b4da5ed83c1f2d08a719dff574f000cb21f636/getml-1.5.0-4-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:bd316b245a1ac1423e577044523d4d65a9ffd980d580619b0b1b90285f4d1477", size = 17018617, upload-time = "2024-12-16T15:11:58.753Z" }, - { url = "https://files.pythonhosted.org/packages/2f/29/00ec26f0e3ca956ace2d9cca967f5a0861160ac4ab09de38b711a039dc55/getml-1.5.0-4-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:28ce38698e412d7ba19776834e3f906a0f6c1200caa5f2c17df62145439fbb00", size = 20078297, upload-time = "2024-12-16T15:12:11.126Z" }, - { url = "https://files.pythonhosted.org/packages/fe/a3/cf3719d9c7cba40a3675e48569394d5e6759597d0fecf877eb58ae66e6fa/getml-1.5.0-py3-none-any.whl", hash = "sha256:d5c43bda2d42501b5133b8def5f4497f1dfc5978a414dcc563e5ee4224cce076", size = 701307, upload-time = "2024-09-24T16:12:25.082Z" }, - { url = "https://files.pythonhosted.org/packages/69/9c/26a9b636118c318856bd8fddb864d903ee00ec6d7c6fe13bfd2a2c31590c/getml-1.5.0-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:483d32911d34155d333a645c8da2f1f52eabf08e682566a73f8aebe304ece56f", size = 19489923, upload-time = "2024-09-24T16:12:36.115Z" }, - { url = "https://files.pythonhosted.org/packages/f0/e9/b9bfa6736aa6305b0a5ce7e22d3b48da45ed391086890227f61c8ba52c4c/getml-1.5.0-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:ab356418d2bd004d9e685b4f8c81aebed8f1fbcf9983540617d6a01276bbddcd", size = 20445873, upload-time = "2024-09-24T16:12:46.389Z" }, + { url = "https://files.pythonhosted.org/packages/9b/d9/a6b870ff915317862179dad0488257ba6d4ddc5d3a420ba00033956c469b/getml-1.5.1-1-py3-none-any.whl", hash = "sha256:0231dc8a8014fe569730d286898881a8121e35803862c7c58caa032ad740009b", size = 376473, upload-time = "2025-05-16T09:25:03.688Z" }, + { url = "https://files.pythonhosted.org/packages/8b/6f/0f6accabd5d50a50d151999a7cf1ff46d3992cfdc39323409a4aa9cd1087/getml-1.5.1-1-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:c57eb2a1e2a417f13852b20f16194a53c763eb8fb46bbd7e5a9d4f20399d60fc", size = 16321429, upload-time = "2025-05-16T09:25:21.094Z" }, + { url = "https://files.pythonhosted.org/packages/b1/8e/69417db50a15d5c3a2e6c8e844569195d9ce5ccebbc3f35774543156bde0/getml-1.5.1-1-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:2fbfb1b522e65f28988455ba1cc7cc3ad27ae33be0f27b60fe0183e104a84986", size = 17067045, upload-time = "2025-05-16T09:25:30.506Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b4/3d80bff1dec219b73ccd0772b65ff30feffaf880bb9e13306e4421bb16ff/getml-1.5.1-2-py3-none-any.whl", hash = "sha256:e92c0015fb80687f74d147162e3d0bef372958fb233bb3f08c92ca84f089ca57", size = 376447, upload-time = "2025-05-19T09:15:52.016Z" }, + { url = "https://files.pythonhosted.org/packages/de/cc/bccd3e7694b8d5b44b7692d2d04988b454539196efc7cb3dcff8f66db1c8/getml-1.5.1-2-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:2d3c49357f1dd3c93606b108e8bbae431dd98e2c69977c07370ea408fd326b5f", size = 16321402, upload-time = "2025-05-19T09:16:10.074Z" }, + { url = "https://files.pythonhosted.org/packages/6c/27/45e883e4a78628256e95572f98397d306111b23759ce424d1296c4821052/getml-1.5.1-2-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:a4e9958ac9cd8110388f4cbbb3ae5c591cc37673140b121fbcdd1aa2e0e02a8d", size = 17067018, upload-time = "2025-05-19T09:16:19.082Z" }, + { url = "https://files.pythonhosted.org/packages/78/a4/7d30bf5f5e7291b3dbd4f28d57d24815975aa8a99d62e13a1235885ddf00/getml-1.5.1-3-py3-none-any.whl", hash = "sha256:f40f50f107d82cfc185822c320869aeaf4715e940b0c1994b9e2686a393b71c6", size = 377026, upload-time = "2025-08-11T12:52:18.639Z" }, + { url = "https://files.pythonhosted.org/packages/ed/67/8e36f28bec2f07da865e01db5b856fd74511af84973750961b01b8e597ca/getml-1.5.1-3-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:cdd316df5bc2cdd5e81dfa2b05d7d4175578b8df31a9d54b6a9c93ec550aa825", size = 16321981, upload-time = "2025-08-11T12:52:37.481Z" }, + { url = "https://files.pythonhosted.org/packages/f8/87/607ccdb8426428d2e2dadbcf2ad16c7af13a4cfc9a7626ca98e29a7db90f/getml-1.5.1-3-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:bd36b173c83065f93dc52f67e6343bdf5ca716439d29880d48c8815903aa7ac0", size = 17067596, upload-time = "2025-08-11T12:52:46.612Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8f/243c3020df81628f4a21eda20658874923f7e4751a1988b4cad2cc143bf5/getml-1.5.1-4-py3-none-any.whl", hash = "sha256:d963bb52224cfa6a7d35f9fd0006180f51852b745ce4f53c3b245d761b0df925", size = 377054, upload-time = "2025-10-20T09:50:01.205Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c2/88122ae55f740190a54526b1abc28dbb58aa13ee8fbf4c26fa9bd86a664c/getml-1.5.1-4-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:29ba6dbc4133865dbbe7691b2a0d603328bbff2a704c87a8323a8958d6b7231e", size = 16322011, upload-time = "2025-10-20T09:50:08.641Z" }, + { url = "https://files.pythonhosted.org/packages/f9/73/0dcb69ca2ea4f0d8572e7b93e625d3bb67c88487376ab5df864c64e8103d/getml-1.5.1-4-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:da75a93ed2c2aa044ee4428c57c726ef6a46668c92900c851e7f001e929705ee", size = 17067627, upload-time = "2025-10-20T09:50:17.138Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f7/690538489f59ca904c34d4ad415e6bcd0c7c166895128eceabafe27c0a50/getml-1.5.1-5-py3-none-any.whl", hash = "sha256:513d9e848e6b55ada5c3a1ba810114d35631121688b30851526f4cb818bf96f7", size = 377907, upload-time = "2025-10-27T10:15:14.86Z" }, + { url = "https://files.pythonhosted.org/packages/31/41/a59d6269bde50fce53c8595ee45fc0272897937795263c454edf6ebc6d5a/getml-1.5.1-5-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:2456b4515021bcc977c0e920b1f15c133b2bdf8071ff38927ddf2b83d9f5423f", size = 16322861, upload-time = "2025-10-27T10:15:22.499Z" }, + { url = "https://files.pythonhosted.org/packages/eb/2c/ce00e0e634cae38a53cab2283c6458000496663d27f36223f2896bf9c6b4/getml-1.5.1-5-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:18bbc7c19fde65fb4c2293132090396da6fef13c0b2777f81da3988bde32d561", size = 17068474, upload-time = "2025-10-27T10:15:30.778Z" }, + { url = "https://files.pythonhosted.org/packages/b9/ec/6b46f8e2988cf5e21d6e57dbc5860f467ecc2aed916e5882b12f1f5a9d41/getml-1.5.1-py3-none-any.whl", hash = "sha256:a4649425b8f74b6388f904b4671d18290f11aa0767348deaaafb06c3579c28c7", size = 376434, upload-time = "2025-05-15T11:30:25.198Z" }, + { url = "https://files.pythonhosted.org/packages/61/dc/c5d60509247ba723fb5e0a173b0ecfacc0ff1ee796e89adc0eaec57cde34/getml-1.5.1-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:97c156cc3223916a60b395ade6b8d536354ea111dbcb696a3cfeb298c39d873a", size = 16321389, upload-time = "2025-05-15T11:30:40.312Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b2/d561f6360f818869a899be87b53902dc4d2ec51f745d7bff46bae63ce680/getml-1.5.1-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:cfcfc5586515ba082ba829241743fb3610c568959de4b32f538b5031abcdac6c", size = 17067007, upload-time = "2025-05-15T11:30:48.644Z" }, ] [[package]] @@ -476,6 +515,7 @@ dependencies = [ [package.dev-dependencies] databricks = [ { name = "databricks-connect" }, + { name = "getml-interpretations" }, { name = "pydantic" }, { name = "requests" }, { name = "sqlglot" }, @@ -492,7 +532,7 @@ spark = [ [package.metadata] requires-dist = [ { name = "featuretools", specifier = "==1.31.0" }, - { name = "getml", specifier = "==1.5.0" }, + { name = "getml", specifier = "==1.5.1" }, { name = "ipywidgets", specifier = "==8.1.2" }, { name = "jupyterlab", specifier = "==4.1.1" }, { name = "matplotlib", specifier = "==3.8.2" }, @@ -505,7 +545,8 @@ requires-dist = [ [package.metadata.requires-dev] databricks = [ { name = "databricks-connect", specifier = "==17.3.2" }, - { name = "pydantic", specifier = "==2.12.5" }, + { name = "getml-interpretations", editable = "../getml-interpretations" }, + { name = "pydantic", specifier = "==2.11.7" }, { name = "requests", specifier = "==2.32.5" }, { name = "sqlglot", specifier = "==28.4.1" }, ] @@ -516,6 +557,51 @@ dev = [ ] spark = [{ name = "pyspark", specifier = "==4.0.1" }] +[[package]] +name = "getml-interpretations" +version = "0.1.0" +source = { editable = "../getml-interpretations" } +dependencies = [ + { name = "deigma" }, + { name = "getml" }, + { name = "getml-io" }, + { name = "httpx" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "stamina" }, +] + +[package.metadata] +requires-dist = [ + { name = "deigma", git = "https://github.com/getml/deigma.git" }, + { name = "getml", specifier = "~=1.5.1" }, + { name = "getml-io", git = "https://github.com/getml/getml-io.git?rev=171d1f9" }, + { name = "httpx", specifier = "~=0.28.1" }, + { name = "pydantic", specifier = "~=2.11.7" }, + { name = "pydantic-settings", specifier = "~=2.11.0" }, + { name = "stamina", specifier = "~=24.3.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "basedpyright", specifier = "~=1.31.4" }, + { name = "ipykernel", specifier = ">=6.30.1" }, + { name = "ruff", specifier = "~=0.12.12" }, +] + +[[package]] +name = "getml-io" +version = "0.2.0" +source = { git = "https://github.com/getml/getml-io.git?rev=171d1f9#171d1f9d016677167ded6cb13bef1e7c0006f05a" } +dependencies = [ + { name = "duckdb" }, + { name = "getml" }, + { name = "platformdirs" }, + { name = "pyarrow" }, + { name = "pydantic" }, + { name = "typer" }, +] + [[package]] name = "google-auth" version = "2.43.0" @@ -1274,7 +1360,7 @@ wheels = [ [[package]] name = "pandas" -version = "2.3.3" +version = "2.2.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, @@ -1282,15 +1368,15 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213, upload-time = "2024-09-20T13:10:04.827Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, - { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, - { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, - { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, - { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, - { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, - { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, + { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893, upload-time = "2024-09-20T13:09:09.655Z" }, + { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475, upload-time = "2024-09-20T13:09:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645, upload-time = "2024-09-20T19:02:03.88Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445, upload-time = "2024-09-20T13:09:17.621Z" }, + { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235, upload-time = "2024-09-20T19:02:07.094Z" }, + { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756, upload-time = "2024-09-20T13:09:20.474Z" }, + { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248, upload-time = "2024-09-20T13:09:23.137Z" }, ] [[package]] @@ -1356,11 +1442,11 @@ wheels = [ [[package]] name = "platformdirs" -version = "4.5.0" +version = "4.3.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload-time = "2025-10-08T17:44:48.791Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" }, + { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" }, ] [[package]] @@ -1477,20 +1563,17 @@ wheels = [ [[package]] name = "pyarrow" -version = "16.1.0" +version = "19.0.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1a/f2/67533f116deb6dae7a0ac04681695fe06135912253a115c5ecdc714a32d4/pyarrow-16.1.0.tar.gz", hash = "sha256:15fbb22ea96d11f0b5768504a3f961edab25eaf4197c341720c4a387f6c60315", size = 1080280, upload-time = "2024-05-14T13:54:39.227Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/09/a9046344212690f0632b9c709f9bf18506522feb333c894d0de81d62341a/pyarrow-19.0.1.tar.gz", hash = "sha256:3bf266b485df66a400f282ac0b6d1b500b9d2ae73314a153dbe97d6d5cc8a99e", size = 1129437, upload-time = "2025-02-18T18:55:57.027Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/84/bd/d5903125e38c33b74f7b3d57ffffd4ef48145208cfd8742367f12effb59c/pyarrow-16.1.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:2e51ca1d6ed7f2e9d5c3c83decf27b0d17bb207a7dea986e8dc3e24f80ff7d6f", size = 28372822, upload-time = "2024-05-14T13:44:24.111Z" }, - { url = "https://files.pythonhosted.org/packages/9b/73/560ef6bf05f16305502b8e368c771e8f82d774898b37a3fb231f89c13342/pyarrow-16.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06ebccb6f8cb7357de85f60d5da50e83507954af617d7b05f48af1621d331c9a", size = 26004052, upload-time = "2024-05-14T13:44:47.899Z" }, - { url = "https://files.pythonhosted.org/packages/56/5e/3cd956aceb1c960e8ac6fdc6eea69d642aa2e6ee10e2f10ce7815dbf62a9/pyarrow-16.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b04707f1979815f5e49824ce52d1dceb46e2f12909a48a6a753fe7cafbc44a0c", size = 38660648, upload-time = "2024-05-14T13:45:21.529Z" }, - { url = "https://files.pythonhosted.org/packages/08/4a/668e7fb6bc564e5361097f1f160b2891ca40bcacfe018638e2841073ec3d/pyarrow-16.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d32000693deff8dc5df444b032b5985a48592c0697cb6e3071a5d59888714e2", size = 40961053, upload-time = "2024-05-14T13:45:57.164Z" }, - { url = "https://files.pythonhosted.org/packages/f7/8f/a51a290a855172514b8496c8a74f0e0b98e5e0582d44ae7547cf68dd033b/pyarrow-16.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8785bb10d5d6fd5e15d718ee1d1f914fe768bf8b4d1e5e9bf253de8a26cb1628", size = 38060675, upload-time = "2024-05-14T13:46:30.885Z" }, - { url = "https://files.pythonhosted.org/packages/25/7b/8da91f8de0b40b760dd748031973b6ac2aa3d4f85c67f45b7e58577ca22e/pyarrow-16.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e1369af39587b794873b8a307cc6623a3b1194e69399af0efd05bb202195a5a7", size = 40826735, upload-time = "2024-05-14T13:47:07.089Z" }, - { url = "https://files.pythonhosted.org/packages/fa/2b/a0053f1304586f2976cb2c37ddb0e52cf4114220e805ebba272a1e231ccc/pyarrow-16.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:febde33305f1498f6df85e8020bca496d0e9ebf2093bab9e0f65e2b4ae2b3444", size = 25838156, upload-time = "2024-05-14T13:47:30.462Z" }, + { url = "https://files.pythonhosted.org/packages/78/b4/94e828704b050e723f67d67c3535cf7076c7432cd4cf046e4bb3b96a9c9d/pyarrow-19.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:80b2ad2b193e7d19e81008a96e313fbd53157945c7be9ac65f44f8937a55427b", size = 30670749, upload-time = "2025-02-18T18:53:00.062Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3b/4692965e04bb1df55e2c314c4296f1eb12b4f3052d4cf43d29e076aedf66/pyarrow-19.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:ee8dec072569f43835932a3b10c55973593abc00936c202707a4ad06af7cb294", size = 32128007, upload-time = "2025-02-18T18:53:06.581Z" }, + { url = "https://files.pythonhosted.org/packages/22/f7/2239af706252c6582a5635c35caa17cb4d401cd74a87821ef702e3888957/pyarrow-19.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d5d1ec7ec5324b98887bdc006f4d2ce534e10e60f7ad995e7875ffa0ff9cb14", size = 41144566, upload-time = "2025-02-18T18:53:11.958Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e3/c9661b2b2849cfefddd9fd65b64e093594b231b472de08ff658f76c732b2/pyarrow-19.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ad4c0eb4e2a9aeb990af6c09e6fa0b195c8c0e7b272ecc8d4d2b6574809d34", size = 42202991, upload-time = "2025-02-18T18:53:17.678Z" }, + { url = "https://files.pythonhosted.org/packages/fe/4f/a2c0ed309167ef436674782dfee4a124570ba64299c551e38d3fdaf0a17b/pyarrow-19.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d383591f3dcbe545f6cc62daaef9c7cdfe0dff0fb9e1c8121101cabe9098cfa6", size = 40507986, upload-time = "2025-02-18T18:53:26.263Z" }, + { url = "https://files.pythonhosted.org/packages/27/2e/29bb28a7102a6f71026a9d70d1d61df926887e36ec797f2e6acfd2dd3867/pyarrow-19.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b4c4156a625f1e35d6c0b2132635a237708944eb41df5fbe7d50f20d20c17832", size = 42087026, upload-time = "2025-02-18T18:53:33.063Z" }, + { url = "https://files.pythonhosted.org/packages/16/33/2a67c0f783251106aeeee516f4806161e7b481f7d744d0d643d2f30230a5/pyarrow-19.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:5bd1618ae5e5476b7654c7b55a6364ae87686d4724538c24185bbb2952679960", size = 25250108, upload-time = "2025-02-18T18:53:38.462Z" }, ] [[package]] @@ -1525,7 +1608,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.12.5" +version = "2.11.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -1533,38 +1616,48 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } +sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload-time = "2025-06-14T08:33:17.137Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782, upload-time = "2025-06-14T08:33:14.905Z" }, ] [[package]] name = "pydantic-core" -version = "2.41.5" +version = "2.33.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, - { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, - { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, - { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, - { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, - { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, - { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, - { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, - { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, - { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, - { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, - { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, - { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, - { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, - { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, - { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, - { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, - { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload-time = "2025-04-23T18:31:31.025Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload-time = "2025-04-23T18:31:32.514Z" }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload-time = "2025-04-23T18:31:33.958Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload-time = "2025-04-23T18:31:39.095Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload-time = "2025-04-23T18:31:41.034Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload-time = "2025-04-23T18:31:42.757Z" }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload-time = "2025-04-23T18:31:44.304Z" }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload-time = "2025-04-23T18:31:45.891Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload-time = "2025-04-23T18:31:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload-time = "2025-04-23T18:31:49.635Z" }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload-time = "2025-04-23T18:31:51.609Z" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/20/c5/dbbc27b814c71676593d1c3f718e6cd7d4f00652cefa24b75f7aa3efb25e/pydantic_settings-2.11.0.tar.gz", hash = "sha256:d0e87a1c7d33593beb7194adb8470fc426e95ba02af83a0f23474a04c9a08180", size = 188394, upload-time = "2025-09-24T14:19:11.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/d6/887a1ff844e64aa823fb4905978d882a633cfe295c32eacad582b78a7d8b/pydantic_settings-2.11.0-py3-none-any.whl", hash = "sha256:fe2cea3413b9530d10f3a5875adffb17ada5c1e1bab0b2885546d7310415207c", size = 48608, upload-time = "2025-09-24T14:19:10.015Z" }, ] [[package]] @@ -1606,6 +1699,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] +[[package]] +name = "python-dotenv" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" }, +] + [[package]] name = "python-json-logger" version = "4.0.0" @@ -1880,6 +1982,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, ] +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -1921,6 +2032,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, ] +[[package]] +name = "stamina" +version = "24.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tenacity" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c8/35/afe1f3467e840f414cfea90993c5a94490a6360eb3653236c3a7de099cf6/stamina-24.3.0.tar.gz", hash = "sha256:1d763c98962ca11f1729c357422926a750a138e803e7beb9f9d6c99d33d9997d", size = 558536, upload-time = "2024-08-27T14:54:16.996Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/81/818b0b93812cc0a69a0b17c591dca1a3779aeab7f0ff094dee51f4a6bcd3/stamina-24.3.0-py3-none-any.whl", hash = "sha256:28caf1a5db514256d86e32b60621630552fa9a60dace4e6fb5c78ba15f26236e", size = 16445, upload-time = "2024-08-27T14:54:14.448Z" }, +] + [[package]] name = "stanio" version = "0.5.1" @@ -2073,6 +2196,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/11/04/5980fc134d618f77516b42d9babcb103e6d539a6386c05e649ac1dab6422/tsfresh-0.20.3-py2.py3-none-any.whl", hash = "sha256:9f01b7b37b9c00348f132aa66a509f4cab8fd356121fae350469a4ca9f3a4df9", size = 95814, upload-time = "2024-08-03T20:51:43.409Z" }, ] +[[package]] +name = "typer" +version = "0.15.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6c/89/c527e6c848739be8ceb5c44eb8208c52ea3515c6cf6406aa61932887bf58/typer-0.15.4.tar.gz", hash = "sha256:89507b104f9b6a0730354f27c39fae5b63ccd0c95b1ce1f1a6ba0cfd329997c3", size = 101559, upload-time = "2025-05-14T16:34:57.704Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/62/d4ba7afe2096d5659ec3db8b15d8665bdcb92a3c6ff0b95e99895b335a9c/typer-0.15.4-py3-none-any.whl", hash = "sha256:eb0651654dcdea706780c466cf06d8f174405a659ffff8f163cfbfee98c0e173", size = 45258, upload-time = "2025-05-14T16:34:55.583Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0"