refactored CryptoEOD for crypto.load

This commit is contained in:
Pratyush Shukla
2023-07-26 03:10:30 +05:30
parent c8814ec348
commit bd9771deff
3 changed files with 96 additions and 118 deletions

View File

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

View File

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

View File

@@ -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", ""))