jmansfield89's picture
Update app.py
3398426 verified
# LIBRARY IMPORTS
from streamlit.web import cli as stcli
import pandas as pd
import sys
from streamlit import cli as stcli
import plotly.express as px
# GLOBAL VARIABLES
# Create variable for Tweet being analyzed in this app
tweet_url = 'https://twitter.com/Meta/status/1453795115701440524'
# FUNCTIONS
def data_import():
"""
Imports data from "df_redacted.csv" as a dataframe.
"""
df_redacted = pd.read_csv('df_redacted.csv')
return df_redacted
def data_manipulation(df_redacted):
"""
Manipulates the data imported from the CSV file to prepare for bar chart.
"""
# Create new dataframe, reset the index, and rename columns
sentiment_counts = pd.DataFrame(df_redacted['sentiment_score'].value_counts(dropna=False))
sentiment_counts = sentiment_counts.reset_index()
sentiment_counts.columns = ['Sentiment', 'Count']
# Find sentiment category with the highest count
sentiment = sentiment_counts.loc[sentiment_counts['Count'].idxmax(), 'Sentiment']
return sentiment_counts, sentiment
def display_header(sentiment):
"""
Displays the header section of the app.
"""
st.header('This app runs a sentiment analysis of the replies to a Facebook Tweet '
'announcing their rebranding to Meta.')
st.header('RESULT: {}'.format(sentiment))
def display_chart(sentiment_counts):
"""
Displays the chosen chart for the data.
"""
# Display count for each sentiment category
fig = px.bar(sentiment_counts,
x='Sentiment',
y='Count',
title='Tweet Replies Count by Sentiment Category')
fig.update_layout(title_x=0.5)
st.plotly_chart(fig, use_container_width=True)
def display_footer(tweet_url, sentiment):
"""
Displays the footer section of the app.
"""
st.markdown('**Objective:** Understand public reaction of a Tweet by analyzing the sentiment of each reply.')
st.markdown('**Analysis:** This app runs sentiment analysis on 10,948 replies to a Facebook Tweet announcing '
'their rebranding to Meta on 10/28/2021. Link to Tweet: {}'.format(tweet_url))
st.markdown('**Results:** Most frequent sentiment category for the replies to this Tweet: **{}**'.format(sentiment))
st.markdown('**Notes:** ')
st.markdown('- The VADER model was used to analyze the sentiment of each reply: '
'https://github.com/cjhutto/vaderSentiment')
st.markdown('- Due to Twitter developer policies, I am not able to share the data set of downloaded Tweet replies '
'so my DATA EXTRACTION and DATA CLEANSING steps are not shown at this time but will be added soon!')
st.markdown('**Plans for Version 2.0:**')
st.markdown('- Formulate method for cleaning Tweet replies, such as removing those that are from bots or are spam.')
st.markdown('- Analyze the sentiment of replies using the BERTweet model, which would be more appropriate for this '
'project since it was trained on a corpus of Tweets: https://github.com/VinAIResearch/BERTweet')
def main():
"""
Main function for the app which calls all other functions to display the app.
"""
# DATA IMPORT
df_redacted = data_import()
# DATA MANIPULATION
sentiment_counts, sentiment = data_manipulation(df_redacted)
# DISPLAY DATA
display_header(sentiment)
display_chart(sentiment_counts)
display_footer(tweet_url, sentiment)
if __name__ == '__main__':
if st._is_running_with_streamlit:
main()
else:
sys.argv = ['streamlit', 'run', sys.argv[0]]
sys.exit(stcli.main())