diff --git a/openbb_platform/extensions/econometrics/integration/test_econometrics_api.py b/openbb_platform/extensions/econometrics/integration/test_econometrics_api.py index 940c59bd622e..8e8ac4942584 100644 --- a/openbb_platform/extensions/econometrics/integration/test_econometrics_api.py +++ b/openbb_platform/extensions/econometrics/integration/test_econometrics_api.py @@ -1,270 +1,42 @@ -import base64 -import json -import random -from typing import Literal - import pytest -import requests -from openbb_core.env import Env -from openbb_provider.utils.helpers import get_querystring - -data: dict = {} - - -def get_headers(): - if "headers" in data: - return data["headers"] - - userpass = f"{Env().API_USERNAME}:{Env().API_PASSWORD}" - userpass_bytes = userpass.encode("ascii") - base64_bytes = base64.b64encode(userpass_bytes) - - data["headers"] = {"Authorization": f"Basic {base64_bytes.decode('ascii')}"} - return data["headers"] - - -def request_data(menu: str, symbol: str, provider: str): - """Randomly pick a symbol and a provider and get data from the selected menu.""" - url = f"http://0.0.0.0:8000/api/v1/{menu}/load?symbol={symbol}&provider={provider}" - result = requests.get(url, headers=get_headers(), timeout=10) - return result.json()["results"] - - -def get_stocks_data(): - if "stocks_data" in data: - return data["stocks_data"] - - symbol = random.choice(["AAPL", "NVDA", "MSFT", "TSLA", "AMZN", "V"]) # noqa: S311 - provider = random.choice(["fmp", "polygon", "yfinance"]) # noqa: S311 - - data["stocks_data"] = request_data("stocks", symbol=symbol, provider=provider) - return data["stocks_data"] - - -def get_crypto_data(): - if "crypto_data" in data: - return data["crypto_data"] - - # TODO : add more crypto providers and symbols - symbol = random.choice(["BTC"]) # noqa: S311 - provider = random.choice(["fmp"]) # noqa: S311 - - data["crypto_data"] = request_data( - menu="crypto", - symbol=symbol, - provider=provider, - ) - return data["crypto_data"] - - -def get_data(menu: Literal["stocks", "crypto"]): - funcs = {"stocks": get_stocks_data, "crypto": get_crypto_data} - return funcs[menu]() @pytest.mark.skip(reason="econometrics is a python only extensions so far") -@pytest.mark.parametrize( - "params, data_type", - [ - ({"data": ""}, "stocks"), - ({"data": ""}, "crypto"), - ], -) @pytest.mark.integration -def test_econometrics_corr(params, data_type): - params = {p: v for p, v in params.items() if v} - - body = json.dumps(get_data(data_type)) - - query_str = get_querystring(params, []) - url = f"http://0.0.0.0:8000/api/v1/econometrics/corr?{query_str}" - result = requests.post(url, headers=get_headers(), timeout=10, data=body) - assert isinstance(result, requests.Response) - assert result.status_code == 200 +def test_econometrics_corr(): + ... @pytest.mark.skip(reason="econometrics is a python only extensions so far") -@pytest.mark.parametrize( - "params, data_type", - [ - ( - {"data": "", "y_column": "close", "x_columns": ["high"]}, - "stocks", - ), - ( - {"data": "", "y_column": "close", "x_columns": ["high"]}, - "crypto", - ), - ], -) @pytest.mark.integration -def test_econometrics_ols_summary(params, data_type): - params = {p: v for p, v in params.items() if v} - - body = json.dumps( - { - "data": get_data(data_type), - "x_columns": params.pop("x_columns"), - } - ) - - query_str = get_querystring(params, []) - url = f"http://0.0.0.0:8000/api/v1/econometrics/ols_summary?{query_str}" - result = requests.post(url, headers=get_headers(), timeout=20, data=body) - assert isinstance(result, requests.Response) - assert result.status_code == 200 +def test_econometrics_ols_summary(): + ... @pytest.mark.skip(reason="econometrics is a python only extensions so far") -@pytest.mark.parametrize( - "params, data_type", - [ - ( - {"data": "", "y_column": "volume", "x_columns": ["close"]}, - "stocks", - ), - ( - {"data": "", "y_column": "volume", "x_columns": ["close"]}, - "crypto", - ), - ], -) @pytest.mark.integration -def test_econometrics_dwat(params, data_type): - params = {p: v for p, v in params.items() if v} - - body = json.dumps( - { - "data": get_data(data_type), - "x_columns": params.pop("x_columns"), - } - ) - - query_str = get_querystring(params, []) - url = f"http://0.0.0.0:8000/api/v1/econometrics/dwat?{query_str}" - result = requests.post(url, headers=get_headers(), timeout=10, data=body) - assert isinstance(result, requests.Response) - assert result.status_code == 200 +def test_econometrics_dwat(): + ... @pytest.mark.skip(reason="econometrics is a python only extensions so far") -@pytest.mark.parametrize( - "params, data_type", - [ - ( - { - "data": "", - "y_column": "volume", - "x_columns": ["close"], - "lags": "", - }, - "stocks", - ), - ( - { - "data": "", - "y_column": "volume", - "x_columns": ["close"], - "lags": "2", - }, - "crypto", - ), - ], -) @pytest.mark.integration -def test_econometrics_bgot(params, data_type): - params = {p: v for p, v in params.items() if v} - - body = json.dumps( - { - "data": get_data(data_type), - "x_columns": params.pop("x_columns"), - } - ) - - query_str = get_querystring(params, []) - url = f"http://0.0.0.0:8000/api/v1/econometrics/bgot?{query_str}" - result = requests.post(url, headers=get_headers(), timeout=10, data=body) - assert isinstance(result, requests.Response) - assert result.status_code == 200 +def test_econometrics_bgot(): + ... @pytest.mark.skip(reason="econometrics is a python only extensions so far") -@pytest.mark.parametrize( - "params, data_type", - [ - ( - { - "data": "", - "columns": ["close", "volume"], - }, - "stocks", - ), - ( - { - "data": "", - "columns": ["close", "volume"], - }, - "crypto", - ), - ], -) -@pytest.mark.integration -def test_econometrics_coint(params, data_type): - params = {p: v for p, v in params.items() if v} - - body = json.dumps( - { - "data": get_data(data_type), - "columns": params.pop("columns"), - } - ) - - query_str = get_querystring(params, []) - url = f"http://0.0.0.0:8000/api/v1/econometrics/coint?{query_str}" - result = requests.post(url, headers=get_headers(), timeout=10, data=body) - assert isinstance(result, requests.Response) - assert result.status_code == 200 +def test_econometrics_coint(): + ... @pytest.mark.skip(reason="econometrics is a python only extensions so far") -@pytest.mark.parametrize( - "params, data_type", - [ - ( - {"data": "", "y_column": "volume", "x_column": "close", "lag": ""}, - "stocks", - ), - ( - {"data": "", "y_column": "volume", "x_column": "close", "lag": "2"}, - "crypto", - ), - ], -) @pytest.mark.integration -def test_econometrics_granger(params, data_type): - params = {p: v for p, v in params.items() if v} - body = json.dumps(get_data(data_type)) - - query_str = get_querystring(params, []) - url = f"http://0.0.0.0:8000/api/v1/econometrics/granger?{query_str}" - result = requests.post(url, headers=get_headers(), timeout=10, data=body) - assert isinstance(result, requests.Response) - assert result.status_code == 200 +def test_econometrics_granger(): + ... @pytest.mark.skip(reason="econometrics is a python only extensions so far") -@pytest.mark.parametrize( - "params, data_type", - [({"data": "", "column": "high", "regression": "c"}, "stocks")], -) @pytest.mark.integration -def test_econometrics_unitroot(params, data_type): - params = {p: v for p, v in params.items() if v} - body = json.dumps(get_data(data_type)) - - query_str = get_querystring(params, []) - url = f"http://0.0.0.0:8000/api/v1/econometrics/unitroot?{query_str}" - result = requests.post(url, headers=get_headers(), timeout=10, data=body) - assert isinstance(result, requests.Response) - assert result.status_code == 200 +def test_econometrics_unitroot(): + ... diff --git a/openbb_platform/extensions/econometrics/integration/test_econometrics_python.py b/openbb_platform/extensions/econometrics/integration/test_econometrics_python.py index c0f310dc4d09..aef11f2a943d 100644 --- a/openbb_platform/extensions/econometrics/integration/test_econometrics_python.py +++ b/openbb_platform/extensions/econometrics/integration/test_econometrics_python.py @@ -66,12 +66,12 @@ def get_data(menu: Literal["equity", "crypto"]): ], ) @pytest.mark.integration -def test_econometrics_corr(params, data_type, obb): +def test_econometrics_correlation_matrix(params, data_type, obb): params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) - result = obb.econometrics.corr(**params) + result = obb.econometrics.correlation_matrix(**params) assert result assert isinstance(result, OBBject) assert len(result.results) > 0 @@ -91,12 +91,12 @@ def test_econometrics_corr(params, data_type, obb): ], ) @pytest.mark.integration -def test_econometrics_ols(params, data_type, obb): +def test_econometrics_ols_regression(params, data_type, obb): params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) - result = obb.econometrics.ols(**params) + result = obb.econometrics.ols_regression(**params) assert result assert isinstance(result, OBBject) assert len(result.results) > 0 @@ -116,11 +116,11 @@ def test_econometrics_ols(params, data_type, obb): ], ) @pytest.mark.integration -def test_econometrics_ols_summary(params, data_type, obb): +def test_econometrics_ols_regression_summary(params, data_type, obb): params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) - result = obb.econometrics.ols_summary(**params) + result = obb.econometrics.ols_regression_summary(**params) assert result assert isinstance(result, OBBject) assert len(result.results) > 0 @@ -140,12 +140,12 @@ def test_econometrics_ols_summary(params, data_type, obb): ], ) @pytest.mark.integration -def test_econometrics_dwat(params, data_type, obb): +def test_econometrics_autocorrelation(params, data_type, obb): params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) - result = obb.econometrics.dwat(**params) + result = obb.econometrics.autocorrelation(**params) assert result assert isinstance(result, OBBject) @@ -174,12 +174,12 @@ def test_econometrics_dwat(params, data_type, obb): ], ) @pytest.mark.integration -def test_econometrics_bgot(params, data_type, obb): +def test_econometrics_residual_autocorrelation(params, data_type, obb): params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) - result = obb.econometrics.bgot(**params) + result = obb.econometrics.residual_autocorrelation(**params) assert result assert isinstance(result, OBBject) @@ -204,12 +204,12 @@ def test_econometrics_bgot(params, data_type, obb): ], ) @pytest.mark.integration -def test_econometrics_coint(params, data_type, obb): +def test_econometrics_cointegration(params, data_type, obb): params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) - result = obb.econometrics.coint(**params) + result = obb.econometrics.cointegration(**params) assert result assert isinstance(result, OBBject) assert len(result.results) > 0 @@ -239,12 +239,12 @@ def test_econometrics_coint(params, data_type, obb): ], ) @pytest.mark.integration -def test_econometrics_granger(params, data_type, obb): +def test_econometrics_causality(params, data_type, obb): params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) - result = obb.econometrics.granger(**params) + result = obb.econometrics.causality(**params) assert result assert isinstance(result, OBBject) assert len(result.results) > 0 @@ -261,12 +261,12 @@ def test_econometrics_granger(params, data_type, obb): ], ) @pytest.mark.integration -def test_econometrics_unitroot(params, data_type, obb): +def test_econometrics_unit_root(params, data_type, obb): params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) - result = obb.econometrics.unitroot(**params) + result = obb.econometrics.unit_root(**params) assert result assert isinstance(result, OBBject) @@ -279,12 +279,12 @@ def test_econometrics_unitroot(params, data_type, obb): ], ) @pytest.mark.integration -def test_econometrics_panelre(params, obb): +def test_econometrics_panel_random_effects(params, obb): params = {p: v for p, v in params.items() if v} params["data"] = mock_multi_index_data() - result = obb.econometrics.panelre(**params) + result = obb.econometrics.panel_random_effects(**params) assert result assert isinstance(result, OBBject) assert len(result.results) > 0 @@ -298,12 +298,12 @@ def test_econometrics_panelre(params, obb): ], ) @pytest.mark.integration -def test_econometrics_panelbols(params, obb): +def test_econometrics_panel_between(params, obb): params = {p: v for p, v in params.items() if v} params["data"] = mock_multi_index_data() - result = obb.econometrics.panelbols(**params) + result = obb.econometrics.panel_between(**params) assert result assert isinstance(result, OBBject) assert len(result.results) > 0 @@ -317,12 +317,12 @@ def test_econometrics_panelbols(params, obb): ], ) @pytest.mark.integration -def test_econometrics_panelpols(params, obb): +def test_econometrics_panel_pooled(params, obb): params = {p: v for p, v in params.items() if v} params["data"] = mock_multi_index_data() - result = obb.econometrics.panelpols(**params) + result = obb.econometrics.panel_pooled(**params) assert result assert isinstance(result, OBBject) assert len(result.results) > 0 @@ -336,12 +336,12 @@ def test_econometrics_panelpols(params, obb): ], ) @pytest.mark.integration -def test_econometrics_panelols(params, obb): +def test_econometrics_panel_fixed(params, obb): params = {p: v for p, v in params.items() if v} params["data"] = mock_multi_index_data() - result = obb.econometrics.panelols(**params) + result = obb.econometrics.panel_fixed(**params) assert result assert isinstance(result, OBBject) assert len(result.results) > 0 @@ -355,12 +355,12 @@ def test_econometrics_panelols(params, obb): ], ) @pytest.mark.integration -def test_econometrics_panelfd(params, obb): +def test_econometrics_panel_first_difference(params, obb): params = {p: v for p, v in params.items() if v} params["data"] = mock_multi_index_data() - result = obb.econometrics.panelfd(**params) + result = obb.econometrics.panel_first_difference(**params) assert result assert isinstance(result, OBBject) assert len(result.results) > 0 @@ -374,12 +374,12 @@ def test_econometrics_panelfd(params, obb): ], ) @pytest.mark.integration -def test_econometrics_panelfmac(params, obb): +def test_econometrics_panel_fmac(params, obb): params = {p: v for p, v in params.items() if v} params["data"] = mock_multi_index_data() - result = obb.econometrics.panelfmac(**params) + result = obb.econometrics.panel_fmac(**params) assert result assert isinstance(result, OBBject) assert len(result.results) > 0 diff --git a/openbb_platform/extensions/econometrics/openbb_econometrics/econometrics_router.py b/openbb_platform/extensions/econometrics/openbb_econometrics/econometrics_router.py index 3111fe396be1..7fe83b73c155 100644 --- a/openbb_platform/extensions/econometrics/openbb_econometrics/econometrics_router.py +++ b/openbb_platform/extensions/econometrics/openbb_econometrics/econometrics_router.py @@ -1,10 +1,11 @@ +"""Econometrics Router.""" import re from itertools import combinations from typing import Dict, List, Literal import numpy as np import pandas as pd -import statsmodels.api as sm +import statsmodels.api as sm # type: ignore from linearmodels.panel import ( BetweenOLS, FamaMacBeth, @@ -18,9 +19,9 @@ from openbb_core.app.utils import basemodel_to_df, get_target_column, get_target_columns from openbb_provider.abstract.data import Data from pydantic import PositiveInt -from statsmodels.stats.diagnostic import acorr_breusch_godfrey -from statsmodels.stats.stattools import durbin_watson -from statsmodels.tsa.stattools import adfuller, grangercausalitytests +from statsmodels.stats.diagnostic import acorr_breusch_godfrey # type: ignore +from statsmodels.stats.stattools import durbin_watson # type: ignore +from statsmodels.tsa.stattools import adfuller, grangercausalitytests # type: ignore from openbb_econometrics.utils import get_engle_granger_two_step_cointegration_test @@ -28,8 +29,8 @@ @router.command(methods=["POST"]) -def corr(data: List[Data]) -> OBBject[List[Data]]: - """Get the corrlelation matrix of an input dataset. +def correlation_matrix(data: List[Data]) -> OBBject[List[Data]]: + """Get the correlation matrix of an input dataset. Parameters ---------- @@ -58,7 +59,7 @@ def corr(data: List[Data]) -> OBBject[List[Data]]: @router.command(methods=["POST"], include_in_schema=False) -def ols( +def ols_regression( data: List[Data], y_column: str, x_columns: List[str], @@ -87,12 +88,12 @@ def ols( @router.command(methods=["POST"]) -def ols_summary( +def ols_regression_summary( data: List[Data], y_column: str, x_columns: List[str], ) -> OBBject[Data]: - """Perform OLS regression. This returns the summary object from statsmodels. + """Perform OLS regression. This returns the summary object from statsmodels. Parameters ---------- @@ -152,7 +153,7 @@ def ols_summary( @router.command(methods=["POST"]) -def dwat( +def autocorrelation( data: List[Data], y_column: str, x_columns: List[str], @@ -180,7 +181,7 @@ def dwat( @router.command(methods=["POST"]) -def bgot( +def residual_autocorrelation( data: List[Data], y_column: str, x_columns: List[str], @@ -221,7 +222,7 @@ def bgot( @router.command(methods=["POST"]) -def coint( +def cointegration( data: List[Data], columns: List[str], ) -> OBBject[Data]: @@ -249,7 +250,7 @@ def coint( c, gamma, alpha, - z, + _, # z adfstat, pvalue, ) = get_engle_granger_two_step_cointegration_test(dataset[x], dataset[y]) @@ -265,7 +266,7 @@ def coint( @router.command(methods=["POST"]) -def granger( +def causality( data: List[Data], y_column: str, x_column: str, @@ -308,7 +309,7 @@ def granger( @router.command(methods=["POST"]) -def unitroot( +def unit_root( data: List[Data], column: str, regression: Literal["c", "ct", "ctt"] = "c", @@ -343,7 +344,7 @@ def unitroot( @router.command(methods=["POST"], include_in_schema=False) -def panelre( +def panel_random_effects( data: List[Data], y_column: str, x_columns: List[str], @@ -372,7 +373,7 @@ def panelre( @router.command(methods=["POST"], include_in_schema=False) -def panelbols( +def panel_between( data: List[Data], y_column: str, x_columns: List[str], @@ -401,12 +402,12 @@ def panelbols( @router.command(methods=["POST"], include_in_schema=False) -def panelpols( +def panel_pooled( data: List[Data], y_column: str, x_columns: List[str], ) -> OBBject[Dict]: - """Perform a Pooled coefficvient estimator regression on panel data. + """Perform a Pooled coefficient estimator regression on panel data. Parameters ---------- @@ -430,7 +431,7 @@ def panelpols( @router.command(methods=["POST"], include_in_schema=False) -def panelols( +def panel_fixed( data: List[Data], y_column: str, x_columns: List[str], @@ -459,7 +460,7 @@ def panelols( @router.command(methods=["POST"], include_in_schema=False) -def panelfd( +def panel_first_difference( data: List[Data], y_column: str, x_columns: List[str], @@ -488,7 +489,7 @@ def panelfd( @router.command(methods=["POST"], include_in_schema=False) -def panelfmac( +def panel_fmac( data: List[Data], y_column: str, x_columns: List[str],