Merge branch 'feature/provider_refactoring' of https://github.com/OpenBB-finance/OpenBBTerminal into feature/provider_refactoring

This commit is contained in:
Pratyush Shukla
2023-08-02 16:54:01 +05:30
3 changed files with 67 additions and 68 deletions

View File

@@ -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

View File

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

View File

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