mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-10-29 21:42:22 +00:00
141 lines
4.3 KiB
Python
141 lines
4.3 KiB
Python
"""FinBrain View Module"""
|
|
__docformat__ = "numpy"
|
|
|
|
import logging
|
|
import os
|
|
from typing import Optional, Union
|
|
|
|
import numpy as np
|
|
import pandas as pd
|
|
|
|
from openbb_terminal import OpenBBFigure, rich_config, theme
|
|
from openbb_terminal.common.behavioural_analysis import finbrain_model
|
|
from openbb_terminal.core.session.current_user import get_current_user
|
|
from openbb_terminal.decorators import log_start_end
|
|
from openbb_terminal.helper_funcs import export_data, print_rich_table
|
|
from openbb_terminal.rich_config import console
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def lambda_sentiment_coloring(val: float, last_val: float) -> str:
|
|
if float(val) > last_val:
|
|
return f"[green]{val}[/green]"
|
|
return f"[red]{val}[/red]"
|
|
|
|
|
|
@log_start_end(log=logger)
|
|
def display_sentiment_analysis(
|
|
symbol: str,
|
|
raw: bool = False,
|
|
export: str = "",
|
|
sheet_name: Optional[str] = None,
|
|
external_axes: bool = False,
|
|
) -> Union[None, OpenBBFigure]:
|
|
"""Plots Sentiment analysis from FinBrain. Prints table if raw is True. [Source: FinBrain]
|
|
|
|
Parameters
|
|
----------
|
|
symbol: str
|
|
Ticker symbol to get the sentiment analysis from
|
|
raw: False
|
|
Display raw table data
|
|
sheet_name: str
|
|
Optionally specify the name of the sheet the data is exported to.
|
|
export: str
|
|
Format to export data
|
|
external_axes: bool, optional
|
|
Whether to return the figure object or not, by default False
|
|
"""
|
|
sentiment = finbrain_model.get_sentiment(symbol)
|
|
if sentiment.empty:
|
|
return console.print("No sentiment data found.\n")
|
|
|
|
if raw:
|
|
if (
|
|
rich_config.USE_COLOR
|
|
and not get_current_user().preferences.USE_INTERACTIVE_DF
|
|
):
|
|
color_df = sentiment["Sentiment Analysis"].apply(
|
|
lambda_sentiment_coloring, last_val=0
|
|
)
|
|
color_df = pd.DataFrame(
|
|
data=color_df.values,
|
|
index=pd.to_datetime(sentiment.index).strftime("%Y-%m-%d"),
|
|
)
|
|
print_rich_table(
|
|
color_df,
|
|
headers=["Sentiment"],
|
|
title="FinBrain Ticker Sentiment",
|
|
show_index=True,
|
|
export=bool(export),
|
|
)
|
|
else:
|
|
print_rich_table(
|
|
pd.DataFrame(
|
|
data=sentiment.values,
|
|
index=pd.to_datetime(sentiment.index).strftime("%Y-%m-%d"),
|
|
),
|
|
headers=["Sentiment"],
|
|
title="FinBrain Ticker Sentiment",
|
|
show_index=True,
|
|
export=bool(export),
|
|
)
|
|
|
|
fig = OpenBBFigure(
|
|
yaxis=dict(title="Sentiment", range=[-1.1, 1.1]), xaxis_title="Time"
|
|
)
|
|
|
|
fig.add_hline(y=0, line_dash="dash")
|
|
|
|
start_date = sentiment.index[-1].strftime("%Y/%m/%d")
|
|
|
|
fig.set_title(
|
|
f"FinBrain's Sentiment Analysis for {symbol.upper()} since {start_date}"
|
|
)
|
|
senValues = np.array(pd.to_numeric(sentiment["Sentiment Analysis"].values))
|
|
senNone = np.array(0 * len(sentiment))
|
|
df_sentiment = sentiment["Sentiment Analysis"]
|
|
negative_yloc = np.where(senValues < senNone)[0]
|
|
positive_yloc = np.where(senValues > senNone)[0]
|
|
|
|
fig.add_scatter(
|
|
x=df_sentiment.index[positive_yloc],
|
|
y=pd.to_numeric(df_sentiment.values)[positive_yloc],
|
|
mode="lines+markers",
|
|
marker=dict(color=theme.up_color, size=15),
|
|
line_width=1,
|
|
name=symbol,
|
|
)
|
|
fig.add_scatter(
|
|
x=[df_sentiment.index[0], df_sentiment.index[-1]],
|
|
y=[0, 0],
|
|
fillcolor=theme.up_color_transparent.replace("0.5", "0.4"),
|
|
line=dict(color="white", dash="dash"),
|
|
fill="tonexty",
|
|
mode="lines",
|
|
name=symbol,
|
|
)
|
|
fig.add_scatter(
|
|
x=df_sentiment.index[negative_yloc],
|
|
y=pd.to_numeric(df_sentiment.values)[negative_yloc],
|
|
fill="tonexty",
|
|
fillcolor=theme.down_color_transparent.replace("0.5", "0.4"),
|
|
line_width=1,
|
|
mode="lines+markers",
|
|
marker=dict(color=theme.down_color, size=15),
|
|
name=symbol,
|
|
)
|
|
fig.update_traces(showlegend=False)
|
|
|
|
export_data(
|
|
export,
|
|
os.path.dirname(os.path.abspath(__file__)),
|
|
"headlines",
|
|
sentiment,
|
|
sheet_name,
|
|
fig,
|
|
)
|
|
|
|
return fig.show(external=raw or external_axes)
|