Merge branch 'feature/field_description' of https://github.com/OpenBB-finance/OpenBBTerminal into feature/field_description

This commit is contained in:
Pratyush Shukla
2023-07-25 23:31:38 +05:30
21 changed files with 158 additions and 141 deletions

View File

@@ -1,63 +1,7 @@
import csv
import os
from pathlib import Path
from typing import List, Literal
CPI_COUNTRIES = Literal[
"australia",
"austria",
"belgium",
"brazil",
"bulgaria",
"canada",
"chile",
"china",
"croatia",
"cyprus",
"czech_republic",
"denmark",
"estonia",
"euro_area",
"finland",
"france",
"germany",
"greece",
"hungary",
"iceland",
"india",
"indonesia",
"ireland",
"israel",
"italy",
"japan",
"korea",
"latvia",
"lithuania",
"luxembourg",
"malta",
"mexico",
"netherlands",
"new_zealand",
"norway",
"poland",
"portugal",
"romania",
"russian_federation",
"slovak_republic",
"slovakia",
"slovenia",
"south_africa",
"spain",
"sweden",
"switzerland",
"turkey",
"united_kingdom",
"united_states",
]
CPI_UNITS = Literal["growth_previous", "growth_same", "index_2015"]
CPI_FREQUENCY = Literal["monthly", "quarterly", "annual"]
from typing import List
def all_cpi_options(harmonized: bool = False) -> List[dict]:

View File

