To upload files, please first save the app
import streamlit as st
import numpy as np
import pandas as pd
from st_aggrid import AgGrid, GridOptionsBuilder
@st.cache_data()
def generate_sales_data():
"""Generate dataset simulating sales data."""
np.random.seed(42)
rows = 50
# Create a more complex dataset
df = pd.DataFrame({
'Product ID': range(1, rows + 1),
'Category': np.random.choice(['Electronics', 'Clothing', 'Home', 'Sports'], rows),
'Base Price': np.random.uniform(10, 500, rows).round(2),
'Quantity Sold': np.random.randint(1, 100, rows),
})
return df
def configure_grid_options(df):
"""Configure advanced grid options with multiple features."""
gb = GridOptionsBuilder.from_dataframe(df)
# Make some columns editable
gb.configure_columns(['Base Price', 'Quantity Sold'], editable=True)
# Add virtual columns
gb.configure_column(
'Total Revenue',
valueGetter="Number(data['Base Price']) * Number(data['Quantity Sold'])",
cellRenderer="agAnimateShowChangeCellRenderer",
type=["numericColumn"],
editable=False,
valueFormatter="x.toLocaleString('en-US', {style: 'currency', currency: 'USD'})"
)
# Add conditional styling
gb.configure_column(
'Total Revenue',
cellStyle={
'styleConditions': [{
'condition': "x > 5000",
'style': {'backgroundColor': '#90EE90'} # Light green for high revenue
}]
}
)
return gb.build()
def main():
# Generate data
sales_data = generate_sales_data()
# Configure grid options
grid_options = configure_grid_options(sales_data)
st.subheader('Interactive Sales Data Grid')
st.markdown("""
**Features:**
- Edit Base Price and Quantity Sold
- Automatic Total Revenue calculation
- Conditional styling for high-revenue items
- Grouping and aggregation by Category
""")
# AgGrid with custom options
ag_return = AgGrid(
sales_data,
gridOptions=grid_options,
height=500,
theme='alpine',
allow_unsafe_jscode=True,
fit_columns_on_grid_load=True,
reload_data=False
)
if __name__ == '__main__':
main()
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?