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

"""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)