@@ -49,7 +49,9 @@ class CommandOutput(GenericModel, Generic[T], Tagged):
+ "\n".join([f"{k}: {v}" for k, v in self.dict().items()])
)
def to_dataframe(self, concat: bool = True) -> Union[pd.DataFrame, Dict[str, pd.DataFrame]]:
def to_dataframe(
self, concat: bool = True
) -> Union[pd.DataFrame, Dict[str, pd.DataFrame]]:
"""Converts results field to pandas dataframe.
Parameters
@@ -78,6 +80,11 @@ class CommandOutput(GenericModel, Generic[T], Tagged):
df = basemodel_to_df(self.results, "date")
else:
df = basemodel_to_df(self.results, "date")
if df.index.name == "date":
df.index = pd.to_datetime(df.index)
df.sort_index(axis=0, inplace=True)
except Exception as e:
raise OpenBBError("Failed to convert results to DataFrame.") from e

View File

@@ -1,12 +1,19 @@
"""Metadata for the parameters of the Pydantic models."""
DESCRIPTIONS = {
QUERY_DESCRIPTIONS = {
"symbol": "Symbol to get data for.",
"start_date": "Start date of the data.",
"end_date": "End date of the data.",
"start_date": "Start date of the data, in YYYY-MM-DD format.",
"end_date": "End date of the data, in YYYY-MM-DD format.",
"weekly": "Whether to return weekly data.",
"monthly": "Whether to return monthly data.",
"period": "Period of the data to return (quarterly or annually).",
"date": "A specific date to get data for.",
"limit": "The number of data entries to return.",
"countries": "The country or countries to get data.",
"units": "The data units.",
"frequency": "The data time frequency.",
}
DATA_DESCRIPTIONS = {
"date": "The date of the data.",
}

View File

@@ -4,26 +4,26 @@
from datetime import date as dateType
from typing import Literal
from openbb_provider.abstract.data import Data, QueryParams
from openbb_provider.models.base import BaseSymbol
from openbb_provider.metadata import DESCRIPTIONS
from pydantic import Field
from openbb_provider.abstract.data import Data, QueryParams
from openbb_provider.metadata import QUERY_DESCRIPTIONS
from openbb_provider.models.base import BaseSymbol
class AnalystEstimatesQueryParams(QueryParams, BaseSymbol):
"""Analyst Estimates query."""
period: Literal["quarterly", "annually"] = Field(
default="annually", description=DESCRIPTIONS.get("period", "")
default="annually", description=QUERY_DESCRIPTIONS.get("period", "")
)
limit: int = Field(default=30, description=DESCRIPTIONS.get("limit", ""))
limit: int = Field(default=30, description=QUERY_DESCRIPTIONS.get("limit", ""))
class AnalystEstimatesData(Data, BaseSymbol):
"""Analyst estimates data."""
date: dateType = Field(description=DESCRIPTIONS.get("date", ""))
date: dateType = Field(description=QUERY_DESCRIPTIONS.get("date", ""))
estimated_revenue_low: int = Field(description="The estimated revenue low.")
estimated_revenue_high: int = Field(description="The estimated revenue high.")
estimated_revenue_avg: int = Field(description="The estimated revenue average.")

View File

@@ -3,11 +3,11 @@
from typing import Optional
from pydantic import Field
from openbb_provider.abstract.data import Data, QueryParams
from openbb_provider.models.base import BaseSymbol
from pydantic import Field
class AvailableIndicesQueryParams(QueryParams):
"""Available Indices Query."""

View File

@@ -3,11 +3,11 @@ from typing import Literal
from pydantic import BaseModel, Field, validator
from openbb_provider.abstract.data import QueryParams
from openbb_provider.metadata import DESCRIPTIONS
from openbb_provider.metadata import QUERY_DESCRIPTIONS
class BaseSymbol(BaseModel):
symbol: str = Field(min_length=1, description=DESCRIPTIONS.get("symbol", ""))
symbol: str = Field(min_length=1, description=QUERY_DESCRIPTIONS.get("symbol", ""))
@validator("symbol", pre=True)
def upper_symbol(cls, v: str): # pylint: disable=E0213
@@ -16,5 +16,5 @@ class BaseSymbol(BaseModel):
class FinancialStatementQueryParams(QueryParams, BaseSymbol):
period: Literal["annually", "quarterly"] = Field(
default="annually", description=DESCRIPTIONS.get("period", "")
default="annually", description=QUERY_DESCRIPTIONS.get("period", "")
)

View File

@@ -1,45 +1,102 @@
from datetime import date as dateType
from typing import List, Optional
from typing import List, Literal, Optional
from openbb_fred.utils.fred_helpers import CPI_COUNTRIES, CPI_FREQUENCY, CPI_UNITS
from pydantic import validator
from pydantic import Field, validator
from openbb_provider.abstract.data import Data, QueryParams
from openbb_provider.metadata import DATA_DESCRIPTIONS, QUERY_DESCRIPTIONS
CPI_COUNTRIES = Literal[
"australia",
"austria",
"belgium",
"brazil",
"bulgaria",
"canada",
"chile",
"china",
"croatia",
"cyprus",
"czech_republic",
"denmark",
"estonia",
"euro_area",
"finland",
"france",
"germany",
"greece",
"hungary",
"iceland",
"india",
"indonesia",
"ireland",
"israel",
"italy",
"japan",
"korea",
"latvia",
"lithuania",
"luxembourg",
"malta",
"mexico",
"netherlands",
"new_zealand",
"norway",
"poland",
"portugal",
"romania",
"russian_federation",
"slovak_republic",
"slovakia",
"slovenia",
"south_africa",
"spain",
"sweden",
"switzerland",
"turkey",
"united_kingdom",
"united_states",
]
CPI_UNITS = Literal["growth_previous", "growth_same", "index_2015"]
CPI_FREQUENCY = Literal["monthly", "quarterly", "annual"]
class CPIQueryParams(QueryParams):
"""CPI query.
When other provders are added, this will probably need less strict types
"""CPI query."""
Parameter
---------
countries: List[CPI_COUNTRIES]
The country or countries you want to see.
units: List[CPI_UNITS]
The units you want to see, can be "growth_previous", "growth_same" or "index_2015".
frequency: List[CPI_FREQUENCY]
The frequency you want to see, either "annual", monthly" or "quarterly".
harmonized: bool
Whether you wish to obtain harmonized data.
start_date: Optional[date]
Start date, formatted YYYY-MM-DD
end_date: Optional[date]
End date, formatted YYYY-MM-DD
"""
countries: List[CPI_COUNTRIES]
units: CPI_UNITS = "growth_same"
frequency: CPI_FREQUENCY = "monthly"
harmonized: bool = False
start_date: Optional[dateType]
end_date: Optional[dateType]
countries: List[CPI_COUNTRIES] = Field(
description=QUERY_DESCRIPTIONS.get("countries")
)
units: CPI_UNITS = Field(
default="growth_same", description=QUERY_DESCRIPTIONS.get("units")
)
frequency: CPI_FREQUENCY = Field(
default="monthly", description=QUERY_DESCRIPTIONS.get("frequency")
)
harmonized: bool = Field(
default=False, description="Whether you wish to obtain harmonized data."
)
start_date: Optional[dateType] = Field(
default=None, description=QUERY_DESCRIPTIONS.get("start_date")
)
end_date: Optional[dateType] = Field(
default=None, description=QUERY_DESCRIPTIONS.get("end_date")
)
class CPIData(Data):
date: dateType
realtime_start: dateType
realtime_end: dateType
value: float
"""CPI data."""
date: dateType = Field(description=DATA_DESCRIPTIONS.get("date"))
realtime_start: dateType = Field(
description="The date the data was updated."
) # TODO: What is this?
realtime_end: dateType = Field(
description="The date the data was updated."
) # TODO: What is this?
value: float = Field(description="The value of the data.")
@validator("value", pre=True)
def value_validate(cls, v: str): # pylint: disable=E0213

View File

@@ -7,7 +7,7 @@ from typing import Optional
from pydantic import Field, PositiveFloat
from openbb_provider.abstract.data import Data, QueryParams
from openbb_provider.metadata import DESCRIPTIONS
from openbb_provider.metadata import QUERY_DESCRIPTIONS
from openbb_provider.models.base import BaseSymbol
@@ -25,11 +25,11 @@ class CryptoEODQueryParams(QueryParams, BaseSymbol):
"""
start_date: Optional[date] = Field(
description=DESCRIPTIONS.get("start_date", ""),
description=QUERY_DESCRIPTIONS.get("start_date", ""),
default=None,
)
end_date: Optional[date] = Field(
description=DESCRIPTIONS.get("end_date", ""), default=None
description=QUERY_DESCRIPTIONS.get("end_date", ""), default=None
)

