|
import pandas as pd |
|
import streamlit as st |
|
import plotly.graph_objects as go |
|
from ASDM.ASDM import Structure |
|
|
|
def load_model(model_path): |
|
try: |
|
model = Structure(from_xmile=model_path) |
|
except FileNotFoundError: |
|
st.error(f"File {model_path} not found.") |
|
return None |
|
return model |
|
|
|
def run_simulation(model, simulation_time, re_investment): |
|
model.sim_specs['initial_time'] = 0 |
|
model.sim_specs['current_time'] = 0 |
|
model.sim_specs['dt'] = 1 |
|
model.sim_specs['simulation_time'] = simulation_time |
|
model.sim_specs['time_units'] = 'Months' |
|
|
|
model.clear_last_run() |
|
|
|
model.replace_element_equation('Percentage_of_savings_spent_on_cessation', re_investment) |
|
|
|
model.simulate() |
|
|
|
results = model.export_simulation_result() |
|
results_df = pd.DataFrame.from_dict(results) |
|
|
|
columns_to_plot = ["Current_smokers", "Ex_smokers", "Ex_smokers_starting_again"] |
|
return results_df['Months'], results_df[columns_to_plot] |
|
|
|
st.title('Smoking Cessation') |
|
|
|
st.markdown(""" |
|
This simulation estimates the effects of various reinvestment levels in a smoking cessation service within a population of 900 smokers. |
|
By varying the proportion of savings that are reinvested into the service, we can observe different outcomes in terms of current smokers, ex-smokers, |
|
and ex-smokers who start smoking again over time. |
|
""") |
|
|
|
st.subheader('Slide the Slider to Vary Re-Investment Levels') |
|
|
|
model = load_model('smoking cessation demo.stmx') |
|
|
|
if model is not None: |
|
re_investment = st.slider("Proportion of Savings Spent on Cessation", 0, 100, 45) |
|
simulation_time = st.slider("Select the number of months to simulate:", min_value=1, max_value=36, value=24) |
|
|
|
x_values, y_values = run_simulation(model, simulation_time, re_investment) |
|
|
|
st.subheader('Effects of Re-Investment on Smoking Levels') |
|
|
|
fig = go.Figure() |
|
for column in y_values.columns: |
|
fig.add_trace(go.Scatter(x=x_values, y=y_values[column], mode='lines', name=column)) |
|
fig.update_layout(xaxis_title='Months', yaxis_title='Number of Smokers', autosize=False, width=800, height=500) |
|
st.plotly_chart(fig) |