|
import streamlit as st |
|
import preprocessor |
|
import helper |
|
import matplotlib.pyplot as plt |
|
import seaborn as sns |
|
from streamlit.components.v1 import html |
|
|
|
|
|
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) |
|
|
|
|
|
|
|
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) |
|
|
|
|
|
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"): |
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
|
|
st.title("Wordcloud") |
|
df_wc = helper.create_wordcloud(selected_user, df) |
|
fig, ax = plt.subplots() |
|
ax.imshow(df_wc) |
|
st.pyplot(fig) |
|
|
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
|
|
st.title("Words per User per Month") |
|
words_per_month_df = helper.words_per_user_per_month(df) |
|
st.dataframe(words_per_month_df) |
|
|
|
|
|
st.title("Frequent Hours") |
|
frequent_hours_df = helper.frequent_hours(selected_user, df) |
|
st.bar_chart(frequent_hours_df) |
|
|
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
|
|
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) |
|
|