Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 14 additions & 6 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,21 @@ GEMINI_API_KEY=your_gemini_api_key_here
# =============================================================================
# GOOGLE CLOUD (for GCS storage, Google Docs, and BigQuery)
# =============================================================================
# Service account credentials (JSON file path or JSON string)
# Used for: GCS storage, Google Docs API, and BigQuery
# Use Application Default Credentials (ADC) for Google auth.
# Local setup:
# gcloud auth application-default login
# Service account impersonation, if preferred:
# gcloud auth application-default login --impersonate-service-account service-account@project.iam.gserviceaccount.com
# On GCE/Cloud Run/GitHub WIF, ADC uses the attached or federated service account.
#
# GOOGLE_APPLICATION_CREDENTIALS is intentionally unset for normal ADC auth.
# Set it only if you must use a local service-account keyfile fallback.
# GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json
#
# Used for: GCS storage, Google Docs API, and BigQuery.
# Required scopes for Google Docs:
# - https://www.googleapis.com/auth/documents
# - https://www.googleapis.com/auth/drive
GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json
GCS_BUCKET_NAME=your_gcs_bucket_name

# Google Docs Integration (optional)
Expand All @@ -89,9 +98,8 @@ GOOGLE_DRIVE_FOLDER_ID=your_google_drive_folder_id_here
# Note: This can be the same as GOOGLE_DRIVE_FOLDER_ID if using one folder
REALTOR_GDRIVE_FOLDER_ID=your_realtor_folder_id_here

# BigQuery credentials (path to service account JSON on local dev)
# On GCE the attached VM service account is used automatically via ADC.
# GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json
# BigQuery auth is through ADC. No service-account keyfile is required when
# local ADC, attached service accounts, or workload identity federation are configured.

# =============================================================================
# DBT
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
- Prefer small, focused commits with clear intent.
- PRs should include a concise summary, linked issues (if applicable), and screenshots for UI changes.
- Never merge PRs. Always leave merging to a human reviewer.
- Add a PR comment tagging `@codex` to request review.
- Add a PR comment tagging `@codex` to request review immediately after opening every PR. Use `gh pr comment <PR_NUMBER> --body "@codex please review this PR."` and mention the review request in the handoff.

## Data Request Scoping (Wizard Loop 1)

