@@ -21,90 +21,84 @@ def __init__(self, config):
2121
2222 def print_trial_results (self ):
2323 print ("Trial Results" )
24- print (self .df_trial_results .mean ())
24+ output_means = self .df_trial_results .mean ().to_frame ()
25+ output_means ['Time' ]= output_means .index .str .split ('_' ).str [- 1 ]
26+ output_means .index = output_means .index .str .rsplit ('_' , n = 1 ).str [0 ]
27+ reshaped_trial_results = output_means .pivot (columns = 'Time' , values = 0 )
28+ print (reshaped_trial_results )
29+ print (reshaped_trial_results .diff (axis = 1 )) ### could use for plotting mortality over time instead of cumulative mortality
2530
2631 def setup_trial_results (self ):
2732 df_trial_results = pd .DataFrame ()
2833 df_trial_results ["Run Number" ] = [0 ]
2934 df_trial_results .set_index ("Run Number" , inplace = True )
3035 return df_trial_results
36+
37+ def process_model_results (self ,model ,run ):
38+
39+ self .df_trial_results .loc [run , "total_entries" ] = model .results_df ["entry_time" ].count ()
40+ self .df_trial_results .loc [run , "prevalence_con_care" ] = model .results_df ["diverted_to_con_care" ].sum ()
41+ self .df_trial_results .loc [run , "prevalence_ichd" ] = model .results_df ["ichd_dialysis_count" ].sum ()
42+ self .df_trial_results .loc [run , "prevalence_hhd" ] = model .results_df ["hhd_dialysis_count" ].sum ()
43+ self .df_trial_results .loc [run , "prevalence_pd" ] = model .results_df ["pd_dialysis_count" ].sum ()
44+ self .df_trial_results .loc [run , "prevalence_live_Tx" ] = model .results_df ["live_transplant_count" ].sum ()
45+ self .df_trial_results .loc [run , "prevalence_cadaver_Tx" ] = model .results_df ["cadaver_transplant_count" ].sum ()
46+
47+ self .df_trial_results .loc [run , "total_deaths" ] = model .results_df ["time_of_death" ].count ()
48+ self .df_trial_results .loc [run , "mortality_con_care" ] = model .results_df ["death_from_con_care" ].sum ()
49+ self .df_trial_results .loc [run , "mortality_ichd" ] = model .results_df ["death_from_ichd" ].sum ()
50+ self .df_trial_results .loc [run , "mortality_hhd" ] = model .results_df ["death_from_hhd" ].sum ()
51+ self .df_trial_results .loc [run , "mortality_pd" ] = model .results_df ["death_from_pd" ].sum ()
52+ self .df_trial_results .loc [run , "mortality_live_Tx" ] = model .results_df ["death_post_live_transplant" ].sum ()
53+ self .df_trial_results .loc [run , "mortality_cadaver_Tx" ] = model .results_df ["death_post_cadaver_transplant" ].sum ()
54+
55+ def process_snapshot_results (self ,model ,run ):
56+ ## this groups the results by the time the snapshot was taken, so we can see how prevalence and mortality change over time
57+ results_grouped_by_time = (
58+ model .snapshot_results_df .groupby ("snapshot_time" )
59+ .agg (
60+ {
61+ "entry_time" : "count" ,
62+ "diverted_to_con_care" : "sum" ,
63+ "ichd_dialysis_count" : "sum" ,
64+ "hhd_dialysis_count" : "sum" ,
65+ "pd_dialysis_count" : "sum" ,
66+ "live_transplant_count" : "sum" ,
67+ "cadaver_transplant_count" : "sum" ,
68+ "time_of_death" : "count" ,
69+ "death_from_con_care" : "sum" ,
70+ "death_from_ichd" : "sum" ,
71+ "death_from_hhd" : "sum" ,
72+ "death_from_pd" : "sum" ,
73+ "death_post_live_transplant" : "count" ,
74+ "death_post_cadaver_transplant" : "count" ,
75+ }
76+ )
77+ .rename (columns = {"entry_time" : "total_entries" ,"time_of_death" : "total_deaths" })
78+ )
79+
80+ for snapshot_time in results_grouped_by_time .index :
81+ self .df_trial_results .loc [run , f"total_entries_{ snapshot_time } " ] = results_grouped_by_time .loc [snapshot_time , "total_entries" ]
82+ self .df_trial_results .loc [run , f"prevalence_con_care_{ snapshot_time } " ] = results_grouped_by_time .loc [snapshot_time , "diverted_to_con_care" ]
83+ self .df_trial_results .loc [run , f"prevalence_ichd_{ snapshot_time } " ] = results_grouped_by_time .loc [snapshot_time , "ichd_dialysis_count" ]
84+ self .df_trial_results .loc [run , f"prevalence_hhd_{ snapshot_time } " ] = results_grouped_by_time .loc [snapshot_time , "hhd_dialysis_count" ]
85+ self .df_trial_results .loc [run , f"prevalence_pd_{ snapshot_time } " ] = results_grouped_by_time .loc [snapshot_time , "pd_dialysis_count" ]
86+ self .df_trial_results .loc [run , f"prevalence_live_Tx_{ snapshot_time } " ] = results_grouped_by_time .loc [snapshot_time , "live_transplant_count" ]
87+ self .df_trial_results .loc [run , f"prevalence_cadaver_Tx_{ snapshot_time } " ] = results_grouped_by_time .loc [snapshot_time , "cadaver_transplant_count" ]
88+ self .df_trial_results .loc [run , f"total_deaths_{ snapshot_time } " ] = results_grouped_by_time .loc [snapshot_time , "total_deaths" ]
89+ self .df_trial_results .loc [run , f"mortality_con_care_{ snapshot_time } " ] = results_grouped_by_time .loc [snapshot_time , "death_from_con_care" ]
90+ self .df_trial_results .loc [run , f"mortality_ichd_{ snapshot_time } " ] = results_grouped_by_time .loc [snapshot_time , "death_from_ichd" ]
91+ self .df_trial_results .loc [run , f"mortality_hhd_{ snapshot_time } " ] = results_grouped_by_time .loc [snapshot_time , "death_from_hhd" ]
92+ self .df_trial_results .loc [run , f"mortality_pd_{ snapshot_time } " ] = results_grouped_by_time .loc [snapshot_time , "death_from_pd" ]
93+ self .df_trial_results .loc [run , f"mortality_live_Tx_{ snapshot_time } " ] = results_grouped_by_time .loc [snapshot_time , "death_post_live_transplant" ]
94+ self .df_trial_results .loc [run , f"mortality_cadaver_Tx_{ snapshot_time } " ] = results_grouped_by_time .loc [snapshot_time , "death_post_cadaver_transplant" ]
3195
3296 def run_trial (self ):
3397 for run in range (self .config .number_of_runs ):
3498 model = Model (run , self .rng , self .config )
3599 model .run ()
36- # Process results. Consider moving to separate function if it gets too complex
37- results_grouped_by_age = (
38- model .results_df .groupby ("age_group" )
39- .agg (
40- {
41- "diverted_to_con_care" : "sum" ,
42- "entry_time" : "count" ,
43- "suitable_for_transplant" : "sum" ,
44- "live_transplant_count" : "sum" ,
45- "cadaver_transplant_count" : "sum" ,
46- "pre_emptive_transplant" : "sum" ,
47- }
48- )
49- .rename (columns = {"entry_time" : "total_entries" })
50- )
51- self .df_trial_results .loc [run , "total_entries" ] = results_grouped_by_age [
52- "total_entries"
53- ].sum ()
54- self .df_trial_results .loc [run , "diverted_to_con_care" ] = (
55- results_grouped_by_age ["diverted_to_con_care" ].sum ()
56- )
57- for age_group in results_grouped_by_age .index :
58- self .df_trial_results .loc [
59- run , f"diverted_to_con_care_{ int (age_group )} "
60- ] = (
61- results_grouped_by_age .loc [age_group , "diverted_to_con_care" ]
62- / results_grouped_by_age .loc [age_group , "total_entries" ]
63- )
64-
65- self .df_trial_results .loc [run , "suitable_for_transplant" ] = (
66- results_grouped_by_age ["suitable_for_transplant" ].sum ()
67- )
68- self .df_trial_results .loc [run , "proportion_suitable_for_transplant" ] = (
69- results_grouped_by_age ["suitable_for_transplant" ].sum ()
70- / results_grouped_by_age ["total_entries" ].sum ()
71- )
72- for age_group in results_grouped_by_age .index :
73- self .df_trial_results .loc [
74- run , f"suitable_for_transplant_{ int (age_group )} "
75- ] = (
76- results_grouped_by_age .loc [age_group , "suitable_for_transplant" ]
77- / results_grouped_by_age .loc [age_group , "total_entries" ]
78- )
79- self .df_trial_results .loc [run , "pre_emptive_transplant" ] = (
80- results_grouped_by_age ["pre_emptive_transplant" ].sum ()
81- )
82- self .df_trial_results .loc [run , "proportion_pre_emptive_transplant" ] = (
83- results_grouped_by_age ["pre_emptive_transplant" ].sum ()
84- / results_grouped_by_age ["total_entries" ].sum ()
85- )
86- for age_group in results_grouped_by_age .index :
87- self .df_trial_results .loc [
88- run , f"pre_emptive_transplant_{ int (age_group )} "
89- ] = (
90- results_grouped_by_age .loc [age_group , "pre_emptive_transplant" ]
91- / results_grouped_by_age .loc [age_group , "total_entries" ]
92- )
93- self .df_trial_results .loc [
94- run , "proportion_live_transplant"
95- ] = results_grouped_by_age ["live_transplant_count" ].sum () / (
96- results_grouped_by_age ["live_transplant_count" ].sum ()
97- + results_grouped_by_age ["cadaver_transplant_count" ].sum ()
98- )
99- for age_group in results_grouped_by_age .index :
100- self .df_trial_results .loc [run , f"live_transplants_{ int (age_group )} " ] = (
101- results_grouped_by_age .loc [age_group , "live_transplant_count" ]
102- )
103- for age_group in results_grouped_by_age .index :
104- self .df_trial_results .loc [
105- run , f"cadaver_transplants_{ int (age_group )} "
106- ] = results_grouped_by_age .loc [age_group , "cadaver_transplant_count" ]
107- for k , v in model .patients_in_system .items ():
108- self .df_trial_results .loc [run , k ] = v
100+
101+ model .snapshot_results_df = pd .concat ([model .snapshot_results_df , model .results_df .assign (snapshot_time = model .config .sim_duration )])
102+ self .process_snapshot_results (model ,run )
109103
110104 self .print_trial_results ()
0 commit comments