Files
OpenBB/openbb_terminal/portfolio/portfolio_optimization/optimizer_helper.py
2023-02-09 20:19:30 -05:00

93 lines
2.1 KiB
Python

"""Optimization helpers"""
__docformat__ = "numpy"
from typing import Any, Optional
import pandas as pd
from openbb_terminal.portfolio.portfolio_optimization.statics import (
OPTIMIZATION_PARAMETERS,
RISK_CHOICES,
TERMINAL_TEMPLATE_MAP,
)
from openbb_terminal.rich_config import console
def dict_to_df(d: dict) -> pd.DataFrame:
"""Convert a dictionary to a DataFrame
Parameters
----------
d : dict
Dictionary to convert
Returns
-------
pd.DataFrame
DataFrame with dictionary
"""
if not d:
return pd.DataFrame()
df = pd.DataFrame.from_dict(data=d, orient="index", columns=["value"])
return df
def validate_risk_measure(risk_measure: str, warning: bool = True) -> str:
"""Check that the risk measure selected is valid
Parameters
----------
risk_measure : str
Risk measure to check
Returns
-------
str
Validated risk measure
"""
if risk_measure.lower() in RISK_CHOICES:
return RISK_CHOICES[risk_measure.lower()]
if warning:
console.print("[yellow]Risk measure not found. Using 'MV'.[/yellow]")
return "MV"
def get_kwarg(key: str, kwargs: dict, default: Optional[Any] = None) -> Any:
"""Get a key from kwargs
If key is in kwargs, returns it.
Otherwise, if default provided, returns it.
Otherwise, if key is in OPTIMIZATION_PARAMETERS, returns it.
Parameters
----------
key : str
The key to be searched
kwargs : dict
The kwargs to be searched
default : Any
The default value to be returned if the key is not found
Returns
-------
Any
The value of the key if it exists, else None
"""
if key in kwargs:
return kwargs[key]
if default:
return default
# TODO: Remove this line when mapping between template and terminal is not needed
template_key = TERMINAL_TEMPLATE_MAP.get(key, key)
PARAMETER = OPTIMIZATION_PARAMETERS.get(template_key)
if PARAMETER is None:
return default
return PARAMETER.default