diff --git a/integration/snowflake/data/ingestion.py b/integration/snowflake/data/ingestion.py index 4a54249..4c32a1e 100644 --- a/integration/snowflake/data/ingestion.py +++ b/integration/snowflake/data/ingestion.py @@ -380,8 +380,11 @@ def _load_all_tables(session: Session, schema_name: str) -> dict[str, int]: logger.info("Loading tables from stage...") results: dict[str, int] = {} - for table_name in JAFFLE_SHOP_TABLE_NAMES: - row_count: int = _load_single_table(session, table_name, schema_name) + for source_name in JAFFLE_SHOP_TABLE_NAMES: + table_name = source_name.removeprefix("raw_") + row_count: int = _load_single_table( + session, source_name, table_name, schema_name + ) results[table_name] = row_count return results @@ -389,6 +392,7 @@ def _load_all_tables(session: Session, schema_name: str) -> dict[str, int]: def _load_single_table( session: Session, + source_name: str, table_name: str, schema_name: str, ) -> int: @@ -398,10 +402,11 @@ def _load_single_table( 1. Creates empty table with schema inferred from Parquet metadata (INFER_SCHEMA) 2. Copies data from stage using MATCH_BY_COLUMN_NAME for proper column mapping """ - logger.info(f"Loading {table_name}...") + logger.info(f"Loading {source_name} -> {table_name}...") create_sql: str = load_sql( path="ingestion/create_table_from_parquet.sql", + source_name=source_name, table_name=table_name, stage_name=DEFAULT_STAGE_NAME, schema_name=schema_name, @@ -410,6 +415,7 @@ def _load_single_table( copy_sql: str = load_sql( path="ingestion/copy_into_table.sql", + source_name=source_name, table_name=table_name, stage_name=DEFAULT_STAGE_NAME, schema_name=schema_name, diff --git a/integration/snowflake/data/preparation.py b/integration/snowflake/data/preparation.py index d094aa0..d13fac9 100644 --- a/integration/snowflake/data/preparation.py +++ b/integration/snowflake/data/preparation.py @@ -2,7 +2,7 @@ This module creates: - weekly_stores table: Store-week combinations with reference_date (Monday week start) -- Population view with target (next week's sales) +- Population dynamic table with target (next week's sales) reference_date is the Monday (week start) derived from DATE_TRUNC('week', ordered_at). @@ -67,7 +67,7 @@ def create_weekly_sales_by_store_with_target( Creates: - weekly_stores: Table with store-week combinations (reference_date = Monday) - - Population view with target column (configurable name via table_name) + - Population dynamic table with target column (configurable name via table_name) - Target: Sum of order_total for the 7-day window starting at reference_date When settings are provided, auto-bootstraps the warehouse and database @@ -77,7 +77,7 @@ def create_weekly_sales_by_store_with_target( session: Active Snowflake Snowpark session. settings: Optional settings for auto-bootstrapping warehouse and database. When provided, ensures infrastructure exists before preparing data. - source_schema: Schema containing raw_stores and raw_orders tables. + source_schema: Schema containing stores and orders tables. target_schema: Schema where prepared tables/views will be created. table_name: Name of the population view to create. @@ -104,9 +104,13 @@ def create_weekly_sales_by_store_with_target( ================================================================================ """) + warehouse = session.get_current_warehouse() + if not warehouse: + raise DataPreparationError("No warehouse set. Required for dynamic table creation.") + _analyze_and_display_stores(session, source_schema) - per_store = _create_weekly_stores_table(session, source_schema, target_schema) - _create_target_view(session, source_schema, target_schema, table_name) + per_store = _create_weekly_stores_dynamic_table(session, source_schema, target_schema, warehouse) + _create_target_dynamic_table(session, source_schema, target_schema, table_name, warehouse) _display_sample_data(session, target_schema, per_store, table_name) _display_store_statistics(session, target_schema, table_name) @@ -122,8 +126,8 @@ def create_weekly_sales_by_store_with_target( ================================================================================ Objects created in {target_schema} schema: - - weekly_stores (TABLE) - - {table_name} (VIEW - USE THIS FOR getML) + - weekly_stores (DYNAMIC TABLE) + - {table_name} (DYNAMIC TABLE - USE THIS FOR getML) Population table: {qualified_table_name} """) @@ -138,7 +142,7 @@ def create_weekly_sales_by_store_with_target( def _validate_source_tables(session: Session, source_schema: str) -> None: """Validate that source schema exists and contains required tables.""" - required_tables: list[str] = ["raw_stores", "raw_orders"] + required_tables: list[str] = ["stores", "orders"] logger.info(f"Validating {source_schema} schema and required tables...") try: @@ -192,29 +196,28 @@ def _analyze_and_display_stores(session: Session, source_schema: str) -> None: ) -def _create_weekly_stores_table( +def _create_weekly_stores_dynamic_table( session: Session, source_schema: str, target_schema: str, + warehouse: str, ) -> list[Row]: - """Create weekly_stores table with store-week combinations. + """Create weekly_stores dynamic table with store-week combinations. Creates one row per store per week using reference_date (Monday week start). Returns: List of store information rows. """ - logger.info("\n2. Creating weekly_stores table (store-week combinations)...") + logger.info("\n2. Creating weekly_stores dynamic table (store-week combinations)...") logger.info(" reference_date is Monday (week start) from DATE_TRUNC('week', ...)") - _ = session.sql( - load_sql(path="preparation/drop_weekly_stores.sql", target_schema=target_schema) - ).collect() _ = session.sql( query=load_sql( path="preparation/create_weekly_stores.sql", source_schema=source_schema, target_schema=target_schema, + warehouse=warehouse, ) ).collect() @@ -244,20 +247,22 @@ def _create_weekly_stores_table( return per_store -def _create_target_view( +def _create_target_dynamic_table( session: Session, source_schema: str, target_schema: str, table_name: str, + warehouse: str, ) -> None: - """Create view with target - total sales for the following week per store.""" - logger.info("\n3. Creating target view: next week's total sales per store...") + """Create dynamic table with target - total sales for the following week per store.""" + logger.info("\n3. Creating target dynamic table: next week's total sales per store...") _ = session.sql( query=load_sql( path="preparation/calculate_target.sql", source_schema=source_schema, target_schema=target_schema, table_name=table_name, + warehouse=warehouse, ) ).collect() diff --git a/integration/snowflake/data/sql/ingestion/copy_into_table.sql b/integration/snowflake/data/sql/ingestion/copy_into_table.sql index 2a7ae6f..f28db4a 100644 --- a/integration/snowflake/data/sql/ingestion/copy_into_table.sql +++ b/integration/snowflake/data/sql/ingestion/copy_into_table.sql @@ -1,6 +1,6 @@ -- Copy data from staged Parquet file into table -- Uses MATCH_BY_COLUMN_NAME to map Parquet columns to table columns COPY INTO {schema_name}.{table_name} - FROM @{schema_name}.{stage_name}/{table_name}.parquet + FROM @{schema_name}.{stage_name}/{source_name}.parquet FILE_FORMAT = (FORMAT_NAME = '{schema_name}.PARQUET_FORMAT') MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE; diff --git a/integration/snowflake/data/sql/ingestion/create_table_from_parquet.sql b/integration/snowflake/data/sql/ingestion/create_table_from_parquet.sql index bd10f2e..9a9f37a 100644 --- a/integration/snowflake/data/sql/ingestion/create_table_from_parquet.sql +++ b/integration/snowflake/data/sql/ingestion/create_table_from_parquet.sql @@ -10,7 +10,7 @@ CREATE OR REPLACE TABLE {schema_name}.{table_name} )) FROM TABLE( INFER_SCHEMA( - LOCATION=>'@{schema_name}.{stage_name}/{table_name}.parquet', + LOCATION=>'@{schema_name}.{stage_name}/{source_name}.parquet', FILE_FORMAT=>'{schema_name}.PARQUET_FORMAT' ) )); diff --git a/integration/snowflake/data/sql/preparation/analyze_stores.sql b/integration/snowflake/data/sql/preparation/analyze_stores.sql index ce6aebf..c752b69 100644 --- a/integration/snowflake/data/sql/preparation/analyze_stores.sql +++ b/integration/snowflake/data/sql/preparation/analyze_stores.sql @@ -7,7 +7,7 @@ SELECT MAX(TRY_TO_TIMESTAMP(o.ordered_at)) as last_order, COUNT(o.id) as total_orders, SUM(COALESCE(o.order_total, 0)) / 100.0 as total_sales -FROM {source_schema}.raw_stores s -LEFT JOIN {source_schema}.raw_orders o ON o.store_id = s.id +FROM {source_schema}.stores s +LEFT JOIN {source_schema}.orders o ON o.store_id = s.id GROUP BY s.id, s.name, s.opened_at ORDER BY TRY_TO_TIMESTAMP(s.opened_at); diff --git a/integration/snowflake/data/sql/preparation/calculate_target.sql b/integration/snowflake/data/sql/preparation/calculate_target.sql index 45fc628..2aa3b40 100644 --- a/integration/snowflake/data/sql/preparation/calculate_target.sql +++ b/integration/snowflake/data/sql/preparation/calculate_target.sql @@ -1,6 +1,6 @@ --- Create view with target: next week's sales per store +-- Create dynamic table with target: next week's sales per store -- --- This view joins weekly_stores with pre-aggregated order totals. +-- Dynamic table joins weekly_stores with pre-aggregated order totals. -- Target is the sum of order_total for the 7-day window starting at reference_date. -- -- Window: [reference_date, reference_date + 7 days) @@ -8,14 +8,17 @@ -- - Target covers Monday through Sunday of that week -- -- Optimized: Single aggregation pass instead of correlated subqueries -CREATE OR REPLACE VIEW {target_schema}.{table_name} AS +CREATE OR REPLACE DYNAMIC TABLE {target_schema}.{table_name} + TARGET_LAG = '1 day' + WAREHOUSE = {warehouse} +AS WITH weekly_order_totals AS ( SELECT store_id, DATE_TRUNC('week', TRY_TO_TIMESTAMP(ordered_at)) as week_start, SUM(order_total) / 100.0 as week_sales, COUNT(*) as week_orders - FROM {source_schema}.raw_orders + FROM {source_schema}.orders WHERE ordered_at IS NOT NULL GROUP BY store_id, DATE_TRUNC('week', TRY_TO_TIMESTAMP(ordered_at)) ) diff --git a/integration/snowflake/data/sql/preparation/create_weekly_stores.sql b/integration/snowflake/data/sql/preparation/create_weekly_stores.sql index af3f2ef..f606a42 100644 --- a/integration/snowflake/data/sql/preparation/create_weekly_stores.sql +++ b/integration/snowflake/data/sql/preparation/create_weekly_stores.sql @@ -1,6 +1,6 @@ -- Create store-week combinations for weekly sales forecasting -- --- This table creates the base data for getML: one row per store per week. +-- This dynamic table creates the base data for getML: one row per store per week. -- reference_date is the Monday (week start) derived from DATE_TRUNC('week', ordered_at). -- -- Filtering logic: @@ -11,7 +11,10 @@ -- - is_full_week_after_opening: Store had a full week of operation before this week -- - has_order_activity: Store has order data spanning this week -- - has_min_history: At least 7 days since store opened -CREATE TABLE {target_schema}.weekly_stores AS +CREATE OR REPLACE DYNAMIC TABLE {target_schema}.weekly_stores + TARGET_LAG = '1 day' + WAREHOUSE = {warehouse} +AS WITH store_activity AS ( SELECT s.id as store_id, @@ -22,20 +25,20 @@ WITH store_activity AS ( MAX(TRY_TO_TIMESTAMP(o.ordered_at)) as last_order_date, DATE_TRUNC('week', MIN(TRY_TO_TIMESTAMP(o.ordered_at))) as first_order_week, DATE_TRUNC('week', MAX(TRY_TO_TIMESTAMP(o.ordered_at))) as last_order_week - FROM {source_schema}.raw_stores s - LEFT JOIN {source_schema}.raw_orders o ON o.store_id = s.id + FROM {source_schema}.stores s + LEFT JOIN {source_schema}.orders o ON o.store_id = s.id GROUP BY s.id, s.name, TRY_TO_TIMESTAMP(s.opened_at) ), all_weeks AS ( SELECT DISTINCT DATE_TRUNC('week', TRY_TO_TIMESTAMP(ordered_at)) as reference_date - FROM {source_schema}.raw_orders + FROM {source_schema}.orders WHERE ordered_at IS NOT NULL ), store_weeks AS ( - SELECT + SELECT sa.store_id, sa.store_name, w.reference_date, @@ -49,8 +52,8 @@ store_weeks AS ( AND w.reference_date < sa.last_order_week ) -SELECT - ROW_NUMBER() OVER (ORDER BY reference_date, store_id) as snapshot_id, +SELECT + HASH(store_id, reference_date) as snapshot_id, store_id, store_name, reference_date, @@ -59,9 +62,8 @@ SELECT EXTRACT(week FROM reference_date) as week_number, DATEDIFF('day', opened_at, reference_date) as days_since_open, reference_date >= first_full_week as is_full_week_after_opening, - first_order_week IS NOT NULL + first_order_week IS NOT NULL AND reference_date >= first_order_week AND reference_date < last_order_week as has_order_activity, DATEDIFF('day', opened_at, reference_date) >= 7 as has_min_history -FROM store_weeks -ORDER BY reference_date, store_id; +FROM store_weeks; diff --git a/integration/snowflake/mise.toml b/integration/snowflake/mise.toml index 69eac93..34b4eec 100644 --- a/integration/snowflake/mise.toml +++ b/integration/snowflake/mise.toml @@ -1,9 +1,11 @@ [env] SNOWFLAKE_ACCOUNT = "{{ exec(command='op read --account getml.1password.eu \"op://svibqfali56qralxbzg6wanc5i/Snowflake/account\"', cache_key='snowflake_account', duration='1w') }}" SNOWFLAKE_USER = "{{ exec(command='op read --account getml.1password.eu \"op://svibqfali56qralxbzg6wanc5i/Snowflake/username\"', cache_key='snowflake_user', duration='1w') }}" -SNOWFLAKE_PASSWORD = "{{ exec(command='op read --account getml.1password.eu \"op://svibqfali56qralxbzg6wanc5i/Snowflake/password\"', cache_key='snowflake_password', duration='1w') }}" +SNOWFLAKE_PASSWORD = "{{ exec(command='op read --account getml.1password.eu \"op://svibqfali56qralxbzg6wanc5i/Snowflake/access_token\"', cache_key='snowflake_access_token__', duration='1w') }}" SNOWFLAKE_ROLE = "ACCOUNTADMIN" SNOWFLAKE_WAREHOUSE = "COMPUTE_WH" SNOWFLAKE_DATABASE = "JAFFLE_SHOP" SNOWFLAKE_SCHEMA = "RAW" + +FDS_API_KEY = "{{ exec(command='op read --account getml.1password.eu \"op://svibqfali56qralxbzg6wanc5i/SupabaseProject/TEST_API_KEY\"', cache_key='fds_api_key', duration='1w') }}" diff --git a/integration/snowflake/notebooks/annotations.yml b/integration/snowflake/notebooks/annotations.yml index 87cf1e6..f4ea39f 100644 --- a/integration/snowflake/notebooks/annotations.yml +++ b/integration/snowflake/notebooks/annotations.yml @@ -1,475 +1,504 @@ 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 + - 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 - - name: order_id + 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 + snowflake_fqn: RAW.ORDERS + type: TABLE + role: peripheral + 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: 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. + - 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. + 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. + " + columns: + - name: supply_uuid + description: The unique key of our supplies per cost. + - name: weekly_sales_by_store + snowflake_fqn: PREPARED.WEEKLY_SALES_BY_STORE_WITH_TARGET + type: VIEW + role: population + description: Prepared weekly sales data by store with target variable. Population table for getML weekly_sales_features pipeline. Contains store-week aggregations with NEXT_WEEK_SALES as prediction target. + - name: getml_features + snowflake_fqn: GETML_FS.GETML_FEATURES + type: TABLE + role: features + - name: feature_metadata + snowflake_fqn: GETML_FS.FEATURE_METADATA + type: TABLE + role: metadata + description: getML feature metadata including SQL provenance for GETML_FEATURES table. 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. + defaults: + agg_time_dimension: first_ordered_at + description: "Customer grain mart. - ' - 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('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('order_items') - entities: + " + 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 - 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 + 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: - time_granularity: day - - name: is_food_item - type: categorical - - name: is_drink_item - type: categorical - measures: + 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: 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 + 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 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 + description: The revenue from food in each order + label: Food Revenue + type: simple + type_params: + measure: food_revenue - 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 + 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: - 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: + measure: revenue - 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 + 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: 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: 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 + " + - 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: + 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 - 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: + 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 - config: - export_as: table + 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/snowflake/notebooks/metadata.py b/integration/snowflake/notebooks/metadata.py new file mode 100644 index 0000000..dd33772 --- /dev/null +++ b/integration/snowflake/notebooks/metadata.py @@ -0,0 +1,148 @@ +import json +from dataclasses import dataclass + +import pandas as pd +from snowflake.snowpark import Table + + +@dataclass +class TableAnnotation: + name: str + description: str | None = None + snowflake_fqn: str | None = None + object_type: str | None = None + role: str | None = None + + +def parse_annotations(data: dict) -> dict[str, TableAnnotation]: + return { + t["name"]: TableAnnotation( + name=t["name"], + description=t.get("description"), + snowflake_fqn=t.get("snowflake_fqn"), + object_type=t.get("type"), + role=t.get("role"), + ) + for t in data["tables"] + } + + +@dataclass +class Feature: + name: str + title: str + description: str + description_confidence: str + importance: float + correlation: float + target: str + sql: str + + +def parse_features(data: dict) -> list[Feature]: + return [ + Feature( + name=name, + title=data["feature_descriptions"][name]["title"], + description=data["feature_descriptions"][name]["description"], + description_confidence=data["feature_descriptions"][name]["description_confidence"], + importance=feat["importance"], + correlation=feat["correlation"], + target=feat["target"], + sql=feat["sql"], + ) + for name, feat in data["features"].items() + ] + + +def get_fqn(table: Table) -> str: + return ".".join(table.queries["queries"][0].split()[-1].split(".")[-2:]) + + +def enrich_object( + table: Table, + *, + object_type: str = "TABLE", + description: str | None = None, + column_comments: dict[str, str] | None = None, + tags: dict[str, str] | None = None, +) -> None: + fqn = get_fqn(table) + + if description: + table.session.sql(f"COMMENT ON {object_type} {fqn} IS '{description}'").collect() + + for col, comment in (column_comments or {}).items(): + table.session.sql(f"COMMENT ON COLUMN {fqn}.{col} IS '{comment}'").collect() + + for tag, value in (tags or {}).items(): + table.session.sql(f"ALTER {object_type} {fqn} SET TAG GETML_FS.{tag} = '{value}'").collect() + + +def enrich_feature_table( + features_table: Table, + feature_view_fqn: str, + features: list[Feature], + *, + join_key_comments: dict[str, str] | None = None, +) -> None: + fqn = get_fqn(features_table) + session = features_table.session + + for feat in features: + col = feat.title.upper() + session.sql(f"COMMENT ON COLUMN {fqn}.{col} IS '{feat.description}'").collect() + for tag, value in { + "GETML_ORIGINAL_NAME": feat.name, + "GETML_IMPORTANCE": f"{feat.importance:.6f}", + "GETML_CORRELATION": f"{feat.correlation:.4f}", + "GETML_TARGET": feat.target, + }.items(): + session.sql( + f"ALTER VIEW {feature_view_fqn} MODIFY COLUMN {col} SET TAG GETML_FS.{tag} = '{value}'" + ).collect() + + for col, comment in (join_key_comments or {}).items(): + session.sql(f"COMMENT ON COLUMN {fqn}.{col} IS '{comment}'").collect() + + +def create_feature_metadata_table( + source_table: Table, features: list[Feature], *, schema: str = "GETML_FS" +) -> Table: + session = source_table.session + rows = [ + { + "FEATURE_NAME": f.title.upper(), + "ORIGINAL_NAME": f.name, + "IMPORTANCE": f.importance, + "CORRELATION": f.correlation, + "TARGET": f.target, + "DESCRIPTION": f.description, + "DESCRIPTION_CONFIDENCE": f.description_confidence, + "SQL_CODE": f.sql, + "FULL_METADATA": json.dumps(vars(f)), + } + for f in features + ] + + session.write_pandas( + pd.DataFrame(rows), + table_name="FEATURE_METADATA", + schema=schema, + auto_create_table=True, + overwrite=True, + ) + return session.table(f"{schema}.FEATURE_METADATA") + + +def setup_getml_tags(table: Table, schema: str = "GETML_FS") -> None: + for name, comment, allowed in [ + ("GETML_ORIGINAL_NAME", "Original getML feature name (e.g., feature_1_1)", None), + ("GETML_IMPORTANCE", "XGBoost feature importance score", None), + ("GETML_CORRELATION", "Pearson correlation with target variable", None), + ("GETML_TARGET", "Target variable this feature predicts", None), + ("GETML_PIPELINE", "Name of getML pipeline using this data", None), + ("GETML_ROLE", "Role of table in getML data model", ["population", "peripheral", "features", "metadata"]), + ]: + allowed_clause = f"ALLOWED_VALUES {', '.join(repr(v) for v in allowed)} " if allowed else "" + table.session.sql(f"CREATE TAG IF NOT EXISTS {schema}.{name} {allowed_clause}COMMENT = '{comment}'").collect() diff --git a/integration/snowflake/notebooks/snowflake_feature_store.ipynb b/integration/snowflake/notebooks/snowflake_feature_store.ipynb index 8aae03d..4fd4725 100644 --- a/integration/snowflake/notebooks/snowflake_feature_store.ipynb +++ b/integration/snowflake/notebooks/snowflake_feature_store.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "13f25b67", + "id": "d3c535de", "metadata": {}, "source": [ "# Build Snowflake Feature Store with getML" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "1078fef1", + "id": "7a578720", "metadata": {}, "source": [ "This notebook demonstrates how to build a Snowflake Feature Store using getML's automated feature engineering. We'll load data from Snowflake, generate time-series features with FastProp, and register them as a versioned FeatureView with full metadata enrichment.\n", @@ -20,45 +20,41 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "6c5c13f8", + "execution_count": null, + "id": "f2b8e8e2", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[2K Loading pipelines... ━━━━━━━━━━━━━━━ 100% • 00:00\n", - "\u001b[?25h" - ] - }, - { - "data": { - "text/html": [ - "
Connected to project 'snowflake_feature_store'.\n",
-       "
\n" - ], - "text/plain": [ - "Connected to project \u001b[32m'snowflake_feature_store'\u001b[0m.\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ + "import os\n", + "\n", "import getml\n", - "from dotenv import load_dotenv\n", + "from snowflake.snowpark import Session\n", "\n", "PROJECT_NAME = \"snowflake_feature_store\"\n", "\n", - "load_dotenv(dotenv_path=\".env\")\n", + "SNOWFLAKE_ACCOUNT = os.getenv(\"SNOWFLAKE_ACCOUNT\")\n", + "SNOWFLAKE_USER = os.getenv(\"SNOWFLAKE_USER\")\n", + "SNOWFLAKE_PASSWORD = os.getenv(\"SNOWFLAKE_PASSWORD\")\n", + "SNOWFLAKE_ROLE = os.getenv(\"SNOWFLAKE_ROLE\")\n", + "SNOWFLAKE_WAREHOUSE = os.getenv(\"SNOWFLAKE_WAREHOUSE\")\n", + "SNOWFLAKE_DATABASE = os.getenv(\"SNOWFLAKE_DATABASE\")\n", + "SNOWFLAKE_SCHEMA = os.getenv(\"SNOWFLAKE_SCHEMA\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2980df17", + "metadata": {}, + "outputs": [], + "source": [ + "\n", "getml.set_project(PROJECT_NAME)" ] }, { "cell_type": "markdown", - "id": "8cbdf6fe", + "id": "f4b83981", "metadata": {}, "source": [ "## Setup and Data Loading\n", @@ -68,22 +64,21 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "f60ea24a", + "execution_count": null, + "id": "5a556512", "metadata": {}, "outputs": [], "source": [ - "import os\n", - "from snowflake.snowpark import Session\n", "\n", - "connection_params: dict[str, str | int] = {\n", - " \"account\": os.environ[\"SNOWFLAKE_ACCOUNT\"],\n", - " \"user\": os.environ[\"SNOWFLAKE_USER\"],\n", - " \"password\": os.environ[\"SNOWFLAKE_PASSWORD\"],\n", - " \"role\": os.environ[\"SNOWFLAKE_ROLE\"],\n", - " \"warehouse\": os.environ[\"SNOWFLAKE_WAREHOUSE\"],\n", - " \"database\": os.environ[\"SNOWFLAKE_DATABASE\"],\n", - " \"schema\": os.environ[\"SNOWFLAKE_SCHEMA\"],\n", + "\n", + "connection_params = {\n", + " \"account\": SNOWFLAKE_ACCOUNT,\n", + " \"user\": SNOWFLAKE_USER,\n", + " \"password\": SNOWFLAKE_PASSWORD,\n", + " \"role\": SNOWFLAKE_ROLE,\n", + " \"warehouse\": SNOWFLAKE_WAREHOUSE,\n", + " \"database\": SNOWFLAKE_DATABASE,\n", + " \"schema\": SNOWFLAKE_SCHEMA,\n", "}\n", "\n", "session = Session.builder.configs(connection_params).create()" @@ -91,23 +86,10 @@ }, { "cell_type": "code", - "execution_count": 3, - "id": "c74087f2", + "execution_count": null, + "id": "9ac76623", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "DataFrame.to_arrow() is experimental since 1.28.0. Do not use it in production. \n", - "/home/alex/projects/worktrees/getml-demo/60-create-initial-snowflake-notebook-5-sections/integration/snowflake/notebooks/.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", - " warnings.warn(\n" - ] - } - ], + "outputs": [], "source": [ "weekly_sales_by_store = getml.DataFrame.from_arrow(\n", " session.table(\"PREPARED.WEEKLY_SALES_BY_STORE_WITH_TARGET\").to_arrow(),\n", @@ -115,26 +97,30 @@ ")\n", "\n", "orders = getml.DataFrame.from_arrow(\n", - " session.table(\"RAW.RAW_ORDERS\").to_arrow(),\n", + " session.table(\"RAW.ORDERS\").to_arrow(),\n", " name=\"orders\",\n", ")" ] }, { "cell_type": "markdown", - "id": "7b82cc8b", + "id": "a3a339f5", "metadata": {}, "source": [ "## Annotations\n", "\n", - "Define semantic roles for each column. Roles tell getML how to use columns: `join_key` for entity relationships, `time_stamp` for temporal ordering, `target` for prediction, and `numerical`/`categorical` for feature types." + "Define semantic roles for each column. Roles tell getML how to use columns:\n", + "`join_key` for entity relationships, `time_stamp` for temporal ordering,\n", + "`target` for prediction, and `numerical`/`categorical` for feature types." ] }, { "cell_type": "code", - "execution_count": 4, - "id": "f7e9a569", - "metadata": {}, + "execution_count": null, + "id": "db1249fe", + "metadata": { + "lines_to_next_cell": 2 + }, "outputs": [], "source": [ "weekly_sales_by_store.set_role(\n", @@ -156,13 +142,13 @@ ")\n", "weekly_sales_by_store.set_role(\n", " cols=[\"DAYS_SINCE_OPEN\", \"NEXT_WEEK_ORDERS\"], role=getml.data.roles.numerical\n", - ")\n" + ")" ] }, { "cell_type": "code", - "execution_count": 5, - "id": "5ecde0c7", + "execution_count": null, + "id": "dee3ab0c", "metadata": {}, "outputs": [], "source": [ @@ -179,2099 +165,27 @@ }, { "cell_type": "code", - "execution_count": 6, - "id": "8377deab", + "execution_count": null, + "id": "942ccbe7", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
name REFERENCE_DATE STORE_IDSNAPSHOT_IDNEXT_WEEK_SALESSTORE_NAME YEAR MONTH WEEK_NUMBERIS_FULL_WEEK_AFTER_OPENINGHAS_ORDER_ACTIVITYHAS_MIN_HISTORYDAYS_SINCE_OPENNEXT_WEEK_ORDERS
role time_stamp join_key join_key targetcategorical categoricalcategoricalcategoricalcategorical categorical categorical numerical numerical
unittime stamp, comparison only
02019-05-20fc7707c0-2f1e-48d4-b870-7cbeddfc...48\n", - " 13165.49\n", - " Philadelphia2019521truetruetrue\n", - " 261 \n", - " \n", - " 1126 \n", - "
12020-04-27eafbd328-0434-4f46-9c2d-cc97a46f...145\n", - " 24888.19\n", - " Brooklyn2020418truetruetrue\n", - " 412 \n", - " \n", - " 2346 \n", - "
22020-04-06eafbd328-0434-4f46-9c2d-cc97a46f...139\n", - " 25648.41\n", - " Brooklyn2020415truetruetrue\n", - " 391 \n", - " \n", - " 2386 \n", - "
32019-07-08eafbd328-0434-4f46-9c2d-cc97a46f...61\n", - " 10507.1\n", - " Brooklyn2019728truetruetrue\n", - " 118 \n", - " \n", - " 1113 \n", - "
42018-12-03fc7707c0-2f1e-48d4-b870-7cbeddfc...14\n", - " 8689.4\n", - " Philadelphia20181249truetruetrue\n", - " 93 \n", - " \n", - " 737 \n", - "
.........\n", - " ... \n", - " .....................\n", - " ... \n", - " \n", - " ... \n", - "
13742022-01-24fc7707c0-2f1e-48d4-b870-7cbeddfc...575\n", - " 18781.06\n", - " Philadelphia202214truetruetrue\n", - " 1241 \n", - " \n", - " 1592 \n", - "
13752022-03-07c40b9cf5-6513-4f4c-a7fb-b72a1cdd...609\n", - " 16108.55\n", - " New Orleans2022310truetruetrue\n", - " 363 \n", - " \n", - " 1462 \n", - "
13762022-04-18c40b9cf5-6513-4f4c-a7fb-b72a1cdd...645\n", - " 15509.46\n", - " New Orleans2022416truetruetrue\n", - " 405 \n", - " \n", - " 1419 \n", - "
13772022-07-11abfcc332-1eaf-42f6-b8e4-569bf6a3...716\n", - " 18860.26\n", - " Chicago2022728truetruetrue\n", - " 804 \n", - " \n", - " 1708 \n", - "
13782022-10-03fc7707c0-2f1e-48d4-b870-7cbeddfc...791\n", - " 18447.09\n", - " Philadelphia20221040truetruetrue\n", - " 1493 \n", - " \n", - " 1577 \n", - "
\n", - "\n", - "

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

\n" - ], - "text/plain": [ - "name REFERENCE_DATE STORE_ID SNAPSHOT_ID NEXT_WEEK_SALES ...\n", - "role time_stamp join_key join_key target ...\n", - "unit time stamp, comparison only ...\n", - " 0 2019-05-20 fc7707c0-2f1e-48d4-b870-7cbeddfc... 48 13165.49 ...\n", - " 1 2020-04-27 eafbd328-0434-4f46-9c2d-cc97a46f... 145 24888.19 ...\n", - " 2 2020-04-06 eafbd328-0434-4f46-9c2d-cc97a46f... 139 25648.41 ...\n", - " 3 2019-07-08 eafbd328-0434-4f46-9c2d-cc97a46f... 61 10507.1 ...\n", - " 4 2018-12-03 fc7707c0-2f1e-48d4-b870-7cbeddfc... 14 8689.4 ...\n", - " ... ... ... ... \n", - "1374 2022-01-24 fc7707c0-2f1e-48d4-b870-7cbeddfc... 575 18781.06 ...\n", - "1375 2022-03-07 c40b9cf5-6513-4f4c-a7fb-b72a1cdd... 609 16108.55 ...\n", - "1376 2022-04-18 c40b9cf5-6513-4f4c-a7fb-b72a1cdd... 645 15509.46 ...\n", - "1377 2022-07-11 abfcc332-1eaf-42f6-b8e4-569bf6a3... 716 18860.26 ...\n", - "1378 2022-10-03 fc7707c0-2f1e-48d4-b870-7cbeddfc... 791 18447.09 ...\n", - "\n", - "name IS_FULL_WEEK_AFTER_OPENING HAS_ORDER_ACTIVITY HAS_MIN_HISTORY DAYS_SINCE_OPEN NEXT_WEEK_ORDERS\n", - "role categorical categorical categorical numerical numerical\n", - "unit \n", - " 0 true true true 261 1126\n", - " 1 true true true 412 2346\n", - " 2 true true true 391 2386\n", - " 3 true true true 118 1113\n", - " 4 true true true 93 737\n", - " ... ... ... ... ...\n", - "1374 true true true 1241 1592\n", - "1375 true true true 363 1462\n", - "1376 true true true 405 1419\n", - "1377 true true true 804 1708\n", - "1378 true true true 1493 1577\n", - "\n", - "\n", - "1379 rows x 13 columns\n", - "memory usage: 0.09 MB\n", - "type: getml.DataFrame" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "weekly_sales_by_store" ] }, { "cell_type": "code", - "execution_count": 7, - "id": "27494788", + "execution_count": null, + "id": "2f0ad08f", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
name ORDERED_AT STORE_ID ID CUSTOMER SUBTOTALORDER_TOTAL TAX_PAID
role time_stamp join_key join_key join_keynumerical numericalnumerical
unittime stamp, comparison only
02020-05-18 07:57:00fc7707c0-2f1e-48d4-b870-7cbeddfc...87534090-1a48-4eaf-b9da-e1d72c44...842117f6-5664-4a5b-8b49-fbcd3a0e...\n", - " 400 \n", - " \n", - " 424 \n", - " \n", - " 24 \n", - "
12020-05-18 11:14:00fc7707c0-2f1e-48d4-b870-7cbeddfc...704ceb66-15d1-4d38-a4e8-c3366e9f...4f4b4c37-1f35-4eb7-8571-d2a7a18d...\n", - " 1800 \n", - " \n", - " 1908 \n", - " \n", - " 108 \n", - "
22020-05-18 07:45:00fc7707c0-2f1e-48d4-b870-7cbeddfc...8d390a24-c412-47af-a162-15e793af...a0275acc-54be-4ba5-a867-9cc11872...\n", - " 700 \n", - " \n", - " 742 \n", - " \n", - " 42 \n", - "
32020-05-18 14:11:00fc7707c0-2f1e-48d4-b870-7cbeddfc...482f4829-01f9-425e-8165-c9cd3d6f...592c992f-825b-46f6-97c8-e3859212...\n", - " 600 \n", - " \n", - " 636 \n", - " \n", - " 36 \n", - "
42020-05-18 08:03:00fc7707c0-2f1e-48d4-b870-7cbeddfc...31455243-410c-41a7-9740-03e1f8f5...c9479483-919a-414a-ae7a-480e9df3...\n", - " 700 \n", - " \n", - " 742 \n", - " \n", - " 42 \n", - "
............\n", - " ... \n", - " \n", - " ... \n", - " \n", - " ... \n", - "
23095982022-12-05 07:50:00abfcc332-1eaf-42f6-b8e4-569bf6a3...6eee4b32-6dd2-45e3-bc13-f357af5c...a389b16e-642a-4a42-84f0-7a7cb672...\n", - " 500 \n", - " \n", - " 531 \n", - " \n", - " 31 \n", - "
23095992022-12-05 07:49:006964b061-b98d-43f2-9078-ef9c423e...677cd97b-8fa7-4e81-b41a-0134ad01...14d84646-1a4e-4b91-928c-eb821b65...\n", - " 500 \n", - " \n", - " 537 \n", - " \n", - " 37 \n", - "
23096002022-12-05 08:27:006964b061-b98d-43f2-9078-ef9c423e...30c71271-898e-452d-aab2-0838533e...f10d9e9c-dd69-4e8c-8f97-204a4259...\n", - " 600 \n", - " \n", - " 644 \n", - " \n", - " 44 \n", - "
23096012022-12-05 07:59:006964b061-b98d-43f2-9078-ef9c423e...6778d3ad-0647-447d-9517-78fb56ab...15e987d0-d027-41e9-9ae1-aff14fb6...\n", - " 500 \n", - " \n", - " 537 \n", - " \n", - " 37 \n", - "
23096022022-12-05 11:04:006964b061-b98d-43f2-9078-ef9c423e...c7815118-f777-49bd-b4e1-c0829721...357006f5-7f22-4a9d-86b6-4f89cbed...\n", - " 600 \n", - " \n", - " 644 \n", - " \n", - " 44 \n", - "
\n", - "\n", - "

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

\n" - ], - "text/plain": [ - " name ORDERED_AT STORE_ID ID\n", - " role time_stamp join_key join_key\n", - " unit time stamp, comparison only \n", - " 0 2020-05-18 07:57:00 fc7707c0-2f1e-48d4-b870-7cbeddfc... 87534090-1a48-4eaf-b9da-e1d72c44...\n", - " 1 2020-05-18 11:14:00 fc7707c0-2f1e-48d4-b870-7cbeddfc... 704ceb66-15d1-4d38-a4e8-c3366e9f...\n", - " 2 2020-05-18 07:45:00 fc7707c0-2f1e-48d4-b870-7cbeddfc... 8d390a24-c412-47af-a162-15e793af...\n", - " 3 2020-05-18 14:11:00 fc7707c0-2f1e-48d4-b870-7cbeddfc... 482f4829-01f9-425e-8165-c9cd3d6f...\n", - " 4 2020-05-18 08:03:00 fc7707c0-2f1e-48d4-b870-7cbeddfc... 31455243-410c-41a7-9740-03e1f8f5...\n", - " ... ... ...\n", - "2309598 2022-12-05 07:50:00 abfcc332-1eaf-42f6-b8e4-569bf6a3... 6eee4b32-6dd2-45e3-bc13-f357af5c...\n", - "2309599 2022-12-05 07:49:00 6964b061-b98d-43f2-9078-ef9c423e... 677cd97b-8fa7-4e81-b41a-0134ad01...\n", - "2309600 2022-12-05 08:27:00 6964b061-b98d-43f2-9078-ef9c423e... 30c71271-898e-452d-aab2-0838533e...\n", - "2309601 2022-12-05 07:59:00 6964b061-b98d-43f2-9078-ef9c423e... 6778d3ad-0647-447d-9517-78fb56ab...\n", - "2309602 2022-12-05 11:04:00 6964b061-b98d-43f2-9078-ef9c423e... c7815118-f777-49bd-b4e1-c0829721...\n", - "\n", - " name CUSTOMER SUBTOTAL ORDER_TOTAL TAX_PAID\n", - " role join_key numerical numerical numerical\n", - " unit \n", - " 0 842117f6-5664-4a5b-8b49-fbcd3a0e... 400 424 24\n", - " 1 4f4b4c37-1f35-4eb7-8571-d2a7a18d... 1800 1908 108\n", - " 2 a0275acc-54be-4ba5-a867-9cc11872... 700 742 42\n", - " 3 592c992f-825b-46f6-97c8-e3859212... 600 636 36\n", - " 4 c9479483-919a-414a-ae7a-480e9df3... 700 742 42\n", - " ... ... ... ...\n", - "2309598 a389b16e-642a-4a42-84f0-7a7cb672... 500 531 31\n", - "2309599 14d84646-1a4e-4b91-928c-eb821b65... 500 537 37\n", - "2309600 f10d9e9c-dd69-4e8c-8f97-204a4259... 600 644 44\n", - "2309601 15e987d0-d027-41e9-9ae1-aff14fb6... 500 537 37\n", - "2309602 357006f5-7f22-4a9d-86b6-4f89cbed... 600 644 44\n", - "\n", - "\n", - "2309603 rows x 7 columns\n", - "memory usage: 101.62 MB\n", - "type: getml.DataFrame" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "orders" ] }, { "cell_type": "markdown", - "id": "4f184b7f", + "id": "d67b526b", "metadata": {}, "source": [ "## Data Model\n", @@ -2281,20 +195,10 @@ }, { "cell_type": "code", - "execution_count": 8, - "id": "b874e954", + "execution_count": null, + "id": "064f9de3", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Training set size: 863\n", - "Validation set size: 312\n", - "Test set size: 204\n" - ] - } - ], + "outputs": [], "source": [ "validation_begin = getml.data.time.datetime(2023, 1, 1)\n", "test_begin = getml.data.time.datetime(2024, 1, 1)\n", @@ -2319,797 +223,28 @@ }, { "cell_type": "code", - "execution_count": 9, - "id": "7bbf338a", + "execution_count": null, + "id": "e04d0af3", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
name REFERENCE_DATE STORE_IDSNAPSHOT_IDNEXT_WEEK_SALESSTORE_NAME YEAR MONTH WEEK_NUMBERIS_FULL_WEEK_AFTER_OPENINGHAS_ORDER_ACTIVITYHAS_MIN_HISTORYDAYS_SINCE_OPENNEXT_WEEK_ORDERS
role time_stamp join_key join_key targetcategorical categoricalcategoricalcategoricalcategorical categorical categorical numerical numerical
unittime stamp, comparison only
02023-02-27abfcc332-1eaf-42f6-b8e4-569bf6a3...914\n", - " 24980.54\n", - " Chicago202329truetruetrue\n", - " 1035 \n", - " \n", - " 2204 \n", - "
12023-05-15fc7707c0-2f1e-48d4-b870-7cbeddfc...983\n", - " 18133.36\n", - " Philadelphia2023520truetruetrue\n", - " 1717 \n", - " \n", - " 1545 \n", - "
22023-05-22abfcc332-1eaf-42f6-b8e4-569bf6a3...986\n", - " 23574.09\n", - " Chicago2023521truetruetrue\n", - " 1119 \n", - " \n", - " 2105 \n", - "
32023-11-27eafbd328-0434-4f46-9c2d-cc97a46f...1150\n", - " 31011.69\n", - " Brooklyn20231148truetruetrue\n", - " 1721 \n", - " \n", - " 2788 \n", - "
42023-08-28fc7707c0-2f1e-48d4-b870-7cbeddfc...1073\n", - " 14535.01\n", - " Philadelphia2023835truetruetrue\n", - " 1822 \n", - " \n", - " 1260 \n", - "
............\n", - " ... \n", - " .....................\n", - " ... \n", - " \n", - " ... \n", - "
\n", - "\n", - "

\n", - " unknown number of rows
\n", - " \n", - " type: getml.data.View
\n", - " \n", - "

\n" - ], - "text/plain": [ - "name REFERENCE_DATE STORE_ID SNAPSHOT_ID NEXT_WEEK_SALES ...\n", - "role time_stamp join_key join_key target ...\n", - "unit time stamp, comparison only ...\n", - " 0 2023-02-27 abfcc332-1eaf-42f6-b8e4-569bf6a3... 914 24980.54 ...\n", - " 1 2023-05-15 fc7707c0-2f1e-48d4-b870-7cbeddfc... 983 18133.36 ...\n", - " 2 2023-05-22 abfcc332-1eaf-42f6-b8e4-569bf6a3... 986 23574.09 ...\n", - " 3 2023-11-27 eafbd328-0434-4f46-9c2d-cc97a46f... 1150 31011.69 ...\n", - " 4 2023-08-28 fc7707c0-2f1e-48d4-b870-7cbeddfc... 1073 14535.01 ...\n", - " ... ... ... ... ... ...\n", - "\n", - "name IS_FULL_WEEK_AFTER_OPENING HAS_ORDER_ACTIVITY HAS_MIN_HISTORY DAYS_SINCE_OPEN NEXT_WEEK_ORDERS\n", - "role categorical categorical categorical numerical numerical\n", - "unit \n", - " 0 true true true 1035 2204\n", - " 1 true true true 1717 1545\n", - " 2 true true true 1119 2105\n", - " 3 true true true 1721 2788\n", - " 4 true true true 1822 1260\n", - " ... ... ... ... ... ...\n", - "\n", - "\n", - "unknown number of rows x 13 columns\n", - "type: getml.data.View" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "weekly_sales_by_store_validation" ] }, { "cell_type": "code", - "execution_count": 10, - "id": "ea9bdb35", + "execution_count": null, + "id": "fe4b7b56", "metadata": {}, "outputs": [], "source": [ "data_model = getml.data.DataModel(\n", - " population=weekly_sales_by_store_train.to_placeholder(\"WEEKLY_SALES_BY_STORE\")\n", + " population=weekly_sales_by_store_train.to_placeholder()\n", ")\n", "\n", "data_model.add(getml.data.to_placeholder(orders=orders))\n", "\n", - "data_model.WEEKLY_SALES_BY_STORE.join(\n", + "data_model.weekly_sales_by_store.join(\n", " right=data_model.orders,\n", " on=\"STORE_ID\",\n", " time_stamps=(\"REFERENCE_DATE\", \"ORDERED_AT\"),\n", @@ -3120,8 +255,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "id": "82c5e2b4", + "execution_count": null, + "id": "9f7436e9", "metadata": {}, "outputs": [], "source": [ @@ -3133,12 +268,13 @@ "\n", "container.add(orders=orders)\n", "container.save()\n", + "\n", "getml.project.data_frames.save()" ] }, { "cell_type": "markdown", - "id": "99dfa085", + "id": "047b5594", "metadata": {}, "source": [ "## Training\n", @@ -3148,135 +284,19 @@ }, { "cell_type": "code", - "execution_count": 12, - "id": "3c5aad67", + "execution_count": null, + "id": "bf2971fa", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
Checking data model...\n",
-       "
\n" - ], - "text/plain": [ - "Checking data model\u001b[33m...\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[2K Staging... ━━━━━━━━━━━━━━━ 100% • 00:00\n", - "\u001b[2K Checking... ━━━━━━━━━━━━━━━ 100% • 00:00\n", - "\u001b[?25h" - ] - }, - { - "data": { - "text/html": [ - "
The pipeline check generated 0 issues labeled INFO and 2 issues labeled WARNING.\n",
-       "
\n" - ], - "text/plain": [ - "The pipeline check generated \u001b[1;36m0\u001b[0m issues labeled INFO and \u001b[1;36m2\u001b[0m issues labeled WARNING.\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
To see the issues in full, run .check() on the pipeline.\n",
-       "
\n" - ], - "text/plain": [ - "To see the issues in full, run \u001b[1;35m.check\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m on the pipeline.\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[2K Staging... ━━━━━━━━━━━━━━━ 100% • 00:00\n", - "\u001b[2K FastProp: Trying 50 features... ━━━━━━━━━━━━━━━ 100% • 00:00\n", - "\u001b[2K FastProp: Building features... ━━━━━━━━━━━━━━━ 100% • 00:01\n", - "\u001b[2K XGBoost: Training as predictor... ━━━━━━━━━━━━━━━ 100% • 00:01\n", - "\u001b[?25h" - ] - }, - { - "data": { - "text/html": [ - "
Trained pipeline.\n",
-       "
\n" - ], - "text/plain": [ - "Trained pipeline.\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Time taken: 0:00:04.297188.\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-hRNgJK'])
" - ], - "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-hRNgJK'])" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "fast_prop = getml.feature_learning.FastProp()\n", "\n", - "predictor = getml.predictors.XGBoostRegressor(\n", - " n_jobs=0,\n", - ")\n", + "xgboost = getml.predictors.XGBoostRegressor()\n", "\n", "pipe = getml.Pipeline(\n", " data_model=data_model,\n", - " feature_learners=[\n", - " fast_prop,\n", - " ],\n", - " predictors=[predictor],\n", + " feature_learners=fast_prop,\n", + " predictors=xgboost,\n", ")\n", "\n", "pipe.fit(container.train)" @@ -3284,170 +304,19 @@ }, { "cell_type": "code", - "execution_count": 13, - "id": "1d201ed2", + "execution_count": null, + "id": "c78fc84b", "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:01\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" - ] - }, - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
date time set usedtarget mae rmsersquared
02025-12-21 23:53:31trainNEXT_WEEK_SALES247.5886315.41140.9974
12025-12-21 23:53:36testNEXT_WEEK_SALES477.7038625.14660.9858
" - ], - "text/plain": [ - " date time set used target mae rmse rsquared\n", - "0 2025-12-21 23:53:31 train NEXT_WEEK_SALES 247.5886 315.4114 0.9974\n", - "1 2025-12-21 23:53:36 test NEXT_WEEK_SALES 477.7038 625.1466 0.9858" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "predictions = pipe.predict(container.test)\n", "n_features = len(pipe.features)\n", - "scores = pipe.score(container.test)\n", - "scores" + "pipe.score(container.test)" ] }, { "cell_type": "markdown", - "id": "a3e8c4d7", + "id": "a6fd5f0a", "metadata": {}, "source": [ "## Feature Export\n", @@ -3457,45 +326,15 @@ }, { "cell_type": "code", - "execution_count": 14, - "id": "bffbdfe0", + "execution_count": null, + "id": "6fe8fb86", "metadata": {}, "outputs": [], "source": [ "from pathlib import Path\n", "\n", - "from getml_interpretations import (\n", - " DomainReport,\n", - " generate_domain_report,\n", - ")\n", + "from getml_interpretations import generate_column_descriptions_report\n", "\n", - "domain_report_path = Path(\"domain_report.md\")\n", - "\n", - "if domain_report_path.exists():\n", - " domain_report = DomainReport.from_markdown(domain_report_path)\n", - "else:\n", - " domain_report: DomainReport = await generate_domain_report(\n", - " project_name=PROJECT_NAME,\n", - " pipeline=pipe,\n", - " container=container,\n", - " model=\"gpt-5-mini\",\n", - " )\n", - " domain_report.to_markdown(domain_report_path)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "1a789473", - "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", @@ -3504,109 +343,22 @@ "{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", - " domain_report=domain_report,\n", - " model=\"gpt-5-mini\",\n", - " user_prompt=user_prompt,\n", - " )\n", - " )\n", - " column_descriptions_report.to_json(column_descriptions_report_path)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "6b685d97", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'column_descriptions': {'weekly_sales_by_store': {'REFERENCE_DATE': {'name': 'REFERENCE_DATE',\n", - " 'description': 'Weekly anchor timestamp used to align historical order activity to a specific store-week record. In the feature engineering, only transactions with order time at or before this timestamp are eligible, and a rolling lookback window of ~30 days is applied (i.e., orders within the prior 30 days relative to this date). Serves as the temporal index for train/validation/test splits (train: 2018-09 to 2022-12; validation: 2023; test: 2024). [timestamp]',\n", - " 'description_confidence': },\n", - " 'STORE_ID': {'name': 'STORE_ID',\n", - " 'description': 'Unique identifier for a physical store/location (6 distinct values). Primary join key connecting the weekly store-level table to the transactional orders table (one-to-many). Enables per-store aggregation of recent order history and supports store-level segmentation. [categorical key]',\n", - " 'description_confidence': },\n", - " 'SNAPSHOT_ID': {'name': 'SNAPSHOT_ID',\n", - " 'description': 'Identifier for the data snapshot/version associated with each store-week record. Used as a join key/row identifier to distinguish multiple extracts or pipeline runs for the same store and week, and to guarantee uniqueness of records. Values are string-typed and increase in later splits (e.g., 1–99 in train, ~1000+ later), consistent with incremental snapshotting rather than a business measure. [categorical key]',\n", - " 'description_confidence': },\n", - " 'NEXT_WEEK_SALES': {'name': 'NEXT_WEEK_SALES',\n", - " 'description': 'Target outcome: total sales for the subsequent week for the given store-week record. Continuous monetary measure with typical values around 4.2k–31.4k and mean ~17.7k (train) rising to ~20.6k (test), indicating growth over time. Often well-explained by order volume (see next-week order count) and recent 30-day revenue run-rate from orders. [currency, e.g., USD]',\n", - " 'description_confidence': },\n", - " 'STORE_NAME': {'name': 'STORE_NAME',\n", - " 'description': 'Human-readable store label (e.g., city/neighborhood such as Brooklyn, San Francisco). Low-cardinality categorical descriptor of location; useful for reporting, sanity checks, and potentially capturing location-specific effects beyond the opaque store identifier. [categorical]',\n", - " 'description_confidence': },\n", - " 'YEAR': {'name': 'YEAR',\n", - " 'description': 'Calendar year label derived from the weekly reference date. Stored as a string and useful for capturing long-term trends, non-stationarity (e.g., growth/inflation), and for time-based slicing in EDA. In the provided splits: 2018–2022 (train), 2023 (validation), 2024 (test). [YYYY]',\n", - " 'description_confidence': },\n", - " 'MONTH': {'name': 'MONTH',\n", - " 'description': 'Calendar month number derived from the weekly reference date. Encodes within-year seasonality and is useful for grouping and plotting sales patterns across the year. Stored as a string with values 1–12 (train/validation) and 1–8 (test period). [1–12]',\n", - " 'description_confidence': },\n", - " 'WEEK_NUMBER': {'name': 'WEEK_NUMBER',\n", - " 'description': 'Week-of-year indicator derived from the weekly reference date (stored as a string). Provides a higher-resolution seasonal position than month; helpful for detecting holiday/seasonal peaks and aligning year-over-year comparisons. Note: string ordering may be lexicographic, so convert to integer for time series analyses. [1–53-ish]',\n", - " 'description_confidence': },\n", - " 'IS_FULL_WEEK_AFTER_OPENING': {'name': 'IS_FULL_WEEK_AFTER_OPENING',\n", - " 'description': 'Flag indicating whether the store-week represents a complete operational week after store opening (i.e., excludes partial opening weeks). In the provided data it is always true, implying that the dataset has already been filtered to full weeks; still useful as a data-quality check. [boolean as string]',\n", - " 'description_confidence': },\n", - " 'HAS_ORDER_ACTIVITY': {'name': 'HAS_ORDER_ACTIVITY',\n", - " 'description': 'Flag indicating that there is at least some recorded order activity relevant to the store-week (e.g., within the modeling horizon/lookback). In the provided subsets it is always true, suggesting rows without orders were excluded upstream; useful primarily for validation and pipeline checks. [boolean as string]',\n", - " 'description_confidence': },\n", - " 'HAS_MIN_HISTORY': {'name': 'HAS_MIN_HISTORY',\n", - " 'description': 'Flag indicating whether the store has sufficient prior history before the reference week to compute historical features reliably (e.g., enough days/orders in the lookback window). Varies in train (true/false) but is always true in validation/test, consistent with later periods having more mature stores and more history. [boolean as string]',\n", - " 'description_confidence': },\n", - " 'DAYS_SINCE_OPEN': {'name': 'DAYS_SINCE_OPEN',\n", - " 'description': 'Store age at the reference week, measured as days since the store opened. Captures lifecycle/ramp effects; averages increase across splits (train ~577 days; validation ~1189; test ~1490), reflecting store maturation and time-based splitting. Useful for segmenting performance of new vs mature stores and for controlling growth effects. [days]',\n", - " 'description_confidence': },\n", - " 'NEXT_WEEK_ORDERS': {'name': 'NEXT_WEEK_ORDERS',\n", - " 'description': 'Number of orders expected/recorded for the next week for the given store-week record. Extremely predictive of next-week sales (very high model importance and correlation), implying sales are largely driven by volume and that revenue per order is relatively stable. Important governance note: if this value is not truly known at prediction time, it may constitute target leakage and should be excluded or replaced with a forecasted order-count feature in production. [count]',\n", - " 'description_confidence': }},\n", - " 'orders': {'ORDERED_AT': {'name': 'ORDERED_AT',\n", - " 'description': 'Timestamp when an individual transaction/order was placed. Used for time alignment with the weekly reference date: only orders occurring at or before the reference week are aggregated into features, typically within a rolling ~30-day lookback window. Spans 2018-09 to 2024-08 with ~913k unique timestamps. [timestamp]',\n", - " 'description_confidence': },\n", - " 'STORE_ID': {'name': 'STORE_ID',\n", - " 'description': 'Store/location identifier for each transaction. Connects each order to the corresponding store and enables aggregations of transaction history per store-week when joined to the weekly store table. Same key domain as the store identifier in the weekly table (6 stores). [categorical key]',\n", - " 'description_confidence': },\n", - " 'ID': {'name': 'ID',\n", - " 'description': 'Unique identifier of an individual order/transaction record. Serves as an entity key for deduplication and integrity checks in the transactional table; not directly used as a feature in the provided pipeline but can support audits (e.g., detecting duplicates, linking to line items if available). [categorical key/UUID-like]',\n", - " 'description_confidence': },\n", - " 'CUSTOMER': {'name': 'CUSTOMER',\n", - " 'description': 'Identifier for the customer/account placing the order. Allows customer-level analytics such as repeat rate, customer concentration, and distinct-customer counts in a lookback window. Low apparent cardinality (~3k unique across 2.3M orders) suggests high repeat purchasing or account-based ordering; can be informative for volatility and demand stability features if engineered. [categorical key]',\n", - " 'description_confidence': },\n", - " 'SUBTOTAL': {'name': 'SUBTOTAL',\n", - " 'description': 'Pre-tax monetary amount for the order (sum of item prices before tax). Values range 0–10,100 with mean ~1,064 and relatively few distinct price points, suggesting standardized pricing/bundles. Useful for computing recent revenue run-rate (e.g., sums over last 30 days), and average order value proxies that correlate with future weekly sales. [currency, pre-tax]',\n", - " 'description_confidence': },\n", - " 'ORDER_TOTAL': {'name': 'ORDER_TOTAL',\n", - " 'description': 'Final monetary amount charged for the order, typically subtotal plus taxes (and possibly minor fees/discounts). Range 0–10,800 with mean ~1,125; the mean difference to subtotal closely matches average tax paid, implying taxes are the main uplift. Strong basis for revenue aggregates over recent history (e.g., rolling 30-day sum) which are predictive of next-week sales. [currency, post-tax]',\n", - " 'description_confidence': },\n", - " 'TAX_PAID': {'name': 'TAX_PAID',\n", - " 'description': 'Monetary tax component paid on the order. Range 0–800 with mean ~60.7; implies an effective tax rate around ~5–6% relative to subtotal on average. Useful for estimating tax intensity and validating consistency of pricing/tax policies; in aggregate (rolling sums) it partially tracks demand and therefore relates to next-week sales. [currency]',\n", - " 'description_confidence': }}}}" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "column_descriptions_report.model_dump()" + "column_descriptions_report = 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", + ")" ] }, { "cell_type": "code", - "execution_count": 17, - "id": "d324a301", - "metadata": {}, + "execution_count": null, + "id": "2179e297", + "metadata": { + "lines_to_next_cell": 2 + }, "outputs": [], "source": [ "from getml_interpretations import (\n", @@ -3614,8 +366,6 @@ " 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", @@ -3623,570 +373,25 @@ "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", - " domain_report=domain_report,\n", - " column_descriptions_report=column_descriptions_report,\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": 18, - "id": "c4e5be54", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'features': {'feature_1_1': {'name': 'feature_1_1',\n", - " 'index': 0,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.001589096137303619,\n", - " 'correlation': -0.007932532921688166,\n", - " '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;'},\n", - " 'feature_1_2': {'name': 'feature_1_2',\n", - " 'index': 1,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 1.032021061288272e-05,\n", - " 'correlation': 0.24344268179240802,\n", - " '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;'},\n", - " 'feature_1_3': {'name': 'feature_1_3',\n", - " 'index': 2,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.00017085284007613594,\n", - " 'correlation': 0.965367931424899,\n", - " '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;'},\n", - " 'feature_1_4': {'name': 'feature_1_4',\n", - " 'index': 3,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 6.428581261572002e-05,\n", - " 'correlation': -0.02254262515022676,\n", - " '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;'},\n", - " 'feature_1_5': {'name': 'feature_1_5',\n", - " 'index': 4,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 2.4845430781758704e-05,\n", - " 'correlation': -0.1968250921743191,\n", - " '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;'},\n", - " 'feature_1_6': {'name': 'feature_1_6',\n", - " 'index': 5,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 1.3990888440783976e-05,\n", - " 'correlation': -0.08743340977233642,\n", - " '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;'},\n", - " 'feature_1_7': {'name': 'feature_1_7',\n", - " 'index': 6,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0,\n", - " 'correlation': 0.0,\n", - " '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;'},\n", - " 'feature_1_8': {'name': 'feature_1_8',\n", - " 'index': 7,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0,\n", - " 'correlation': 0.0,\n", - " '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;'},\n", - " 'feature_1_9': {'name': 'feature_1_9',\n", - " 'index': 8,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0,\n", - " 'correlation': 0.0,\n", - " '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;'},\n", - " 'feature_1_10': {'name': 'feature_1_10',\n", - " 'index': 9,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 6.613036805015637e-05,\n", - " 'correlation': -0.5321045343017202,\n", - " '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;'},\n", - " 'feature_1_11': {'name': 'feature_1_11',\n", - " 'index': 10,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.010998898444670953,\n", - " 'correlation': 0.9738315473173991,\n", - " '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;'},\n", - " 'feature_1_12': {'name': 'feature_1_12',\n", - " 'index': 11,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0004942723969131093,\n", - " 'correlation': -0.004865455558458447,\n", - " '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;'},\n", - " 'feature_1_13': {'name': 'feature_1_13',\n", - " 'index': 12,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0014705205864972756,\n", - " 'correlation': -0.1077089221329537,\n", - " '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;'},\n", - " 'feature_1_14': {'name': 'feature_1_14',\n", - " 'index': 13,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0,\n", - " 'correlation': 0.24344268179240802,\n", - " '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;'},\n", - " 'feature_1_15': {'name': 'feature_1_15',\n", - " 'index': 14,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0,\n", - " 'correlation': 0.965367931424899,\n", - " '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;'},\n", - " 'feature_1_16': {'name': 'feature_1_16',\n", - " 'index': 15,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 2.1128581838953085e-06,\n", - " 'correlation': -0.02523656859199447,\n", - " '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;'},\n", - " 'feature_1_17': {'name': 'feature_1_17',\n", - " 'index': 16,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 2.597092108023668e-06,\n", - " 'correlation': -0.19912396252283796,\n", - " '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;'},\n", - " 'feature_1_18': {'name': 'feature_1_18',\n", - " 'index': 17,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 2.002898987475071e-05,\n", - " 'correlation': -0.246696925388448,\n", - " '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;'},\n", - " 'feature_1_19': {'name': 'feature_1_19',\n", - " 'index': 18,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0,\n", - " 'correlation': -0.249315405443099,\n", - " '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;'},\n", - " 'feature_1_20': {'name': 'feature_1_20',\n", - " 'index': 19,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0,\n", - " 'correlation': 0.0,\n", - " '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;'},\n", - " 'feature_1_21': {'name': 'feature_1_21',\n", - " 'index': 20,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0,\n", - " 'correlation': -0.249315405443099,\n", - " '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;'},\n", - " 'feature_1_22': {'name': 'feature_1_22',\n", - " 'index': 21,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 6.0444685114087396e-05,\n", - " 'correlation': -0.5784073006761212,\n", - " '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;'},\n", - " 'feature_1_23': {'name': 'feature_1_23',\n", - " 'index': 22,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.01065385189390608,\n", - " 'correlation': 0.9753017397987589,\n", - " '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;'},\n", - " 'feature_1_24': {'name': 'feature_1_24',\n", - " 'index': 23,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 2.2847330877339636e-05,\n", - " 'correlation': -0.09280999571485186,\n", - " '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;'},\n", - " 'feature_1_25': {'name': 'feature_1_25',\n", - " 'index': 24,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.00026760640778159206,\n", - " 'correlation': -0.2239901488197435,\n", - " '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;'},\n", - " 'feature_1_26': {'name': 'feature_1_26',\n", - " 'index': 25,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0,\n", - " 'correlation': 0.24344268179240802,\n", - " '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;'},\n", - " 'feature_1_27': {'name': 'feature_1_27',\n", - " 'index': 26,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0,\n", - " 'correlation': 0.965367931424899,\n", - " '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;'},\n", - " 'feature_1_28': {'name': 'feature_1_28',\n", - " 'index': 27,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 2.2192905659497673e-05,\n", - " 'correlation': -0.06695490926186952,\n", - " '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;'},\n", - " 'feature_1_29': {'name': 'feature_1_29',\n", - " 'index': 28,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 5.0771435055271985e-05,\n", - " 'correlation': -0.2244546959349504,\n", - " '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;'},\n", - " 'feature_1_30': {'name': 'feature_1_30',\n", - " 'index': 29,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 5.637072797279408e-06,\n", - " 'correlation': -0.24507195262113005,\n", - " '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;'},\n", - " 'feature_1_31': {'name': 'feature_1_31',\n", - " 'index': 30,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0,\n", - " 'correlation': -0.24931540544302738,\n", - " '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;'},\n", - " 'feature_1_32': {'name': 'feature_1_32',\n", - " 'index': 31,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0,\n", - " 'correlation': 0.0,\n", - " '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;'},\n", - " 'feature_1_33': {'name': 'feature_1_33',\n", - " 'index': 32,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0,\n", - " 'correlation': -0.24931540544302738,\n", - " '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;'},\n", - " 'feature_1_34': {'name': 'feature_1_34',\n", - " 'index': 33,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.00016661128023007273,\n", - " 'correlation': -0.3226018643942556,\n", - " '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;'},\n", - " 'feature_1_35': {'name': 'feature_1_35',\n", - " 'index': 34,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0074074764861468256,\n", - " 'correlation': 0.5354993211888577,\n", - " '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;'},\n", - " 'feature_1_36': {'name': 'feature_1_36',\n", - " 'index': 35,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 9.74559801931398e-05,\n", - " 'correlation': -0.22338752623418517,\n", - " '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;'},\n", - " 'feature_1_37': {'name': 'feature_1_37',\n", - " 'index': 36,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.00023072051141152724,\n", - " 'correlation': -0.25977484191410677,\n", - " '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;'},\n", - " 'feature_1_38': {'name': 'feature_1_38',\n", - " 'index': 37,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 4.396677084312702e-05,\n", - " 'correlation': 0.9737799873973866,\n", - " '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;'},\n", - " 'feature_1_39': {'name': 'feature_1_39',\n", - " 'index': 38,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.00015711448486850844,\n", - " 'correlation': 0.9268947164615706,\n", - " '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;'},\n", - " 'feature_1_40': {'name': 'feature_1_40',\n", - " 'index': 39,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 1.9980728148008938e-05,\n", - " 'correlation': 0.13869142239944637,\n", - " '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;'},\n", - " 'feature_1_41': {'name': 'feature_1_41',\n", - " 'index': 40,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 5.597629436341022e-05,\n", - " 'correlation': -0.25687623092915174,\n", - " '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;'},\n", - " 'feature_1_42': {'name': 'feature_1_42',\n", - " 'index': 41,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0,\n", - " 'correlation': 0.13869142239944637,\n", - " '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;'},\n", - " 'feature_1_43': {'name': 'feature_1_43',\n", - " 'index': 42,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0002243759446551559,\n", - " 'correlation': -0.15958861415514666,\n", - " '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;'},\n", - " 'feature_1_44': {'name': 'feature_1_44',\n", - " 'index': 43,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0,\n", - " 'correlation': -0.25687623092915174,\n", - " '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;'},\n", - " 'feature_1_45': {'name': 'feature_1_45',\n", - " 'index': 44,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 8.363389505434104e-05,\n", - " 'correlation': 0.04572928955863,\n", - " '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;'},\n", - " 'feature_1_46': {'name': 'feature_1_46',\n", - " 'index': 45,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 5.460331874088565e-05,\n", - " 'correlation': 0.0126174350637636,\n", - " '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;'},\n", - " 'feature_1_47': {'name': 'feature_1_47',\n", - " 'index': 46,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 5.183729840120141e-05,\n", - " 'correlation': 0.9562271988412102,\n", - " '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;'},\n", - " 'feature_1_48': {'name': 'feature_1_48',\n", - " 'index': 47,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0,\n", - " 'correlation': 0.0,\n", - " '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;'},\n", - " 'feature_1_49': {'name': 'feature_1_49',\n", - " 'index': 48,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 6.406577164882317e-05,\n", - " 'correlation': -0.9502064301241396,\n", - " '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;'},\n", - " 'feature_1_50': {'name': 'feature_1_50',\n", - " 'index': 49,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0,\n", - " 'correlation': 0.9653493895621866,\n", - " '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;'},\n", - " 'days_since_open': {'name': 'days_since_open',\n", - " 'index': 50,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.0005951427383902371,\n", - " 'correlation': 0.34977990198007386,\n", - " 'sql': ''},\n", - " 'next_week_orders': {'name': 'next_week_orders',\n", - " 'index': 51,\n", - " 'target': 'NEXT_WEEK_SALES',\n", - " 'importance': 0.9647357347095845,\n", - " 'correlation': 0.9885752362918938,\n", - " 'sql': ''}},\n", - " 'feature_descriptions': {'feature_1_1': {'name': 'feature_1_1',\n", - " 'title': 'avg_subtotal_30d',\n", - " 'description': 'Average pre-tax order amount aggregated across all transactions for the store within the 30-day lookback ending at the weekly reference timestamp. Computed by joining store-week records to the transactional table, filtering orders with ORDERED_AT <= REFERENCE_DATE and within the configured 30‑day window, then taking AVG(SUBTOTAL) [USD]. Acts as a short-term average order-value signal and proxy for recent revenue per order; in this model it shows very low direct correlation with the target, so treat it as a secondary demand-level indicator rather than the primary driver.',\n", - " 'description_confidence': },\n", - " 'feature_1_2': {'name': 'feature_1_2',\n", - " 'title': 'distinct_subtotal_count_30d',\n", - " 'description': 'Count of distinct pre-tax order amounts observed in the 30-day lookback for the store-week. Implemented as COUNT(DISTINCT SUBTOTAL) after time alignment to the reference date [count]. Intended to capture variety/diversity of order price points (e.g., mix of bundles or menu items); because SUBTOTAL has few unique values in the data, this metric often behaves as a volume/variety proxy. Use with caution: interpretation depends on whether subtotal discretization is business-driven.',\n", - " 'description_confidence': },\n", - " 'feature_1_3': {'name': 'feature_1_3',\n", - " 'title': 'repeat_subtotal_count_30d',\n", - " 'description': 'Number of repeated pre-tax order amounts within the 30-day window, computed as total COUNT(SUBTOTAL) minus COUNT(DISTINCT SUBTOTAL) [count]. Measures how often identical subtotal values recur (i.e., how concentrated orders are around specific price points) and therefore serves as a proxy for order volume and product-price repetition. Highly correlated with next-week sales in this dataset, indicating it largely captures throughput rather than unique-price behavior.',\n", - " 'description_confidence': },\n", - " 'feature_1_4': {'name': 'feature_1_4',\n", - " 'title': 'first_subtotal_30d',\n", - " 'description': 'Earliest pre-tax order amount observed in the 30-day lookback relative to the weekly reference timestamp [USD]. Calculated with FIRST(SUBTOTAL, ORDERED_AT) after joining on store and applying the time filter. Provides a simple recency anchor for historical order sizes (what the first recent order looked like); useful for detecting shifts when compared to more recent values, but here it has limited standalone predictive power.',\n", - " 'description_confidence': },\n", - " 'feature_1_5': {'name': 'feature_1_5',\n", - " 'title': 'last_subtotal_30d',\n", - " 'description': 'Most recent pre-tax order amount within the 30-day lookback (based on ORDERED_AT) [USD]. Implemented via LAST(SUBTOTAL, ORDERED_AT) on time-aligned transactions. Serves as a short-term signal of the latest basket size; differences between this and the earlier average or first value can indicate recent shifts in order composition. In this model it has modest predictive contribution.',\n", - " 'description_confidence': },\n", - " 'feature_1_6': {'name': 'feature_1_6',\n", - " 'title': 'max_subtotal_30d',\n", - " 'description': 'Maximum pre-tax order amount observed in the prior 30 days for the store-week [USD]. Obtained with MAX(SUBTOTAL) after time alignment. Captures outlier large orders or high-ticket transactions in the recent window; useful to detect occasional large sales (e.g., catering) that can inflate weekly revenue but should be interpreted alongside counts/sums to avoid over-weighting rare events.',\n", - " 'description_confidence': },\n", - " 'feature_1_7': {'name': 'feature_1_7',\n", - " 'title': 'median_subtotal_30d',\n", - " 'description': 'Median pre-tax order amount across orders in the 30-day lookback [USD]. Computed with MEDIAN(SUBTOTAL) after joining transactions to the store-week record. Provides a robust central tendency of order sizes that is less sensitive to large outliers than mean; in datasets with many identical price points this often coincides with common menu price levels.',\n", - " 'description_confidence': },\n", - " 'feature_1_8': {'name': 'feature_1_8',\n", - " 'title': 'min_subtotal_30d',\n", - " 'description': 'Minimum pre-tax order amount observed in the prior 30 days [USD]. Derived via MIN(SUBTOTAL) after time filtering. Helps identify the smallest transactions (e.g., single-item or discounted orders) and complements central-tendency and dispersion metrics when assessing typical basket sizes.',\n", - " 'description_confidence': },\n", - " 'feature_1_9': {'name': 'feature_1_9',\n", - " 'title': 'mode_subtotal_30d',\n", - " 'description': 'Most frequently occurring pre-tax order amount in the 30-day window [USD]. Implemented with MODE(SUBTOTAL) across time-aligned transactions. Useful for capturing the dominant price point or standardized order package in the store’s recent activity; particularly informative when business operates on a small set of fixed price offerings.',\n", - " 'description_confidence': },\n", - " 'feature_1_10': {'name': 'feature_1_10',\n", - " 'title': 'stddev_subtotal_30d',\n", - " 'description': 'Standard deviation of pre-tax order amounts within the 30-day lookback [USD]. Calculated with STDDEV(SUBTOTAL) after joining orders to the store-week. Measures dispersion of order values: higher dispersion means more variability in basket sizes. In this model a larger dispersion is associated with lower next-week sales (negative correlation), so it may reflect unstable or sporadic demand patterns that reduce predictability.',\n", - " 'description_confidence': },\n", - " 'feature_1_11': {'name': 'feature_1_11',\n", - " 'title': 'sum_subtotal_30d',\n", - " 'description': 'Sum of pre-tax order amounts across all transactions in the 30-day lookback [USD]. Computed using SUM(SUBTOTAL) on time-aligned orders joined to the store-week. Serves as a recent revenue run-rate proxy and is strongly correlated with next-week sales in this dataset (very high positive correlation), making it a key short-term demand indicator complementary to order counts.',\n", - " 'description_confidence': },\n", - " 'feature_1_12': {'name': 'feature_1_12',\n", - " 'title': 'trend_subtotal_30d',\n", - " 'description': 'Temporal trend coefficient of pre-tax order amounts across the 30-day window, estimated by regressing SUBTOTAL against recency (REFERENCE_DATE - ORDERED_AT) [USD/day or relative trend]. Implemented via TREND(SUBTOTAL, reference_date - ordered_at) after time alignment. Captures whether order values are increasing or decreasing as the reference week approaches; can signal accelerating/decelerating average order value, though in this model its direct correlation to the target is small.',\n", - " 'description_confidence': },\n", - " 'feature_1_13': {'name': 'feature_1_13',\n", - " 'title': 'avg_order_total_30d',\n", - " 'description': 'Average final order amount (post-tax/fees) aggregated over transactions in the 30-day lookback [USD]. Computed with AVG(ORDER_TOTAL) after joining and filtering by time. Provides a complementary revenue-per-order signal to pre-tax averages and helps capture tax/fee effects; modestly negatively correlated with next-week sales here, so use together with counts and sums to separate price effects from volume effects.',\n", - " 'description_confidence': },\n", - " 'feature_1_14': {'name': 'feature_1_14',\n", - " 'title': 'distinct_order_total_count_30d',\n", - " 'description': 'Count of distinct final order amounts observed in the 30-day lookback [count]. Calculated via COUNT(DISTINCT ORDER_TOTAL) on time-filtered orders. Intended to measure diversity of billed totals (e.g., different bundles or fee variations); when ORDER_TOTAL is heavily discretized this feature may mainly reflect volume/variety constraints rather than nuanced price changes.',\n", - " 'description_confidence': },\n", - " 'feature_1_15': {'name': 'feature_1_15',\n", - " 'title': 'repeat_order_total_count_30d',\n", - " 'description': 'Number of repeated final order amounts within the 30-day window, computed as COUNT(ORDER_TOTAL) - COUNT(DISTINCT ORDER_TOTAL) [count]. Captures concentration around recurring billed totals and therefore acts as a volume proxy; shows very strong correlation with next-week sales in the data, indicating it largely tracks throughput and repeated standardized transactions.',\n", - " 'description_confidence': },\n", - " 'feature_1_16': {'name': 'feature_1_16',\n", - " 'title': 'first_order_total_30d',\n", - " 'description': 'Earliest final order amount in the 30-day lookback relative to the reference date [USD]. Implemented via FIRST(ORDER_TOTAL, ORDERED_AT) after joining transactions. Offers a recency-anchored snapshot of billed totals at the start of the recent window; best used in combination with last/average values to detect shifts in billing or price mix.',\n", - " 'description_confidence': },\n", - " 'feature_1_17': {'name': 'feature_1_17',\n", - " 'title': 'last_order_total_30d',\n", - " 'description': 'Most recent final order amount within the 30-day window based on ORDERED_AT [USD]. Calculated with LAST(ORDER_TOTAL, ORDERED_AT). Provides the latest observed billed total and can indicate immediate changes in pricing or basket composition; here it has a modest negative association with next-week sales and should be interpreted alongside count/sum features.',\n", - " 'description_confidence': },\n", - " 'feature_1_18': {'name': 'feature_1_18',\n", - " 'title': 'max_order_total_30d',\n", - " 'description': 'Maximum final order amount observed in the prior 30 days [USD]. Derived with MAX(ORDER_TOTAL) after time alignment. Identifies high-ticket billed transactions and helps flag occasional large orders (e.g., bulk/catering) that may disproportionately affect weekly revenue if frequent.',\n", - " 'description_confidence': },\n", - " 'feature_1_19': {'name': 'feature_1_19',\n", - " 'title': 'median_order_total_30d',\n", - " 'description': 'Median final order amount across transactions in the 30-day lookback [USD]. Computed with MEDIAN(ORDER_TOTAL) after joining and filtering by time. Offers a robust central measure of billed totals and is useful when distributions are skewed by occasional large orders.',\n", - " 'description_confidence': },\n", - " 'feature_1_20': {'name': 'feature_1_20',\n", - " 'title': 'min_order_total_30d',\n", - " 'description': 'Minimum final order amount observed in the 30-day window [USD]. Implemented via MIN(ORDER_TOTAL) on time-aligned transactions. Complements median/mean metrics by indicating the smallest billed totals and can reveal presence of many small-value transactions or discounts.',\n", - " 'description_confidence': },\n", - " 'feature_1_21': {'name': 'feature_1_21',\n", - " 'title': 'order_total_mode',\n", - " 'description': 'Captures the most frequently occurring final order amount within the recent lookback window [USD]. Computed by joining per-store historical orders to the store-week record and returning the statistical mode of order_total for orders with ORDERED_AT <= reference_date and within the ~30-day rolling window used by the pipeline. Serves as a compact descriptor of the dominant price point or common basket total in recent activity. Statistically this feature has a moderate negative correlation with the target (≈ -0.25) and zero measured importance in the current model run, indicating it is often redundant with higher-level volume or sum aggregates but useful for detecting dominant price tiers or menu changes. Use it for monitoring price-point shifts or as a categorical proxy for AOV when combined with count-based features. ',\n", - " 'description_confidence': },\n", - " 'feature_1_22': {'name': 'feature_1_22',\n", - " 'title': 'order_total_stddev',\n", - " 'description': 'Measures dispersion of final order amounts over the recent lookback window [USD]. Implemented as the sample standard deviation of order_total across all qualifying orders for the store-week (orders with ORDERED_AT <= reference_date and within the ~30-day window). Reflects variability in basket sizes or mixed-order types and, in this dataset, shows a notable negative correlation with the target (≈ -0.58) and small but nonzero model importance — higher variability has been associated with lower next-week sales in the training data. Use as an indicator of revenue stability: low stddev implies predictable revenue-per-order, while high stddev signals heterogeneous order values that can complicate sales forecasts.',\n", - " 'description_confidence': },\n", - " 'feature_1_23': {'name': 'feature_1_23',\n", - " 'title': 'order_total_sum',\n", - " 'description': 'Aggregates total realized revenue from orders in the recent lookback window [USD]. Calculated by summing order_total for all store orders with ORDERED_AT <= reference_date (and within the ~30-day rolling window). Acts as a short-term revenue run-rate and is a strong predictor of next-week sales (correlation ≈ 0.975; measured importance ~0.0107 in the model). Business interpretation: this is a direct proxy for recent demand level and momentum — higher recent sums indicate higher expected weekly sales. Recommended use: include as a baseline demand signal and combine with order-count forecasts to separate volume vs. AOV effects.',\n", - " 'description_confidence': },\n", - " 'feature_1_24': {'name': 'feature_1_24',\n", - " 'title': 'order_total_trend',\n", - " 'description': 'Estimates directional change in final order amounts across the lookback period [USD per time unit]. Computed using a trend/slope operator that regresses order_total against the time offset (reference_date - ORDERED_AT) for qualifying orders (orders on or before the reference date within the ~30-day window). Provides a short-term momentum signal for basket values (rising, stable, or declining AOV). Empirically the feature has a small negative correlation with the target (≈ -0.09) and low importance, suggesting limited additive predictive value beyond aggregate sums and counts in this dataset; still valuable for detecting systematic increases or decreases in pricing or order composition.',\n", - " 'description_confidence': },\n", - " 'feature_1_25': {'name': 'feature_1_25',\n", - " 'title': 'tax_paid_avg',\n", - " 'description': 'Computes the average tax amount paid per order within the recent lookback window [USD]. Implemented as the mean of tax_paid for all qualifying orders (ORDERED_AT <= reference_date and within ~30 days). Serves as a measure of tax intensity or small per-order fees and can act as a proxy for average order size when taxes scale with order value. Shows modest negative correlation with the target (≈ -0.22) and low importance, so it is more useful for monitoring or as a control variable than as a core predictive input.',\n", - " 'description_confidence': },\n", - " 'feature_1_26': {'name': 'feature_1_26',\n", - " 'title': 'distinct_tax_values_count',\n", - " 'description': 'Counts distinct observed tax amounts among recent orders [count]. Derived by counting unique tax_paid values for qualifying orders in the lookback window (orders at or before the reference date within ~30 days). With highly discretized pricing in the data, this feature mostly captures the diversity of tax buckets (proxy for variety in order types or price points) rather than absolute volume. Measured correlation in the dataset is positive (~0.24) but model importance is zero, indicating redundancy with other features; use primarily for diagnostics (detecting price-list changes or multiple tax regimes).',\n", - " 'description_confidence': },\n", - " 'feature_1_27': {'name': 'feature_1_27',\n", - " 'title': 'duplicate_tax_count',\n", - " 'description': \"Quantifies how many orders share repeated tax amounts within the lookback window [count]. Computed as total count of qualifying orders minus the count of distinct tax_paid values, effectively measuring the number of 'duplicate' tax entries (i.e., repeated tax buckets). In practice this behaves like a volume proxy when tax values are few and frequently repeated; observed a high correlation with several demand signals in this dataset (correlation reported high in tooling), though measured model importance is zero here—likely redundant with raw counts and sums. Use cautiously: useful for identifying dominant tax buckets and for data-quality checks.\",\n", - " 'description_confidence': },\n", - " 'feature_1_28': {'name': 'feature_1_28',\n", - " 'title': 'first_tax_paid',\n", - " 'description': 'Returns the tax amount from the earliest order in the lookback window as of the store-week reference [USD]. Implemented by selecting tax_paid associated with the chronologically first ORDERED_AT among qualifying orders (ORDERED_AT <= reference_date and within ~30 days). Captures historical tax level at the start of the window and can flag changes in tax calculation or pricing trends. Low correlation with the target (≈ -0.07) and small importance indicate limited predictive value, but it is helpful for auditing temporal shifts in tax or fee structure.',\n", - " 'description_confidence': },\n", - " 'feature_1_29': {'name': 'feature_1_29',\n", - " 'title': 'last_tax_paid',\n", - " 'description': 'Returns the tax amount from the most recent order within the lookback window [USD]. Computed by selecting tax_paid associated with the latest ORDERED_AT up to reference_date (within ~30 days). Acts as a short-term indicator of current tax/fee level applied to recent orders; slightly more predictive in this dataset (correlation ≈ -0.22) than the earliest tax value, suggesting recent tax/fee signals align modestly with next-week sales variations. Use alongside aggregated tax sums for both monitoring and modeling.',\n", - " 'description_confidence': },\n", - " 'feature_1_30': {'name': 'feature_1_30',\n", - " 'title': 'tax_paid_max',\n", - " 'description': 'Reports the maximum tax amount observed among recent orders [USD]. Calculated by taking the maximum tax_paid across qualifying orders (ORDERED_AT <= reference_date within the ~30-day window). Serves as an outlier/dominant-basket indicator (e.g., presence of a few high-value orders) and shows a moderate negative correlation with next-week sales (≈ -0.25) in the provided run. Use to detect large, infrequent transactions that may skew mean-based metrics and consider combining with sums and counts to separate volume effects from large-order noise.',\n", - " 'description_confidence': },\n", - " 'feature_1_31': {'name': 'feature_1_31',\n", - " 'title': 'tax_paid_median',\n", - " 'description': 'Gives the median tax amount across recent orders [USD]. Computed as the median of tax_paid values for qualifying orders in the lookback window (orders with ORDERED_AT <= reference_date and within ~30 days). Provides a robust central tendency measure less sensitive to outliers than the mean; shows moderate negative correlation with the target (≈ -0.25) in this dataset. Useful for capturing typical per-order tax burden when the tax distribution is skewed by a few large orders.',\n", - " 'description_confidence': },\n", - " 'feature_1_32': {'name': 'feature_1_32',\n", - " 'title': 'tax_paid_min',\n", - " 'description': 'Returns the minimum tax amount observed among recent orders [USD]. Implemented as the minimum of tax_paid across qualifying orders (ORDERED_AT <= reference_date within the ~30-day window). Acts as a lower-bound indicator for tax/fee application and is mainly useful for data-quality checks or to flag free/zero-tax transactions. Measured importance is zero in the current model run, consistent with limited predictive value relative to aggregate tax measures.',\n", - " 'description_confidence': },\n", - " 'feature_1_33': {'name': 'feature_1_33',\n", - " 'title': 'tax_paid_mode',\n", - " 'description': 'Returns the most frequent tax amount observed in the lookback window [USD]. Computed as the mode of tax_paid for qualifying orders (orders at or before reference_date within ~30 days). Because tax values are highly discretized, this feature often acts as a proxy for the prevailing price/tax bucket and shows a moderate negative correlation with the target (≈ -0.25). Its primary value is in detecting the dominant tax bucket and monitoring price-list stability; it is often redundant with summary statistics such as median or sum.',\n", - " 'description_confidence': },\n", - " 'feature_1_34': {'name': 'feature_1_34',\n", - " 'title': 'tax_paid_stddev',\n", - " 'description': 'Measures variability of tax amounts across recent orders [USD]. Implemented as the standard deviation of tax_paid over all qualifying orders (ORDERED_AT <= reference_date within the ~30-day lookback). Captures heterogeneity in applied taxes/fees and correlates negatively with next-week sales (≈ -0.32) in this dataset. Use to detect inconsistent pricing/tax practices or mixed-order types; consider pairing with count and sum features to separate variability due to volume from variability due to basket mix.',\n", - " 'description_confidence': },\n", - " 'feature_1_35': {'name': 'feature_1_35',\n", - " 'title': 'tax_paid_sum',\n", - " 'description': 'Aggregates total tax collected from orders in the recent lookback window [USD]. Calculated by summing tax_paid for all qualifying orders (ORDERED_AT <= reference_date and within ~30 days). Acts as a demand proxy that partially parallels revenue sums (observed correlation ≈ 0.54) and shows measurable importance in the model. Business interpretation: increases in summed tax usually reflect higher recent sales volume; use together with order counts and order_total sums to decompose revenue growth into volume and per-order effects.',\n", - " 'description_confidence': },\n", - " 'feature_1_36': {'name': 'feature_1_36',\n", - " 'title': 'tax_paid_trend',\n", - " 'description': 'Estimates short-term directionality of tax amounts across the lookback period [USD per time unit]. Implemented via a trend/slope operator regressing tax_paid on the time offset (reference_date - ORDERED_AT) for qualifying orders (orders up to the reference date within ~30 days). Signals whether per-order tax/fee amounts are rising or falling over the window; shows modest negative correlation with the target (≈ -0.22). Useful for detecting gradual shifts in AOV or fee application that may anticipate sales changes.',\n", - " 'description_confidence': },\n", - " 'feature_1_37': {'name': 'feature_1_37',\n", - " 'title': 'avg_order_age',\n", - " 'description': 'Computes the mean time difference between the store-week reference and each qualifying order in the lookback window [seconds] (approx. convertable to days by dividing by 86,400). Derived as the average of (reference_date - ORDERED_AT) for orders with ORDERED_AT <= reference_date and within the ~30-day window. Interpreted as the average recency of historical orders contributing to the weekly summary: lower values indicate more recent ordering activity. Shows a negative correlation with next-week sales (≈ -0.26) in this dataset, suggesting that more recent activity concentrates with higher future sales; use as a recency/momentum signal alongside counts and sums.',\n", - " 'description_confidence': },\n", - " 'feature_1_38': {'name': 'feature_1_38',\n", - " 'title': 'distinct_order_age_count',\n", - " 'description': 'Counts the number of distinct order-age values within the lookback window [count]. Calculated by counting unique values of (reference_date - ORDERED_AT) among qualifying orders (orders on or before the reference date within ~30 days). Effectively measures how many distinct ordering time offsets (e.g., days with activity) exist in the window — a proxy for temporal breadth of ordering (e.g., spread vs. clustered activity). In this dataset it correlates highly with target (≈ 0.974), reflecting that broader ordering across the window tends to accompany larger next-week sales; model importance is small because it is redundant with other volume signals.',\n", - " 'description_confidence': },\n", - " 'feature_1_39': {'name': 'feature_1_39',\n", - " 'title': 'duplicate_order_age_count',\n", - " 'description': 'Measures the number of orders that share non-unique order-age values within the lookback window [count]. Computed as total qualifying orders minus the number of distinct (reference_date - ORDERED_AT) values. Captures repeated orders occurring at identical time offsets (e.g., multiple orders on the same day relative to reference_date) and behaves as an alternative volume proxy. Shows a strong positive correlation with next-week sales (≈ 0.927) in the data; useful for capturing intra-window concentration of orders and order cadence.',\n", - " 'description_confidence': },\n", - " 'feature_1_40': {'name': 'feature_1_40',\n", - " 'title': 'first_order_age',\n", - " 'description': 'Returns the age (reference_date - ORDERED_AT) associated with the earliest-order timestamp in the lookback window [seconds]. Implemented by selecting the age value tied to the chronologically first ORDERED_AT among qualifying orders (ORDERED_AT <= reference_date within ~30 days). Acts as an indicator of the earliest activity included in the window (how far back the oldest contributing order is). Correlation with the target is modest (≈ 0.14); use primarily for diagnostic purposes or to detect shifts in order timing coverage rather than as a primary predictive input.',\n", - " 'description_confidence': },\n", - " 'feature_1_41': {'name': 'feature_1_41',\n", - " 'title': 'last_order_age_seconds',\n", - " 'description': 'Computes the age of the most recent transaction (in seconds) relative to the weekly reference timestamp, using only orders within the 30‑day lookback and joined by store. Concretely, it selects the last value of (reference_date - ordered_at) when ordering transactions by ordered_at. Business meaning: captures recency of the latest order before the prediction anchor for that store-week — smaller values mean a very recent order. Statistical role & relationship to target: weak-to-moderate negative correlation with next‑week sales (observed correlation ≈ -0.26), indicating that more-recent last orders are associated with higher upcoming weekly sales. Usage guidance: use as a recency feature to detect recent bursts in activity; normalize or convert to days for interpretability. [seconds]',\n", - " 'description_confidence': },\n", - " 'feature_1_42': {'name': 'feature_1_42',\n", - " 'title': 'max_order_age_seconds',\n", - " 'description': 'Returns the largest time gap (in seconds) between the weekly reference timestamp and any historical order within the 30‑day window for the given store-week (i.e., maximum (reference_date - ordered_at)). This measures the age of the oldest transaction included in the window and reflects the effective window coverage (e.g., missing older orders reduces this value). Relationship to target: modest positive correlation seen in metadata (≈ 0.139); may indicate stores with sparser recent activity. Usage guidance: combine with counts or sum features to distinguish low-activity windows from windows with many orders that are all recent. [seconds]',\n", - " 'description_confidence': },\n", - " 'feature_1_43': {'name': 'feature_1_43',\n", - " 'title': 'median_order_age_seconds',\n", - " 'description': 'Computes the median age (in seconds) of all orders within the 30‑day lookback relative to the weekly reference timestamp, aggregated per store-week. This provides a robust central tendency measure of order recency that is less sensitive to outliers than the mean. Relationship to target: small negative correlation observed (≈ -0.16), so stores with more recently concentrated orders (lower median age) tend to have higher next-week sales. Usage guidance: useful for detecting shifts in recency distribution (e.g., campaign-driven spikes); consider rescaling to days for reporting. [seconds]',\n", - " 'description_confidence': },\n", - " 'feature_1_44': {'name': 'feature_1_44',\n", - " 'title': 'min_order_age_seconds',\n", - " 'description': 'Yields the smallest time difference (in seconds) between the weekly reference timestamp and any order in the 30‑day window (i.e., age of the freshest order). Similar to the most‑recent-order feature but computed as a global minimum; useful to validate data quality (e.g., identical to last-order when ordering is consistent). Relationship to target: observed negative correlation (~ -0.257) consistent with more recent activity predicting higher sales. Usage guidance: treat as a companion to median/mean recency metrics; convert to days for business reporting. [seconds]',\n", - " 'description_confidence': },\n", - " 'feature_1_45': {'name': 'feature_1_45',\n", - " 'title': 'mode_order_age_seconds',\n", - " 'description': 'Returns the most frequent order-age value (in seconds) inside the 30‑day lookback (mode of reference_date - ordered_at) for each store-week. Business meaning: indicates a repeated cadence or dominant lag (e.g., recurring scheduled orders) within the window. Relationship to target: low-to-moderate positive correlation (~0.046), so cadence patterns may weakly relate to future sales. Usage guidance: interpret carefully when the age distribution is multimodal; consider combining with count and inter-order interval features to capture cadence vs volume effects. [seconds]',\n", - " 'description_confidence': },\n", - " 'feature_1_46': {'name': 'feature_1_46',\n", - " 'title': 'stddev_order_age_seconds',\n", - " 'description': 'Computes the standard deviation (in seconds) of order ages within the 30‑day lookback for each store-week. This measures dispersion in recency: high values indicate mixed recency (orders spread across the window), low values indicate clustered timing. Relationship to target: small positive correlation (~0.013) in the metadata, implying limited direct predictive power but useful to distinguish stable vs bursty demand. Usage guidance: use alongside median/mean and count features to separate variability effects from volume effects. [seconds]',\n", - " 'description_confidence': },\n", - " 'feature_1_47': {'name': 'feature_1_47',\n", - " 'title': 'sum_order_age_seconds',\n", - " 'description': 'Sums the time differences (in seconds) between the reference timestamp and each historical order within the 30‑day window for each store-week. Operationally this is the aggregate of order ages and grows with both number of orders and their ages. Relationship to target: strong positive correlation observed (~0.956) — in practice this behaves largely as a proxy for order volume (more orders → larger sum) and thus tracks next‑week sales. Usage guidance: treat with caution because it conflates count and recency; decompose into count and average-age components if interpretability is required. [seconds]',\n", - " 'description_confidence': },\n", - " 'feature_1_48': {'name': 'feature_1_48',\n", - " 'title': 'trend_order_age_seconds',\n", - " 'description': 'Estimates the temporal trend (slope) of order ages within the 30‑day window by applying a trend operator to the sequence of (reference_date - ordered_at) values. In plain terms, it captures whether the ages of orders are increasing or decreasing across the window (e.g., orders becoming more recent over time). Relationship to target: metadata shows no direct correlation or importance in this run; it can still flag accelerating or decelerating order recency that precedes demand changes. Usage guidance: interpret the sign and magnitude as a short-term recency trend (positive slope → average ages increasing = orders getting older). Implementation note: TREND semantics can be implementation-specific (e.g., slope of linear fit), so validate units and scaling before combining with other features. [slope in seconds-per-index or seconds-per-time-unit depending on implementation]',\n", - " 'description_confidence': },\n", - " 'feature_1_49': {'name': 'feature_1_49',\n", - " 'title': 'avg_inter_order_interval_seconds',\n", - " 'description': 'Computes the average interval between consecutive orders (in seconds) within the 30‑day window for each store-week using (max(ordered_at) - min(ordered_at)) / (count - 1) when multiple orders exist, otherwise zero. Business meaning: measures typical cadence between orders — smaller values indicate higher transaction frequency. Statistical relationship: strong negative correlation (~ -0.95) with next‑week sales in the metadata, meaning shorter inter-order intervals (more frequent orders) align with higher upcoming weekly sales. Usage guidance: treat as a direct behavioral cadence indicator; when counts are low the metric defaults to 0 so combine with count to avoid misinterpretation. [seconds]',\n", - " 'description_confidence': },\n", - " 'feature_1_50': {'name': 'feature_1_50',\n", - " 'title': 'orders_count_30d',\n", - " 'description': 'Counts all orders within the 30‑day lookback prior to the weekly reference timestamp for each store-week. Business meaning: direct volume measure of recent activity; high counts imply higher throughput and typically higher next‑week revenue. Relationship to target: very high correlation (≈ 0.965) with next‑week sales — essentially a primary volume signal. Usage guidance: use as a key predictor of sales; if operationally you cannot know future counts at prediction time, ensure to replace or augment this with an order‑count forecast to avoid leakage. [count]',\n", - " 'description_confidence': },\n", - " 'days_since_open': {'name': 'days_since_open',\n", - " 'title': 'days_since_open',\n", - " 'description': 'Store age measured in days at the weekly reference timestamp. Captures lifecycle/ramp effects: newer stores often have different demand profiles than mature locations. Statistical properties: average increases across splits (train ≈ 577 days; validation ≈ 1189; test ≈ 1490), and shows a moderate positive correlation with next‑week sales (~0.35), indicating maturation is associated with higher sales. Usage guidance: include to control for lifecycle effects, segment models by age buckets if policy/strategy differs across ramp stages. [days]',\n", - " 'description_confidence': },\n", - " 'next_week_orders': {'name': 'next_week_orders',\n", - " 'title': 'next_week_orders',\n", - " 'description': 'Number of orders for the upcoming week associated with the store-week record. Business meaning: direct forward-looking volume measure for the target period. Predictive role: overwhelmingly dominant predictor in the model (importance ≈ 0.965 and correlation ≈ 0.989 to next‑week sales), reflecting that weekly sales are largely volume-driven and revenue per order is relatively stable. Caution & governance: this value is a potential source of target leakage if not truly available at prediction time; if operational forecasts cannot supply it, remove it or replace it with a forecasted order-count to obtain realistic performance. Usage guidance: when available legitimately (e.g., booked orders), include it; otherwise treat as a label-derived proxy and engineer alternative historical predictors for production use. [count]',\n", - " 'description_confidence': }}}" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "feature_descriptions_report.model_dump()" + "feature_descriptions_report = await generate_feature_descriptions_report(\n", + " project_name=PROJECT_NAME,\n", + " pipeline=pipe,\n", + " container=container,\n", + " column_descriptions_report=column_descriptions_report,\n", + " user_prompt=user_prompt,\n", + " model=\"gpt-5-mini\",\n", + " batch_size=20,\n", + ")\n", + "\n", + "feature_descriptions_report = FeatureDescriptionsReport.model_validate_json(\n", + " Path(\"feature_descriptions_report.json\").read_text()\n", + ")" ] }, { "cell_type": "code", - "execution_count": 19, - "id": "f7c3eba3", + "execution_count": null, + "id": "63206dde", "metadata": {}, "outputs": [], "source": [ @@ -4196,51 +401,25 @@ }, { "cell_type": "code", - "execution_count": 20, - "id": "7c714b50", + "execution_count": null, + "id": "275540c9", "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[?25h" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "import pandas as pd\n", - "\n", - "features_np = pipe.transform(\n", + "features = pipe.transform(\n", " population_table=weekly_sales_by_store,\n", " peripheral_tables=[orders],\n", + " df_name=\"weekly_sales_features_full\",\n", ")\n", "\n", - "feature_descs = feature_descriptions_report.model_dump().get(\"feature_descriptions\", {})\n", "name_to_title = {\n", - " name: info.get(\"title\", name).upper() for name, info in feature_descs.items()\n", + " feat.name: feat.title\n", + " for feat in feature_descriptions_report.feature_descriptions.values()\n", "}\n", - "\n", - "features_df = pd.DataFrame(features_np, columns=pipe.features.names)\n", - "features_df.rename(columns=lambda c: name_to_title.get(c, c.upper()), inplace=True)\n", - "features_df[\"STORE_ID\"] = weekly_sales_by_store[\"STORE_ID\"].to_numpy()\n", - "features_df[\"SNAPSHOT_ID\"] = weekly_sales_by_store[\"SNAPSHOT_ID\"].to_numpy()\n", + "features_pd = features.to_pandas().rename(columns=name_to_title)\n", "\n", "session.write_pandas(\n", - " df=features_df,\n", + " df=features_pd,\n", " table_name=\"GETML_FEATURES\",\n", " schema=\"GETML_FS\",\n", " auto_create_table=True,\n", @@ -4250,138 +429,81 @@ }, { "cell_type": "code", - "execution_count": 21, - "id": "f125f7bd", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/alex/projects/worktrees/getml-demo/60-create-initial-snowflake-notebook-5-sections/integration/snowflake/notebooks/.venv/lib/python3.12/site-packages/snowflake/ml/feature_store/feature_store.py:189: UserWarning: Entity STORE_SNAPSHOT already exists. Skip registration.\n", - " return f(self, *args, **kargs)\n" - ] - }, - { - "data": { - "text/plain": [ - "Entity(name=STORE_SNAPSHOT, join_keys=['STORE_ID', 'SNAPSHOT_ID'], owner=None, desc=)" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "id": "0963ee93", + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [], "source": [ "from snowflake.ml.feature_store import CreationMode, Entity, FeatureStore, FeatureView\n", "\n", - "# Create Snowpark DataFrame from the table for Feature Store\n", "features_snowpark_df = session.table(\"GETML_FS.GETML_FEATURES\")\n", "\n", - "# Initialize Feature Store\n", "snowflake_feature_store = FeatureStore(\n", " session=session,\n", - " database=os.environ[\"SNOWFLAKE_DATABASE\"],\n", + " database=SNOWFLAKE_DATABASE,\n", " name=\"GETML_FS\",\n", - " default_warehouse=os.environ[\"SNOWFLAKE_WAREHOUSE\"],\n", + " default_warehouse=SNOWFLAKE_WAREHOUSE,\n", " creation_mode=CreationMode.CREATE_IF_NOT_EXIST,\n", ")\n", "\n", - "# Create Entity (required for FeatureView)\n", "store_entity = Entity(name=\"STORE_SNAPSHOT\", join_keys=[\"STORE_ID\", \"SNAPSHOT_ID\"])\n", - "snowflake_feature_store.register_entity(store_entity)\n" + "snowflake_feature_store.register_entity(store_entity)" ] }, { "cell_type": "code", - "execution_count": 22, - "id": "flrmlb75nyi", + "execution_count": null, + "id": "d6fa028e", "metadata": {}, "outputs": [], "source": [ "from snowflake.snowpark import Session\n", "\n", "\n", - "def escape_sql_literal(value: str) -> tuple[str, str]:\n", - " \"\"\"Escape a string for use as a SQL literal.\n", - "\n", - " Uses dollar-quoting ($$...$$) when possible, falls back to single quotes\n", - " with escaping if the value contains $$.\n", - "\n", - " Returns:\n", - " Tuple of (quote_char, escaped_value) where quote_char is either $$ or '\n", - " \"\"\"\n", - " if \"$$\" in value:\n", - " return (\"'\", value.replace(\"'\", \"''\"))\n", - " return (\"$$\", value)\n", - "\n", - "\n", "def set_column_comments(\n", " session: Session,\n", - " object_name: str,\n", - " column_descriptions: dict[str, dict],\n", - " object_type: str = \"TABLE\",\n", + " table_fqn: str,\n", + " comments: dict[str, str],\n", ") -> None:\n", - " \"\"\"Set column comments on a Snowflake table or view.\"\"\"\n", - " for col_name, col_info in column_descriptions.items():\n", - " description = col_info.get(\"description\", \"\")\n", - " quote_char, escaped_desc = escape_sql_literal(description)\n", + " clauses = []\n", + " params = [table_fqn]\n", + " for col, comment in comments.items():\n", + " clauses.append(f\"COLUMN {col} COMMENT ?\")\n", + " params.append(comment)\n", "\n", - " if object_type == \"VIEW\":\n", - " sql = f\"ALTER VIEW {object_name} MODIFY COLUMN {col_name} COMMENT {quote_char}{escaped_desc}{quote_char}\"\n", - " else:\n", - " sql = f\"COMMENT ON COLUMN {object_name}.{col_name} IS {quote_char}{escaped_desc}{quote_char}\"\n", - " session.sql(sql).collect()\n", + " body = \", \".join(clauses)\n", + "\n", + " session.sql(\n", + " f\"ALTER TABLE IDENTIFIER(?) MODIFY {body}\",\n", + " params=params,\n", + " ).collect()\n", "\n", "\n", "def set_column_tags(\n", " session: Session,\n", + " object_type: str, # \"TABLE\" or \"VIEW\"\n", " object_name: str,\n", " column_name: str,\n", " tags: dict[str, str],\n", - " object_type: str = \"TABLE\",\n", ") -> None:\n", - " \"\"\"Set multiple tags on a column.\"\"\"\n", " for tag_name, tag_value in tags.items():\n", - " tag_value_str = str(tag_value)\n", - " quote_char, escaped_value = escape_sql_literal(tag_value_str)\n", - " sql = f\"ALTER {object_type} {object_name} MODIFY COLUMN {column_name} SET TAG {tag_name} = {quote_char}{escaped_value}{quote_char}\"\n", - " try:\n", - " session.sql(sql).collect()\n", - " except Exception as e:\n", - " print(\n", - " f\"Warning: Could not set tag {tag_name} on {object_name}.{column_name}: {e}\"\n", - " )" + " session.sql(\n", + " f\"ALTER {object_type} IDENTIFIER(?)\"\n", + " f\"MODIFY COLUMN {column_name}\"\n", + " f\"SET TAG {tag_name} = ?\",\n", + " params=[object_name, tag_value],\n", + " ).collect()" ] }, { "cell_type": "code", - "execution_count": 23, - "id": "ebfbf670", + "execution_count": null, + "id": "c2fba239", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "FeatureView(_name=WEEKLY_SALES_FEATURES, _entities=[Entity(name=STORE_SNAPSHOT, join_keys=['STORE_ID', 'SNAPSHOT_ID'], owner=None, desc=)], _feature_df=, _timestamp_col=None, _desc=Features generated by getML for weekly sales prediction, _infer_schema_df=, _query=SELECT * FROM GETML_FS.GETML_FEATURES, _version=5, _status=FeatureViewStatus.STATIC, _feature_desc=OrderedDict({'AVG_SUBTOTAL_30D': 'Average pre-tax order amount aggregated across all transactions for the store within the 30-day lookback ending at the weekly reference timestamp. Computed by joining store-week records to the transactional table, filtering orders with ORDERED_AT <= REFERENCE_DATE and within the configured 30‑day window, then taking AVG(SUBTOTAL) [USD]. Acts as a short-term average order-value signal and proxy for recent revenue per order; in this model it shows very low direct correlation with the target, so treat it as a secondary demand-level indicator rather than the primary driver.', 'DISTINCT_SUBTOTAL_COUNT_30D': 'Count of distinct pre-tax order amounts observed in the 30-day lookback for the store-week. Implemented as COUNT(DISTINCT SUBTOTAL) after time alignment to the reference date [count]. Intended to capture variety/diversity of order price points (e.g., mix of bundles or menu items); because SUBTOTAL has few unique values in the data, this metric often behaves as a volume/variety proxy. Use with caution: interpretation depends on whether subtotal discretization is business-driven.', 'REPEAT_SUBTOTAL_COUNT_30D': 'Number of repeated pre-tax order amounts within the 30-day window, computed as total COUNT(SUBTOTAL) minus COUNT(DISTINCT SUBTOTAL) [count]. Measures how often identical subtotal values recur (i.e., how concentrated orders are around specific price points) and therefore serves as a proxy for order volume and product-price repetition. Highly correlated with next-week sales in this dataset, indicating it largely captures throughput rather than unique-price behavior.', 'FIRST_SUBTOTAL_30D': 'Earliest pre-tax order amount observed in the 30-day lookback relative to the weekly reference timestamp [USD]. Calculated with FIRST(SUBTOTAL, ORDERED_AT) after joining on store and applying the time filter. Provides a simple recency anchor for historical order sizes (what the first recent order looked like); useful for detecting shifts when compared to more recent values, but here it has limited standalone predictive power.', 'LAST_SUBTOTAL_30D': 'Most recent pre-tax order amount within the 30-day lookback (based on ORDERED_AT) [USD]. Implemented via LAST(SUBTOTAL, ORDERED_AT) on time-aligned transactions. Serves as a short-term signal of the latest basket size; differences between this and the earlier average or first value can indicate recent shifts in order composition. In this model it has modest predictive contribution.', 'MAX_SUBTOTAL_30D': 'Maximum pre-tax order amount observed in the prior 30 days for the store-week [USD]. Obtained with MAX(SUBTOTAL) after time alignment. Captures outlier large orders or high-ticket transactions in the recent window; useful to detect occasional large sales (e.g., catering) that can inflate weekly revenue but should be interpreted alongside counts/sums to avoid over-weighting rare events.', 'MEDIAN_SUBTOTAL_30D': 'Median pre-tax order amount across orders in the 30-day lookback [USD]. Computed with MEDIAN(SUBTOTAL) after joining transactions to the store-week record. Provides a robust central tendency of order sizes that is less sensitive to large outliers than mean; in datasets with many identical price points this often coincides with common menu price levels.', 'MIN_SUBTOTAL_30D': 'Minimum pre-tax order amount observed in the prior 30 days [USD]. Derived via MIN(SUBTOTAL) after time filtering. Helps identify the smallest transactions (e.g., single-item or discounted orders) and complements central-tendency and dispersion metrics when assessing typical basket sizes.', 'MODE_SUBTOTAL_30D': 'Most frequently occurring pre-tax order amount in the 30-day window [USD]. Implemented with MODE(SUBTOTAL) across time-aligned transactions. Useful for capturing the dominant price point or standardized order package in the store’s recent activity; particularly informative when business operates on a small set of fixed price offerings.', 'STDDEV_SUBTOTAL_30D': 'Standard deviation of pre-tax order amounts within the 30-day lookback [USD]. Calculated with STDDEV(SUBTOTAL) after joining orders to the store-week. Measures dispersion of order values: higher dispersion means more variability in basket sizes. In this model a larger dispersion is associated with lower next-week sales (negative correlation), so it may reflect unstable or sporadic demand patterns that reduce predictability.', 'SUM_SUBTOTAL_30D': 'Sum of pre-tax order amounts across all transactions in the 30-day lookback [USD]. Computed using SUM(SUBTOTAL) on time-aligned orders joined to the store-week. Serves as a recent revenue run-rate proxy and is strongly correlated with next-week sales in this dataset (very high positive correlation), making it a key short-term demand indicator complementary to order counts.', 'TREND_SUBTOTAL_30D': 'Temporal trend coefficient of pre-tax order amounts across the 30-day window, estimated by regressing SUBTOTAL against recency (REFERENCE_DATE - ORDERED_AT) [USD/day or relative trend]. Implemented via TREND(SUBTOTAL, reference_date - ordered_at) after time alignment. Captures whether order values are increasing or decreasing as the reference week approaches; can signal accelerating/decelerating average order value, though in this model its direct correlation to the target is small.', 'AVG_ORDER_TOTAL_30D': 'Average final order amount (post-tax/fees) aggregated over transactions in the 30-day lookback [USD]. Computed with AVG(ORDER_TOTAL) after joining and filtering by time. Provides a complementary revenue-per-order signal to pre-tax averages and helps capture tax/fee effects; modestly negatively correlated with next-week sales here, so use together with counts and sums to separate price effects from volume effects.', 'DISTINCT_ORDER_TOTAL_COUNT_30D': 'Count of distinct final order amounts observed in the 30-day lookback [count]. Calculated via COUNT(DISTINCT ORDER_TOTAL) on time-filtered orders. Intended to measure diversity of billed totals (e.g., different bundles or fee variations); when ORDER_TOTAL is heavily discretized this feature may mainly reflect volume/variety constraints rather than nuanced price changes.', 'REPEAT_ORDER_TOTAL_COUNT_30D': 'Number of repeated final order amounts within the 30-day window, computed as COUNT(ORDER_TOTAL) - COUNT(DISTINCT ORDER_TOTAL) [count]. Captures concentration around recurring billed totals and therefore acts as a volume proxy; shows very strong correlation with next-week sales in the data, indicating it largely tracks throughput and repeated standardized transactions.', 'FIRST_ORDER_TOTAL_30D': 'Earliest final order amount in the 30-day lookback relative to the reference date [USD]. Implemented via FIRST(ORDER_TOTAL, ORDERED_AT) after joining transactions. Offers a recency-anchored snapshot of billed totals at the start of the recent window; best used in combination with last/average values to detect shifts in billing or price mix.', 'LAST_ORDER_TOTAL_30D': 'Most recent final order amount within the 30-day window based on ORDERED_AT [USD]. Calculated with LAST(ORDER_TOTAL, ORDERED_AT). Provides the latest observed billed total and can indicate immediate changes in pricing or basket composition; here it has a modest negative association with next-week sales and should be interpreted alongside count/sum features.', 'MAX_ORDER_TOTAL_30D': 'Maximum final order amount observed in the prior 30 days [USD]. Derived with MAX(ORDER_TOTAL) after time alignment. Identifies high-ticket billed transactions and helps flag occasional large orders (e.g., bulk/catering) that may disproportionately affect weekly revenue if frequent.', 'MEDIAN_ORDER_TOTAL_30D': 'Median final order amount across transactions in the 30-day lookback [USD]. Computed with MEDIAN(ORDER_TOTAL) after joining and filtering by time. Offers a robust central measure of billed totals and is useful when distributions are skewed by occasional large orders.', 'MIN_ORDER_TOTAL_30D': 'Minimum final order amount observed in the 30-day window [USD]. Implemented via MIN(ORDER_TOTAL) on time-aligned transactions. Complements median/mean metrics by indicating the smallest billed totals and can reveal presence of many small-value transactions or discounts.', 'ORDER_TOTAL_MODE': 'Captures the most frequently occurring final order amount within the recent lookback window [USD]. Computed by joining per-store historical orders to the store-week record and returning the statistical mode of order_total for orders with ORDERED_AT <= reference_date and within the ~30-day rolling window used by the pipeline. Serves as a compact descriptor of the dominant price point or common basket total in recent activity. Statistically this feature has a moderate negative correlation with the target (≈ -0.25) and zero measured importance in the current model run, indicating it is often redundant with higher-level volume or sum aggregates but useful for detecting dominant price tiers or menu changes. Use it for monitoring price-point shifts or as a categorical proxy for AOV when combined with count-based features. ', 'ORDER_TOTAL_STDDEV': 'Measures dispersion of final order amounts over the recent lookback window [USD]. Implemented as the sample standard deviation of order_total across all qualifying orders for the store-week (orders with ORDERED_AT <= reference_date and within the ~30-day window). Reflects variability in basket sizes or mixed-order types and, in this dataset, shows a notable negative correlation with the target (≈ -0.58) and small but nonzero model importance — higher variability has been associated with lower next-week sales in the training data. Use as an indicator of revenue stability: low stddev implies predictable revenue-per-order, while high stddev signals heterogeneous order values that can complicate sales forecasts.', 'ORDER_TOTAL_SUM': 'Aggregates total realized revenue from orders in the recent lookback window [USD]. Calculated by summing order_total for all store orders with ORDERED_AT <= reference_date (and within the ~30-day rolling window). Acts as a short-term revenue run-rate and is a strong predictor of next-week sales (correlation ≈ 0.975; measured importance ~0.0107 in the model). Business interpretation: this is a direct proxy for recent demand level and momentum — higher recent sums indicate higher expected weekly sales. Recommended use: include as a baseline demand signal and combine with order-count forecasts to separate volume vs. AOV effects.', 'ORDER_TOTAL_TREND': 'Estimates directional change in final order amounts across the lookback period [USD per time unit]. Computed using a trend/slope operator that regresses order_total against the time offset (reference_date - ORDERED_AT) for qualifying orders (orders on or before the reference date within the ~30-day window). Provides a short-term momentum signal for basket values (rising, stable, or declining AOV). Empirically the feature has a small negative correlation with the target (≈ -0.09) and low importance, suggesting limited additive predictive value beyond aggregate sums and counts in this dataset; still valuable for detecting systematic increases or decreases in pricing or order composition.', 'TAX_PAID_AVG': 'Computes the average tax amount paid per order within the recent lookback window [USD]. Implemented as the mean of tax_paid for all qualifying orders (ORDERED_AT <= reference_date and within ~30 days). Serves as a measure of tax intensity or small per-order fees and can act as a proxy for average order size when taxes scale with order value. Shows modest negative correlation with the target (≈ -0.22) and low importance, so it is more useful for monitoring or as a control variable than as a core predictive input.', 'DISTINCT_TAX_VALUES_COUNT': 'Counts distinct observed tax amounts among recent orders [count]. Derived by counting unique tax_paid values for qualifying orders in the lookback window (orders at or before the reference date within ~30 days). With highly discretized pricing in the data, this feature mostly captures the diversity of tax buckets (proxy for variety in order types or price points) rather than absolute volume. Measured correlation in the dataset is positive (~0.24) but model importance is zero, indicating redundancy with other features; use primarily for diagnostics (detecting price-list changes or multiple tax regimes).', 'DUPLICATE_TAX_COUNT': \"Quantifies how many orders share repeated tax amounts within the lookback window [count]. Computed as total count of qualifying orders minus the count of distinct tax_paid values, effectively measuring the number of 'duplicate' tax entries (i.e., repeated tax buckets). In practice this behaves like a volume proxy when tax values are few and frequently repeated; observed a high correlation with several demand signals in this dataset (correlation reported high in tooling), though measured model importance is zero here—likely redundant with raw counts and sums. Use cautiously: useful for identifying dominant tax buckets and for data-quality checks.\", 'FIRST_TAX_PAID': 'Returns the tax amount from the earliest order in the lookback window as of the store-week reference [USD]. Implemented by selecting tax_paid associated with the chronologically first ORDERED_AT among qualifying orders (ORDERED_AT <= reference_date and within ~30 days). Captures historical tax level at the start of the window and can flag changes in tax calculation or pricing trends. Low correlation with the target (≈ -0.07) and small importance indicate limited predictive value, but it is helpful for auditing temporal shifts in tax or fee structure.', 'LAST_TAX_PAID': 'Returns the tax amount from the most recent order within the lookback window [USD]. Computed by selecting tax_paid associated with the latest ORDERED_AT up to reference_date (within ~30 days). Acts as a short-term indicator of current tax/fee level applied to recent orders; slightly more predictive in this dataset (correlation ≈ -0.22) than the earliest tax value, suggesting recent tax/fee signals align modestly with next-week sales variations. Use alongside aggregated tax sums for both monitoring and modeling.', 'TAX_PAID_MAX': 'Reports the maximum tax amount observed among recent orders [USD]. Calculated by taking the maximum tax_paid across qualifying orders (ORDERED_AT <= reference_date within the ~30-day window). Serves as an outlier/dominant-basket indicator (e.g., presence of a few high-value orders) and shows a moderate negative correlation with next-week sales (≈ -0.25) in the provided run. Use to detect large, infrequent transactions that may skew mean-based metrics and consider combining with sums and counts to separate volume effects from large-order noise.', 'TAX_PAID_MEDIAN': 'Gives the median tax amount across recent orders [USD]. Computed as the median of tax_paid values for qualifying orders in the lookback window (orders with ORDERED_AT <= reference_date and within ~30 days). Provides a robust central tendency measure less sensitive to outliers than the mean; shows moderate negative correlation with the target (≈ -0.25) in this dataset. Useful for capturing typical per-order tax burden when the tax distribution is skewed by a few large orders.', 'TAX_PAID_MIN': 'Returns the minimum tax amount observed among recent orders [USD]. Implemented as the minimum of tax_paid across qualifying orders (ORDERED_AT <= reference_date within the ~30-day window). Acts as a lower-bound indicator for tax/fee application and is mainly useful for data-quality checks or to flag free/zero-tax transactions. Measured importance is zero in the current model run, consistent with limited predictive value relative to aggregate tax measures.', 'TAX_PAID_MODE': 'Returns the most frequent tax amount observed in the lookback window [USD]. Computed as the mode of tax_paid for qualifying orders (orders at or before reference_date within ~30 days). Because tax values are highly discretized, this feature often acts as a proxy for the prevailing price/tax bucket and shows a moderate negative correlation with the target (≈ -0.25). Its primary value is in detecting the dominant tax bucket and monitoring price-list stability; it is often redundant with summary statistics such as median or sum.', 'TAX_PAID_STDDEV': 'Measures variability of tax amounts across recent orders [USD]. Implemented as the standard deviation of tax_paid over all qualifying orders (ORDERED_AT <= reference_date within the ~30-day lookback). Captures heterogeneity in applied taxes/fees and correlates negatively with next-week sales (≈ -0.32) in this dataset. Use to detect inconsistent pricing/tax practices or mixed-order types; consider pairing with count and sum features to separate variability due to volume from variability due to basket mix.', 'TAX_PAID_SUM': 'Aggregates total tax collected from orders in the recent lookback window [USD]. Calculated by summing tax_paid for all qualifying orders (ORDERED_AT <= reference_date and within ~30 days). Acts as a demand proxy that partially parallels revenue sums (observed correlation ≈ 0.54) and shows measurable importance in the model. Business interpretation: increases in summed tax usually reflect higher recent sales volume; use together with order counts and order_total sums to decompose revenue growth into volume and per-order effects.', 'TAX_PAID_TREND': 'Estimates short-term directionality of tax amounts across the lookback period [USD per time unit]. Implemented via a trend/slope operator regressing tax_paid on the time offset (reference_date - ORDERED_AT) for qualifying orders (orders up to the reference date within ~30 days). Signals whether per-order tax/fee amounts are rising or falling over the window; shows modest negative correlation with the target (≈ -0.22). Useful for detecting gradual shifts in AOV or fee application that may anticipate sales changes.', 'AVG_ORDER_AGE': 'Computes the mean time difference between the store-week reference and each qualifying order in the lookback window [seconds] (approx. convertable to days by dividing by 86,400). Derived as the average of (reference_date - ORDERED_AT) for orders with ORDERED_AT <= reference_date and within the ~30-day window. Interpreted as the average recency of historical orders contributing to the weekly summary: lower values indicate more recent ordering activity. Shows a negative correlation with next-week sales (≈ -0.26) in this dataset, suggesting that more recent activity concentrates with higher future sales; use as a recency/momentum signal alongside counts and sums.', 'DISTINCT_ORDER_AGE_COUNT': 'Counts the number of distinct order-age values within the lookback window [count]. Calculated by counting unique values of (reference_date - ORDERED_AT) among qualifying orders (orders on or before the reference date within ~30 days). Effectively measures how many distinct ordering time offsets (e.g., days with activity) exist in the window — a proxy for temporal breadth of ordering (e.g., spread vs. clustered activity). In this dataset it correlates highly with target (≈ 0.974), reflecting that broader ordering across the window tends to accompany larger next-week sales; model importance is small because it is redundant with other volume signals.', 'DUPLICATE_ORDER_AGE_COUNT': 'Measures the number of orders that share non-unique order-age values within the lookback window [count]. Computed as total qualifying orders minus the number of distinct (reference_date - ORDERED_AT) values. Captures repeated orders occurring at identical time offsets (e.g., multiple orders on the same day relative to reference_date) and behaves as an alternative volume proxy. Shows a strong positive correlation with next-week sales (≈ 0.927) in the data; useful for capturing intra-window concentration of orders and order cadence.', 'FIRST_ORDER_AGE': 'Returns the age (reference_date - ORDERED_AT) associated with the earliest-order timestamp in the lookback window [seconds]. Implemented by selecting the age value tied to the chronologically first ORDERED_AT among qualifying orders (ORDERED_AT <= reference_date within ~30 days). Acts as an indicator of the earliest activity included in the window (how far back the oldest contributing order is). Correlation with the target is modest (≈ 0.14); use primarily for diagnostic purposes or to detect shifts in order timing coverage rather than as a primary predictive input.', 'LAST_ORDER_AGE_SECONDS': 'Computes the age of the most recent transaction (in seconds) relative to the weekly reference timestamp, using only orders within the 30‑day lookback and joined by store. Concretely, it selects the last value of (reference_date - ordered_at) when ordering transactions by ordered_at. Business meaning: captures recency of the latest order before the prediction anchor for that store-week — smaller values mean a very recent order. Statistical role & relationship to target: weak-to-moderate negative correlation with next‑week sales (observed correlation ≈ -0.26), indicating that more-recent last orders are associated with higher upcoming weekly sales. Usage guidance: use as a recency feature to detect recent bursts in activity; normalize or convert to days for interpretability. [seconds]', 'MAX_ORDER_AGE_SECONDS': 'Returns the largest time gap (in seconds) between the weekly reference timestamp and any historical order within the 30‑day window for the given store-week (i.e., maximum (reference_date - ordered_at)). This measures the age of the oldest transaction included in the window and reflects the effective window coverage (e.g., missing older orders reduces this value). Relationship to target: modest positive correlation seen in metadata (≈ 0.139); may indicate stores with sparser recent activity. Usage guidance: combine with counts or sum features to distinguish low-activity windows from windows with many orders that are all recent. [seconds]', 'MEDIAN_ORDER_AGE_SECONDS': 'Computes the median age (in seconds) of all orders within the 30‑day lookback relative to the weekly reference timestamp, aggregated per store-week. This provides a robust central tendency measure of order recency that is less sensitive to outliers than the mean. Relationship to target: small negative correlation observed (≈ -0.16), so stores with more recently concentrated orders (lower median age) tend to have higher next-week sales. Usage guidance: useful for detecting shifts in recency distribution (e.g., campaign-driven spikes); consider rescaling to days for reporting. [seconds]', 'MIN_ORDER_AGE_SECONDS': 'Yields the smallest time difference (in seconds) between the weekly reference timestamp and any order in the 30‑day window (i.e., age of the freshest order). Similar to the most‑recent-order feature but computed as a global minimum; useful to validate data quality (e.g., identical to last-order when ordering is consistent). Relationship to target: observed negative correlation (~ -0.257) consistent with more recent activity predicting higher sales. Usage guidance: treat as a companion to median/mean recency metrics; convert to days for business reporting. [seconds]', 'MODE_ORDER_AGE_SECONDS': 'Returns the most frequent order-age value (in seconds) inside the 30‑day lookback (mode of reference_date - ordered_at) for each store-week. Business meaning: indicates a repeated cadence or dominant lag (e.g., recurring scheduled orders) within the window. Relationship to target: low-to-moderate positive correlation (~0.046), so cadence patterns may weakly relate to future sales. Usage guidance: interpret carefully when the age distribution is multimodal; consider combining with count and inter-order interval features to capture cadence vs volume effects. [seconds]', 'STDDEV_ORDER_AGE_SECONDS': 'Computes the standard deviation (in seconds) of order ages within the 30‑day lookback for each store-week. This measures dispersion in recency: high values indicate mixed recency (orders spread across the window), low values indicate clustered timing. Relationship to target: small positive correlation (~0.013) in the metadata, implying limited direct predictive power but useful to distinguish stable vs bursty demand. Usage guidance: use alongside median/mean and count features to separate variability effects from volume effects. [seconds]', 'SUM_ORDER_AGE_SECONDS': 'Sums the time differences (in seconds) between the reference timestamp and each historical order within the 30‑day window for each store-week. Operationally this is the aggregate of order ages and grows with both number of orders and their ages. Relationship to target: strong positive correlation observed (~0.956) — in practice this behaves largely as a proxy for order volume (more orders → larger sum) and thus tracks next‑week sales. Usage guidance: treat with caution because it conflates count and recency; decompose into count and average-age components if interpretability is required. [seconds]', 'TREND_ORDER_AGE_SECONDS': 'Estimates the temporal trend (slope) of order ages within the 30‑day window by applying a trend operator to the sequence of (reference_date - ordered_at) values. In plain terms, it captures whether the ages of orders are increasing or decreasing across the window (e.g., orders becoming more recent over time). Relationship to target: metadata shows no direct correlation or importance in this run; it can still flag accelerating or decelerating order recency that precedes demand changes. Usage guidance: interpret the sign and magnitude as a short-term recency trend (positive slope → average ages increasing = orders getting older). Implementation note: TREND semantics can be implementation-specific (e.g., slope of linear fit), so validate units and scaling before combining with other features. [slope in seconds-per-index or seconds-per-time-unit depending on implementation]', 'AVG_INTER_ORDER_INTERVAL_SECONDS': 'Computes the average interval between consecutive orders (in seconds) within the 30‑day window for each store-week using (max(ordered_at) - min(ordered_at)) / (count - 1) when multiple orders exist, otherwise zero. Business meaning: measures typical cadence between orders — smaller values indicate higher transaction frequency. Statistical relationship: strong negative correlation (~ -0.95) with next‑week sales in the metadata, meaning shorter inter-order intervals (more frequent orders) align with higher upcoming weekly sales. Usage guidance: treat as a direct behavioral cadence indicator; when counts are low the metric defaults to 0 so combine with count to avoid misinterpretation. [seconds]', 'ORDERS_COUNT_30D': 'Counts all orders within the 30‑day lookback prior to the weekly reference timestamp for each store-week. Business meaning: direct volume measure of recent activity; high counts imply higher throughput and typically higher next‑week revenue. Relationship to target: very high correlation (≈ 0.965) with next‑week sales — essentially a primary volume signal. Usage guidance: use as a key predictor of sales; if operationally you cannot know future counts at prediction time, ensure to replace or augment this with an order‑count forecast to avoid leakage. [count]', 'DAYS_SINCE_OPEN': 'Store age measured in days at the weekly reference timestamp. Captures lifecycle/ramp effects: newer stores often have different demand profiles than mature locations. Statistical properties: average increases across splits (train ≈ 577 days; validation ≈ 1189; test ≈ 1490), and shows a moderate positive correlation with next‑week sales (~0.35), indicating maturation is associated with higher sales. Usage guidance: include to control for lifecycle effects, segment models by age buckets if policy/strategy differs across ramp stages. [days]', 'NEXT_WEEK_ORDERS': 'Number of orders for the upcoming week associated with the store-week record. Business meaning: direct forward-looking volume measure for the target period. Predictive role: overwhelmingly dominant predictor in the model (importance ≈ 0.965 and correlation ≈ 0.989 to next‑week sales), reflecting that weekly sales are largely volume-driven and revenue per order is relatively stable. Caution & governance: this value is a potential source of target leakage if not truly available at prediction time; if operational forecasts cannot supply it, remove it or replace it with a forecasted order-count to obtain realistic performance. Usage guidance: when available legitimately (e.g., booked orders), include it; otherwise treat as a label-derived proxy and engineer alternative historical predictors for production use. [count]'}), _refresh_freq=None, _database=JAFFLE_SHOP, _schema=GETML_FS, _initialize=ON_CREATE, _warehouse=None, _refresh_mode=None, _refresh_mode_reason=None, _owner=ACCOUNTADMIN, _cluster_by=['STORE_ID', 'SNAPSHOT_ID'], _online_config=OnlineConfig(enable=False, target_lag='10 seconds'), _lineage_node_name=JAFFLE_SHOP.GETML_FS.WEEKLY_SALES_FEATURES, _lineage_node_domain=feature_view, _lineage_node_version=5, _lineage_node_status=None, _lineage_node_created_on=None, _session=)" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "feature_dict = feature_descriptions_report.model_dump()\n", - "feature_descs = feature_dict.get(\"feature_descriptions\", {})\n", - "\n", - "feature_descs_upper = {}\n", - "for orig_name, info in feature_descs.items():\n", - " title = info.get(\"title\", orig_name).upper()\n", - " description = info.get(\"description\", \"\") if isinstance(info, dict) else info\n", - " feature_descs_upper[title] = description.replace(\"'\", \"''\")\n", - "\n", "# refresh_freq=None means features are externally managed\n", "weekly_sales_feature_view = FeatureView(\n", " name=\"weekly_sales_features\",\n", @@ -4389,435 +511,152 @@ " feature_df=features_snowpark_df,\n", " refresh_freq=None,\n", " desc=\"Features generated by getML for weekly sales prediction\",\n", - ").attach_feature_desc(feature_descs_upper)\n", + ").attach_feature_desc(\n", + " {\n", + " feat.title: feat.description\n", + " for feat in feature_descriptions_report.feature_descriptions.values()\n", + " }\n", + ")\n", "\n", "registered_feature_view = snowflake_feature_store.register_feature_view(\n", " feature_view=weekly_sales_feature_view,\n", " version=FEATURE_STORE_VERSION,\n", " overwrite=True,\n", - ")\n", - "\n", - "registered_feature_view" + ")" ] }, { "cell_type": "markdown", - "id": "ke3yigrk8n", + "id": "b6037147", "metadata": {}, "source": [ "### Metadata Enrichment\n", "\n", - "Add table/column comments, semantic tags, and feature provenance metadata to Snowflake objects for governance and discoverability." + "We enrich Snowflake objects with comments, semantic tags, and feature provenance metadata for governance and discoverability. The implementation details are in `metadata_enrichment.py`." ] }, { "cell_type": "code", - "execution_count": 24, - "id": "ul19pf4hpya", + "execution_count": null, + "id": "df5e0b0a", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Set comment on TABLE RAW.RAW_ORDERS\n", - "Set comment on VIEW PREPARED.WEEKLY_SALES_BY_STORE_WITH_TARGET\n", - "Set comment on TABLE GETML_FS.GETML_FEATURES\n" - ] - } - ], + "outputs": [], "source": [ - "object_descriptions = {\n", - " \"RAW.RAW_ORDERS\": (\n", - " \"TABLE\",\n", - " \"Raw order transactions from Jaffle Shop. Peripheral table for getML weekly_sales_features pipeline. Contains transactional data with ~2.3M orders spanning 2018-2024.\",\n", - " ),\n", - " \"PREPARED.WEEKLY_SALES_BY_STORE_WITH_TARGET\": (\n", - " \"VIEW\",\n", - " \"Prepared weekly sales data by store with target variable. Population table for getML weekly_sales_features pipeline. Contains store-week aggregations with NEXT_WEEK_SALES as prediction target.\",\n", - " ),\n", - " \"GETML_FS.GETML_FEATURES\": (\n", - " \"TABLE\",\n", - " f\"ML features generated by getML FastProp for weekly sales prediction. Contains {n_features} time-series features derived from 30-day rolling aggregations of order data.\",\n", - " ),\n", - "}\n", + "import yaml\n", "\n", - "for object_name, (object_type, description) in object_descriptions.items():\n", - " quote_char, escaped_desc = escape_sql_literal(description)\n", - " session.sql(\n", - " f\"COMMENT ON {object_type} {object_name} IS {quote_char}{escaped_desc}{quote_char}\"\n", - " ).collect()\n", - " print(f\"Set comment on {object_type} {object_name}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "ixfve8ghzln", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Setting column comments on VIEW PREPARED.WEEKLY_SALES_BY_STORE_WITH_TARGET...\n", - " Set 13 column comments\n", - "Setting column comments on TABLE RAW.RAW_ORDERS...\n", - " Set 7 column comments\n" - ] - } - ], - "source": [ - "object_mapping = {\n", - " \"weekly_sales_by_store\": (\"PREPARED.WEEKLY_SALES_BY_STORE_WITH_TARGET\", \"VIEW\"),\n", - " \"orders\": (\"RAW.RAW_ORDERS\", \"TABLE\"),\n", - "}\n", + "from metadata import (\n", + " create_feature_metadata_table,\n", + " enrich_feature_table,\n", + " enrich_object,\n", + " parse_annotations,\n", + " parse_features,\n", + " setup_getml_tags,\n", + ")\n", "\n", - "column_descs = column_descriptions_report.model_dump().get(\"column_descriptions\", {})\n", + "PIPELINE_NAME = \"weekly_sales_features\"\n", "\n", - "for getml_name, (snowflake_object, object_type) in object_mapping.items():\n", - " if getml_name in column_descs:\n", - " print(f\"Setting column comments on {object_type} {snowflake_object}...\")\n", - " set_column_comments(\n", - " session, snowflake_object, column_descs[getml_name], object_type\n", - " )\n", - " print(f\" Set {len(column_descs[getml_name])} column comments\")" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "x4j30okt7nn", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Created tag: GETML_ORIGINAL_NAME\n", - "Created tag: GETML_IMPORTANCE\n", - "Created tag: GETML_CORRELATION\n", - "Created tag: GETML_TARGET\n" - ] - } - ], - "source": [ - "feature_tags_sql = [\n", - " \"CREATE TAG IF NOT EXISTS GETML_FS.GETML_ORIGINAL_NAME COMMENT = 'Original getML feature name (e.g., feature_1_1)'\",\n", - " \"CREATE TAG IF NOT EXISTS GETML_FS.GETML_IMPORTANCE COMMENT = 'XGBoost feature importance score'\",\n", - " \"CREATE TAG IF NOT EXISTS GETML_FS.GETML_CORRELATION COMMENT = 'Pearson correlation with target variable'\",\n", - " \"CREATE TAG IF NOT EXISTS GETML_FS.GETML_TARGET COMMENT = 'Target variable this feature predicts'\",\n", - "]\n", + "tables = parse_annotations(yaml.safe_load(jaffle_shop_annotations.read_text()))\n", + "column_descs = column_descriptions_report.model_dump()[\"column_descriptions\"]\n", + "features = parse_features(feature_descriptions_report.model_dump())\n", + "\n", + "orders_table = session.table(\"RAW.ORDERS\")\n", + "setup_getml_tags(orders_table)\n", + "\n", + "enrich_object(\n", + " orders_table,\n", + " description=tables[\"raw_orders\"].description,\n", + " column_comments=column_descs[\"orders\"],\n", + " tags={\"GETML_PIPELINE\": PIPELINE_NAME, \"GETML_ROLE\": \"peripheral\"},\n", + ")\n", + "\n", + "enrich_object(\n", + " session.table(\"PREPARED.WEEKLY_SALES_BY_STORE_WITH_TARGET\"),\n", + " object_type=\"VIEW\",\n", + " description=tables[\"weekly_sales_by_store\"].description,\n", + " column_comments=column_descs[\"weekly_sales_by_store\"],\n", + " tags={\"GETML_PIPELINE\": PIPELINE_NAME, \"GETML_ROLE\": \"population\"},\n", + ")\n", + "\n", + "features_table = session.table(\"GETML_FS.GETML_FEATURES\")\n", + "enrich_object(\n", + " features_table,\n", + " description=f\"ML features generated by getML FastProp for weekly sales prediction. Contains {n_features} time-series features derived from 30-day rolling aggregations of order data.\",\n", + " tags={\"GETML_PIPELINE\": PIPELINE_NAME, \"GETML_ROLE\": \"features\"},\n", + ")\n", + "enrich_feature_table(\n", + " features_table,\n", + " feature_view_fqn=registered_feature_view.fully_qualified_name(),\n", + " features=features,\n", + " join_key_comments={\n", + " \"STORE_ID\": \"Store identifier. Join key linking to weekly_sales_by_store population table.\",\n", + " \"SNAPSHOT_ID\": \"Snapshot identifier. Join key for row-level entity identification.\",\n", + " },\n", + ")\n", "\n", - "for sql in feature_tags_sql:\n", - " try:\n", - " session.sql(sql).collect()\n", - " print(f\"Created tag: {sql.split('GETML_FS.')[1].split()[0]}\")\n", - " except Exception as e:\n", - " print(f\"Tag may already exist: {e}\")" + "metadata_table = create_feature_metadata_table(features_table, features)\n", + "enrich_object(\n", + " metadata_table,\n", + " description=\"getML feature metadata including SQL provenance for GETML_FEATURES table\",\n", + " tags={\"GETML_PIPELINE\": PIPELINE_NAME, \"GETML_ROLE\": \"metadata\"},\n", + ")" ] }, { "cell_type": "code", - "execution_count": 27, - "id": "rlbp1gqoi7", + "execution_count": null, + "id": "db2b9788", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Setting tags on FeatureView: JAFFLE_SHOP.GETML_FS.WEEKLY_SALES_FEATURES$5\n", - "Processing 52 features...\n", - "Set enriched comments and tags for 52 features + 2 join keys\n" - ] - } - ], + "outputs": [], "source": [ - "report = feature_descriptions_report.model_dump()\n", - "features_data = report.get(\"features\", {})\n", - "feature_descs = report.get(\"feature_descriptions\", {})\n", - "\n", - "fv_object_name = registered_feature_view.fully_qualified_name()\n", - "print(f\"Setting tags on FeatureView: {fv_object_name}\")\n", - "print(f\"Processing {len(feature_descs)} features...\")\n", - "\n", - "for feature_name, desc_info in feature_descs.items():\n", - " title = desc_info.get(\"title\", feature_name)\n", - " col_name = title.upper()\n", - " description = desc_info.get(\"description\", \"\")\n", - "\n", - " feat_data = features_data.get(feature_name, {})\n", - " importance = feat_data.get(\"importance\", 0)\n", - " correlation = feat_data.get(\"correlation\", 0)\n", - "\n", - " quote_char, escaped_desc = escape_sql_literal(description)\n", - " session.sql(\n", - " f\"COMMENT ON COLUMN GETML_FS.GETML_FEATURES.{col_name} IS {quote_char}{escaped_desc}{quote_char}\"\n", - " ).collect()\n", - "\n", - " set_column_tags(\n", - " session,\n", - " fv_object_name,\n", - " col_name,\n", - " {\n", - " \"GETML_FS.GETML_ORIGINAL_NAME\": feature_name,\n", - " \"GETML_FS.GETML_IMPORTANCE\": f\"{importance:.6f}\",\n", - " \"GETML_FS.GETML_CORRELATION\": f\"{correlation:.4f}\",\n", - " \"GETML_FS.GETML_TARGET\": feat_data.get(\"target\", \"NEXT_WEEK_SALES\"),\n", - " },\n", - " object_type=\"VIEW\",\n", - " )\n", + "from snowflake.snowpark.functions import col, concat, lit\n", "\n", - "join_key_descs = {\n", - " \"STORE_ID\": \"Store identifier. Join key linking to weekly_sales_by_store population table.\",\n", - " \"SNAPSHOT_ID\": \"Snapshot identifier. Join key for row-level entity identification.\",\n", - "}\n", - "for col, desc in join_key_descs.items():\n", - " quote_char, escaped_desc = escape_sql_literal(desc)\n", - " session.sql(\n", - " f\"COMMENT ON COLUMN GETML_FS.GETML_FEATURES.{col} IS {quote_char}{escaped_desc}{quote_char}\"\n", - " ).collect()\n", - "\n", - "print(f\"Set enriched comments and tags for {len(feature_descs)} features + 2 join keys\")" + "info_schema = session.table(\"INFORMATION_SCHEMA.TABLES\")\n", + "info_schema.filter(\n", + " col(\"TABLE_SCHEMA\").isin(\"RAW\", \"PREPARED\", \"GETML_FS\")\n", + ").select(\n", + " concat(col(\"TABLE_SCHEMA\"), lit(\".\"), col(\"TABLE_NAME\")).alias(\"OBJECT\"),\n", + " col(\"COMMENT\"),\n", + ").show()" ] }, { "cell_type": "code", - "execution_count": 28, - "id": "n6s6zs6wsl", + "execution_count": null, + "id": "3b8739ae", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Created GETML_FS.FEATURE_METADATA table\n", - "Inserted 52 feature metadata records with SQL provenance\n" - ] - } - ], + "outputs": [], "source": [ - "import json\n", - "\n", - "session.sql(\"\"\"\n", - " CREATE OR REPLACE TABLE GETML_FS.FEATURE_METADATA (\n", - " FEATURE_NAME VARCHAR PRIMARY KEY,\n", - " ORIGINAL_NAME VARCHAR,\n", - " IMPORTANCE FLOAT,\n", - " CORRELATION FLOAT,\n", - " TARGET VARCHAR,\n", - " DESCRIPTION TEXT,\n", - " DESCRIPTION_CONFIDENCE VARCHAR,\n", - " SQL_CODE TEXT,\n", - " FULL_METADATA VARIANT,\n", - " CREATED_AT TIMESTAMP_NTZ DEFAULT CURRENT_TIMESTAMP()\n", - " ) COMMENT = 'getML feature metadata including SQL provenance for GETML_FEATURES table'\n", - "\"\"\").collect()\n", - "print(\"Created GETML_FS.FEATURE_METADATA table\")\n", - "\n", - "metadata_rows = []\n", - "for feature_name in features_data.keys():\n", - " feat = features_data.get(feature_name, {})\n", - " desc = feature_descs.get(feature_name, {})\n", - " title = desc.get(\"title\", feature_name)\n", - " full_metadata = {**feat, **desc}\n", - "\n", - " metadata_rows.append(\n", - " {\n", - " \"FEATURE_NAME\": title.upper(),\n", - " \"ORIGINAL_NAME\": feature_name,\n", - " \"IMPORTANCE\": feat.get(\"importance\", 0),\n", - " \"CORRELATION\": feat.get(\"correlation\", 0),\n", - " \"TARGET\": feat.get(\"target\", \"\"),\n", - " \"DESCRIPTION\": desc.get(\"description\", \"\"),\n", - " \"DESCRIPTION_CONFIDENCE\": desc.get(\"description_confidence\", \"\"),\n", - " \"SQL_CODE\": feat.get(\"sql\", \"\"),\n", - " \"FULL_METADATA\": json.dumps(full_metadata),\n", - " }\n", - " )\n", - "\n", - "metadata_df = pd.DataFrame(metadata_rows)\n", - "session.sql(\"TRUNCATE TABLE GETML_FS.FEATURE_METADATA\").collect()\n", - "session.write_pandas(\n", - " df=metadata_df, table_name=\"FEATURE_METADATA\", schema=\"GETML_FS\", overwrite=False\n", - ")\n", - "print(f\"Inserted {len(metadata_rows)} feature metadata records with SQL provenance\")" + "session.table(\"GETML_FS.GETML_FEATURES\").describe().show(3)" ] }, { "cell_type": "code", - "execution_count": 29, - "id": "ftiie1evn7k", + "execution_count": null, + "id": "b6f48308", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Created tag: GETML_PIPELINE\n", - "Created tag: GETML_ROLE\n", - "Set GETML_PIPELINE='weekly_sales_features' on RAW.RAW_ORDERS\n", - "Set GETML_ROLE='peripheral' on RAW.RAW_ORDERS\n", - "Set GETML_PIPELINE='weekly_sales_features' on PREPARED.WEEKLY_SALES_BY_STORE_WITH_TARGET\n", - "Set GETML_ROLE='population' on PREPARED.WEEKLY_SALES_BY_STORE_WITH_TARGET\n", - "Set GETML_PIPELINE='weekly_sales_features' on GETML_FS.GETML_FEATURES\n", - "Set GETML_ROLE='features' on GETML_FS.GETML_FEATURES\n", - "Set GETML_PIPELINE='weekly_sales_features' on GETML_FS.FEATURE_METADATA\n", - "Set GETML_ROLE='metadata' on GETML_FS.FEATURE_METADATA\n" - ] - } - ], + "outputs": [], "source": [ - "table_tags_sql = [\n", - " \"CREATE TAG IF NOT EXISTS GETML_FS.GETML_PIPELINE COMMENT = 'Name of getML pipeline using this data'\",\n", - " \"CREATE TAG IF NOT EXISTS GETML_FS.GETML_ROLE ALLOWED_VALUES 'population', 'peripheral', 'features', 'metadata' COMMENT = 'Role of table in getML data model'\",\n", - "]\n", - "\n", - "for sql in table_tags_sql:\n", - " try:\n", - " session.sql(sql).collect()\n", - " print(f\"Created tag: {sql.split('GETML_FS.')[1].split()[0]}\")\n", - " except Exception as e:\n", - " print(f\"Tag may already exist: {e}\")\n", - "\n", - "tag_assignments = [\n", - " (\"TABLE\", \"RAW.RAW_ORDERS\", \"GETML_FS.GETML_PIPELINE\", \"weekly_sales_features\"),\n", - " (\"TABLE\", \"RAW.RAW_ORDERS\", \"GETML_FS.GETML_ROLE\", \"peripheral\"),\n", - " (\n", - " \"VIEW\",\n", - " \"PREPARED.WEEKLY_SALES_BY_STORE_WITH_TARGET\",\n", - " \"GETML_FS.GETML_PIPELINE\",\n", - " \"weekly_sales_features\",\n", - " ),\n", - " (\n", - " \"VIEW\",\n", - " \"PREPARED.WEEKLY_SALES_BY_STORE_WITH_TARGET\",\n", - " \"GETML_FS.GETML_ROLE\",\n", - " \"population\",\n", - " ),\n", - " (\n", - " \"TABLE\",\n", - " \"GETML_FS.GETML_FEATURES\",\n", - " \"GETML_FS.GETML_PIPELINE\",\n", - " \"weekly_sales_features\",\n", - " ),\n", - " (\"TABLE\", \"GETML_FS.GETML_FEATURES\", \"GETML_FS.GETML_ROLE\", \"features\"),\n", - " (\n", - " \"TABLE\",\n", - " \"GETML_FS.FEATURE_METADATA\",\n", - " \"GETML_FS.GETML_PIPELINE\",\n", - " \"weekly_sales_features\",\n", - " ),\n", - " (\"TABLE\", \"GETML_FS.FEATURE_METADATA\", \"GETML_FS.GETML_ROLE\", \"metadata\"),\n", - "]\n", - "\n", - "for object_type, object_name, tag, value in tag_assignments:\n", - " try:\n", - " session.sql(\n", - " f\"ALTER {object_type} {object_name} SET TAG {tag} = '{value}'\"\n", - " ).collect()\n", - " print(f\"Set {tag.split('.')[-1]}='{value}' on {object_name}\")\n", - " except Exception as e:\n", - " print(f\"Warning: Could not set tag on {object_name}: {e}\")" + "feature_metadata = session.table(\"GETML_FS.FEATURE_METADATA\")\n", + "feature_metadata.select(\"FEATURE_NAME\", \"ORIGINAL_NAME\", \"IMPORTANCE\", \"CORRELATION\").sort(\n", + " col(\"IMPORTANCE\").desc()\n", + ").limit(5).show()" ] }, { "cell_type": "code", - "execution_count": 30, - "id": "x42xbordipp", + "execution_count": null, + "id": "6affab13", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "=== Table/View Comments ===\n", - "RAW.RAW_ORDERS: Raw order transactions from Jaffle Shop. Peripheral table for getML weekly_sales...\n", - "PREPARED.WEEKLY_SALES_BY_STORE_WITH_TARGET: Prepared weekly sales data by store with target variable. Population table for g...\n", - "GETML_FS.GETML_FEATURES: ML features generated by getML FastProp for weekly sales prediction. Contains 52...\n", - "\n", - "=== Sample Feature Column Comments ===\n", - " AVG_SUBTOTAL_30D: Average pre-tax order amount aggregated across all transactions for the store within the 30-day look...\n", - " DISTINCT_SUBTOTAL_COUNT_30D: Count of distinct pre-tax order amounts observed in the 30-day lookback for the store-week. Implemen...\n", - " REPEAT_SUBTOTAL_COUNT_30D: Number of repeated pre-tax order amounts within the 30-day window, computed as total COUNT(SUBTOTAL)...\n", - "\n", - "=== Sample Feature Tags (on FeatureView) ===\n", - " FeatureView object: JAFFLE_SHOP.GETML_FS.WEEKLY_SALES_FEATURES$5\n", - " Could not query tags: (1304): 01c1357a-0002-6314-0002-8daa000c0696: 391806 (0A000): SQL compilation error: Invalid value VIEW for argument OBJECT_TYPE. Please use object type TABLE for all kinds of table-like objects.\n", - "\n", - "=== Feature Metadata Table (Top 5 by Importance) ===\n", - "---------------------------------------------------------------------------------------\n", - "|\"FEATURE_NAME\" |\"ORIGINAL_NAME\" |\"IMPORTANCE\" |\"CORRELATION\" |\n", - "---------------------------------------------------------------------------------------\n", - "|NEXT_WEEK_ORDERS |next_week_orders |0.9647357347095845 |0.9885752362918938 |\n", - "|SUM_SUBTOTAL_30D |feature_1_11 |0.010998898444670953 |0.9738315473173991 |\n", - "|ORDER_TOTAL_SUM |feature_1_23 |0.01065385189390608 |0.9753017397987589 |\n", - "|TAX_PAID_SUM |feature_1_35 |0.0074074764861468256 |0.5354993211888577 |\n", - "|AVG_SUBTOTAL_30D |feature_1_1 |0.001589096137303619 |-0.007932532921688166 |\n", - "---------------------------------------------------------------------------------------\n", - "\n", - "\n", - "=== Sample SQL Code from Metadata ===\n", - "Feature: NEXT_WEEK_ORDERS (Original: next_week_orders)\n", - "SQL:\n", - "...\n" - ] - } - ], + "outputs": [], "source": [ - "print(\"=== Table/View Comments ===\")\n", - "for schema, table_name in [\n", - " (\"RAW\", \"RAW_ORDERS\"),\n", - " (\"PREPARED\", \"WEEKLY_SALES_BY_STORE_WITH_TARGET\"),\n", - " (\"GETML_FS\", \"GETML_FEATURES\"),\n", - "]:\n", - " result = session.sql(\n", - " f\"SELECT COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{schema}' AND TABLE_NAME = '{table_name}'\"\n", - " ).collect()\n", - " comment = result[0][0][:80] if result and result[0][0] else \"No comment\"\n", - " print(f\"{schema}.{table_name}: {comment}...\")\n", - "\n", - "print(\"\\n=== Sample Feature Column Comments ===\")\n", - "result = session.sql(\"DESCRIBE TABLE GETML_FS.GETML_FEATURES\").collect()\n", - "for row in result[:3]:\n", - " comment = row[\"comment\"] if row[\"comment\"] else \"No comment\"\n", - " print(f\" {row['name']}: {comment[:100]}...\")\n", - "\n", - "print(\"\\n=== Sample Feature Tags (on FeatureView) ===\")\n", - "try:\n", - " fv_name = registered_feature_view.fully_qualified_name()\n", - " print(f\" FeatureView object: {fv_name}\")\n", - " result = session.sql(f\"\"\"\n", - " SELECT * FROM TABLE(INFORMATION_SCHEMA.TAG_REFERENCES_ALL_COLUMNS('{fv_name}', 'VIEW'))\n", - " LIMIT 8\n", - " \"\"\").collect()\n", - " for row in result:\n", - " print(\n", - " f\" {row['COLUMN_NAME']}.{row['TAG_NAME'].split('.')[-1]}: {row['TAG_VALUE']}\"\n", - " )\n", - "except Exception as e:\n", - " print(f\" Could not query tags: {e}\")\n", - "\n", - "print(\"\\n=== Feature Metadata Table (Top 5 by Importance) ===\")\n", - "session.sql(\n", - " \"SELECT FEATURE_NAME, ORIGINAL_NAME, IMPORTANCE, CORRELATION FROM GETML_FS.FEATURE_METADATA ORDER BY IMPORTANCE DESC LIMIT 5\"\n", - ").show()\n", - "\n", - "print(\"\\n=== Sample SQL Code from Metadata ===\")\n", - "result = session.sql(\n", - " \"SELECT FEATURE_NAME, ORIGINAL_NAME, SQL_CODE FROM GETML_FS.FEATURE_METADATA WHERE IMPORTANCE > 0 ORDER BY IMPORTANCE DESC LIMIT 1\"\n", - ").collect()\n", - "if result:\n", - " print(\n", - " f\"Feature: {result[0]['FEATURE_NAME']} (Original: {result[0]['ORIGINAL_NAME']})\"\n", - " )\n", - " print(f\"SQL:\\n{result[0]['SQL_CODE'][:500]}...\")" + "feature_metadata.filter(col(\"IMPORTANCE\") > 0).select(\"FEATURE_NAME\", \"SQL_CODE\").sort(\n", + " col(\"IMPORTANCE\").desc()\n", + ").limit(1).show()" ] }, { "cell_type": "markdown", - "id": "vimmq4jwmns", + "id": "3bc2247b", "metadata": {}, "source": [ "## Summary\n", @@ -4834,18 +673,6 @@ "display_name": "snowflake-feature-store-notebooks", "language": "python", "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.12" } }, "nbformat": 4, diff --git a/integration/snowflake/notebooks/snowflake_feature_store.py b/integration/snowflake/notebooks/snowflake_feature_store.py new file mode 100644 index 0000000..9fe263c --- /dev/null +++ b/integration/snowflake/notebooks/snowflake_feature_store.py @@ -0,0 +1,448 @@ +# --- +# jupyter: +# jupytext: +# text_representation: +# extension: .py +# format_name: percent +# format_version: '1.3' +# jupytext_version: 1.16.7 +# kernelspec: +# display_name: snowflake-feature-store-notebooks +# language: python +# name: python3 +# --- + +# %% [markdown] +# # Build Snowflake Feature Store with getML + +# %% [markdown] +# This notebook demonstrates how to build a Snowflake Feature Store using getML's automated feature engineering. We'll load data from Snowflake, generate time-series features with FastProp, and register them as a versioned FeatureView with full metadata enrichment. +# +# **Prerequisites:** Run `mise env --dotenv > notebooks/.env` to generate environment configuration. + +# %% +import os + +import getml +from snowflake.snowpark import Session + +PROJECT_NAME = "snowflake_feature_store" + +SNOWFLAKE_ACCOUNT = os.getenv("SNOWFLAKE_ACCOUNT") +SNOWFLAKE_USER = os.getenv("SNOWFLAKE_USER") +SNOWFLAKE_PASSWORD = os.getenv("SNOWFLAKE_PASSWORD") +SNOWFLAKE_ROLE = os.getenv("SNOWFLAKE_ROLE") +SNOWFLAKE_WAREHOUSE = os.getenv("SNOWFLAKE_WAREHOUSE") +SNOWFLAKE_DATABASE = os.getenv("SNOWFLAKE_DATABASE") +SNOWFLAKE_SCHEMA = os.getenv("SNOWFLAKE_SCHEMA") + +# %% + +getml.set_project(PROJECT_NAME) + +# %% [markdown] +# ## Setup and Data Loading +# +# Connect to Snowflake and load the population table (weekly sales by store) and peripheral table (orders) into getML using Arrow for efficient data transfer. + +# %% + + +connection_params = { + "account": SNOWFLAKE_ACCOUNT, + "user": SNOWFLAKE_USER, + "password": SNOWFLAKE_PASSWORD, + "role": SNOWFLAKE_ROLE, + "warehouse": SNOWFLAKE_WAREHOUSE, + "database": SNOWFLAKE_DATABASE, + "schema": SNOWFLAKE_SCHEMA, +} + +session = Session.builder.configs(connection_params).create() + +# %% +weekly_sales_by_store = getml.DataFrame.from_arrow( + session.table("PREPARED.WEEKLY_SALES_BY_STORE_WITH_TARGET").to_arrow(), + name="weekly_sales_by_store", +) + +orders = getml.DataFrame.from_arrow( + session.table("RAW.ORDERS").to_arrow(), + name="orders", +) + +# %% [markdown] +# ## Annotations +# +# Define semantic roles for each column. Roles tell getML how to use columns: +# `join_key` for entity relationships, `time_stamp` for temporal ordering, +# `target` for prediction, and `numerical`/`categorical` for feature types. + +# %% +weekly_sales_by_store.set_role( + cols=["STORE_ID", "SNAPSHOT_ID"], role=getml.data.roles.join_key +) +weekly_sales_by_store.set_role(cols="REFERENCE_DATE", role=getml.data.roles.time_stamp) +weekly_sales_by_store.set_role(cols="NEXT_WEEK_SALES", role=getml.data.roles.target) +weekly_sales_by_store.set_role( + cols=[ + "STORE_NAME", + "YEAR", + "MONTH", + "WEEK_NUMBER", + "IS_FULL_WEEK_AFTER_OPENING", + "HAS_ORDER_ACTIVITY", + "HAS_MIN_HISTORY", + ], + role=getml.data.roles.categorical, +) +weekly_sales_by_store.set_role( + cols=["DAYS_SINCE_OPEN", "NEXT_WEEK_ORDERS"], role=getml.data.roles.numerical +) + + +# %% +orders.set_role(cols=["STORE_ID", "ID", "CUSTOMER"], role=getml.data.roles.join_key) +orders.set_role( + cols="ORDERED_AT", + role=getml.data.roles.time_stamp, + time_formats=["%Y-%m-%dT%H:%M:%S"], +) +orders.set_role( + cols=["SUBTOTAL", "ORDER_TOTAL", "TAX_PAID"], role=getml.data.roles.numerical +) + +# %% +weekly_sales_by_store + +# %% +orders + +# %% [markdown] +# ## Data Model +# +# Define a star schema with `weekly_sales_by_store` as the population table and `orders` as a peripheral table joined on `STORE_ID`. The join uses a 30-day memory window to aggregate historical order data up to each reference date. + +# %% +validation_begin = getml.data.time.datetime(2023, 1, 1) +test_begin = getml.data.time.datetime(2024, 1, 1) + +split = getml.data.split.time( + population=weekly_sales_by_store, + time_stamp="REFERENCE_DATE", + validation=validation_begin, + test=test_begin, +) + +weekly_sales_by_store_train = weekly_sales_by_store[split == "train"] +weekly_sales_by_store_validation = weekly_sales_by_store[split == "validation"] +weekly_sales_by_store_test = weekly_sales_by_store[split == "test"] + +print( + f"Training set size: {len(weekly_sales_by_store_train)}" + f"\nValidation set size: {len(weekly_sales_by_store_validation)}" + f"\nTest set size: {len(weekly_sales_by_store_test)}" +) + +# %% +weekly_sales_by_store_validation + +# %% +data_model = getml.data.DataModel( + population=weekly_sales_by_store_train.to_placeholder() +) + +data_model.add(getml.data.to_placeholder(orders=orders)) + +data_model.weekly_sales_by_store.join( + right=data_model.orders, + on="STORE_ID", + time_stamps=("REFERENCE_DATE", "ORDERED_AT"), + relationship=getml.data.relationship.one_to_many, + memory=getml.data.time.days(30), +) + +# %% +container = getml.data.Container( + train=weekly_sales_by_store_train, + validation=weekly_sales_by_store_validation, + test=weekly_sales_by_store_test, +) + +container.add(orders=orders) +container.save() + +getml.project.data_frames.save() + +# %% [markdown] +# ## Training +# +# Train a pipeline using Multirel for automated feature learning and XGBoost for prediction. Multirel generates time-series aggregations from the relational data model. + +# %% +fast_prop = getml.feature_learning.Multirel() + +xgboost = getml.predictors.XGBoostRegressor() + +pipe = getml.Pipeline( + data_model=data_model, + feature_learners=fast_prop, + predictors=xgboost, +) + +pipe.fit(container.train) + +# %% +predictions = pipe.predict(container.test) +n_features = len(pipe.features) +pipe.score(container.test) + +# %% [markdown] +# ## Feature Export +# +# Export the generated features to Snowflake and register them as a FeatureView. This section also generates human-readable feature descriptions using an LLM to make features discoverable in Snowflake's Universal Search. + +# %% +from pathlib import Path + +from getml_interpretations import generate_column_descriptions_report + +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()}. +""" + +column_descriptions_report = await generate_column_descriptions_report( + project_name=PROJECT_NAME, + pipeline=pipe, + container=container, + model="gpt-5-mini", + user_prompt=user_prompt, +) + +# %% +from getml_interpretations import ( + FeatureDescriptionsReport, + generate_feature_descriptions_report, +) + +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. +""" + +feature_descriptions_report = await generate_feature_descriptions_report( + project_name=PROJECT_NAME, + pipeline=pipe, + container=container, + column_descriptions_report=column_descriptions_report, + user_prompt=user_prompt, + model="gpt-5-mini", + batch_size=20, +) + +feature_descriptions_report = FeatureDescriptionsReport.model_validate_json( + Path("feature_descriptions_report.json").read_text() +) + + +# %% +FEATURE_STORE_NAME = "SNOWFLAKE_FEATURE_STORE" +FEATURE_STORE_VERSION = "5" + +# %% +features = pipe.transform( + population_table=weekly_sales_by_store, + peripheral_tables=[orders], + df_name="weekly_sales_features_full", +) + +name_to_title = { + feat.name: feat.title + for feat in feature_descriptions_report.feature_descriptions.values() +} +features_pd = features.to_pandas().rename(columns=name_to_title) + +session.write_pandas( + df=features_pd, + table_name="GETML_FEATURES", + schema="GETML_FS", + auto_create_table=True, + overwrite=True, +) + +# %% +from snowflake.ml.feature_store import CreationMode, Entity, FeatureStore, FeatureView + +features_snowpark_df = session.table("GETML_FS.GETML_FEATURES") + +snowflake_feature_store = FeatureStore( + session=session, + database=SNOWFLAKE_DATABASE, + name="GETML_FS", + default_warehouse=SNOWFLAKE_WAREHOUSE, + creation_mode=CreationMode.CREATE_IF_NOT_EXIST, +) + +store_entity = Entity(name="STORE_SNAPSHOT", join_keys=["STORE_ID", "SNAPSHOT_ID"]) +snowflake_feature_store.register_entity(store_entity) + + +# %% +from snowflake.snowpark import Session + + +def set_column_comments( + session: Session, + table_fqn: str, + comments: dict[str, str], +) -> None: + clauses = [] + params = [table_fqn] + for col, comment in comments.items(): + clauses.append(f"COLUMN {col} COMMENT ?") + params.append(comment) + + body = ", ".join(clauses) + + session.sql( + f"ALTER TABLE IDENTIFIER(?) MODIFY {body}", + params=params, + ).collect() + + +def set_column_tags( + session: Session, + object_type: str, # "TABLE" or "VIEW" + object_name: str, + column_name: str, + tags: dict[str, str], +) -> None: + for tag_name, tag_value in tags.items(): + session.sql( + f"ALTER {object_type} IDENTIFIER(?)" + f"MODIFY COLUMN {column_name}" + f"SET TAG {tag_name} = ?", + params=[object_name, tag_value], + ).collect() + + +# %% +# refresh_freq=None means features are externally managed +weekly_sales_feature_view = FeatureView( + name="weekly_sales_features", + entities=[store_entity], + feature_df=features_snowpark_df, + refresh_freq=None, + desc="Features generated by getML for weekly sales prediction", +).attach_feature_desc( + { + feat.title: feat.description + for feat in feature_descriptions_report.feature_descriptions.values() + } +) + +registered_feature_view = snowflake_feature_store.register_feature_view( + feature_view=weekly_sales_feature_view, + version=FEATURE_STORE_VERSION, + overwrite=True, +) + +# %% [markdown] +# ### Metadata Enrichment +# +# We enrich Snowflake objects with comments, semantic tags, and feature provenance metadata for governance and discoverability. The implementation details are in `metadata_enrichment.py`. + +# %% +import yaml +from metadata import ( + create_feature_metadata_table, + enrich_feature_table, + enrich_object, + parse_annotations, + parse_features, + setup_getml_tags, +) + +PIPELINE_NAME = "weekly_sales_features" + +tables = parse_annotations(yaml.safe_load(jaffle_shop_annotations.read_text())) +column_descs = column_descriptions_report.model_dump()["column_descriptions"] +features = parse_features(feature_descriptions_report.model_dump()) + +orders_table = session.table("RAW.ORDERS") +setup_getml_tags(orders_table) + +enrich_object( + orders_table, + description=tables["raw_orders"].description, + column_comments=column_descs["orders"], + tags={"GETML_PIPELINE": PIPELINE_NAME, "GETML_ROLE": "peripheral"}, +) + +enrich_object( + session.table("PREPARED.WEEKLY_SALES_BY_STORE_WITH_TARGET"), + object_type="VIEW", + description=tables["weekly_sales_by_store"].description, + column_comments=column_descs["weekly_sales_by_store"], + tags={"GETML_PIPELINE": PIPELINE_NAME, "GETML_ROLE": "population"}, +) + +features_table = session.table("GETML_FS.GETML_FEATURES") +enrich_object( + features_table, + description=f"ML features generated by getML Multirel for weekly sales prediction. Contains {n_features} time-series features derived from 30-day rolling aggregations of order data.", + tags={"GETML_PIPELINE": PIPELINE_NAME, "GETML_ROLE": "features"}, +) +enrich_feature_table( + features_table, + feature_view_fqn=registered_feature_view.fully_qualified_name(), + features=features, + join_key_comments={ + "STORE_ID": "Store identifier. Join key linking to weekly_sales_by_store population table.", + "SNAPSHOT_ID": "Snapshot identifier. Join key for row-level entity identification.", + }, +) + +metadata_table = create_feature_metadata_table(features_table, features) +enrich_object( + metadata_table, + description="getML feature metadata including SQL provenance for GETML_FEATURES table", + tags={"GETML_PIPELINE": PIPELINE_NAME, "GETML_ROLE": "metadata"}, +) + +# %% +from snowflake.snowpark.functions import col, concat, lit + +info_schema = session.table("INFORMATION_SCHEMA.TABLES") +info_schema.filter(col("TABLE_SCHEMA").isin("RAW", "PREPARED", "GETML_FS")).select( + concat(col("TABLE_SCHEMA"), lit("."), col("TABLE_NAME")).alias("OBJECT"), + col("COMMENT"), +).show() + +# %% +session.table("GETML_FS.GETML_FEATURES").describe().show(3) + +# %% +feature_metadata = session.table("GETML_FS.FEATURE_METADATA") +feature_metadata.select( + "FEATURE_NAME", "ORIGINAL_NAME", "IMPORTANCE", "CORRELATION" +).sort(col("IMPORTANCE").desc()).limit(5).show() + +# %% +feature_metadata.filter(col("IMPORTANCE") > 0).select("FEATURE_NAME", "SQL_CODE").sort( + col("IMPORTANCE").desc() +).limit(1).show() + +# %% [markdown] +# ## Summary +# +# This notebook created a complete feature engineering pipeline: +# - **52 features** generated from order history using Multirel +# - **FeatureView** registered in Snowflake Feature Store with versioning +# - **Metadata** enriched with descriptions, importance scores, and SQL provenance diff --git a/integration/snowflake/notebooks/test_snowflake.py b/integration/snowflake/notebooks/test_snowflake.py new file mode 100644 index 0000000..89a330e --- /dev/null +++ b/integration/snowflake/notebooks/test_snowflake.py @@ -0,0 +1,14 @@ +import os + +from snowflake.snowpark import Session + +connection_params: dict[str, str | int] = { + "account": os.environ["SNOWFLAKE_ACCOUNT"], + "user": os.environ["SNOWFLAKE_USER"], + "password": os.environ["SNOWFLAKE_PASSWORD"], + "warehouse": os.environ["SNOWFLAKE_WAREHOUSE"], + "database": os.environ["SNOWFLAKE_DATABASE"], + "schema": os.environ["SNOWFLAKE_SCHEMA"], +} + +session = Session.builder.configs(connection_params).create() diff --git a/integration/snowflake/pyproject.toml b/integration/snowflake/pyproject.toml index 1a1082e..6d74c9c 100644 --- a/integration/snowflake/pyproject.toml +++ b/integration/snowflake/pyproject.toml @@ -29,12 +29,13 @@ requires-python = ">=3.12" dependencies = [ "fastparquet>=2024.11.0", "getml>=1.5.1", + "getml-interpretations", "httpx~=0.27", "ipykernel~=7.1", "pandas~=2.2", - "pyarrow~=18.0", - "pydantic~=2.12", - "pydantic-settings~=2.12", + "pyarrow~=19.0", + "pydantic~=2.11", + "pydantic-settings~=2.11", "snowflake-connector-python~=3.17", "snowflake-snowpark-python~=1.42", ] @@ -51,6 +52,9 @@ dev = [ [tool.uv] package = false +[tool.uv.sources] +getml-interpretations = { git = "https://github.com/getml/getml-interpretations.git", rev = "be0b3d7b995a220290599b466d4292dd74c8e126" } + [tool.pytest.ini_options] pythonpath = ["."] testpaths = ["tests"] diff --git a/integration/snowflake/tests/integration/test_pipeline.py b/integration/snowflake/tests/integration/test_pipeline.py index 96ded8a..06e1305 100644 --- a/integration/snowflake/tests/integration/test_pipeline.py +++ b/integration/snowflake/tests/integration/test_pipeline.py @@ -56,7 +56,7 @@ def test_tables_have_expected_columns( SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'RAW' - AND TABLE_NAME = 'RAW_ORDERS' + AND TABLE_NAME = 'ORDERS' ORDER BY ORDINAL_POSITION """).collect() diff --git a/integration/snowflake/uv.lock b/integration/snowflake/uv.lock index e19755d..80d47a5 100644 --- a/integration/snowflake/uv.lock +++ b/integration/snowflake/uv.lock @@ -1,6 +1,11 @@ version = 1 revision = 3 requires-python = ">=3.12" +resolution-markers = [ + "python_full_version >= '3.14' and platform_python_implementation != 'PyPy'", + "python_full_version < '3.14' and platform_python_implementation != 'PyPy'", + "platform_python_implementation == 'PyPy'", +] [[package]] name = "annotated-types" @@ -102,59 +107,35 @@ wheels = [ [[package]] name = "cffi" -version = "2.0.0" +version = "1.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pycparser", marker = "implementation_name != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, - { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, - { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, - { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, - { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, - { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, - { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, - { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, - { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, - { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, - { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, - { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, - { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, - { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, - { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, - { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, - { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, - { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, - { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, - { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, - { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, - { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, - { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, - { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, - { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, - { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, - { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, - { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, - { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, - { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, - { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, - { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, - { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, - { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, - { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, - { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, - { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, - { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, - { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, - { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, - { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, - { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, - { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, - { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, - { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload-time = "2024-09-04T20:45:21.852Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178, upload-time = "2024-09-04T20:44:12.232Z" }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840, upload-time = "2024-09-04T20:44:13.739Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803, upload-time = "2024-09-04T20:44:15.231Z" }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850, upload-time = "2024-09-04T20:44:17.188Z" }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729, upload-time = "2024-09-04T20:44:18.688Z" }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256, upload-time = "2024-09-04T20:44:20.248Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424, upload-time = "2024-09-04T20:44:21.673Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568, upload-time = "2024-09-04T20:44:23.245Z" }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736, upload-time = "2024-09-04T20:44:24.757Z" }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448, upload-time = "2024-09-04T20:44:26.208Z" }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976, upload-time = "2024-09-04T20:44:27.578Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload-time = "2024-09-04T20:44:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload-time = "2024-09-04T20:44:30.289Z" }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload-time = "2024-09-04T20:44:32.01Z" }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload-time = "2024-09-04T20:44:33.606Z" }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload-time = "2024-09-04T20:44:35.191Z" }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload-time = "2024-09-04T20:44:36.743Z" }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload-time = "2024-09-04T20:44:38.492Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload-time = "2024-09-04T20:44:40.046Z" }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload-time = "2024-09-04T20:44:41.616Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload-time = "2024-09-04T20:44:43.733Z" }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload-time = "2024-09-04T20:44:45.309Z" }, ] [[package]] @@ -214,6 +195,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.1" @@ -385,58 +378,100 @@ wheels = [ [[package]] name = "cryptography" -version = "46.0.3" +version = "45.0.7" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and platform_python_implementation != 'PyPy'", +] dependencies = [ - { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload-time = "2025-10-15T23:16:52.239Z" }, - { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" }, - { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" }, - { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" }, - { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" }, - { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" }, - { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" }, - { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" }, - { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" }, - { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" }, - { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" }, - { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" }, - { url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload-time = "2025-10-15T23:17:14.65Z" }, - { url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload-time = "2025-10-15T23:17:16.142Z" }, - { url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload-time = "2025-10-15T23:17:18.04Z" }, - { url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload-time = "2025-10-15T23:17:19.982Z" }, - { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" }, - { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" }, - { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" }, - { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" }, - { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" }, - { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" }, - { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" }, - { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" }, - { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" }, - { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" }, - { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" }, - { url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload-time = "2025-10-15T23:17:40.888Z" }, - { url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload-time = "2025-10-15T23:17:42.769Z" }, - { url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload-time = "2025-10-15T23:17:44.468Z" }, - { url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload-time = "2025-10-15T23:17:46.294Z" }, - { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" }, - { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" }, - { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" }, - { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" }, - { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" }, - { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" }, - { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" }, - { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" }, - { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" }, - { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" }, - { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" }, - { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" }, - { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" }, + { name = "cffi", marker = "python_full_version >= '3.14' and platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/35/c495bffc2056f2dadb32434f1feedd79abde2a7f8363e1974afa9c33c7e2/cryptography-45.0.7.tar.gz", hash = "sha256:4b1654dfc64ea479c242508eb8c724044f1e964a47d1d1cacc5132292d851971", size = 744980, upload-time = "2025-09-01T11:15:03.146Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/91/925c0ac74362172ae4516000fe877912e33b5983df735ff290c653de4913/cryptography-45.0.7-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:3be4f21c6245930688bd9e162829480de027f8bf962ede33d4f8ba7d67a00cee", size = 7041105, upload-time = "2025-09-01T11:13:59.684Z" }, + { url = "https://files.pythonhosted.org/packages/fc/63/43641c5acce3a6105cf8bd5baeceeb1846bb63067d26dae3e5db59f1513a/cryptography-45.0.7-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:67285f8a611b0ebc0857ced2081e30302909f571a46bfa7a3cc0ad303fe015c6", size = 4205799, upload-time = "2025-09-01T11:14:02.517Z" }, + { url = "https://files.pythonhosted.org/packages/bc/29/c238dd9107f10bfde09a4d1c52fd38828b1aa353ced11f358b5dd2507d24/cryptography-45.0.7-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:577470e39e60a6cd7780793202e63536026d9b8641de011ed9d8174da9ca5339", size = 4430504, upload-time = "2025-09-01T11:14:04.522Z" }, + { url = "https://files.pythonhosted.org/packages/62/62/24203e7cbcc9bd7c94739428cd30680b18ae6b18377ae66075c8e4771b1b/cryptography-45.0.7-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4bd3e5c4b9682bc112d634f2c6ccc6736ed3635fc3319ac2bb11d768cc5a00d8", size = 4209542, upload-time = "2025-09-01T11:14:06.309Z" }, + { url = "https://files.pythonhosted.org/packages/cd/e3/e7de4771a08620eef2389b86cd87a2c50326827dea5528feb70595439ce4/cryptography-45.0.7-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:465ccac9d70115cd4de7186e60cfe989de73f7bb23e8a7aa45af18f7412e75bf", size = 3889244, upload-time = "2025-09-01T11:14:08.152Z" }, + { url = "https://files.pythonhosted.org/packages/96/b8/bca71059e79a0bb2f8e4ec61d9c205fbe97876318566cde3b5092529faa9/cryptography-45.0.7-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:16ede8a4f7929b4b7ff3642eba2bf79aa1d71f24ab6ee443935c0d269b6bc513", size = 4461975, upload-time = "2025-09-01T11:14:09.755Z" }, + { url = "https://files.pythonhosted.org/packages/58/67/3f5b26937fe1218c40e95ef4ff8d23c8dc05aa950d54200cc7ea5fb58d28/cryptography-45.0.7-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:8978132287a9d3ad6b54fcd1e08548033cc09dc6aacacb6c004c73c3eb5d3ac3", size = 4209082, upload-time = "2025-09-01T11:14:11.229Z" }, + { url = "https://files.pythonhosted.org/packages/0e/e4/b3e68a4ac363406a56cf7b741eeb80d05284d8c60ee1a55cdc7587e2a553/cryptography-45.0.7-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:b6a0e535baec27b528cb07a119f321ac024592388c5681a5ced167ae98e9fff3", size = 4460397, upload-time = "2025-09-01T11:14:12.924Z" }, + { url = "https://files.pythonhosted.org/packages/22/49/2c93f3cd4e3efc8cb22b02678c1fad691cff9dd71bb889e030d100acbfe0/cryptography-45.0.7-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:a24ee598d10befaec178efdff6054bc4d7e883f615bfbcd08126a0f4931c83a6", size = 4337244, upload-time = "2025-09-01T11:14:14.431Z" }, + { url = "https://files.pythonhosted.org/packages/04/19/030f400de0bccccc09aa262706d90f2ec23d56bc4eb4f4e8268d0ddf3fb8/cryptography-45.0.7-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:fa26fa54c0a9384c27fcdc905a2fb7d60ac6e47d14bc2692145f2b3b1e2cfdbd", size = 4568862, upload-time = "2025-09-01T11:14:16.185Z" }, + { url = "https://files.pythonhosted.org/packages/29/56/3034a3a353efa65116fa20eb3c990a8c9f0d3db4085429040a7eef9ada5f/cryptography-45.0.7-cp311-abi3-win32.whl", hash = "sha256:bef32a5e327bd8e5af915d3416ffefdbe65ed975b646b3805be81b23580b57b8", size = 2936578, upload-time = "2025-09-01T11:14:17.638Z" }, + { url = "https://files.pythonhosted.org/packages/b3/61/0ab90f421c6194705a99d0fa9f6ee2045d916e4455fdbb095a9c2c9a520f/cryptography-45.0.7-cp311-abi3-win_amd64.whl", hash = "sha256:3808e6b2e5f0b46d981c24d79648e5c25c35e59902ea4391a0dcb3e667bf7443", size = 3405400, upload-time = "2025-09-01T11:14:18.958Z" }, + { url = "https://files.pythonhosted.org/packages/63/e8/c436233ddf19c5f15b25ace33979a9dd2e7aa1a59209a0ee8554179f1cc0/cryptography-45.0.7-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bfb4c801f65dd61cedfc61a83732327fafbac55a47282e6f26f073ca7a41c3b2", size = 7021824, upload-time = "2025-09-01T11:14:20.954Z" }, + { url = "https://files.pythonhosted.org/packages/bc/4c/8f57f2500d0ccd2675c5d0cc462095adf3faa8c52294ba085c036befb901/cryptography-45.0.7-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:81823935e2f8d476707e85a78a405953a03ef7b7b4f55f93f7c2d9680e5e0691", size = 4202233, upload-time = "2025-09-01T11:14:22.454Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ac/59b7790b4ccaed739fc44775ce4645c9b8ce54cbec53edf16c74fd80cb2b/cryptography-45.0.7-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3994c809c17fc570c2af12c9b840d7cea85a9fd3e5c0e0491f4fa3c029216d59", size = 4423075, upload-time = "2025-09-01T11:14:24.287Z" }, + { url = "https://files.pythonhosted.org/packages/b8/56/d4f07ea21434bf891faa088a6ac15d6d98093a66e75e30ad08e88aa2b9ba/cryptography-45.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dad43797959a74103cb59c5dac71409f9c27d34c8a05921341fb64ea8ccb1dd4", size = 4204517, upload-time = "2025-09-01T11:14:25.679Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ac/924a723299848b4c741c1059752c7cfe09473b6fd77d2920398fc26bfb53/cryptography-45.0.7-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ce7a453385e4c4693985b4a4a3533e041558851eae061a58a5405363b098fcd3", size = 3882893, upload-time = "2025-09-01T11:14:27.1Z" }, + { url = "https://files.pythonhosted.org/packages/83/dc/4dab2ff0a871cc2d81d3ae6d780991c0192b259c35e4d83fe1de18b20c70/cryptography-45.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b04f85ac3a90c227b6e5890acb0edbaf3140938dbecf07bff618bf3638578cf1", size = 4450132, upload-time = "2025-09-01T11:14:28.58Z" }, + { url = "https://files.pythonhosted.org/packages/12/dd/b2882b65db8fc944585d7fb00d67cf84a9cef4e77d9ba8f69082e911d0de/cryptography-45.0.7-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:48c41a44ef8b8c2e80ca4527ee81daa4c527df3ecbc9423c41a420a9559d0e27", size = 4204086, upload-time = "2025-09-01T11:14:30.572Z" }, + { url = "https://files.pythonhosted.org/packages/5d/fa/1d5745d878048699b8eb87c984d4ccc5da4f5008dfd3ad7a94040caca23a/cryptography-45.0.7-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f3df7b3d0f91b88b2106031fd995802a2e9ae13e02c36c1fc075b43f420f3a17", size = 4449383, upload-time = "2025-09-01T11:14:32.046Z" }, + { url = "https://files.pythonhosted.org/packages/36/8b/fc61f87931bc030598e1876c45b936867bb72777eac693e905ab89832670/cryptography-45.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:dd342f085542f6eb894ca00ef70236ea46070c8a13824c6bde0dfdcd36065b9b", size = 4332186, upload-time = "2025-09-01T11:14:33.95Z" }, + { url = "https://files.pythonhosted.org/packages/0b/11/09700ddad7443ccb11d674efdbe9a832b4455dc1f16566d9bd3834922ce5/cryptography-45.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1993a1bb7e4eccfb922b6cd414f072e08ff5816702a0bdb8941c247a6b1b287c", size = 4561639, upload-time = "2025-09-01T11:14:35.343Z" }, + { url = "https://files.pythonhosted.org/packages/71/ed/8f4c1337e9d3b94d8e50ae0b08ad0304a5709d483bfcadfcc77a23dbcb52/cryptography-45.0.7-cp37-abi3-win32.whl", hash = "sha256:18fcf70f243fe07252dcb1b268a687f2358025ce32f9f88028ca5c364b123ef5", size = 2926552, upload-time = "2025-09-01T11:14:36.929Z" }, + { url = "https://files.pythonhosted.org/packages/bc/ff/026513ecad58dacd45d1d24ebe52b852165a26e287177de1d545325c0c25/cryptography-45.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:7285a89df4900ed3bfaad5679b1e668cb4b38a8de1ccbfc84b05f34512da0a90", size = 3392742, upload-time = "2025-09-01T11:14:38.368Z" }, +] + +[[package]] +name = "cryptography" +version = "46.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.14' and platform_python_implementation != 'PyPy'", + "platform_python_implementation == 'PyPy'", +] +dependencies = [ + { name = "cffi", marker = "python_full_version < '3.14' and platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/ee/04cd4314db26ffc951c1ea90bde30dd226880ab9343759d7abbecef377ee/cryptography-46.0.0.tar.gz", hash = "sha256:99f64a6d15f19f3afd78720ad2978f6d8d4c68cd4eb600fab82ab1a7c2071dca", size = 749158, upload-time = "2025-09-16T21:07:49.091Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/bd/3e935ca6e87dc4969683f5dd9e49adaf2cb5734253d93317b6b346e0bd33/cryptography-46.0.0-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:c9c4121f9a41cc3d02164541d986f59be31548ad355a5c96ac50703003c50fb7", size = 7285468, upload-time = "2025-09-16T21:05:52.026Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ee/dd17f412ce64b347871d7752657c5084940d42af4d9c25b1b91c7ee53362/cryptography-46.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4f70cbade61a16f5e238c4b0eb4e258d177a2fcb59aa0aae1236594f7b0ae338", size = 4308218, upload-time = "2025-09-16T21:05:55.653Z" }, + { url = "https://files.pythonhosted.org/packages/2f/53/f0b865a971e4e8b3e90e648b6f828950dea4c221bb699421e82ef45f0ef9/cryptography-46.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d1eccae15d5c28c74b2bea228775c63ac5b6c36eedb574e002440c0bc28750d3", size = 4571982, upload-time = "2025-09-16T21:05:57.322Z" }, + { url = "https://files.pythonhosted.org/packages/d4/c8/035be5fd63a98284fd74df9e04156f9fed7aa45cef41feceb0d06cbdadd0/cryptography-46.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:1b4fba84166d906a22027f0d958e42f3a4dbbb19c28ea71f0fb7812380b04e3c", size = 4307996, upload-time = "2025-09-16T21:05:59.043Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4a/dbb6d7d0a48b95984e2d4caf0a4c7d6606cea5d30241d984c0c02b47f1b6/cryptography-46.0.0-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:523153480d7575a169933f083eb47b1edd5fef45d87b026737de74ffeb300f69", size = 4015692, upload-time = "2025-09-16T21:06:01.324Z" }, + { url = "https://files.pythonhosted.org/packages/65/48/aafcffdde716f6061864e56a0a5908f08dcb8523dab436228957c8ebd5df/cryptography-46.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:f09a3a108223e319168b7557810596631a8cb864657b0c16ed7a6017f0be9433", size = 4982192, upload-time = "2025-09-16T21:06:03.367Z" }, + { url = "https://files.pythonhosted.org/packages/4c/ab/1e73cfc181afc3054a09e5e8f7753a8fba254592ff50b735d7456d197353/cryptography-46.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c1f6ccd6f2eef3b2eb52837f0463e853501e45a916b3fc42e5d93cf244a4b97b", size = 4603944, upload-time = "2025-09-16T21:06:05.29Z" }, + { url = "https://files.pythonhosted.org/packages/3a/02/d71dac90b77c606c90c366571edf264dc8bd37cf836e7f902253cbf5aa77/cryptography-46.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:80a548a5862d6912a45557a101092cd6c64ae1475b82cef50ee305d14a75f598", size = 4308149, upload-time = "2025-09-16T21:06:07.006Z" }, + { url = "https://files.pythonhosted.org/packages/29/e6/4dcb67fdc6addf4e319a99c4bed25776cb691f3aa6e0c4646474748816c6/cryptography-46.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:6c39fd5cd9b7526afa69d64b5e5645a06e1b904f342584b3885254400b63f1b3", size = 4947449, upload-time = "2025-09-16T21:06:11.244Z" }, + { url = "https://files.pythonhosted.org/packages/26/04/91e3fad8ee33aa87815c8f25563f176a58da676c2b14757a4d3b19f0253c/cryptography-46.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:d5c0cbb2fb522f7e39b59a5482a1c9c5923b7c506cfe96a1b8e7368c31617ac0", size = 4603549, upload-time = "2025-09-16T21:06:13.268Z" }, + { url = "https://files.pythonhosted.org/packages/9c/6e/caf4efadcc8f593cbaacfbb04778f78b6d0dac287b45cec25e5054de38b7/cryptography-46.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6d8945bc120dcd90ae39aa841afddaeafc5f2e832809dc54fb906e3db829dfdc", size = 4435976, upload-time = "2025-09-16T21:06:16.514Z" }, + { url = "https://files.pythonhosted.org/packages/c1/c0/704710f349db25c5b91965c3662d5a758011b2511408d9451126429b6cd6/cryptography-46.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:88c09da8a94ac27798f6b62de6968ac78bb94805b5d272dbcfd5fdc8c566999f", size = 4709447, upload-time = "2025-09-16T21:06:19.246Z" }, + { url = "https://files.pythonhosted.org/packages/91/5e/ff63bfd27b75adaf75cc2398de28a0b08105f9d7f8193f3b9b071e38e8b9/cryptography-46.0.0-cp311-abi3-win32.whl", hash = "sha256:3738f50215211cee1974193a1809348d33893696ce119968932ea117bcbc9b1d", size = 3058317, upload-time = "2025-09-16T21:06:21.466Z" }, + { url = "https://files.pythonhosted.org/packages/46/47/4caf35014c4551dd0b43aa6c2e250161f7ffcb9c3918c9e075785047d5d2/cryptography-46.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:bbaa5eef3c19c66613317dc61e211b48d5f550db009c45e1c28b59d5a9b7812a", size = 3523891, upload-time = "2025-09-16T21:06:23.856Z" }, + { url = "https://files.pythonhosted.org/packages/98/66/6a0cafb3084a854acf808fccf756cbc9b835d1b99fb82c4a15e2e2ffb404/cryptography-46.0.0-cp311-abi3-win_arm64.whl", hash = "sha256:16b5ac72a965ec9d1e34d9417dbce235d45fa04dac28634384e3ce40dfc66495", size = 2932145, upload-time = "2025-09-16T21:06:25.842Z" }, + { url = "https://files.pythonhosted.org/packages/f2/5f/0cf967a1dc1419d5dde111bd0e22872038199f4e4655539ea6f4da5ad7f1/cryptography-46.0.0-cp314-abi3-macosx_10_9_universal2.whl", hash = "sha256:91585fc9e696abd7b3e48a463a20dda1a5c0eeeca4ba60fa4205a79527694390", size = 7203952, upload-time = "2025-09-16T21:06:28.21Z" }, + { url = "https://files.pythonhosted.org/packages/9c/9e/d20925af5f0484c5049cf7254c91b79776a9b555af04493de6bdd419b495/cryptography-46.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:65e9117ebed5b16b28154ed36b164c20021f3a480e9cbb4b4a2a59b95e74c25d", size = 4293519, upload-time = "2025-09-16T21:06:30.143Z" }, + { url = "https://files.pythonhosted.org/packages/5f/b9/07aec6b183ef0054b5f826ae43f0b4db34c50b56aff18f67babdcc2642a3/cryptography-46.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:da7f93551d39d462263b6b5c9056c49f780b9200bf9fc2656d7c88c7bdb9b363", size = 4545583, upload-time = "2025-09-16T21:06:31.914Z" }, + { url = "https://files.pythonhosted.org/packages/39/4a/7d25158be8c607e2b9ebda49be762404d675b47df335d0d2a3b979d80213/cryptography-46.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:be7479f9504bfb46628544ec7cb4637fe6af8b70445d4455fbb9c395ad9b7290", size = 4299196, upload-time = "2025-09-16T21:06:33.724Z" }, + { url = "https://files.pythonhosted.org/packages/15/3f/65c8753c0dbebe769cc9f9d87d52bce8b74e850ef2818c59bfc7e4248663/cryptography-46.0.0-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f85e6a7d42ad60024fa1347b1d4ef82c4df517a4deb7f829d301f1a92ded038c", size = 3994419, upload-time = "2025-09-16T21:06:35.877Z" }, + { url = "https://files.pythonhosted.org/packages/d5/b4/69a271873cfc333a236443c94aa07e0233bc36b384e182da2263703b5759/cryptography-46.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:d349af4d76a93562f1dce4d983a4a34d01cb22b48635b0d2a0b8372cdb4a8136", size = 4960228, upload-time = "2025-09-16T21:06:38.182Z" }, + { url = "https://files.pythonhosted.org/packages/af/e0/ab62ee938b8d17bd1025cff569803cfc1c62dfdf89ffc78df6e092bff35f/cryptography-46.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:35aa1a44bd3e0efc3ef09cf924b3a0e2a57eda84074556f4506af2d294076685", size = 4577257, upload-time = "2025-09-16T21:06:39.998Z" }, + { url = "https://files.pythonhosted.org/packages/49/67/09a581c21da7189676678edd2bd37b64888c88c2d2727f2c3e0350194fba/cryptography-46.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:c457ad3f151d5fb380be99425b286167b358f76d97ad18b188b68097193ed95a", size = 4299023, upload-time = "2025-09-16T21:06:42.182Z" }, + { url = "https://files.pythonhosted.org/packages/af/28/2cb6d3d0d2c8ce8be4f19f4d83956c845c760a9e6dfe5b476cebed4f4f00/cryptography-46.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:399ef4c9be67f3902e5ca1d80e64b04498f8b56c19e1bc8d0825050ea5290410", size = 4925802, upload-time = "2025-09-16T21:06:44.31Z" }, + { url = "https://files.pythonhosted.org/packages/88/0b/1f31b6658c1dfa04e82b88de2d160e0e849ffb94353b1526dfb3a225a100/cryptography-46.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:378eff89b040cbce6169528f130ee75dceeb97eef396a801daec03b696434f06", size = 4577107, upload-time = "2025-09-16T21:06:46.324Z" }, + { url = "https://files.pythonhosted.org/packages/c2/af/507de3a1d4ded3068ddef188475d241bfc66563d99161585c8f2809fee01/cryptography-46.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c3648d6a5878fd1c9a22b1d43fa75efc069d5f54de12df95c638ae7ba88701d0", size = 4422506, upload-time = "2025-09-16T21:06:47.963Z" }, + { url = "https://files.pythonhosted.org/packages/47/aa/08e514756504d92334cabfe7fe792d10d977f2294ef126b2056b436450eb/cryptography-46.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2fc30be952dd4334801d345d134c9ef0e9ccbaa8c3e1bc18925cbc4247b3e29c", size = 4684081, upload-time = "2025-09-16T21:06:49.667Z" }, + { url = "https://files.pythonhosted.org/packages/d0/ef/ffde6e334fbd4ace04a6d9ced4c5fe1ca9e6ded4ee21b077a6889b452a89/cryptography-46.0.0-cp314-cp314t-win32.whl", hash = "sha256:b8e7db4ce0b7297e88f3d02e6ee9a39382e0efaf1e8974ad353120a2b5a57ef7", size = 3029735, upload-time = "2025-09-16T21:06:51.301Z" }, + { url = "https://files.pythonhosted.org/packages/4a/78/a41aee8bc5659390806196b0ed4d388211d3b38172827e610a82a7cd7546/cryptography-46.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:40ee4ce3c34acaa5bc347615ec452c74ae8ff7db973a98c97c62293120f668c6", size = 3502172, upload-time = "2025-09-16T21:06:53.328Z" }, + { url = "https://files.pythonhosted.org/packages/f0/2b/7e7427c258fdeae867d236cc9cad0c5c56735bc4d2f4adf035933ab4c15f/cryptography-46.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:07a1be54f995ce14740bf8bbe1cc35f7a37760f992f73cf9f98a2a60b9b97419", size = 2912344, upload-time = "2025-09-16T21:06:56.808Z" }, + { url = "https://files.pythonhosted.org/packages/53/06/80e7256a4677c2e9eb762638e8200a51f6dd56d2e3de3e34d0a83c2f5f80/cryptography-46.0.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:1d2073313324226fd846e6b5fc340ed02d43fd7478f584741bd6b791c33c9fee", size = 7257206, upload-time = "2025-09-16T21:06:59.295Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b8/a5ed987f5c11b242713076121dddfff999d81fb492149c006a579d0e4099/cryptography-46.0.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:83af84ebe7b6e9b6de05050c79f8cc0173c864ce747b53abce6a11e940efdc0d", size = 4301182, upload-time = "2025-09-16T21:07:01.624Z" }, + { url = "https://files.pythonhosted.org/packages/da/94/f1c1f30110c05fa5247bf460b17acfd52fa3f5c77e94ba19cff8957dc5e6/cryptography-46.0.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c3cd09b1490c1509bf3892bde9cef729795fae4a2fee0621f19be3321beca7e4", size = 4562561, upload-time = "2025-09-16T21:07:03.386Z" }, + { url = "https://files.pythonhosted.org/packages/5d/54/8decbf2f707350bedcd525833d3a0cc0203d8b080d926ad75d5c4de701ba/cryptography-46.0.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d14eaf1569d6252280516bedaffdd65267428cdbc3a8c2d6de63753cf0863d5e", size = 4301974, upload-time = "2025-09-16T21:07:04.962Z" }, + { url = "https://files.pythonhosted.org/packages/82/63/c34a2f3516c6b05801f129616a5a1c68a8c403b91f23f9db783ee1d4f700/cryptography-46.0.0-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ab3a14cecc741c8c03ad0ad46dfbf18de25218551931a23bca2731d46c706d83", size = 4009462, upload-time = "2025-09-16T21:07:06.569Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c5/92ef920a4cf8ff35fcf9da5a09f008a6977dcb9801c709799ec1bf2873fb/cryptography-46.0.0-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:8e8b222eb54e3e7d3743a7c2b1f7fa7df7a9add790307bb34327c88ec85fe087", size = 4980769, upload-time = "2025-09-16T21:07:08.269Z" }, + { url = "https://files.pythonhosted.org/packages/a9/8f/1705f7ea3b9468c4a4fef6cce631db14feb6748499870a4772993cbeb729/cryptography-46.0.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:7f3f88df0c9b248dcc2e76124f9140621aca187ccc396b87bc363f890acf3a30", size = 4591812, upload-time = "2025-09-16T21:07:10.288Z" }, + { url = "https://files.pythonhosted.org/packages/34/b9/2d797ce9d346b8bac9f570b43e6e14226ff0f625f7f6f2f95d9065e316e3/cryptography-46.0.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9aa85222f03fdb30defabc7a9e1e3d4ec76eb74ea9fe1504b2800844f9c98440", size = 4301844, upload-time = "2025-09-16T21:07:12.522Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2d/8efc9712997b46aea2ac8f74adc31f780ac4662e3b107ecad0d5c1a0c7f8/cryptography-46.0.0-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:f9aaf2a91302e1490c068d2f3af7df4137ac2b36600f5bd26e53d9ec320412d3", size = 4943257, upload-time = "2025-09-16T21:07:14.289Z" }, + { url = "https://files.pythonhosted.org/packages/c4/0c/bc365287a97d28aa7feef8810884831b2a38a8dc4cf0f8d6927ad1568d27/cryptography-46.0.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:32670ca085150ff36b438c17f2dfc54146fe4a074ebf0a76d72fb1b419a974bc", size = 4591154, upload-time = "2025-09-16T21:07:16.271Z" }, + { url = "https://files.pythonhosted.org/packages/51/3b/0b15107277b0c558c02027da615f4e78c892f22c6a04d29c6ad43fcddca6/cryptography-46.0.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0f58183453032727a65e6605240e7a3824fd1d6a7e75d2b537e280286ab79a52", size = 4428200, upload-time = "2025-09-16T21:07:18.118Z" }, + { url = "https://files.pythonhosted.org/packages/cf/24/814d69418247ea2cfc985eec6678239013500d745bc7a0a35a32c2e2f3be/cryptography-46.0.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4bc257c2d5d865ed37d0bd7c500baa71f939a7952c424f28632298d80ccd5ec1", size = 4699862, upload-time = "2025-09-16T21:07:20.219Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1e/665c718e0c45281a4e22454fa8a9bd8835f1ceb667b9ffe807baa41cd681/cryptography-46.0.0-cp38-abi3-win32.whl", hash = "sha256:df932ac70388be034b2e046e34d636245d5eeb8140db24a6b4c2268cd2073270", size = 3043766, upload-time = "2025-09-16T21:07:21.969Z" }, + { url = "https://files.pythonhosted.org/packages/78/7e/12e1e13abff381c702697845d1cf372939957735f49ef66f2061f38da32f/cryptography-46.0.0-cp38-abi3-win_amd64.whl", hash = "sha256:274f8b2eb3616709f437326185eb563eb4e5813d01ebe2029b61bfe7d9995fbb", size = 3517216, upload-time = "2025-09-16T21:07:24.024Z" }, + { url = "https://files.pythonhosted.org/packages/ad/55/009497b2ae7375db090b41f9fe7a1a7362f804ddfe17ed9e34f748fcb0e5/cryptography-46.0.0-cp38-abi3-win_arm64.whl", hash = "sha256:249c41f2bbfa026615e7bdca47e4a66135baa81b08509ab240a2e666f6af5966", size = 2923145, upload-time = "2025-09-16T21:07:25.74Z" }, ] [[package]] @@ -469,6 +504,37 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, ] +[[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" }, + { url = "https://files.pythonhosted.org/packages/f5/f0/8cac9713735864899e8abc4065bbdb3d1617f2130006d508a80e1b1a6c53/duckdb-1.3.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a3418c973b06ac4e97f178f803e032c30c9a9f56a3e3b43a866f33223dfbf60b", size = 15535350, upload-time = "2025-07-08T10:40:45.562Z" }, + { url = "https://files.pythonhosted.org/packages/c5/26/6698bbb30b7bce8b8b17697599f1517611c61e4bd68b37eaeaf4f5ddd915/duckdb-1.3.2-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:2a741eae2cf110fd2223eeebe4151e22c0c02803e1cfac6880dbe8a39fecab6a", size = 32534715, upload-time = "2025-07-08T10:40:47.615Z" }, + { url = "https://files.pythonhosted.org/packages/10/75/8ab4da3099a2fac7335ecebce4246706d19bdd5dad167aa436b5b27c43c4/duckdb-1.3.2-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:51e62541341ea1a9e31f0f1ade2496a39b742caf513bebd52396f42ddd6525a0", size = 17110300, upload-time = "2025-07-08T10:40:49.674Z" }, + { url = "https://files.pythonhosted.org/packages/d1/46/af81b10d4a66a0f27c248df296d1b41ff2a305a235ed8488f93240f6f8b5/duckdb-1.3.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3e519de5640e5671f1731b3ae6b496e0ed7e4de4a1c25c7a2f34c991ab64d71", size = 19180082, upload-time = "2025-07-08T10:40:51.679Z" }, + { url = "https://files.pythonhosted.org/packages/68/fc/259a54fc22111a847981927aa58528d766e8b228c6d41deb0ad8a1959f9f/duckdb-1.3.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4732fb8cc60566b60e7e53b8c19972cb5ed12d285147a3063b16cc64a79f6d9f", size = 21128404, upload-time = "2025-07-08T10:40:53.772Z" }, + { url = "https://files.pythonhosted.org/packages/ab/dc/5d5140383e40661173dacdceaddee2a97c3f6721a5e8d76e08258110595e/duckdb-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97f7a22dcaa1cca889d12c3dc43a999468375cdb6f6fe56edf840e062d4a8293", size = 22779786, upload-time = "2025-07-08T10:40:55.826Z" }, + { url = "https://files.pythonhosted.org/packages/51/c9/2fcd86ab7530a5b6caff42dbe516ce7a86277e12c499d1c1f5acd266ffb2/duckdb-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:cd3d717bf9c49ef4b1016c2216517572258fa645c2923e91c5234053defa3fb5", size = 11395370, upload-time = "2025-07-08T10:40:57.655Z" }, +] + [[package]] name = "executing" version = "2.2.1" @@ -527,12 +593,47 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/51/c7/b64cae5dba3a1b138d7123ec36bb5ccd39d39939f18454407e5468f4763f/fsspec-2025.12.0-py3-none-any.whl", hash = "sha256:8bf1fe301b7d8acfa6e8571e3b1c3d158f909666642431cc78a1b7b4dbc5ec5b", size = 201422, upload-time = "2025-12-03T15:23:41.434Z" }, ] +[[package]] +name = "getml" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "rich" }, + { name = "typing-extensions" }, +] +wheels = [ + { 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]] name = "getml-featurestore-integrations" version = "0.1.0" source = { virtual = "." } dependencies = [ { name = "fastparquet" }, + { name = "getml" }, + { name = "getml-interpretations" }, { name = "httpx" }, { name = "ipykernel" }, { name = "pandas" }, @@ -555,14 +656,16 @@ dev = [ [package.metadata] requires-dist = [ { name = "fastparquet", specifier = ">=2024.11.0" }, - { name = "httpx", specifier = ">=0.27.0" }, - { name = "ipykernel", specifier = ">=7.1.0" }, - { name = "pandas", specifier = ">=2.3.3" }, - { name = "pyarrow", specifier = ">=18.0.0" }, - { name = "pydantic", specifier = ">=2.12.5" }, - { name = "pydantic-settings", specifier = ">=2.12.0" }, - { name = "snowflake-connector-python", specifier = ">=3.17.3" }, - { name = "snowflake-snowpark-python", specifier = ">=1.42.0" }, + { name = "getml", specifier = ">=1.5.1" }, + { name = "getml-interpretations", git = "https://github.com/getml/getml-interpretations.git?rev=be0b3d7b995a220290599b466d4292dd74c8e126" }, + { name = "httpx", specifier = "~=0.27" }, + { name = "ipykernel", specifier = "~=7.1" }, + { name = "pandas", specifier = "~=2.2" }, + { name = "pyarrow", specifier = "~=19.0" }, + { name = "pydantic", specifier = "~=2.11" }, + { name = "pydantic-settings", specifier = "~=2.11" }, + { name = "snowflake-connector-python", specifier = "~=3.17" }, + { name = "snowflake-snowpark-python", specifier = "~=1.42" }, ] [package.metadata.requires-dev] @@ -574,6 +677,33 @@ dev = [ { name = "ruff", specifier = "~=0.12.2" }, ] +[[package]] +name = "getml-interpretations" +version = "0.1.0" +source = { git = "https://github.com/getml/getml-interpretations.git?rev=be0b3d7b995a220290599b466d4292dd74c8e126#be0b3d7b995a220290599b466d4292dd74c8e126" } +dependencies = [ + { name = "deigma" }, + { name = "getml" }, + { name = "getml-io" }, + { name = "httpx" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "stamina" }, +] + +[[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 = "h11" version = "0.16.0" @@ -698,6 +828,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, ] +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + [[package]] name = "jmespath" version = "1.0.1" @@ -736,6 +878,81 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" }, ] +[[package]] +name = "markdown-it-py" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + [[package]] name = "matplotlib-inline" version = "0.2.1" @@ -748,6 +965,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, ] +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + [[package]] name = "nest-asyncio" version = "1.6.0" @@ -775,65 +1001,40 @@ wheels = [ [[package]] name = "numpy" -version = "2.3.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/76/65/21b3bc86aac7b8f2862db1e808f1ea22b028e30a225a34a5ede9bf8678f2/numpy-2.3.5.tar.gz", hash = "sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0", size = 20584950, upload-time = "2025-11-16T22:52:42.067Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/44/37/e669fe6cbb2b96c62f6bbedc6a81c0f3b7362f6a59230b23caa673a85721/numpy-2.3.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e", size = 16733873, upload-time = "2025-11-16T22:49:49.84Z" }, - { url = "https://files.pythonhosted.org/packages/c5/65/df0db6c097892c9380851ab9e44b52d4f7ba576b833996e0080181c0c439/numpy-2.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769", size = 12259838, upload-time = "2025-11-16T22:49:52.863Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e1/1ee06e70eb2136797abe847d386e7c0e830b67ad1d43f364dd04fa50d338/numpy-2.3.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5", size = 5088378, upload-time = "2025-11-16T22:49:55.055Z" }, - { url = "https://files.pythonhosted.org/packages/6d/9c/1ca85fb86708724275103b81ec4cf1ac1d08f465368acfc8da7ab545bdae/numpy-2.3.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4", size = 6628559, upload-time = "2025-11-16T22:49:57.371Z" }, - { url = "https://files.pythonhosted.org/packages/74/78/fcd41e5a0ce4f3f7b003da85825acddae6d7ecb60cf25194741b036ca7d6/numpy-2.3.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d", size = 14250702, upload-time = "2025-11-16T22:49:59.632Z" }, - { url = "https://files.pythonhosted.org/packages/b6/23/2a1b231b8ff672b4c450dac27164a8b2ca7d9b7144f9c02d2396518352eb/numpy-2.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28", size = 16606086, upload-time = "2025-11-16T22:50:02.127Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c5/5ad26fbfbe2012e190cc7d5003e4d874b88bb18861d0829edc140a713021/numpy-2.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b", size = 16025985, upload-time = "2025-11-16T22:50:04.536Z" }, - { url = "https://files.pythonhosted.org/packages/d2/fa/dd48e225c46c819288148d9d060b047fd2a6fb1eb37eae25112ee4cb4453/numpy-2.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c", size = 18542976, upload-time = "2025-11-16T22:50:07.557Z" }, - { url = "https://files.pythonhosted.org/packages/05/79/ccbd23a75862d95af03d28b5c6901a1b7da4803181513d52f3b86ed9446e/numpy-2.3.5-cp312-cp312-win32.whl", hash = "sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952", size = 6285274, upload-time = "2025-11-16T22:50:10.746Z" }, - { url = "https://files.pythonhosted.org/packages/2d/57/8aeaf160312f7f489dea47ab61e430b5cb051f59a98ae68b7133ce8fa06a/numpy-2.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa", size = 12782922, upload-time = "2025-11-16T22:50:12.811Z" }, - { url = "https://files.pythonhosted.org/packages/78/a6/aae5cc2ca78c45e64b9ef22f089141d661516856cf7c8a54ba434576900d/numpy-2.3.5-cp312-cp312-win_arm64.whl", hash = "sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013", size = 10194667, upload-time = "2025-11-16T22:50:16.16Z" }, - { url = "https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff", size = 16728251, upload-time = "2025-11-16T22:50:19.013Z" }, - { url = "https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188", size = 12254652, upload-time = "2025-11-16T22:50:21.487Z" }, - { url = "https://files.pythonhosted.org/packages/78/da/8c7738060ca9c31b30e9301ee0cf6c5ffdbf889d9593285a1cead337f9a5/numpy-2.3.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0", size = 5083172, upload-time = "2025-11-16T22:50:24.562Z" }, - { url = "https://files.pythonhosted.org/packages/a4/b4/ee5bb2537fb9430fd2ef30a616c3672b991a4129bb1c7dcc42aa0abbe5d7/numpy-2.3.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903", size = 6622990, upload-time = "2025-11-16T22:50:26.47Z" }, - { url = "https://files.pythonhosted.org/packages/95/03/dc0723a013c7d7c19de5ef29e932c3081df1c14ba582b8b86b5de9db7f0f/numpy-2.3.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d", size = 14248902, upload-time = "2025-11-16T22:50:28.861Z" }, - { url = "https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017", size = 16597430, upload-time = "2025-11-16T22:50:31.56Z" }, - { url = "https://files.pythonhosted.org/packages/2a/51/c1e29be863588db58175175f057286900b4b3327a1351e706d5e0f8dd679/numpy-2.3.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf", size = 16024551, upload-time = "2025-11-16T22:50:34.242Z" }, - { url = "https://files.pythonhosted.org/packages/83/68/8236589d4dbb87253d28259d04d9b814ec0ecce7cb1c7fed29729f4c3a78/numpy-2.3.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce", size = 18533275, upload-time = "2025-11-16T22:50:37.651Z" }, - { url = "https://files.pythonhosted.org/packages/40/56/2932d75b6f13465239e3b7b7e511be27f1b8161ca2510854f0b6e521c395/numpy-2.3.5-cp313-cp313-win32.whl", hash = "sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e", size = 6277637, upload-time = "2025-11-16T22:50:40.11Z" }, - { url = "https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl", hash = "sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b", size = 12779090, upload-time = "2025-11-16T22:50:42.503Z" }, - { url = "https://files.pythonhosted.org/packages/8f/88/3f41e13a44ebd4034ee17baa384acac29ba6a4fcc2aca95f6f08ca0447d1/numpy-2.3.5-cp313-cp313-win_arm64.whl", hash = "sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae", size = 10194710, upload-time = "2025-11-16T22:50:44.971Z" }, - { url = "https://files.pythonhosted.org/packages/13/cb/71744144e13389d577f867f745b7df2d8489463654a918eea2eeb166dfc9/numpy-2.3.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd", size = 16827292, upload-time = "2025-11-16T22:50:47.715Z" }, - { url = "https://files.pythonhosted.org/packages/71/80/ba9dc6f2a4398e7f42b708a7fdc841bb638d353be255655498edbf9a15a8/numpy-2.3.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f", size = 12378897, upload-time = "2025-11-16T22:50:51.327Z" }, - { url = "https://files.pythonhosted.org/packages/2e/6d/db2151b9f64264bcceccd51741aa39b50150de9b602d98ecfe7e0c4bff39/numpy-2.3.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a", size = 5207391, upload-time = "2025-11-16T22:50:54.542Z" }, - { url = "https://files.pythonhosted.org/packages/80/ae/429bacace5ccad48a14c4ae5332f6aa8ab9f69524193511d60ccdfdc65fa/numpy-2.3.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139", size = 6721275, upload-time = "2025-11-16T22:50:56.794Z" }, - { url = "https://files.pythonhosted.org/packages/74/5b/1919abf32d8722646a38cd527bc3771eb229a32724ee6ba340ead9b92249/numpy-2.3.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e", size = 14306855, upload-time = "2025-11-16T22:50:59.208Z" }, - { url = "https://files.pythonhosted.org/packages/a5/87/6831980559434973bebc30cd9c1f21e541a0f2b0c280d43d3afd909b66d0/numpy-2.3.5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9", size = 16657359, upload-time = "2025-11-16T22:51:01.991Z" }, - { url = "https://files.pythonhosted.org/packages/dd/91/c797f544491ee99fd00495f12ebb7802c440c1915811d72ac5b4479a3356/numpy-2.3.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946", size = 16093374, upload-time = "2025-11-16T22:51:05.291Z" }, - { url = "https://files.pythonhosted.org/packages/74/a6/54da03253afcbe7a72785ec4da9c69fb7a17710141ff9ac5fcb2e32dbe64/numpy-2.3.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1", size = 18594587, upload-time = "2025-11-16T22:51:08.585Z" }, - { url = "https://files.pythonhosted.org/packages/80/e9/aff53abbdd41b0ecca94285f325aff42357c6b5abc482a3fcb4994290b18/numpy-2.3.5-cp313-cp313t-win32.whl", hash = "sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3", size = 6405940, upload-time = "2025-11-16T22:51:11.541Z" }, - { url = "https://files.pythonhosted.org/packages/d5/81/50613fec9d4de5480de18d4f8ef59ad7e344d497edbef3cfd80f24f98461/numpy-2.3.5-cp313-cp313t-win_amd64.whl", hash = "sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234", size = 12920341, upload-time = "2025-11-16T22:51:14.312Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ab/08fd63b9a74303947f34f0bd7c5903b9c5532c2d287bead5bdf4c556c486/numpy-2.3.5-cp313-cp313t-win_arm64.whl", hash = "sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7", size = 10262507, upload-time = "2025-11-16T22:51:16.846Z" }, - { url = "https://files.pythonhosted.org/packages/ba/97/1a914559c19e32d6b2e233cf9a6a114e67c856d35b1d6babca571a3e880f/numpy-2.3.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82", size = 16735706, upload-time = "2025-11-16T22:51:19.558Z" }, - { url = "https://files.pythonhosted.org/packages/57/d4/51233b1c1b13ecd796311216ae417796b88b0616cfd8a33ae4536330748a/numpy-2.3.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0", size = 12264507, upload-time = "2025-11-16T22:51:22.492Z" }, - { url = "https://files.pythonhosted.org/packages/45/98/2fe46c5c2675b8306d0b4a3ec3494273e93e1226a490f766e84298576956/numpy-2.3.5-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63", size = 5093049, upload-time = "2025-11-16T22:51:25.171Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0e/0698378989bb0ac5f1660c81c78ab1fe5476c1a521ca9ee9d0710ce54099/numpy-2.3.5-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9", size = 6626603, upload-time = "2025-11-16T22:51:27Z" }, - { url = "https://files.pythonhosted.org/packages/5e/a6/9ca0eecc489640615642a6cbc0ca9e10df70df38c4d43f5a928ff18d8827/numpy-2.3.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b", size = 14262696, upload-time = "2025-11-16T22:51:29.402Z" }, - { url = "https://files.pythonhosted.org/packages/c8/f6/07ec185b90ec9d7217a00eeeed7383b73d7e709dae2a9a021b051542a708/numpy-2.3.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520", size = 16597350, upload-time = "2025-11-16T22:51:32.167Z" }, - { url = "https://files.pythonhosted.org/packages/75/37/164071d1dde6a1a84c9b8e5b414fa127981bad47adf3a6b7e23917e52190/numpy-2.3.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c", size = 16040190, upload-time = "2025-11-16T22:51:35.403Z" }, - { url = "https://files.pythonhosted.org/packages/08/3c/f18b82a406b04859eb026d204e4e1773eb41c5be58410f41ffa511d114ae/numpy-2.3.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8", size = 18536749, upload-time = "2025-11-16T22:51:39.698Z" }, - { url = "https://files.pythonhosted.org/packages/40/79/f82f572bf44cf0023a2fe8588768e23e1592585020d638999f15158609e1/numpy-2.3.5-cp314-cp314-win32.whl", hash = "sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248", size = 6335432, upload-time = "2025-11-16T22:51:42.476Z" }, - { url = "https://files.pythonhosted.org/packages/a3/2e/235b4d96619931192c91660805e5e49242389742a7a82c27665021db690c/numpy-2.3.5-cp314-cp314-win_amd64.whl", hash = "sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e", size = 12919388, upload-time = "2025-11-16T22:51:45.275Z" }, - { url = "https://files.pythonhosted.org/packages/07/2b/29fd75ce45d22a39c61aad74f3d718e7ab67ccf839ca8b60866054eb15f8/numpy-2.3.5-cp314-cp314-win_arm64.whl", hash = "sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2", size = 10476651, upload-time = "2025-11-16T22:51:47.749Z" }, - { url = "https://files.pythonhosted.org/packages/17/e1/f6a721234ebd4d87084cfa68d081bcba2f5cfe1974f7de4e0e8b9b2a2ba1/numpy-2.3.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41", size = 16834503, upload-time = "2025-11-16T22:51:50.443Z" }, - { url = "https://files.pythonhosted.org/packages/5c/1c/baf7ffdc3af9c356e1c135e57ab7cf8d247931b9554f55c467efe2c69eff/numpy-2.3.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad", size = 12381612, upload-time = "2025-11-16T22:51:53.609Z" }, - { url = "https://files.pythonhosted.org/packages/74/91/f7f0295151407ddc9ba34e699013c32c3c91944f9b35fcf9281163dc1468/numpy-2.3.5-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39", size = 5210042, upload-time = "2025-11-16T22:51:56.213Z" }, - { url = "https://files.pythonhosted.org/packages/2e/3b/78aebf345104ec50dd50a4d06ddeb46a9ff5261c33bcc58b1c4f12f85ec2/numpy-2.3.5-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20", size = 6724502, upload-time = "2025-11-16T22:51:58.584Z" }, - { url = "https://files.pythonhosted.org/packages/02/c6/7c34b528740512e57ef1b7c8337ab0b4f0bddf34c723b8996c675bc2bc91/numpy-2.3.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52", size = 14308962, upload-time = "2025-11-16T22:52:01.698Z" }, - { url = "https://files.pythonhosted.org/packages/80/35/09d433c5262bc32d725bafc619e095b6a6651caf94027a03da624146f655/numpy-2.3.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b", size = 16655054, upload-time = "2025-11-16T22:52:04.267Z" }, - { url = "https://files.pythonhosted.org/packages/7a/ab/6a7b259703c09a88804fa2430b43d6457b692378f6b74b356155283566ac/numpy-2.3.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3", size = 16091613, upload-time = "2025-11-16T22:52:08.651Z" }, - { url = "https://files.pythonhosted.org/packages/c2/88/330da2071e8771e60d1038166ff9d73f29da37b01ec3eb43cb1427464e10/numpy-2.3.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227", size = 18591147, upload-time = "2025-11-16T22:52:11.453Z" }, - { url = "https://files.pythonhosted.org/packages/51/41/851c4b4082402d9ea860c3626db5d5df47164a712cb23b54be028b184c1c/numpy-2.3.5-cp314-cp314t-win32.whl", hash = "sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5", size = 6479806, upload-time = "2025-11-16T22:52:14.641Z" }, - { url = "https://files.pythonhosted.org/packages/90/30/d48bde1dfd93332fa557cff1972fbc039e055a52021fbef4c2c4b1eefd17/numpy-2.3.5-cp314-cp314t-win_amd64.whl", hash = "sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf", size = 13105760, upload-time = "2025-11-16T22:52:17.975Z" }, - { url = "https://files.pythonhosted.org/packages/2d/fd/4b5eb0b3e888d86aee4d198c23acec7d214baaf17ea93c1adec94c9518b9/numpy-2.3.5-cp314-cp314t-win_arm64.whl", hash = "sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42", size = 10545459, upload-time = "2025-11-16T22:52:20.55Z" }, +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, ] [[package]] @@ -847,7 +1048,7 @@ wheels = [ [[package]] name = "pandas" -version = "2.3.3" +version = "2.2.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, @@ -855,41 +1056,28 @@ 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" } -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/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, - { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, - { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, - { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, - { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, - { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, - { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, - { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, - { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, - { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, - { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, - { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, - { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, - { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, - { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, - { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, - { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, - { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, - { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, - { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, - { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, - { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, - { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, - { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, - { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, - { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, +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/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" }, + { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643, upload-time = "2024-09-20T13:09:25.522Z" }, + { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573, upload-time = "2024-09-20T13:09:28.012Z" }, + { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085, upload-time = "2024-09-20T19:02:10.451Z" }, + { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809, upload-time = "2024-09-20T13:09:30.814Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316, upload-time = "2024-09-20T19:02:13.825Z" }, + { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055, upload-time = "2024-09-20T13:09:33.462Z" }, + { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175, upload-time = "2024-09-20T13:09:35.871Z" }, + { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650, upload-time = "2024-09-20T13:09:38.685Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177, upload-time = "2024-09-20T13:09:41.141Z" }, + { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526, upload-time = "2024-09-20T19:02:16.905Z" }, + { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013, upload-time = "2024-09-20T13:09:44.39Z" }, + { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620, upload-time = "2024-09-20T19:02:20.639Z" }, + { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436, upload-time = "2024-09-20T13:09:48.112Z" }, ] [[package]] @@ -915,11 +1103,11 @@ wheels = [ [[package]] name = "platformdirs" -version = "4.5.1" +version = "4.3.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" } +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/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, + { 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]] @@ -1003,45 +1191,30 @@ wheels = [ [[package]] name = "pyarrow" -version = "22.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/53/04a7fdc63e6056116c9ddc8b43bc28c12cdd181b85cbeadb79278475f3ae/pyarrow-22.0.0.tar.gz", hash = "sha256:3d600dc583260d845c7d8a6db540339dd883081925da2bd1c5cb808f720b3cd9", size = 1151151, upload-time = "2025-10-24T12:30:00.762Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/af/63/ba23862d69652f85b615ca14ad14f3bcfc5bf1b99ef3f0cd04ff93fdad5a/pyarrow-22.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:bea79263d55c24a32b0d79c00a1c58bb2ee5f0757ed95656b01c0fb310c5af3d", size = 34211578, upload-time = "2025-10-24T10:05:21.583Z" }, - { url = "https://files.pythonhosted.org/packages/b1/d0/f9ad86fe809efd2bcc8be32032fa72e8b0d112b01ae56a053006376c5930/pyarrow-22.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:12fe549c9b10ac98c91cf791d2945e878875d95508e1a5d14091a7aaa66d9cf8", size = 35989906, upload-time = "2025-10-24T10:05:29.485Z" }, - { url = "https://files.pythonhosted.org/packages/b4/a8/f910afcb14630e64d673f15904ec27dd31f1e009b77033c365c84e8c1e1d/pyarrow-22.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:334f900ff08ce0423407af97e6c26ad5d4e3b0763645559ece6fbf3747d6a8f5", size = 45021677, upload-time = "2025-10-24T10:05:38.274Z" }, - { url = "https://files.pythonhosted.org/packages/13/95/aec81f781c75cd10554dc17a25849c720d54feafb6f7847690478dcf5ef8/pyarrow-22.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:c6c791b09c57ed76a18b03f2631753a4960eefbbca80f846da8baefc6491fcfe", size = 47726315, upload-time = "2025-10-24T10:05:47.314Z" }, - { url = "https://files.pythonhosted.org/packages/bb/d4/74ac9f7a54cfde12ee42734ea25d5a3c9a45db78f9def949307a92720d37/pyarrow-22.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c3200cb41cdbc65156e5f8c908d739b0dfed57e890329413da2748d1a2cd1a4e", size = 47990906, upload-time = "2025-10-24T10:05:58.254Z" }, - { url = "https://files.pythonhosted.org/packages/2e/71/fedf2499bf7a95062eafc989ace56572f3343432570e1c54e6599d5b88da/pyarrow-22.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ac93252226cf288753d8b46280f4edf3433bf9508b6977f8dd8526b521a1bbb9", size = 50306783, upload-time = "2025-10-24T10:06:08.08Z" }, - { url = "https://files.pythonhosted.org/packages/68/ed/b202abd5a5b78f519722f3d29063dda03c114711093c1995a33b8e2e0f4b/pyarrow-22.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:44729980b6c50a5f2bfcc2668d36c569ce17f8b17bccaf470c4313dcbbf13c9d", size = 27972883, upload-time = "2025-10-24T10:06:14.204Z" }, - { url = "https://files.pythonhosted.org/packages/a6/d6/d0fac16a2963002fc22c8fa75180a838737203d558f0ed3b564c4a54eef5/pyarrow-22.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e6e95176209257803a8b3d0394f21604e796dadb643d2f7ca21b66c9c0b30c9a", size = 34204629, upload-time = "2025-10-24T10:06:20.274Z" }, - { url = "https://files.pythonhosted.org/packages/c6/9c/1d6357347fbae062ad3f17082f9ebc29cc733321e892c0d2085f42a2212b/pyarrow-22.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:001ea83a58024818826a9e3f89bf9310a114f7e26dfe404a4c32686f97bd7901", size = 35985783, upload-time = "2025-10-24T10:06:27.301Z" }, - { url = "https://files.pythonhosted.org/packages/ff/c0/782344c2ce58afbea010150df07e3a2f5fdad299cd631697ae7bd3bac6e3/pyarrow-22.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:ce20fe000754f477c8a9125543f1936ea5b8867c5406757c224d745ed033e691", size = 45020999, upload-time = "2025-10-24T10:06:35.387Z" }, - { url = "https://files.pythonhosted.org/packages/1b/8b/5362443737a5307a7b67c1017c42cd104213189b4970bf607e05faf9c525/pyarrow-22.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e0a15757fccb38c410947df156f9749ae4a3c89b2393741a50521f39a8cf202a", size = 47724601, upload-time = "2025-10-24T10:06:43.551Z" }, - { url = "https://files.pythonhosted.org/packages/69/4d/76e567a4fc2e190ee6072967cb4672b7d9249ac59ae65af2d7e3047afa3b/pyarrow-22.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cedb9dd9358e4ea1d9bce3665ce0797f6adf97ff142c8e25b46ba9cdd508e9b6", size = 48001050, upload-time = "2025-10-24T10:06:52.284Z" }, - { url = "https://files.pythonhosted.org/packages/01/5e/5653f0535d2a1aef8223cee9d92944cb6bccfee5cf1cd3f462d7cb022790/pyarrow-22.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:252be4a05f9d9185bb8c18e83764ebcfea7185076c07a7a662253af3a8c07941", size = 50307877, upload-time = "2025-10-24T10:07:02.405Z" }, - { url = "https://files.pythonhosted.org/packages/2d/f8/1d0bd75bf9328a3b826e24a16e5517cd7f9fbf8d34a3184a4566ef5a7f29/pyarrow-22.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:a4893d31e5ef780b6edcaf63122df0f8d321088bb0dee4c8c06eccb1ca28d145", size = 27977099, upload-time = "2025-10-24T10:08:07.259Z" }, - { url = "https://files.pythonhosted.org/packages/90/81/db56870c997805bf2b0f6eeeb2d68458bf4654652dccdcf1bf7a42d80903/pyarrow-22.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:f7fe3dbe871294ba70d789be16b6e7e52b418311e166e0e3cba9522f0f437fb1", size = 34336685, upload-time = "2025-10-24T10:07:11.47Z" }, - { url = "https://files.pythonhosted.org/packages/1c/98/0727947f199aba8a120f47dfc229eeb05df15bcd7a6f1b669e9f882afc58/pyarrow-22.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:ba95112d15fd4f1105fb2402c4eab9068f0554435e9b7085924bcfaac2cc306f", size = 36032158, upload-time = "2025-10-24T10:07:18.626Z" }, - { url = "https://files.pythonhosted.org/packages/96/b4/9babdef9c01720a0785945c7cf550e4acd0ebcd7bdd2e6f0aa7981fa85e2/pyarrow-22.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:c064e28361c05d72eed8e744c9605cbd6d2bb7481a511c74071fd9b24bc65d7d", size = 44892060, upload-time = "2025-10-24T10:07:26.002Z" }, - { url = "https://files.pythonhosted.org/packages/f8/ca/2f8804edd6279f78a37062d813de3f16f29183874447ef6d1aadbb4efa0f/pyarrow-22.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:6f9762274496c244d951c819348afbcf212714902742225f649cf02823a6a10f", size = 47504395, upload-time = "2025-10-24T10:07:34.09Z" }, - { url = "https://files.pythonhosted.org/packages/b9/f0/77aa5198fd3943682b2e4faaf179a674f0edea0d55d326d83cb2277d9363/pyarrow-22.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a9d9ffdc2ab696f6b15b4d1f7cec6658e1d788124418cb30030afbae31c64746", size = 48066216, upload-time = "2025-10-24T10:07:43.528Z" }, - { url = "https://files.pythonhosted.org/packages/79/87/a1937b6e78b2aff18b706d738c9e46ade5bfcf11b294e39c87706a0089ac/pyarrow-22.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ec1a15968a9d80da01e1d30349b2b0d7cc91e96588ee324ce1b5228175043e95", size = 50288552, upload-time = "2025-10-24T10:07:53.519Z" }, - { url = "https://files.pythonhosted.org/packages/60/ae/b5a5811e11f25788ccfdaa8f26b6791c9807119dffcf80514505527c384c/pyarrow-22.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:bba208d9c7decf9961998edf5c65e3ea4355d5818dd6cd0f6809bec1afb951cc", size = 28262504, upload-time = "2025-10-24T10:08:00.932Z" }, - { url = "https://files.pythonhosted.org/packages/bd/b0/0fa4d28a8edb42b0a7144edd20befd04173ac79819547216f8a9f36f9e50/pyarrow-22.0.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:9bddc2cade6561f6820d4cd73f99a0243532ad506bc510a75a5a65a522b2d74d", size = 34224062, upload-time = "2025-10-24T10:08:14.101Z" }, - { url = "https://files.pythonhosted.org/packages/0f/a8/7a719076b3c1be0acef56a07220c586f25cd24de0e3f3102b438d18ae5df/pyarrow-22.0.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:e70ff90c64419709d38c8932ea9fe1cc98415c4f87ea8da81719e43f02534bc9", size = 35990057, upload-time = "2025-10-24T10:08:21.842Z" }, - { url = "https://files.pythonhosted.org/packages/89/3c/359ed54c93b47fb6fe30ed16cdf50e3f0e8b9ccfb11b86218c3619ae50a8/pyarrow-22.0.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:92843c305330aa94a36e706c16209cd4df274693e777ca47112617db7d0ef3d7", size = 45068002, upload-time = "2025-10-24T10:08:29.034Z" }, - { url = "https://files.pythonhosted.org/packages/55/fc/4945896cc8638536ee787a3bd6ce7cec8ec9acf452d78ec39ab328efa0a1/pyarrow-22.0.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:6dda1ddac033d27421c20d7a7943eec60be44e0db4e079f33cc5af3b8280ccde", size = 47737765, upload-time = "2025-10-24T10:08:38.559Z" }, - { url = "https://files.pythonhosted.org/packages/cd/5e/7cb7edeb2abfaa1f79b5d5eb89432356155c8426f75d3753cbcb9592c0fd/pyarrow-22.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:84378110dd9a6c06323b41b56e129c504d157d1a983ce8f5443761eb5256bafc", size = 48048139, upload-time = "2025-10-24T10:08:46.784Z" }, - { url = "https://files.pythonhosted.org/packages/88/c6/546baa7c48185f5e9d6e59277c4b19f30f48c94d9dd938c2a80d4d6b067c/pyarrow-22.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:854794239111d2b88b40b6ef92aa478024d1e5074f364033e73e21e3f76b25e0", size = 50314244, upload-time = "2025-10-24T10:08:55.771Z" }, - { url = "https://files.pythonhosted.org/packages/3c/79/755ff2d145aafec8d347bf18f95e4e81c00127f06d080135dfc86aea417c/pyarrow-22.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:b883fe6fd85adad7932b3271c38ac289c65b7337c2c132e9569f9d3940620730", size = 28757501, upload-time = "2025-10-24T10:09:59.891Z" }, - { url = "https://files.pythonhosted.org/packages/0e/d2/237d75ac28ced3147912954e3c1a174df43a95f4f88e467809118a8165e0/pyarrow-22.0.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7a820d8ae11facf32585507c11f04e3f38343c1e784c9b5a8b1da5c930547fe2", size = 34355506, upload-time = "2025-10-24T10:09:02.953Z" }, - { url = "https://files.pythonhosted.org/packages/1e/2c/733dfffe6d3069740f98e57ff81007809067d68626c5faef293434d11bd6/pyarrow-22.0.0-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:c6ec3675d98915bf1ec8b3c7986422682f7232ea76cad276f4c8abd5b7319b70", size = 36047312, upload-time = "2025-10-24T10:09:10.334Z" }, - { url = "https://files.pythonhosted.org/packages/7c/2b/29d6e3782dc1f299727462c1543af357a0f2c1d3c160ce199950d9ca51eb/pyarrow-22.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:3e739edd001b04f654b166204fc7a9de896cf6007eaff33409ee9e50ceaff754", size = 45081609, upload-time = "2025-10-24T10:09:18.61Z" }, - { url = "https://files.pythonhosted.org/packages/8d/42/aa9355ecc05997915af1b7b947a7f66c02dcaa927f3203b87871c114ba10/pyarrow-22.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:7388ac685cab5b279a41dfe0a6ccd99e4dbf322edfb63e02fc0443bf24134e91", size = 47703663, upload-time = "2025-10-24T10:09:27.369Z" }, - { url = "https://files.pythonhosted.org/packages/ee/62/45abedde480168e83a1de005b7b7043fd553321c1e8c5a9a114425f64842/pyarrow-22.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f633074f36dbc33d5c05b5dc75371e5660f1dbf9c8b1d95669def05e5425989c", size = 48066543, upload-time = "2025-10-24T10:09:34.908Z" }, - { url = "https://files.pythonhosted.org/packages/84/e9/7878940a5b072e4f3bf998770acafeae13b267f9893af5f6d4ab3904b67e/pyarrow-22.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4c19236ae2402a8663a2c8f21f1870a03cc57f0bef7e4b6eb3238cc82944de80", size = 50288838, upload-time = "2025-10-24T10:09:44.394Z" }, - { url = "https://files.pythonhosted.org/packages/7b/03/f335d6c52b4a4761bcc83499789a1e2e16d9d201a58c327a9b5cc9a41bd9/pyarrow-22.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0c34fe18094686194f204a3b1787a27456897d8a2d62caf84b61e8dfbc0252ae", size = 29185594, upload-time = "2025-10-24T10:09:53.111Z" }, +version = "19.0.1" +source = { registry = "https://pypi.org/simple" } +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/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" }, + { url = "https://files.pythonhosted.org/packages/2b/8d/275c58d4b00781bd36579501a259eacc5c6dfb369be4ddeb672ceb551d2d/pyarrow-19.0.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e45274b20e524ae5c39d7fc1ca2aa923aab494776d2d4b316b49ec7572ca324c", size = 30653552, upload-time = "2025-02-18T18:53:44.357Z" }, + { url = "https://files.pythonhosted.org/packages/a0/9e/e6aca5cc4ef0c7aec5f8db93feb0bde08dbad8c56b9014216205d271101b/pyarrow-19.0.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d9dedeaf19097a143ed6da37f04f4051aba353c95ef507764d344229b2b740ae", size = 32103413, upload-time = "2025-02-18T18:53:52.971Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fa/a7033f66e5d4f1308c7eb0dfcd2ccd70f881724eb6fd1776657fdf65458f/pyarrow-19.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ebfb5171bb5f4a52319344ebbbecc731af3f021e49318c74f33d520d31ae0c4", size = 41134869, upload-time = "2025-02-18T18:53:59.471Z" }, + { url = "https://files.pythonhosted.org/packages/2d/92/34d2569be8e7abdc9d145c98dc410db0071ac579b92ebc30da35f500d630/pyarrow-19.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a21d39fbdb948857f67eacb5bbaaf36802de044ec36fbef7a1c8f0dd3a4ab2", size = 42192626, upload-time = "2025-02-18T18:54:06.062Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1f/80c617b1084fc833804dc3309aa9d8daacd46f9ec8d736df733f15aebe2c/pyarrow-19.0.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:99bc1bec6d234359743b01e70d4310d0ab240c3d6b0da7e2a93663b0158616f6", size = 40496708, upload-time = "2025-02-18T18:54:12.347Z" }, + { url = "https://files.pythonhosted.org/packages/e6/90/83698fcecf939a611c8d9a78e38e7fed7792dcc4317e29e72cf8135526fb/pyarrow-19.0.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1b93ef2c93e77c442c979b0d596af45e4665d8b96da598db145b0fec014b9136", size = 42075728, upload-time = "2025-02-18T18:54:19.364Z" }, + { url = "https://files.pythonhosted.org/packages/40/49/2325f5c9e7a1c125c01ba0c509d400b152c972a47958768e4e35e04d13d8/pyarrow-19.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:d9d46e06846a41ba906ab25302cf0fd522f81aa2a85a71021826f34639ad31ef", size = 25242568, upload-time = "2025-02-18T18:54:25.846Z" }, + { url = "https://files.pythonhosted.org/packages/3f/72/135088d995a759d4d916ec4824cb19e066585b4909ebad4ab196177aa825/pyarrow-19.0.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c0fe3dbbf054a00d1f162fda94ce236a899ca01123a798c561ba307ca38af5f0", size = 30702371, upload-time = "2025-02-18T18:54:30.665Z" }, + { url = "https://files.pythonhosted.org/packages/2e/01/00beeebd33d6bac701f20816a29d2018eba463616bbc07397fdf99ac4ce3/pyarrow-19.0.1-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:96606c3ba57944d128e8a8399da4812f56c7f61de8c647e3470b417f795d0ef9", size = 32116046, upload-time = "2025-02-18T18:54:35.995Z" }, + { url = "https://files.pythonhosted.org/packages/1f/c9/23b1ea718dfe967cbd986d16cf2a31fe59d015874258baae16d7ea0ccabc/pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f04d49a6b64cf24719c080b3c2029a3a5b16417fd5fd7c4041f94233af732f3", size = 41091183, upload-time = "2025-02-18T18:54:42.662Z" }, + { url = "https://files.pythonhosted.org/packages/3a/d4/b4a3aa781a2c715520aa8ab4fe2e7fa49d33a1d4e71c8fc6ab7b5de7a3f8/pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9137cf7e1640dce4c190551ee69d478f7121b5c6f323553b319cac936395f6", size = 42171896, upload-time = "2025-02-18T18:54:49.808Z" }, + { url = "https://files.pythonhosted.org/packages/23/1b/716d4cd5a3cbc387c6e6745d2704c4b46654ba2668260d25c402626c5ddb/pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7c1bca1897c28013db5e4c83944a2ab53231f541b9e0c3f4791206d0c0de389a", size = 40464851, upload-time = "2025-02-18T18:54:57.073Z" }, + { url = "https://files.pythonhosted.org/packages/ed/bd/54907846383dcc7ee28772d7e646f6c34276a17da740002a5cefe90f04f7/pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:58d9397b2e273ef76264b45531e9d552d8ec8a6688b7390b5be44c02a37aade8", size = 42085744, upload-time = "2025-02-18T18:55:08.562Z" }, ] [[package]] @@ -1055,7 +1228,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.12.5" +version = "2.11.10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -1063,94 +1236,65 @@ 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/ae/54/ecab642b3bed45f7d5f59b38443dcb36ef50f85af192e6ece103dbfe9587/pydantic-2.11.10.tar.gz", hash = "sha256:dc280f0982fbda6c38fada4e476dc0a4f3aeaf9c6ad4c28df68a666ec3c61423", size = 788494, upload-time = "2025-10-04T10:40:41.338Z" } 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/bd/1f/73c53fcbfb0b5a78f91176df41945ca466e71e9d9d836e5c522abda39ee7/pydantic-2.11.10-py3-none-any.whl", hash = "sha256:802a655709d49bd004c31e865ef37da30b540786a46bfce02333e0e24b5fe29a", size = 444823, upload-time = "2025-10-04T10:40:39.055Z" }, ] [[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/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, - { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, - { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, - { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, - { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, - { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, - { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, - { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, - { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, - { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, - { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, - { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, - { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, - { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, - { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, - { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, - { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, - { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, - { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, - { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, - { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, - { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, - { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, - { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, - { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, - { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, - { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, - { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, - { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, - { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, - { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, - { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, - { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, - { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, - { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, - { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, - { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, - { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, - { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, - { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, - { 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" }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload-time = "2025-04-23T18:31:53.175Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload-time = "2025-04-23T18:31:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload-time = "2025-04-23T18:31:57.393Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload-time = "2025-04-23T18:31:59.065Z" }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload-time = "2025-04-23T18:32:00.78Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload-time = "2025-04-23T18:32:02.418Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload-time = "2025-04-23T18:32:04.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload-time = "2025-04-23T18:32:06.129Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload-time = "2025-04-23T18:32:08.178Z" }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload-time = "2025-04-23T18:32:10.242Z" }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload-time = "2025-04-23T18:32:12.382Z" }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload-time = "2025-04-23T18:32:14.034Z" }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload-time = "2025-04-23T18:32:15.783Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload-time = "2025-04-23T18:32:18.473Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" }, ] [[package]] name = "pydantic-settings" -version = "2.12.0" +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/43/4b/ac7e0aae12027748076d72a8764ff1c9d82ca75a7a52622e67ed3f765c54/pydantic_settings-2.12.0.tar.gz", hash = "sha256:005538ef951e3c2a68e1c08b292b5f2e71490def8589d4221b95dab00dafcfd0", size = 194184, upload-time = "2025-11-10T14:25:47.013Z" } +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/c1/60/5d4751ba3f4a40a6891f24eec885f51afd78d208498268c734e256fb13c4/pydantic_settings-2.12.0-py3-none-any.whl", hash = "sha256:fddb9fd99a5b18da837b29710391e945b1e30c135477f484084ee513adb93809", size = 51880, upload-time = "2025-11-10T14:25:45.546Z" }, + { 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]] @@ -1176,7 +1320,8 @@ name = "pyopenssl" version = "25.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cryptography" }, + { name = "cryptography", version = "45.0.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14' and platform_python_implementation != 'PyPy'" }, + { name = "cryptography", version = "46.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14' or platform_python_implementation == 'PyPy'" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/80/be/97b83a464498a79103036bc74d1038df4a7ef0e402cfaf4d5e113fb14759/pyopenssl-25.3.0.tar.gz", hash = "sha256:c981cb0a3fd84e8602d7afc209522773b94c1c2446a3c710a75b06fe1beae329", size = 184073, upload-time = "2025-09-17T00:32:21.037Z" } @@ -1357,6 +1502,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, ] +[[package]] +name = "rich" +version = "13.9.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149, upload-time = "2024-11-01T16:43:57.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424, upload-time = "2024-11-01T16:43:55.817Z" }, +] + [[package]] name = "ruff" version = "0.12.12" @@ -1404,6 +1562,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" @@ -1415,15 +1582,17 @@ wheels = [ [[package]] name = "snowflake-connector-python" -version = "4.1.1" +version = "3.18.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asn1crypto" }, { name = "boto3" }, { name = "botocore" }, { name = "certifi" }, + { name = "cffi" }, { name = "charset-normalizer" }, - { name = "cryptography" }, + { name = "cryptography", version = "45.0.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14' and platform_python_implementation != 'PyPy'" }, + { name = "cryptography", version = "46.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14' or platform_python_implementation == 'PyPy'" }, { name = "filelock" }, { name = "idna" }, { name = "packaging" }, @@ -1436,18 +1605,18 @@ dependencies = [ { name = "tomlkit" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d7/14/ce016b3db27bdaa2a539fee8bd4597f4a940b259dbd7ead4d4a9f7265f0b/snowflake_connector_python-4.1.1.tar.gz", hash = "sha256:63fe4ba6dc4b93b293e93d92d4d6eadbf74a665a9b8d19bab5cc104fdc30f52b", size = 823057, upload-time = "2025-12-02T15:41:25.637Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/df/41fe26b68801e3d59653a5dc7ce87a92e9d967dcad7b59b035b8c9804815/snowflake_connector_python-3.18.0.tar.gz", hash = "sha256:41a46eb9824574c5f8068e3ed5c02a2dc0a733ed08ee81fa1fb3dd0ebe921728", size = 798019, upload-time = "2025-10-06T12:15:34.301Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/99/63d8db9185d30cf79259f19c5a08658f34b7cc4ab48f5ab1b3d58e57db72/snowflake_connector_python-4.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0d7ab4c9103d0fd36281c6012c5d6e3bd266319c36c7870025d4b08715124f11", size = 1035943, upload-time = "2025-12-02T15:41:33.342Z" }, - { url = "https://files.pythonhosted.org/packages/f7/32/834c349843f9ce93f94ae62fdfe21f53615c1337b023386d024095c392a0/snowflake_connector_python-4.1.1-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:9ebd97def4f9613f76635f13570c1381c3896ce0aa99fb43eb6229e3971ab5bb", size = 1047570, upload-time = "2025-12-02T15:41:34.839Z" }, - { url = "https://files.pythonhosted.org/packages/cf/d0/40dac901ffc7492f01830dbda0dc9dec60613c60d4a9f78efd5fdc617af4/snowflake_connector_python-4.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cd8bc41145e28365196fce51a960084458d807749f723a828487c20742129b6", size = 2739830, upload-time = "2025-12-02T15:41:14.567Z" }, - { url = "https://files.pythonhosted.org/packages/53/53/5d8654c4533e1dab7610080a8d216b543eeb6a353276c9735abad27ab9c0/snowflake_connector_python-4.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed349014a842295ab31542cdde1371271fb3cbe54fff597b46d43b02cfc414a0", size = 2774356, upload-time = "2025-12-02T15:41:16.042Z" }, - { url = "https://files.pythonhosted.org/packages/89/f3/da4d3a645fd107aed5091e48f7c886bbfd42cc28b3d16475d565875c926c/snowflake_connector_python-4.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eb79abfaef1c97d4c3f0754a9449aa5eedd033b5bd58c9526ff6500d4c111889", size = 1185528, upload-time = "2025-12-02T15:41:48.338Z" }, - { url = "https://files.pythonhosted.org/packages/c5/b5/44cf63ca67dd67f6a5cf272f78a272a8674d9adae7402e9e0cb4db4861cb/snowflake_connector_python-4.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19da9fa6c50ab7b9ea1751f32388949f7cbe291b676fdffcd38cd1b1a83876a3", size = 1036794, upload-time = "2025-12-02T15:41:36.446Z" }, - { url = "https://files.pythonhosted.org/packages/d7/3d/68e231f565e07b1955b06a0237f4ef447957db83966a331b24fde157e646/snowflake_connector_python-4.1.1-cp313-cp313-macosx_11_0_x86_64.whl", hash = "sha256:beab9851f8328712fa3682f2b46edbb9bfa6ec1487eea4f7b146a78ba62bb97c", size = 1048578, upload-time = "2025-12-02T15:41:38.889Z" }, - { url = "https://files.pythonhosted.org/packages/d8/e9/b929c9a994b1871e71227acce6ff700957ae8d419d364d02b584e6818243/snowflake_connector_python-4.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c1e6c67fc8907992995c81bd4c7e5661e1871dbd83cd45766505d6ac65cf5f1", size = 2706370, upload-time = "2025-12-02T15:41:17.326Z" }, - { url = "https://files.pythonhosted.org/packages/9a/17/32ca1bea0eda8b0fd23b5b281ff3c5bf95a4417bcb22897d75f52b8d5781/snowflake_connector_python-4.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65ca9eac3ff90888cb8d20edcbc3c42a5fb1c93782249e7766259ea7db9c9cfc", size = 2740811, upload-time = "2025-12-02T15:41:20.02Z" }, - { url = "https://files.pythonhosted.org/packages/64/9e/98b433d41ffbec9ed123ec9132a04a109b184d060f18ceefd4f718021141/snowflake_connector_python-4.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:5d5c0ea78d90bd241c05e3998066fc42de1f2813e20c6a75b85e90ef562335bc", size = 1185525, upload-time = "2025-12-02T15:41:49.7Z" }, + { url = "https://files.pythonhosted.org/packages/da/67/0df7829f295988c121f385c562d60c7a4989bc8f72885d04669ce5cd6516/snowflake_connector_python-3.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fee7035f865088f948510b094101c8a0e5b22501891f2115f7fb1cb555de76a", size = 1013717, upload-time = "2025-10-06T12:15:41.906Z" }, + { url = "https://files.pythonhosted.org/packages/4d/90/35353d5311735ebe85f0224f3a6e4f136c29e1b3e4ce6c7466c9b7e7931b/snowflake_connector_python-3.18.0-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:283366b35df88cd0c71caf0215ba80370ddef4dd37d2adf43b24208c747231ee", size = 1025471, upload-time = "2025-10-06T12:15:43.073Z" }, + { url = "https://files.pythonhosted.org/packages/ec/16/d490c00546ca8842d314de689ac718c73c9fe0f9b042e06703449282de7c/snowflake_connector_python-3.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e4c285cc6a7f6431cff98c8f235a0fe9da2262462dd3dfc2b97120574a95cf9", size = 2684000, upload-time = "2025-10-06T12:15:23.411Z" }, + { url = "https://files.pythonhosted.org/packages/d3/cb/4bc697af4138e17cccde506f28233492a6e1919ced7a65aa31b6f1e8bb6c/snowflake_connector_python-3.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94e041e347b5151b66d19d6cfc3b3172dac1f51e44bbf7cf58f3989427dd464a", size = 2715472, upload-time = "2025-10-06T12:15:25.062Z" }, + { url = "https://files.pythonhosted.org/packages/d9/72/815a4b9795ddce224a1392849dd34a408f2dac240bcdcb0539d42cfd31b1/snowflake_connector_python-3.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:7116cfa410d517328fd25fabffb54845b88667586718578c4333ce034fead1ba", size = 1160435, upload-time = "2025-10-06T12:15:55.046Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e6/b75caca8bcfeae1bc999bf70c9cb54a73607f361a3f1ef0b679e2bd850a6/snowflake_connector_python-3.18.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4ed2d593f1983939d5d8d88b212d86fd4f14f0ceefc1df9882b4a18534adbde9", size = 1014849, upload-time = "2025-10-06T12:15:44.228Z" }, + { url = "https://files.pythonhosted.org/packages/4b/03/0420ebed3b9326e738ab06f8d3f80d9d430054e181ddfe3bf908d87ea5f9/snowflake_connector_python-3.18.0-cp313-cp313-macosx_11_0_x86_64.whl", hash = "sha256:b99f261c82be92224ac20c8c12bdf26ce3ed5dfd8a3df8a97f15a1e11c46ad27", size = 1026296, upload-time = "2025-10-06T12:15:46.82Z" }, + { url = "https://files.pythonhosted.org/packages/d5/04/a467a3bc6d59fd77b7628086a32102711cfb337b0920c3dac340a29f27e8/snowflake_connector_python-3.18.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51eb789a09dc6c62119cfabd044fba1a6b8378206f05a1e83ddb2e9cb49acc0b", size = 2685839, upload-time = "2025-10-06T12:15:26.475Z" }, + { url = "https://files.pythonhosted.org/packages/29/70/0ae9d661d405720b7e3bcea425f1915475b457e4a17fec4eb28b8bd91d35/snowflake_connector_python-3.18.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd1de3038b6d7059ca59f93e105aba2a673151c693cc4292f72f38bfaf147df2", size = 2718059, upload-time = "2025-10-06T12:15:27.765Z" }, + { url = "https://files.pythonhosted.org/packages/9d/38/ea46bbe910bd44ce52aaeea2fefe072392c7c6f3c04bfd0aea3f8fdd5e3a/snowflake_connector_python-3.18.0-cp313-cp313-win_amd64.whl", hash = "sha256:aeeb181a156333480f60b5f8ddbb3d087e288b4509adbef7993236defe4d7570", size = 1160453, upload-time = "2025-10-06T12:15:58.405Z" }, ] [[package]] @@ -1493,6 +1662,27 @@ 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 = "tenacity" +version = "9.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload-time = "2025-04-02T08:25:09.966Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload-time = "2025-04-02T08:25:07.678Z" }, +] + [[package]] name = "tomlkit" version = "0.13.3" @@ -1530,6 +1720,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, ] +[[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"