View File

@@ -7,7 +7,7 @@ from typing import Optional
from pydantic import Field, PositiveFloat
from openbb_provider.abstract.data import Data, QueryParams
from openbb_provider.metadata import DESCRIPTIONS
from openbb_provider.metadata import QUERY_DESCRIPTIONS
from openbb_provider.models.base import BaseSymbol
@@ -25,9 +25,9 @@ class CryptoPriceQueryParams(QueryParams, BaseSymbol):
"""
# These fields only work with Polygon
start_date: date = Field(description=DESCRIPTIONS.get("start_date", ""))
start_date: date = Field(description=QUERY_DESCRIPTIONS.get("start_date", ""))
end_date: Optional[date] = Field(
description=DESCRIPTIONS.get("end_date", ""), default=date.today()
description=QUERY_DESCRIPTIONS.get("end_date", ""), default=date.today()
)

View File

@@ -11,7 +11,7 @@ from typing import Optional
from pydantic import Field, NonNegativeFloat
from openbb_provider.abstract.data import Data, QueryParams
from openbb_provider.metadata import DESCRIPTIONS
from openbb_provider.metadata import QUERY_DESCRIPTIONS
class DividendCalendarQueryParams(QueryParams):
@@ -31,11 +31,11 @@ class DividendCalendarQueryParams(QueryParams):
"""
start_date: Optional[dateType] = Field(
description=DESCRIPTIONS.get("start_date", ""),
description=QUERY_DESCRIPTIONS.get("start_date", ""),
default=datetime.now().date() - timedelta(days=31),
)
end_date: Optional[dateType] = Field(
description=DESCRIPTIONS.get("end_date", ""),
description=QUERY_DESCRIPTIONS.get("end_date", ""),
default=datetime.now().date() - timedelta(days=1),
)

View File

