From 1a7449ee5bfce72acebacb96d3b03137519ca62d Mon Sep 17 00:00:00 2001 From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> Date: Sat, 31 May 2025 10:44:08 -0400 Subject: [PATCH] Add constants module and use for db path --- scripts/bitcoin_m2_chart.py | 9 ++++++-- scripts/common.py | 4 +++- scripts/constants.py | 5 +++++ scripts/custom_chart.py | 11 ++++++++-- scripts/lagged_oil_unrate_chart_styled.py | 26 +++++++++++++++-------- scripts/refresh_data.py | 8 ++++--- 6 files changed, 46 insertions(+), 17 deletions(-) create mode 100644 scripts/constants.py diff --git a/scripts/bitcoin_m2_chart.py b/scripts/bitcoin_m2_chart.py index 764b88b..a09c24d 100644 --- a/scripts/bitcoin_m2_chart.py +++ b/scripts/bitcoin_m2_chart.py @@ -15,6 +15,8 @@ from datetime import datetime from pathlib import Path from typing import Tuple +from scripts.constants import DB_PATH_DEFAULT + import matplotlib.dates as mdates import matplotlib.pyplot as plt import pandas as pd @@ -29,7 +31,7 @@ def fetch_series( end: datetime, btc_series: str, m2_series: str, - db_path: str | Path = Path("data/fred.db"), + db_path: str | Path = DB_PATH_DEFAULT, ) -> Tuple[pd.DataFrame, pd.DataFrame]: """Load Bitcoin and M2 series from a local SQLite DB.""" df = fetch_series_db([btc_series, m2_series], start, end, db_path) @@ -113,7 +115,10 @@ def main(argv: list[str] | None = None) -> plt.Figure: "--extend-years", type=int, default=1, help="years beyond end date to show" ) p.add_argument( - "--db", type=str, default="data/fred.db", help="path to local SQLite DB" + "--db", + type=str, + default=str(DB_PATH_DEFAULT), + help="path to local SQLite DB", ) p.add_argument( "--output", type=str, default=None, help="optional path to save the figure" diff --git a/scripts/common.py b/scripts/common.py index 93688da..1e5eeff 100644 --- a/scripts/common.py +++ b/scripts/common.py @@ -5,6 +5,8 @@ from datetime import datetime from pathlib import Path from typing import Iterable +from scripts.constants import DB_PATH_DEFAULT + import matplotlib.pyplot as plt import pandas as pd import sqlite3 @@ -28,7 +30,7 @@ def fetch_series_db( series: Iterable[str], start: datetime, end: datetime, - db_path: str | Path = Path("data/fred.db"), + db_path: str | Path = DB_PATH_DEFAULT, ) -> pd.DataFrame: """ Load one or more FRED series from a local SQLite DB. diff --git a/scripts/constants.py b/scripts/constants.py new file mode 100644 index 0000000..e29e7d8 --- /dev/null +++ b/scripts/constants.py @@ -0,0 +1,5 @@ +from pathlib import Path + +DB_PATH_DEFAULT = Path("data/fred.db") +UNRATE = "UNRATE" +DCOILWTICO = "DCOILWTICO" diff --git a/scripts/custom_chart.py b/scripts/custom_chart.py index e2b6adc..e47b513 100644 --- a/scripts/custom_chart.py +++ b/scripts/custom_chart.py @@ -15,6 +15,8 @@ from datetime import datetime from pathlib import Path from typing import Iterable +from scripts.constants import DB_PATH_DEFAULT + import matplotlib.dates as mdates import matplotlib.pyplot as plt import pandas as pd @@ -27,7 +29,7 @@ def fetch_series_multi( series: Iterable[str], start: datetime, end: datetime, - db_path: str | Path = Path("data/fred.db"), + db_path: str | Path = DB_PATH_DEFAULT, ) -> pd.DataFrame: """Load one or more FRED series from a local SQLite DB.""" return fetch_series_db(series, start, end, db_path) @@ -63,7 +65,12 @@ def main(argv: list[str] | None = None) -> plt.Figure: default=datetime.today().strftime("%Y-%m-%d"), help="end date YYYY-MM-DD", ) - p.add_argument("--db", type=str, default="data/fred.db", help="path to SQLite DB") + p.add_argument( + "--db", + type=str, + default=str(DB_PATH_DEFAULT), + help="path to SQLite DB", + ) p.add_argument( "--output", type=str, diff --git a/scripts/lagged_oil_unrate_chart_styled.py b/scripts/lagged_oil_unrate_chart_styled.py index 1953821..e2bfc59 100644 --- a/scripts/lagged_oil_unrate_chart_styled.py +++ b/scripts/lagged_oil_unrate_chart_styled.py @@ -15,6 +15,8 @@ import argparse from datetime import datetime from pathlib import Path +from scripts.constants import DB_PATH_DEFAULT, UNRATE, DCOILWTICO + import matplotlib.dates as mdates import matplotlib.pyplot as plt import matplotlib.ticker as mticker @@ -36,7 +38,7 @@ from scripts.common import ( def fetch_series( start: datetime, end: datetime, - db_path: str | Path = Path("data/fred.db"), + db_path: str | Path = DB_PATH_DEFAULT, ) -> tuple[pd.DataFrame, pd.DataFrame]: """ Load UNRATE and DCOILWTICO from a local SQLite DB, then: @@ -45,11 +47,11 @@ def fetch_series( * average WTI daily prices to month-end """ # Read both series from SQLite - df = fetch_series_db(["UNRATE", "DCOILWTICO"], start, end, db_path) + df = fetch_series_db([UNRATE, DCOILWTICO], start, end, db_path) # Extract UNRATE and rename to 'value' - unrate = df[["UNRATE"]].rename(columns={"UNRATE": "value"}) + unrate = df[[UNRATE]].rename(columns={UNRATE: "value"}) # Extract DCOILWTICO (oil price) and rename to 'value' - oil = df[["DCOILWTICO"]].rename(columns={"DCOILWTICO": "value"}) + oil = df[[DCOILWTICO]].rename(columns={DCOILWTICO: "value"}) # Resample WTI to month-end average oil_monthly = oil.resample("M").mean() @@ -61,9 +63,13 @@ def fetch_series( def validate_series(unrate: pd.DataFrame, oil: pd.DataFrame) -> None: """Run basic sanity checks on the two series.""" - validate_dataframe(unrate, "UNRATE") # Raises ValueError if UNRATE is empty, NaNs, or bad index - validate_dataframe(oil, "DCOILWTICO") # Raises ValueError if oil is empty, NaNs, or bad index - validate_overlap(unrate, oil) # Raises ValueError if no date overlap + validate_dataframe( + unrate, UNRATE + ) # Raises ValueError if UNRATE is empty, NaNs, or bad index + validate_dataframe( + oil, DCOILWTICO + ) # Raises ValueError if oil is empty, NaNs, or bad index + validate_overlap(unrate, oil) # Raises ValueError if no date overlap # ────────────────────────────────────────────────────────────────────────── @@ -89,7 +95,9 @@ def plot_lagged( common_end = min(unrate.index.max(), oil.index.max()) print(f"⚠️ Using overlapping range: {common_start.date()} to {common_end.date()}") - print(f" - UNRATE range: {unrate.index.min().date()} to {unrate.index.max().date()}") + print( + f" - UNRATE range: {unrate.index.min().date()} to {unrate.index.max().date()}" + ) print(f" - OIL range: {oil.index.min().date()} to {oil.index.max().date()}") # Trim series to common range @@ -215,7 +223,7 @@ def main() -> plt.Figure: p.add_argument( "--db", type=str, - default="data/fred.db", + default=str(DB_PATH_DEFAULT), help="path to local FRED SQLite file", ) p.add_argument( diff --git a/scripts/refresh_data.py b/scripts/refresh_data.py index ecba9b4..593dcee 100644 --- a/scripts/refresh_data.py +++ b/scripts/refresh_data.py @@ -20,13 +20,15 @@ import sqlite3 from pandas_datareader.data import DataReader import pandas as pd +from scripts.constants import DB_PATH_DEFAULT, UNRATE, DCOILWTICO + HERE = pathlib.Path(__file__).resolve().parent -DATA_PATH = HERE.parent / "data" -DB_FILE = DATA_PATH / "fred.db" +DATA_PATH = DB_PATH_DEFAULT.parent +DB_FILE = DB_PATH_DEFAULT DEFAULT_START = "1948-01-01" # earliest UNRATE observation DEFAULT_END = date.today().isoformat() -DEFAULT_SERIES = ("UNRATE", "DCOILWTICO") +DEFAULT_SERIES = (UNRATE, DCOILWTICO) def main(argv: list[str] | None = None) -> None: