mirror of
https://github.com/PR0M3TH3AN/python_charts.git
synced 2026-10-27 08:50:39 +00:00
Add constants module and use for db path
This commit is contained in:
1 parent
0ac611eed0
commit
1a7449ee5b
6 files changed
+46
-17
No files matched your search
@@ -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"
|
||||
|
||||
+3
-1
@@ -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.
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
from pathlib import Path
|
||||
|
||||
DB_PATH_DEFAULT = Path("data/fred.db")
|
||||
UNRATE = "UNRATE"
|
||||
DCOILWTICO = "DCOILWTICO"
|
||||
@@ -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,
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user