Skip to content

Commit

Permalink
#2684 [CT] Improve stocks/sia error handling, abstract duplicate code (
Browse files Browse the repository at this point in the history
…#2723)

Co-authored-by: Colin Delahunty <72827203+colin99d@users.noreply.github.com>
  • Loading branch information
catalintoma and colin99d committed Oct 7, 2022
1 parent ed449ab commit 002bcb9
Show file tree
Hide file tree
Showing 2 changed files with 184 additions and 127 deletions.
170 changes: 70 additions & 100 deletions openbb_terminal/stocks/sector_industry_analysis/sia_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,55 +182,6 @@ def __init__(
self.tickers: List = list()
self.currency: str = ""

if ticker:
data = yf.utils.get_json(f"https://finance.yahoo.com/quote/{ticker}")

if "summaryProfile" in data:
self.country = data["summaryProfile"]["country"]
if self.country not in financedatabase_model.get_countries():
similar_cmd = difflib.get_close_matches(
self.country,
financedatabase_model.get_countries(),
n=1,
cutoff=0.7,
)
if similar_cmd:
self.country = similar_cmd[0]
self.sector = data["summaryProfile"]["sector"]
if self.sector not in financedatabase_model.get_sectors():
similar_cmd = difflib.get_close_matches(
self.sector,
financedatabase_model.get_sectors(),
n=1,
cutoff=0.7,
)
if similar_cmd:
self.sector = similar_cmd[0]
self.industry = data["summaryProfile"]["industry"]
if self.industry not in financedatabase_model.get_industries():
similar_cmd = difflib.get_close_matches(
self.industry,
financedatabase_model.get_industries(),
n=1,
cutoff=0.7,
)
if similar_cmd:
self.industry = similar_cmd[0]
if "price" in data:
mktcap = data["price"]["marketCap"]
if mktcap < 50_000_000:
self.mktcap = "Nano"
elif mktcap < 300_000_000:
self.mktcap = "Micro"
elif mktcap < 2_000_000_000:
self.mktcap = "Small"
elif mktcap > 200_000_000_000:
self.mktcap = "Mega"
elif mktcap > 10_000_000_000:
self.mktcap = "Large"
else:
self.mktcap = "Mid"

if session and obbff.USE_PROMPT_TOOLKIT:
choices: dict = {c: {} for c in self.controller_choices}
choices["mktcap"] = {c: None for c in self.mktcap_choices}
Expand All @@ -243,7 +194,7 @@ def __init__(
self.choices = choices
self.completer = NestedCompleter.from_nested_dict(choices)

self.update_runtime_choices()
self.__load()

def update_runtime_choices(self):
"""Update runtime choices"""
Expand Down Expand Up @@ -345,61 +296,80 @@ def call_load(self, other_args: List[str]):
else:
self.ticker = ns_parser.ticker.upper()

data = yf.utils.get_json(
f"https://finance.yahoo.com/quote/{self.ticker}"
self.__load()

def __load(self):
if self.ticker:
data = yf.utils.get_json(f"https://finance.yahoo.com/quote/{self.ticker}")

if "summaryProfile" not in data or data["summaryProfile"] is None:
raise Exception(
f"Failed to load {self.ticker} Summary Profile from Yahoo Finance"
)

if "summaryProfile" in data:
self.country = data["summaryProfile"]["country"]
if self.country not in financedatabase_model.get_countries():
similar_cmd = difflib.get_close_matches(
self.country,
financedatabase_model.get_countries(),
n=1,
cutoff=0.7,
)
if similar_cmd:
self.country = similar_cmd[0]
if not data["summaryProfile"]["country"]:
raise Exception(
f"Failed to load {self.ticker} Country from Yahoo Finance"
)

self.sector = data["summaryProfile"]["sector"]
if self.sector not in financedatabase_model.get_sectors():
similar_cmd = difflib.get_close_matches(
self.sector,
financedatabase_model.get_sectors(),
n=1,
cutoff=0.7,
)
if similar_cmd:
self.sector = similar_cmd[0]
if not data["summaryProfile"]["sector"]:
raise Exception(
f"Failed to load {self.ticker} Sector from Yahoo Finance"
)

self.industry = data["summaryProfile"]["industry"]
if self.industry not in financedatabase_model.get_industries():
similar_cmd = difflib.get_close_matches(
self.industry,
financedatabase_model.get_industries(),
n=1,
cutoff=0.7,
)
if similar_cmd:
self.industry = similar_cmd[0]

if "price" in data:
mktcap = data["price"]["marketCap"]
if mktcap < 50_000_000:
self.mktcap = "Nano"
elif mktcap < 300_000_000:
self.mktcap = "Micro"
elif mktcap < 2_000_000_000:
self.mktcap = "Small"
elif mktcap > 200_000_000_000:
self.mktcap = "Mega"
elif mktcap > 10_000_000_000:
self.mktcap = "Large"
else:
self.mktcap = "Mid"
if not data["summaryProfile"]["industry"]:
raise Exception(
f"Failed to load {self.ticker} Industry from Yahoo Finance"
)

self.stocks_data = {}
self.update_runtime_choices()
self.country = data["summaryProfile"]["country"]
if self.country not in financedatabase_model.get_countries():
similar_cmd = difflib.get_close_matches(
self.country,
financedatabase_model.get_countries(),
n=1,
cutoff=0.7,
)
if similar_cmd:
self.country = similar_cmd[0]
self.sector = data["summaryProfile"]["sector"]
if self.sector not in financedatabase_model.get_sectors():
similar_cmd = difflib.get_close_matches(
self.sector,
financedatabase_model.get_sectors(),
n=1,
cutoff=0.7,
)
if similar_cmd:
self.sector = similar_cmd[0]
self.industry = data["summaryProfile"]["industry"]
if self.industry not in financedatabase_model.get_industries():
similar_cmd = difflib.get_close_matches(
self.industry,
financedatabase_model.get_industries(),
n=1,
cutoff=0.7,
)
if similar_cmd:
self.industry = similar_cmd[0]

if "price" in data:
mktcap = data["price"]["marketCap"]
if mktcap < 50_000_000:
self.mktcap = "Nano"
elif mktcap < 300_000_000:
self.mktcap = "Micro"
elif mktcap < 2_000_000_000:
self.mktcap = "Small"
elif mktcap > 200_000_000_000:
self.mktcap = "Mega"
elif mktcap > 10_000_000_000:
self.mktcap = "Large"
else:
self.mktcap = "Mid"

self.stocks_data = {}
self.update_runtime_choices()

@log_start_end(log=logger)
def call_industry(self, other_args: List[str]):
Expand Down

0 comments on commit 002bcb9

Please sign in to comment.