summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Maslek <jmaslek11@gmail.com>2024-01-30 19:34:09 -0500
committerGitHub <noreply@github.com>2024-01-31 00:34:09 +0000
commitbbf5da0e58a15037b1756fe97a73993513afeffb (patch)
tree78505156f69bd38fa25e4e11d3d7424ee1f8b9a3
parent7a07970fc8bd4b03ea459cb0d892005ff5130ffe (diff)
Add OECD unemployment (+more) + data cache idea (#5917)
* Add OECD unemployment + data cache idea * Docstring edits * Tests * Add composite leading indicator * i truested ruff --fix too much * Add short + long term interest rates * pylint * pylint2 * was not committing. my b * add csv cache + make it default. remove pyarrow from poetry * Clean up * Didnt run on this file. My bad * Why was this ignored /shrug * pylint --------- Co-authored-by: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com>
-rw-r--r--openbb_platform/core/openbb_core/provider/standard_models/composite_leading_indicator.py37
-rw-r--r--openbb_platform/core/openbb_core/provider/standard_models/long_term_interest_rate.py40
-rw-r--r--openbb_platform/core/openbb_core/provider/standard_models/short_term_interest_rate.py40
-rw-r--r--openbb_platform/core/openbb_core/provider/standard_models/unemployment.py40
-rw-r--r--openbb_platform/extensions/economy/integration/test_economy_api.py106
-rw-r--r--openbb_platform/extensions/economy/integration/test_economy_python.py102
-rw-r--r--openbb_platform/extensions/economy/openbb_economy/economy_router.py64
-rw-r--r--openbb_platform/openbb/package/economy.py87
-rw-r--r--openbb_platform/providers/oecd/openbb_oecd/__init__.py10
-rw-r--r--openbb_platform/providers/oecd/openbb_oecd/models/composite_leading_indicator.py130
-rw-r--r--openbb_platform/providers/oecd/openbb_oecd/models/long_term_interest_rate.py163
-rw-r--r--openbb_platform/providers/oecd/openbb_oecd/models/short_term_interest_rate.py163
-rw-r--r--openbb_platform/providers/oecd/openbb_oecd/models/unemployment.py182
-rw-r--r--openbb_platform/providers/oecd/openbb_oecd/utils/helpers.py187
-rw-r--r--openbb_platform/providers/oecd/poetry.lock45
-rw-r--r--openbb_platform/providers/oecd/pyproject.toml1
-rw-r--r--openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecd_forecast_gdp_fetcher.yaml113
-rw-r--r--openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecd_nominal_gdp_fetcher.yaml99
-rw-r--r--openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecd_real_gdp_fetcher.yaml356
-rw-r--r--openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecd_unemployment_fetcher.yaml100203
-rw-r--r--openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecdcli_fetcher.yaml5594
-rw-r--r--openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecdltir_fetcher.yaml8775
-rw-r--r--openbb_platform/providers/oecd/tests/record/http/test_oecd_fetchers/test_oecdstir_fetcher.yaml8526
-rw-r--r--openbb_platform/providers/oecd/tests/test_oecd_fetchers.py52
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,