File size: 7,528 Bytes
4f3e60d 290ea24 4f3e60d 290ea24 4f3e60d |
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 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 |
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)
|