Merge branch 'feature/openbb-sdk-v4' into feature/integration-tests

This commit is contained in:
hjoaquim
2023-09-26 09:09:59 +01:00
18 changed files with 65 additions and 47 deletions

View File

@@ -3203,7 +3203,7 @@ class ROUTER_stocks_fa(Container):
OpenBBCustomParameter(description="Year of the earnings call transcript."),
],
quarter: Annotated[
Literal[1, 2, 3, 4],
int,
OpenBBCustomParameter(
description="Quarter of the earnings call transcript."
),
@@ -3219,7 +3219,7 @@ class ROUTER_stocks_fa(Container):
Symbol to get data for.
year : int
Year of the earnings call transcript.
quarter : Literal[1, 2, 3, 4]
quarter : int
Quarter of the earnings call transcript.
provider : Optional[Literal['fmp']]
The provider to use for the query, by default None.

View File

@@ -59,7 +59,7 @@ class FREDAMERIBORData(AMERIBORData):
try:
return float(v)
except ValueError:
return float("nan")
return None
class FREDAMERIBORFetcher(

View File

@@ -50,7 +50,7 @@ class FREDESTRData(ESTRData):
try:
return float(v)
except ValueError:
return float("nan")
return None
class FREDESTRFetcher(

View File

@@ -51,7 +51,7 @@ class FREDFEDData(FEDData):
try:
return float(v)
except ValueError:
return float("nan")
return None
class FREDFEDFetcher(Fetcher[FREDFEDQueryParams, List[Dict[str, List[FREDFEDData]]]]):

View File

@@ -31,7 +31,7 @@ class FREDIORBData(IORBData):
try:
return float(v)
except ValueError:
return float("nan")
return None
class FREDIORBFetcher(

View File

@@ -40,7 +40,7 @@ class FREDSOFRData(SOFRData):
try:
return float(v)
except ValueError:
return float("nan")
return None
class FREDSOFRFetcher(

View File

@@ -48,7 +48,7 @@ class FREDSONIAData(SONIAData):
try:
return float(v)
except ValueError:
return float("nan")
return None
class FREDSONIAFetcher(

View File

@@ -67,9 +67,9 @@ def process_projections(data: Dict) -> List[Dict]:
for key, value in data.items():
val = [item["value"] for item in value if item["date"] == date]
if val:
entry[key] = float(val[0]) if val != "." else float("nan")
entry[key] = float(val[0]) if val[0] != "." else None
else:
entry[key] = float("nan")
entry[key] = None
ldata.append(entry)
return ldata

View File

@@ -2,7 +2,7 @@
# ruff: noqa: SIM105
from datetime import datetime
from datetime import datetime, timedelta
from typing import Any, Dict, List, Optional
from dateutil.relativedelta import relativedelta
@@ -14,6 +14,7 @@ from openbb_provider.standard_models.futures_historical import (
from openbb_provider.utils.descriptions import QUERY_DESCRIPTIONS
from openbb_yfinance.utils.helpers import get_futures_data
from openbb_yfinance.utils.references import INTERVALS, MONTHS, PERIODS
from pandas import Timestamp, to_datetime
from pydantic import Field, validator
from yfinance import Ticker
@@ -40,10 +41,12 @@ class YFinanceFuturesHistoricalQueryParams(FuturesHistoricalQueryParams):
class YFinanceFuturesHistoricalData(FuturesHistoricalData):
"""YFinance Futures End of Day Data."""
@validator("Date", pre=True, check_fields=False)
@validator("date", pre=True, check_fields=False)
def date_validate(cls, v): # pylint: disable=E0213
"""Return datetime object from string."""
return datetime.strptime(v, "%Y-%m-%dT%H:%M:%S")
"""Return formatted datetime."""
if isinstance(v, Timestamp):
return v.to_pydatetime()
return v
class YFinanceFuturesHistoricalFetcher(
@@ -63,23 +66,9 @@ class YFinanceFuturesHistoricalFetcher(
now = datetime.now().date()
if params.get("start_date") is None:
transformed_params["start_date"] = now - relativedelta(years=1)
else:
try:
transformed_params["start_date"] = datetime.strptime(
params["start_date"], "%Y-%m-%d"
).date()
except TypeError:
pass
if params.get("end_date") is None:
transformed_params["end_date"] = now
else:
try:
transformed_params["end_date"] = datetime.strptime(
params["end_date"], "%Y-%m-%d"
).date()
except TypeError:
pass
return YFinanceFuturesHistoricalQueryParams(**transformed_params)
@@ -124,10 +113,29 @@ class YFinanceFuturesHistoricalFetcher(
raise_errors=True,
)
data = data.reset_index()
data["Date"] = (
data["Date"].dt.tz_localize(None).dt.strftime("%Y-%m-%dT%H:%M:%S")
query.end_date = (
datetime.now().date() if query.end_date is None else query.end_date
)
days = (
1
if query.interval in ["1m", "2m", "5m", "15m", "30m", "60m", "1h", "90m"]
else 0
)
if query.start_date:
data.set_index("date", inplace=True)
data.index = to_datetime(data.index)
start_date_dt = datetime.combine(query.start_date, datetime.min.time())
end_date_dt = datetime.combine(query.end_date, datetime.min.time())
data = data[
(data.index >= start_date_dt + timedelta(days=days))
& (data.index <= end_date_dt)
]
data.reset_index(inplace=True)
data.rename(columns={"index": "date"}, inplace=True)
return data.to_dict("records")
@staticmethod

View File

@@ -28,4 +28,4 @@ class AMERIBORData(Data):
"""Return Treasury Rates Data."""
date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", ""))
rate: float = Field(description="AMERIBOR rate.")
rate: Optional[float] = Field(description="AMERIBOR rate.")

View File

@@ -2,7 +2,7 @@
from datetime import datetime
from typing import List, Literal, Set, Union
from typing import List, Set, Union
from pydantic import Field, validator
@@ -16,8 +16,11 @@ class EarningsCallTranscriptQueryParams(QueryParams):
symbol: str = Field(description=QUERY_DESCRIPTIONS.get("symbol", ""))
year: int = Field(description="Year of the earnings call transcript.")
quarter: Literal[1, 2, 3, 4] = Field(
default=1, description="Quarter of the earnings call transcript."
quarter: int = Field(
default=1,
gt=0,
lt=5,
description="Quarter of the earnings call transcript.",
)
@validator("symbol", pre=True, check_fields=False, always=True)

View File

@@ -28,4 +28,4 @@ class ESTRData(Data):
"""Return Treasury Rates Data."""
date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", ""))
rate: float = Field(description="ESTR rate.")
rate: Optional[float] = Field(description="ESTR rate.")

View File

@@ -2,6 +2,7 @@
from datetime import date as dateType
from typing import Optional
from pydantic import Field
@@ -18,16 +19,16 @@ class PROJECTIONData(Data):
"""Return Treasury Rates Data."""
date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", ""))
range_high: float = Field(description="High projection of rates.")
central_tendency_high: float = Field(
range_high: Optional[float] = Field(description="High projection of rates.")
central_tendency_high: Optional[float] = Field(
description="Central tendency of high projection of rates."
)
median: float = Field(description="Median projection of rates.")
range_midpoint: float = Field(description="Midpoint projection of rates.")
central_tendency_midpoint: float = Field(
median: Optional[float] = Field(description="Median projection of rates.")
range_midpoint: Optional[float] = Field(description="Midpoint projection of rates.")
central_tendency_midpoint: Optional[float] = Field(
description="Central tendency of midpoint projection of rates."
)
range_low: float = Field(description="Low projection of rates.")
central_tendency_low: float = Field(
range_low: Optional[float] = Field(description="Low projection of rates.")
central_tendency_low: Optional[float] = Field(
description="Central tendency of low projection of rates."
)

View File

@@ -28,4 +28,4 @@ class FEDData(Data):
"""Return Treasury Rates Data."""
date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", ""))
rate: float = Field(description="FED rate.")
rate: Optional[float] = Field(description="FED rate.")

View File

@@ -4,6 +4,7 @@
from datetime import date, datetime
from typing import List, Optional, Set, Union
from dateutil import parser
from pydantic import Field, validator
from openbb_provider.abstract.data import Data
@@ -45,3 +46,8 @@ class FuturesHistoricalData(Data):
low: float = Field(description=DATA_DESCRIPTIONS.get("low", ""))
close: float = Field(description=DATA_DESCRIPTIONS.get("close", ""))
volume: float = Field(description=DATA_DESCRIPTIONS.get("volume", ""))
@validator("date", pre=True, check_fields=False)
def date_validate(cls, v): # pylint: disable=E0213
"""Return formatted datetime."""
return parser.isoparse(str(v))

View File

@@ -28,4 +28,4 @@ class IORBData(Data):
"""Return Treasury Rates Data."""
date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", ""))
rate: float = Field(description="IORB rate.")
rate: Optional[float] = Field(description="IORB rate.")

View File

@@ -28,4 +28,4 @@ class SOFRData(Data):
"""Return Treasury Rates Data."""
date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", ""))
rate: float = Field(description="SOFR rate.")
rate: Optional[float] = Field(description="SOFR rate.")

View File

@@ -28,4 +28,4 @@ class SONIAData(Data):
"""Return Treasury Rates Data."""
date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", ""))
rate: float = Field(description="SONIA rate.")
rate: Optional[float] = Field(description="SONIA rate.")