From dc81f6cd2478f4d64a426317433c2f08af5ebc0d Mon Sep 17 00:00:00 2001 From: Theodore Aptekarev Date: Wed, 29 Nov 2023 21:54:56 +0100 Subject: [PATCH] Standardize balance, income, cash for Intrinio (#5809) * Fix test coverage test failing * Fix spot rates integration test * Apply the standardization to intrinio balance, income and cash --------- Co-authored-by: Pratyush Shukla Co-authored-by: James Maslek --- .../openbb_intrinio/models/balance_sheet.py | 82 ++++++++++++++++--- .../openbb_intrinio/models/cash_flow.py | 81 +++++++++++++----- .../models/income_statement.py | 75 ++++++++++++++--- 3 files changed, 191 insertions(+), 47 deletions(-) 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 35029f95da9..653be7166ce 100644 --- a/openbb_platform/providers/intrinio/openbb_intrinio/models/balance_sheet.py +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/balance_sheet.py @@ -11,7 +11,7 @@ from openbb_core.provider.standard_models.balance_sheet import ( BalanceSheetQueryParams, ) from openbb_intrinio.utils.helpers import get_data_one -from pydantic import alias_generators +from pydantic import Field class IntrinioBalanceSheetQueryParams(BalanceSheetQueryParams): @@ -26,18 +26,74 @@ class IntrinioBalanceSheetData(BalanceSheetData): """Intrinio Balance Sheet Data.""" __alias_dict__ = { - "cash_and_cash_equivalents_at_carrying_value": "cash_and_equivalents", - "marketable_securities_current": "short_term_investments", - "accounts_receivable_net_current": "note_and_lease_receivable", - "inventory": "inventory_net", - "total_non_current_assets": "total_noncurrent_assets", - "tax_payables": "other_taxes_payables", - "deferred_revenue": "current_deferred_revenue", - "deferred_revenue_non_current": "noncurrent_deferred_revenue", - "deferred_tax_liabilities_non_current": "noncurrent_deferred_and_payable_income_tax_liabilities", - "other_liabilities": "other_long_term_liabilities", - "accumulated_other_comprehensive_income_loss": "accumulated_other_comprehensive_income_loss", + "cash_and_cash_equivalents": "cashandequivalents", + "short_term_investments": "shortterminvestments", + "accounts_receivable": "accountsreceivable", + "net_inventory": "netinventory", + "other_current_assets": "othercurrentassets", + "total_current_assets": "totalcurrentassets", + "long_term_investments": "longterminvestments", + "other_noncurrent_assets": "othernoncurrentassets", + "total_assets": "totalassets", + "short_term_debt": "shorttermdebt", + "accounts_payable": "accountspayable", + "other_current_liabilities": "othercurrentliabilities", + "total_current_liabilities": "totalcurrentliabilities", + "long_term_debt": "longtermdebt", + "total_liabilities": "totalliabilities", + "common_stock": "commonequity", + "retained_earnings": "retainedearnings", + "total_equity": "totalequity", } + note_receivable: Optional[float] = Field( + default=None, alias="notereceivable", description="Notes and lease receivable." + ) + net_ppe: Optional[float] = Field( + default=None, alias="netppe", description="Plant, property, and equipment, net." + ) + total_noncurrent_assets: Optional[float] = Field( + default=None, + alias="totalnoncurrentassets", + description="Total noncurrent assets.", + ) + current_deferred_revenue: Optional[float] = Field( + default=None, + alias="currentdeferredrevenue", + description="Current deferred revenue.", + ) + other_noncurrent_liabilities: Optional[float] = Field( + default=None, + alias="othernoncurrentliabilities", + description="Other noncurrent operating liabilities.", + ) + total_noncurrent_liabilities: Optional[float] = Field( + default=None, + alias="totalnoncurrentliabilities", + description="Total noncurrent liabilities.", + ) + commitments_and_contingencies: Optional[float] = Field( + default=None, + alias="commitmentsandcontingencies", + description="Commitments and contingencies.", + ) + aoci: Optional[float] = Field( + default=None, + alias="aoci", + description="Accumulated other comprehensive income / (loss).", + ) + total_common_equity: Optional[float] = Field( + default=None, alias="totalcommonequity", description="Total common equity." + ) + total_equity_and_noncontrolling_interests: Optional[float] = Field( + default=None, + alias="totalequityandnoncontrollinginterests", + description="Total equity & noncontrolling interests.", + ) + total_liabilities_and_equity: Optional[float] = Field( + default=None, + alias="totalliabilitiesandequity", + description="Total liabilities & shareholders' equity.", + ) class IntrinioBalanceSheetFetcher( @@ -114,7 +170,7 @@ class IntrinioBalanceSheetFetcher( sub_dict: Dict[str, Any] = {} for sub_item in item["financials"]: - field_name = alias_generators.to_snake(sub_item["data_tag"]["name"]) + field_name = sub_item["data_tag"]["tag"] sub_dict[field_name] = float(sub_item["value"]) sub_dict["date"] = item["date"] 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 dde523698c0..af011efedb0 100644 --- a/openbb_platform/providers/intrinio/openbb_intrinio/models/cash_flow.py +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/cash_flow.py @@ -11,7 +11,7 @@ from openbb_core.provider.standard_models.cash_flow import ( CashFlowStatementQueryParams, ) from openbb_intrinio.utils.helpers import get_data_one -from pydantic import alias_generators +from pydantic import Field class IntrinioCashFlowStatementQueryParams(CashFlowStatementQueryParams): @@ -26,11 +26,9 @@ class IntrinioCashFlowStatementData(CashFlowStatementData): """Intrinio Cash Flow Statement Data.""" __alias_dict__ = { - "net_income": "NetIncomeLoss", - "depreciation_and_amortization": "DepreciationDepletionAndAmortization", - "stock_based_compensation": "ShareBasedCompensation", - "deferred_income_tax": "DeferredIncomeTaxExpenseBenefit", - "other_non_cash_items": "OtherNoncashIncomeExpense", + "net_income": "netincome", + "depreciation_and_amortization": "depreciationexpense", + "other_non_cash_items": "noncashadjustmentstonetincome", "accounts_receivables": "IncreaseDecreaseInAccountsReceivable", "inventory": "IncreaseDecreaseInInventories", "vendor_non_trade_receivables": "IncreaseDecreaseInOtherReceivables", @@ -38,23 +36,62 @@ class IntrinioCashFlowStatementData(CashFlowStatementData): "accounts_payables": "IncreaseDecreaseInAccountsPayable", "deferred_revenue": "IncreaseDecreaseInContractWithCustomerLiability", "other_current_and_non_current_liabilities": "IncreaseDecreaseInOtherOperatingLiabilities", - "net_cash_flow_from_operating_activities": "NetCashProvidedByUsedInOperatingActivities", - "purchases_of_marketable_securities": "PaymentsToAcquireAvailableForSaleSecuritiesDebt", - "sales_from_maturities_of_investments": "ProceedsFromSaleOfAvailableForSaleSecuritiesDebt", - "investments_in_property_plant_and_equipment": "ProceedsFromMaturitiesPrepaymentsAndCallsOfAvailableForSaleSecurities", # noqa: E501 - "payments_from_acquisitions": "PaymentsToAcquireBusinessesNetOfCashAcquired", - "other_investing_activities": "PaymentsForProceedsFromOtherInvestingActivities", - "net_cash_flow_from_investing_activities": "NetCashProvidedByUsedInInvestingActivities", - "taxes_paid_on_net_share_settlement": "PaymentsRelatedToTaxWithholdingForShareBasedCompensation", - "dividends_paid": "PaymentsOfDividends", - "common_stock_repurchased": "PaymentsForRepurchaseOfCommonStock", - "debt_proceeds": "ProceedsFromIssuanceOfLongTermDebt", - "debt_repayment": "RepaymentsOfLongTermDebt", - "other_financing_activities": "ProceedsFromPaymentsForOtherFinancingActivities", - "net_cash_flow_from_financing_activities": "NetCashProvidedByUsedInFinancingActivities", - "net_change_in_cash": "CashCashEquivalentsRestrictedCashAndRestrictedCashEquivalentsPeriodIncreaseDecreaseIncludingExchangeRateEffect", # noqa: E501 + "net_cash_flow_from_operating_activities": "netcashfromoperatingactivities", + "purchases_of_marketable_securities": "purchaseofinvestments", + "sales_from_maturities_of_investments": "saleofinvestments", + "investments_in_property_plant_and_equipment": "purchaseofplantpropertyandequipment", + "payments_from_acquisitions": "acquisitions", + "other_investing_activities": "otherinvestingactivitiesnet", + "net_cash_flow_from_investing_activities": "netcashfrominvestingactivities", + "dividends_paid": "paymentofdividends", + "common_stock_repurchased": "repurchaseofcommonequity", + "debt_proceeds": "issuanceofdebt", + "debt_repayment": "repaymentofdebt", + "other_financing_activities": "otherfinancingactivitiesnet", + "net_cash_flow_from_financing_activities": "netcashfromfinancingactivities", + "net_change_in_cash": "netchangeincash", } + changes_in_operating_assets_and_liabilities: Optional[float] = Field( + None, + alias="increasedecreaseinoperatingcapital", + description="Changes in operating assets and liabilities.", + ) + + net_income_continuing: Optional[float] = Field( + default=None, + alias="netincomecontinuing", + description="Net income from continuing operations.", + ) + net_cash_from_continuing_operating_activities: Optional[float] = Field( + default=None, + alias="netcashfromcontinuingoperatingactivities", + description="Net cash from continuing operating activities.", + ) + net_cash_from_continuing_investing_activities: Optional[float] = Field( + default=None, + alias="netcashfromcontinuinginvestingactivities", + description="Net cash from continuing investing activities.", + ) + net_cash_from_continuing_financing_activities: Optional[float] = Field( + default=None, + alias="netcashfromcontinuingfinancingactivities", + description="Net cash from continuing financing activities.", + ) + cash_interest_paid: Optional[float] = Field( + default=None, alias="cashinterestpaid", description="Cash paid for interest." + ) + cash_income_taxes_paid: Optional[float] = Field( + default=None, + alias="cashincometaxespaid", + description="Cash paid for income taxes.", + ) + issuance_of_common_equity: Optional[float] = Field( + default=None, + alias="issuanceofcommonequity", + description="Issuance of common equity.", + ) + class IntrinioCashFlowStatementFetcher( Fetcher[ @@ -130,7 +167,7 @@ class IntrinioCashFlowStatementFetcher( sub_dict: Dict[str, Any] = {} for sub_item in item["financials"]: - field_name = alias_generators.to_snake(sub_item["data_tag"]["name"]) + field_name = sub_item["data_tag"]["tag"] sub_dict[field_name] = float(sub_item["value"]) sub_dict["date"] = item["date"] diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/models/income_statement.py b/openbb_platform/providers/intrinio/openbb_intrinio/models/income_statement.py index a09de7030e5..953e77ad1ed 100644 --- a/openbb_platform/providers/intrinio/openbb_intrinio/models/income_statement.py +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/income_statement.py @@ -11,7 +11,7 @@ from openbb_core.provider.standard_models.income_statement import ( IncomeStatementQueryParams, ) from openbb_intrinio.utils.helpers import get_data_one -from pydantic import alias_generators +from pydantic import Field class IntrinioIncomeStatementQueryParams(IncomeStatementQueryParams): @@ -26,17 +26,68 @@ class IntrinioIncomeStatementData(IncomeStatementData): """Intrinio Income Statement Data.""" __alias_dict__ = { - "research_and_development_expenses": "ResearchAndDevelopmentExpense", - "selling_general_and_administrative_expenses": "SellingGeneralAndAdministrativeExpense", - "ebit": "earnings before interest and taxes (ebit)", - "ebitda": "earnings before interest, taxes, depreciation and amortization (ebitda)", - "ebitda_margin": "ebitda margin", - "operating_income": "OperatingIncomeLoss", - "income_before_tax": "IncomeLossFromContinuingOperationsBeforeIncomeTaxesExtraordinaryItemsNoncontrollingInterest", # noqa: E501 - "eps_diluted": "EarningsPerShareDiluted", - "weighted_average_shares_outstanding": "WeightedAverageNumberOfSharesOutstandingBasic", - "weighted_average_shares_outstanding_dil": "WeightedAverageNumberOfDilutedSharesOutstanding", + "revenue": "totalrevenue", + "cost_of_revenue": "totalcostofrevenue", + "gross_profit": "totalgrossprofit", + "research_and_development_expenses": "rdexpense", + "selling_general_and_administrative_expenses": "sgaexpense", + "operating_expenses": "totaloperatingexpenses", + "operating_income": "totaloperatingincome", + "interest_expense": "interestexpense", + "income_before_tax": "totalpretaxincome", + "income_tax_expense": "incometaxexpense", + "net_income": "netincome", + "eps": "basiceps", + "eps_diluted": "dilutedeps", + "weighted_average_shares_outstanding": "weightedavebasicsharesos", + "ebit": "ebit", + "ebitda": "ebitda", } + # Intrinio-specific fields that don't have a direct mapping to the standard model + operating_revenue: Optional[float] = Field( + default=None, alias="operatingrevenue", description="Operating revenue." + ) + operating_cost_of_revenue: Optional[float] = Field( + default=None, + alias="operatingcostofrevenue", + description="Operating cost of revenue.", + ) + total_other_income_expenses_net: Optional[float] = Field( + default=None, + alias="totalotherincome", + description="Total other income/expenses net.", + ) + net_income_continuing: Optional[float] = Field( + default=None, + alias="netincomecontinuing", + description="Net income from continuing operations.", + ) + net_income_to_common: Optional[float] = Field( + default=None, + alias="netincometocommon", + description="Net income to common shareholders.", + ) + weighted_average_shares_outstanding_dil: Optional[float] = Field( + default=None, + alias="weightedavedilutedsharesos", + description="Weighted average diluted shares outstanding.", + ) + cash_dividends_per_share: Optional[float] = Field( + default=None, + alias="cashdividendspershare", + description="Cash dividends per share.", + ) + ebitda_ratio: Optional[float] = Field( + default=None, alias="ebitdamargin", description="EBITDA margin." + ) + other_income: Optional[float] = Field( + default=None, alias="otherincome", description="Other income." + ) + weighted_ave_basic_diluted_shares_os: Optional[float] = Field( + default=None, + alias="weightedavebasicdilutedsharesos", + description="Weighted average basic and diluted shares outstanding.", + ) class IntrinioIncomeStatementFetcher( @@ -127,7 +178,7 @@ class IntrinioIncomeStatementFetcher( sub_dict: Dict[str, Any] = {} for sub_item in item["financials"]: - field_name = alias_generators.to_snake(sub_item["data_tag"]["name"]) + field_name = sub_item["data_tag"]["tag"] sub_dict[field_name] = float(sub_item["value"]) sub_dict["date"] = item["date"]