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 <ps4534@nyu.edu>
Co-authored-by: James Maslek <jmaslek11@gmail.com>
This commit is contained in:
Theodore Aptekarev
2023-11-29 21:54:56 +01:00
committed by GitHub
parent 6d13807047
commit dc81f6cd24
3 changed files with 191 additions and 47 deletions

View File

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

View File

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

View File

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