|
import streamlit as st |
|
import pandas as pd |
|
from datetime import date, datetime |
|
import plotly.express as px |
|
|
|
st.title('Visualize Your HDFC Bank Statement') |
|
st.write('Export your HDFC Bank statement as a XLS file and drop it here to analyze your expenses') |
|
st.write("Note: We don't store your data. It's all done locally on your machine") |
|
|
|
sample_statements = ["https://github.com/myselfshravan/Python/files/10087176/statement23.xls", |
|
"https://github.com/myselfshravan/Streamlit-Apps-Python/files/11287111/Acct.Statement_2022_Full.xls"] |
|
agree = st.checkbox('Use Sample Statement') |
|
if agree: |
|
uploaded_file = st.selectbox('Select Sample Statement', sample_statements) |
|
else: |
|
uploaded_file = st.file_uploader("Choose a xls formate file of HDFC Bank Statement", type="xls") |
|
|
|
if uploaded_file is not None: |
|
df = pd.read_excel(uploaded_file) |
|
df = df.iloc[21:-18] |
|
df = df.drop(df.columns[[0, 2]], axis=1) |
|
df = df.drop(df.index[1]) |
|
df = df.fillna(0) |
|
df.rename( |
|
columns={'Unnamed: 1': 'UPIs', 'Unnamed: 3': 'Date', 'Unnamed: 4': 'Withdrawal', 'Unnamed: 5': 'Deposited', |
|
'Unnamed: 6': 'Balance'}, |
|
inplace=True) |
|
|
|
df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%y').dt.date |
|
df['Withdrawal'] = df['Withdrawal'].apply(lambda x: "{:.1f}".format(x)).astype(float) |
|
df['Deposited'] = df['Deposited'].apply(lambda x: "{:.1f}".format(x)).astype(float) |
|
df['Balance'] = df['Balance'].astype(float) |
|
df['UPIs'] = df['UPIs'].astype(str) |
|
df['UPIs'] = df['UPIs'].str.split('@', expand=True)[0] |
|
df['UPIs'] = df['UPIs'].str.split('-', expand=True)[1] |
|
df.index = range(1, len(df) + 1) |
|
|
|
start_date = df['Date'].iloc[0].strftime("%B %d %Y") |
|
end_date = df['Date'].iloc[-1].strftime("%B %d %Y") |
|
|
|
start = datetime.strptime(df['Date'].iloc[0].strftime('%d/%m/%y'), '%d/%m/%y') |
|
end = datetime.strptime(df['Date'].iloc[-1].strftime('%d/%m/%y'), '%d/%m/%y') |
|
st.write(f"Statement Period: {start_date} to {end_date}") |
|
days = (end - start).days |
|
st.write(f"Number of Days: {days}") |
|
total_withdrawal = df['Withdrawal'].sum() |
|
total_deposit = df['Deposited'].sum() |
|
st.write(f"Total Withdrawal and Deposit: Rs {total_withdrawal} - Rs {total_deposit}") |
|
st.write(f"Closing and Opening Balance: {df['Balance'].iloc[0]} and {df['Balance'].iloc[-1]}") |
|
st.write(f"Total Transactions: {len(df)}") |
|
st.write(f"Average Withdrawal per day: {(total_withdrawal / days):.2f}") |
|
st.write(f"Average Withdrawal per month: {total_withdrawal / (days / 30):.2f}") |
|
time_frame = list(df['Date']) |
|
withdrawal = list(df['Withdrawal']) |
|
for i in range(1, len(withdrawal)): |
|
withdrawal[i] = withdrawal[i] + withdrawal[i - 1] |
|
deposited = list(df['Deposited']) |
|
for i in range(1, len(deposited)): |
|
deposited[i] = deposited[i] + deposited[i - 1] |
|
|
|
balance = list(df['Balance']) |
|
line = pd.DataFrame({'Balance': balance}, index=time_frame) |
|
st.subheader('Balance Trend') |
|
st.line_chart(line, use_container_width=True) |
|
|
|
|
|
|
|
|
|
|
|
st.dataframe(df, use_container_width=True) |
|
|
|
val = st.radio('Select', ('Withdrawal', 'Deposited')) |
|
if val == 'Withdrawal': |
|
withdraw_line = pd.DataFrame({'Withdrawal': withdrawal}, index=time_frame) |
|
st.subheader('Withdrawal Trend') |
|
st.line_chart(withdraw_line, use_container_width=True) |
|
fig = px.bar(df, x='Date', y='Withdrawal', title='Withdrawals') |
|
st.plotly_chart(fig, use_container_width=True) |
|
figs = px.scatter(df, x='Date', y='Withdrawal', color='UPIs', title='Withdrawals') |
|
st.plotly_chart(figs, use_container_width=True) |
|
elif val == 'Deposited': |
|
deposit_line = pd.DataFrame({'Deposited': deposited}, index=time_frame) |
|
st.subheader('Deposit Trend') |
|
st.line_chart(deposit_line, use_container_width=True) |
|
fig = px.bar(df, x='Date', y='Deposited', title='Deposits') |
|
st.plotly_chart(fig, use_container_width=True) |
|
figs = px.scatter(df, x='Date', y='Deposited', color='UPIs', title='Deposits') |
|
st.plotly_chart(figs, use_container_width=True) |
|
|
|
first_date = df['Date'].iloc[0] |
|
date_selected = st.date_input('Select Date', value=first_date) |
|
selected = df.loc[df['Date'] == date_selected] |
|
st.dataframe(selected, use_container_width=True) |
|
st.write("Total Withdrawals on", date_selected.strftime("%d %B"), "is", selected['Withdrawal'].sum()) |
|
st.write("Total Deposits on", date_selected.strftime("%d %B"), "is", selected['Deposited'].sum()) |
|
df['propdate'] = pd.to_datetime(df['Date']) |
|
month_selected = st.selectbox('Select Month', df['propdate'].dt.strftime('%B').unique()) |
|
year = st.selectbox('Select Year', df['propdate'].dt.strftime('%Y').unique()) |
|
selected_month = df.loc[ |
|
(df['propdate'].dt.strftime('%B') == month_selected) & (df['propdate'].dt.strftime('%Y') == year)] |
|
st.dataframe(selected_month, use_container_width=True) |
|
st.write("Total Withdrawals in", month_selected, "is", selected_month['Withdrawal'].sum()) |
|
st.write("Total Deposits in", month_selected, "is", selected_month['Deposited'].sum()) |
|
|
|
st.write("\n") |
|
st.subheader('Select a date range') |
|
start_range = df['Date'].iloc[0] |
|
end_range = df['Date'].iloc[-1] |
|
start_date = st.date_input('Start date', value=start_range) |
|
end_date = st.date_input('End date', value=end_range) |
|
mask = (df['Date'] >= start_date) & (df['Date'] <= end_date) |
|
df = df.loc[mask] |
|
st.dataframe(df, use_container_width=True) |
|
st.write(f'Total Deposited: Rs {df["Deposited"].sum()}') |
|
st.write(f'Total Withdrawal: Rs {df["Withdrawal"].sum()}') |
|
|
|
st.subheader('Total amount spent on each UPI') |
|
st.dataframe(df.groupby('UPIs')['Withdrawal'].sum().sort_values(ascending=False), use_container_width=True) |
|
|
|
st.subheader('Highest amount spent in one transaction') |
|
st.dataframe(df.loc[df['Withdrawal'].idxmax()], use_container_width=True) |
|
|
|
inday = df.groupby("Date")['Withdrawal'].sum().sort_values(ascending=False).head(1).index[0].strftime("%d %B") |
|
st.subheader(f'Highest amount spent in a day') |
|
amount = df.groupby("Date")['Withdrawal'].sum().sort_values(ascending=False).head(1).values[0] |
|
st.write(f'On {inday} : Rs {amount}') |
|
|
|
hide_streamlit_style = """ |
|
<style> |
|
# MainMenu {visibility: hidden;} |
|
footer {visibility: hidden;} |
|
footer:after { |
|
content:'Made with ❤️ by Shravan'; |
|
visibility: visible; |
|
display: block; |
|
position: relative; |
|
# background-color: red; |
|
padding: 15px; |
|
top: 2px; |
|
} |
|
</style> |
|
""" |
|
st.markdown(hide_streamlit_style, unsafe_allow_html=True) |
|
|