Expand Down
60 changes: 30 additions & 30 deletions dbt_project/macros/calculate_commodity_analysis_return.sql
Original file line number Diff line number Diff line change
Expand Up @@ -68,18 +68,18 @@ rolling_stats AS (

MAX(current_price) OVER (
PARTITION BY commodity_name, commodity_unit
ORDER BY date
RANGE BETWEEN INTERVAL 365 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 365 PRECEDING AND CURRENT ROW
) AS high_1yr,
MIN(current_price) OVER (
PARTITION BY commodity_name, commodity_unit
ORDER BY date
RANGE BETWEEN INTERVAL 365 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 365 PRECEDING AND CURRENT ROW
) AS low_1yr,
STDDEV(daily_diff) OVER (
PARTITION BY commodity_name, commodity_unit
ORDER BY date
RANGE BETWEEN INTERVAL 365 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 365 PRECEDING AND CURRENT ROW
) AS std_diff_1yr,
price_365d_ago AS price_start_1yr,
CASE
Expand All @@ -90,18 +90,18 @@ rolling_stats AS (

MAX(current_price) OVER (
PARTITION BY commodity_name, commodity_unit
ORDER BY date
RANGE BETWEEN INTERVAL 270 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 270 PRECEDING AND CURRENT ROW
) AS high_9mo,
MIN(current_price) OVER (
PARTITION BY commodity_name, commodity_unit
ORDER BY date
RANGE BETWEEN INTERVAL 270 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 270 PRECEDING AND CURRENT ROW
) AS low_9mo,
STDDEV(daily_diff) OVER (
PARTITION BY commodity_name, commodity_unit
ORDER BY date
RANGE BETWEEN INTERVAL 270 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 270 PRECEDING AND CURRENT ROW
) AS std_diff_9mo,
price_270d_ago AS price_start_9mo,
CASE
Expand All @@ -112,18 +112,18 @@ rolling_stats AS (

MAX(current_price) OVER (
PARTITION BY commodity_name, commodity_unit
ORDER BY date
RANGE BETWEEN INTERVAL 180 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 180 PRECEDING AND CURRENT ROW
) AS high_6mo,
MIN(current_price) OVER (
PARTITION BY commodity_name, commodity_unit
ORDER BY date
RANGE BETWEEN INTERVAL 180 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 180 PRECEDING AND CURRENT ROW
) AS low_6mo,
STDDEV(daily_diff) OVER (
PARTITION BY commodity_name, commodity_unit
ORDER BY date
RANGE BETWEEN INTERVAL 180 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 180 PRECEDING AND CURRENT ROW
) AS std_diff_6mo,
price_180d_ago AS price_start_6mo,
CASE
Expand All @@ -134,18 +134,18 @@ rolling_stats AS (

MAX(current_price) OVER (
PARTITION BY commodity_name, commodity_unit
ORDER BY date
RANGE BETWEEN INTERVAL 90 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 90 PRECEDING AND CURRENT ROW
) AS high_3mo,
MIN(current_price) OVER (
PARTITION BY commodity_name, commodity_unit
ORDER BY date
RANGE BETWEEN INTERVAL 90 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 90 PRECEDING AND CURRENT ROW
) AS low_3mo,
STDDEV(daily_diff) OVER (
PARTITION BY commodity_name, commodity_unit
ORDER BY date
RANGE BETWEEN INTERVAL 90 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 90 PRECEDING AND CURRENT ROW
) AS std_diff_3mo,
price_90d_ago AS price_start_3mo,
CASE
Expand All @@ -156,18 +156,18 @@ rolling_stats AS (

MAX(current_price) OVER (
PARTITION BY commodity_name, commodity_unit
ORDER BY date
RANGE BETWEEN INTERVAL 30 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 30 PRECEDING AND CURRENT ROW
) AS high_1mo,
MIN(current_price) OVER (
PARTITION BY commodity_name, commodity_unit
ORDER BY date
RANGE BETWEEN INTERVAL 30 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 30 PRECEDING AND CURRENT ROW
) AS low_1mo,
STDDEV(daily_diff) OVER (
PARTITION BY commodity_name, commodity_unit
ORDER BY date
RANGE BETWEEN INTERVAL 30 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 30 PRECEDING AND CURRENT ROW
) AS std_diff_1mo,
price_30d_ago AS price_start_1mo,
CASE
Expand Down
12 changes: 12 additions & 0 deletions dbt_project/macros/calculate_commodity_summary.sql
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,13 @@ start_prices AS (
FROM period_boundaries AS pb
INNER JOIN filtered_data AS fd ON
pb.commodity_name = fd.commodity_name
AND pb.commodity_unit = fd.commodity_unit
AND pb.time_period = fd.time_period
AND pb.period_start_date = fd.trade_date
QUALIFY ROW_NUMBER() OVER (
PARTITION BY pb.commodity_name, pb.commodity_unit, pb.time_period
ORDER BY fd.trade_date ASC, fd.price ASC
) = 1
),

end_prices AS (
Expand All @@ -100,8 +105,13 @@ end_prices AS (
FROM period_boundaries AS pb
INNER JOIN filtered_data AS fd ON
pb.commodity_name = fd.commodity_name
AND pb.commodity_unit = fd.commodity_unit
AND pb.time_period = fd.time_period
AND pb.period_end_date = fd.trade_date
QUALIFY ROW_NUMBER() OVER (
PARTITION BY pb.commodity_name, pb.commodity_unit, pb.time_period
ORDER BY fd.trade_date DESC, fd.price DESC
) = 1
),

-- Main aggregation
Expand Down Expand Up @@ -140,10 +150,12 @@ combined_results AS (
LEFT JOIN start_prices AS sp
ON
ar.commodity_name = sp.commodity_name
AND ar.commodity_unit = sp.commodity_unit
AND ar.time_period = sp.time_period
LEFT JOIN end_prices AS ep
ON
ar.commodity_name = ep.commodity_name
AND ar.commodity_unit = ep.commodity_unit
AND ar.time_period = ep.time_period
),

Expand Down
60 changes: 30 additions & 30 deletions dbt_project/macros/calculate_market_analysis_return.sql
Original file line number Diff line number Diff line change
Expand Up @@ -88,18 +88,18 @@ rolling_stats AS (

MAX(current_high) OVER (
PARTITION BY symbol, exchange
ORDER BY date
RANGE BETWEEN INTERVAL 365 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 365 PRECEDING AND CURRENT ROW
) AS high_1yr,
MIN(current_low) OVER (
PARTITION BY symbol, exchange
ORDER BY date
RANGE BETWEEN INTERVAL 365 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 365 PRECEDING AND CURRENT ROW
) AS low_1yr,
STDDEV(daily_diff) OVER (
PARTITION BY symbol, exchange
ORDER BY date
RANGE BETWEEN INTERVAL 365 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 365 PRECEDING AND CURRENT ROW
) AS std_diff_1yr,
price_365d_ago AS price_start_1yr,
CASE
Expand All @@ -110,18 +110,18 @@ rolling_stats AS (

MAX(current_high) OVER (
PARTITION BY symbol, exchange
ORDER BY date
RANGE BETWEEN INTERVAL 270 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 270 PRECEDING AND CURRENT ROW
) AS high_9mo,
MIN(current_low) OVER (
PARTITION BY symbol, exchange
ORDER BY date
RANGE BETWEEN INTERVAL 270 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 270 PRECEDING AND CURRENT ROW
) AS low_9mo,
STDDEV(daily_diff) OVER (
PARTITION BY symbol, exchange
ORDER BY date
RANGE BETWEEN INTERVAL 270 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 270 PRECEDING AND CURRENT ROW
) AS std_diff_9mo,
price_270d_ago AS price_start_9mo,
CASE
Expand All @@ -132,18 +132,18 @@ rolling_stats AS (

MAX(current_high) OVER (
PARTITION BY symbol, exchange
ORDER BY date
RANGE BETWEEN INTERVAL 180 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 180 PRECEDING AND CURRENT ROW
) AS high_6mo,
MIN(current_low) OVER (
PARTITION BY symbol, exchange
ORDER BY date
RANGE BETWEEN INTERVAL 180 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 180 PRECEDING AND CURRENT ROW
) AS low_6mo,
STDDEV(daily_diff) OVER (
PARTITION BY symbol, exchange
ORDER BY date
RANGE BETWEEN INTERVAL 180 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 180 PRECEDING AND CURRENT ROW
) AS std_diff_6mo,
price_180d_ago AS price_start_6mo,
CASE
Expand All @@ -154,18 +154,18 @@ rolling_stats AS (

MAX(current_high) OVER (
PARTITION BY symbol, exchange
ORDER BY date
RANGE BETWEEN INTERVAL 90 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 90 PRECEDING AND CURRENT ROW
) AS high_3mo,
MIN(current_low) OVER (
PARTITION BY symbol, exchange
ORDER BY date
RANGE BETWEEN INTERVAL 90 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 90 PRECEDING AND CURRENT ROW
) AS low_3mo,
STDDEV(daily_diff) OVER (
PARTITION BY symbol, exchange
ORDER BY date
RANGE BETWEEN INTERVAL 90 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 90 PRECEDING AND CURRENT ROW
) AS std_diff_3mo,
price_90d_ago AS price_start_3mo,
CASE
Expand All @@ -176,18 +176,18 @@ rolling_stats AS (

MAX(current_high) OVER (
PARTITION BY symbol, exchange
ORDER BY date
RANGE BETWEEN INTERVAL 30 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 30 PRECEDING AND CURRENT ROW
) AS high_1mo,
MIN(current_low) OVER (
PARTITION BY symbol, exchange
ORDER BY date
RANGE BETWEEN INTERVAL 30 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 30 PRECEDING AND CURRENT ROW
) AS low_1mo,
STDDEV(daily_diff) OVER (
PARTITION BY symbol, exchange
ORDER BY date
RANGE BETWEEN INTERVAL 30 DAY PRECEDING AND CURRENT ROW
ORDER BY UNIX_DATE(date)
RANGE BETWEEN 30 PRECEDING AND CURRENT ROW
) AS std_diff_1mo,
price_30d_ago AS price_start_1mo,
CASE
Expand Down
Loading
Loading