@@ -7,7 +7,7 @@ from typing import Optional
from pydantic import Field, PositiveFloat
from openbb_provider.abstract.data import Data, QueryParams
from openbb_provider.metadata import DESCRIPTIONS
from openbb_provider.metadata import QUERY_DESCRIPTIONS
from openbb_provider.models.base import BaseSymbol
@@ -25,9 +25,9 @@ class ForexPriceQueryParams(QueryParams, BaseSymbol):
"""
# These fields only work with Polygon
start_date: date = Field(description=DESCRIPTIONS.get("start_date", ""))
start_date: date = Field(description=QUERY_DESCRIPTIONS.get("start_date", ""))
end_date: Optional[date] = Field(
description=DESCRIPTIONS.get("end_date", ""), default=date.today()
description=QUERY_DESCRIPTIONS.get("end_date", ""), default=date.today()
)

View File

@@ -7,7 +7,7 @@ from typing import Optional
from pydantic import Field
from openbb_provider.abstract.data import Data, QueryParams
from openbb_provider.metadata import DESCRIPTIONS
from openbb_provider.metadata import QUERY_DESCRIPTIONS
from openbb_provider.models.base import BaseSymbol
@@ -27,7 +27,7 @@ class InstitutionalOwnershipQueryParams(QueryParams, BaseSymbol):
include_current_quarter: bool = Field(
default=False, description="Include current quarter data."
)
date: Optional[dateType] = Field(description=DESCRIPTIONS.get("date", ""))
date: Optional[dateType] = Field(description=QUERY_DESCRIPTIONS.get("date", ""))
class InstitutionalOwnershipData(Data):

View File

@@ -7,7 +7,7 @@ from typing import Literal, Optional, Union
from pydantic import Field
from openbb_provider.abstract.data import Data, QueryParams
from openbb_provider.metadata import DESCRIPTIONS
from openbb_provider.metadata import QUERY_DESCRIPTIONS
class MajorIndicesConstituentsQueryParams(QueryParams):
@@ -20,7 +20,7 @@ class MajorIndicesConstituentsQueryParams(QueryParams):
"""
index: Literal["nasdaq", "sp500", "dowjones"] = Field(
description=DESCRIPTIONS.get("index", ""),
description=QUERY_DESCRIPTIONS.get("index", ""),
default="dowjones",
)

View File

