abdulrasool's picture
Update app.py
7f4632e
import streamlit as st
import preprocessor
import helper
import matplotlib.pyplot as plt
import seaborn as sns
def main():
st.sidebar.title("Whatsapp Chat Analyzer")
uploaded_file = st.sidebar.file_uploader("Choose a file")
if uploaded_file is not None:
# To read file as bytes:
bytes_data = uploaded_file.getvalue()
data = bytes_data.decode("utf-8")
df = preprocessor.preprocess(data)
#fetch unique users
user_list = df['user'].unique().tolist()
user_list.remove('group_notification')
user_list.sort()
user_list.insert(0,"Overall")
selected_user = st.sidebar.selectbox("Show analysis wrt",user_list)
if st.sidebar.button("Show Analysis"):
num_messages,words, num_media_messages ,num_links = helper.fetch_stats(selected_user,df)
st.title("Top Statistics")
col1, col2 , col3, col4 = st.columns(4)
with col1:
st.header("Total Messages")
st.title(num_messages)
with col2:
st.header("Total Words")
st.title(words)
with col3:
st.header("Media shared")
st.title(num_media_messages)
with col4:
st.header("Links shared")
st.title(num_links)
#monthly_timeline
st.title("Monthly Timeline")
timeline=helper.monthly_timeline(selected_user,df)
fig = plt.figure()
sns.set_style('darkgrid')
sns.lineplot(x=timeline['time'],y=timeline['message'],color='red')
plt.xticks(rotation='vertical')
st.pyplot(fig)
# daily timeline
st.title("Daily Timeline")
daily_timeline = helper.daily_timeline(selected_user, df)
fig = plt.figure(figsize=(10, 3))
sns.set_style('whitegrid')
sns.lineplot(x=daily_timeline['only_date'],y=daily_timeline['message'], color='purple')
plt.xticks(rotation='vertical')
plt.xlabel("date")
st.pyplot(fig)
#activity map
st.title('Activity Map')
col1,col2 = st.columns(2)
with col1:
st.header("Most busy day")
busy_day=helper.week_activity_map(selected_user,df)
fig = plt.figure()
sns.set_style('ticks')
pal=sns.cubehelix_palette(start=2, rot=0, dark=0.5, light=0.9, reverse=True)
sns.barplot(x=busy_day.index,y=busy_day.values,palette=pal)
plt.ylabel("messages")
plt.xticks(rotation='vertical')
st.pyplot(fig)
with col2:
st.header("Most busy month")
busy_month=helper.month_activity_map(selected_user,df)
fig=plt.figure()
sns.set_style('ticks')
pal=sns.cubehelix_palette(start=0, rot=0, dark=0.2, light=0.9, reverse=True)
sns.barplot(x=busy_month.index,y=busy_month.values,palette=pal)
plt.ylabel("messages")
plt.xticks(rotation='vertical')
st.pyplot(fig)
st.title("Weekly Activity Map")
user_heatmap = helper.activity_heatmap(selected_user, df)
fig = plt.figure(figsize=(13,4))
cmap = sns.color_palette("viridis", as_cmap=True)
sns.heatmap(user_heatmap,cmap=cmap,square=True)
st.pyplot(fig)
#finding active users
if(selected_user=='Overall'):
st.title('Most active users')
x,new_df=helper.most_busy_users(df)
fig=plt.figure()
col1,col2 = st.columns(2)
with col1:
pal = sns.color_palette("cubehelix")
sns.barplot(x=x.index,y=x.values,palette=pal)
plt.xticks(rotation='vertical')
plt.ylabel('messages')
st.pyplot(fig)
with col2:
st.dataframe(new_df)
#word cloud
st.title('WordCloud')
df_wc = helper.create_wordcloud(selected_user,df)
fig,ax = plt.subplots()
ax.imshow(df_wc)
st.pyplot(fig)
#most common words
st.title('Most Common Words')
most_common_df=helper.most_common_words(selected_user,df)
colors = ['#e6194b', '#3cb44b', '#ffe119', '#4363d8', '#f58231',
'#911eb4', '#46f0f0', '#f032e6', '#bcf60c', '#fabebe',
'#008080', '#e6beff', '#9a6324', '#fffac8', '#aaffc3',
'#808000', '#ffd8b1', '#808080', 'lightgreen', 'lightblue']
# explosion
fig = plt.figure()
# Pie Chart
plt.pie(most_common_df[1], labels=most_common_df[0], colors=colors,
autopct='%0.1f%%', pctdistance=0.9, labeldistance=1, rotatelabels=270, startangle=180,
counterclock=False)
# draw circle
centre_circle = plt.Circle((0, 0), 0.50, fc='white')
fig2 = plt.gcf()
# Adding Circle in Pie chart
fig2.gca().add_artist(centre_circle)
st.pyplot(fig)
#emoji analysys
emoji_df = helper.emoji_helper(selected_user,df)
if(emoji_df.shape[0]):
st.title("Emoji Analysis")
col1,col2 =st.columns(2)
with col1:
st.dataframe(emoji_df)
with col2:
fig,ax = plt.subplots()
plt.rcParams["font.monospace"] = ["Segoe UI Emoji"]
plt.rcParams["font.family"] = "monospace"
ax.pie(emoji_df[1].head(min(5,emoji_df.shape[0])),labels=emoji_df[0].head(min(5,emoji_df.shape[0])),autopct="%0.2f")
st.pyplot(fig)
#birth_dates
if(selected_user=='Overall'):
birth_data = helper.birth_dates(df)
if(birth_data.shape[0]):
st.title("Birth dates of some users.")
st.dataframe(birth_data)
#Sentiment-analysis
if (selected_user != 'Overall'):
st.title("Sentiment Analysis")
sentiment_data,number=helper.sentiment_analysis(selected_user,df)
fig = plt.figure()
sns.set_style('ticks')
pal = sns.cubehelix_palette(start=0.5, rot=0, dark=0.2, light=0.9, reverse=True)
sns.barplot(x=sentiment_data.index,y=sentiment_data.values,palette=pal)
plt.xticks(rotation='vertical')
st.pyplot(fig)
st.header("Based on random "+str(number)+" messages.")
st.text("Note : Sentiment Analysis give good results if messages \nare in hinglish (hindi or english or both).")
main()