From 549af389a0277b4097cfe954cf15c474dcced615 Mon Sep 17 00:00:00 2001 From: Danglewood <85772166+deeleeramone@users.noreply.github.com> Date: Sat, 7 Oct 2023 18:59:43 -0700 Subject: [PATCH] make the changes and some etf models --- .../standard_models/etf_countries.py | 28 +++++++++ .../standard_models/etf_historical_nav.py | 29 +++++++++ .../standard_models/etf_holdings.py | 24 ++++++++ .../standard_models/etf_info.py | 29 +++++++++ .../standard_models/etf_search.py | 21 +++++++ .../standard_models/etf_sectors.py | 59 +++++++++++++++++++ .../standard_models/historical_eps.py | 48 +++++++++++++++ .../standard_models/index_constituents.py | 2 +- .../standard_models/index_info.py | 4 +- .../standard_models/index_sectors.py | 4 +- .../standard_models/industry_pe.py | 6 +- .../standard_models/recent_performance.py | 23 ++++++-- .../standard_models/sector_pe.py | 4 +- 13 files changed, 265 insertions(+), 16 deletions(-) create mode 100644 openbb_platform/platform/provider/openbb_provider/standard_models/etf_countries.py create mode 100644 openbb_platform/platform/provider/openbb_provider/standard_models/etf_historical_nav.py create mode 100644 openbb_platform/platform/provider/openbb_provider/standard_models/etf_holdings.py create mode 100644 openbb_platform/platform/provider/openbb_provider/standard_models/etf_info.py create mode 100644 openbb_platform/platform/provider/openbb_provider/standard_models/etf_search.py create mode 100644 openbb_platform/platform/provider/openbb_provider/standard_models/etf_sectors.py create mode 100644 openbb_platform/platform/provider/openbb_provider/standard_models/historical_eps.py diff --git a/openbb_platform/platform/provider/openbb_provider/standard_models/etf_countries.py b/openbb_platform/platform/provider/openbb_provider/standard_models/etf_countries.py new file mode 100644 index 00000000000..eef4020bd46 --- /dev/null +++ b/openbb_platform/platform/provider/openbb_provider/standard_models/etf_countries.py @@ -0,0 +1,28 @@ +"""ETF Countries data model.""" + +from typing import List, Set, Union + +from pydantic import Field, field_validator + +from openbb_provider.abstract.data import Data +from openbb_provider.abstract.query_params import QueryParams + + +class EtfCountriesQueryParams(QueryParams): + """ETF Countries Query Params""" + + symbol: str = Field(description="The exchange ticker symbol for the ETF.") + + @field_validator("symbol") + def upper_symbol(cls, v: Union[str, List[str], Set[str]]): + """Convert symbol to uppercase.""" + if isinstance(v, str): + return v.upper() + return ",".join([symbol.upper() for symbol in list(v)]) + + +class EtfCountriesData(Data): + """ETF Countries Data.""" + + country: str = Field(description="The country of the exposure.") + weight: float = Field(description="The weight of the country in the ETF.") diff --git a/openbb_platform/platform/provider/openbb_provider/standard_models/etf_historical_nav.py b/openbb_platform/platform/provider/openbb_provider/standard_models/etf_historical_nav.py new file mode 100644 index 00000000000..5a6442aafa4 --- /dev/null +++ b/openbb_platform/platform/provider/openbb_provider/standard_models/etf_historical_nav.py @@ -0,0 +1,29 @@ +"""ETF Historical NAV model.""" + +from datetime import date as dateType +from typing import List, Set, Union + +from pydantic import Field, field_validator + +from openbb_provider.abstract.data import Data +from openbb_provider.abstract.query_params import QueryParams + + +class EtfHistoricalNavQueryParams(QueryParams): + """ETF Historicl NAV Query Params""" + + symbol: str = Field(description="The exchange ticker symbol for the ETF.") + + @field_validator("symbol") + def upper_symbol(cls, v: Union[str, List[str], Set[str]]): + """Convert symbol to uppercase.""" + if isinstance(v, str): + return v.upper() + return ",".join([symbol.upper() for symbol in list(v)]) + + +class EtfHistoricalNavData(Data): + """ETF Historical NAV Data.""" + + date: dateType = Field(description="The date of the NAV.") + nav: float = Field(description="The net asset value on the date.") diff --git a/openbb_platform/platform/provider/openbb_provider/standard_models/etf_holdings.py b/openbb_platform/platform/provider/openbb_provider/standard_models/etf_holdings.py new file mode 100644 index 00000000000..97247d0f643 --- /dev/null +++ b/openbb_platform/platform/provider/openbb_provider/standard_models/etf_holdings.py @@ -0,0 +1,24 @@ +"""ETF Holdings data model.""" + +from typing import Optional + +from pydantic import Field + +from openbb_provider.abstract.data import Data +from openbb_provider.abstract.query_params import QueryParams + + +class EtfHoldingsQueryParams(QueryParams): + """ETF Holdings Query Params""" + + symbol: str = Field(description="The exchange ticker symbol for the ETF.") + + +class EtfHoldingsData(Data): + """ETF Holdings Data.""" + + symbol: Optional[str] = Field( + description="The exchange ticker symbol for the holding." + ) + name: Optional[str] = Field(description="Name of the ETF holding.") + weight: Optional[float] = Field(description="Weight of the ETF holding.") diff --git a/openbb_platform/platform/provider/openbb_provider/standard_models/etf_info.py b/openbb_platform/platform/provider/openbb_provider/standard_models/etf_info.py new file mode 100644 index 00000000000..3486b6e0a57 --- /dev/null +++ b/openbb_platform/platform/provider/openbb_provider/standard_models/etf_info.py @@ -0,0 +1,29 @@ +"""ETF Info data model.""" + +from typing import List, Optional, Set, Union + +from pydantic import Field, field_validator + +from openbb_provider.abstract.data import Data +from openbb_provider.abstract.query_params import QueryParams + + +class EtfInfoQueryParams(QueryParams): + """ETF Info Query Params""" + + symbol: str = Field(description="The exchange ticker symbol for the ETF.") + + @field_validator("symbol") + def upper_symbol(cls, v: Union[str, List[str], Set[str]]): + """Convert symbol to uppercase.""" + if isinstance(v, str): + return v.upper() + return ",".join([symbol.upper() for symbol in list(v)]) + + +class EtfInfoData(Data): + """ETF Info Data.""" + + symbol: str = Field(description="The exchange ticker symbol for the ETF.") + inception_date: Optional[str] = Field(description="Inception date of the ETF.") + name: Optional[str] = Field(description="Name of the ETF.") diff --git a/openbb_platform/platform/provider/openbb_provider/standard_models/etf_search.py b/openbb_platform/platform/provider/openbb_provider/standard_models/etf_search.py new file mode 100644 index 00000000000..deff74a6d63 --- /dev/null +++ b/openbb_platform/platform/provider/openbb_provider/standard_models/etf_search.py @@ -0,0 +1,21 @@ +"""ETF Search data model.""" + +from typing import Optional + +from pydantic import Field + +from openbb_provider.abstract.data import Data +from openbb_provider.abstract.query_params import QueryParams + + +class EtfSearchQueryParams(QueryParams): + """ETF Search Query Params""" + + query: Optional[str] = Field(description="Search query.", default="") + + +class EtfSearchData(Data): + """ETF Search Data.""" + + symbol: str = Field(description="The exchange ticker symbol for the ETF.") + name: Optional[str] = Field(description="Name of the ETF.", default=None) diff --git a/openbb_platform/platform/provider/openbb_provider/standard_models/etf_sectors.py b/openbb_platform/platform/provider/openbb_provider/standard_models/etf_sectors.py new file mode 100644 index 00000000000..90423144f6e --- /dev/null +++ b/openbb_platform/platform/provider/openbb_provider/standard_models/etf_sectors.py @@ -0,0 +1,59 @@ +"""ETF Sectors data model.""" + +from typing import List, Optional, Set, Union + +from pydantic import Field, field_validator + +from openbb_provider.abstract.data import Data +from openbb_provider.abstract.query_params import QueryParams + + +class EtfSectorsQueryParams(QueryParams): + """ETF Sectors Query Params""" + + symbol: str = Field(description="The exchange ticker symbol for the ETF.") + + @field_validator("symbol") + def upper_symbol(cls, v: Union[str, List[str], Set[str]]): + """Convert symbol to uppercase.""" + if isinstance(v, str): + return v.upper() + return ",".join([symbol.upper() for symbol in list(v)]) + + +class EtfSectorsData(Data): + """ETF Sectors Data.""" + + energy: Optional[float] = Field(description="Energy Sector Weight", default=None) + materials: Optional[float] = Field( + description="Materials Sector Weight.", default=None + ) + industrials: Optional[float] = Field( + description="Industrials Sector Weight.", default=None + ) + consumer_cyclical: Optional[float] = Field( + description="Consumer Cyclical Sector Weight.", default=None + ) + consumer_defensive: Optional[float] = Field( + description="Consumer Defensive Sector Weight.", default=None + ) + financial_services: Optional[float] = Field( + description="Financial Services Sector Weight.", default=None + ) + technology: Optional[float] = Field( + description="Technology Sector Weight.", default=None + ) + health_care: Optional[float] = Field( + description="Health Care Sector Weight.", default=None + ) + communication_services: Optional[float] = Field( + description="Communication Services Sector Weight.", + alias="Communication Services", + default=None, + ) + utilities: Optional[float] = Field( + description="Utilities Sector Weight.", default=None + ) + real_estate: Optional[float] = Field( + description="Real Estate Sector Weight.", default=None + ) diff --git a/openbb_platform/platform/provider/openbb_provider/standard_models/historical_eps.py b/openbb_platform/platform/provider/openbb_provider/standard_models/historical_eps.py new file mode 100644 index 00000000000..75c50f730db --- /dev/null +++ b/openbb_platform/platform/provider/openbb_provider/standard_models/historical_eps.py @@ -0,0 +1,48 @@ +"""Historical EPS data model.""" + + +from datetime import ( + date as dateType, +) +from typing import List, Optional, Set, Union + +from dateutil import parser +from pydantic import Field, validator + +from openbb_provider.abstract.data import Data +from openbb_provider.abstract.query_params import QueryParams +from openbb_provider.utils.descriptions import DATA_DESCRIPTIONS, QUERY_DESCRIPTIONS + + +class HistoricalEpsQueryParams(QueryParams): + """Historical EPS Query.""" + + symbol: str = Field(description=QUERY_DESCRIPTIONS.get("symbol", "")) + + @validator("symbol", pre=True, check_fields=False, always=True) + def upper_symbol(cls, v: Union[str, List[str], Set[str]]): + """Convert symbol to uppercase.""" + if isinstance(v, str): + return v.upper() + return ",".join([symbol.upper() for symbol in list(v)]) + + +class HistoricalEpsData(Data): + """Historical EPS Data.""" + + date: dateType = Field(default=None, description=DATA_DESCRIPTIONS.get("date", "")) + symbol: str = Field(description=QUERY_DESCRIPTIONS.get("symbol", "")) + announce_time: Optional[str] = Field( + default=None, description="Timing of the earnings announcement." + ) + eps_actual: Optional[float] = Field( + default=None, description="Actual EPS from the earnings date." + ) + eps_estimated: Optional[float] = Field( + default=None, description="Estimated EPS for the earnings date." + ) + + @validator("date", pre=True, check_fields=False) + def date_validate(cls, v): # pylint: disable=E0213 + """Return formatted datetime.""" + return parser.isoparse(str(v)) diff --git a/openbb_platform/platform/provider/openbb_provider/standard_models/index_constituents.py b/openbb_platform/platform/provider/openbb_provider/standard_models/index_constituents.py index 78e80445f78..eddef9e34f5 100644 --- a/openbb_platform/platform/provider/openbb_provider/standard_models/index_constituents.py +++ b/openbb_platform/platform/provider/openbb_provider/standard_models/index_constituents.py @@ -13,7 +13,7 @@ class IndexConstituentsQueryParams(QueryParams): symbol: str = Field(description="The index ticker symbol.") - @field_validator("symbol", pre=True, check_fields=False, always=True) + @field_validator("symbol") def upper_symbol(cls, v: Union[str, List[str], Set[str]]): """Convert symbol to uppercase.""" if isinstance(v, str): diff --git a/openbb_platform/platform/provider/openbb_provider/standard_models/index_info.py b/openbb_platform/platform/provider/openbb_provider/standard_models/index_info.py index b54acceebd0..bf01aedef89 100644 --- a/openbb_platform/platform/provider/openbb_provider/standard_models/index_info.py +++ b/openbb_platform/platform/provider/openbb_provider/standard_models/index_info.py @@ -13,7 +13,7 @@ class IndexInfoQueryParams(QueryParams): symbol: str = Field(description="The index ticker symbol.") - @field_validator("symbol", pre=True, check_fields=False, always=True) + @field_validator("symbol") def upper_symbol(cls, v: Union[str, List[str], Set[str]]): """Convert symbol to uppercase.""" if isinstance(v, str): @@ -35,6 +35,6 @@ class IndexInfoData(Data): factsheet: Optional[str] = Field( description="URL to the factsheet document.", default=None ) - nb_constituents: Optional[int] = Field( + num_constituents: Optional[int] = Field( description="The number of constituents in the index.", default=None ) diff --git a/openbb_platform/platform/provider/openbb_provider/standard_models/index_sectors.py b/openbb_platform/platform/provider/openbb_provider/standard_models/index_sectors.py index 79c1949ad30..cdfca26328c 100644 --- a/openbb_platform/platform/provider/openbb_provider/standard_models/index_sectors.py +++ b/openbb_platform/platform/provider/openbb_provider/standard_models/index_sectors.py @@ -1,6 +1,6 @@ """Index Sectors data model.""" -from typing import List, Optional, Set, Union +from typing import List, Set, Union from pydantic import Field, field_validator @@ -13,7 +13,7 @@ class IndexSectorsQueryParams(QueryParams): symbol: str = Field(description="The index ticker symbol.") - @field_validator("symbol", pre=True, check_fields=False, always=True) + @field_validator("symbol") def upper_symbol(cls, v: Union[str, List[str], Set[str]]): """Convert symbol to uppercase.""" if isinstance(v, str): diff --git a/openbb_platform/platform/provider/openbb_provider/standard_models/industry_pe.py b/openbb_platform/platform/provider/openbb_provider/standard_models/industry_pe.py index 8c8c853501e..d9e0f7d4410 100644 --- a/openbb_platform/platform/provider/openbb_provider/standard_models/industry_pe.py +++ b/openbb_platform/platform/provider/openbb_provider/standard_models/industry_pe.py @@ -9,11 +9,11 @@ from openbb_provider.abstract.data import Data from openbb_provider.abstract.query_params import QueryParams -class IndustryPeQueryParams(QueryParams): +class IndustryPEQueryParams(QueryParams): """Industry P/E Ratio Query.""" -class IndustryPeData(Data): +class IndustryPEData(Data): """Industry P/E Ratio Data.""" date: Optional[dateType] = Field( @@ -22,5 +22,5 @@ class IndustryPeData(Data): exchange: Optional[str] = Field( default=None, description="The exchange where the data is from." ) - sector: str = Field(description="The name of the industry.") + industry: str = Field(description="The name of the industry.") pe: float = Field(description="The P/E ratio of the industry.") diff --git a/openbb_platform/platform/provider/openbb_provider/standard_models/recent_performance.py b/openbb_platform/platform/provider/openbb_provider/standard_models/recent_performance.py index 744cb2b1f88..e286369a10d 100644 --- a/openbb_platform/platform/provider/openbb_provider/standard_models/recent_performance.py +++ b/openbb_platform/platform/provider/openbb_provider/standard_models/recent_performance.py @@ -13,7 +13,7 @@ class RecentPerformanceQueryParams(QueryParams): symbol: str = Field(description="The ticker symbol to fetch.") - @field_validator("symbol", pre=True, check_fields=False, always=True) + @field_validator("symbol") def upper_symbol(cls, v: Union[str, List[str], Set[str]]): """Convert symbol to uppercase.""" if isinstance(v, str): @@ -25,9 +25,20 @@ class RecentPerformanceData(Data): """Recent Performance Data.""" one_day: Optional[float] = Field(description="One-day return.", default=None) + wtd: Optional[float] = Field(description="Week to date return.", default=None) one_week: Optional[float] = Field(description="One-week return.", default=None) - mtd: Optional[float] = Field(description="MTD return.", default=None) - qtd: Optional[float] = Field(description="QTD return.", default=None) - ytd: Optional[float] = Field(description="YTD return.", default=None) - ttm: Optional[float] = Field(description="TTM return.", default=None) - three_year: Optional[float] = Field(description="One-year return.", default=None) + mtd: Optional[float] = Field(description="Month to date return.", default=None) + one_month: Optional[float] = Field(description="One-month return.", default=None) + qtd: Optional[float] = Field(description="Quarter to date return.", default=None) + three_month: Optional[float] = Field( + description="Three-month return.", default=None + ) + six_month: Optional[float] = Field(description="Six-month return.", default=None) + ytd: Optional[float] = Field(description="Year to date return.", default=None) + one_year: Optional[float] = Field(description="One-year return.", default=None) + three_year: Optional[float] = Field(description="Three-year return.", default=None) + five_year: Optional[float] = Field(description="Five-year return.", default=None) + ten_year: Optional[float] = Field(description="Ten-year return.", default=None) + max: Optional[float] = Field( + description="Return from the beginning of the time series.", default=None + ) diff --git a/openbb_platform/platform/provider/openbb_provider/standard_models/sector_pe.py b/openbb_platform/platform/provider/openbb_provider/standard_models/sector_pe.py index 4dfe8c97580..63747f23dd1 100644 --- a/openbb_platform/platform/provider/openbb_provider/standard_models/sector_pe.py +++ b/openbb_platform/platform/provider/openbb_provider/standard_models/sector_pe.py @@ -9,11 +9,11 @@ from openbb_provider.abstract.data import Data from openbb_provider.abstract.query_params import QueryParams -class SectorPeQueryParams(QueryParams): +class SectorPEQueryParams(QueryParams): """Sector P/E Ratio Query.""" -class SectorPeData(Data): +class SectorPEData(Data): """Sector P/E Ratio Data.""" date: Optional[dateType] = Field(