From 28f239e8cdd5b2b8363d093d88421ae19d7517c0 Mon Sep 17 00:00:00 2001 From: lmiranda Date: Sun, 18 Jan 2026 22:31:07 -0500 Subject: [PATCH] fix: Update all notebooks to load .env for database credentials All 15 notebooks now use load_dotenv('../../.env') instead of hardcoded fallback credentials. Co-Authored-By: Claude Opus 4.5 --- .../amenities/amenity_index_choropleth.ipynb | 8 +++-- .../amenities/transit_accessibility_bar.ipynb | 8 +++-- notebooks/demographics/age_distribution.ipynb | 8 +++-- .../demographics/income_choropleth.ipynb | 8 +++-- .../demographics/population_density_bar.ipynb | 8 +++-- .../housing/affordability_choropleth.ipynb | 8 +++-- notebooks/housing/rent_trend_line.ipynb | 8 +++-- notebooks/housing/tenure_breakdown_bar.ipynb | 8 +++-- .../overview/income_safety_scatter.ipynb | 8 +++-- .../overview/livability_choropleth.ipynb | 29 +------------------ notebooks/overview/top_bottom_10_bar.ipynb | 8 +++-- notebooks/safety/crime_breakdown_bar.ipynb | 8 +++-- notebooks/safety/crime_rate_choropleth.ipynb | 8 +++-- notebooks/safety/crime_trend_line.ipynb | 8 +++-- 14 files changed, 79 insertions(+), 54 deletions(-) diff --git a/notebooks/amenities/amenity_index_choropleth.ipynb b/notebooks/amenities/amenity_index_choropleth.ipynb index 6e09263..11ffbbe 100644 --- a/notebooks/amenities/amenity_index_choropleth.ipynb +++ b/notebooks/amenities/amenity_index_choropleth.ipynb @@ -19,7 +19,7 @@ "\n", "| Table | Grain | Key Columns |\n", "|-------|-------|-------------|\n", - "| `mart_neighbourhood_amenities` | neighbourhood × year | amenity_index, total_amenities_per_1000, amenity_tier, geometry |\n", + "| `mart_neighbourhood_amenities` | neighbourhood \u00d7 year | amenity_index, total_amenities_per_1000, amenity_tier, geometry |\n", "\n", "### SQL Query" ] @@ -32,9 +32,13 @@ "source": [ "import pandas as pd\n", "from sqlalchemy import create_engine\n", + "from dotenv import load_dotenv\n", "import os\n", "\n", - "engine = create_engine(os.environ.get('DATABASE_URL', 'postgresql://portfolio:portfolio@localhost:5432/portfolio'))\n", + "# Load .env from project root\n", + "load_dotenv('../../.env')\n", + "\n", + "engine = create_engine(os.environ.get('DATABASE_URL'))\n", "\n", "query = \"\"\"\n", "SELECT\n", diff --git a/notebooks/amenities/transit_accessibility_bar.ipynb b/notebooks/amenities/transit_accessibility_bar.ipynb index 634a7e0..0635a15 100644 --- a/notebooks/amenities/transit_accessibility_bar.ipynb +++ b/notebooks/amenities/transit_accessibility_bar.ipynb @@ -19,7 +19,7 @@ "\n", "| Table | Grain | Key Columns |\n", "|-------|-------|-------------|\n", - "| `mart_neighbourhood_amenities` | neighbourhood × year | transit_per_1000, transit_index, transit_count |\n", + "| `mart_neighbourhood_amenities` | neighbourhood \u00d7 year | transit_per_1000, transit_index, transit_count |\n", "\n", "### SQL Query" ] @@ -32,9 +32,13 @@ "source": [ "import pandas as pd\n", "from sqlalchemy import create_engine\n", + "from dotenv import load_dotenv\n", "import os\n", "\n", - "engine = create_engine(os.environ.get('DATABASE_URL', 'postgresql://portfolio:portfolio@localhost:5432/portfolio'))\n", + "# Load .env from project root\n", + "load_dotenv('../../.env')\n", + "\n", + "engine = create_engine(os.environ.get('DATABASE_URL'))\n", "\n", "query = \"\"\"\n", "SELECT\n", diff --git a/notebooks/demographics/age_distribution.ipynb b/notebooks/demographics/age_distribution.ipynb index b0a1a1e..64ec4b2 100644 --- a/notebooks/demographics/age_distribution.ipynb +++ b/notebooks/demographics/age_distribution.ipynb @@ -19,7 +19,7 @@ "\n", "| Table | Grain | Key Columns |\n", "|-------|-------|-------------|\n", - "| `mart_neighbourhood_demographics` | neighbourhood × year | median_age, age_index, city_avg_age |\n", + "| `mart_neighbourhood_demographics` | neighbourhood \u00d7 year | median_age, age_index, city_avg_age |\n", "\n", "### SQL Query" ] @@ -32,9 +32,13 @@ "source": [ "import pandas as pd\n", "from sqlalchemy import create_engine\n", + "from dotenv import load_dotenv\n", "import os\n", "\n", - "engine = create_engine(os.environ.get('DATABASE_URL', 'postgresql://portfolio:portfolio@localhost:5432/portfolio'))\n", + "# Load .env from project root\n", + "load_dotenv('../../.env')\n", + "\n", + "engine = create_engine(os.environ.get('DATABASE_URL'))\n", "\n", "query = \"\"\"\n", "SELECT\n", diff --git a/notebooks/demographics/income_choropleth.ipynb b/notebooks/demographics/income_choropleth.ipynb index 8e221a2..73115a5 100644 --- a/notebooks/demographics/income_choropleth.ipynb +++ b/notebooks/demographics/income_choropleth.ipynb @@ -19,7 +19,7 @@ "\n", "| Table | Grain | Key Columns |\n", "|-------|-------|-------------|\n", - "| `mart_neighbourhood_demographics` | neighbourhood × year | median_household_income, income_index, income_quintile, geometry |\n", + "| `mart_neighbourhood_demographics` | neighbourhood \u00d7 year | median_household_income, income_index, income_quintile, geometry |\n", "\n", "### SQL Query" ] @@ -32,9 +32,13 @@ "source": [ "import pandas as pd\n", "from sqlalchemy import create_engine\n", + "from dotenv import load_dotenv\n", "import os\n", "\n", - "engine = create_engine(os.environ.get('DATABASE_URL', 'postgresql://portfolio:portfolio@localhost:5432/portfolio'))\n", + "# Load .env from project root\n", + "load_dotenv('../../.env')\n", + "\n", + "engine = create_engine(os.environ.get('DATABASE_URL'))\n", "\n", "query = \"\"\"\n", "SELECT\n", diff --git a/notebooks/demographics/population_density_bar.ipynb b/notebooks/demographics/population_density_bar.ipynb index af96dac..27b073a 100644 --- a/notebooks/demographics/population_density_bar.ipynb +++ b/notebooks/demographics/population_density_bar.ipynb @@ -19,7 +19,7 @@ "\n", "| Table | Grain | Key Columns |\n", "|-------|-------|-------------|\n", - "| `mart_neighbourhood_demographics` | neighbourhood × year | population_density, population, land_area_sqkm |\n", + "| `mart_neighbourhood_demographics` | neighbourhood \u00d7 year | population_density, population, land_area_sqkm |\n", "\n", "### SQL Query" ] @@ -32,9 +32,13 @@ "source": [ "import pandas as pd\n", "from sqlalchemy import create_engine\n", + "from dotenv import load_dotenv\n", "import os\n", "\n", - "engine = create_engine(os.environ.get('DATABASE_URL', 'postgresql://portfolio:portfolio@localhost:5432/portfolio'))\n", + "# Load .env from project root\n", + "load_dotenv('../../.env')\n", + "\n", + "engine = create_engine(os.environ.get('DATABASE_URL'))\n", "\n", "query = \"\"\"\n", "SELECT\n", diff --git a/notebooks/housing/affordability_choropleth.ipynb b/notebooks/housing/affordability_choropleth.ipynb index ae04b52..63534b2 100644 --- a/notebooks/housing/affordability_choropleth.ipynb +++ b/notebooks/housing/affordability_choropleth.ipynb @@ -19,7 +19,7 @@ "\n", "| Table | Grain | Key Columns |\n", "|-------|-------|-------------|\n", - "| `mart_neighbourhood_housing` | neighbourhood × year | affordability_index, rent_to_income_pct, avg_rent_2bed, geometry |\n", + "| `mart_neighbourhood_housing` | neighbourhood \u00d7 year | affordability_index, rent_to_income_pct, avg_rent_2bed, geometry |\n", "\n", "### SQL Query" ] @@ -32,9 +32,13 @@ "source": [ "import pandas as pd\n", "from sqlalchemy import create_engine\n", + "from dotenv import load_dotenv\n", "import os\n", "\n", - "engine = create_engine(os.environ.get('DATABASE_URL', 'postgresql://portfolio:portfolio@localhost:5432/portfolio'))\n", + "# Load .env from project root\n", + "load_dotenv('../../.env')\n", + "\n", + "engine = create_engine(os.environ.get('DATABASE_URL'))\n", "\n", "query = \"\"\"\n", "SELECT\n", diff --git a/notebooks/housing/rent_trend_line.ipynb b/notebooks/housing/rent_trend_line.ipynb index 50f4c51..8299cf3 100644 --- a/notebooks/housing/rent_trend_line.ipynb +++ b/notebooks/housing/rent_trend_line.ipynb @@ -19,7 +19,7 @@ "\n", "| Table | Grain | Key Columns |\n", "|-------|-------|-------------|\n", - "| `mart_neighbourhood_housing` | neighbourhood × year | year, avg_rent_2bed, rent_yoy_change_pct |\n", + "| `mart_neighbourhood_housing` | neighbourhood \u00d7 year | year, avg_rent_2bed, rent_yoy_change_pct |\n", "\n", "### SQL Query" ] @@ -32,9 +32,13 @@ "source": [ "import pandas as pd\n", "from sqlalchemy import create_engine\n", + "from dotenv import load_dotenv\n", "import os\n", "\n", - "engine = create_engine(os.environ.get('DATABASE_URL', 'postgresql://portfolio:portfolio@localhost:5432/portfolio'))\n", + "# Load .env from project root\n", + "load_dotenv('../../.env')\n", + "\n", + "engine = create_engine(os.environ.get('DATABASE_URL'))\n", "\n", "# City-wide average rent by year\n", "query = \"\"\"\n", diff --git a/notebooks/housing/tenure_breakdown_bar.ipynb b/notebooks/housing/tenure_breakdown_bar.ipynb index d2c2efd..084a27f 100644 --- a/notebooks/housing/tenure_breakdown_bar.ipynb +++ b/notebooks/housing/tenure_breakdown_bar.ipynb @@ -19,7 +19,7 @@ "\n", "| Table | Grain | Key Columns |\n", "|-------|-------|-------------|\n", - "| `mart_neighbourhood_housing` | neighbourhood × year | pct_owner_occupied, pct_renter_occupied, income_quintile |\n", + "| `mart_neighbourhood_housing` | neighbourhood \u00d7 year | pct_owner_occupied, pct_renter_occupied, income_quintile |\n", "\n", "### SQL Query" ] @@ -32,9 +32,13 @@ "source": [ "import pandas as pd\n", "from sqlalchemy import create_engine\n", + "from dotenv import load_dotenv\n", "import os\n", "\n", - "engine = create_engine(os.environ.get('DATABASE_URL', 'postgresql://portfolio:portfolio@localhost:5432/portfolio'))\n", + "# Load .env from project root\n", + "load_dotenv('../../.env')\n", + "\n", + "engine = create_engine(os.environ.get('DATABASE_URL'))\n", "\n", "query = \"\"\"\n", "SELECT\n", diff --git a/notebooks/overview/income_safety_scatter.ipynb b/notebooks/overview/income_safety_scatter.ipynb index b4431be..86fb16c 100644 --- a/notebooks/overview/income_safety_scatter.ipynb +++ b/notebooks/overview/income_safety_scatter.ipynb @@ -19,7 +19,7 @@ "\n", "| Table | Grain | Key Columns |\n", "|-------|-------|-------------|\n", - "| `mart_neighbourhood_overview` | neighbourhood × year | neighbourhood_name, median_household_income, safety_score, population |\n", + "| `mart_neighbourhood_overview` | neighbourhood \u00d7 year | neighbourhood_name, median_household_income, safety_score, population |\n", "\n", "### SQL Query" ] @@ -32,9 +32,13 @@ "source": [ "import pandas as pd\n", "from sqlalchemy import create_engine\n", + "from dotenv import load_dotenv\n", "import os\n", "\n", - "engine = create_engine(os.environ.get('DATABASE_URL', 'postgresql://portfolio:portfolio@localhost:5432/portfolio'))\n", + "# Load .env from project root\n", + "load_dotenv('../../.env')\n", + "\n", + "engine = create_engine(os.environ.get('DATABASE_URL'))\n", "\n", "query = \"\"\"\n", "SELECT\n", diff --git a/notebooks/overview/livability_choropleth.ipynb b/notebooks/overview/livability_choropleth.ipynb index 4664c6f..1b110a6 100644 --- a/notebooks/overview/livability_choropleth.ipynb +++ b/notebooks/overview/livability_choropleth.ipynb @@ -29,34 +29,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "import pandas as pd\n", - "from sqlalchemy import create_engine\n", - "import os\n", - "\n", - "# Connect to database\n", - "engine = create_engine(os.environ.get('DATABASE_URL', 'postgresql://portfolio:portfolio@localhost:5432/portfolio'))\n", - "\n", - "query = \"\"\"\n", - "SELECT\n", - " neighbourhood_id,\n", - " neighbourhood_name,\n", - " geometry,\n", - " year,\n", - " livability_score,\n", - " safety_score,\n", - " affordability_score,\n", - " amenity_score,\n", - " population,\n", - " median_household_income\n", - "FROM public_marts.mart_neighbourhood_overview\n", - "WHERE year = (SELECT MAX(year) FROM public_marts.mart_neighbourhood_overview)\n", - "ORDER BY livability_score DESC\n", - "\"\"\"\n", - "\n", - "df = pd.read_sql(query, engine)\n", - "print(f\"Loaded {len(df)} neighbourhoods\")" - ] + "source": "import pandas as pd\nfrom sqlalchemy import create_engine\nfrom dotenv import load_dotenv\nimport os\n\n# Load .env from project root\nload_dotenv('../../.env')\n\nengine = create_engine(os.environ.get('DATABASE_URL'))\n\nquery = \"\"\"\nSELECT\n neighbourhood_id,\n neighbourhood_name,\n geometry,\n year,\n livability_score,\n safety_score,\n affordability_score,\n amenity_score,\n population,\n median_household_income\nFROM public_marts.mart_neighbourhood_overview\nWHERE year = (SELECT MAX(year) FROM public_marts.mart_neighbourhood_overview)\nORDER BY livability_score DESC\n\"\"\"\n\ndf = pd.read_sql(query, engine)\nprint(f\"Loaded {len(df)} neighbourhoods\")" }, { "cell_type": "markdown", diff --git a/notebooks/overview/top_bottom_10_bar.ipynb b/notebooks/overview/top_bottom_10_bar.ipynb index bc816a1..2b204d9 100644 --- a/notebooks/overview/top_bottom_10_bar.ipynb +++ b/notebooks/overview/top_bottom_10_bar.ipynb @@ -19,7 +19,7 @@ "\n", "| Table | Grain | Key Columns |\n", "|-------|-------|-------------|\n", - "| `mart_neighbourhood_overview` | neighbourhood × year | neighbourhood_name, livability_score |\n", + "| `mart_neighbourhood_overview` | neighbourhood \u00d7 year | neighbourhood_name, livability_score |\n", "\n", "### SQL Query" ] @@ -32,9 +32,13 @@ "source": [ "import pandas as pd\n", "from sqlalchemy import create_engine\n", + "from dotenv import load_dotenv\n", "import os\n", "\n", - "engine = create_engine(os.environ.get('DATABASE_URL', 'postgresql://portfolio:portfolio@localhost:5432/portfolio'))\n", + "# Load .env from project root\n", + "load_dotenv('../../.env')\n", + "\n", + "engine = create_engine(os.environ.get('DATABASE_URL'))\n", "\n", "query = \"\"\"\n", "SELECT\n", diff --git a/notebooks/safety/crime_breakdown_bar.ipynb b/notebooks/safety/crime_breakdown_bar.ipynb index c982987..5e5fb46 100644 --- a/notebooks/safety/crime_breakdown_bar.ipynb +++ b/notebooks/safety/crime_breakdown_bar.ipynb @@ -19,7 +19,7 @@ "\n", "| Table | Grain | Key Columns |\n", "|-------|-------|-------------|\n", - "| `mart_neighbourhood_safety` | neighbourhood × year | assault_count, auto_theft_count, break_enter_count, robbery_count, etc. |\n", + "| `mart_neighbourhood_safety` | neighbourhood \u00d7 year | assault_count, auto_theft_count, break_enter_count, robbery_count, etc. |\n", "\n", "### SQL Query" ] @@ -32,9 +32,13 @@ "source": [ "import pandas as pd\n", "from sqlalchemy import create_engine\n", + "from dotenv import load_dotenv\n", "import os\n", "\n", - "engine = create_engine(os.environ.get('DATABASE_URL', 'postgresql://portfolio:portfolio@localhost:5432/portfolio'))\n", + "# Load .env from project root\n", + "load_dotenv('../../.env')\n", + "\n", + "engine = create_engine(os.environ.get('DATABASE_URL'))\n", "\n", "query = \"\"\"\n", "SELECT\n", diff --git a/notebooks/safety/crime_rate_choropleth.ipynb b/notebooks/safety/crime_rate_choropleth.ipynb index 20d24dc..1d72390 100644 --- a/notebooks/safety/crime_rate_choropleth.ipynb +++ b/notebooks/safety/crime_rate_choropleth.ipynb @@ -19,7 +19,7 @@ "\n", "| Table | Grain | Key Columns |\n", "|-------|-------|-------------|\n", - "| `mart_neighbourhood_safety` | neighbourhood × year | crime_rate_per_100k, crime_index, safety_tier, geometry |\n", + "| `mart_neighbourhood_safety` | neighbourhood \u00d7 year | crime_rate_per_100k, crime_index, safety_tier, geometry |\n", "\n", "### SQL Query" ] @@ -32,9 +32,13 @@ "source": [ "import pandas as pd\n", "from sqlalchemy import create_engine\n", + "from dotenv import load_dotenv\n", "import os\n", "\n", - "engine = create_engine(os.environ.get('DATABASE_URL', 'postgresql://portfolio:portfolio@localhost:5432/portfolio'))\n", + "# Load .env from project root\n", + "load_dotenv('../../.env')\n", + "\n", + "engine = create_engine(os.environ.get('DATABASE_URL'))\n", "\n", "query = \"\"\"\n", "SELECT\n", diff --git a/notebooks/safety/crime_trend_line.ipynb b/notebooks/safety/crime_trend_line.ipynb index 5fcc748..bd062b0 100644 --- a/notebooks/safety/crime_trend_line.ipynb +++ b/notebooks/safety/crime_trend_line.ipynb @@ -19,7 +19,7 @@ "\n", "| Table | Grain | Key Columns |\n", "|-------|-------|-------------|\n", - "| `mart_neighbourhood_safety` | neighbourhood × year | year, crime_rate_per_100k, crime_yoy_change_pct |\n", + "| `mart_neighbourhood_safety` | neighbourhood \u00d7 year | year, crime_rate_per_100k, crime_yoy_change_pct |\n", "\n", "### SQL Query" ] @@ -32,9 +32,13 @@ "source": [ "import pandas as pd\n", "from sqlalchemy import create_engine\n", + "from dotenv import load_dotenv\n", "import os\n", "\n", - "engine = create_engine(os.environ.get('DATABASE_URL', 'postgresql://portfolio:portfolio@localhost:5432/portfolio'))\n", + "# Load .env from project root\n", + "load_dotenv('../../.env')\n", + "\n", + "engine = create_engine(os.environ.get('DATABASE_URL'))\n", "\n", "query = \"\"\"\n", "SELECT\n",