You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.9 KiB
Python
52 lines
1.9 KiB
Python
"""FRED data Oracle service methods."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from libs.oracle_client.client import OracleClient
|
|
from libs.oracle_client.models import FredObservation, FredProxyResponse, FredSeriesInfo
|
|
|
|
|
|
class FredService:
|
|
def __init__(self, client: OracleClient) -> None:
|
|
self._client = client
|
|
|
|
async def get_observations(
|
|
self,
|
|
series_id: str,
|
|
start: str | None = None,
|
|
end: str | None = None,
|
|
) -> FredProxyResponse:
|
|
params: dict[str, str] = {"series_id": series_id}
|
|
if start:
|
|
params["observation_start"] = start
|
|
if end:
|
|
params["observation_end"] = end
|
|
data = await self._client.get("/api/v1/fred/proxy/series/observations", params=params)
|
|
# Real Oracle: {"success": true, "data": {"realtime_start": ..., "observations": [{"date": ..., "value": "4.06"}]}}
|
|
inner = data.get("data", {})
|
|
obs_raw = inner.get("observations", [])
|
|
observations = [
|
|
FredObservation(
|
|
date=o["date"],
|
|
value=float(o["value"]) if o.get("value") not in (None, ".", "") else None,
|
|
)
|
|
for o in obs_raw
|
|
]
|
|
return FredProxyResponse(
|
|
series_id=series_id,
|
|
observations=observations,
|
|
realtime_start=inner.get("realtime_start"),
|
|
realtime_end=inner.get("realtime_end"),
|
|
)
|
|
|
|
async def get_series_info(self, series_id: str) -> FredSeriesInfo:
|
|
params = {"series_id": series_id}
|
|
data = await self._client.get("/api/v1/fred/proxy/series", params=params)
|
|
# Real Oracle: {"success": true, "data": {"seriess": [{id, title, frequency, ...}]}}
|
|
inner = data.get("data", {})
|
|
seriess = inner.get("seriess", [])
|
|
if seriess:
|
|
info = seriess[0]
|
|
return FredSeriesInfo.model_validate({**info, "id": info.get("id", series_id)})
|
|
return FredSeriesInfo(id=series_id)
|