diff options
author | Danglewood <85772166+deeleeramone@users.noreply.github.com> | 2024-01-03 08:21:10 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-03 16:21:10 +0000 |
commit | 5c4ac285b03bb7f617738c148ca72c6f10c8ad5f (patch) | |
tree | ea4ab1a5893612f068932d1f6cd6888821066cb1 | |
parent | 3eaf0d2ef1c28fff8ce1cb809594288fb34ae70e (diff) |
hotfix/financials-field-maps: Updates A Couple FMP/Polygon Income Statement Fields (#5907)
* update income statement fields
* another polygon field
* ratio -> margin
* black
* explicit fmp fields
* add reported_currency for standardized intrinio
* # pylint: disable=unused-argument
* another unused-argument
* black..
* patch tests
* polygon income: eps -> basic earnings per share
* re-capture terminal portfolio menu test
---------
Co-authored-by: hjoaquim <h.joaquim@campus.fct.unl.pt>
10 files changed, 574 insertions, 69 deletions
diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/balance_sheet.py b/openbb_platform/providers/fmp/openbb_fmp/models/balance_sheet.py index a67d1089e10..d8f40c65123 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/models/balance_sheet.py +++ b/openbb_platform/providers/fmp/openbb_fmp/models/balance_sheet.py @@ -1,5 +1,5 @@ """FMP Balance Sheet Model.""" - +# pylint: disable=unused-argument from datetime import ( date as dateType, datetime, @@ -33,7 +33,7 @@ class FMPBalanceSheetData(BalanceSheetData): "fiscal_year": "calendarYear", "filing_date": "fillingDate", "accepted_date": "acceptedDate", - "currency": "reportedCurrency", + "reported_currency": "reportedCurrency", "cash_and_cash_equivalents": "cashAndCashEquivalents", "short_term_investments": "shortTermInvestments", "cash_and_short_term_investments": "cashAndShortTermInvestments", @@ -69,11 +69,11 @@ class FMPBalanceSheetData(BalanceSheetData): "common_stock": "commonStock", "retained_earnings": "retainedEarnings", "accumulated_other_comprehensive_income": "accumulatedOtherComprehensiveIncomeLoss", - "other_stock_holders_equity": "otherStockholdersEquity", - "other_total_stock_holders_equity": "othertotalStockholdersEquity", + "other_shareholders_equity": "otherStockholdersEquity", + "other_total_shareholders_equity": "othertotalStockholdersEquity", "total_common_equity": "totalStockholdersEquity", "total_equity_non_controlling_interests": "totalEquity", - "total_liabilities_shareholders_equity": "totalLiabilitiesAndStockholdersEquity", + "total_liabilities_and_shareholders_equity": "totalLiabilitiesAndStockholdersEquity", "minority_interest": "minorityInterest", "total_liabilities_and_total_equity": "totalLiabilitiesAndTotalEquity", "total_investments": "totalInvestments", @@ -91,6 +91,198 @@ class FMPBalanceSheetData(BalanceSheetData): default=None, description="The date and time when the filing was accepted.", ) + reported_currency: Optional[str] = Field( + default=None, + description="The currency in which the balance sheet was reported.", + ) + cash_and_cash_equivalents: Optional[float] = Field( + default=None, + description="Cash and cash equivalents.", + ) + short_term_investments: Optional[float] = Field( + default=None, + description="Short term investments.", + ) + cash_and_short_term_investments: Optional[float] = Field( + default=None, + description="Cash and short term investments.", + ) + net_receivables: Optional[float] = Field( + default=None, + description="Net receivables.", + ) + inventory: Optional[float] = Field( + default=None, + description="Inventory.", + ) + other_current_assets: Optional[float] = Field( + default=None, + description="Other current assets.", + ) + total_current_assets: Optional[float] = Field( + default=None, + description="Total current assets.", + ) + plant_property_equipment_net: Optional[float] = Field( + default=None, + description="Plant property equipment net.", + ) + goodwill: Optional[float] = Field( + default=None, + description="Goodwill.", + ) + intangible_assets: Optional[float] = Field( + default=None, + description="Intangible assets.", + ) + goodwill_and_intangible_assets: Optional[float] = Field( + default=None, + description="Goodwill and intangible assets.", + ) + long_term_investments: Optional[float] = Field( + default=None, + description="Long term investments.", + ) + tax_assets: Optional[float] = Field( + default=None, + description="Tax assets.", + ) + other_non_current_assets: Optional[float] = Field( + default=None, + description="Other non current assets.", + ) + non_current_assets: Optional[float] = Field( + default=None, + description="Total non current assets.", + ) + other_assets: Optional[float] = Field( + default=None, + description="Other assets.", + ) + total_assets: Optional[float] = Field( + default=None, + description="Total assets.", + ) + accounts_payable: Optional[float] = Field( + default=None, + description="Accounts payable.", + ) + short_term_debt: Optional[float] = Field( + default=None, + description="Short term debt.", + ) + tax_payables: Optional[float] = Field( + default=None, + description="Tax payables.", + ) + current_deferred_revenue: Optional[float] = Field( + default=None, + description="Current deferred revenue.", + ) + other_current_liabilities: Optional[float] = Field( + default=None, + description="Other current liabilities.", + ) + total_current_liabilities: Optional[float] = Field( + default=None, + description="Total current liabilities.", + ) + long_term_debt: Optional[float] = Field( + default=None, + description="Long term debt.", + ) + deferred_revenue_non_current: Optional[float] = Field( + default=None, + description="Non current deferred revenue.", + ) + deferred_tax_liabilities_non_current: Optional[float] = Field( + default=None, + description="Deferred tax liabilities non current.", + ) + other_non_current_liabilities: Optional[float] = Field( + default=None, + description="Other non current liabilities.", + ) + total_non_current_liabilities: Optional[float] = Field( + default=None, + description="Total non current liabilities.", + ) + other_liabilities: Optional[float] = Field( + default=None, + description="Other liabilities.", + ) + capital_lease_obligations: Optional[float] = Field( + default=None, + description="Capital lease obligations.", + ) + total_liabilities: Optional[float] = Field( + default=None, + description="Total liabilities.", + ) + preferred_stock: Optional[float] = Field( + default=None, + description="Preferred stock.", + ) + common_stock: Optional[float] = Field( + default=None, + description="Common stock.", + ) + retained_earnings: Optional[float] = Field( + default=None, + description="Retained earnings.", + ) + accumulated_other_comprehensive_income: Optional[float] = Field( + default=None, + description="Accumulated other comprehensive income (loss).", + ) + other_shareholders_equity: Optional[float] = Field( + default=None, + description="Other shareholders equity.", + ) + other_total_shareholders_equity: Optional[float] = Field( + default=None, + description="Other total shareholders equity.", + ) + total_common_equity: Optional[float] = Field( + default=None, + description="Total common equity.", + ) + total_equity_non_controlling_interests: Optional[float] = Field( + default=None, + description="Total equity non controlling interests.", + ) + total_liabilities_and_shareholders_equity: Optional[float] = Field( + default=None, + description="Total liabilities and shareholders equity.", + ) + minority_interest: Optional[float] = Field( + default=None, + description="Minority interest.", + ) + total_liabilities_and_total_equity: Optional[float] = Field( + default=None, + description="Total liabilities and total equity.", + ) + total_investments: Optional[float] = Field( + default=None, + description="Total investments.", + ) + total_debt: Optional[float] = Field( + default=None, + description="Total debt.", + ) + net_debt: Optional[float] = Field( + default=None, + description="Net debt.", + ) + link: Optional[str] = Field( + default=None, + description="Link to the filing.", + ) + final_link: Optional[str] = Field( + default=None, + description="Link to the filing document.", + ) @model_validator(mode="before") @classmethod diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/cash_flow.py b/openbb_platform/providers/fmp/openbb_fmp/models/cash_flow.py index e497b4aa6f8..0b72101a517 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/models/cash_flow.py +++ b/openbb_platform/providers/fmp/openbb_fmp/models/cash_flow.py @@ -1,5 +1,5 @@ """FMP Cash Flow Statement Model.""" - +# pylint: disable=unused-argument from datetime import ( date as dateType, @@ -40,11 +40,11 @@ class FMPCashFlowStatementData(CashFlowStatementData): "deferred_income_tax": "deferredIncomeTax", "stock_based_compensation": "stockBasedCompensation", "change_in_working_capital": "changeInWorkingCapital", - "changes_in_account_receivables": "accountsReceivables", - "changes_in_inventory": "inventory", + "change_in_account_receivables": "accountsReceivables", + "change_in_inventory": "inventory", "change_in_account_payable": "accountsPayables", - "changes_in_other_working_capital": "otherWorkingCapital", - "changes_in_other_non_cash_items": "otherNonCashItems", + "change_in_other_working_capital": "otherWorkingCapital", + "change_in_other_non_cash_items": "otherNonCashItems", "net_cash_from_operating_activities": "netCashProvidedByOperatingActivities", "purchase_of_property_plant_and_equipment": "investmentsInPropertyPlantAndEquipment", "acquisitions": "acquisitionsNet", @@ -69,9 +69,148 @@ class FMPCashFlowStatementData(CashFlowStatementData): "final_link": "finalLink", } - fiscal_year: int = Field(description="The fiscal year of the fiscal period.") - filing_date: dateType = Field(description="The date of the filing.") - accepted_date: datetime = Field(description="The date the filing was accepted.") + fiscal_year: Optional[int] = Field( + default=None, + description="The fiscal year of the fiscal period.", + ) + filing_date: Optional[dateType] = Field( + default=None, + description="The date of the filing.", + ) + accepted_date: Optional[datetime] = Field( + default=None, description="The date the filing was accepted." + ) + reported_currency: Optional[str] = Field( + default=None, + description="The currency in which the cash flow statement was reported.", + ) + net_income: Optional[float] = Field( + default=None, + description="Net income.", + ) + depreciation_and_amortization: Optional[float] = Field( + default=None, + description="Depreciation and amortization.", + ) + deferred_income_tax: Optional[float] = Field( + default=None, + description="Deferred income tax.", + ) + stock_based_compensation: Optional[float] = Field( + default=None, + description="Stock-based compensation.", + ) + change_in_working_capital: Optional[float] = Field( + default=None, + description="Change in working capital.", + ) + change_in_account_receivables: Optional[float] = Field( + default=None, + description="Change in account receivables.", + ) + change_in_inventory: Optional[float] = Field( + default=None, + description="Change in inventory.", + ) + change_in_account_payable: Optional[float] = Field( + default=None, + description="Change in account payable.", + ) + change_in_other_working_capital: Optional[float] = Field( + default=None, + description="Change in other working capital.", + ) + change_in_other_non_cash_items: Optional[float] = Field( + default=None, + description="Change in other non-cash items.", + ) + net_cash_from_operating_activities: Optional[float] = Field( + default=None, + description="Net cash from operating activities.", + ) + purchase_of_property_plant_and_equipment: Optional[float] = Field( + default=None, + description="Purchase of property, plant and equipment.", + ) + acquisitions: Optional[float] = Field( + default=None, + description="Acquisitions.", + ) + purchase_of_investment_securities: Optional[float] = Field( + default=None, + description="Purchase of investment securities.", + ) + sale_and_maturity_of_investments: Optional[float] = Field( + default=None, + description="Sale and maturity of investments.", + ) + other_investing_activities: Optional[float] = Field( + default=None, + description="Other investing activities.", + ) + net_cash_from_investing_activities: Optional[float] = Field( + default=None, + description="Net cash from investing activities.", + ) + repayment_of_debt: Optional[float] = Field( + default=None, + description="Repayment of debt.", + ) + issuance_of_common_equity: Optional[float] = Field( + default=None, + description="Issuance of common equity.", + ) + repurchase_of_common_equity: Optional[float] = Field( + default=None, + description="Repurchase of common equity.", + ) + payment_of_dividends: Optional[float] = Field( + default=None, + description="Payment of dividends.", + ) + other_financing_activities: Optional[float] = Field( + default=None, + description="Other financing activities.", + ) + net_cash_from_financing_activities: Optional[float] = Field( + default=None, + description="Net cash from financing activities.", + ) + effect_of_exchange_rate_changes_on_cash: Optional[float] = Field( + default=None, + description="Effect of exchange rate changes on cash.", + ) + net_change_in_cash_and_equivalents: Optional[float] = Field( + default=None, + description="Net change in cash and equivalents.", + ) + cash_at_beginning_of_period: Optional[float] = Field( + default=None, + description="Cash at beginning of period.", + ) + cash_at_end_of_period: Optional[float] = Field( + default=None, + description="Cash at end of period.", + ) + operating_cash_flow: Optional[float] = Field( + default=None, + description="Operating cash flow.", + ) + capital_expenditure: Optional[float] = Field( + default=None, + description="Capital expenditure.", + ) + free_cash_flow: Optional[float] = Field( + default=None, + ) + link: Optional[str] = Field( + default=None, + description="Link to the filing.", + ) + final_link: Optional[str] = Field( + default=None, + description="Link to the filing document.", + ) @model_validator(mode="before") @classmethod diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/income_statement.py b/openbb_platform/providers/fmp/openbb_fmp/models/income_statement.py index ca015c0fb38..5eb3c7dfbfb 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/models/income_statement.py +++ b/openbb_platform/providers/fmp/openbb_fmp/models/income_statement.py @@ -1,5 +1,5 @@ """FMP Income Statement Model.""" - +# pylint: disable=unused-argument from datetime import ( date as dateType, datetime, @@ -37,7 +37,7 @@ class FMPIncomeStatementData(IncomeStatementData): "revenue": "revenue", "cost_of_revenue": "costOfRevenue", "gross_profit": "grossProfit", - "gross_profit_ratio": "grossProfitRatio", + "gross_profit_margin": "grossProfitRatio", "general_and_admin_expense": "generalAndAdministrativeExpenses", "research_and_development_expense": "researchAndDevelopmentExpenses", "selling_and_marketing_expense": "sellingAndMarketingExpenses", @@ -46,18 +46,18 @@ class FMPIncomeStatementData(IncomeStatementData): "total_operating_expenses": "operatingExpenses", "cost_and_expenses": "costAndExpenses", "interest_income": "interestIncome", - "interest_expense": "interestExpense", + "total_interest_expense": "interestExpense", "depreciation_and_amortization": "depreciationAndAmortization", "ebitda": "ebitda", "ebitda_margin": "ebitdaratio", - "operating_income": "operatingIncome", - "operating_income_ratio": "operatingIncomeRatio", - "total_other_income_expenses_net": "totalOtherIncomeExpensesNet", - "income_before_tax": "incomeBeforeTax", - "income_before_tax_ratio": "incomeBeforeTaxRatio", + "total_operating_income": "operatingIncome", + "operating_income_margin": "operatingIncomeRatio", + "total_other_income_expenses": "totalOtherIncomeExpensesNet", + "total_pre_tax_income": "incomeBeforeTax", + "pre_tax_income_margin": "incomeBeforeTaxRatio", "income_tax_expense": "incomeTaxExpense", "consolidated_net_income": "netIncome", - "net_income_ratio": "netIncomeRatio", + "net_income_margin": "netIncomeRatio", "basic_earnings_per_share": "eps", "diluted_earnings_per_share": "epsdiluted", "weighted_average_basic_shares_outstanding": "weightedAverageShsOut", @@ -66,10 +66,137 @@ class FMPIncomeStatementData(IncomeStatementData): "final_link": "finalLink", } - filing_date: dateType = Field(description="The date of the filing.") - accepted_date: datetime = Field(description="The date the filing was accepted.") - reported_currency: str = Field( - description="The reported currency of the filing.", + filing_date: Optional[dateType] = Field( + default=None, + description="The date when the filing was made.", + ) + accepted_date: Optional[datetime] = Field( + default=None, + description="The date and time when the filing was accepted.", + ) + reported_currency: Optional[str] = Field( + default=None, + description="The currency in which the balance sheet was reported.", + ) + revenue: Optional[float] = Field( + default=None, + description="Total revenue.", + ) + cost_of_revenue: Optional[float] = Field( + default=None, + description="Cost of revenue.", + ) + gross_profit: Optional[float] = Field( + default=None, + description="Gross profit.", + ) + gross_profit_margin: Optional[float] = Field( + default=None, + description="Gross profit margin.", + ) + general_and_admin_expense: Optional[float] = Field( + default=None, + description="General and administrative expenses.", + ) + research_and_development_expense: Optional[float] = Field( + default=None, + description="Research and development expenses.", + ) + selling_and_marketing_expense: Optional[float] = Field( + default=None, + description="Selling and marketing expenses.", + ) + selling_general_and_admin_expense: Optional[float] = Field( + default=None, + description="Selling, general and administrative expenses.", + ) + other_expenses: Optional[float] = Field( + default=None, + description="Other expenses.", + ) + total_operating_expenses: Optional[float] = Field( + default=None, + description="Total operating expenses.", + ) + cost_and_expenses: Optional[float] = Field( + default=None, + description="Cost and expenses.", + ) + interest_income: Optional[float] = Field( + default=None, + description="Interest income.", + ) + total_interest_expense: Optional[float] = Field( + default=None, + description="Total interest expenses.", + ) + depreciation_and_amortization: Optional[float] = Field( + default=None, + description="Depreciation and amortization.", + ) + ebitda: Optional[float] = Field( + default=None, + description="EBITDA.", + ) + ebitda_margin: Optional[float] = Field( + default=None, + description="EBITDA margin.", + ) + total_operating_income: Optional[float] = Field( + default=None, + description="Total operating income.", + ) + operating_income_margin: Optional[float] = Field( + default=None, + description="Operating income margin.", + ) + total_other_income_expenses: Optional[float] = Field( + default=None, + description="Total other income and expenses.", + ) + total_pre_tax_income: Optional[float] = Field( + default=None, + description="Total pre-tax income.", + ) + pre_tax_income_margin: Optional[float] = Field( + default=None, + description="Pre-tax income margin.", + ) + income_tax_expense: Optional[float] = Field( + default=None, + description="Income tax expense.", + ) + consolidated_net_income: Optional[float] = Field( + default=None, + description="Consolidated net income.", + ) + net_income_margin: Optional[float] = Field( + default=None, + description="Net income margin.", + ) + basic_earnings_per_share: Optional[float] = Field( + default=None, + description="Basic earnings per share.", + ) + diluted_earnings_per_share: Optional[float] = Field( + default=None, + description="Diluted earnings per share.", + ) + weighted_average_basic_shares_outstanding: Optional[float] = Field( + default=None, + description="Weighted average basic shares outstanding.", + ) + weighted_average_diluted_shares_outstanding: Optional[float] = Field( + default=None, + description="Weighted average diluted shares outstanding.", + ) + link: Optional[str] = Field( + default=None, + description="Link to the filing.", + ) + final_link: Optional[str] = Field( + default=None, + description="Link to the filing document.", ) @model_validator(mode="before") diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/models/balance_sheet.py b/openbb_platform/providers/intrinio/openbb_intrinio/models/balance_sheet.py index 402bcaf140c..cadc8672be1 100644 --- a/openbb_platform/providers/intrinio/openbb_intrinio/models/balance_sheet.py +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/balance_sheet.py @@ -1,5 +1,5 @@ """Intrinio Balance Sheet Model.""" - +# pylint: disable=unused-argument import warnings from typing import Any, Dict, List, Literal, Optional @@ -135,7 +135,10 @@ class IntrinioBalanceSheetData(BalanceSheetData): "total_equity_non_controlling_interests": "totalequityandnoncontrollinginterests", "total_liabilities_shareholders_equity": "totalliabilitiesandequity", } - + reported_currency: Optional[str] = Field( + description="The currency in which the balance sheet is reported.", + default=None, + ) cash_and_cash_equivalents: Optional[int] = Field( description="Cash and cash equivalents.", default=None ) @@ -461,12 +464,15 @@ class IntrinioBalanceSheetFetcher( ) -> List[IntrinioBalanceSheetData]: """Return the transformed data.""" transformed_data: List[IntrinioBalanceSheetData] = [] - + units = [] for item in data: sub_dict: Dict[str, Any] = {} for sub_item in item["financials"]: field_name = sub_item["data_tag"]["tag"] + unit = sub_item["data_tag"].get("unit", "") + if unit and "share" not in unit: + units.append(unit) sub_dict[field_name] = ( float(sub_item["value"]) if sub_item["value"] and sub_item["value"] != 0 @@ -476,6 +482,7 @@ class IntrinioBalanceSheetFetcher( sub_dict["period_ending"] = item["period_ending"] sub_dict["fiscal_year"] = item["fiscal_year"] sub_dict["fiscal_period"] = item["fiscal_period"] + sub_dict["reported_currency"] = list(set(units))[0] # Intrinio does not return Q4 data but FY data instead if query.period == "QTR" and item["fiscal_period"] == "FY": diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/models/cash_flow.py b/openbb_platform/providers/intrinio/openbb_intrinio/models/cash_flow.py index 5be657439f4..73d51c409a5 100644 --- a/openbb_platform/providers/intrinio/openbb_intrinio/models/cash_flow.py +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/cash_flow.py @@ -1,5 +1,5 @@ """Intrinio Cash Flow Statement Model.""" - +# pylint: disable=unused-argument import warnings from typing import Any, Dict, List, Literal, Optional @@ -84,6 +84,10 @@ class IntrinioCashFlowStatementData(CashFlowStatementData): "sale_of_property_plant_and_equipment": "saleofplantpropertyandequipment", } + reported_currency: Optional[str] = Field( + description="The currency in which the balance sheet is reported.", + default=None, + ) net_income: Optional[float] = Field( default=None, description="Consolidated Net Income." ) @@ -293,10 +297,14 @@ class IntrinioCashFlowStatementFetcher( ) -> List[IntrinioCashFlowStatementData]: """Return the transformed data.""" transformed_data: List[IntrinioCashFlowStatementData] = [] + units = [] for item in data: sub_dict: Dict[str, Any] = {} for sub_item in item["financials"]: + unit = sub_item["data_tag"].get("unit", "") + if unit and "share" not in unit: + units.append(unit) field_name = sub_item["data_tag"]["tag"] sub_dict[field_name] = ( float(sub_item["value"]) @@ -307,6 +315,7 @@ class IntrinioCashFlowStatementFetcher( |