diff options
author | Danglewood <85772166+deeleeramone@users.noreply.github.com> | 2024-03-11 10:20:31 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-11 17:20:31 +0000 |
commit | 0115feb8334d857e489b43ba69e79a459a3f091d (patch) | |
tree | ca8751a62a98dc27e7546d724cb25f1c6e07e2cc | |
parent | 875969a1c980ee3b363aa1c4672cd38e4b98b84d (diff) |
[Enhancement] Allow Multiple Symbols For Intrinio Key Metrics (#6186)
* improve intrinio key metrics
* type thing
* some thing
* ruff
4 files changed, 1365 insertions, 101 deletions
diff --git a/openbb_platform/core/openbb_core/provider/standard_models/key_metrics.py b/openbb_platform/core/openbb_core/provider/standard_models/key_metrics.py index 80158688dc8..d2580e481cf 100644 --- a/openbb_platform/core/openbb_core/provider/standard_models/key_metrics.py +++ b/openbb_platform/core/openbb_core/provider/standard_models/key_metrics.py @@ -1,6 +1,6 @@ """Key Metrics Standard Model.""" -from typing import List, Literal, Optional, Set, Union +from typing import Literal, Optional from pydantic import Field, field_validator @@ -48,11 +48,3 @@ class KeyMetricsData(Data): pe_ratio: Optional[float] = Field( default=None, description="Price-to-earnings ratio (P/E ratio)" ) - - @field_validator("symbol", mode="before", check_fields=False) - @classmethod - def to_upper(cls, v: Union[str, List[str], Set[str]]): - """Convert field to uppercase.""" - if isinstance(v, str): - return v.upper() - return ",".join([symbol.upper() for symbol in list(v)]) if v else None diff --git a/openbb_platform/openbb/package/equity_fundamental.py b/openbb_platform/openbb/package/equity_fundamental.py index c0c6f810ecb..e0b087c5cfa 100644 --- a/openbb_platform/openbb/package/equity_fundamental.py +++ b/openbb_platform/openbb/package/equity_fundamental.py @@ -2412,7 +2412,7 @@ class ROUTER_equity_fundamental(Container): symbol: Annotated[ Union[str, List[str]], OpenBBCustomParameter( - description="Symbol to get data for. Multiple items allowed for provider(s): fmp, yfinance." + description="Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, yfinance." ), ], period: Annotated[ @@ -2436,7 +2436,7 @@ class ROUTER_equity_fundamental(Container): Parameters ---------- symbol : Union[str, List[str]] - Symbol to get data for. Multiple items allowed for provider(s): fmp, yfinance. + Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, yfinance. period : Optional[Literal['annual', 'quarter']] Time period of the data to return. limit : Optional[int] @@ -2494,8 +2494,8 @@ class ROUTER_equity_fundamental(Container): Shareholders equity per share (provider: fmp) interest_debt_per_share : Optional[float] Interest debt per share (provider: fmp) - enterprise_value : Optional[Union[float, int]] - Enterprise value (provider: fmp, yfinance) + enterprise_value : Optional[int] + Enterprise value (provider: fmp, intrinio, yfinance) price_to_sales_ratio : Optional[float] Price-to-sales ratio (provider: fmp) pocf_ratio : Optional[float] @@ -2515,7 +2515,8 @@ class ROUTER_equity_fundamental(Container): ev_to_free_cash_flow : Optional[float] Enterprise value-to-free cash flow ratio (provider: fmp) earnings_yield : Optional[float] - Earnings yield (provider: fmp) + Earnings yield (provider: fmp); + Earnings yield, as a normalized percent. (provider: intrinio) free_cash_flow_yield : Optional[float] Free cash flow yield (provider: fmp) debt_to_equity : Optional[float] @@ -2586,15 +2587,73 @@ class ROUTER_equity_fundamental(Container): Return on equity (provider: fmp) capex_per_share : Optional[float] Capital expenditures per share (provider: fmp) + price_to_book : Optional[float] + Price to book ratio. (provider: intrinio, yfinance) + price_to_tangible_book : Optional[float] + Price to tangible book ratio. (provider: intrinio) + price_to_revenue : Optional[float] + Price to revenue ratio. (provider: intrinio) + quick_ratio : Optional[float] + Quick ratio. (provider: intrinio, yfinance) + gross_margin : Optional[float] + Gross margin, as a normalized percent. (provider: intrinio, yfinance) + ebit_margin : Optional[float] + EBIT margin, as a normalized percent. (provider: intrinio) + profit_margin : Optional[float] + Profit margin, as a normalized percent. (provider: intrinio, yfinance) + eps : Optional[float] + Basic earnings per share. (provider: intrinio) + eps_growth : Optional[float] + EPS growth, as a normalized percent. (provider: intrinio) + revenue_growth : Optional[float] + Revenue growth, as a normalized percent. (provider: intrinio, yfinance) + ebitda_growth : Optional[float] + EBITDA growth, as a normalized percent. (provider: intrinio) + ebit_growth : Optional[float] + EBIT growth, as a normalized percent. (provider: intrinio) + net_income_growth : Optional[float] + Net income growth, as a normalized percent. (provider: intrinio) + free_cash_flow_to_firm_growth : Optional[float] + Free cash flow to firm growth, as a normalized percent. (provider: intrinio) + invested_capital_growth : Optional[float] + Invested capital growth, as a normalized percent. (provider: intrinio) + return_on_assets : Optional[float] + Return on assets, as a normalized percent. (provider: intrinio, yfinance) + return_on_equity : Optional[float] + Return on equity, as a normalized percent. (provider: intrinio, yfinance) + return_on_invested_capital : Optional[float] + Return on invested capital, as a normalized percent. (provider: intrinio) + ebitda : Optional[int] + Earnings before interest, taxes, depreciation, and amortization. (provider: intrinio) + ebit : Optional[int] + Earnings before interest and taxes. (provider: intrinio) + long_term_debt : Optional[int] + Long-term debt. (provider: intrinio) + total_debt : Optional[int] + Total debt. (provider: intrinio) + total_capital : Optional[int] + The sum of long-term debt and total shareholder equity. (provider: intrinio) + free_cash_flow_to_firm : Optional[int] + Free cash flow to firm. (provider: intrinio) + altman_z_score : Optional[float] + Altman Z-score. (provider: intrinio) beta : Optional[float] - Beta relative to the broad market calculated on a rolling three-year basis. (provider: intrinio); + Beta relative to the broad market (rolling three-year). (provider: intrinio); Beta relative to the broad market (5-year monthly). (provider: yfinance) - volume : Optional[float] - Volume (provider: intrinio) - fifty_two_week_high : Optional[float] + last_price : Optional[float] + Last price of the stock. (provider: intrinio) + year_high : Optional[float] 52 week high (provider: intrinio) - fifty_two_week_low : Optional[float] + year_low : Optional[float] 52 week low (provider: intrinio) + volume_avg : Optional[int] + Average daily volume. (provider: intrinio) + short_interest : Optional[int] + Number of shares reported as sold short. (provider: intrinio) + shares_outstanding : Optional[int] + Weighted average shares outstanding (TTM). (provider: intrinio) + days_to_cover : Optional[float] + Days to cover short interest, based on average daily volume. (provider: intrinio) forward_pe : Optional[float] Forward price-to-earnings ratio. (provider: yfinance) peg_ratio : Optional[float] @@ -2611,30 +2670,16 @@ class ROUTER_equity_fundamental(Container): Earnings growth (Year Over Year), as a normalized percent. (provider: yfinance) earnings_growth_quarterly : Optional[float] Quarterly earnings growth (Year Over Year), as a normalized percent. (provider: yfinance) - revenue_growth : Optional[float] - Revenue growth (Year Over Year), as a normalized percent. (provider: yfinance) enterprise_to_revenue : Optional[float] Enterprise value to revenue ratio. (provider: yfinance) - quick_ratio : Optional[float] - Quick ratio. (provider: yfinance) - gross_margin : Optional[float] - Gross margin, as a normalized percent. (provider: yfinance) operating_margin : Optional[float] Operating margin, as a normalized percent. (provider: yfinance) ebitda_margin : Optional[float] EBITDA margin, as a normalized percent. (provider: yfinance) - profit_margin : Optional[float] - Profit margin, as a normalized percent. (provider: yfinance) - return_on_assets : Optional[float] - Return on assets, as a normalized percent. (provider: yfinance) - return_on_equity : Optional[float] - Return on equity, as a normalized percent. (provider: yfinance) dividend_yield_5y_avg : Optional[float] 5-year average dividend yield, as a normalized percent. (provider: yfinance) book_value : Optional[float] Book value per share. (provider: yfinance) - price_to_book : Optional[float] - Price-to-book ratio. (provider: yfinance) overall_risk : Optional[float] Overall risk score. (provider: yfinance) audit_risk : Optional[float] @@ -2673,7 +2718,11 @@ class ROUTER_equity_fundamental(Container): "limit": limit, }, extra_params=kwargs, - extra_info={"symbol": {"multiple_items_allowed": ["fmp", "yfinance"]}}, + extra_info={ + "symbol": { + "multiple_items_allowed": ["fmp", "intrinio", "yfinance"] + } + }, ) ) diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/models/key_metrics.py b/openbb_platform/providers/intrinio/openbb_intrinio/models/key_metrics.py index 478bb9c6008..2dbecc4a0e3 100644 --- a/openbb_platform/providers/intrinio/openbb_intrinio/models/key_metrics.py +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/key_metrics.py @@ -1,12 +1,18 @@ """Intrinio Key Metrics Model.""" +# pylint: disable=unused-argument + +import asyncio from typing import Any, Dict, List, Optional +from warnings import warn +from openbb_core.provider.abstract.data import ForceInt from openbb_core.provider.abstract.fetcher import Fetcher from openbb_core.provider.standard_models.key_metrics import ( KeyMetricsData, KeyMetricsQueryParams, ) +from openbb_core.provider.utils.errors import EmptyDataError from openbb_core.provider.utils.helpers import ( ClientResponse, amake_requests, @@ -15,16 +21,14 @@ from pydantic import Field class IntrinioKeyMetricsQueryParams(KeyMetricsQueryParams): - """Intrinio Key Metrics Query. - - Source: https://data.intrinio.com/data-tag/beta - https://data.intrinio.com/data-tag/volume - https://data.intrinio.com/data-tag/52_week_high - https://data.intrinio.com/data-tag/52_week_low - https://data.intrinio.com/data-tag/dividendyield - https://data.intrinio.com/data-tag/pricetoearnings + """ + Intrinio Key Metrics Query. + + Source: https://data.intrinio.com/data-tags/ """ + __json_schema_extra__ = {"symbol": ["multiple_items_allowed"]} + class IntrinioKeyMetricsData(KeyMetricsData): """Intrinio Key Metrics Data.""" @@ -32,26 +36,200 @@ class IntrinioKeyMetricsData(KeyMetricsData): __alias_dict__ = { "market_cap": "marketcap", "pe_ratio": "pricetoearnings", + "price_to_book": "pricetobook", + "price_to_tangible_book": "pricetotangiblebook", + "price_to_revenue": "pricetorevenue", + "long_term_debt": "ltdebtandcapleases", + "total_debt": "debt", + "total_capital": "totalcapital", + "enterprise_value": "enterprisevalue", + "eps_growth": "epsgrowth", + "ebit_growth": "ebitgrowth", + "ebitda_growth": "ebitdagrowth", + "revenue_growth": "revenuegrowth", + "net_income_growth": "netincomegrowth", + "free_cash_flow_to_firm_growth": "fcffgrowth", + "invested_capital_growth": "investedcapitalgrowth", + "quick_ratio": "quickratio", + "gross_margin": "grossmargin", + "ebit_margin": "ebitmargin", + "profit_margin": "profitmargin", + "return_on_assets": "roa", + "return_on_equity": "roe", + "return_on_invested_capital": "roic", + "free_cash_flow_to_firm": "freecashflow", + "altman_z_score": "altmanzscore", + "earnings_yield": "earningsyield", + "dividend_yield": "dividendyield", + "year_high": "52_week_high", + "year_low": "52_week_low", + "volume_avg": "average_daily_volume", + "shares_outstanding": "adjweightedavebasicsharesos", + "eps": "basiceps", } - beta: float = Field( - description="Beta relative to the broad market calculated on a rolling three-year basis." + price_to_book: Optional[float] = Field( + default=None, + description="Price to book ratio.", + ) + price_to_tangible_book: Optional[float] = Field( + default=None, + description="Price to tangible book ratio.", + ) + price_to_revenue: Optional[float] = Field( + default=None, + description="Price to revenue ratio.", + ) + quick_ratio: Optional[float] = Field( + default=None, + description="Quick ratio.", + ) + gross_margin: Optional[float] = Field( + default=None, + description="Gross margin, as a normalized percent.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + ebit_margin: Optional[float] = Field( + default=None, + description="EBIT margin, as a normalized percent.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + profit_margin: Optional[float] = Field( + default=None, + description="Profit margin, as a normalized percent.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + eps: Optional[float] = Field( + default=None, + description="Basic earnings per share.", + ) + eps_growth: Optional[float] = Field( + default=None, + description="EPS growth, as a normalized percent.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + revenue_growth: Optional[float] = Field( + default=None, + description="Revenue growth, as a normalized percent.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + ebitda_growth: Optional[float] = Field( + default=None, + description="EBITDA growth, as a normalized percent.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + ebit_growth: Optional[float] = Field( + default=None, + description="EBIT growth, as a normalized percent.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + net_income_growth: Optional[float] = Field( + default=None, + description="Net income growth, as a normalized percent.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + free_cash_flow_to_firm_growth: Optional[float] = Field( + default=None, + description="Free cash flow to firm growth, as a normalized percent.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + invested_capital_growth: Optional[float] = Field( + default=None, + description="Invested capital growth, as a normalized percent.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + return_on_assets: Optional[float] = Field( + default=None, + description="Return on assets, as a normalized percent.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + return_on_equity: Optional[float] = Field( + default=None, + description="Return on equity, as a normalized percent.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + return_on_invested_capital: Optional[float] = Field( + default=None, + description="Return on invested capital, as a normalized percent.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + ebitda: Optional[ForceInt] = Field( + default=None, + description="Earnings before interest, taxes, depreciation, and amortization.", + ) + ebit: Optional[ForceInt] = Field( + default=None, + description="Earnings before interest and taxes.", + ) + long_term_debt: Optional[ForceInt] = Field( + default=None, + description="Long-term debt.", + ) + total_debt: Optional[ForceInt] = Field( + default=None, + description="Total debt.", + ) + total_capital: Optional[ForceInt] = Field( + default=None, + description="The sum of long-term debt and total shareholder equity.", + ) + enterprise_value: Optional[ForceInt] = Field( + default=None, + description="Enterprise value.", + ) + free_cash_flow_to_firm: Optional[ForceInt] = Field( + default=None, + description="Free cash flow to firm.", ) - volume: float = Field(description="Volume") - fifty_two_week_high: float = Field(description="52 week high", alias="52_week_high") - fifty_two_week_low: float = Field(description="52 week low", alias="52_week_low") - dividend_yield: float = Field( + altman_z_score: Optional[float] = Field( + default=None, + description="Altman Z-score.", + ) + beta: Optional[float] = Field( + default=None, + description="Beta relative to the broad market (rolling three-year).", + ) + dividend_yield: Optional[float] = Field( default=None, description="Dividend yield, as a normalized percent.", - json_schema_extra={"unit_measurement": "percent", "frontend_multiply": 100}, - alias="dividendyield", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + earnings_yield: Optional[float] = Field( + default=None, + description="Earnings yield, as a normalized percent.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + last_price: Optional[float] = Field( + default=None, + description="Last price of the stock.", + ) + year_high: Optional[float] = Field( + default=None, + description="52 week high", + ) + year_low: float = Field(default=None, description="52 week low") + volume_avg: Optional[ForceInt] = Field( + default=None, + description="Average daily volume.", + ) + short_interest: Optional[ForceInt] = Field( + default=None, + description="Number of shares reported as sold short.", + ) + shares_outstanding: Optional[ForceInt] = Field( + default=None, + description="Weighted average shares outstanding (TTM).", + ) + days_to_cover: Optional[float] = Field( + default=None, + description="Days to cover short interest, based on average daily volume.", ) class IntrinioKeyMetricsFetcher( Fetcher[ IntrinioKeyMetricsQueryParams, - IntrinioKeyMetricsData, + List[IntrinioKeyMetricsData], ] ): """Transform the query, extract and transform the data from the Intrinio endpoints.""" @@ -59,44 +237,128 @@ class IntrinioKeyMetricsFetcher( @staticmethod def transform_query(params: Dict[str, Any]) -> IntrinioKeyMetricsQueryParams: """Transform the query params.""" + + if params.get("period") is not None and params.get("period") != "annual": + warn( + "The period parameter is not available for this Intrinio endpoint, it will be ignored." + ) return IntrinioKeyMetricsQueryParams(**params) @staticmethod async def aextract_data( - query: IntrinioKeyMetricsQueryParams, # pylint: disable=unused-argument + query: IntrinioKeyMetricsQueryParams, credentials: Optional[Dict[str, str]], **kwargs: Any, - ) -> Dict: + ) -> List[Dict]: """Return the raw data from the Intrinio endpoint.""" api_key = credentials.get("intrinio_api_key") if credentials else "" tags = [ "beta", - "volume", + "average_daily_volume", + "basiceps", + "basicdilutedeps", "marketcap", + "last_price", "52_week_high", "52_week_low", "dividendyield", "pricetoearnings", + "pricetorevenue", + "pricetobook", + "pricetotangiblebook", + "grossmargin", + "ebitmargin", + "profitmargin", + "roa", + "roe", + "roic", + "earningsyield", + "days_to_cover", + "short_interest", + "revenuegrowth", + "ebitgrowth", + "ebitdagrowth", + "epsgrowth", + "netincomegrowth", + "investedcapitalgrowth", + "debt", + "totalcapital", + "enterprisevalue", + "freecashflow", + "fcffgrowth", + "ltdebtandcapleases", + "altmanzscore", + "quickratio", + "ebit", + "ebitda", + "adjweightedavebasicsharesos", ] + results = [] + urls = [] + symbols = query.symbol.split(",") - urls = [ - f"https://api-v2.intrinio.com/companies/{query.symbol}/data_point/{tag}?api_key={api_key}" - for tag in tags - ] + async def get_one(symbol: str): + """Get data for one symbol.""" + + _urls = [ + f"https://api-v2.intrinio.com/companies/{symbol}/data_point/{tag}?api_key={api_key}" + for tag in tags + ] + urls.extend(_urls) - async def callback(response: ClientResponse, _: Any) -> Dict: - """Return the response.""" - return {response.url.parts[-1]: await response.json()} + async def callback(response: ClientResponse, _: Any) -> Dict: + """Return the response.""" + return {response.url.parts[-1]: await response.json()} - data: Dict = {"symbol": query.symbol} - for result in await amake_requests(urls, callback, **kwargs): - data.update(result) + data = {} + for result in await amake_requests(urls, callback, **kwargs): + data.update(result) + if data: + data["symbol"] = symbol + results.append(data) - return data + tasks = [get_one(symbol) for symbol in symbols] + + await asyncio.gather(*tasks) + + if not results: + raise EmptyDataError() + + return results @staticmethod def transform_data( - query: IntrinioKeyMetricsQueryParams, data: List[Dict], **kwargs: Any - ) -> IntrinioKeyMetricsData: - """Return the transformed data.""" - return IntrinioKeyMetricsData.model_validate(data) + query: IntrinioKeyMetricsQueryParams, + data: List[Dict], + **kwargs: Any, + ) -> List[IntrinioKeyMetricsData]: + """Validate and transform the data.""" + + # Sort the results by the order of the symbols in the query. + symbols = query.symbol.split(",") + data = sorted( + data, + key=( + lambda item: ( + symbols.index(item["symbol"]) + if item["symbol"] in symbols + else len(symbols) + ) + ), + ) + + results: List[IntrinioKeyMetricsData] = [] + for item in data: + + if item.get("marketcap") is None or isinstance(item.get("marketcap"), dict): + warn(f"Symbol Error: No data found for {item.get('symbol')}") + continue + + for key, value in item.copy().items(): + # A bad response in a field will return a dict here, so we remove it. + if isinstance(value, dict): + _ = item.pop(key) + + results.append(IntrinioKeyMetricsData.model_validate(item)) + + return results diff --git a/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_key_metrics_fetcher.yaml b/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_key_metrics_fetcher.yaml index 0d78efe2d31..c15e55ea5bb 100644 --- a/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_key_metrics_fetcher.yaml +++ b/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_key_metrics_fetcher.yaml @@ -3,9 +3,226 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://api-v2.intrinio.com/companies/AAPL/data_point/days_to_cover?api_key=MOCK_API_KEY + response: + body: + string: !!binary | + H4sIAEyP7mUAAzLSM7GwAAAAAP//AwDfjdFBBQAAAA== + headers: + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Mon, 11 Mar 2024 04:57:48 GMT + Transfer-Encoding: + - chunked + Vary: + - Origin,Accept-Encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json Accept-Encoding: - - gzip, deflate, br + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://api-v2.intrinio.com/companies/AAPL/data_point/last_price?api_key=MOCK_API_KEY + response: + body: + string: !!binary | + H4sIAEyP7mUAAzI0N9AzMbe0tDQ1NzI3NbY0MAMAAAD//wMAPZhnjRIAAAA= + headers: + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Mon, 11 Mar 2024 04:57:48 GMT + Transfer-Encoding: + - chunked + Vary: + - Origin,Accept-Encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://api-v2.intrinio.com/companies/AAPL/data_point/enterprisevalue?api_key=MOCK_API_KEY + response: + body: + string: !!binary | + H4sIAEyP7mUAAzIytTSxMDOxNDS3NDbQMwAAAAD//wMAN5ouRQ8AAAA= + headers: + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Mon, 11 Mar 2024 04:57:48 GMT + Transfer-Encoding: + - chunked + Vary: + - Origin,Accept-Encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://api-v2.intrinio.com/companies/AAPL/data_point/earningsyield?api_key=MOCK_API_KEY + response: + body: + string: !!binary | + H4sIAEyP7mUAAzLQMzA2tzQxAwAAAP//AwBHc0CvCAAAAA== + headers: + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Mon, 11 Mar 2024 04:57:48 GMT + Transfer-Encoding: + - chunked + Vary: + - Origin,Accept-Encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://api-v2.intrinio.com/companies/AAPL/data_point/quickratio?api_key=MOCK_API_KEY + response: |