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.
47 lines
1.9 KiB
Python
47 lines
1.9 KiB
Python
"""Financial data Oracle service methods."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from libs.oracle_client.client import OracleClient
|
|
from libs.oracle_client.models import CompanyInfo, FinancialDataResponse, FinancialPeriod
|
|
|
|
|
|
class FinancialService:
|
|
def __init__(self, client: OracleClient) -> None:
|
|
self._client = client
|
|
|
|
async def get_financial_data(self, ticker: str, quarters: int = 8) -> FinancialDataResponse:
|
|
# Oracle accepts period param (e.g. "2y"), convert quarters to approximate years
|
|
years = max(1, (quarters + 3) // 4)
|
|
data = await self._client.get(
|
|
f"/api/v1/financial/data/{ticker}", params={"period": f"{years}y"}
|
|
)
|
|
# Real Oracle: {"company": {...}, "financial_data": [{period_date, ...}]}
|
|
periods = []
|
|
for p in data.get("financial_data", []):
|
|
period_date = p.get("period_date", "")
|
|
period_end = period_date[:10] if period_date else ""
|
|
periods.append(
|
|
FinancialPeriod(
|
|
period=period_end,
|
|
period_end=period_end,
|
|
revenue=p.get("revenue"),
|
|
net_income=p.get("net_income"),
|
|
eps=p.get("eps"),
|
|
gross_margin=p.get("gross_margin"),
|
|
operating_margin=p.get("operating_margin"),
|
|
)
|
|
)
|
|
return FinancialDataResponse(ticker=ticker, periods=periods)
|
|
|
|
async def get_company_info(self, ticker: str) -> CompanyInfo:
|
|
data = await self._client.get(f"/api/v1/financial/data/{ticker}", params={"period": "1y"})
|
|
company = data.get("company", {})
|
|
return CompanyInfo(
|
|
ticker=company.get("ticker", ticker),
|
|
name=company.get("name"),
|
|
cik=company.get("cik"),
|
|
sector=company.get("sector"),
|
|
industry=company.get("industry"),
|
|
)
|