Spaces:
Sleeping
Sleeping
import streamlit as st | |
import matplotlib.pyplot as plt | |
import plotly.express as px | |
import preprocessor | |
import helper | |
color_2 = 'rgb(237, 59, 59)' | |
st.set_page_config(page_title="Whatsapp Chat Data Analysis App", | |
initial_sidebar_state='expanded', | |
page_icon="๐", | |
menu_items={ | |
'Get Help': 'https://www.linkedin.com/in/imdebamritapaul/', | |
'Report a bug': "mailto:imdebamrita@1gmail.com", | |
'About': "Introducing the WhatsApp Chat Analysis App! Analyze your chat history, uncover trends, and gain insights into your messaging habits. < ___Made by : Debamrita Paul___ > Connect in LinkedIn: https://www.linkedin.com/in/imdebamritapaul/ssssss ๐ฒ๐ #WhatsAppChatAnalysis #DataInsights" | |
}) | |
st.sidebar.title("Whatsapp Chat Analyzer") | |
uploaded_file = st.sidebar.file_uploader("Choose a file", type=['txt']) | |
if uploaded_file is not None: | |
bytes_data = uploaded_file.getvalue() | |
data = bytes_data.decode("utf-8") | |
check = preprocessor.checker(data) | |
if check: | |
df = preprocessor.preprocess(data) | |
# Get 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"): | |
# States Area | |
num_messages, words, num_media_messages, num_links = helper.fetch_states( | |
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) | |
# Timeline Data | |
st.title("Timeline") | |
col1, col2 = st.columns(2) | |
# Monthly Timeline | |
with col1: | |
monthly_timeline = helper.monthly_timeline(selected_user, df) | |
fig = px.line(monthly_timeline, x='Timeline', y='Message', | |
title='Monthly Timeline') | |
st.plotly_chart(fig, use_container_width=True) | |
# Daily Timeline | |
with col2: | |
daily_timeline = helper.daily_timeline(selected_user, df) | |
fig = px.line(daily_timeline, x='Date', y='Message', | |
title='Daily Timeline') | |
fig.update_traces(line_color=color_2) | |
st.plotly_chart(fig, use_container_width=True) | |
# Activity Map | |
st.title("Activity Map") | |
col1, col2 = st.columns(2) | |
# Weekly Activity | |
with col1: | |
week_activity = helper.week_activity_map(selected_user, df) | |
fig = px.bar(week_activity, x='Day', y='Message', | |
title='Weekly Activity') | |
fig.update_traces(marker_color=color_2) | |
st.plotly_chart(fig, use_container_width=True) | |
# Monthly Activity | |
with col2: | |
month_activity = helper.month_activity_map(selected_user, df) | |
fig = px.bar(month_activity, x='Month', y='Message', | |
title='Monthly Activity') | |
st.plotly_chart(fig, use_container_width=True) | |
# Heat Map | |
user_heatmap = helper.activity_heatmap(selected_user, df) | |
fig = px.imshow(user_heatmap, title='Activity Heatmap') | |
st.plotly_chart(fig) | |
# Finding the most active user in the Group | |
if selected_user == 'Overall': | |
st.title("Most Active Users") | |
x, per = helper.most_active_user(df) | |
col1, col2 = st.columns(2) | |
with col1: | |
fig = px.bar(x, x='User', y='Count') | |
fig.update_traces(marker_color=color_2) | |
st.plotly_chart(fig, use_container_width=True) | |
# st.bar_chart(x) | |
with col2: | |
st.dataframe(per) | |
# WordCloud | |
st.title("Word Cloud") | |
df_wc = helper.create_wordcloud(selected_user, df) | |
fig, ax = plt.subplots() | |
ax.imshow(df_wc) | |
ax.set_axis_off() | |
st.pyplot(fig) | |
# Most common words | |
most_common_df = helper.most_common_words(selected_user, df) | |
st.title("Most Common Words") | |
fig = px.bar(most_common_df, | |
x='Count', y='Message', orientation='h') | |
st.write(fig) | |
# Emoji Analysis | |
emoji_df = helper.emoji_data(selected_user, df) | |
st.title("Emoji Analysis") | |
col1, col2 = st.columns(2) | |
if emoji_df.empty: | |
with col1: | |
st.dataframe(emoji_df) | |
else: | |
with col1: | |
st.dataframe(emoji_df) | |
with col2: | |
fig = px.pie(emoji_df.head(10), values='Count', | |
names='Emoji', title='Top 10 Emojis') | |
st.plotly_chart(fig, use_container_width=True) | |
# Data Time Freame | |
st.title("Data Timeframe") | |
timeframe = helper.data_timeframe(df) | |
st.write(timeframe) | |
else: | |
st.write("In sidebar click on ___Show Analysis___ button...") | |
else: | |
st.write("Uploaded file doesn't match with the default format") | |
st.write("!!! Upload the correct file.") | |
else: | |
st.text("Go to Sidebar and Upload the file") | |
st.text("How to export Whatsapp chat:") | |
st.write("- Open the indivitual or group chat.") | |
st.write("- At the top-right Info (โฎ) -> More -> Export chat (Without Media).") | |
st.write("- Save that .txt file and upload it.") | |
st.sidebar.text("Made by Debamrita Paul") | |
st.sidebar.write("[Connect โคด](https://www.linkedin.com/in/imdebamritapaul/)") | |
hide_default_format = """ | |
<style> | |
footer {visibility: hidden;} | |
</style> | |
""" | |
st.markdown(hide_default_format, unsafe_allow_html=True) | |
custom_footer_style = """ | |
<style> | |
.footer { | |
position: fixed; | |
left: 0; | |
bottom: 0; | |
width: 100%; | |
background-color: #000; | |
color: #999; | |
text-align: center; | |
padding: 2.5px 0; | |
} | |
</style> | |
""" | |
def custom_footer(): | |
st.markdown('<div class="footer">Made By Debamrita Paul - 2023</div>', | |
unsafe_allow_html=True) | |
st.markdown(custom_footer_style, unsafe_allow_html=True) | |
custom_footer() | |