Files
OpenBB/openbb_terminal/common/behavioural_analysis/twitter_model.py
didierlopes.eth b7f8fbe630 Improve OpenBB API for investment research reports (#1753)
* fix darkpool api

* fix typo

* add default params on RSI ta

* fix ta models for stocks api

* fix ta models for stocks api

* improve API

* improve API

* test_finbrain updated

* fix finbrain model api

* ba controller

* improve API

* minor improvs to API

* a newly fantastic equity report

* fixed image issue

* add help to tier in finra command

* make export to default to False for API use

* remove ipynb_checkpoints

* remove extra file

Co-authored-by: jose-donato <zmcdonato@gmail.com>
Co-authored-by: Theodore Aptekarev <aptekarev@gmail.com>
2022-05-03 16:44:12 +03:00

118 lines
3.3 KiB
Python

"""Twitter Model"""
__docformat__ = "numpy"
import logging
from typing import Optional
import pandas as pd
import requests
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
from openbb_terminal import config_terminal as cfg
from openbb_terminal.decorators import log_start_end
from openbb_terminal.helper_funcs import clean_tweet, get_data
from openbb_terminal.rich_config import console
logger = logging.getLogger(__name__)
analyzer = SentimentIntensityAnalyzer()
@log_start_end(log=logger)
def load_analyze_tweets(
ticker: str,
count: int = 100,
start_time: Optional[str] = "",
end_time: Optional[str] = "",
) -> pd.DataFrame:
"""Load tweets from twitter API and analyzes using VADER
Parameters
----------
ticker: str
Ticker to search twitter for
count: int
Number of tweets to analyze
start : Optional[str]
If given, the start time to get tweets from
end : Optional[str]
If given, the end time to get tweets from
Returns
-------
df_tweet: pd.DataFrame
Dataframe of tweets and sentiment
"""
params = {
"query": rf"(\${ticker}) (lang:en)",
"max_results": str(count),
"tweet.fields": "created_at,lang",
}
if start_time:
# Assign from and to datetime parameters for the API
params["start_time"] = start_time
if end_time:
params["end_time"] = end_time
# Request Twitter API
response = requests.get(
"https://api.twitter.com/2/tweets/search/recent",
params=params, # type: ignore
headers={"authorization": "Bearer " + cfg.API_TWITTER_BEARER_TOKEN},
)
# Create dataframe
df_tweets = pd.DataFrame()
# Check that the API response was successful
if response.status_code == 200:
for tweet in response.json()["data"]:
row = get_data(tweet)
df_tweets = df_tweets.append(row, ignore_index=True)
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, ticker)
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