Soufianesejjari's picture
fix design
290ea24
import streamlit as st
import preprocessor
import helper
import matplotlib.pyplot as plt
import seaborn as sns
from streamlit.components.v1 import html
# Page configuration
st.set_page_config(
page_title="WhatsApp Chat Analyzer",
layout="wide",
initial_sidebar_state="auto",
menu_items={
'Get Help': 'https://github.com/soufianesejjari',
'About': "# This is a WhatsApp Chat Analyzer app\n"
"#### built with Streamlit. It helps you analyze your WhatsApp chat data. You can visualize your chat data, including the number of messages, words, media shared, links shared, and more. You can also see the most active users, most common words, and emojis used. The app also provides a word cloud and timeline analysis of your chat data. The app is developed by Soufiane Sejjari. You can find the source code on GitHub."
}
)
st.set_option('deprecation.showPyplotGlobalUse', False)
# SEO title and footer
def inject_html():
footer = """
<style>
.footer {
position: fixed;
left: 0;
bottom: 0;
width: 100%;
background-color: #f1f1f1;
color: #333;
text-align: center;
padding: 10px;
font-family: Arial, sans-serif;
}
.main-content {
max-width: 1000px;
margin: 0 auto;
padding: 20px;
}
h1 {
font-size: 2.5em;
color: #333;
}
h2 {
font-size: 2em;
color: #333;
}
h3 {
font-size: 1.75em;
color: #333;
}
h4 {
font-size: 1.5em;
color: #333;
}
h5 {
font-size: 1.25em;
color: #333;
}
.stButton>button {
background-color: #4CAF50;
color: white;
border: none;
padding: 10px 20px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
margin: 4px 2px;
cursor: pointer;
border-radius: 12px;
}
</style>
<div class="footer">
<p>Developed by Soufiane Sejjari</p>
<p><a href="https://soufiane-s.netlify.app/" target="_blank">Portfolio</a> | <a href="https://github.com/soufianesejjari" target="_blank">GitHub</a></p>
</div>
"""
st.markdown(footer, unsafe_allow_html=True)
inject_html()
st.sidebar.title("WhatsApp Chat Analyzer")
uploaded_file = st.sidebar.file_uploader("Choose a file")
if uploaded_file is not None:
bytes_data = uploaded_file.getvalue()
data = bytes_data.decode("utf-8")
df = preprocessor.preprocess(data)
# fetch unique users
user_list = df['user'].unique().tolist()
if 'group_notification' in user_list:
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"):
# Stats Area
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, ax = plt.subplots()
ax.plot(timeline['time'], timeline['message'], color='green')
plt.xticks(rotation='vertical')
st.pyplot(fig)
# Daily Timeline
st.title("Daily Timeline")
daily_timeline = helper.daily_timeline(selected_user, df)
fig, ax = plt.subplots()
ax.plot(daily_timeline['only_date'], daily_timeline['message'], color='black')
plt.xticks(rotation='vertical')
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, ax = plt.subplots()
ax.bar(busy_day.index, busy_day.values, color='purple')
plt.xticks(rotation='vertical')
st.pyplot(fig)
with col2:
st.header("Most busy month")
busy_month = helper.month_activity_map(selected_user, df)
fig, ax = plt.subplots()
ax.bar(busy_month.index, busy_month.values, color='orange')
plt.xticks(rotation='vertical')
st.pyplot(fig)
# Weekly Activity Map
st.title("Weekly Activity Map")
user_heatmap = helper.activity_heatmap(selected_user, df)
fig, ax = plt.subplots()
ax = sns.heatmap(user_heatmap, annot=True, fmt="g", cmap="YlGnBu", cbar=False)
st.pyplot(fig)
# Most Busy Users (Overall)
if selected_user == 'Overall':
st.title('Most Busy Users')
x, new_df = helper.most_busy_users(df)
fig, ax = plt.subplots(figsize=(8, 6))
col1, col2 = st.columns(2)
with col1:
ax.bar(x.index, x.values, color='red')
plt.xticks(rotation='vertical')
st.pyplot(fig)
with col2:
st.dataframe(new_df)
# WordCloud
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)
fig, ax = plt.subplots()
ax.barh(most_common_df[0], most_common_df[1])
plt.xticks(rotation='vertical')
st.pyplot(fig)
# Emoji Analysis
st.title("Emoji Analysis")
emoji_df = helper.emoji_helper(selected_user, df)
col1, col2 = st.columns(2)
with col1:
st.dataframe(emoji_df)
with col2:
fig, ax = plt.subplots()
ax.pie(emoji_df[1].head(), labels=emoji_df[0].head(), autopct="%0.2f")
st.pyplot(fig)
# Words per User per Month
st.title("Words per User per Month")
words_per_month_df = helper.words_per_user_per_month(df)
st.dataframe(words_per_month_df)
# Frequent Hours
st.title("Frequent Hours")
frequent_hours_df = helper.frequent_hours(selected_user, df)
st.bar_chart(frequent_hours_df)
# Common Words by 4-Hour Intervals
st.title("Common Words by 4-Hour Intervals")
common_words_by_hour_df = helper.common_words_by_four_hours(selected_user, df)
st.dataframe(common_words_by_hour_df)
# WordClouds by 4-Hour Intervals
st.title("WordClouds by 4-Hour Intervals")
wordclouds_by_hour = helper.create_wordcloud_by_four_hours(selected_user, df)
for period, wc_img in wordclouds_by_hour.items():
st.subheader(f"WordCloud for {period}")
st.image(wc_img.to_array(), use_column_width=True)
# Common Words by Month
st.title("Common Words by Month")
common_words_by_month_df = helper.common_words_by_month(selected_user, df)
st.dataframe(common_words_by_month_df)