mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-11-03 07:51:49 +00:00
refactored CryptoEOD for crypto.load
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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}"
|
||||
|
||||
@@ -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", ""))
|
||||
|
||||
Reference in New Issue
Block a user