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 = """
""" 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)