@@ -78,8 +78,8 @@ def __init__(self, p: Parameters):
78
78
p .n_days ,
79
79
)
80
80
dispositions_df = build_dispositions_df (raw_df , rates , p .market_share )
81
- admits_df = build_admits_df (dispositions_df )
82
- census_df = build_census_df (admits_df , lengths_of_stay )
81
+ admits_df = build_admits_df (dispositions_df , p . n_days_since_first_hospitalized )
82
+ census_df = build_census_df (admits_df , lengths_of_stay , p . n_days_since_first_hospitalized )
83
83
84
84
self .susceptible = susceptible
85
85
self .infected = infected
@@ -112,8 +112,8 @@ def __init__(self, p: Parameters):
112
112
argmin_dt = dt
113
113
self .census_df = censes [dt ]
114
114
p .doubling_time = argmin_dt
115
- #
116
- # update all state dependent on doubling time.
115
+
116
+ # update all state that is dependent on doubling time.
117
117
intrinsic_growth_rate = self ._intrinsic_growth_rate (p .doubling_time )
118
118
gamma = 1 / recovery_days
119
119
beta = self ._beta (intrinsic_growth_rate , gamma , susceptible , p .relative_contact_rate )
@@ -129,8 +129,8 @@ def __init__(self, p: Parameters):
129
129
p .n_days
130
130
)
131
131
dispositions_df = build_dispositions_df (raw_df , rates , p .market_share )
132
- admits_df = build_admits_df (dispositions_df )
133
- census_df = build_census_df (admits_df , lengths_of_stay )
132
+ admits_df = build_admits_df (dispositions_df , p . n_days_since_first_hospitalized )
133
+ census_df = build_census_df (admits_df , lengths_of_stay , p . n_days_since_first_hospitalized )
134
134
135
135
self .intrinsic_growth_rate = intrinsic_growth_rate
136
136
self .gamma = gamma
@@ -167,9 +167,21 @@ def run_projection(self, p: Parameters, doubling_time: float) -> pd.DataFrame:
167
167
168
168
raw_df = sim_sir_df (S ,I ,R ,beta ,gamma ,n_days )
169
169
170
- dispositions_df = build_dispositions_df (raw_df , self ._rates , p .market_share )
171
- admits_df = build_admits_df (dispositions_df )
172
- census_df = build_census_df (admits_df , self ._lengths_of_stay )
170
+ # dispositions_df = build_dispositions_df(raw_df, self._rates, p.market_share)
171
+
172
+ i_dict_v = get_dispositions (raw_df .infected , self ._rates , market_share )
173
+ r_dict_v = get_dispositions (raw_df .recovered , self ._rates , market_share )
174
+
175
+ dispositions = {
176
+ key : value + r_dict_v [key ]
177
+ for key , value in i_dict_v .items ()
178
+ }
179
+
180
+ dispositions_df = pd .DataFrame (dispositions )
181
+ dispositions_df = dispositions_df .assign (day = dispositions_df .index )
182
+
183
+ admits_df = build_admits_df (dispositions_df , p .n_days_since_first_hospitalized )
184
+ census_df = build_census_df (admits_df , self ._lengths_of_stay , p .n_days_since_first_hospitalized )
173
185
return census_df
174
186
175
187
def loss_dt (self , p : Parameters ) -> float :
@@ -245,6 +257,19 @@ def sim_sir_df(
245
257
columns = ("day" , "susceptible" , "infected" , "recovered" ),
246
258
)
247
259
260
+
261
+ def get_dispositions (
262
+ patients : np .ndarray ,
263
+ rates : Dict [str , float ],
264
+ market_share : float ,
265
+ ) -> Dict [str , np .ndarray ]:
266
+ """Get dispositions of patients adjusted by rate and market_share."""
267
+ return {
268
+ key : patients * rate * market_share
269
+ for key , rate in rates .items ()
270
+ }
271
+
272
+
248
273
def build_dispositions_df (
249
274
sim_sir_df : pd .DataFrame ,
250
275
rates : Dict [str , float ],
@@ -261,16 +286,20 @@ def build_dispositions_df(
261
286
})
262
287
263
288
264
- def build_admits_df (dispositions_df : pd .DataFrame ) -> pd .DataFrame :
289
+ def build_admits_df (dispositions_df : pd .DataFrame , n_days_since_first_hospitalized : int ) -> pd .DataFrame :
265
290
"""Build admits dataframe from dispositions."""
266
291
admits_df = dispositions_df .iloc [:- 1 , :] - dispositions_df .shift (1 )
267
- admits_df .day = dispositions_df .day
292
+ if n_days_since_first_hospitalized is not None :
293
+ admits_df .day = dispositions_df .day - n_days_since_first_hospitalized
294
+ else :
295
+ admits_df .day = dispositions_df .day
268
296
return admits_df
269
297
270
298
271
299
def build_census_df (
272
300
admits_df : pd .DataFrame ,
273
301
lengths_of_stay : Dict [str , int ],
302
+ n_days_since_first_hospitalized : int
274
303
) -> pd .DataFrame :
275
304
"""Average Length of Stay for each disposition of COVID-19 case (total guesses)"""
276
305
return pd .DataFrame ({
@@ -285,30 +314,6 @@ def build_census_df(
285
314
})
286
315
287
316
288
- ############################
289
- ## ARGMIN DOUBLING_TIME ##
290
- ############################
291
-
292
-
293
- def observed_predicted_loss (self , doubling_time : float , p : Parameters ) -> float :
294
- """Squared error between predicted value and actual value
295
-
296
- Won't be run if n_days_since_first_hospitalized is None
297
- """
298
- census_df = self .run_projection (p , dt = doubling_time )
299
- ## get the predicted number hospitalized today
300
- pred_current_hospitalized = self .census_df ['hospitalized' ].loc [p .n_days_since_first_hospitalized ]
301
-
302
- ## compare against the actual (user inputed) number
303
- ## squared difference is the loss to be optimized
304
- return (p .current_hospitalized - pred_current_hospitalized )** 2
305
-
306
- def argmin_dt (self , doubling_times : np .ndarray , p : Parameters ) -> float :
307
- """Argmin of the loss function with respect to doubling time."""
308
- loss = np .array ([self .observed_predicted_loss (dt , p ) for dt in doubling_times ])
309
- fitted_doubling_time = doubling_times [loss .argmin ()]
310
- return fitted_doubling_time
311
-
312
317
313
318
#############
314
319
## UTILS ##
0 commit comments