diff --git a/openbb_sdk/providers/polygon/openbb_polygon/models/balance_sheet.py b/openbb_sdk/providers/polygon/openbb_polygon/models/balance_sheet.py index b0491a4e062..9c9e3fc2b4d 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/models/balance_sheet.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/balance_sheet.py @@ -1,38 +1,40 @@ -from datetime import date as dateType -from typing import Dict, List, Optional +from typing import Any, Dict, List, Optional -from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher -from openbb_provider.helpers import data_transformer, get_querystring +from openbb_provider.helpers import get_querystring from openbb_provider.models.balance_sheet import ( BalanceSheetData, BalanceSheetQueryParams, ) -from pydantic import Field +from pydantic import validator from openbb_polygon.utils.helpers import get_data from openbb_polygon.utils.types import PolygonFundamentalQueryParams class PolygonBalanceSheetQueryParams(PolygonFundamentalQueryParams): - __doc__ = PolygonFundamentalQueryParams.__doc__ + """Polygon Fundamental QueryParams. + + Source: https://polygon.io/docs/stocks#!/get_vx_reference_financials + """ -class PolygonBalanceSheetData(Data): - cik: Optional[str] - start_date: dateType = Field(alias="date") - assets: Optional[int] - current_assets: Optional[int] - current_liabilities: Optional[int] - equity: Optional[int] = Field(alias="total_equity") - equity_attributable_to_noncontrolling_interest: Optional[int] - equity_attributable_to_parent: Optional[int] - liabilities: Optional[int] - liabilities_and_equity: Optional[int] = Field( - alias="total_liabilities_and_stockholders_equity" - ) - noncurrent_assets: Optional[int] - noncurrent_liabilities: Optional[int] +class PolygonBalanceSheetData(BalanceSheetData): + """Return Balance Sheet Data.""" + + class Config: + fields = { + "date": "start_date", + "equity": "total_equity", + "total_liabilities_and_stockholders_equity": "liabilities_and_equity", + "minority_interest": "equity_attributable_to_noncontrolling_interest", + } + + @validator("symbol", pre=True, check_fields=False) + def symbol_from_tickers(cls, v): + if isinstance(v, list): + return ",".join(v) + return v class PolygonBalanceSheetFetcher( @@ -44,13 +46,8 @@ class PolygonBalanceSheetFetcher( ] ): @staticmethod - def transform_query( - query: BalanceSheetQueryParams, extra_params: Optional[Dict] = None - ) -> PolygonBalanceSheetQueryParams: - period = "annual" if query.period == "annually" else "quarterly" - return PolygonBalanceSheetQueryParams( - symbol=query.symbol, period=period, **extra_params if extra_params else {} # type: ignore - ) + def transform_query(params: Dict[str, Any]) -> PolygonBalanceSheetQueryParams: + return PolygonBalanceSheetQueryParams(**params) @staticmethod def extract_data( @@ -58,6 +55,8 @@ class PolygonBalanceSheetFetcher( ) -> List[PolygonBalanceSheetData]: api_key = credentials.get("polygon_api_key") if credentials else "" + query.period = "annual" if query.period == "annually" else "quarter" + base_url = "https://api.polygon.io/vX/reference/financials" query_string = get_querystring(query.dict(by_alias=True), []) request_url = f"{base_url}?{query_string}&apiKey={api_key}" @@ -66,27 +65,28 @@ class PolygonBalanceSheetFetcher( if len(data) == 0: raise RuntimeError("No balance sheet found") + FIELDS = [ + "assets", + "current_assets", + "current_liabilities", + "equity", + "equity_attributable_to_noncontrolling_interest", + "equity_attributable_to_parent", + "liabilities", + "liabilities_and_equity", + "noncurrent_assets", + "noncurrent_liabilities", + ] + to_return = [] for item in data: new = {"start_date": item["start_date"]} new["cik"] = item["cik"] bs = item["financials"]["balance_sheet"] - # TODO: Unpack this dynamically to avoid hardcoding. - new["assets"] = bs["assets"].get("value") - new["current_assets"] = bs["current_assets"].get("value") - new["current_liabilities"] = bs["current_liabilities"].get("value") - new["equity"] = bs["equity"].get("value") - new["equity_attributable_to_noncontrolling_interest"] = bs[ - "equity_attributable_to_noncontrolling_interest" - ].get("value") - new["equity_attributable_to_parent"] = bs[ - "equity_attributable_to_parent" - ].get("value") - new["equity"] = bs["equity"].get("value") - new["liabilities"] = bs["liabilities"].get("value") - new["liabilities_and_equity"] = bs["liabilities_and_equity"].get("value") - new["noncurrent_assets"] = bs["noncurrent_assets"].get("value") - new["noncurrent_liabilities"] = bs["noncurrent_liabilities"].get("value") + + if bs: + for field in FIELDS: + new[field] = bs[field].get("value", 0) to_return.append(PolygonBalanceSheetData(**new)) return to_return @@ -94,5 +94,5 @@ class PolygonBalanceSheetFetcher( @staticmethod def transform_data( data: List[PolygonBalanceSheetData], - ) -> List[BalanceSheetData]: - return data_transformer(data, BalanceSheetData) + ) -> List[PolygonBalanceSheetData]: + return data diff --git a/openbb_sdk/providers/polygon/openbb_polygon/models/income_statement.py b/openbb_sdk/providers/polygon/openbb_polygon/models/income_statement.py index f5dd8a43b6d..943a3e9df4f 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/models/income_statement.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/income_statement.py @@ -87,6 +87,26 @@ class PolygonIncomeStatementFetcher( if len(data) == 0: raise RuntimeError("No Income Statement found") + FIELDS = [ + "revenues", + "cost_of_revenue", + "gross_profit", + "operating_expenses" "income_loss_from_continuing_operations_before_tax", + "income_tax_expense_benefit", + "net_income_loss", + "basic_earnings_per_share", + "diluted_earnings_per_share", + "net_income_loss_attributable_to_noncontrolling_interest", + "net_income_loss_attributable_to_parent", + "net_income_loss_available_to_common_stockholders_basic", + "operating_income_loss", + "participating_securities_distributed_and_undistributed_earnings_loss_basic", + "preferred_stock_dividends_and_other_adjustments", + "income_loss_from_continuing_operations_after_tax", + "benefits_costs_expenses", + "interest_expense_operating", + ] + to_return = [] for item in data: new = {"acceptance_datetime": item.get("acceptance_datetime")} @@ -97,27 +117,6 @@ class PolygonIncomeStatementFetcher( new["cik"] = item["cik"] incs = item["financials"].get("income_statement", {}) - FIELDS = [ - "revenues", - "cost_of_revenue", - "gross_profit", - "operating_expenses" - "income_loss_from_continuing_operations_before_tax", - "income_tax_expense_benefit", - "net_income_loss", - "basic_earnings_per_share", - "diluted_earnings_per_share", - "net_income_loss_attributable_to_noncontrolling_interest", - "net_income_loss_attributable_to_parent", - "net_income_loss_available_to_common_stockholders_basic", - "operating_income_loss", - "participating_securities_distributed_and_undistributed_earnings_loss_basic", - "preferred_stock_dividends_and_other_adjustments", - "income_loss_from_continuing_operations_after_tax", - "benefits_costs_expenses", - "interest_expense_operating", - ] - if incs: for field in FIELDS: new[field] = incs.get(field, {}).get("value", 0) diff --git a/openbb_sdk/sdk/provider/openbb_provider/models/balance_sheet.py b/openbb_sdk/sdk/provider/openbb_provider/models/balance_sheet.py index b78080cf387..c9108899b96 100644 --- a/openbb_sdk/sdk/provider/openbb_provider/models/balance_sheet.py +++ b/openbb_sdk/sdk/provider/openbb_provider/models/balance_sheet.py @@ -23,7 +23,7 @@ class BalanceSheetData(Data): """Return Balance Sheet Data.""" date: dateType = Field(description="Date of the income statement.") - symbol: str = Field(description="Symbol of the company.") + symbol: Optional[str] = Field(description="Symbol of the company.") cik: Optional[int] = Field(description="Central Index Key.") currency: Optional[str] = Field(description="Reporting currency.") filing_date: Optional[dateType] = Field(description="Filling date.")