the app filters dataframe data about invoices using menu with date picker selecting a date interval
To upload files, please first save the app
import streamlit as st
import pandas as pd
from datetime import datetime, timedelta
# Generate sample invoice data
def generate_sample_data():
# Create date range for last 60 days
end_date = datetime.now()
start_date = end_date - timedelta(days=60)
dates = pd.date_range(start_date, end_date, freq='D')
# Generate random invoice data
data = {
'Date': [date.date() for date in dates],
'Invoice_Number': [f'INV-{i:04d}' for i in range(1, len(dates) + 1)],
'Customer': [f'Customer {i}' for i in range(1, len(dates) + 1)],
'Amount': [round(pd.np.random.uniform(100, 5000), 2) for _ in range(len(dates))],
'Status': pd.np.random.choice(['Paid', 'Pending', 'Overdue'], size=len(dates))
}
return pd.DataFrame(data)
# Initialize session state for data persistence
if 'df' not in st.session_state:
st.session_state.df = generate_sample_data()
st.title('Invoice Data Filter')
# Date filter sidebar
st.sidebar.header('Date Filter')
# Get min and max dates from the DataFrame
min_date = st.session_state.df['Date'].min()
max_date = st.session_state.df['Date'].max()
# Date input widgets
start_date = st.sidebar.date_input('Start Date', min_date, min_value=min_date, max_value=max_date)
end_date = st.sidebar.date_input('End Date', max_date, min_value=min_date, max_value=max_date)
# Filter data based on date range
mask = (st.session_state.df['Date'] >= start_date) & (st.session_state.df['Date'] <= end_date)
filtered_df = st.session_state.df.loc[mask]
# Display metrics
total_invoices = len(filtered_df)
total_amount = filtered_df['Amount'].sum()
col1, col2 = st.columns(2)
with col1:
st.metric('Total Invoices', total_invoices)
with col2:
st.metric('Total Amount', f'${total_amount:,.2f}')
# Display filtered DataFrame
st.subheader('Filtered Invoice Data')
st.dataframe(filtered_df, use_container_width=True)
# Show status distribution
st.subheader('Invoice Status Distribution')
status_counts = filtered_df['Status'].value_counts()
st.bar_chart(status_counts)
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?