Python 56.2%
TeX 43.7%
1"""FRED API client for macroeconomic data."""23from __future__ import annotations45import pandas as pd6from fredapi import Fred78from src.config import DATA_RAW_FRED, FRED_API_KEY9from src.utils import setup_logging1011logger = setup_logging("fred")121314def get_fred_client() -> Fred:15 """Return an authenticated FRED client."""16 return Fred(api_key=FRED_API_KEY)171819def _fetch_series(20 series_id: str,21 start: str = "2024-01-01",22 end: str = "2026-06-01",23) -> pd.DataFrame:24 """Generic helper: fetch a FRED series and return as DataFrame."""25 client = get_fred_client()26 data = client.get_series(series_id, observation_start=start, observation_end=end)27 df = data.to_frame(name=series_id)28 df.index.name = "date"29 return df303132def fetch_fed_funds_rate(33 start: str = "2024-01-01",34 end: str = "2026-06-01",35) -> pd.DataFrame:36 """Fetch DFF series (daily federal funds rate)."""37 df = _fetch_series("DFF", start, end)38 path = DATA_RAW_FRED / "fed_funds_rate.csv"39 df.to_csv(path)40 logger.info("Saved DFF (%d obs) to %s", len(df), path)41 return df424344def fetch_cpi(45 start: str = "2024-01-01",46 end: str = "2026-06-01",47) -> pd.DataFrame:48 """Fetch CPIAUCSL series (Consumer Price Index)."""49 df = _fetch_series("CPIAUCSL", start, end)50 path = DATA_RAW_FRED / "cpi.csv"51 df.to_csv(path)52 logger.info("Saved CPIAUCSL (%d obs) to %s", len(df), path)53 return df545556def fetch_unemployment(57 start: str = "2024-01-01",58 end: str = "2026-06-01",59) -> pd.DataFrame:60 """Fetch UNRATE series (unemployment rate)."""61 df = _fetch_series("UNRATE", start, end)62 path = DATA_RAW_FRED / "unemployment.csv"63 df.to_csv(path)64 logger.info("Saved UNRATE (%d obs) to %s", len(df), path)65 return df666768def fetch_all_fred_data() -> None:69 """Fetch all FRED series and save to data/raw/fred/."""70 DATA_RAW_FRED.mkdir(parents=True, exist_ok=True)71 logger.info("=== Starting FRED data acquisition ===")7273 try:74 fetch_fed_funds_rate()75 except Exception as exc:76 logger.error("Failed to fetch DFF: %s", exc)7778 try:79 fetch_cpi()80 except Exception as exc:81 logger.error("Failed to fetch CPIAUCSL: %s", exc)8283 try:84 fetch_unemployment()85 except Exception as exc:86 logger.error("Failed to fetch UNRATE: %s", exc)8788 logger.info("=== FRED data acquisition complete ===")89