Heavylight CSV table designer for actuarial models
To upload files, please first save the app
import streamlit as st
import pandas as pd
import numpy as np
from st_aggrid import AgGrid, GridOptionsBuilder
from st_aggrid.shared import GridUpdateMode
st.title("Heavy/Light CSV Table Designer")
st.write("Design actuarial heavy/light tables with this interactive tool")
# Initialize session state for the table
if 'table_data' not in st.session_state:
# Create initial data with age and qx columns
initial_data = pd.DataFrame({
'age': range(0, 100),
'qx': [0.0] * 100,
'heavy_factor': [1.0] * 100
})
st.session_state.table_data = initial_data
# Sidebar controls
with st.sidebar:
st.header("Table Controls")
# Add new multiplier controls
st.subheader("Apply Multiplier")
age_range = st.slider("Age Range", 0, 99, (0, 99), 1)
multiplier = st.number_input("Multiplier", min_value=0.0, value=1.0, step=0.1)
if st.button("Apply Multiplier"):
mask = (st.session_state.table_data['age'] >= age_range[0]) & \
(st.session_state.table_data['age'] <= age_range[1])
st.session_state.table_data.loc[mask, 'qx'] *= multiplier
# Export options
st.subheader("Export Options")
if st.button("Export to CSV"):
csv = st.session_state.table_data.to_csv(index=False)
st.download_button(
label="Download CSV",
data=csv,
file_name="mortality_table.csv",
mime="text/csv"
)
# Main area
st.subheader("Mortality Table Editor")
# Configure grid options
gb = GridOptionsBuilder.from_dataframe(st.session_state.table_data)
gb.configure_column("age", editable=False)
gb.configure_column("qx", editable=True, type=["numericColumn", "numberColumnFilter"])
gb.configure_column("heavy_factor", editable=True, type=["numericColumn", "numberColumnFilter"])
gb.configure_grid_options(enableRangeSelection=True)
grid_options = gb.build()
# Create the editable grid
grid_response = AgGrid(
st.session_state.table_data,
gridOptions=grid_options,
height=600,
data_return_mode='AS_INPUT',
update_mode=GridUpdateMode.VALUE_CHANGED,
fit_columns_on_grid_load=True
)
# Update session state with edited data
st.session_state.table_data = grid_response['data']
# Calculate and display heavy rates
st.subheader("Heavy Rates")
heavy_rates = st.session_state.table_data.copy()
heavy_rates['heavy_qx'] = heavy_rates['qx'] * heavy_rates['heavy_factor']
# Display summary statistics
st.subheader("Summary Statistics")
col1, col2 = st.columns(2)
with col1:
st.write("Light Table Statistics")
st.write(heavy_rates['qx'].describe())
with col2:
st.write("Heavy Table Statistics")
st.write(heavy_rates['heavy_qx'].describe())
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?