akazmi commited on
Commit
da94df9
·
verified ·
1 Parent(s): 89c5ad8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +114 -112
app.py CHANGED
@@ -1,120 +1,122 @@
1
  import streamlit as st
2
  import pandas as pd
3
  import plotly.express as px
 
4
  import random
5
  from datetime import datetime, timedelta
6
 
7
- # Sample Data Generation (You can remove this part when uploading your own file)
8
- def generate_sample_data():
9
- customers = ['Customer A', 'Customer B', 'Customer C', 'Customer D']
10
- products = ['Product 1', 'Product 2', 'Product 3', 'Product 4']
11
- cities = ['City 1', 'City 2', 'City 3', 'City 4']
12
- states = ['State 1', 'State 2', 'State 3', 'State 4']
13
- countries = ['Country 1', 'Country 2', 'Country 3', 'Country 4']
14
-
15
- # Generate sample sales data for 100 records
16
- data = []
17
- for i in range(100):
18
- customer = random.choice(customers)
19
- product = random.choice(products)
20
- city = random.choice(cities)
21
- state = random.choice(states)
22
- country = random.choice(countries)
23
- date = datetime.today() - timedelta(days=random.randint(1, 365))
24
- nsv = random.randint(1000, 10000) # Net Sales Value
25
- cost = random.randint(500, 7000) # Cost
26
- data.append([customer, product, city, state, country, date, nsv, cost])
27
-
28
- columns = ['Customer Name', 'Product Name', 'City', 'State', 'Country', 'Date', 'Net Sales Value', 'Cost']
29
- return pd.DataFrame(data, columns=columns)
30
-
31
- # Load sample data
32
- df = generate_sample_data()
33
-
34
- # Data Preprocessing
35
- df['Date'] = pd.to_datetime(df['Date'])
36
- df['Year'] = df['Date'].dt.year
37
- df['Month'] = df['Date'].dt.month
38
-
39
- # Sidebar Filters
40
- st.sidebar.header("Filter Options")
41
-
42
- # Text Input for Customer and Product
43
- customer_query = st.sidebar.text_input('Enter Customer Name (partial or full):').strip().lower()
44
- product_query = st.sidebar.text_input('Enter Product Name (partial or full):').strip().lower()
45
- city_query = st.sidebar.text_input('Enter City (partial or full):').strip().lower()
46
- state_query = st.sidebar.text_input('Enter State (partial or full):').strip().lower()
47
- country_query = st.sidebar.text_input('Enter Country (partial or full):').strip().lower()
48
-
49
- # Date Range Selection
50
- start_date = st.sidebar.date_input('Start Date:', df['Date'].min())
51
- end_date = st.sidebar.date_input('End Date:', df['Date'].max())
52
-
53
- # Filter Data by Date Range
54
- filtered_df = df[
55
- (df['Date'] >= pd.to_datetime(start_date)) &
56
- (df['Date'] <= pd.to_datetime(end_date))
57
- ]
58
-
59
- # Filter Data by Customer Name
60
- if customer_query:
61
- filtered_df = filtered_df[filtered_df['Customer Name'].str.contains(customer_query, case=False, na=False)]
62
-
63
- # Filter Data by Product Name
64
- if product_query:
65
- filtered_df = filtered_df[filtered_df['Product Name'].str.contains(product_query, case=False, na=False)]
66
-
67
- # Filter Data by City
68
- if city_query:
69
- filtered_df = filtered_df[filtered_df['City'].str.contains(city_query, case=False, na=False)]
70
-
71
- # Filter Data by State
72
- if state_query:
73
- filtered_df = filtered_df[filtered_df['State'].str.contains(state_query, case=False, na=False)]
74
-
75
- # Filter Data by Country
76
- if country_query:
77
- filtered_df = filtered_df[filtered_df['Country'].str.contains(country_query, case=False, na=False)]
78
-
79
- # Add 'Net Sales Value - Cost' as a new column
80
- filtered_df['Net Sales Value - Cost'] = filtered_df['Net Sales Value'] - filtered_df['Cost']
81
-
82
- # Display Filtered Data
83
- st.write(f"Filtered Data: {len(filtered_df)} records found.")
84
- st.dataframe(filtered_df)
85
-
86
- if not filtered_df.empty:
87
- # KPI Metrics
88
- st.subheader("Key Financial Metrics")
89
-
90
- # Profit for the Year (Calculated as Net Sales Value - Cost)
91
- profit_for_the_year = filtered_df['Net Sales Value'] - filtered_df['Cost']
92
- st.metric("Profit for the Year", f"${profit_for_the_year.sum():,.2f}")
93
-
94
- # Gross Margin (Net Sales Value - Cost)
95
- gross_margin = filtered_df['Net Sales Value'] - filtered_df['Cost']
96
- st.metric("Gross Margin", f"${gross_margin.sum():,.2f}")
97
-
98
- # Total Sales
99
- total_sales = filtered_df['Net Sales Value'].sum()
100
- st.metric("Total Sales", f"${total_sales:,.2f}")
101
-
102
- # Matrix View (like Power BI Matrix)
103
- st.subheader("Matrix View of Financial Data")
104
- matrix_data = filtered_df.pivot_table(
105
- values='Net Sales Value',
106
- index=['Year', 'Customer Name'],
107
- columns=['Product Name'],
108
- aggfunc='sum',
109
- fill_value=0
110
- )
111
- st.dataframe(matrix_data)
112
-
113
- # Visualization 4: Profit and Loss Overview (Simple Table)
114
- st.subheader("Profit and Loss Overview")
115
- pnl_data = filtered_df[['Customer Name', 'Product Name', 'Net Sales Value', 'Cost', 'Net Sales Value - Cost']]
116
- pnl_data.columns = ['Customer', 'Product', 'Sales', 'Cost', 'Profit']
117
- st.dataframe(pnl_data)
118
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  else:
120
- st.write("No data available for the selected filters.")
 
