File size: 7,189 Bytes
ac82435
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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)

    # fig = px.line(df, x='Date', y='Balance', title='Balance Trend', color_discrete_sequence=['#1f77b4'],
    #               template='plotly_white', labels={'Date': 'Date', 'Balance': 'Balance'},
    #               hover_data={'Date': False, 'Balance': ':.2f'})
    # st.plotly_chart(fig, 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)