From 005e3edbf5d284a873228ab0ae102ee38cf4c726 Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 11 Aug 2023 11:26:35 -0400 Subject: [PATCH 1/2] remove twitter functions --- .../behavioural_analysis/twitter_model.py | 212 ------------------ .../behavioural_analysis/twitter_view.py | 197 ---------------- .../behavioural_analysis/ba_controller.py | 106 --------- .../test_twitter_model.py | 0 .../behavioural_analysis/test_twitter_view.py | 0 .../test_ba_controller.py | 25 --- .../test_ba_controller/test_print_help.txt | 2 - 7 files changed, 542 deletions(-) delete mode 100644 openbb_terminal/common/behavioural_analysis/twitter_model.py delete mode 100644 openbb_terminal/common/behavioural_analysis/twitter_view.py delete mode 100644 tests/openbb_terminal/common/behavioural_analysis/test_twitter_model.py delete mode 100644 tests/openbb_terminal/common/behavioural_analysis/test_twitter_view.py diff --git a/openbb_terminal/common/behavioural_analysis/twitter_model.py b/openbb_terminal/common/behavioural_analysis/twitter_model.py deleted file mode 100644 index 034cc834113..00000000000 --- a/openbb_terminal/common/behavioural_analysis/twitter_model.py +++ /dev/null @@ -1,212 +0,0 @@ -"""Twitter Model""" -__docformat__ = "numpy" - -import logging -from datetime import datetime, timedelta -from typing import Optional - -import pandas as pd -from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer - -from openbb_terminal.core.session.current_user import get_current_user -from openbb_terminal.decorators import check_api_key, log_start_end -from openbb_terminal.helper_funcs import clean_tweet, get_data, request -from openbb_terminal.rich_config import console - -logger = logging.getLogger(__name__) - -analyzer = SentimentIntensityAnalyzer() - - -@log_start_end(log=logger) -@check_api_key(["API_TWITTER_BEARER_TOKEN"]) -def load_analyze_tweets( - symbol: str, - limit: int = 100, - start_date: Optional[str] = "", - end_date: Optional[str] = "", -) -> pd.DataFrame: - """Load tweets from twitter API and analyzes using VADER. - - Parameters - ---------- - symbol: str - Ticker symbol to search twitter for - limit: int - Number of tweets to analyze - start_date: Optional[str] - If given, the start time to get tweets from - end_date: Optional[str] - If given, the end time to get tweets from - - Returns - ------- - df_tweet: pd.DataFrame - Dataframe of tweets and sentiment - """ - params = { - "query": rf"(\${symbol}) (lang:en)", - "max_results": str(limit), - "tweet.fields": "created_at,lang", - } - - if start_date: - # Assign from and to datetime parameters for the API - params["start_time"] = start_date - if end_date: - params["end_time"] = end_date - - # Request Twitter API - response = request( - "https://api.twitter.com/2/tweets/search/recent", - params=params, # type: ignore - headers={ - "authorization": "Bearer " - + get_current_user().credentials.API_TWITTER_BEARER_TOKEN - }, - ) - - # Create dataframe - df_tweets = pd.DataFrame() - - # Check that the API response was successful - if response.status_code == 200: - tweets = [] - for tweet in response.json()["data"]: - row = get_data(tweet) - tweets.append(row) - df_tweets = pd.DataFrame(tweets) - elif response.status_code == 401: - console.print("Twitter API Key provided is incorrect\n") - return pd.DataFrame() - elif response.status_code == 400: - console.print( - """ - Status Code 400. - This means you are requesting data from beyond the API's 7 day limit""" - ) - return pd.DataFrame() - elif response.status_code == 403: - console.print( - f""" - Status code 403. - It seems you're twitter credentials are invalid - {response.text} - """ - ) - return pd.DataFrame() - else: - console.print( - f""" - Status code {response.status_code}. - Something went wrong - {response.text} - """ - ) - return pd.DataFrame() - - sentiments = [] - pos = [] - neg = [] - neu = [] - - for s_tweet in df_tweets["text"].to_list(): - tweet = clean_tweet(s_tweet, symbol) - sentiments.append(analyzer.polarity_scores(tweet)["compound"]) - pos.append(analyzer.polarity_scores(tweet)["pos"]) - neg.append(analyzer.polarity_scores(tweet)["neg"]) - neu.append(analyzer.polarity_scores(tweet)["neu"]) - # Add sentiments to tweets dataframe - df_tweets["sentiment"] = sentiments - df_tweets["positive"] = pos - df_tweets["negative"] = neg - df_tweets["neutral"] = neu - - return df_tweets - - -@log_start_end(log=logger) -def get_sentiment( - symbol: str, - n_tweets: int = 15, - n_days_past: int = 2, -) -> pd.DataFrame: - """Get sentiments from symbol. - - Parameters - ---------- - symbol: str - Stock ticker symbol to get sentiment for - n_tweets: int - Number of tweets to get per hour - n_days_past: int - Number of days to extract tweets for - - Returns - ------- - df_sentiment: pd.DataFrame - Dataframe of sentiment - """ - # Date format string required by twitter - dt_format = "%Y-%m-%dT%H:%M:%SZ" - - # Algorithm to extract - dt_recent = datetime.utcnow() - timedelta(seconds=20) - dt_old = dt_recent - timedelta(days=n_days_past) - console.print( - f"From {dt_recent.date()} retrieving {n_tweets*24} tweets ({n_tweets} tweets/hour)" - ) - - df_tweets = pd.DataFrame( - columns=[ - "created_at", - "text", - "sentiment", - "positive", - "negative", - "neutral", - ] - ) - while True: - # Iterate until we haven't passed the old number of days - if dt_recent < dt_old: - break - # Update past datetime - dt_past = dt_recent - timedelta(minutes=60) - - temp = load_analyze_tweets( - symbol, - n_tweets, - start_date=dt_past.strftime(dt_format), - end_date=dt_recent.strftime(dt_format), - ) - - if (isinstance(temp, pd.DataFrame) and temp.empty) or ( - not isinstance(temp, pd.DataFrame) and not temp - ): - return pd.DataFrame() - - df_tweets = pd.concat([df_tweets, temp]) - - if dt_past.day < dt_recent.day: - console.print( - f"From {dt_past.date()} retrieving {n_tweets*24} tweets ({n_tweets} tweets/hour)" - ) - - # Update recent datetime - dt_recent = dt_past - - # Sort tweets per date - df_tweets.sort_index(ascending=False, inplace=True) - df_tweets["cumulative_compound"] = df_tweets["sentiment"].cumsum() - df_tweets["prob_sen"] = 1 - - # df_tweets.to_csv(r'notebooks/tweets.csv', index=False) - df_tweets.reset_index(inplace=True) - df_tweets["Month"] = pd.to_datetime(df_tweets["created_at"]).apply( - lambda x: x.month - ) - df_tweets["Day"] = pd.to_datetime(df_tweets["created_at"]).apply(lambda x: x.day) - df_tweets["date"] = pd.to_datetime(df_tweets["created_at"]) - df_tweets = df_tweets.sort_values(by="date") - df_tweets["cumulative_compound"] = df_tweets["sentiment"].cumsum() - - return df_tweets diff --git a/openbb_terminal/common/behavioural_analysis/twitter_view.py b/openbb_terminal/common/behavioural_analysis/twitter_view.py deleted file mode 100644 index fba72770628..00000000000 --- a/openbb_terminal/common/behavioural_analysis/twitter_view.py +++ /dev/null @@ -1,197 +0,0 @@ -"""Twitter view.""" -__docformat__ = "numpy" - -import logging -import os -from typing import Optional, Union - -import numpy as np -import pandas as pd -from dateutil import parser as dparse - -from openbb_terminal import OpenBBFigure, theme -from openbb_terminal.common.behavioural_analysis import twitter_model -from openbb_terminal.decorators import log_start_end -from openbb_terminal.helper_funcs import export_data, get_closing_price -from openbb_terminal.rich_config import console - -logger = logging.getLogger(__name__) - - -@log_start_end(log=logger) -def display_inference( - symbol: str, limit: int = 100, export: str = "", sheet_name: Optional[str] = None -): - """Prints Inference sentiment from past n tweets. - - Parameters - ---------- - symbol: str - Stock ticker symbol - limit: int - Number of tweets to analyze - sheet_name: str - Optionally specify the name of the sheet the data is exported to. - export: str - Format to export tweet dataframe - """ - df_tweets = twitter_model.load_analyze_tweets(symbol, limit) - - if (isinstance(df_tweets, pd.DataFrame) and df_tweets.empty) or ( - not isinstance(df_tweets, pd.DataFrame) and not df_tweets - ): - return - - # Parse tweets - dt_from = dparse.parse(df_tweets["created_at"].values[-1]) - dt_to = dparse.parse(df_tweets["created_at"].values[0]) - console.print(f"From: {dt_from.strftime('%Y-%m-%d %H:%M:%S')}") - console.print(f"To: {dt_to.strftime('%Y-%m-%d %H:%M:%S')}") - - console.print(f"{len(df_tweets)} tweets were analyzed.") - dt_delta = dt_to - dt_from - n_freq = dt_delta.total_seconds() / len(df_tweets) - console.print(f"Frequency of approx 1 tweet every {round(n_freq)} seconds.") - - pos = df_tweets["positive"] - neg = df_tweets["negative"] - - percent_pos = len(np.where(pos > neg)[0]) / len(df_tweets) - percent_neg = len(np.where(pos < neg)[0]) / len(df_tweets) - total_sent = np.round(np.sum(df_tweets["sentiment"]), 2) - mean_sent = np.round(np.mean(df_tweets["sentiment"]), 2) - console.print(f"The summed compound sentiment of {symbol} is: {total_sent}") - console.print(f"The average compound sentiment of {symbol} is: {mean_sent}") - console.print( - f"Of the last {len(df_tweets)} tweets, {100*percent_pos:.2f} % had a higher positive sentiment" - ) - console.print( - f"Of the last {len(df_tweets)} tweets, {100*percent_neg:.2f} % had a higher negative sentiment" - ) - - export_data( - export, - os.path.dirname(os.path.abspath(__file__)), - "infer", - df_tweets, - sheet_name, - ) - - -@log_start_end(log=logger) -def display_sentiment( - symbol: str, - n_tweets: int = 15, - n_days_past: int = 2, - compare: bool = False, - export: str = "", - sheet_name: Optional[str] = None, - external_axes: bool = False, -) -> Union[OpenBBFigure, None]: - """Plots sentiments from symbol - - Parameters - ---------- - symbol: str - Stock ticker symbol to get sentiment for - n_tweets: int - Number of tweets to get per hour - n_days_past: int - Number of days to extract tweets for - compare: bool - Show corresponding change in stock price - sheet_name: str - Optionally specify the name of the sheet the data is exported to. - export: str - Format to export tweet dataframe - external_axes: bool, optional - Whether to return the figure object or not, by default False - """ - - df_tweets = twitter_model.get_sentiment(symbol, n_tweets, n_days_past) - - if df_tweets.empty: - return None - - if compare: - plots_kwargs = dict( - rows=3, - cols=1, - shared_xaxes=True, - vertical_spacing=0.05, - row_heights=[0.2, 0.6, 0.2], - ) - else: - plots_kwargs = dict( - rows=2, - cols=1, - shared_xaxes=True, - vertical_spacing=0.05, - row_heights=[0.6, 0.4], - ) - - fig = OpenBBFigure.create_subplots(**plots_kwargs) # type: ignore - - fig.add_scatter( - x=pd.to_datetime(df_tweets["created_at"]), - y=df_tweets["cumulative_compound"].values, - row=1, - col=1, - ) - - fig.set_yaxis_title("
Cumulative
VADER Sentiment", row=1, col=1) - - for _, day_df in df_tweets.groupby(by="Day"): - day_df["time"] = pd.to_datetime(day_df["created_at"]) - day_df = day_df.sort_values(by="time") - fig.add_scatter( - x=day_df["time"], - y=day_df["sentiment"].cumsum(), - row=1, - col=1, - ) - fig.add_bar( - x=df_tweets["date"], - y=df_tweets["positive"], - row=2, - col=1, - marker_color=theme.up_color, - ) - - fig.add_bar( - x=df_tweets["date"], - y=-1 * df_tweets["negative"], - row=2, - col=1, - marker_color=theme.down_color, - ) - fig.set_yaxis_title("VADER Polarity Scores", row=2, col=1) - - if compare: - # get stock end price for each corresponding day if compare == True - closing_price_df = get_closing_price(symbol, n_days_past) - fig.add_scatter( - x=closing_price_df["Date"], - y=closing_price_df["Close"], - name=pd.to_datetime(closing_price_df["Date"]).iloc[0].strftime("%Y-%m-%d"), - row=3, - col=1, - ) - fig.set_yaxis_title("Stock Price", row=3, col=1) - - fig.update_layout( - title=f"Twitter's {symbol} total compound sentiment over time is {round(np.sum(df_tweets['sentiment']), 2)}", - xaxis=dict(type="date"), - showlegend=False, - ) - - export_data( - export, - os.path.dirname(os.path.abspath(__file__)), - "sentiment", - df_tweets, - sheet_name, - fig, - ) - - return fig.show(external=external_axes) diff --git a/openbb_terminal/stocks/behavioural_analysis/ba_controller.py b/openbb_terminal/stocks/behavioural_analysis/ba_controller.py index 30cf872117e..f95e2e7c208 100644 --- a/openbb_terminal/stocks/behavioural_analysis/ba_controller.py +++ b/openbb_terminal/stocks/behavioural_analysis/ba_controller.py @@ -13,7 +13,6 @@ from openbb_terminal.common.behavioural_analysis import ( google_view, reddit_view, stocktwits_view, - twitter_view, ) from openbb_terminal.core.session.current_user import get_current_user from openbb_terminal.custom_prompt_toolkit import NestedCompleter @@ -21,7 +20,6 @@ from openbb_terminal.decorators import log_start_end from openbb_terminal.helper_funcs import ( EXPORT_BOTH_RAW_DATA_AND_FIGURES, EXPORT_ONLY_RAW_DATA_ALLOWED, - check_int_range, check_non_negative, check_positive, valid_date, @@ -54,8 +52,6 @@ class BehaviouralAnalysisController(StockBaseController): "messages", "trending", "stalker", - "infer", - "sentiment", "mentions", "regions", "queries", @@ -104,8 +100,6 @@ class BehaviouralAnalysisController(StockBaseController): mt.add_cmd("stalker") mt.add_cmd("bullbear", self.ticker) mt.add_cmd("messages", self.ticker) - mt.add_cmd("infer", self.ticker) - mt.add_cmd("sentiment", self.ticker) mt.add_cmd("mentions", self.ticker) mt.add_cmd("regions", self.ticker) mt.add_cmd("interest", self.ticker) @@ -709,106 +703,6 @@ class BehaviouralAnalysisController(StockBaseController): else: console.print("No ticker loaded. Please load using 'load '\n") - @log_start_end(log=logger) - def call_infer(self, other_args: List[str]): - """Process infer command.""" - parser = argparse.ArgumentParser( - add_help=False, - formatter_class=argparse.ArgumentDefaultsHelpFormatter, - prog="infer", - description=""" - Print quick sentiment inference from last tweets that contain the ticker. - This model splits the text into character-level tokens and uses vader sentiment analysis. - [Source: Twitter] - """, - ) - parser.add_argument( - "-l", - "--limit", - action="store", - dest="limit", - type=check_int_range(10, 100), - default=100, - help="limit of latest tweets to infer from.", - ) - if other_args and "-" not in other_args[0][0]: - other_args.insert(0, "-l") - ns_parser = self.parse_known_args_and_warn( - parser, other_args, EXPORT_ONLY_RAW_DATA_ALLOWED - ) - if ns_parser: - if self.ticker: - twitter_view.display_inference( - symbol=self.ticker, - limit=ns_parser.limit, - export=ns_parser.export, - sheet_name=" ".join(ns_parser.sheet_name) - if ns_parser.sheet_name - else None, - ) - else: - console.print("No ticker loaded. Please load using 'load '\n") - - @log_start_end(log=logger) - def call_sentiment(self, other_args: List[str]): - """Process sentiment command.""" - parser = argparse.ArgumentParser( - add_help=False, - formatter_class=argparse.ArgumentDefaultsHelpFormatter, - prog="sentiment", - description=""" - Plot in-depth sentiment predicted from tweets from last days - that contain pre-defined ticker. [Source: Twitter] - """, - ) - # in reality this argument could be 100, but after testing it takes too long - # to compute which may not be acceptable - # TODO: use https://github.com/twintproject/twint instead of twitter API - parser.add_argument( - "-l", - "--limit", - action="store", - dest="limit", - type=check_int_range(10, 62), - default=15, - help="limit of tweets to extract per hour.", - ) - parser.add_argument( - "-d", - "--days", - action="store", - dest="n_days_past", - type=check_int_range(1, 6), - default=6, - help="number of days in the past to extract tweets.", - ) - parser.add_argument( - "-c", - "--compare", - action="store_true", - dest="compare", - help="show corresponding change in stock price", - ) - if other_args and "-" not in other_args[0][0]: - other_args.insert(0, "-l") - ns_parser = self.parse_known_args_and_warn( - parser, other_args, EXPORT_BOTH_RAW_DATA_AND_FIGURES - ) - if ns_parser: - if self.ticker: - twitter_view.display_sentiment( - symbol=self.ticker, - n_tweets=ns_parser.limit, - n_days_past=ns_parser.n_days_past, - compare=ns_parser.compare, - export=ns_parser.export, - sheet_name=" ".join(ns_parser.sheet_name) - if ns_parser.sheet_name - else None, - ) - else: - console.print("No ticker loaded. Please load using 'load '\n") - @log_start_end(log=logger) def call_headlines(self, other_args: List[str]): """Process finbrain command.""" diff --git a/tests/openbb_terminal/common/behavioural_analysis/test_twitter_model.py b/tests/openbb_terminal/common/behavioural_analysis/test_twitter_model.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tests/openbb_terminal/common/behavioural_analysis/test_twitter_view.py b/tests/openbb_terminal/common/behavioural_analysis/test_twitter_view.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tests/openbb_terminal/stocks/behavioural_analysis/test_ba_controller.py b/tests/openbb_terminal/stocks/behavioural_analysis/test_ba_controller.py index b3e4d94c635..fa25e83d5bf 100644 --- a/tests/openbb_terminal/stocks/behavioural_analysis/test_ba_controller.py +++ b/tests/openbb_terminal/stocks/behavioural_analysis/test_ba_controller.py @@ -307,27 +307,6 @@ def test_call_func_expect_queue(expected_queue, queue, func): limit=5, ), ), - ( - "call_infer", - ["--limit=20", "--export=csv"], - "twitter_view.display_inference", - [], - dict(symbol="MOCK_TICKER", limit=20, export="csv", sheet_name=None), - ), - ( - "call_sentiment", - ["--limit=20", "--days=2", "--compare", "--export=csv"], - "twitter_view.display_sentiment", - [], - dict( - symbol="MOCK_TICKER", - n_tweets=20, - n_days_past=2, - compare=True, - export="csv", - sheet_name=None, - ), - ), ( "call_mentions", ["--start=2020-12-01", "--export=csv"], @@ -433,8 +412,6 @@ def test_call_func( "call_messages", "call_trending", "call_stalker", - "call_infer", - "call_sentiment", "call_mentions", "call_regions", "call_queries", @@ -467,8 +444,6 @@ def test_call_func_no_parser(func, mocker): "func", [ "call_headlines", - "call_sentiment", - "call_infer", "call_rise", "call_queries", "call_regions", diff --git a/tests/openbb_terminal/stocks/behavioural_analysis/txt/test_ba_controller/test_print_help.txt b/tests/openbb_terminal/stocks/behavioural_analysis/txt/test_ba_controller/test_print_help.txt index b8c9ecfe68a..27086aa90ed 100644 --- a/tests/openbb_terminal/stocks/behavioural_analysis/txt/test_ba_controller/test_print_help.txt +++ b/tests/openbb_terminal/stocks/behavioural_analysis/txt/test_ba_controller/test_print_help.txt @@ -13,8 +13,6 @@ Ticker: TSLA stalker stalk stocktwits user's last messages [Stocktwits] bullbear estimate quick sentiment from last 30 messages on board [Stocktwits] messages output up to the 30 last messages on the board [Stocktwits] - infer infer about stock's sentiment from latest tweets [Twitter] - sentiment in-depth sentiment prediction from tweets over time [Twitter] mentions interest over time based on stock's mentions [Google] regions regions that show highest interest in stock [Google] interest interest over time of sentences versus stock price [Google] From 93bc21611861fdc2c1c91861abeb5de84202452b Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 11 Aug 2023 11:42:47 -0400 Subject: [PATCH 2/2] remove twitter functions and all references to it --- .../sdk/controllers/stocks_sdk_controller.py | 4 - .../core/sdk/models/keys_sdk_model.py | 2 - .../core/sdk/models/stocks_sdk_model.py | 8 -- openbb_terminal/core/sdk/sdk_init.py | 2 - openbb_terminal/core/sdk/trail_map.csv | 3 - openbb_terminal/keys_controller.py | 46 --------- openbb_terminal/keys_model.py | 94 ------------------- .../miscellaneous/models/all_api_keys.json | 18 ---- .../miscellaneous/models/hub_credentials.json | 3 - openbb_terminal/sdk.py | 1 - tests/openbb_terminal/test_keys_controller.py | 6 -- tests/openbb_terminal/test_keys_model.py | 28 ------ .../content/terminal/usage/guides/api-keys.md | 2 +- 13 files changed, 1 insertion(+), 216 deletions(-) diff --git a/openbb_terminal/core/sdk/controllers/stocks_sdk_controller.py b/openbb_terminal/core/sdk/controllers/stocks_sdk_controller.py index 7918c33d017..38bb6952421 100644 --- a/openbb_terminal/core/sdk/controllers/stocks_sdk_controller.py +++ b/openbb_terminal/core/sdk/controllers/stocks_sdk_controller.py @@ -42,8 +42,6 @@ class StocksController(model.StocksRoot): `getdd`: Get due diligence posts from list of subreddits [Source: reddit].\n `headlines`: Gets Sentiment analysis provided by FinBrain's API [Source: finbrain].\n `headlines_chart`: Plots Sentiment analysis from FinBrain. Prints table if raw is True. [Source: FinBrain]\n - `infer`: Load tweets from twitter API and analyzes using VADER.\n - `infer_chart`: Prints Inference sentiment from past n tweets.\n `mentions`: Get interest over time from google api [Source: google].\n `mentions_chart`: Plots weekly bars of stock's interest over time. other users watchlist. [Source: Google].\n `messages`: Get last messages for a given ticker [Source: stocktwits].\n @@ -55,8 +53,6 @@ class StocksController(model.StocksRoot): `regions`: Get interest by region from google api [Source: google].\n `regions_chart`: Plots bars of regions based on stock's interest. [Source: Google].\n `rise`: Get top rising related queries with this stock's query [Source: google].\n - `sentiment`: Get sentiments from symbol.\n - `sentiment_chart`: Plots sentiments from symbol\n `snews`: Get headlines sentiment using VADER model over time. [Source: Finnhub]\n `snews_chart`: Display stock price and headlines sentiment using VADER model over time. [Source: Finnhub]\n `spacc`: Get top tickers from r/SPACs [Source: reddit].\n diff --git a/openbb_terminal/core/sdk/models/keys_sdk_model.py b/openbb_terminal/core/sdk/models/keys_sdk_model.py index 0572e6d3ded..0ccee257bd4 100644 --- a/openbb_terminal/core/sdk/models/keys_sdk_model.py +++ b/openbb_terminal/core/sdk/models/keys_sdk_model.py @@ -42,7 +42,6 @@ class KeysRoot(Category): `stocksera`: Set Stocksera key.\n `tokenterminal`: Set Token Terminal key.\n `tradier`: Set Tradier key\n - `twitter`: Set Twitter key\n `ultima`: Set Ultima Insights key\n `walert`: Set Walert key\n """ @@ -84,6 +83,5 @@ class KeysRoot(Category): self.stocksera = lib.keys_model.set_stocksera_key self.tokenterminal = lib.keys_model.set_tokenterminal_key self.tradier = lib.keys_model.set_tradier_key - self.twitter = lib.keys_model.set_twitter_key self.ultima = lib.keys_model.set_ultima_key self.walert = lib.keys_model.set_walert_key diff --git a/openbb_terminal/core/sdk/models/stocks_sdk_model.py b/openbb_terminal/core/sdk/models/stocks_sdk_model.py index 0a2ba28f2f8..78396c297d4 100644 --- a/openbb_terminal/core/sdk/models/stocks_sdk_model.py +++ b/openbb_terminal/core/sdk/models/stocks_sdk_model.py @@ -42,8 +42,6 @@ class StocksBehavioralAnalysis(Category): `getdd`: Get due diligence posts from list of subreddits [Source: reddit].\n `headlines`: Gets Sentiment analysis provided by FinBrain's API [Source: finbrain].\n `headlines_chart`: Plots Sentiment analysis from FinBrain. Prints table if raw is True. [Source: FinBrain]\n - `infer`: Load tweets from twitter API and analyzes using VADER.\n - `infer_chart`: Prints Inference sentiment from past n tweets.\n `mentions`: Get interest over time from google api [Source: google].\n `mentions_chart`: Plots weekly bars of stock's interest over time. other users watchlist. [Source: Google].\n `messages`: Get last messages for a given ticker [Source: stocktwits].\n @@ -55,8 +53,6 @@ class StocksBehavioralAnalysis(Category): `regions`: Get interest by region from google api [Source: google].\n `regions_chart`: Plots bars of regions based on stock's interest. [Source: Google].\n `rise`: Get top rising related queries with this stock's query [Source: google].\n - `sentiment`: Get sentiments from symbol.\n - `sentiment_chart`: Plots sentiments from symbol\n `snews`: Get headlines sentiment using VADER model over time. [Source: Finnhub]\n `snews_chart`: Display stock price and headlines sentiment using VADER model over time. [Source: Finnhub]\n `spacc`: Get top tickers from r/SPACs [Source: reddit].\n @@ -75,8 +71,6 @@ class StocksBehavioralAnalysis(Category): self.getdd = lib.stocks_ba_reddit_model.get_due_dilligence self.headlines = lib.stocks_ba_finbrain_model.get_sentiment self.headlines_chart = lib.stocks_ba_finbrain_view.display_sentiment_analysis - self.infer = lib.stocks_ba_twitter_model.load_analyze_tweets - self.infer_chart = lib.stocks_ba_twitter_view.display_inference self.mentions = lib.stocks_ba_google_model.get_mentions self.mentions_chart = lib.stocks_ba_google_view.display_mentions self.messages = lib.stocks_ba_stocktwits_model.get_messages @@ -88,8 +82,6 @@ class StocksBehavioralAnalysis(Category): self.regions = lib.stocks_ba_google_model.get_regions self.regions_chart = lib.stocks_ba_google_view.display_regions self.rise = lib.stocks_ba_google_model.get_rise - self.sentiment = lib.stocks_ba_twitter_model.get_sentiment - self.sentiment_chart = lib.stocks_ba_twitter_view.display_sentiment self.snews = lib.stocks_ba_finnhub_model.get_headlines_sentiment self.snews_chart = ( lib.stocks_ba_finnhub_view.display_stock_price_headlines_sentiment diff --git a/openbb_terminal/core/sdk/sdk_init.py b/openbb_terminal/core/sdk/sdk_init.py index 571269da415..0068ea5bd19 100644 --- a/openbb_terminal/core/sdk/sdk_init.py +++ b/openbb_terminal/core/sdk/sdk_init.py @@ -121,8 +121,6 @@ from openbb_terminal.common.behavioural_analysis import ( reddit_view as stocks_ba_reddit_view, stocktwits_model as stocks_ba_stocktwits_model, stocktwits_view as stocks_ba_stocktwits_view, - twitter_model as stocks_ba_twitter_model, - twitter_view as stocks_ba_twitter_view, ) diff --git a/openbb_terminal/core/sdk/trail_map.csv b/openbb_terminal/core/sdk/trail_map.csv index 63682195424..dbd7a918f02 100644 --- a/openbb_terminal/core/sdk/trail_map.csv +++ b/openbb_terminal/core/sdk/trail_map.csv @@ -317,7 +317,6 @@ keys.smartstake,keys_model.set_smartstake_key, keys.stocksera,keys_model.set_stocksera_key, keys.tokenterminal,keys_model.set_tokenterminal_key, keys.tradier,keys_model.set_tradier_key, -keys.twitter,keys_model.set_twitter_key, keys.ultima,keys_model.set_ultima_key, keys.walert,keys_model.set_walert_key, login,sdk_session.login, @@ -389,7 +388,6 @@ stocks.ba.bullbear,stocks_ba_stocktwits_model.get_bullbear, stocks.ba.cnews,stocks_ba_finnhub_model.get_company_news, stocks.ba.getdd,stocks_ba_reddit_model.get_due_dilligence, stocks.ba.headlines,stocks_ba_finbrain_model.get_sentiment,stocks_ba_finbrain_view.display_sentiment_analysis -stocks.ba.infer,stocks_ba_twitter_model.load_analyze_tweets,stocks_ba_twitter_view.display_inference stocks.ba.mentions,stocks_ba_google_model.get_mentions,stocks_ba_google_view.display_mentions stocks.ba.messages,stocks_ba_stocktwits_model.get_messages, stocks.ba.ns,stocks_ba_news_sentiment_model.get_data,stocks_ba_news_sentiment_view.display_articles_data @@ -398,7 +396,6 @@ stocks.ba.queries,stocks_ba_google_model.get_queries, stocks.ba.redditsent,stocks_ba_reddit_model.get_posts_about, stocks.ba.regions,stocks_ba_google_model.get_regions,stocks_ba_google_view.display_regions stocks.ba.rise,stocks_ba_google_model.get_rise, -stocks.ba.sentiment,stocks_ba_twitter_model.get_sentiment,stocks_ba_twitter_view.display_sentiment stocks.ba.snews,stocks_ba_finnhub_model.get_headlines_sentiment,stocks_ba_finnhub_view.display_stock_price_headlines_sentiment stocks.ba.spacc,stocks_ba_reddit_model.get_spac_community, stocks.ba.stalker,stocks_ba_stocktwits_model.get_stalker, diff --git a/openbb_terminal/keys_controller.py b/openbb_terminal/keys_controller.py index 3a522f68b64..9afa96587c2 100644 --- a/openbb_terminal/keys_controller.py +++ b/openbb_terminal/keys_controller.py @@ -573,52 +573,6 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods show_output=True, ) - @log_start_end(log=logger) - def call_twitter(self, other_args: List[str]): - """Process twitter command""" - parser = argparse.ArgumentParser( - add_help=False, - formatter_class=argparse.ArgumentDefaultsHelpFormatter, - prog="twitter", - description="Set Twitter API key.", - ) - parser.add_argument( - "-k", - "--key", - type=str, - dest="key", - help="Key", - required="-h" not in other_args and "--help" not in other_args, - ) - parser.add_argument( - "-s", - "--secret", - type=str, - dest="secret", - help="Secret key", - required="-h" not in other_args and "--help" not in other_args, - ) - parser.add_argument( - "-t", - "--token", - type=str, - dest="token", - help="Bearer token", - required="-h" not in other_args and "--help" not in other_args, - ) - if not other_args: - console.print("For your API Key, visit: https://developer.twitter.com") - return - ns_parser = self.parse_simple_args(parser, other_args) - if ns_parser: - self.status_dict["twitter"] = keys_model.set_twitter_key( - key=ns_parser.key, - secret=ns_parser.secret, - access_token=ns_parser.token, - persist=True, - show_output=True, - ) - @log_start_end(log=logger) def call_rh(self, other_args: List[str]): """Process rh command""" diff --git a/openbb_terminal/keys_model.py b/openbb_terminal/keys_model.py index 12d6347f604..ba8937714d2 100644 --- a/openbb_terminal/keys_model.py +++ b/openbb_terminal/keys_model.py @@ -1160,100 +1160,6 @@ def check_bitquery_key(show_output: bool = False) -> str: return str(status) -def set_twitter_key( - key: str, - secret: str, - access_token: str, - persist: bool = False, - show_output: bool = False, -) -> str: - """Set Twitter key - - Parameters - ---------- - key: str - API key - secret: str - API secret - access_token: str - API token - persist: bool, optional - If False, api key change will be contained to where it was changed. For example, a Jupyter notebook session. - If True, api key change will be global, i.e. it will affect terminal environment variables. - By default, False. - show_output: bool, optional - Display status string or not. By default, False. - - Returns - ------- - str - Status of key set - - Examples - -------- - >>> from openbb_terminal.sdk import openbb - >>> openbb.keys.twitter( - key="example_key", - secret="example_secret", - access_token="example_access_token" - ) - """ - handle_credential("API_TWITTER_KEY", key, persist) - handle_credential("API_TWITTER_SECRET_KEY", secret, persist) - handle_credential("API_TWITTER_BEARER_TOKEN", access_token, persist) - - return check_twitter_key(show_output) - - -def check_twitter_key(show_output: bool = False) -> str: - """Check Twitter key - - Parameters - ---------- - show_output: bool, optional - Display status string or not. By default, False. - - Returns - ------- - str - Status of key set - """ - - if show_output: - console.print("Checking status...") - - current_user = get_current_user() - if current_user.credentials.API_TWITTER_BEARER_TOKEN == "REPLACE_ME": - status = KeyStatus.NOT_DEFINED - else: - params = { - "query": "(\\$AAPL) (lang:en)", - "max_results": "10", - "tweet.fields": "created_at,lang", - } - r = request( - "https://api.twitter.com/2/tweets/search/recent", - params=params, # type: ignore - headers={ - "authorization": "Bearer " - + current_user.credentials.API_TWITTER_BEARER_TOKEN - }, - ) - if r.status_code == 200: - status = KeyStatus.DEFINED_TEST_PASSED - elif r.status_code in [401, 403]: - logger.warning("Twitter key defined, test failed") - status = KeyStatus.DEFINED_TEST_FAILED - else: - logger.warning("Twitter key defined, test failed") - status = KeyStatus.DEFINED_TEST_INCONCLUSIVE - - if show_output: - console.print(status.colorize()) - - return str(status) - - def set_rh_key( username: str, password: str, diff --git a/openbb_terminal/miscellaneous/models/all_api_keys.json b/openbb_terminal/miscellaneous/models/all_api_keys.json index d9abe8d6dc9..cac66c9c54e 100644 --- a/openbb_terminal/miscellaneous/models/all_api_keys.json +++ b/openbb_terminal/miscellaneous/models/all_api_keys.json @@ -65,24 +65,6 @@ "link": "https://polygon.io", "markdown": "Go to: https://polygon.io\n\n![Polygon](https://user-images.githubusercontent.com/46355364/207825623-fcd7f0a3-131a-4294-808c-754c13e38e2a.png)\n\nClick on, \"Get your Free API Key\".\n\n![Polygon](https://user-images.githubusercontent.com/46355364/207825952-ca5540ec-6ed2-4cef-a0ed-bb50b813932c.png)\n\nAfter signing up, the API Key is found at the bottom of the account dashboard page.\n\n![Polygon](https://user-images.githubusercontent.com/46355364/207826258-b1f318fa-fd9c-41d9-bf5c-fe16722e6601.png)" }, - { - "name": "API_TWITTER_KEY", - "source": "Twitter key", - "link": "https://developer.twitter.com", - "markdown": "![Twitter API](https://pbs.twimg.com/media/FooIJF3agAIU8SN?format=png&name=medium)" - }, - { - "name": "API_TWITTER_SECRET_KEY", - "source": "Twitter secret", - "link": "https://developer.twitter.com", - "markdown": "![Twitter API](https://pbs.twimg.com/media/FooIJF3agAIU8SN?format=png&name=medium)" - }, - { - "name": "API_TWITTER_BEARER_TOKEN", - "source": "Twitter token", - "link": "https://developer.twitter.com", - "markdown": "![Twitter API](https://pbs.twimg.com/media/FooIJF3agAIU8SN?format=png&name=medium)" - }, { "name": "API_FRED_KEY", "source": "FRED", diff --git a/openbb_terminal/miscellaneous/models/hub_credentials.json b/openbb_terminal/miscellaneous/models/hub_credentials.json index c0275c172bb..2370ee7b71d 100644 --- a/openbb_terminal/miscellaneous/models/hub_credentials.json +++ b/openbb_terminal/miscellaneous/models/hub_credentials.json @@ -32,8 +32,5 @@ "API_REDDIT_USERNAME": "", "API_REDDIT_USER_AGENT": "", "API_REDDIT_PASSWORD": "", - "API_TWITTER_KEY": "", - "API_TWITTER_SECRET_KEY": "", - "API_TWITTER_BEARER_TOKEN": "", "API_DAPPRADAR_KEY": "" } diff --git a/openbb_terminal/sdk.py b/openbb_terminal/sdk.py index 73165a28464..1990c434c1e 100644 --- a/openbb_terminal/sdk.py +++ b/openbb_terminal/sdk.py @@ -438,7 +438,6 @@ class OpenBBSDK: `stocksera`: Set Stocksera key.\n `tokenterminal`: Set Token Terminal key.\n `tradier`: Set Tradier key\n - `twitter`: Set Twitter key\n `ultima`: Set Ultima Insights key\n `walert`: Set Walert key\n """ diff --git a/tests/openbb_terminal/test_keys_controller.py b/tests/openbb_terminal/test_keys_controller.py index 10c2de4d5cf..8af59ae4f4d 100644 --- a/tests/openbb_terminal/test_keys_controller.py +++ b/tests/openbb_terminal/test_keys_controller.py @@ -148,12 +148,6 @@ def test_call_reddit(other): controller.call_reddit(other) -@pytest.mark.vcr -@pytest.mark.parametrize("other", [[], ["-k", "1234", "-s", "4567", "-t", "890"]]) -def test_call_twitter(other): - controller.call_twitter(other) - - @pytest.mark.vcr @pytest.mark.parametrize("other", [[], ["-u", "1234", "-p", "4567"]]) def test_call_rh(other): diff --git a/tests/openbb_terminal/test_keys_model.py b/tests/openbb_terminal/test_keys_model.py index 7d230a13c20..f5b2883e3dd 100644 --- a/tests/openbb_terminal/test_keys_model.py +++ b/tests/openbb_terminal/test_keys_model.py @@ -367,34 +367,6 @@ def test_set_bitquery_key(args: List[str], persist: bool, show_output: bool, moc mock_check.assert_called_once_with(show_output) -@pytest.mark.vcr -@pytest.mark.parametrize( - "args, persist, show_output", - [ - ( - ["test_key", "test_secret", "test_access_token"], - False, - True, - ), - ( - ["test_key", "test_secret", "test_access_token"], - False, - False, - ), - ], -) -def test_set_twitter_key(args: List[str], persist: bool, show_output: bool, mocker): - mock_check = mocker.patch("openbb_terminal.keys_model.check_twitter_key") - keys_model.set_twitter_key( - key=args[0], - secret=args[1], - access_token=args[2], - persist=persist, - show_output=show_output, - ) - mock_check.assert_called_once_with(show_output) - - @pytest.mark.vcr @pytest.mark.parametrize( "args, persist, show_output", diff --git a/website/content/terminal/usage/guides/api-keys.md b/website/content/terminal/usage/guides/api-keys.md index d15f8792fd5..30f712e3cb8 100644 --- a/website/content/terminal/usage/guides/api-keys.md +++ b/website/content/terminal/usage/guides/api-keys.md @@ -2,7 +2,7 @@ title: Setting API Keys sidebar_position: 1 description: API (Application Programming Interface) keys are access credentials for accessing data from a particular source. Learn how to set, manage, and access data APIs for the OpenBB Terminal. -keywords: [api, keys, api keys, openbb terminal, data provider, data, free, alpha vantage, fred, iex, twitter, degiro, binance, coinglass, polygon, intrinio, sdk, alphavantage, bitquery, coinbase, databento, finnhub, FRED, github, glassnode, iex cloud, news API, robinhood, santiment, shroomdk, token terminal, tradier, twitter, whale alert] +keywords: [api, keys, api keys, openbb terminal, data provider, data, free, alpha vantage, fred, iex, degiro, binance, coinglass, polygon, intrinio, sdk, alphavantage, bitquery, coinbase, databento, finnhub, FRED, github, glassnode, iex cloud, news API, robinhood, santiment, shroomdk, token terminal, tradier, whale alert] --- import HeadTitle from '@site/src/components/General/HeadTitle.tsx';