1
  import streamlit as st
2
  import pandas as pd
3
  import plotly.express as px
4
+ import plotly.graph_objects as go
5
  import random
6
  from datetime import datetime, timedelta
7
 
8
+ # File upload functionality
9
+ st.sidebar.header("Upload Data")
10
+ uploaded_file = st.sidebar.file_uploader("Choose a CSV file", type=["csv"])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
 
12
+ # Check if file is uploaded
13
+ if uploaded_file is not None:
14
+ # Load the data
15
+ df = pd.read_csv(uploaded_file)
16
+
17
+ # Convert Date to datetime format if it's in string format
18
+ if 'Date' in df.columns:
19
+ df['Date'] = pd.to_datetime(df['Date'])
20
+
21
+ # Add 'Year' and 'Month' columns for easy filtering and analysis
22
+ df['Year'] = df['Date'].dt.year
23
+ df['Month'] = df['Date'].dt.month
24
+
25
+ # Sidebar Filters
26
+ st.sidebar.header("Filter Options")
27
+
28
+ # Text Input for Customer and Product
29
+ customer_query = st.sidebar.text_input('Enter Customer Name (partial or full):').strip().lower()
30
+ product_query = st.sidebar.text_input('Enter Product Name (partial or full):').strip().lower()
31
+ city_query = st.sidebar.text_input('Enter City (partial or full):').strip().lower()
32
+ state_query = st.sidebar.text_input('Enter State (partial or full):').strip().lower()
33
+ country_query = st.sidebar.text_input('Enter Country (partial or full):').strip().lower()
34
+
35
+ # Date Range Selection
36
+ start_date = st.sidebar.date_input('Start Date:', df['Date'].min())
37
+ end_date = st.sidebar.date_input('End Date:', df['Date'].max())
38
+
39
+ # Filter Data by Date Range
40
+ filtered_df = df[
41
+ (df['Date'] >= pd.to_datetime(start_date)) &
42
+ (df['Date'] <= pd.to_datetime(end_date))
43
+ ]
44
+
45
+ # Filter Data by Customer Name
46
+ if customer_query:
47
+ filtered_df = filtered_df[filtered_df['Customer Name'].str.contains(customer_query, case=False, na=False)]
48
+
49
+ # Filter Data by Product Name
50
+ if product_query:
51
+ filtered_df = filtered_df[filtered_df['Product Name'].str.contains(product_query, case=False, na=False)]
52
+
53
+ # Filter Data by City
54
+ if city_query:
55
+ filtered_df = filtered_df[filtered_df['City'].str.contains(city_query, case=False, na=False)]
56
+
57
+ # Filter Data by State
58
+ if state_query:
59
+ filtered_df = filtered_df[filtered_df['State'].str.contains(state_query, case=False, na=False)]
60
+
61
+ # Filter Data by Country
62
+ if country_query:
63
+ filtered_df = filtered_df[filtered_df['Country'].str.contains(country_query, case=False, na=False)]
64
+
65
+ # Add 'Net Sales Value - Cost' as a new column
66
+ filtered_df['Net Sales Value - Cost'] = filtered_df['Net Sales Value'] - filtered_df['Cost']
67
+
68
+ # Display Filtered Data
69
+ st.write(f"Filtered Data: {len(filtered_df)} records found.")
70
+ st.dataframe(filtered_df)
71
+
72
+ if not filtered_df.empty:
73
+ # KPI Metrics
74
+ st.subheader("Key Financial Metrics")
75
+
76
+ # Profit for the Year (Calculated as Net Sales Value - Cost)
77
+ profit_for_the_year = filtered_df['Net Sales Value'] - filtered_df['Cost']
78
+ st.metric("Profit for the Year", f"${profit_for_the_year.sum():,.2f}")
79
+
80
+ # Gross Margin (Net Sales Value - Cost)
81
+ gross_margin = filtered_df['Net Sales Value'] - filtered_df['Cost']
82
+ st.metric("Gross Margin", f"${gross_margin.sum():,.2f}")
83
+
84
+ # Total Sales
85
+ total_sales = filtered_df['Net Sales Value'].sum()
86
+ st.metric("Total Sales", f"${total_sales:,.2f}")
87
+
88
+ # Visualization 1: Profit and Loss Overview (Table)
89
+ st.subheader("Profit and Loss Overview")
90
+ pnl_data = filtered_df[['Customer Name', 'Product Name', 'Net Sales Value', 'Cost', 'Net Sales Value - Cost']]
91
+ pnl_data.columns = ['Customer', 'Product', 'Sales', 'Cost', 'Profit']
92
+ st.dataframe(pnl_data)
93
+
94
+ # Visualization 2: Matrix View (like Power BI Matrix)
95
+ st.subheader("Matrix View of Financial Data")
96
+ matrix_data = filtered_df.pivot_table(
97
+ values='Net Sales Value',
98
+ index=['Year', 'Customer Name'],
99
+ columns=['Product Name'],
100
+ aggfunc='sum',
101
+ fill_value=0
102
+ )
103
+ st.dataframe(matrix_data)
104
+
105
+ # Visualization 3: Sales Trend over Time
106
+ st.subheader("Sales Trend over Time")
107
+ sales_trend = filtered_df.groupby(['Year', 'Month'])['Net Sales Value'].sum().reset_index()
108
+ fig = px.line(sales_trend, x='Month', y='Net Sales Value', color='Year', title="Sales Trend over Time")
109
+ st.plotly_chart(fig)
110
+
111
+ # Visualization 4: Profit Margin Visualization (Bar Chart)
112
+ st.subheader("Profit Margin per Product")
113
+ profit_margin_data = filtered_df.groupby('Product Name').apply(
114
+ lambda x: (x['Net Sales Value'] - x['Cost']).sum() / x['Net Sales Value'].sum()
115
+ ).reset_index(name="Profit Margin")
116
+ fig = px.bar(profit_margin_data, x='Product Name', y='Profit Margin', title="Profit Margin per Product")
117
+ st.plotly_chart(fig)
118
+
119
+ else:
120
+ st.write("No data available for the selected filters.")
121
  else:
122
+ st.write("Please upload a CSV file to get started.")