Improve user experience on disc/ratings command

This commit is contained in:
didier
2021-04-17 01:13:35 +01:00
parent c3a598ddde
commit 1daa6f8efb
2 changed files with 82 additions and 20 deletions

View File

@@ -89,7 +89,7 @@ class DiscoveryController:
print(" valuation valuation of sectors, industry, country [Finviz]")
print(" performance performance of sectors, industry, country [Finviz]")
print(" spectrum spectrum of sectors, industry, country [Finviz]")
print(" ratings latest ratings [MarketBeat]")
print(" ratings top ratings updates [MarketBeat]")
print("")
def switch(self, an_input: str):

View File

@@ -2,6 +2,8 @@
__docformat__ = "numpy"
import argparse
import numpy as np
import pandas as pd
from typing import List
from gamestonk_terminal.helper_funcs import (
check_positive,
@@ -17,38 +19,98 @@ def ratings_view(other_args: List[str]):
Parameters
----------
other_args : List[str]
argparse other args - ["-n", "5"]
argparse other args - ["-t", "100"]
"""
parser = argparse.ArgumentParser(
add_help=False,
prog="ratings",
description="""Latest ratings. [Source: MarketBeat]""",
)
parser.add_argument(
"-n",
"--num",
"-t",
"--threshold",
action="store",
dest="n_num",
dest="n_threshold",
type=check_positive,
default=10,
help="number of ratings to print",
default=100,
help="threshold to show latest ratings that show a drastic increase",
)
if other_args:
if "-" not in other_args[0]:
other_args.insert(0, "-t")
ns_parser = parse_known_args_and_warn(parser, other_args)
if not ns_parser:
return
ratings = marketbeat_model.get_ratings()
for idx, rating in enumerate(ratings):
print(
rating["ticker"],
rating["action"].replace(" by", ""),
rating["impact"],
rating["current_price"],
"->",
rating["target_price"],
try:
ratings = marketbeat_model.get_ratings()
df_ratings = pd.DataFrame(ratings)
df_ratings = df_ratings[df_ratings["target_price"] != ""]
df_ratings["old_target"] = df_ratings["target_price"].apply(
lambda x: x.split(" ➝ ")[0] if "➝" in x else ""
)
if idx >= ns_parser.n_num - 1:
break
df_ratings["new_target"] = df_ratings["target_price"].apply(
lambda x: x.split(" ➝ ")[1] if "➝" in x else x
)
df_ratings["clean_current_price"] = df_ratings["current_price"].apply(
lambda x: "".join([c if c.isdigit() or c == "." else "" for c in str(x)])
)
df_ratings["clean_current_price"] = df_ratings["clean_current_price"].astype(
float
)
df_ratings["clean_target_price"] = df_ratings["new_target"].apply(
lambda x: "".join([c if c.isdigit() or c == "." else "" for c in str(x)])
)
df_ratings["clean_target_price"] = df_ratings["clean_target_price"].astype(
float
)
df_ratings["pct_increase"] = (
100
* (df_ratings["clean_target_price"] - df_ratings["clean_current_price"])
/ df_ratings["clean_current_price"]
)
df_ratings["pct_increase"] = df_ratings["pct_increase"].round(2)
df_ratings["pct_abs"] = np.abs(df_ratings["pct_increase"])
df_ratings["pct_abs"] = df_ratings["pct_abs"].round(2)
df_ratings = df_ratings.sort_values("pct_abs", ascending=False)
df_ratings_top = df_ratings[df_ratings["pct_abs"] > ns_parser.n_threshold][
[
"ticker",
"brokerage",
"rating",
"current_price",
"old_target",
"new_target",
"pct_increase",
]
]
df_ratings_top["pct_increase"] = df_ratings_top["pct_increase"].apply(
lambda x: str(x) + " %"
)
print(
df_ratings_top.rename(
columns={
"ticker": "Ticker",
"brokerage": "Brokerage",
"rating": "Rating",
"current_price": "Current Price",
"old_target": "Old Target",
"new_target": "New Target",
"pct_increase": "Percentage Increase",
}
).to_string(index=False)
)
print("")
except Exception as e:
print(e, "\n")