-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathapp.py
91 lines (76 loc) · 3.91 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px
from wordcloud import WordCloud, STOPWORDS
import matplotlib.pyplot as plt
### Adding a Title and Sidebar:
st.title("Sentimental Analysis of Tweets about US Airlines")
st.sidebar.title("Sentimental Analysis of Tweets about US Airlines")
### Adding Description in main page and sidebar:
st.markdown(" This application is a Streamlit dashboard to analyze the sentiments of tweets. 🐦")
st.sidebar.markdown(" This application is a Streamlit dashboard to analyze the sentiments of tweets. 🐦")
### Loading the data:
#Tweets.csv
DATA_URL = ("Tweets.csv")
#"C:\Users\akank\PycharmProjects\AirlineSentimentAnalysisDashboard\Tweets2.csv"
@st.cache(persist=True)
def load_data():
data = pd.read_csv(DATA_URL)
data['tweet_created'] = pd.to_datetime(data['tweet_created'])
return data
data = load_data()
#st.write(data)
st.sidebar.subheader("Show random tweet")
random_tweet = st.sidebar.radio('Sentiment:', ('positive', 'neutral', 'negative'))
st.sidebar.markdown(data.query('airline_sentiment == @random_tweet')[["text"]].sample(n=1).iat[0, 0])
### Data Visualization:
### Showing the number of Tweets by Sentiment using a Histogram or Pie Chart based on user's preference:
st.sidebar.markdown("### Number of Tweets by Sentiment")
select = st.sidebar.selectbox('Visulaization type', ['Histogram', 'Pie Chart'], key='1')
sentiment_count = data['airline_sentiment'].value_counts()
sentiment_count = pd.DataFrame({'Sentiment': sentiment_count.index, 'Tweets': sentiment_count.values})
if not st.sidebar.checkbox("Hide", True):
st.markdown("### Number of tweets by Sentiment")
if select == "Histogram":
fig = px.bar(sentiment_count, x='Sentiment', y='Tweets', color='Tweets', height=500)
st.plotly_chart(fig)
else:
fig = px.pie(sentiment_count, values='Tweets', names='Sentiment')
st.plotly_chart(fig)
### Showing the when and where these tweets were made from:
st.sidebar.subheader("When and Where are the Users tweeting from?")
hour = st.sidebar.slider("Hour of day", 0, 23)
modified_data = data[data['tweet_created'].dt.hour == hour]
if not st.sidebar.checkbox("Close", True, key='1'):
st.markdown("### Tweets locations based on the time of day")
st.markdown("%i tweets between %i:00 and %i:00" % (len(modified_data), hour, (hour + 1) % 24))
st.map(modified_data)
if st.sidebar.checkbox("Show raw data", False):
st.write(modified_data)
### Displaying the number of positve, negative or neutral airlines by airlines:
st.sidebar.subheader("Breakdown airline tweets by sentiment")
choice = st.sidebar.multiselect('Pick Airlines',
('US Airways', 'United', 'American', 'Southwest', 'Delta', 'Virgin America'), key='0')
if len(choice) > 0:
choice_data = data[data.airline.isin(choice)]
fig_choice = px.histogram(choice_data, x='airline', y='airline_sentiment', histfunc='count',
color='airline_sentiment',
facet_col='airline_sentiment', labels={'airline_sentiment': 'tweets'}, height=600,
width=800)
st.plotly_chart(fig_choice)
st.sidebar.header("Word Cloud")
word_sentiment = st.sidebar.radio('Display word cloud for which sentiment ?', ('positive', 'neutral', 'negative'))
if not st.sidebar.checkbox("Close", True, key='3'):
st.header('Word Cloud for %s sentiment' % (word_sentiment))
df = data[data['airline_sentiment'] == word_sentiment]
words = ' '.join(df['text'])
processed_words = ' '.join(
[word for word in words.split() if 'http' not in word and not word.startswith('@') and word != 'RT'])
wordcloud = WordCloud(stopwords=STOPWORDS, background_color='white', height=640, width=800).generate(
processed_words)
plt.imshow(wordcloud)
plt.xticks([])
plt.yticks([])
st.pyplot()
st.set_option('deprecation.showPyplotGlobalUse', False)