diff options
24 files changed, 124791 insertions, 324 deletions
diff --git a/openbb_platform/core/openbb_core/provider/standard_models/composite_leading_indicator.py b/openbb_platform/core/openbb_core/provider/standard_models/composite_leading_indicator.py new file mode 100644 index 00000000000..395e6ae3751 --- /dev/null +++ b/openbb_platform/core/openbb_core/provider/standard_models/composite_leading_indicator.py @@ -0,0 +1,37 @@ +"""Composite Leading Indicator Standard Model.""" + +from datetime import date as dateType +from typing import Optional + +from pydantic import Field + +from openbb_core.provider.abstract.data import Data +from openbb_core.provider.abstract.query_params import QueryParams +from openbb_core.provider.utils.descriptions import ( + DATA_DESCRIPTIONS, + QUERY_DESCRIPTIONS, +) + + +class CLIQueryParams(QueryParams): + """Composite Leading Indicator Query.""" + + 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 CLIData(Data): + """Composite Leading Indicator Data.""" + + date: Optional[dateType] = Field( + default=None, description=DATA_DESCRIPTIONS.get("date") + ) + value: Optional[float] = Field(default=None, description="CLI value") + country: Optional[str] = Field( + default=None, + description="Country for which CLI is given", + ) diff --git a/openbb_platform/core/openbb_core/provider/standard_models/long_term_interest_rate.py b/openbb_platform/core/openbb_core/provider/standard_models/long_term_interest_rate.py new file mode 100644 index 00000000000..713991e64e3 --- /dev/null +++ b/openbb_platform/core/openbb_core/provider/standard_models/long_term_interest_rate.py @@ -0,0 +1,40 @@ +"""Long Term Interest Rates Standard Model.""" + +from datetime import date as dateType +from typing import Optional + +from pydantic import Field + +from openbb_core.provider.abstract.data import Data +from openbb_core.provider.abstract.query_params import QueryParams +from openbb_core.provider.utils.descriptions import ( + DATA_DESCRIPTIONS, + QUERY_DESCRIPTIONS, +) + + +class LTIRQueryParams(QueryParams): + """Long Term Interest Rates Query.""" + + 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 LTIRData(Data): + """Long Term Interest Rates Data.""" + + date: Optional[dateType] = Field( + default=None, description=DATA_DESCRIPTIONS.get("date") + ) + value: Optional[float] = Field( + default=None, + description="Interest rate (given as a whole number, i.e 10=10%)", + ) + country: Optional[str] = Field( + default=None, + description="Country for which interest rate is given", + ) diff --git a/openbb_platform/core/openbb_core/provider/standard_models/short_term_interest_rate.py b/openbb_platform/core/openbb_core/provider/standard_models/short_term_interest_rate.py new file mode 100644 index 00000000000..87bfd6c5b1e --- /dev/null +++ b/openbb_platform/core/openbb_core/provider/standard_models/short_term_interest_rate.py @@ -0,0 +1,40 @@ +"""Short Term Interest Rates Standard Model.""" + +from datetime import date as dateType +from typing import Optional + +from pydantic import Field + +from openbb_core.provider.abstract.data import Data +from openbb_core.provider.abstract.query_params import QueryParams +from openbb_core.provider.utils.descriptions import ( + DATA_DESCRIPTIONS, + QUERY_DESCRIPTIONS, +) + + +class STIRQueryParams(QueryParams): + """Short Term Interest Rates Query.""" + + 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 STIRData(Data): + """Short Term Interest Rates Data.""" + + date: Optional[dateType] = Field( + default=None, description=DATA_DESCRIPTIONS.get("date") + ) + value: Optional[float] = Field( + default=None, + description="Interest rate (given as a whole number, i.e 10=10%)", + ) + country: Optional[str] = Field( + default=None, + description="Country for which interest rate is given", + ) diff --git a/openbb_platform/core/openbb_core/provider/standard_models/unemployment.py b/openbb_platform/core/openbb_core/provider/standard_models/unemployment.py new file mode 100644 index 00000000000..2091aff51c4 --- /dev/null +++ b/openbb_platform/core/openbb_core/provider/standard_models/unemployment.py @@ -0,0 +1,40 @@ +"""Unemployment Standard Model.""" + +from datetime import date as dateType +from typing import Optional + +from pydantic import Field + +from openbb_core.provider.abstract.data import Data +from openbb_core.provider.abstract.query_params import QueryParams +from openbb_core.provider.utils.descriptions import ( + DATA_DESCRIPTIONS, + QUERY_DESCRIPTIONS, +) + + +class UnemploymentQueryParams(QueryParams): + """Unemployment Query.""" + + 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 UnemploymentData(Data): + """Unemployment Data.""" + + date: Optional[dateType] = Field( + default=None, description=DATA_DESCRIPTIONS.get("date") + ) + value: Optional[float] = Field( + default=None, + description="Unemployment rate (given as a whole number, i.e 10=10%)", + ) + country: Optional[str] = Field( + default=None, + description="Country for which unemployment rate is given", + ) diff --git a/openbb_platform/extensions/economy/integration/test_economy_api.py b/openbb_platform/extensions/economy/integration/test_economy_api.py index b11ff434b87..0ba2eb5ca7b 100644 --- a/openbb_platform/extensions/economy/integration/test_economy_api.py +++ b/openbb_platform/extensions/economy/integration/test_economy_api.py @@ -372,3 +372,109 @@ def test_economy_money_measures(params, headers): result = requests.get(url, headers=headers, timeout=10) assert isinstance(result, requests.Response) assert result.status_code == 200 + + +@parametrize( + "params", + [ + ({"start_date": "2023-01-01", "end_date": "2023-06-06"}), + ( + { + "country": "united_states", + "sex": "total", + "frequency": "monthly", + "age": "total", + "seasonal_adjustment": True, + "provider": "oecd", + "start_date": "2023-01-01", + "end_date": "2023-06-06", + } + ), + ], +) +@pytest.mark.integration +def test_economy_unemployment(params, headers): + params = {p: v for p, v in params.items() if v} + + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/economy/unemployment?{query_str}" + result = requests.get(url, headers=headers, timeout=10) + assert isinstance(result, requests.Response) + assert result.status_code == 200 + + +@parametrize( + "params", + [ + ({"start_date": "2023-01-01", "end_date": "2023-06-06"}), + ( + { + "country": "united_states", + "provider": "oecd", + "start_date": "2023-01-01", + "end_date": "2023-06-06", + } + ), + ], +) +@pytest.mark.integration +def test_economy_composite_leading_indicator(params, headers): + params = {p: v for p, v in params.items() if v} + + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/economy/composite_leading_indicator?{query_str}" + result = requests.get(url, headers=headers, timeout=10) + assert isinstance(result, requests.Response) + assert result.status_code == 200 + + +@parametrize( + "params", + [ + ({"start_date": "2023-01-01", "end_date": "2023-06-06"}), + ( + { + "country": "united_states", + "frequency": "monthly", + "provider": "oecd", + "start_date": "2023-01-01", + "end_date": "2023-06-06", + } + ), + ], +) +@pytest.mark.integration +def test_economy_short_term_interest_rate(params, headers): + params = {p: v for p, v in params.items() if v} + + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/economy/short_term_interest_rate?{query_str}" + result = requests.get(url, headers=headers, timeout=10) + assert isinstance(result, requests.Response) + assert result.status_code == 200 + + +@parametrize( + "params", + [ + ({"start_date": "2023-01-01", "end_date": "2023-06-06"}), + ( + { + "country": "united_states", + "frequency": "monthly", + "provider": "oecd", + "start_date": "2023-01-01", + "end_date": "2023-06-06", + } + ), + ], +) +@pytest.mark.integration +def test_economy_long_term_interest_rate(params, headers): + params = {p: v for p, v in params.items() if v} + + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/economy/long_term_interest_rate?{query_str}" + result = requests.get(url, headers=headers, timeout=10) + assert isinstance(result, requests.Response) + assert result.status_code == 200 diff --git a/openbb_platform/extensions/economy/integration/test_economy_python.py b/openbb_platform/extensions/economy/integration/test_economy_python.py index 01fcd4421ca..d7e5dbf64fd 100644 --- a/openbb_platform/extensions/economy/integration/test_economy_python.py +++ b/openbb_platform/extensions/economy/integration/test_economy_python.py @@ -328,3 +328,105 @@ def test_economy_money_measures(params, obb): assert result assert isinstance(result, OBBject) assert len(result.results) > 0 + + +@parametrize( + "params", + [ + ({"start_date": "2023-01-01", "end_date": "2023-06-06"}), + ( + { + "country": "united_states", + "sex": "total", + "frequency": "monthly", + "age": "total", + "seasonal_adjustment": True, + "provider": "oecd", + "start_date": "2023-01-01", + "end_date": "2023-06-06", + } + ), + ], +) +@pytest.mark.integration +def test_economy_unemployment(params, obb): + params = {p: v for p, v in params.items() if v} + + result = obb.economy.unemployment(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 + + +@parametrize( + "params", + [ + ({"start_date": "2023-01-01", "end_date": "2023-06-06"}), + ( + { + "country": "united_states", + "provider": "oecd", + "start_date": "2023-01-01", + "end_date": "2023-06-06", + } + ), + ], +) +@pytest.mark.integration +def test_economy_composite_leading_indicator(params, obb): + params = {p: v for p, v in params.items() if v} + + result = obb.economy.composite_leading_indicator(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 + + +@parametrize( + "params", + [ + ({"start_date": "2023-01-01", "end_date": "2023-06-06"}), + ( + { + "country": "united_states", + "frequency": "monthly", + "provider": "oecd", + "start_date": "2023-01-01", + "end_date": "2023-06-06", + } + ), + ], +) +@pytest.mark.integration +def test_economy_short_term_interest_rate(params, obb): + params = {p: v for p, v in params.items() if v} + + result = obb.economy.short_term_interest_rate(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 + + +@parametrize( + "params", + [ + ({"start_date": "2023-01-01", "end_date": "2023-06-06"}), + ( + { + "country": "united_states", + "frequency": "monthly", + "provider": "oecd", + "start_date": "2023-01-01", + "end_date": "2023-06-06", + } + ), + ], +) +@pytest.mark.integration +def test_economy_long_term_interest_rate(params, obb): + params = {p: v for p, v in params.items() if v} + + result = obb.economy.long_term_interest_rate(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 diff --git a/openbb_platform/extensions/economy/openbb_economy/economy_router.py b/openbb_platform/extensions/economy/openbb_economy/economy_router.py index 12573883727..a97bc2adfbc 100644 --- a/openbb_platform/extensions/economy/openbb_economy/economy_router.py +++ b/openbb_platform/extensions/economy/openbb_economy/economy_router.py @@ -96,5 +96,67 @@ async def money_measures( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject[BaseModel]: - """Money Measures.""" + """Money Measures (M1/M2 and components).""" + return await OBBject.from_query(Query(**locals())) + + +@router.command(model="Unemployment") +async def unemployment( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, +) -> OBBject[BaseModel]: + """Global unemployment data.""" + return await OBBject.from_query(Query(**locals())) + + +@router.command(model="CLI") +async def composite_leading_indicator( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, +) -> OBBject[BaseModel]: + """The composite leading indicator (CLI) is designed to provide early signals of turning points + in business cycles showing fluctuation of the economic activity around its long term potential level. + CLIs show short-term economic movements in qualitative rather than quantitative terms. + """ + return await OBBject.from_query(Query(**locals())) + + +@router.command(model="STIR") +async def short_term_interest_rate( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, +) -> OBBject[BaseModel]: + """ + Short-term interest rates are the rates at which short-term borrowings are effected between + financial institutions or the rate at which short-term government paper is issued or traded in the market. + Short-term interest rates are generally averages of daily rates, measured as a percentage. + Short-term interest rates are based on three-month money market rates where available. + Typical standardised names are "money market rate" and "treasury bill rate". + """ + return await OBBject.from_query(Query(**locals())) + + +@router.command(model="STIR") +async def long_term_interest_rate( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, +) -> OBBject[BaseModel]: + """ + Long-term interest rates refer to government bonds maturing in ten years. + Rates are mainly determined by the price charged by the lender, the risk from the borrower and the + fall in the capital value. Long-term interest rates are generally averages of daily rates, + measured as a percentage. These interest rates are implied by the prices at which the government bonds are + traded on financial markets, not the interest rates at which the loans were issued. + In all cases, they refer to bonds whose capital repayment is guaranteed by governments. + Long-term interest rates are one of the determinants of business investment. + Low long-term interest rates encourage investment in new equipment and high interest rates discourage it. + Investment is, in turn, a major source of economic growth.""" return await OBBject.from_query(Query(**locals())) diff --git a/openbb_platform/openbb/package/economy.py b/openbb_platform/openbb/package/economy.py index de1285f8335..2317d0ab163 100644 --- a/openbb_platform/openbb/package/economy.py +++ b/openbb_platform/openbb/package/economy.py @@ -20,6 +20,7 @@ class ROUTER_economy(Container): /gdp money_measures risk_premium + unemployment """ def __repr__(self) -> str: @@ -571,7 +572,7 @@ class ROUTER_economy(Container): provider: Optional[Literal["federal_reserve"]] = None, **kwargs ) -> OBBject: - """Money Measures. + """Money Measures (M1/M2 and components. Parameters ---------- @@ -694,3 +695,87 @@ class ROUTER_economy(Container): extra_params=kwargs, ) ) + + @validate + def unemployment( + self, + start_date: Annotated[ + Union[datetime.date, None, str], + OpenBBCustomParameter( + description="Start date of the data, in YYYY-MM-DD format." + ), + ] = None, + end_date: Annotated[ + Union[datetime.date, None, str], + OpenBBCustomParameter( + description="End date of the data, in YYYY-MM-DD format." + ), + ] = None, + provider: Optional[Literal["oecd"]] = None, + **kwargs + ) -> OBBject: + """Global unemployment data. + + Parameters + ---------- + start_date : Optional[datetime.date] + Start date of the data, in YYYY-MM-DD format. + end_date : Optional[datetime.date] + End date of the data, in YYYY-MM-DD format. + provider : Optional[Literal['oecd']] + The provider to use for the query, by default None. + If None, the provider specified in defaults is selected or 'oecd' if there is + no default. + country : Literal['colombia', 'new_zealand', 'united_kingdom', 'italy', 'luxembourg', 'euro_area19', 'sweden', 'oecd', 'south_africa', 'denmark', 'canada', 'switzerland', 'slovakia', 'hungary', 'portugal', 'spain', 'france', 'czech_republic', 'costa_rica', 'japan', 'slovenia', 'russia', 'austria', 'latvia', 'netherlands', 'israel', 'iceland', 'united_states', 'ireland', 'mexico', 'germany', 'greece', 'turkey', 'australia', 'poland', 'south_korea', 'chile', 'finland', 'european_union27_2020', 'norway', 'lithuania', 'euro_area20', 'estonia', 'belgium', 'brazil', 'indonesia', 'all'] + Country to get GDP for. (provider: oecd) + sex : Literal['total', 'male', 'female'] + Sex to get unemployment for. (provider: oecd) + frequency : Literal['monthly', 'quarterly', 'annual'] + Frequency to get unemployment for. (provider: oecd) + age : Literal['total', '15-24', '15-64', '25-54', '55-64'] + Age group to get unemployment for. Total indicates 15 years or over (provider: oecd) + seasonal_adjustment : bool + Whether to get seasonally adjusted unemployment. Defaults to False. (provider: oecd) + + Returns + ------- + OBBject + results : List[Unemployment] + Serializable results. + provider : Optional[Literal['oecd']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra: Dict[str, Any] + Extra info. + + Unemployment + ------------ + date : Optional[date] + The date of the data. + value : Optional[float] + Unemployment rate (given as a whole number, i.e 10=10%) + country : Optional[str] + Country for which unemployment rate is given + + Example + ------- + >>> from openbb import obb + >>> obb.economy.unemployment() + """ # noqa: E501 + + return self._run( + "/economy/unemployment", + **filter_inputs( + provider_choices={ + "provider": provider, + }, + standard_params={ + "start_date": start_date, + "end_date": end_date, + }, + extra_params=kwargs, + ) + |