From 76473afcc66a83b44d1611cbb0392b79430a6615 Mon Sep 17 00:00:00 2001 From: justinpolygon <123573436+justinpolygon@users.noreply.github.com> Date: Tue, 14 Oct 2025 23:51:02 -0700 Subject: [PATCH] feat: add support for stocks financials v1 endpoints --- polygon/rest/__init__.py | 2 + polygon/rest/financials.py | 320 ++++++++++++++++++++++++++++ polygon/rest/models/financials.py | 336 ++++++++++++++++++++++++++++++ 3 files changed, 658 insertions(+) create mode 100644 polygon/rest/financials.py diff --git a/polygon/rest/__init__.py b/polygon/rest/__init__.py index 77f198ca..db26bbca 100644 --- a/polygon/rest/__init__.py +++ b/polygon/rest/__init__.py @@ -1,5 +1,6 @@ from .aggs import AggsClient from .futures import FuturesClient +from .financials import FinancialsClient from .benzinga import BenzingaClient from .economy import EconomyClient from .tmx import TmxClient @@ -28,6 +29,7 @@ class RESTClient( AggsClient, FuturesClient, + FinancialsClient, BenzingaClient, EconomyClient, TmxClient, diff --git a/polygon/rest/financials.py b/polygon/rest/financials.py new file mode 100644 index 00000000..28ef5269 --- /dev/null +++ b/polygon/rest/financials.py @@ -0,0 +1,320 @@ +# financials.py +from typing import Optional, Any, Dict, List, Union, Iterator +from urllib3 import HTTPResponse +from datetime import datetime, date + +from .base import BaseClient +from .models.financials import ( + FinancialBalanceSheet, + FinancialCashFlowStatement, + FinancialIncomeStatement, + FinancialRatio, +) +from .models.common import Sort +from .models.request import RequestOptionBuilder + + +class FinancialsClient(BaseClient): + """ + Client for the Stocks Financials REST Endpoints + (aligned with the paths from /stocks/financials/v1/...) + """ + + def list_financials_balance_sheets( + self, + cik: Optional[str] = None, + cik_any_of: Optional[str] = None, + cik_gt: Optional[str] = None, + cik_gte: Optional[str] = None, + cik_lt: Optional[str] = None, + cik_lte: Optional[str] = None, + tickers: Optional[str] = None, + tickers_all_of: Optional[str] = None, + tickers_any_of: Optional[str] = None, + period_end: Optional[Union[str, date]] = None, + period_end_gt: Optional[Union[str, date]] = None, + period_end_gte: Optional[Union[str, date]] = None, + period_end_lt: Optional[Union[str, date]] = None, + period_end_lte: Optional[Union[str, date]] = None, + filing_date: Optional[Union[str, date]] = None, + filing_date_gt: Optional[Union[str, date]] = None, + filing_date_gte: Optional[Union[str, date]] = None, + filing_date_lt: Optional[Union[str, date]] = None, + filing_date_lte: Optional[Union[str, date]] = None, + fiscal_year: Optional[float] = None, + fiscal_year_gt: Optional[float] = None, + fiscal_year_gte: Optional[float] = None, + fiscal_year_lt: Optional[float] = None, + fiscal_year_lte: Optional[float] = None, + fiscal_quarter: Optional[float] = None, + fiscal_quarter_gt: Optional[float] = None, + fiscal_quarter_gte: Optional[float] = None, + fiscal_quarter_lt: Optional[float] = None, + fiscal_quarter_lte: Optional[float] = None, + timeframe: Optional[str] = None, + timeframe_any_of: Optional[str] = None, + timeframe_gt: Optional[str] = None, + timeframe_gte: Optional[str] = None, + timeframe_lt: Optional[str] = None, + timeframe_lte: Optional[str] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[FinancialBalanceSheet], HTTPResponse]: + """ + Endpoint: GET /stocks/financials/v1/balance-sheets + """ + url = "/stocks/financials/v1/balance-sheets" + return self._paginate( + path=url, + params=self._get_params(self.list_financials_balance_sheets, locals()), + raw=raw, + deserializer=FinancialBalanceSheet.from_dict, + options=options, + ) + + def list_financials_cash_flow_statements( + self, + cik: Optional[str] = None, + cik_any_of: Optional[str] = None, + cik_gt: Optional[str] = None, + cik_gte: Optional[str] = None, + cik_lt: Optional[str] = None, + cik_lte: Optional[str] = None, + period_end: Optional[Union[str, date]] = None, + period_end_gt: Optional[Union[str, date]] = None, + period_end_gte: Optional[Union[str, date]] = None, + period_end_lt: Optional[Union[str, date]] = None, + period_end_lte: Optional[Union[str, date]] = None, + filing_date: Optional[Union[str, date]] = None, + filing_date_gt: Optional[Union[str, date]] = None, + filing_date_gte: Optional[Union[str, date]] = None, + filing_date_lt: Optional[Union[str, date]] = None, + filing_date_lte: Optional[Union[str, date]] = None, + tickers: Optional[str] = None, + tickers_all_of: Optional[str] = None, + tickers_any_of: Optional[str] = None, + fiscal_year: Optional[float] = None, + fiscal_year_gt: Optional[float] = None, + fiscal_year_gte: Optional[float] = None, + fiscal_year_lt: Optional[float] = None, + fiscal_year_lte: Optional[float] = None, + fiscal_quarter: Optional[float] = None, + fiscal_quarter_gt: Optional[float] = None, + fiscal_quarter_gte: Optional[float] = None, + fiscal_quarter_lt: Optional[float] = None, + fiscal_quarter_lte: Optional[float] = None, + timeframe: Optional[str] = None, + timeframe_any_of: Optional[str] = None, + timeframe_gt: Optional[str] = None, + timeframe_gte: Optional[str] = None, + timeframe_lt: Optional[str] = None, + timeframe_lte: Optional[str] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[FinancialCashFlowStatement], HTTPResponse]: + """ + Endpoint: GET /stocks/financials/v1/cash-flow-statements + """ + url = "/stocks/financials/v1/cash-flow-statements" + return self._paginate( + path=url, + params=self._get_params( + self.list_financials_cash_flow_statements, locals() + ), + raw=raw, + deserializer=FinancialCashFlowStatement.from_dict, + options=options, + ) + + def list_financials_income_statements( + self, + cik: Optional[str] = None, + cik_any_of: Optional[str] = None, + cik_gt: Optional[str] = None, + cik_gte: Optional[str] = None, + cik_lt: Optional[str] = None, + cik_lte: Optional[str] = None, + tickers: Optional[str] = None, + tickers_all_of: Optional[str] = None, + tickers_any_of: Optional[str] = None, + period_end: Optional[Union[str, date]] = None, + period_end_gt: Optional[Union[str, date]] = None, + period_end_gte: Optional[Union[str, date]] = None, + period_end_lt: Optional[Union[str, date]] = None, + period_end_lte: Optional[Union[str, date]] = None, + filing_date: Optional[Union[str, date]] = None, + filing_date_gt: Optional[Union[str, date]] = None, + filing_date_gte: Optional[Union[str, date]] = None, + filing_date_lt: Optional[Union[str, date]] = None, + filing_date_lte: Optional[Union[str, date]] = None, + fiscal_year: Optional[float] = None, + fiscal_year_gt: Optional[float] = None, + fiscal_year_gte: Optional[float] = None, + fiscal_year_lt: Optional[float] = None, + fiscal_year_lte: Optional[float] = None, + fiscal_quarter: Optional[float] = None, + fiscal_quarter_gt: Optional[float] = None, + fiscal_quarter_gte: Optional[float] = None, + fiscal_quarter_lt: Optional[float] = None, + fiscal_quarter_lte: Optional[float] = None, + timeframe: Optional[str] = None, + timeframe_any_of: Optional[str] = None, + timeframe_gt: Optional[str] = None, + timeframe_gte: Optional[str] = None, + timeframe_lt: Optional[str] = None, + timeframe_lte: Optional[str] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[FinancialIncomeStatement], HTTPResponse]: + """ + Endpoint: GET /stocks/financials/v1/income-statements + """ + url = "/stocks/financials/v1/income-statements" + return self._paginate( + path=url, + params=self._get_params(self.list_financials_income_statements, locals()), + raw=raw, + deserializer=FinancialIncomeStatement.from_dict, + options=options, + ) + + def list_financials_ratios( + self, + ticker: Optional[str] = None, + ticker_any_of: Optional[str] = None, + ticker_gt: Optional[str] = None, + ticker_gte: Optional[str] = None, + ticker_lt: Optional[str] = None, + ticker_lte: Optional[str] = None, + cik: Optional[str] = None, + cik_any_of: Optional[str] = None, + cik_gt: Optional[str] = None, + cik_gte: Optional[str] = None, + cik_lt: Optional[str] = None, + cik_lte: Optional[str] = None, + price: Optional[float] = None, + price_gt: Optional[float] = None, + price_gte: Optional[float] = None, + price_lt: Optional[float] = None, + price_lte: Optional[float] = None, + average_volume: Optional[float] = None, + average_volume_gt: Optional[float] = None, + average_volume_gte: Optional[float] = None, + average_volume_lt: Optional[float] = None, + average_volume_lte: Optional[float] = None, + market_cap: Optional[float] = None, + market_cap_gt: Optional[float] = None, + market_cap_gte: Optional[float] = None, + market_cap_lt: Optional[float] = None, + market_cap_lte: Optional[float] = None, + earnings_per_share: Optional[float] = None, + earnings_per_share_gt: Optional[float] = None, + earnings_per_share_gte: Optional[float] = None, + earnings_per_share_lt: Optional[float] = None, + earnings_per_share_lte: Optional[float] = None, + price_to_earnings: Optional[float] = None, + price_to_earnings_gt: Optional[float] = None, + price_to_earnings_gte: Optional[float] = None, + price_to_earnings_lt: Optional[float] = None, + price_to_earnings_lte: Optional[float] = None, + price_to_book: Optional[float] = None, + price_to_book_gt: Optional[float] = None, + price_to_book_gte: Optional[float] = None, + price_to_book_lt: Optional[float] = None, + price_to_book_lte: Optional[float] = None, + price_to_sales: Optional[float] = None, + price_to_sales_gt: Optional[float] = None, + price_to_sales_gte: Optional[float] = None, + price_to_sales_lt: Optional[float] = None, + price_to_sales_lte: Optional[float] = None, + price_to_cash_flow: Optional[float] = None, + price_to_cash_flow_gt: Optional[float] = None, + price_to_cash_flow_gte: Optional[float] = None, + price_to_cash_flow_lt: Optional[float] = None, + price_to_cash_flow_lte: Optional[float] = None, + price_to_free_cash_flow: Optional[float] = None, + price_to_free_cash_flow_gt: Optional[float] = None, + price_to_free_cash_flow_gte: Optional[float] = None, + price_to_free_cash_flow_lt: Optional[float] = None, + price_to_free_cash_flow_lte: Optional[float] = None, + dividend_yield: Optional[float] = None, + dividend_yield_gt: Optional[float] = None, + dividend_yield_gte: Optional[float] = None, + dividend_yield_lt: Optional[float] = None, + dividend_yield_lte: Optional[float] = None, + return_on_assets: Optional[float] = None, + return_on_assets_gt: Optional[float] = None, + return_on_assets_gte: Optional[float] = None, + return_on_assets_lt: Optional[float] = None, + return_on_assets_lte: Optional[float] = None, + return_on_equity: Optional[float] = None, + return_on_equity_gt: Optional[float] = None, + return_on_equity_gte: Optional[float] = None, + return_on_equity_lt: Optional[float] = None, + return_on_equity_lte: Optional[float] = None, + debt_to_equity: Optional[float] = None, + debt_to_equity_gt: Optional[float] = None, + debt_to_equity_gte: Optional[float] = None, + debt_to_equity_lt: Optional[float] = None, + debt_to_equity_lte: Optional[float] = None, + current: Optional[float] = None, + current_gt: Optional[float] = None, + current_gte: Optional[float] = None, + current_lt: Optional[float] = None, + current_lte: Optional[float] = None, + quick: Optional[float] = None, + quick_gt: Optional[float] = None, + quick_gte: Optional[float] = None, + quick_lt: Optional[float] = None, + quick_lte: Optional[float] = None, + cash: Optional[float] = None, + cash_gt: Optional[float] = None, + cash_gte: Optional[float] = None, + cash_lt: Optional[float] = None, + cash_lte: Optional[float] = None, + ev_to_sales: Optional[float] = None, + ev_to_sales_gt: Optional[float] = None, + ev_to_sales_gte: Optional[float] = None, + ev_to_sales_lt: Optional[float] = None, + ev_to_sales_lte: Optional[float] = None, + ev_to_ebitda: Optional[float] = None, + ev_to_ebitda_gt: Optional[float] = None, + ev_to_ebitda_gte: Optional[float] = None, + ev_to_ebitda_lt: Optional[float] = None, + ev_to_ebitda_lte: Optional[float] = None, + enterprise_value: Optional[float] = None, + enterprise_value_gt: Optional[float] = None, + enterprise_value_gte: Optional[float] = None, + enterprise_value_lt: Optional[float] = None, + enterprise_value_lte: Optional[float] = None, + free_cash_flow: Optional[float] = None, + free_cash_flow_gt: Optional[float] = None, + free_cash_flow_gte: Optional[float] = None, + free_cash_flow_lt: Optional[float] = None, + free_cash_flow_lte: Optional[float] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[FinancialRatio], HTTPResponse]: + """ + Endpoint: GET /stocks/financials/v1/ratios + """ + url = "/stocks/financials/v1/ratios" + return self._paginate( + path=url, + params=self._get_params(self.list_financials_ratios, locals()), + raw=raw, + deserializer=FinancialRatio.from_dict, + options=options, + ) diff --git a/polygon/rest/models/financials.py b/polygon/rest/models/financials.py index 5443e4f6..99fb04b9 100644 --- a/polygon/rest/models/financials.py +++ b/polygon/rest/models/financials.py @@ -525,3 +525,339 @@ def from_dict(d: Optional[Dict[str, Any]]) -> "StockFinancial": source_filing_url=d.get("source_filing_url"), start_date=d.get("start_date"), ) + + +@modelclass +class FinancialBalanceSheet: + accounts_payable: Optional[float] = None + accrued_and_other_current_liabilities: Optional[float] = None + accumulated_other_comprehensive_income: Optional[float] = None + additional_paid_in_capital: Optional[float] = None + cash_and_equivalents: Optional[float] = None + cik: Optional[str] = None + commitments_and_contingencies: Optional[float] = None + common_stock: Optional[float] = None + debt_current: Optional[float] = None + deferred_revenue_current: Optional[float] = None + filing_date: Optional[str] = None + fiscal_quarter: Optional[float] = None + fiscal_year: Optional[float] = None + goodwill: Optional[float] = None + intangible_assets_net: Optional[float] = None + inventories: Optional[float] = None + long_term_debt_and_capital_lease_obligations: Optional[float] = None + noncontrolling_interest: Optional[float] = None + other_assets: Optional[float] = None + other_current_assets: Optional[float] = None + other_equity: Optional[float] = None + other_noncurrent_liabilities: Optional[float] = None + period_end: Optional[str] = None + preferred_stock: Optional[float] = None + property_plant_equipment_net: Optional[float] = None + receivables: Optional[float] = None + retained_earnings_deficit: Optional[float] = None + short_term_investments: Optional[float] = None + tickers: Optional[List[str]] = None + timeframe: Optional[str] = None + total_assets: Optional[float] = None + total_current_assets: Optional[float] = None + total_current_liabilities: Optional[float] = None + total_equity: Optional[float] = None + total_equity_attributable_to_parent: Optional[float] = None + total_liabilities: Optional[float] = None + total_liabilities_and_equity: Optional[float] = None + treasury_stock: Optional[float] = None + + @staticmethod + def from_dict(d): + return FinancialBalanceSheet( + accounts_payable=d.get("accounts_payable"), + accrued_and_other_current_liabilities=d.get( + "accrued_and_other_current_liabilities" + ), + accumulated_other_comprehensive_income=d.get( + "accumulated_other_comprehensive_income" + ), + additional_paid_in_capital=d.get("additional_paid_in_capital"), + cash_and_equivalents=d.get("cash_and_equivalents"), + cik=d.get("cik"), + commitments_and_contingencies=d.get("commitments_and_contingencies"), + common_stock=d.get("common_stock"), + debt_current=d.get("debt_current"), + deferred_revenue_current=d.get("deferred_revenue_current"), + filing_date=d.get("filing_date"), + fiscal_quarter=d.get("fiscal_quarter"), + fiscal_year=d.get("fiscal_year"), + goodwill=d.get("goodwill"), + intangible_assets_net=d.get("intangible_assets_net"), + inventories=d.get("inventories"), + long_term_debt_and_capital_lease_obligations=d.get( + "long_term_debt_and_capital_lease_obligations" + ), + noncontrolling_interest=d.get("noncontrolling_interest"), + other_assets=d.get("other_assets"), + other_current_assets=d.get("other_current_assets"), + other_equity=d.get("other_equity"), + other_noncurrent_liabilities=d.get("other_noncurrent_liabilities"), + period_end=d.get("period_end"), + preferred_stock=d.get("preferred_stock"), + property_plant_equipment_net=d.get("property_plant_equipment_net"), + receivables=d.get("receivables"), + retained_earnings_deficit=d.get("retained_earnings_deficit"), + short_term_investments=d.get("short_term_investments"), + tickers=d.get("tickers"), + timeframe=d.get("timeframe"), + total_assets=d.get("total_assets"), + total_current_assets=d.get("total_current_assets"), + total_current_liabilities=d.get("total_current_liabilities"), + total_equity=d.get("total_equity"), + total_equity_attributable_to_parent=d.get( + "total_equity_attributable_to_parent" + ), + total_liabilities=d.get("total_liabilities"), + total_liabilities_and_equity=d.get("total_liabilities_and_equity"), + treasury_stock=d.get("treasury_stock"), + ) + + +@modelclass +class FinancialCashFlowStatement: + cash_from_operating_activities_continuing_operations: Optional[float] = None + change_in_cash_and_equivalents: Optional[float] = None + change_in_other_operating_assets_and_liabilities_net: Optional[float] = None + cik: Optional[str] = None + depreciation_depletion_and_amortization: Optional[float] = None + dividends: Optional[float] = None + effect_of_currency_exchange_rate: Optional[float] = None + filing_date: Optional[str] = None + fiscal_quarter: Optional[float] = None + fiscal_year: Optional[float] = None + income_loss_from_discontinued_operations: Optional[float] = None + long_term_debt_issuances_repayments: Optional[float] = None + net_cash_from_financing_activities: Optional[float] = None + net_cash_from_financing_activities_continuing_operations: Optional[float] = None + net_cash_from_financing_activities_discontinued_operations: Optional[float] = None + net_cash_from_investing_activities: Optional[float] = None + net_cash_from_investing_activities_continuing_operations: Optional[float] = None + net_cash_from_investing_activities_discontinued_operations: Optional[float] = None + net_cash_from_operating_activities: Optional[float] = None + net_cash_from_operating_activities_discontinued_operations: Optional[float] = None + net_income: Optional[float] = None + noncontrolling_interests: Optional[float] = None + other_cash_adjustments: Optional[float] = None + other_financing_activities: Optional[float] = None + other_investing_activities: Optional[float] = None + other_operating_activities: Optional[float] = None + period_end: Optional[str] = None + purchase_of_property_plant_and_equipment: Optional[float] = None + sale_of_property_plant_and_equipment: Optional[float] = None + short_term_debt_issuances_repayments: Optional[float] = None + tickers: Optional[List[str]] = None + timeframe: Optional[str] = None + + @staticmethod + def from_dict(d): + return FinancialCashFlowStatement( + cash_from_operating_activities_continuing_operations=d.get( + "cash_from_operating_activities_continuing_operations" + ), + change_in_cash_and_equivalents=d.get("change_in_cash_and_equivalents"), + change_in_other_operating_assets_and_liabilities_net=d.get( + "change_in_other_operating_assets_and_liabilities_net" + ), + cik=d.get("cik"), + depreciation_depletion_and_amortization=d.get( + "depreciation_depletion_and_amortization" + ), + dividends=d.get("dividends"), + effect_of_currency_exchange_rate=d.get("effect_of_currency_exchange_rate"), + filing_date=d.get("filing_date"), + fiscal_quarter=d.get("fiscal_quarter"), + fiscal_year=d.get("fiscal_year"), + income_loss_from_discontinued_operations=d.get( + "income_loss_from_discontinued_operations" + ), + long_term_debt_issuances_repayments=d.get( + "long_term_debt_issuances_repayments" + ), + net_cash_from_financing_activities=d.get( + "net_cash_from_financing_activities" + ), + net_cash_from_financing_activities_continuing_operations=d.get( + "net_cash_from_financing_activities_continuing_operations" + ), + net_cash_from_financing_activities_discontinued_operations=d.get( + "net_cash_from_financing_activities_discontinued_operations" + ), + net_cash_from_investing_activities=d.get( + "net_cash_from_investing_activities" + ), + net_cash_from_investing_activities_continuing_operations=d.get( + "net_cash_from_investing_activities_continuing_operations" + ), + net_cash_from_investing_activities_discontinued_operations=d.get( + "net_cash_from_investing_activities_discontinued_operations" + ), + net_cash_from_operating_activities=d.get( + "net_cash_from_operating_activities" + ), + net_cash_from_operating_activities_discontinued_operations=d.get( + "net_cash_from_operating_activities_discontinued_operations" + ), + net_income=d.get("net_income"), + noncontrolling_interests=d.get("noncontrolling_interests"), + other_cash_adjustments=d.get("other_cash_adjustments"), + other_financing_activities=d.get("other_financing_activities"), + other_investing_activities=d.get("other_investing_activities"), + other_operating_activities=d.get("other_operating_activities"), + period_end=d.get("period_end"), + purchase_of_property_plant_and_equipment=d.get( + "purchase_of_property_plant_and_equipment" + ), + sale_of_property_plant_and_equipment=d.get( + "sale_of_property_plant_and_equipment" + ), + short_term_debt_issuances_repayments=d.get( + "short_term_debt_issuances_repayments" + ), + tickers=d.get("tickers"), + timeframe=d.get("timeframe"), + ) + + +@modelclass +class FinancialIncomeStatement: + basic_earnings_per_share: Optional[float] = None + basic_shares_outstanding: Optional[float] = None + cik: Optional[str] = None + consolidated_net_income_loss: Optional[float] = None + cost_of_revenue: Optional[float] = None + depreciation_depletion_amortization: Optional[float] = None + diluted_earnings_per_share: Optional[float] = None + diluted_shares_outstanding: Optional[float] = None + discontinued_operations: Optional[float] = None + ebitda: Optional[float] = None + equity_in_affiliates: Optional[float] = None + extraordinary_items: Optional[float] = None + filing_date: Optional[str] = None + fiscal_quarter: Optional[float] = None + fiscal_year: Optional[float] = None + gross_profit: Optional[float] = None + income_before_income_taxes: Optional[float] = None + income_taxes: Optional[float] = None + interest_expense: Optional[float] = None + interest_income: Optional[float] = None + net_income_loss_attributable_common_shareholders: Optional[float] = None + noncontrolling_interest: Optional[float] = None + operating_income: Optional[float] = None + other_income_expense: Optional[float] = None + other_operating_expenses: Optional[float] = None + period_end: Optional[str] = None + preferred_stock_dividends_declared: Optional[float] = None + research_development: Optional[float] = None + revenue: Optional[float] = None + selling_general_administrative: Optional[float] = None + tickers: Optional[List[str]] = None + timeframe: Optional[str] = None + total_operating_expenses: Optional[float] = None + total_other_income_expense: Optional[float] = None + + @staticmethod + def from_dict(d): + return FinancialIncomeStatement( + basic_earnings_per_share=d.get("basic_earnings_per_share"), + basic_shares_outstanding=d.get("basic_shares_outstanding"), + cik=d.get("cik"), + consolidated_net_income_loss=d.get("consolidated_net_income_loss"), + cost_of_revenue=d.get("cost_of_revenue"), + depreciation_depletion_amortization=d.get( + "depreciation_depletion_amortization" + ), + diluted_earnings_per_share=d.get("diluted_earnings_per_share"), + diluted_shares_outstanding=d.get("diluted_shares_outstanding"), + discontinued_operations=d.get("discontinued_operations"), + ebitda=d.get("ebitda"), + equity_in_affiliates=d.get("equity_in_affiliates"), + extraordinary_items=d.get("extraordinary_items"), + filing_date=d.get("filing_date"), + fiscal_quarter=d.get("fiscal_quarter"), + fiscal_year=d.get("fiscal_year"), + gross_profit=d.get("gross_profit"), + income_before_income_taxes=d.get("income_before_income_taxes"), + income_taxes=d.get("income_taxes"), + interest_expense=d.get("interest_expense"), + interest_income=d.get("interest_income"), + net_income_loss_attributable_common_shareholders=d.get( + "net_income_loss_attributable_common_shareholders" + ), + noncontrolling_interest=d.get("noncontrolling_interest"), + operating_income=d.get("operating_income"), + other_income_expense=d.get("other_income_expense"), + other_operating_expenses=d.get("other_operating_expenses"), + period_end=d.get("period_end"), + preferred_stock_dividends_declared=d.get( + "preferred_stock_dividends_declared" + ), + research_development=d.get("research_development"), + revenue=d.get("revenue"), + selling_general_administrative=d.get("selling_general_administrative"), + tickers=d.get("tickers"), + timeframe=d.get("timeframe"), + total_operating_expenses=d.get("total_operating_expenses"), + total_other_income_expense=d.get("total_other_income_expense"), + ) + + +@modelclass +class FinancialRatio: + average_volume: Optional[float] = None + cash: Optional[float] = None + cik: Optional[str] = None + current: Optional[float] = None + date: Optional[str] = None + debt_to_equity: Optional[float] = None + dividend_yield: Optional[float] = None + earnings_per_share: Optional[float] = None + enterprise_value: Optional[float] = None + ev_to_ebitda: Optional[float] = None + ev_to_sales: Optional[float] = None + free_cash_flow: Optional[float] = None + market_cap: Optional[float] = None + price: Optional[float] = None + price_to_book: Optional[float] = None + price_to_cash_flow: Optional[float] = None + price_to_earnings: Optional[float] = None + price_to_free_cash_flow: Optional[float] = None + price_to_sales: Optional[float] = None + quick: Optional[float] = None + return_on_assets: Optional[float] = None + return_on_equity: Optional[float] = None + ticker: Optional[str] = None + + @staticmethod + def from_dict(d): + return FinancialRatio( + average_volume=d.get("average_volume"), + cash=d.get("cash"), + cik=d.get("cik"), + current=d.get("current"), + date=d.get("date"), + debt_to_equity=d.get("debt_to_equity"), + dividend_yield=d.get("dividend_yield"), + earnings_per_share=d.get("earnings_per_share"), + enterprise_value=d.get("enterprise_value"), + ev_to_ebitda=d.get("ev_to_ebitda"), + ev_to_sales=d.get("ev_to_sales"), + free_cash_flow=d.get("free_cash_flow"), + market_cap=d.get("market_cap"), + price=d.get("price"), + price_to_book=d.get("price_to_book"), + price_to_cash_flow=d.get("price_to_cash_flow"), + price_to_earnings=d.get("price_to_earnings"), + price_to_free_cash_flow=d.get("price_to_free_cash_flow"), + price_to_sales=d.get("price_to_sales"), + quick=d.get("quick"), + return_on_assets=d.get("return_on_assets"), + return_on_equity=d.get("return_on_equity"), + ticker=d.get("ticker"), + )