diff options
author | Danglewood <85772166+deeleeramone@users.noreply.github.com> | 2024-06-24 02:47:00 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-24 09:47:00 +0000 |
commit | faa1e896fa66eda12edea8cd4e9df75ebbffd937 (patch) | |
tree | 2d32d006c5310d3dad7ffe986635aaf0304c8a95 | |
parent | 041e2247bf58208f38b32386d88ae596f55e83ce (diff) |
[Feature] `to_df` where `results` is a model of arrays. (#6510)
* enable to_df to convert a model where all fields are arrays
* use dt for check
* static assets
* pylint
---------
Co-authored-by: montezdesousa <79287829+montezdesousa@users.noreply.github.com>
Co-authored-by: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com>
5 files changed, 142 insertions, 134 deletions
diff --git a/openbb_platform/core/openbb_core/app/model/obbject.py b/openbb_platform/core/openbb_core/app/model/obbject.py index d9600746092..27c1d262d48 100644 --- a/openbb_platform/core/openbb_core/app/model/obbject.py +++ b/openbb_platform/core/openbb_core/app/model/obbject.py @@ -155,12 +155,19 @@ class OBBject(Tagged, Generic[T]): dict_of_df[k] = pd.DataFrame(v) df = pd.concat(dict_of_df, axis=1) - # List[BaseModel] elif is_list_of_basemodel(res): dt: Union[List[Data], Data] = res # type: ignore - df = basemodel_to_df(dt, index) - sort_columns = False + r = dt[0] if isinstance(dt, list) else dt + if all( + prop.get("type") == "array" + for prop in r.schema()["properties"].values() + ): + sort_columns = False + df = pd.DataFrame(r.model_dump(exclude_unset=True)) + else: + df = basemodel_to_df(dt, index) + sort_columns = False # str elif isinstance(res, str): df = pd.DataFrame([res]) diff --git a/openbb_platform/core/openbb_core/provider/standard_models/options_snapshots.py b/openbb_platform/core/openbb_core/provider/standard_models/options_snapshots.py index 8c14af09ffd..5a3396f56bc 100644 --- a/openbb_platform/core/openbb_core/provider/standard_models/options_snapshots.py +++ b/openbb_platform/core/openbb_core/provider/standard_models/options_snapshots.py @@ -4,7 +4,7 @@ from datetime import ( date as dateType, datetime, ) -from typing import Optional +from typing import List, Union from pydantic import Field @@ -20,56 +20,60 @@ class OptionsSnapshotsQueryParams(QueryParams): class OptionsSnapshotsData(Data): """Options Snapshots Data.""" - underlying_symbol: str = Field(description="Ticker symbol of the underlying asset.") - contract_symbol: str = Field(description="Symbol of the options contract.") - expiration: dateType = Field(description="Expiration date of the options contract.") - dte: Optional[int] = Field( - default=None, + underlying_symbol: List[str] = Field( + description="Ticker symbol of the underlying asset." + ) + contract_symbol: List[str] = Field(description="Symbol of the options contract.") + expiration: List[dateType] = Field( + description="Expiration date of the options contract." + ) + dte: List[Union[int, None]] = Field( + default_factory=list, description="Number of days to expiration of the options contract.", ) - strike: float = Field( + strike: List[float] = Field( description="Strike price of the options contract.", json_schema_extra={"x-unit_measurement": "currency"}, ) - option_type: str = Field(description="The type of option.") - volume: Optional[int] = Field( - default=None, + option_type: List[str] = Field(description="The type of option.") + volume: List[Union[int, None]] = Field( + default_factory=list, description=DATA_DESCRIPTIONS.get("volume", ""), ) - open_interest: Optional[int] = Field( - default=None, + open_interest: List[Union[int, None]] = Field( + default_factory=list, description="Open interest at the time.", ) - last_price: Optional[float] = Field( - default=None, + last_price: List[Union[float, None]] = Field( + default_factory=list, description="Last trade price at the time.", json_schema_extra={"x-unit_measurement": "currency"}, ) - last_size: Optional[int] = Field( - default=None, + last_size: List[Union[int, None]] = Field( + default_factory=list, description="Lot size of the last trade.", ) - last_timestamp: Optional[datetime] = Field( - default=None, + last_timestamp: List[Union[datetime, None]] = Field( + default_factory=list, description="Timestamp of the last price.", ) - open: Optional[float] = Field( - default=None, + open: List[Union[float, None]] = Field( + default_factory=list, description=DATA_DESCRIPTIONS.get("open", ""), json_schema_extra={"x-unit_measurement": "currency"}, ) - high: Optional[float] = Field( - default=None, + high: List[Union[float, None]] = Field( + default_factory=list, description=DATA_DESCRIPTIONS.get("high", ""), json_schema_extra={"x-unit_measurement": "currency"}, ) - low: Optional[float] = Field( - default=None, + low: List[Union[float, None]] = Field( + default_factory=list, description=DATA_DESCRIPTIONS.get("low", ""), json_schema_extra={"x-unit_measurement": "currency"}, ) - close: Optional[float] = Field( - default=None, + close: List[Union[float, None]] = Field( + default_factory=list, description=DATA_DESCRIPTIONS.get("close", ""), json_schema_extra={"x-unit_measurement": "currency"}, ) diff --git a/openbb_platform/openbb/assets/reference.json b/openbb_platform/openbb/assets/reference.json index c3220d6d0e1..8b7897f887f 100644 --- a/openbb_platform/openbb/assets/reference.json +++ b/openbb_platform/openbb/assets/reference.json @@ -2060,7 +2060,7 @@ "standard": [ { "name": "underlying_symbol", - "type": "str", + "type": "List[str]", "description": "Ticker symbol of the underlying asset.", "default": "", "optional": false, @@ -2068,7 +2068,7 @@ }, { "name": "contract_symbol", - "type": "str", + "type": "List[str]", "description": "Symbol of the options contract.", "default": "", "optional": false, @@ -2076,7 +2076,7 @@ }, { "name": "expiration", - "type": "date", + "type": "List[date]", "description": "Expiration date of the options contract.", "default": "", "optional": false, @@ -2084,15 +2084,15 @@ }, { "name": "dte", - "type": "int", + "type": "List[int]", "description": "Number of days to expiration of the options contract.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "strike", - "type": "float", + "type": "List[float]", "description": "Strike price of the options contract.", "default": "", "optional": false, @@ -2100,7 +2100,7 @@ }, { "name": "option_type", - "type": "str", + "type": "List[str]", "description": "The type of option.", "default": "", "optional": false, @@ -2108,73 +2108,73 @@ }, { "name": "volume", - "type": "int", + "type": "List[int]", "description": "The trading volume.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "open_interest", - "type": "int", + "type": "List[int]", "description": "Open interest at the time.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "last_price", - "type": "float", + "type": "List[float]", "description": "Last trade price at the time.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "last_size", - "type": "int", + "type": "List[int]", "description": "Lot size of the last trade.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "last_timestamp", - "type": "datetime", + "type": "List[datetime]", "description": "Timestamp of the last price.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "open", - "type": "float", + "type": "List[float]", "description": "The open price.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "high", - "type": "float", + "type": "List[float]", "description": "The high price.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "low", - "type": "float", + "type": "List[float]", "description": "The low price.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "close", - "type": "float", + "type": "List[float]", "description": "The close price.", - "default": null, + "default": "", "optional": true, "choices": null } @@ -2182,97 +2182,97 @@ "intrinio": [ { "name": "bid", - "type": "float", + "type": "List[float]", "description": "The last bid price at the time.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "bid_size", - "type": "int", + "type": "List[int]", "description": "The size of the last bid price.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "bid_timestamp", - "type": "datetime", + "type": "List[datetime]", "description": "The timestamp of the last bid price.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "ask", - "type": "float", + "type": "List[float]", "description": "The last ask price at the time.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "ask_size", - "type": "int", + "type": "List[int]", "description": "The size of the last ask price.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "ask_timestamp", - "type": "datetime", + "type": "List[datetime]", "description": "The timestamp of the last ask price.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "total_bid_volume", - "type": "int", + "type": "List[int]", "description": "Total volume of bids.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "bid_high", - "type": "float", + "type": "List[float]", "description": "The highest bid price.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "bid_low", - "type": "float", + "type": "List[float]", "description": "The lowest bid price.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "total_ask_volume", - "type": "int", + "type": "List[int]", "description": "Total volume of asks.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "ask_high", - "type": "float", + "type": "List[float]", "description": "The highest ask price.", - "default": null, + "default": "", "optional": true, "choices": null }, { "name": "ask_low", - "type": "float", + "type": "List[float]", "description": "The lowest ask price.", - "default": null, + "default": "", "optional": true, "choices": null } diff --git a/openbb_platform/openbb/package/derivatives_options.py b/openbb_platform/openbb/package/derivatives_options.py index 269a05c86a7..feb4f620e12 100644 --- a/openbb_platform/openbb/package/derivatives_options.py +++ b/openbb_platform/openbb/package/derivatives_options.py @@ -253,59 +253,59 @@ class ROUTER_derivatives_options(Container): OptionsSnapshots ---------------- - underlying_symbol : str + underlying_symbol : List[str] Ticker symbol of the underlying asset. - contract_symbol : str + contract_symbol : List[str] Symbol of the options contract. - expiration : date + expiration : List[date] Expiration date of the options contract. - dte : Optional[int] + dte : List[Optional[int]] Number of days to expiration of the options contract. - strike : float + strike : List[float] Strike price of the options contract. - option_type : str + option_type : List[str] The type of option. - volume : Optional[int] + volume : List[Optional[int]] The trading volume. - open_interest : Optional[int] + open_interest : List[Optional[int]] Open interest at the time. - last_price : Optional[float] + last_price : List[Optional[float]] Last trade price at the time. - last_size : Optional[int] + last_size : List[Optional[int]] Lot size of the last trade. - last_timestamp : Optional[datetime] + last_timestamp : List[Optional[datetime]] Timestamp of the last price. - open : Optional[float] + open : List[Optional[float]] The open price. - high : Optional[float] + high : List[Optional[float]] The high price. - low : Optional[float] + low : List[Optional[float]] The low price. - close : Optional[float] + close : List[Optional[float]] The close price. - bid : Optional[float] + bid : List[Optional[float]] The last bid price at the time. (provider: intrinio) - bid_size : Optional[int] + bid_size : List[Optional[int]] The size of the last bid price. (provider: intrinio) - bid_timestamp : Optional[datetime] + bid_timestamp : List[Optional[datetime]] The timestamp of the last bid price. (provider: intrinio) - ask : Optional[float] + ask : List[Optional[float]] The last ask price at the time. (provider: intrinio) - ask_size : Optional[int] + ask_size : List[Optional[int]] The size of the last ask price. (provider: intrinio) - ask_timestamp : Optional[datetime] + ask_timestamp : List[Optional[datetime]] The timestamp of the last ask price. (provider: intrinio) - total_bid_volume : Optional[int] + total_bid_volume : List[Optional[int]] Total volume of bids. (provider: intrinio) - bid_high : Optional[float] + bid_high : List[Optional[float]] The highest bid price. (provider: intrinio) - bid_low : Optional[float] + bid_low : List[Optional[float]] The lowest bid price. (provider: intrinio) - total_ask_volume : Optional[int] + total_ask_volume : List[Optional[int]] Total volume of asks. (provider: intrinio) - ask_high : Optional[float] + ask_high : List[Optional[float]] The highest ask price. (provider: intrinio) - ask_low : Optional[float] + ask_low : List[Optional[float]] The lowest ask price. (provider: intrinio) Examples diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/models/options_snapshots.py b/openbb_platform/providers/intrinio/openbb_intrinio/models/options_snapshots.py index cee1273238f..590b5f15764 100644 --- a/openbb_platform/providers/intrinio/openbb_intrinio/models/options_snapshots.py +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/options_snapshots.py @@ -45,57 +45,57 @@ class IntrinioOptionsSnapshotsQueryParams(OptionsSnapshotsQueryParams): class IntrinioOptionsSnapshotsData(OptionsSnapshotsData): """Intrinio Options Snapshots Data. Warning: This is a large file.""" - bid: Optional[float] = Field( - default=None, + bid: List[Union[float, None]] = Field( + default_factory=list, description="The last bid price at the time.", json_schema_extra={"x-unit_measurement": "currency"}, ) - bid_size: Optional[int] = Field( - default=None, + bid_size: List[Union[int, None]] = Field( + default_factory=list, description="The size of the last bid price.", ) - bid_timestamp: Optional[datetime] = Field( - default=None, + bid_timestamp: List[Union[datetime, None]] = Field( + default_factory=list, description="The timestamp of the last bid price.", ) - ask: Optional[float] = Field( - default=None, + ask: List[Union[float, None]] = Field( + default_factory=list, description="The last ask price at the time.", json_schema_extra={"x-unit_measurement": "currency"}, ) - ask_size: Optional[int] = Field( - default=None, + ask_size: List[Union[int, None]] = Field( + default_factory=list, description="The size of the last ask price.", ) - ask_timestamp: Optional[datetime] = Field( - default=None, + ask_timestamp: List[Union[datetime, None]] = Field( + default_factory=list, description="The timestamp of the last ask price.", ) - total_bid_volume: Optional[int] = Field( - default=None, + total_bid_volume: List[Union[int, None]] = Field( + default_factory=list, description="Total volume of bids.", ) - bid_high: Optional[float] = Field( - default=None, + bid_high: List[Union[float, None]] = Field( + default_factory=list, description="The highest bid price.", json_schema_extra={"x-unit_measurement": "currency"}, ) - bid_low: Optional[float] = Field( - default=None, + bid_low: List[Union[float, None]] = Field( + default_factory=list, description="The lowest bid price.", json_schema_extra={"x-unit_measurement": "currency"}, ) - total_ask_volume: Optional[int] = Field( - default=None, + total_ask_volume: List[Union[int, None]] = Field( + default_factory=list, description="Total volume of asks.", ) - ask_high: Optional[float] = Field( - default=None, + ask_high: List[Union[float, None]] = Field( + default_factory=list, description="The highest ask price.", json_schema_extra={"x-unit_measurement": "currency"}, ) - ask_low: Optional[float] = Field( - default=None, + ask_low: List[Union[float, None]] = Field( + default_factory=list, description="The lowest ask price.", json_schema_extra={"x-unit_measurement": "currency"}, ) @@ -316,14 +316,11 @@ class IntrinioOptionsSnapshotsFetcher( strike = f"{front}{_strike[0]}{_strike[1]}{back}" return symbol + exp + cp + strike - if symbols.str.contains("\.").any(): # noqa + if symbols.str.contains("\.").any(): # noqa # pylint: disable=W1401 df["contract_symbol"] = df["contract_symbol"].apply(apply_contract_symbol) else: df["contract_symbol"] = symbols.str.replace("_", "") df = df.replace({NaT: None, np.nan: None}) df = df.sort_values(by="volume", ascending=False) - return [ - IntrinioOptionsSnapshotsData.model_validate(d) - for d in df.to_dict(orient="records") - ] + return [IntrinioOptionsSnapshotsData.model_validate(df.to_dict(orient="list"))] |