diff --git a/openbb_sdk/providers/fmp/openbb_fmp/models/key_metrics.py b/openbb_sdk/providers/fmp/openbb_fmp/models/key_metrics.py index e32d9b9bf60..84b8933b086 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/models/key_metrics.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/key_metrics.py @@ -1,103 +1,89 @@ """Key Metrics fetcher.""" -from datetime import date as dateType -from typing import Any, Dict, List, Literal, Optional +from datetime import datetime +from typing import Any, Dict, List, Optional -from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher -from openbb_provider.abstract.query_params import QueryParams from openbb_provider.models.key_metrics import KeyMetricsData, KeyMetricsQueryParams -from pydantic import Field from openbb_fmp.utils.helpers import create_url, get_data_many +from pydantic import validator -class FMPKeyMetricsQueryParams(QueryParams): - """FMP Key Metrics QueryParams. + +class FMPKeyMetricsQueryParams(KeyMetricsQueryParams): + """FMP Key Metrics Query. Source: https://site.financialmodelingprep.com/developer/docs/company-key-metrics-api/ - - Parameter - --------- - symbol : str - The symbol of the company. - period : Literal["quarter", "annual"] - The period of the key metrics. Default is "annual". - limit : Optional[int] - The limit of the key metrics to be returned. """ - symbol: str - period: Literal["quarter", "annual"] = "annual" - limit: Optional[int] = None +class FMPKeyMetricsData(KeyMetricsData): + """FMP Key Metrics Data.""" -class FMPKeyMetricsData(Data): - symbol: str - date: dateType - period: str - revenuePerShare: float - netIncomePerShare: float - operatingCashFlowPerShare: Optional[float] - freeCashFlowPerShare: Optional[float] - cashPerShare: Optional[float] - bookValuePerShare: Optional[float] - tangibleBookValuePerShare: Optional[float] - shareholdersEquityPerShare: Optional[float] - interestDebtPerShare: Optional[float] - marketCap: Optional[float] - enterpriseValue: Optional[float] - peRatio: Optional[float] - priceToSalesRatio: Optional[float] - pocfratio: Optional[float] = Field(alias="pocf_ratio") - pfcfRatio: Optional[float] - pbRatio: Optional[float] - ptbRatio: Optional[float] - evToSales: Optional[float] - enterpriseValueOverEBITDA: Optional[float] = Field( - alias="enterprise_value_over_ebitda" - ) - evToOperatingCashFlow: Optional[float] - evToFreeCashFlow: Optional[float] - earningsYield: Optional[float] - freeCashFlowYield: Optional[Optional[float]] - debtToEquity: Optional[float] - debtToAssets: Optional[float] - netDebtToEBITDA: Optional[float] = Field(alias="net_debt_to_ebitda") - currentRatio: Optional[float] - interestCoverage: Optional[float] - incomeQuality: Optional[float] - dividendYield: Optional[Optional[float]] - payoutRatio: Optional[Optional[float]] - salesGeneralAndAdministrativeToRevenue: Optional[float] - researchAndDdevelopementToRevenue: Optional[float] = Field( - alias="research_and_developement_to_revenue" - ) - intangiblesToTotalAssets: Optional[float] - capexToOperatingCashFlow: Optional[float] - capexToRevenue: Optional[float] - capexToDepreciation: Optional[float] - stockBasedCompensationToRevenue: Optional[float] - grahamNumber: Optional[float] - roic: Optional[float] - returnOnTangibleAssets: Optional[float] - grahamNetNet: Optional[float] - workingCapital: Optional[float] - tangibleAssetValue: Optional[float] - netCurrentAssetValue: Optional[float] - investedCapital: Optional[float] - averageReceivables: Optional[float] - averagePayables: Optional[float] - averageInventory: Optional[float] - daysSalesOutstanding: Optional[float] - daysPayablesOutstanding: Optional[float] - daysOfInventoryOnHand: Optional[float] - receivablesTurnover: Optional[float] - payablesTurnover: Optional[float] - inventoryTurnover: Optional[float] - roe: Optional[float] - capexPerShare: Optional[float] + class Config: + fields = { + "revenue_per_share": "revenuePerShare", + "net_income_per_share": "netIncomePerShare", + "operating_cash_flow_per_share": "operatingCashFlowPerShare", + "free_cash_flow_per_share": "freeCashFlowPerShare", + "cash_per_share": "cashPerShare", + "book_value_per_share": "bookValuePerShare", + "tangible_book_value_per_share": "tangibleBookValuePerShare", + "shareholders_equity_per_share": "shareholdersEquityPerShare", + "interest_debt_per_share": "interestDebtPerShare", + "market_cap": "marketCap", + "enterprise_value": "enterpriseValue", + "pe_ratio": "peRatio", + "price_to_sales_ratio": "priceToSalesRatio", + "pocf_ratio": "pocfratio", + "pfcf_ratio": "pfcfRatio", + "pb_ratio": "pbRatio", + "ptb_ratio": "ptbRatio", + "ev_to_sales": "evToSales", + "enterprise_value_over_ebitda": "enterpriseValueOverEBITDA", + "ev_to_operating_cash_flow": "evToOperatingCashFlow", + "ev_to_free_cash_flow": "evToFreeCashFlow", + "earnings_yield": "earningsYield", + "free_cash_flow_yield": "freeCashFlowYield", + "debt_to_equity": "debtToEquity", + "debt_to_assets": "debtToAssets", + "net_debt_to_ebitda": "netDebtToEBITDA", + "current_ratio": "currentRatio", + "interest_coverage": "interestCoverage", + "income_quality": "incomeQuality", + "dividend_yield": "dividendYield", + "payout_ratio": "payoutRatio", + "sales_general_and_administrative_to_revenue": "salesGeneralAndAdministrativeToRevenue", + "research_and_development_to_revenue": "researchAndDdevelopementToRevenue", + "intangibles_to_total_assets": "intangiblesToTotalAssets", + "capex_to_operating_cash_flow": "capexToOperatingCashFlow", + "capex_to_revenue": "capexToRevenue", + "capex_to_depreciation": "capexToDepreciation", + "stock_based_compensation_to_revenue": "stockBasedCompensationToRevenue", + "graham_number": "grahamNumber", + "return_on_tangible_assets": "returnOnTangibleAssets", + "graham_net_net": "grahamNetNet", + "working_capital": "workingCapital", + "tangible_asset_value": "tangibleAssetValue", + "net_current_asset_value": "netCurrentAssetValue", + "invested_capital": "investedCapital", + "average_receivables": "averageReceivables", + "average_payables": "averagePayables", + "average_inventory": "averageInventory", + "days_sales_outstanding": "daysSalesOutstanding", + "days_payables_outstanding": "daysPayablesOutstanding", + "days_of_inventory_on_hand": "daysOfInventoryOnHand", + "receivables_turnover": "receivablesTurnover", + "payables_turnover": "payablesTurnover", + "inventory_turnover": "inventoryTurnover", + "capex_per_share": "capexPerShare", + } + + @validator("date", pre=True, check_fields=False) + def date_validate(cls, v): # pylint: disable=no-self-argument + return datetime.strptime(v, "%Y-%m-%d") class FMPKeyMetricsFetcher( @@ -110,11 +96,7 @@ class FMPKeyMetricsFetcher( ): @staticmethod def transform_query(params: Dict[str, Any]) -> FMPKeyMetricsQueryParams: - transformed_params = params - transformed_params["period"] = ( - "annual" if params.get("period", "") == "annually" else "quarter" - ) - return FMPKeyMetricsQueryParams(**transformed_params) + return FMPKeyMetricsQueryParams(**params) @staticmethod def extract_data( @@ -122,6 +104,8 @@ class FMPKeyMetricsFetcher( ) -> List[FMPKeyMetricsData]: api_key = credentials.get("fmp_api_key") if credentials else "" + query.period = "annual" if query.period == "annually" else "quarter" + url = create_url( 3, f"key-metrics/{query.symbol}", api_key, query, exclude=["symbol"] ) diff --git a/openbb_sdk/sdk/provider/openbb_provider/models/key_metrics.py b/openbb_sdk/sdk/provider/openbb_provider/models/key_metrics.py index 510795f34b1..f5df6bd61ef 100644 --- a/openbb_sdk/sdk/provider/openbb_provider/models/key_metrics.py +++ b/openbb_sdk/sdk/provider/openbb_provider/models/key_metrics.py @@ -1,211 +1,133 @@ """Key Metrics Data Model.""" -from datetime import date as DateType +from datetime import date as dateType from typing import Literal, Optional from openbb_provider.abstract.data import Data from openbb_provider.abstract.query_params import QueryParams from openbb_provider.models.base import BaseSymbol +from openbb_provider.descriptions import QUERY_DESCRIPTIONS, DATA_DESCRIPTIONS + +from pydantic import Field class KeyMetricsQueryParams(QueryParams, BaseSymbol): - """Key Metrics query model. + """Key Metrics Query.""" - Parameter - --------- - symbol : str - The symbol of the company. - """ - - period: Literal["annually", "quarterly"] = "annually" - limit: Optional[int] = None + period: Literal["annually", "quarterly"] = Field( + default="annually", description=QUERY_DESCRIPTIONS.get("period", "") + ) + limit: Optional[int] = Field( + default=100, description=QUERY_DESCRIPTIONS.get("limit", "") + ) -class KeyMetricsData(Data): - """Return Key Metrics Data. +class KeyMetricsData(Data, BaseSymbol): + """Key Metrics Data.""" - Returns - ------- - symbol : str - The symbol of the stock. - date : DateType - The date of the key metrics. - period : str - The period of the key metrics. - revenue_per_share : float - The revenue per share of the stock. - net_income_per_share : float - The net income per share of the stock. - operating_cash_flow_per_share : float - The operating cash flow per share of the stock. - free_cash_flow_per_share : float - The free cash flow per share of the stock. - cash_per_share : float - The cash per share of the stock. - book_value_per_share : float - The book value per share of the stock. - tangible_book_value_per_share : float - The tangible book value per share of the stock. - shareholders_equity_per_share : float - The shareholders equity per share of the stock. - interest_debt_per_share : float - The interest debt per share of the stock. - market_cap : float - The market cap of the stock. - enterprise_value : float - The enterprise value of the stock. - pe_ratio : float - The PE ratio of the stock. - price_to_sales_ratio : float - The price to sales ratio of the stock. - pocf_ratio : float - The POCF ratio of the stock. - pfcf_ratio : float - The PFCF ratio of the stock. - pb_ratio : float - The PB ratio of the stock. - ptb_ratio : float - The PTB ratio of the stock. - ev_to_sales : float - The EV to sales of the stock. - enterprise_value_over_ebitda : float - The enterprise value over EBITDA of the stock. - ev_to_operating_cash_flow : float - The EV to operating cash flow of the stock. - ev_to_free_cash_flow : float - The EV to free cash flow of the stock. - earnings_yield : float - The earnings yield of the stock. - free_cash_flow_yield : float - The free cash flow yield of the stock. - debt_to_equity : float - The debt to equity of the stock. - debt_to_assets : float - The debt to assets of the stock. - net_debt_to_ebitda : float - The net debt to EBITDA of the stock. - current_ratio : float - The current ratio of the stock. - interest_coverage : float - The interest coverage of the stock. - income_quality : float - The income quality of the stock. - dividend_yield : float - The dividend yield of the stock. - payout_ratio : float - The payout ratio of the stock. - sales_general_and_administrative_to_revenue : float - The sales general and administrative to revenue of the stock. - research_and_developement_to_revenue : float - The research and development to revenue of the stock. - intangibles_to_total_assets : float - The intangibles to total assets of the stock. - capex_to_operating_cash_flow : float - The capex to operating cash flow of the stock. - capex_to_revenue : float - The capex to revenue of the stock. - capex_to_depreciation : float - The capex to depreciation of the stock. - stock_based_compensation_to_revenue : float - The stock based compensation to revenue of the stock. - graham_number : float - The graham number of the stock. - roic : float - The ROIC of the stock. - return_on_tangible_assets : float - The return on tangible assets of the stock. - graham_net_net : float - The graham net net of the stock. - working_capital : float - The working capital of the stock. - tangible_asset_value : float - The tangible asset value of the stock. - net_current_asset_value : float - The net current asset value of the stock. - invested_capital : float - The invested capital of the stock. - average_receivables : float - The average receivables of the stock. - average_payables : float - The average payables of the stock. - average_inventory : float - The average inventory of the stock. - days_sales_outstanding : float - The days sales outstanding of the stock. - days_payables_outstanding : float - The days payables outstanding of the stock. - days_of_inventory_on_hand : float - The days of inventory on hand of the stock. - receivables_turnover : float - The receivables turnover of the stock. - payables_turnover : float - The payables turnover of the stock. - inventory_turnover : float - The inventory turnover of the stock. - roe : float - The ROE of the stock. - capex_per_share : float - The capex per share of the stock. - """ - - symbol: str - date: DateType - period: str - revenue_per_share: Optional[float] - net_income_per_share: Optional[float] - operating_cash_flow_per_share: Optional[float] - free_cash_flow_per_share: Optional[float] - cash_per_share: Optional[float] - book_value_per_share: Optional[float] - tangible_book_value_per_share: Optional[float] - shareholders_equity_per_share: Optional[float] - interest_debt_per_share: Optional[float] - market_cap: Optional[float] - enterprise_value: Optional[float] - pe_ratio: Optional[float] - price_to_sales_ratio: Optional[float] - pocf_ratio: Optional[float] - pfcf_ratio: Optional[float] - pb_ratio: Optional[float] - ptb_ratio: Optional[float] - ev_to_sales: Optional[float] - enterprise_value_over_ebitda: Optional[float] - ev_to_operating_cash_flow: Optional[float] - ev_to_free_cash_flow: Optional[float] - earnings_yield: Optional[float] - free_cash_flow_yield: Optional[float] - debt_to_equity: Optional[float] - debt_to_assets: Optional[float] - net_debt_to_ebitda: Optional[float] - current_ratio: Optional[float] - interest_coverage: Optional[float] - income_quality: Optional[float] - dividend_yield: Optional[float] - payout_ratio: Optional[float] - sales_general_and_administrative_to_revenue: Optional[float] - research_and_development_to_revenue: Optional[float] - intangibles_to_total_assets: Optional[float] - capex_to_operating_cash_flow: Optional[float] - capex_to_revenue: Optional[float] - capex_to_depreciation: Optional[float] - stock_based_compensation_to_revenue: Optional[float] - graham_number: Optional[float] - roic: Optional[float] - return_on_tangible_assets: Optional[float] - graham_net_net: Optional[float] - working_capital: Optional[float] - tangible_asset_value: Optional[float] - net_current_asset_value: Optional[float] - invested_capital: Optional[float] - average_receivables: Optional[float] - average_payables: Optional[float] - average_inventory: Optional[float] - days_sales_outstanding: Optional[float] - days_payables_outstanding: Optional[float] - days_of_inventory_on_hand: Optional[float] - receivables_turnover: Optional[float] - payables_turnover: Optional[float] - inventory_turnover: Optional[float] - roe: Optional[float] - capex_per_share: Optional[float] + date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", "")) + period: str = Field(description="The period of the data.") + revenue_per_share: Optional[float] = Field(description="Revenue per share") + net_income_per_share: Optional[float] = Field(description="Net income per share") + operating_cash_flow_per_share: Optional[float] = Field( + description="Operating cash flow per share" + ) + free_cash_flow_per_share: Optional[float] = Field( + description="Free cash flow per share" + ) + cash_per_share: Optional[float] = Field(description="Cash per share") + book_value_per_share: Optional[float] = Field(description="Book value per share") + tangible_book_value_per_share: Optional[float] = Field( + description="Tangible book value per share" + ) + shareholders_equity_per_share: Optional[float] = Field( + description="Shareholders equity per share" + ) + interest_debt_per_share: Optional[float] = Field( + description="Interest debt per share" + ) + market_cap: Optional[float] = Field(description="Market capitalization") + enterprise_value: Optional[float] = Field(description="Enterprise value") + pe_ratio: Optional[float] = Field(description="Price-to-earnings ratio (P/E ratio)") + price_to_sales_ratio: Optional[float] = Field(description="Price-to-sales ratio") + pocf_ratio: Optional[float] = Field( + description="Price-to-operating cash flow ratio" + ) + pfcf_ratio: Optional[float] = Field(description="Price-to-free cash flow ratio") + pb_ratio: Optional[float] = Field(description="Price-to-book ratio") + ptb_ratio: Optional[float] = Field(description="Price-to-tangible book ratio") + ev_to_sales: Optional[float] = Field(description="Enterprise value-to-sales ratio") + enterprise_value_over_ebitda: Optional[float] = Field( + description="Enterprise value-to-EBITDA ratio" + ) + ev_to_operating_cash_flow: Optional[float] = Field( + description="Enterprise value-to-operating cash flow ratio" + ) + ev_to_free_cash_flow: Optional[float] = Field( + description="Enterprise value-to-free cash flow ratio" + ) + earnings_yield: Optional[float] = Field(description="Earnings yield") + free_cash_flow_yield: Optional[float] = Field(description="Free cash flow yield") + debt_to_equity: Optional[float] = Field(description="Debt-to-equity ratio") + debt_to_assets: Optional[float] = Field(description="Debt-to-assets ratio") + net_debt_to_ebitda: Optional[float] = Field(description="Net debt-to-EBITDA ratio") + current_ratio: Optional[float] = Field(description="Current ratio") + interest_coverage: Optional[float] = Field(description="Interest coverage") + income_quality: Optional[float] = Field(description="Income quality") + dividend_yield: Optional[float] = Field(description="Dividend yield") + payout_ratio: Optional[float] = Field(description="Payout ratio") + sales_general_and_administrative_to_revenue: Optional[float] = Field( + description="Sales general and administrative expenses-to-revenue ratio" + ) + research_and_development_to_revenue: Optional[float] = Field( + description="Research and development expenses-to-revenue ratio" + ) + intangibles_to_total_assets: Optional[float] = Field( + description="Intangibles-to-total assets ratio" + ) + capex_to_operating_cash_flow: Optional[float] = Field( + description="Capital expenditures-to-operating cash flow ratio" + ) + capex_to_revenue: Optional[float] = Field( + description="Capital expenditures-to-revenue ratio" + ) + capex_to_depreciation: Optional[float] = Field( + description="Capital expenditures-to-depreciation ratio" + ) + stock_based_compensation_to_revenue: Optional[float] = Field( + description="Stock-based compensation-to-revenue ratio" + ) + graham_number: Optional[float] = Field(description="Graham number") + roic: Optional[float] = Field(description="Return on invested capital") + return_on_tangible_assets: Optional[float] = Field( + description="Return on tangible assets" + ) + graham_net_net: Optional[float] = Field( + description="Graham net-net working capital" + ) + working_capital: Optional[float] = Field(description="Working capital") + tangible_asset_value: Optional[float] = Field(description="Tangible asset value") + net_current_asset_value: Optional[float] = Field( + description="Net current asset value" + ) + invested_capital: Optional[float] = Field(description="Invested capital") + average_receivables: Optional[float] = Field(description="Average receivables") + average_payables: Optional[float] = Field(description="Average payables") + average_inventory: Optional[float] = Field(description="Average inventory") + days_sales_outstanding: Optional[float] = Field( + description="Days sales outstanding" + ) + days_payables_outstanding: Optional[float] = Field( + description="Days payables outstanding" + ) + days_of_inventory_on_hand: Optional[float] = Field( + description="Days of inventory on hand" + ) + receivables_turnover: Optional[float] = Field(description="Receivables turnover") + payables_turnover: Optional[float] = Field(description="Payables turnover") + inventory_turnover: Optional[float] = Field(description="Inventory turnover") + roe: Optional[float] = Field(description="Return on equity") + capex_per_share: Optional[float] = Field( + description="Capital expenditures per share" + )