From bd9771deff19d7d6de1ae68ecf67cfc076ed33a1 Mon Sep 17 00:00:00 2001 From: Pratyush Shukla Date: Wed, 26 Jul 2023 03:10:30 +0530 Subject: [PATCH] refactored `CryptoEOD` for `crypto.load` --- .../fmp/openbb_fmp/models/crypto_eod.py | 82 +++++++++---------- .../openbb_polygon/models/crypto_eod.py | 79 ++++++++++-------- .../openbb_provider/models/crypto_eod.py | 53 +++--------- 3 files changed, 96 insertions(+), 118 deletions(-) diff --git a/openbb_sdk/providers/fmp/openbb_fmp/models/crypto_eod.py b/openbb_sdk/providers/fmp/openbb_fmp/models/crypto_eod.py index e9d4d017efc..fed3195c5cb 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/models/crypto_eod.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/crypto_eod.py @@ -1,61 +1,55 @@ """FMP Cryptos end of day fetcher.""" -from datetime import date, datetime -from typing import Dict, List, Literal, Optional +from datetime import datetime, timedelta +from typing import Dict, List, Optional -from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring from openbb_provider.models.crypto_eod import CryptoEODData, CryptoEODQueryParams -from pydantic import Field, NonNegativeInt, validator +from openbb_provider.metadata import DATA_DESCRIPTIONS +from pydantic import Field, validator, NonNegativeInt from openbb_fmp.utils.helpers import get_data_many -class FMPCryptoEODQueryParams(QueryParams): - """FMP Crypto end of day query. +class FMPCryptoEODQueryParams(CryptoEODQueryParams): + """FMP Crypto end of day Query. - Source: https://site.financialmodelingprep.com/developer/docs/#Cryptocurrencies - - Parameter - --------- - symbol : str - The symbol of the company. - start_date : date - The start date of the stock data from which to retrieve the data. - end_date : date - The end date of the stock data up to which to retrieve the data. - timeseries : Optional[int] - The number of days to look back. - serietype : Optional[Literal["line"]] - The type of the series. Only "line" is supported. + Source: https://site.financialmodelingprep.com/developer/docs/cryptocurrency-historical-data-api/#Historical-Daily-Prices """ - symbol: str = Field(min_length=1) - serietype: Optional[Literal["line"]] - start_date: date - end_date: date - timeseries: Optional[NonNegativeInt] # Number of days to looks back + timeseries: Optional[NonNegativeInt] = Field( + default=None, description="Number of days to look back." + ) -class FMPCryptoEODData(Data): - date: datetime - open: float - high: float - low: float - close: float - adjClose: float = Field(alias="adj_close") - volume: float - unadjustedVolume: float - change: float - changePercent: float - vwap: float - label: str - changeOverTime: float +class FMPCryptoEODData(CryptoEODData): + """FMP Crypto end of day Data.""" + + date: datetime = Field(description=DATA_DESCRIPTIONS.get("date", "")) + adjClose: float = Field( + description="Adjusted Close Price of the symbol.", alias="adj_close" + ) + unadjustedVolume: float = Field( + description="Unadjusted volume of the symbol.", alias="unadjusted_volume" + ) + change: float = Field( + description="Change in the price of the symbol from the previous day.", + alias="change", + ) + changePercent: float = Field( + description="Change \% in the price of the symbol.", alias="change_percent" + ) + vwap: float = Field(description="Volume Weighted Average Price of the symbol.") + label: str = Field(description="Human readable format of the date.") + changeOverTime: float = Field( + description="Change \% in the price of the symbol over a period of time.", + alias="change_over_time", + ) @validator("date", pre=True) - def time_validate(cls, v): # pylint: disable=E0213 + def date_validate(cls, v): # pylint: disable=E0213 return datetime.strptime(v, "%Y-%m-%d") @@ -71,14 +65,14 @@ class FMPCryptoEODFetcher( def transform_query( query: CryptoEODQueryParams, extra_params: Optional[Dict] = None ) -> FMPCryptoEODQueryParams: - now = datetime.now() - start_date = query.start_date if query.start_date else now - end_date = query.end_date if query.end_date else now + now = datetime.now().date() + start_date = query.start_date or (now - timedelta(days=7)) + end_date = query.end_date or now return FMPCryptoEODQueryParams( symbol=query.symbol, start_date=start_date, end_date=end_date, - **extra_params if extra_params else {}, + **extra_params or {}, ) @staticmethod diff --git a/openbb_sdk/providers/polygon/openbb_polygon/models/crypto_eod.py b/openbb_sdk/providers/polygon/openbb_polygon/models/crypto_eod.py index b79c6a4c469..04e9c2c97c4 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/models/crypto_eod.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/crypto_eod.py @@ -2,47 +2,60 @@ from datetime import datetime, timedelta -from typing import Dict, List, Optional +from typing import Dict, List, Literal, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.crypto_eod import CryptoEODData, CryptoEODQueryParams -from pydantic import Field, NonNegativeFloat, PositiveFloat, PositiveInt +from openbb_provider.metadata import QUERY_DESCRIPTIONS +from pydantic import Field, validator, PositiveFloat, PositiveInt from openbb_polygon.utils.helpers import get_data -from openbb_polygon.utils.types import BaseStockData, BaseStockQueryParams -class PolygonCryptoEODQueryParams(BaseStockQueryParams): - """Polygon crypto end of day query. +class PolygonCryptoEODQueryParams(CryptoEODQueryParams): + """Polygon crypto end of day Query. Source: https://polygon.io/docs/crypto/get_v2_aggs_ticker__cryptoticker__range__multiplier___timespan___from___to - - Parameters - ---------- - symbol : str - The symbol symbol of the stocks to fetch. - start_date : Union[date, datetime] - The start date of the query. - end_date : Union[date, datetime] - The end date of the query. - timespan : Timespan, optional - The timespan of the query, by default Timespan.day - sort : Literal["asc", "desc"], optional - The sort order of the query, by default "desc" - limit : PositiveInt, optional - The limit of the query, by default 49999 - adjusted : bool, optional - Whether the query is adjusted, by default True - multiplier : PositiveInt, optional - The multiplier of the query, by default 1 """ + timespan: Literal[ + "minute", "hour", "day", "week", "month", "quarter", "year" + ] = Field(default="day", description="The timespan of the data.") + sort: Literal["asc", "desc"] = Field( + default="desc", description="Sort order of the data." + ) + limit: PositiveInt = Field( + default=49999, description=QUERY_DESCRIPTIONS.get("limit", "") + ) + adjusted: bool = Field(default=True, description="Whether the data is adjusted.") + multiplier: PositiveInt = Field( + default=1, description="The multiplier of the timespan." + ) -class PolygonCryptoEODData(BaseStockData): - v: NonNegativeFloat = Field(alias="volume") - n: PositiveInt - vw: PositiveFloat + +class PolygonCryptoEODData(CryptoEODData): + """Polygon crypto end of day Data.""" + + class Config: + fields = { + "open": "o", + "high": "h", + "low": "l", + "close": "c", + "volume": "v", + } + + n: PositiveInt = Field( + description="The number of transactions for the symbol in the time period." + ) + vw: PositiveFloat = Field( + description="The volume weighted average price of the symbol." + ) + + @validator("t", pre=True, check_fields=False) + def time_validate(cls, v): # pylint: disable=E0213 + return datetime.fromtimestamp(v / 1000) class PolygonCryptoEODFetcher( @@ -57,14 +70,14 @@ class PolygonCryptoEODFetcher( def transform_query( query: CryptoEODQueryParams, extra_params: Optional[Dict] = None ) -> PolygonCryptoEODQueryParams: - now = datetime.now() - start_date = query.start_date if query.start_date else now - timedelta(days=7) - end_date = query.end_date if query.end_date else now + now = datetime.now().date() + start_date = query.start_date or (now - timedelta(days=7)) + end_date = query.end_date or now return PolygonCryptoEODQueryParams( symbol=query.symbol, start_date=start_date, end_date=end_date, - **extra_params if extra_params else {}, + **extra_params or {}, ) @staticmethod @@ -76,7 +89,7 @@ class PolygonCryptoEODFetcher( request_url = ( f"https://api.polygon.io/v2/aggs/ticker/" - f"X:{query.stocksTicker.upper()}/range/1/{str(query.timespan.value)}/" + f"X:{query.symbol}/range/1/{str(query.timespan)}/" f"{query.start_date}/{query.end_date}?adjusted={query.adjusted}" f"&sort={query.sort}&limit={query.limit}&multiplier={query.multiplier}" f"&apiKey={api_key}" diff --git a/openbb_sdk/sdk/provider/openbb_provider/models/crypto_eod.py b/openbb_sdk/sdk/provider/openbb_provider/models/crypto_eod.py index bc5a208e0c0..0f2a9fc9918 100644 --- a/openbb_sdk/sdk/provider/openbb_provider/models/crypto_eod.py +++ b/openbb_sdk/sdk/provider/openbb_provider/models/crypto_eod.py @@ -1,63 +1,34 @@ """Crypto aggregate end of day price data model.""" -from datetime import date, datetime +from datetime import date from typing import Optional from pydantic import Field, PositiveFloat from openbb_provider.abstract.data import Data, QueryParams -from openbb_provider.metadata import QUERY_DESCRIPTIONS +from openbb_provider.metadata import QUERY_DESCRIPTIONS, DATA_DESCRIPTIONS from openbb_provider.models.base import BaseSymbol class CryptoEODQueryParams(QueryParams, BaseSymbol): - """Crypto end of day query. - - Parameter - --------- - symbol : str - The symbol of the company. - start_date : Optional[date] - The start date of the stock data from which to retrieve the data. - end_date : Optional[date] - The end date of the stock data up to which to retrieve the data. - """ + """Crypto end of day Query.""" start_date: Optional[date] = Field( - description=QUERY_DESCRIPTIONS.get("start_date", ""), default=None, + description=QUERY_DESCRIPTIONS.get("start_date", ""), ) end_date: Optional[date] = Field( - description=QUERY_DESCRIPTIONS.get("end_date", ""), default=None + default=None, + description=QUERY_DESCRIPTIONS.get("end_date", ""), ) class CryptoEODData(Data): - """Crypto end of day price data. + """Crypto end of day price Data.""" - Returns - ------- - date : datetime - The date of the stock. - open : PositiveFloat - The open price of the stock. - high : PositiveFloat - The high price of the stock. - low : PositiveFloat - The low price of the stock. - close : PositiveFloat - The close price of the stock. - adj_close : Optional[PositiveFloat] - The adjusted close price of the stock. - volume : PositiveFloat - The volume of the stock. - """ - - date: datetime - open: PositiveFloat - high: PositiveFloat - low: PositiveFloat - close: PositiveFloat - adj_close: Optional[PositiveFloat] - volume: PositiveFloat + open: PositiveFloat = Field(description=DATA_DESCRIPTIONS.get("open", "")) + high: PositiveFloat = Field(description=DATA_DESCRIPTIONS.get("high", "")) + low: PositiveFloat = Field(description=DATA_DESCRIPTIONS.get("low", "")) + close: PositiveFloat = Field(description=DATA_DESCRIPTIONS.get("close", "")) + volume: PositiveFloat = Field(description=DATA_DESCRIPTIONS.get("volume", ""))