@@ -7,7 +7,7 @@ from typing import Optional
from pydantic import Field, PositiveFloat
from openbb_provider.abstract.data import Data, QueryParams
from openbb_provider.metadata import DESCRIPTIONS
from openbb_provider.metadata import QUERY_DESCRIPTIONS
from openbb_provider.models.base import BaseSymbol
@@ -24,9 +24,9 @@ class MajorIndicesEODQueryParams(QueryParams, BaseSymbol):
The end date of the stock data up to which to retrieve the data.
"""
start_date: date = Field(description=DESCRIPTIONS.get("start_date", ""))
start_date: date = Field(description=QUERY_DESCRIPTIONS.get("start_date", ""))
end_date: Optional[date] = Field(
description=DESCRIPTIONS.get("end_date", ""), default=date.today()
description=QUERY_DESCRIPTIONS.get("end_date", ""), default=date.today()
)

View File

@@ -7,7 +7,7 @@ from typing import Dict, Literal
from pydantic import Field
from openbb_provider.abstract.data import Data, QueryParams
from openbb_provider.metadata import DESCRIPTIONS
from openbb_provider.metadata import QUERY_DESCRIPTIONS
from openbb_provider.models.base import BaseSymbol
@@ -26,7 +26,7 @@ class RevenueBusinessLineQueryParams(QueryParams, BaseSymbol):
"""
period: Literal["quarterly", "annually"] = Field(
default="quarterly", description=DESCRIPTIONS.get("period", "")
default="quarterly", description=QUERY_DESCRIPTIONS.get("period", "")
)
structure: Literal["hierarchical", "flat"] = Field(
default="flat"

View File

@@ -7,7 +7,7 @@ from typing import Literal, Optional
from pydantic import Field
from openbb_provider.abstract.data import Data, QueryParams
from openbb_provider.metadata import DESCRIPTIONS
from openbb_provider.metadata import QUERY_DESCRIPTIONS
from openbb_provider.models.base import BaseSymbol
@@ -25,7 +25,7 @@ class RevenueGeographicQueryParams(QueryParams, BaseSymbol):
"""
period: Literal["quarterly", "annually"] = Field(
default="quarterly", description=DESCRIPTIONS.get("period", "")
default="quarterly", description=QUERY_DESCRIPTIONS.get("period", "")
)
structure: Literal["hierarchical", "flat"] = Field(
default="flat"

View File

@@ -7,7 +7,7 @@ from typing import Optional
from pydantic import Field, PositiveFloat
from openbb_provider.abstract.data import Data, QueryParams
from openbb_provider.metadata import DESCRIPTIONS
from openbb_provider.metadata import QUERY_DESCRIPTIONS
from openbb_provider.models.base import BaseSymbol
@@ -24,11 +24,11 @@ class StockEODQueryParams(QueryParams, BaseSymbol):
"""
start_date: Optional[date] = Field(
description=DESCRIPTIONS.get("start_date", ""),
description=QUERY_DESCRIPTIONS.get("start_date", ""),
default=None,
)
end_date: Optional[date] = Field(
description=DESCRIPTIONS.get("end_date", ""), default=None
description=QUERY_DESCRIPTIONS.get("end_date", ""), default=None
)

View File

@@ -7,7 +7,7 @@ from typing import Optional
from pydantic import Field, validator
from openbb_provider.abstract.data import Data, QueryParams
from openbb_provider.metadata import DESCRIPTIONS
from openbb_provider.metadata import QUERY_DESCRIPTIONS
class StockNewsQueryParams(QueryParams):
@@ -22,7 +22,9 @@ class StockNewsQueryParams(QueryParams):
The page of the stock news to be retrieved.
"""
symbols: str = Field(min_length=1, description=DESCRIPTIONS.get("symbols", ""))
symbols: str = Field(
min_length=1, description=QUERY_DESCRIPTIONS.get("symbols", "")
)
page: int = Field(default=0)
@validator("symbols", pre=True)

View File

@@ -7,7 +7,7 @@ from typing import Optional
from pydantic import Field, PositiveFloat
from openbb_provider.abstract.data import Data, QueryParams
from openbb_provider.metadata import DESCRIPTIONS
from openbb_provider.metadata import QUERY_DESCRIPTIONS
from openbb_provider.models.base import BaseSymbol
@@ -25,9 +25,9 @@ class StockPriceQueryParams(QueryParams, BaseSymbol):
"""
# These fields only work with Polygon
start_date: date = Field(description=DESCRIPTIONS.get("start_date", ""))
start_date: date = Field(description=QUERY_DESCRIPTIONS.get("start_date", ""))
end_date: Optional[date] = Field(
description=DESCRIPTIONS.get("end_date", ""), default=date.today()
description=QUERY_DESCRIPTIONS.get("end_date", ""), default=date.today()
)

View File

@@ -7,7 +7,7 @@ from typing import Optional
from pydantic import Field
from openbb_provider.abstract.data import Data, QueryParams
from openbb_provider.metadata import DESCRIPTIONS
from openbb_provider.metadata import QUERY_DESCRIPTIONS
class StockSplitCalendarQueryParams(QueryParams):
@@ -22,10 +22,10 @@ class StockSplitCalendarQueryParams(QueryParams):
"""
start_date: Optional[dateType] = Field(
description=DESCRIPTIONS.get("start_date", ""), default=None
description=QUERY_DESCRIPTIONS.get("start_date", ""), default=None
)
end_date: Optional[dateType] = Field(
description=DESCRIPTIONS.get("end_date", ""), default=None
description=QUERY_DESCRIPTIONS.get("end_date", ""), default=None
)

View File

@@ -10,7 +10,7 @@ from typing import Optional
from pydantic import Field
from openbb_provider.abstract.data import Data, QueryParams
from openbb_provider.metadata import DESCRIPTIONS
from openbb_provider.metadata import QUERY_DESCRIPTIONS
class TreasuryRatesQueryParams(QueryParams):
@@ -25,11 +25,11 @@ class TreasuryRatesQueryParams(QueryParams):
"""
start_date: Optional[str] = Field(
default=None, description=DESCRIPTIONS["start_date"]
default=None, description=QUERY_DESCRIPTIONS["start_date"]
)
end_date: Optional[str] = Field(
default=datetime.today().strftime("%Y-%m-%d"),
description=DESCRIPTIONS["end_date"],
description=QUERY_DESCRIPTIONS["end_date"],
)