meta-edc 1.0.7__py3-none-any.whl → 1.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. meta_ae/action_items.py +10 -2
  2. meta_ae/baker_recipes.py +1 -2
  3. meta_ae/tests/tests/test_actions.py +1 -2
  4. meta_analytics/README.rst +1 -2
  5. meta_analytics/notebooks/anu.ipynb +95 -0
  6. meta_analytics/notebooks/appointment_planning.ipynb +329 -0
  7. meta_analytics/notebooks/arvs.ipynb +103 -0
  8. meta_analytics/notebooks/cleaning/consent_v1_ext.ipynb +227 -0
  9. meta_analytics/notebooks/cleaning/offschedule_eos.ipynb +353 -0
  10. meta_analytics/notebooks/dsmc/renal_dysfunction.ipynb +435 -0
  11. meta_analytics/notebooks/endpoints/meta_endpoints_by_date.ipynb +664 -0
  12. meta_analytics/notebooks/followup_examination.ipynb +141 -0
  13. meta_analytics/notebooks/hba1c.ipynb +136 -0
  14. meta_analytics/notebooks/hiv_regimens.ipynb +122 -118
  15. meta_analytics/notebooks/incidence.ipynb +232 -0
  16. meta_analytics/notebooks/liver.ipynb +389 -0
  17. meta_analytics/notebooks/magreth.ipynb +645 -0
  18. meta_analytics/notebooks/monitoring_report.ipynb +721 -448
  19. meta_analytics/notebooks/pharmacy.ipynb +405 -306
  20. meta_analytics/notebooks/pharmacy_stock_202410.ipynb +306 -0
  21. meta_analytics/notebooks/steering.ipynb +61 -0
  22. meta_analytics/notebooks/undiagnosed/meta3_screening_consort_chart.ipynb +1176 -0
  23. meta_analytics/notebooks/undiagnosed/meta3_screening_undiagnosed.ipynb +519 -0
  24. meta_analytics/notebooks/undiagnosed/meta_screening_table2.ipynb +964 -0
  25. meta_analytics/notebooks/undiagnosed/screen_undiagnosed_or.ipynb +296 -0
  26. meta_analytics/notebooks/undiagnosed/screening.ipynb +273 -0
  27. meta_analytics/notebooks/undiagnosed/screening2.ipynb +958 -0
  28. meta_analytics/notebooks/undiagnosed/screening_undiagnosed_20241002.ipynb +958 -0
  29. meta_analytics/notebooks/ven.ipynb +191 -0
  30. meta_analytics/notebooks/vitals.ipynb +263 -0
  31. meta_edc/settings/debug.py +3 -2
  32. meta_edc/urls.py +1 -0
  33. {meta_edc-1.0.7.dist-info → meta_edc-1.1.1.dist-info}/METADATA +3 -3
  34. {meta_edc-1.0.7.dist-info → meta_edc-1.1.1.dist-info}/RECORD +62 -35
  35. {meta_edc-1.0.7.dist-info → meta_edc-1.1.1.dist-info}/WHEEL +1 -1
  36. meta_labs/reportables.py +14 -11
  37. meta_labs/tests/test_reportables.py +33 -12
  38. meta_pharmacy/notebooks/pharmacy.ipynb +41 -0
  39. meta_prn/admin/offschedule_pregnancy_admin.py +3 -3
  40. meta_prn/admin/onschedule_dm_referral_admin.py +5 -5
  41. meta_prn/form_validators/end_of_study.py +2 -2
  42. meta_prn/migrations/0063_historicaloffstudymedication_singleton_field_and_more.py +37 -0
  43. meta_prn/migrations/0064_auto_20250602_2143.py +18 -0
  44. meta_prn/models/end_of_study.py +2 -0
  45. meta_prn/models/off_study_medication.py +2 -0
  46. meta_reports/admin/last_imp_refill_admin.py +3 -2
  47. meta_screening/eligibility/eligibility_part_three/base_eligibility_part_three.py +59 -47
  48. meta_screening/form_validators/screening_part_three.py +6 -1
  49. meta_screening/tests/meta_test_case_mixin.py +3 -0
  50. meta_screening/tests/tests/test_forms.py +9 -2
  51. meta_screening/tests/tests/test_screening_part_three.py +11 -14
  52. meta_subject/action_items.py +2 -3
  53. meta_subject/choices.py +2 -1
  54. meta_subject/form_validators/delivery_form_validator.py +1 -0
  55. meta_subject/forms/blood_results/blood_results_rft_form.py +60 -3
  56. meta_subject/forms/delivery_form.py +2 -0
  57. meta_subject/migrations/0223_bloodresultsfbc_errors_bloodresultsgludummy_errors_and_more.py +83 -0
  58. meta_subject/migrations/0224_bloodresultsfbc_abnormal_summary_and_more.py +153 -0
  59. meta_subject/tests/tests/test_egfr.py +5 -5
  60. meta_analytics/dataframes/enrolled/__init__.py +0 -0
  61. {meta_edc-1.0.7.dist-info → meta_edc-1.1.1.dist-info}/licenses/AUTHORS.rst +0 -0
  62. {meta_edc-1.0.7.dist-info → meta_edc-1.1.1.dist-info}/licenses/LICENSE +0 -0
  63. {meta_edc-1.0.7.dist-info → meta_edc-1.1.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1176 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": null,
6
+ "id": "0",
7
+ "metadata": {},
8
+ "outputs": [],
9
+ "source": [
10
+ "%%capture\n",
11
+ "# output is suppressed but normally would spew out all the edc loading messages\n",
12
+ "\n",
13
+ "import os\n",
14
+ "from pathlib import Path\n",
15
+ "from datetime import datetime\n",
16
+ "import pandas as pd\n",
17
+ "import numpy as np\n",
18
+ "import math\n",
19
+ "# import matplotlxib.pyplot as plt\n",
20
+ "# import seaborn as sns\n",
21
+ "import scipy.stats as stats\n",
22
+ "\n",
23
+ "from dj_notebook import activate\n",
24
+ "\n",
25
+ "env_file = os.environ[\"META_ENV\"]\n",
26
+ "documents_folder = os.environ[\"META_DOCUMENTS_FOLDER\"]\n",
27
+ "report_folder = Path(documents_folder)\n",
28
+ "\n",
29
+ "plus = activate(dotenv_file=env_file)\n"
30
+ ]
31
+ },
32
+ {
33
+ "cell_type": "code",
34
+ "execution_count": null,
35
+ "id": "1",
36
+ "metadata": {},
37
+ "outputs": [],
38
+ "source": [
39
+ "from meta_screening.models import SubjectScreening\n",
40
+ "from django_pandas.io import read_frame\n"
41
+ ]
42
+ },
43
+ {
44
+ "cell_type": "code",
45
+ "execution_count": null,
46
+ "id": "2",
47
+ "metadata": {},
48
+ "outputs": [],
49
+ "source": [
50
+ "cols = [\n",
51
+ " f.name\n",
52
+ " for f in SubjectScreening._meta.get_fields()\n",
53
+ " if f.name\n",
54
+ " not in [\n",
55
+ " \"contact_number\",\n",
56
+ " \"initials\",\n",
57
+ " \"hospital_identifier\",\n",
58
+ " \"modified\",\n",
59
+ " \"user_created\",\n",
60
+ " \"user_modified\",\n",
61
+ " \"hostname_created\",\n",
62
+ " \"hostname_modified\",\n",
63
+ " \"device_created\",\n",
64
+ " \"device_modified\",\n",
65
+ " \"locale_created\",\n",
66
+ " \"locale_modified\",\n",
67
+ " \"slug\",\n",
68
+ " ]\n",
69
+ "]\n",
70
+ "qs_screening = SubjectScreening.objects.values(*cols).all()\n",
71
+ "df = read_frame(qs_screening)"
72
+ ]
73
+ },
74
+ {
75
+ "cell_type": "code",
76
+ "execution_count": null,
77
+ "id": "3",
78
+ "metadata": {},
79
+ "outputs": [],
80
+ "source": [
81
+ "df.count()\n"
82
+ ]
83
+ },
84
+ {
85
+ "cell_type": "code",
86
+ "execution_count": null,
87
+ "id": "4",
88
+ "metadata": {},
89
+ "outputs": [],
90
+ "source": [
91
+ "from edc_constants.constants import NO, YES\n",
92
+ "df.count()\n",
93
+ "df.hiv_pos.value_counts()"
94
+ ]
95
+ },
96
+ {
97
+ "cell_type": "code",
98
+ "execution_count": null,
99
+ "id": "5",
100
+ "metadata": {},
101
+ "outputs": [],
102
+ "source": [
103
+ "df = df.drop(df[df[\"hiv_pos\"] == \"No\"].index)\n",
104
+ "# df = df.drop(df[df.art_six_months==NO].index)\n",
105
+ "# df = df.drop(df[df.on_rx_stable==NO].index)\n",
106
+ "df.count()"
107
+ ]
108
+ },
109
+ {
110
+ "cell_type": "code",
111
+ "execution_count": null,
112
+ "id": "6",
113
+ "metadata": {},
114
+ "outputs": [],
115
+ "source": [
116
+ "# check for duplicate subjects / there are none\n",
117
+ "# df[df.duplicated([\"hospital_identifier\"], keep=False)]\n",
118
+ "# len(df)"
119
+ ]
120
+ },
121
+ {
122
+ "cell_type": "code",
123
+ "execution_count": null,
124
+ "id": "7",
125
+ "metadata": {},
126
+ "outputs": [],
127
+ "source": []
128
+ },
129
+ {
130
+ "cell_type": "code",
131
+ "execution_count": null,
132
+ "id": "8",
133
+ "metadata": {},
134
+ "outputs": [],
135
+ "source": [
136
+ "len(df)"
137
+ ]
138
+ },
139
+ {
140
+ "cell_type": "code",
141
+ "execution_count": null,
142
+ "id": "9",
143
+ "metadata": {},
144
+ "outputs": [],
145
+ "source": [
146
+ "df_tmp = df.gender.value_counts().to_frame().reset_index()\n",
147
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
148
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
149
+ "df_tmp"
150
+ ]
151
+ },
152
+ {
153
+ "cell_type": "code",
154
+ "execution_count": null,
155
+ "id": "10",
156
+ "metadata": {},
157
+ "outputs": [],
158
+ "source": [
159
+ "df_tmp = df.has_dm.value_counts(dropna=False).to_frame().reset_index()\n",
160
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
161
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
162
+ "df_tmp"
163
+ ]
164
+ },
165
+ {
166
+ "cell_type": "code",
167
+ "execution_count": null,
168
+ "id": "11",
169
+ "metadata": {},
170
+ "outputs": [],
171
+ "source": [
172
+ "df_tmp = df[df.has_dm.isna()].gender.value_counts(dropna=False).to_frame().reset_index()\n",
173
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
174
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
175
+ "df_tmp"
176
+ ]
177
+ },
178
+ {
179
+ "cell_type": "code",
180
+ "execution_count": null,
181
+ "id": "12",
182
+ "metadata": {},
183
+ "outputs": [],
184
+ "source": [
185
+ "cond1 = (df.has_dm==NO) & (df.on_dm_medication==NO)\n",
186
+ "df_tmp = df[cond1].gender.value_counts(dropna=False).to_frame().reset_index()\n",
187
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
188
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
189
+ "df_tmp"
190
+ ]
191
+ },
192
+ {
193
+ "cell_type": "code",
194
+ "execution_count": null,
195
+ "id": "13",
196
+ "metadata": {},
197
+ "outputs": [],
198
+ "source": [
199
+ "cond2 = (cond1 & (df.on_rx_stable==YES) & (df.art_six_months==YES) & (df.vl_undetectable==YES))\n",
200
+ "df_tmp = df[cond2].gender.value_counts(dropna=False).to_frame().reset_index()\n",
201
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
202
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
203
+ "df_tmp"
204
+ ]
205
+ },
206
+ {
207
+ "cell_type": "code",
208
+ "execution_count": null,
209
+ "id": "14",
210
+ "metadata": {},
211
+ "outputs": [],
212
+ "source": [
213
+ "cond3 = (cond2 & (df.staying_nearby_12==YES) & (df.lives_nearby==YES))\n",
214
+ "df_tmp = df[cond3].gender.value_counts(dropna=False).to_frame().reset_index()\n",
215
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
216
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
217
+ "df_tmp"
218
+ ]
219
+ },
220
+ {
221
+ "cell_type": "code",
222
+ "execution_count": null,
223
+ "id": "15",
224
+ "metadata": {},
225
+ "outputs": [],
226
+ "source": [
227
+ "cond4 = (cond3 & ~(df.pregnant==YES))\n",
228
+ "df_tmp = df[cond4].gender.value_counts(dropna=False).to_frame().reset_index()\n",
229
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
230
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
231
+ "df_tmp"
232
+ ]
233
+ },
234
+ {
235
+ "cell_type": "code",
236
+ "execution_count": null,
237
+ "id": "16",
238
+ "metadata": {},
239
+ "outputs": [],
240
+ "source": [
241
+ "cond5 = (cond4 & (df.congestive_heart_failure==NO) & (df.liver_disease==NO) & (df.alcoholism==NO) & (df.acute_metabolic_acidosis==NO) & (df.renal_function_condition==NO) & (df.tissue_hypoxia_condition==NO) & (df.acute_condition==NO) & (df.metformin_sensitivity==NO))\n",
242
+ "\n",
243
+ "df_tmp = df[cond5].gender.value_counts(dropna=False).to_frame().reset_index()\n",
244
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
245
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
246
+ "df_tmp"
247
+ ]
248
+ },
249
+ {
250
+ "cell_type": "code",
251
+ "execution_count": null,
252
+ "id": "17",
253
+ "metadata": {},
254
+ "outputs": [],
255
+ "source": [
256
+ "df[cond5].eligible_part_one.value_counts()"
257
+ ]
258
+ },
259
+ {
260
+ "cell_type": "code",
261
+ "execution_count": null,
262
+ "id": "18",
263
+ "metadata": {},
264
+ "outputs": [],
265
+ "source": [
266
+ "df[cond5].eligible_part_two.value_counts()\n"
267
+ ]
268
+ },
269
+ {
270
+ "cell_type": "code",
271
+ "execution_count": null,
272
+ "id": "19",
273
+ "metadata": {},
274
+ "outputs": [],
275
+ "source": [
276
+ "cond6 = (cond5 & (df.meta_phase_two==NO))\n",
277
+ "df_tmp = df[cond6].gender.value_counts(dropna=False).to_frame().reset_index()\n",
278
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
279
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
280
+ "df_tmp"
281
+ ]
282
+ },
283
+ {
284
+ "cell_type": "code",
285
+ "execution_count": null,
286
+ "id": "20",
287
+ "metadata": {},
288
+ "outputs": [],
289
+ "source": [
290
+ "cond7 = (cond6 & (df[\"eligible_part_one\"]==\"Yes\") & (df[\"eligible_part_two\"]==\"Yes\") & (df.agree_to_p3==YES))\n",
291
+ "df_tmp = df[cond7].gender.value_counts(dropna=False).to_frame().reset_index()\n",
292
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
293
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
294
+ "df_tmp"
295
+ ]
296
+ },
297
+ {
298
+ "cell_type": "code",
299
+ "execution_count": null,
300
+ "id": "21",
301
+ "metadata": {},
302
+ "outputs": [],
303
+ "source": []
304
+ },
305
+ {
306
+ "cell_type": "code",
307
+ "execution_count": null,
308
+ "id": "22",
309
+ "metadata": {},
310
+ "outputs": [],
311
+ "source": [
312
+ "cond8 = (cond7 & (df.already_fasted==YES))\n",
313
+ "df_tmp = df[cond8].gender.value_counts(dropna=False).to_frame().reset_index()\n",
314
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
315
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
316
+ "df_tmp"
317
+ ]
318
+ },
319
+ {
320
+ "cell_type": "code",
321
+ "execution_count": null,
322
+ "id": "23",
323
+ "metadata": {},
324
+ "outputs": [],
325
+ "source": [
326
+ "cond9 = (cond7 & (df.already_fasted==NO))\n",
327
+ "df_tmp = df[cond9].gender.value_counts(dropna=False).to_frame().reset_index()\n",
328
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
329
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
330
+ "df_tmp"
331
+ ]
332
+ },
333
+ {
334
+ "cell_type": "code",
335
+ "execution_count": null,
336
+ "id": "24",
337
+ "metadata": {},
338
+ "outputs": [],
339
+ "source": [
340
+ "from edc_model.utils import duration_hm_to_timedelta\n",
341
+ "\n",
342
+ "# gen fasted variable\n",
343
+ "def get_duration_dh_to_timedelta(s):\n",
344
+ " if not pd.isna(s[\"fasting_duration_str\"]):\n",
345
+ " return duration_hm_to_timedelta(s[\"fasting_duration_str\"])\n",
346
+ " return s[\"fasting_duration_str\"]\n",
347
+ "\n",
348
+ "def get_fasted(s):\n",
349
+ " if pd.isna(s[\"fasted_duration_delta\"]) and not has_glucose_value(s):\n",
350
+ " return None\n",
351
+ " elif pd.isna(s[\"fasted_duration_delta\"]) and has_glucose_value(s):\n",
352
+ " return has_glucose_value(s)\n",
353
+ " if s[\"fasted_duration_delta\"] <= pd.Timedelta(hours=8):\n",
354
+ " return NO\n",
355
+ " return YES\n",
356
+ "\n",
357
+ "def has_glucose_value(s):\n",
358
+ " if not pd.isna(s[\"fbg_value\"]):\n",
359
+ " return \"FBG only\"\n",
360
+ " if not pd.isna(s[\"ogtt_value\"]) and not pd.isna(s[\"fbg_value\"]):\n",
361
+ " return \"FBG-OGTT\"\n",
362
+ " elif pd.isna(s[\"ogtt_value\"]) and pd.isna(s[\"ogtt2_value\"]) and pd.isna(s[\"fbg_value\"]) and pd.isna(s[\"fbg2_value\"]):\n",
363
+ " return False\n",
364
+ " return True\n",
365
+ "\n",
366
+ "df[\"fasted_duration_delta\"] = df.apply(get_duration_dh_to_timedelta, axis=1)\n",
367
+ "df[\"fasted\"] = df.apply(get_fasted, axis=1)\n"
368
+ ]
369
+ },
370
+ {
371
+ "cell_type": "code",
372
+ "execution_count": null,
373
+ "id": "25",
374
+ "metadata": {},
375
+ "outputs": [],
376
+ "source": [
377
+ "df[(df.subject_identifier.notna()) & (df.subject_identifier.str.len() < 20)].eligible.value_counts()"
378
+ ]
379
+ },
380
+ {
381
+ "cell_type": "code",
382
+ "execution_count": null,
383
+ "id": "26",
384
+ "metadata": {},
385
+ "outputs": [],
386
+ "source": [
387
+ "df_tmp = df[cond9 & (df.fasted==YES)].gender.value_counts(dropna=False).to_frame().reset_index()\n",
388
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
389
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
390
+ "df_tmp"
391
+ ]
392
+ },
393
+ {
394
+ "cell_type": "code",
395
+ "execution_count": null,
396
+ "id": "27",
397
+ "metadata": {},
398
+ "outputs": [],
399
+ "source": [
400
+ "df_tmp = df[cond9 & ~(df.fasted==YES)].gender.value_counts(dropna=False).to_frame().reset_index()\n",
401
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
402
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
403
+ "df_tmp"
404
+ ]
405
+ },
406
+ {
407
+ "cell_type": "code",
408
+ "execution_count": null,
409
+ "id": "28",
410
+ "metadata": {},
411
+ "outputs": [],
412
+ "source": [
413
+ "df[cond9 & ~(df.fasted==YES) & (df.subject_identifier.str.len() < 20)][[\"screening_identifier\", \"subject_identifier\"]]"
414
+ ]
415
+ },
416
+ {
417
+ "cell_type": "code",
418
+ "execution_count": null,
419
+ "id": "29",
420
+ "metadata": {},
421
+ "outputs": [],
422
+ "source": [
423
+ "# never returned or not evaluated\n",
424
+ "# note some have part three started and 1 even has a fasting duration\n",
425
+ "cond10 = (cond9 & (df.eligible_part_three==\"To be determined\"))\n",
426
+ "# df[(df.fasted==YES) & cond_eligible].eligible_part_one.value_counts(dropna=False)\n",
427
+ "df_tmp = df[cond10].gender.value_counts(dropna=False).to_frame().reset_index()\n",
428
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
429
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
430
+ "df_tmp"
431
+ ]
432
+ },
433
+ {
434
+ "cell_type": "code",
435
+ "execution_count": null,
436
+ "id": "30",
437
+ "metadata": {},
438
+ "outputs": [],
439
+ "source": [
440
+ "cond11 = (cond7 & (df.fasted==YES))\n",
441
+ "df_tmp = df[cond11].gender.value_counts(dropna=False).to_frame().reset_index()\n",
442
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
443
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
444
+ "df_tmp"
445
+ ]
446
+ },
447
+ {
448
+ "cell_type": "code",
449
+ "execution_count": null,
450
+ "id": "31",
451
+ "metadata": {},
452
+ "outputs": [],
453
+ "source": [
454
+ "cond11 = (cond9 & ~(df.eligible_part_three==\"To be determined\") & (df.fasted==NO))\n",
455
+ "df_tmp = df[cond11].gender.value_counts(dropna=False).to_frame().reset_index()\n",
456
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
457
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
458
+ "df_tmp"
459
+ ]
460
+ },
461
+ {
462
+ "cell_type": "code",
463
+ "execution_count": null,
464
+ "id": "32",
465
+ "metadata": {},
466
+ "outputs": [],
467
+ "source": [
468
+ "cond11 = (cond9 & ~(df.eligible_part_three==\"To be determined\") & ~(df.fbg_value.isna()))\n",
469
+ "df_tmp = df[cond11].gender.value_counts(dropna=False).to_frame().reset_index()\n",
470
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
471
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
472
+ "df_tmp"
473
+ ]
474
+ },
475
+ {
476
+ "cell_type": "code",
477
+ "execution_count": null,
478
+ "id": "33",
479
+ "metadata": {},
480
+ "outputs": [],
481
+ "source": [
482
+ "df_tmp = df.eligible_part_three.value_counts(dropna=False).to_frame().reset_index()\n",
483
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
484
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
485
+ "df_tmp"
486
+ ]
487
+ },
488
+ {
489
+ "cell_type": "code",
490
+ "execution_count": null,
491
+ "id": "34",
492
+ "metadata": {},
493
+ "outputs": [],
494
+ "source": [
495
+ "df_tmp = df[all_conds & (df.agree_to_p3==YES) & (df.already_fasted==NO) & ~(df.fasted==YES) & cond_eligible].gender.value_counts(dropna=False).to_frame().reset_index()\n",
496
+ "df_tmp[\"total\"] = df_tmp[\"count\"].sum()\n",
497
+ "df_tmp[\"prop\"] = df_tmp[\"count\"] / df_tmp[\"total\"]\n",
498
+ "df_tmp\n"
499
+ ]
500
+ },
501
+ {
502
+ "cell_type": "code",
503
+ "execution_count": null,
504
+ "id": "35",
505
+ "metadata": {},
506
+ "outputs": [],
507
+ "source": []
508
+ },
509
+ {
510
+ "cell_type": "code",
511
+ "execution_count": null,
512
+ "id": "36",
513
+ "metadata": {},
514
+ "outputs": [],
515
+ "source": []
516
+ },
517
+ {
518
+ "cell_type": "code",
519
+ "execution_count": null,
520
+ "id": "37",
521
+ "metadata": {},
522
+ "outputs": [],
523
+ "source": [
524
+ "all_conds = (all_conds & (df.agree_to_p3==YES) & (df.already_fasted==NO))\n",
525
+ "cond_eligible = (df[\"eligible_part_one\"]==\"Yes\") & (df[\"eligible_part_two\"]==\"Yes\")\n",
526
+ "df[all_conds & cond_eligible & (df.eligible_part_three.isin([YES, NO]))].gender.value_counts(dropna=False)\n"
527
+ ]
528
+ },
529
+ {
530
+ "cell_type": "code",
531
+ "execution_count": null,
532
+ "id": "38",
533
+ "metadata": {},
534
+ "outputs": [],
535
+ "source": []
536
+ },
537
+ {
538
+ "cell_type": "code",
539
+ "execution_count": null,
540
+ "id": "39",
541
+ "metadata": {},
542
+ "outputs": [],
543
+ "source": [
544
+ "print(len(df[(df[\"ogtt_base_datetime\"].notna()) | (df[\"ogtt2_base_datetime\"].notna())]))\n",
545
+ "print(len(df[(df[\"ogtt_datetime\"].notna()) | (df[\"ogtt2_datetime\"].notna())]))\n",
546
+ "print(len(df[(df[\"ogtt_value\"].notna()) | (df[\"ogtt2_value\"].notna())]))\n",
547
+ "# len(df[(df[\"fbg_value\"].notna()) | (df[\"fbg2_value\"].notna())])\n",
548
+ "df[((df[\"ogtt_value\"].notna()) | (df[\"ogtt2_value\"].notna()) | (df[\"fbg_value\"].notna()) | (df[\"fbg2_value\"].notna())) & (df[\"has_dm\"]==\"No\")]\n",
549
+ " "
550
+ ]
551
+ },
552
+ {
553
+ "cell_type": "code",
554
+ "execution_count": null,
555
+ "id": "40",
556
+ "metadata": {},
557
+ "outputs": [],
558
+ "source": [
559
+ "# counts by site - row, column\n",
560
+ "gender_by_site = pd.crosstab(df['site'], df['gender'], margins=True)\n",
561
+ "gender_by_site.columns = [\"F (%)\", \"M (%)\", \"(%)\"]\n",
562
+ "gender_by_site.index = [\"amana\", \"hindu-mandal\", \"mnazi-moja\", \"mwananyamala\", \"temeke\", \"total (%)\"]\n",
563
+ "gender_by_site"
564
+ ]
565
+ },
566
+ {
567
+ "cell_type": "code",
568
+ "execution_count": null,
569
+ "id": "41",
570
+ "metadata": {},
571
+ "outputs": [],
572
+ "source": [
573
+ "round(gender_by_site/len(df) , 3) * 100\n"
574
+ ]
575
+ },
576
+ {
577
+ "cell_type": "code",
578
+ "execution_count": null,
579
+ "id": "42",
580
+ "metadata": {},
581
+ "outputs": [],
582
+ "source": [
583
+ "\n",
584
+ "round(gender_by_site.div(gender_by_site[\"(%)\"], axis=0) , 3) * 100\n"
585
+ ]
586
+ },
587
+ {
588
+ "cell_type": "code",
589
+ "execution_count": null,
590
+ "id": "43",
591
+ "metadata": {},
592
+ "outputs": [],
593
+ "source": [
594
+ "# has_dm fillna with unk\n",
595
+ "df[\"has_dm\"] = df[\"has_dm\"].apply(lambda x: \"unk\" if not x else x)\n",
596
+ "\n",
597
+ "# in_catchment =\n",
598
+ "df[\"in_catchment\"] = (df[\"lives_nearby\"] == \"Yes\") & (df[\"staying_nearby_12\"] == \"Yes\")\n",
599
+ "\n"
600
+ ]
601
+ },
602
+ {
603
+ "cell_type": "code",
604
+ "execution_count": null,
605
+ "id": "44",
606
+ "metadata": {},
607
+ "outputs": [],
608
+ "source": [
609
+ "# run crosstabs"
610
+ ]
611
+ },
612
+ {
613
+ "cell_type": "code",
614
+ "execution_count": null,
615
+ "id": "45",
616
+ "metadata": {},
617
+ "outputs": [],
618
+ "source": [
619
+ "# crosstab by has_dm, gender\n",
620
+ "df_crosstab = pd.crosstab(df['has_dm'], df['gender'], margins=True, dropna=False)\n",
621
+ "# has_dm_by_gender.columns = [\"female\", \"male\", \"rowtotal\"]\n",
622
+ "# has_dm_by_gender.index = [\"no\", \"yes\", \"unknown\", \"coltotal\"]\n",
623
+ "df_crosstab"
624
+ ]
625
+ },
626
+ {
627
+ "cell_type": "code",
628
+ "execution_count": null,
629
+ "id": "46",
630
+ "metadata": {},
631
+ "outputs": [],
632
+ "source": [
633
+ "# crosstab by has_dm == Yes by on_dm_medication, gender\n",
634
+ "cond = (df[\"has_dm\"]==\"Yes\")\n",
635
+ "df_crosstab = pd.crosstab(df[cond]['on_dm_medication'], df[cond]['gender'], margins=True, dropna=False)\n",
636
+ "# has_dm_by_gender.columns = [\"female\", \"male\", \"rowtotal\"]\n",
637
+ "# has_dm_by_gender.index = [\"no\", \"yes\", \"unknown\", \"coltotal\"]\n",
638
+ "df_crosstab"
639
+ ]
640
+ },
641
+ {
642
+ "cell_type": "code",
643
+ "execution_count": null,
644
+ "id": "47",
645
+ "metadata": {},
646
+ "outputs": [],
647
+ "source": [
648
+ "# crosstab by has_dm == No by on_dm_medication, gender\n",
649
+ "cond = (df[\"has_dm\"]==\"No\")\n",
650
+ "df_crosstab = pd.crosstab(df[cond]['on_dm_medication'], df[cond]['gender'], margins=True, dropna=False)\n",
651
+ "# has_dm_by_gender.columns = [\"female\", \"male\", \"rowtotal\"]\n",
652
+ "# has_dm_by_gender.index = [\"no\", \"yes\", \"unknown\", \"coltotal\"]\n",
653
+ "df_crosstab"
654
+ ]
655
+ },
656
+ {
657
+ "cell_type": "code",
658
+ "execution_count": null,
659
+ "id": "48",
660
+ "metadata": {},
661
+ "outputs": [],
662
+ "source": [
663
+ "# crosstab by has_dm == No & on_dm_medication==No by stable on ART for 6m, gender\n",
664
+ "cond = (df[\"has_dm\"]==\"No\") & (df['on_dm_medication']==\"No\") & (df['on_rx_stable']==\"Yes\") & (df['vl_undetectable']==\"Yes\") & (df['art_six_months']==\"Yes\")\n",
665
+ "neg_cond = (df[\"has_dm\"]==\"No\") & (df['on_dm_medication']==\"No\") & ((df['on_rx_stable']!=\"Yes\") | (df['vl_undetectable']!=\"Yes\") | (df['art_six_months']!=\"Yes\"))\n",
666
+ "df_crosstab = pd.crosstab(df[neg_cond]['art_six_months'], df[neg_cond]['gender'], margins=True, dropna=False)\n",
667
+ "# has_dm_by_gender.columns = [\"female\", \"male\", \"rowtotal\"]\n",
668
+ "# has_dm_by_gender.index = [\"no\", \"yes\", \"unknown\", \"coltotal\"]\n",
669
+ "df_crosstab"
670
+ ]
671
+ },
672
+ {
673
+ "cell_type": "code",
674
+ "execution_count": null,
675
+ "id": "49",
676
+ "metadata": {},
677
+ "outputs": [],
678
+ "source": [
679
+ "# \"lives_nearby\",\n",
680
+ "# \"staying_nearby_12\",\n",
681
+ "# crosstab by has_dm == No & on_dm_medication==No by stable on ART for 6m, gender\n",
682
+ "cond = (df[\"has_dm\"]==\"No\") & (df['on_dm_medication']==\"No\") & (df['on_rx_stable']==\"Yes\") & (df['vl_undetectable']==\"Yes\") & (df['art_six_months']==\"Yes\")\n",
683
+ "\n",
684
+ "df_crosstab = pd.crosstab(df[cond]['in_catchment'], df[cond]['gender'], margins=True, dropna=False)\n",
685
+ "# has_dm_by_gender.columns = [\"female\", \"male\", \"rowtotal\"]\n",
686
+ "# has_dm_by_gender.index = [\"no\", \"yes\", \"unknown\", \"coltotal\"]\n",
687
+ "df_crosstab"
688
+ ]
689
+ },
690
+ {
691
+ "cell_type": "code",
692
+ "execution_count": null,
693
+ "id": "50",
694
+ "metadata": {},
695
+ "outputs": [],
696
+ "source": [
697
+ "# crosstab pregnant, gender\n",
698
+ "cond = (df[\"has_dm\"]==\"No\") & (df['on_dm_medication']==\"No\") & (df['on_rx_stable']==\"Yes\") & (df['vl_undetectable']==\"Yes\") & (df['art_six_months']==\"Yes\") & (df['in_catchment']==True) & (df[\"in_catchment\"]==True)\n",
699
+ "df_crosstab = pd.crosstab(df[cond]['pregnant'], df[cond]['gender'], margins=True, dropna=False)\n",
700
+ "# has_dm_by_gender.columns = [\"female\", \"male\", \"rowtotal\"]\n",
701
+ "# has_dm_by_gender.index = [\"no\", \"yes\", \"unknown\", \"coltotal\"]\n",
702
+ "df_crosstab\n"
703
+ ]
704
+ },
705
+ {
706
+ "cell_type": "code",
707
+ "execution_count": null,
708
+ "id": "51",
709
+ "metadata": {},
710
+ "outputs": [],
711
+ "source": [
712
+ "# crosstab on conditions (part two)\n",
713
+ "# \"congestive_heart_failure\",\n",
714
+ "# \"liver_disease\",\n",
715
+ "# \"alcoholism\",\n",
716
+ "# \"acute_metabolic_acidosis\",\n",
717
+ "# \"renal_function_condition\",\n",
718
+ "# \"tissue_hypoxia_condition\",\n",
719
+ "# \"acute_condition\",\n",
720
+ "# \"metformin_sensitivity\","
721
+ ]
722
+ },
723
+ {
724
+ "cell_type": "code",
725
+ "execution_count": null,
726
+ "id": "52",
727
+ "metadata": {},
728
+ "outputs": [],
729
+ "source": [
730
+ "# crosstab (use for any single condition)\n",
731
+ "cond = (df[\"has_dm\"]==\"No\") & (df['on_dm_medication']==\"No\") & (df['on_rx_stable']==\"Yes\") & (df['vl_undetectable']==\"Yes\") & (df['art_six_months']==\"Yes\") & (df['in_catchment']==True) & (df[\"in_catchment\"]==True) & (df[\"pregnant\"]!=\"Yes\")\n",
732
+ "df_crosstab = pd.crosstab(df[cond]['metformin_sensitivity'], df[cond]['gender'], margins=True, dropna=False)\n",
733
+ "# has_dm_by_gender.columns = [\"female\", \"male\", \"rowtotal\"]\n",
734
+ "# has_dm_by_gender.index = [\"no\", \"yes\", \"unknown\", \"coltotal\"]\n",
735
+ "df_crosstab\n"
736
+ ]
737
+ },
738
+ {
739
+ "cell_type": "code",
740
+ "execution_count": null,
741
+ "id": "53",
742
+ "metadata": {},
743
+ "outputs": [],
744
+ "source": [
745
+ "# crosstab meta_phase_two\n",
746
+ "cond = ((df[\"has_dm\"]==\"No\") & (df['on_dm_medication']==\"No\")\n",
747
+ " & (df['on_rx_stable']==\"Yes\") & (df['vl_undetectable']==\"Yes\") & (df['art_six_months']==\"Yes\") \n",
748
+ " & (df['in_catchment']==True) \n",
749
+ " & (df[\"pregnant\"]!=\"Yes\")\n",
750
+ " & (df[\"congestive_heart_failure\"]!=\"Yes\")\n",
751
+ " & (df[\"liver_disease\"]!=\"Yes\")\n",
752
+ " & (df[\"alcoholism\"]!=\"Yes\")\n",
753
+ " & (df[\"acute_metabolic_acidosis\"]!=\"Yes\")\n",
754
+ " & (df[\"renal_function_condition\"]!=\"Yes\")\n",
755
+ " & (df[\"tissue_hypoxia_condition\"]!=\"Yes\")\n",
756
+ " & (df[\"acute_condition\"]!=\"Yes\")\n",
757
+ " & (df[\"metformin_sensitivity\"]!=\"Yes\")\n",
758
+ " )\n",
759
+ "df_crosstab = pd.crosstab(df[cond]['meta_phase_two'], df[cond]['gender'], margins=True, dropna=False)\n",
760
+ "# has_dm_by_gender.columns = [\"female\", \"male\", \"rowtotal\"]\n",
761
+ "# has_dm_by_gender.index = [\"no\", \"yes\", \"unknown\", \"coltotal\"]\n",
762
+ "df_crosstab\n"
763
+ ]
764
+ },
765
+ {
766
+ "cell_type": "code",
767
+ "execution_count": null,
768
+ "id": "54",
769
+ "metadata": {},
770
+ "outputs": [],
771
+ "source": [
772
+ "# crosstab (use for any single condition)\n",
773
+ "cond = ((df[\"has_dm\"]==\"No\") & (df['on_dm_medication']==\"No\")\n",
774
+ " & (df['on_rx_stable']==\"Yes\") & (df['vl_undetectable']==\"Yes\") & (df['art_six_months']==\"Yes\") \n",
775
+ " & (df['in_catchment']==True) \n",
776
+ " & (df[\"pregnant\"]!=\"Yes\")\n",
777
+ " & (df[\"congestive_heart_failure\"]!=\"Yes\")\n",
778
+ " & (df[\"liver_disease\"]!=\"Yes\")\n",
779
+ " & (df[\"alcoholism\"]!=\"Yes\")\n",
780
+ " & (df[\"acute_metabolic_acidosis\"]!=\"Yes\")\n",
781
+ " & (df[\"renal_function_condition\"]!=\"Yes\")\n",
782
+ " & (df[\"tissue_hypoxia_condition\"]!=\"Yes\")\n",
783
+ " & (df[\"acute_condition\"]!=\"Yes\")\n",
784
+ " & (df[\"metformin_sensitivity\"]!=\"Yes\")\n",
785
+ " & (df[\"meta_phase_two\"]!=\"Yes\")\n",
786
+ " )\n",
787
+ "len(df[cond])"
788
+ ]
789
+ },
790
+ {
791
+ "cell_type": "code",
792
+ "execution_count": null,
793
+ "id": "55",
794
+ "metadata": {},
795
+ "outputs": [],
796
+ "source": [
797
+ "# check against eligible_part_one and two\n",
798
+ "\n",
799
+ "cond_eligible = (df[\"eligible_part_one\"]==\"Yes\") & (df[\"eligible_part_two\"]==\"Yes\")\n",
800
+ "print([len(df[cond_eligible]), len(df[cond])])\n"
801
+ ]
802
+ },
803
+ {
804
+ "cell_type": "code",
805
+ "execution_count": null,
806
+ "id": "56",
807
+ "metadata": {},
808
+ "outputs": [],
809
+ "source": [
810
+ "cond = (df[\"eligible_part_one\"]==\"Yes\") & (df[\"eligible_part_two\"]==\"Yes\")\n",
811
+ "df_crosstab = pd.crosstab(df[cond]['agree_to_p3'], df[cond]['gender'], margins=True, dropna=False)\n",
812
+ "df_crosstab\n",
813
+ "\n"
814
+ ]
815
+ },
816
+ {
817
+ "cell_type": "code",
818
+ "execution_count": null,
819
+ "id": "57",
820
+ "metadata": {},
821
+ "outputs": [],
822
+ "source": [
823
+ "cond = (df[\"eligible_part_one\"]==\"Yes\") & (df[\"eligible_part_two\"]==\"Yes\")\n",
824
+ "df_crosstab = pd.crosstab(df[cond]['already_fasted'], df[cond]['gender'], margins=True, dropna=False)\n",
825
+ "df_crosstab\n"
826
+ ]
827
+ },
828
+ {
829
+ "cell_type": "code",
830
+ "execution_count": null,
831
+ "id": "58",
832
+ "metadata": {},
833
+ "outputs": [],
834
+ "source": [
835
+ "# who returned and had an FBG performed\n",
836
+ "cond = (df[\"eligible_part_one\"]==\"Yes\") & (df[\"eligible_part_two\"]==\"Yes\")\n",
837
+ "df_crosstab = pd.crosstab(df[cond]['fbg_value'].notna(), df[cond]['gender'], margins=True, dropna=False)\n",
838
+ "df_crosstab\n"
839
+ ]
840
+ },
841
+ {
842
+ "cell_type": "code",
843
+ "execution_count": null,
844
+ "id": "59",
845
+ "metadata": {},
846
+ "outputs": [],
847
+ "source": [
848
+ "# df_crosstab / len(df[cond & cond2])"
849
+ ]
850
+ },
851
+ {
852
+ "cell_type": "code",
853
+ "execution_count": null,
854
+ "id": "60",
855
+ "metadata": {},
856
+ "outputs": [],
857
+ "source": [
858
+ "# of 5616 look at FBG and OGTT counts. Run lines for \n",
859
+ "# glucose: fbg_value,fbg2_value,ogtt_value,ogtt2_value,\n",
860
+ "# BP: sys_blood_pressure_one, sys_blood_pressure_two,dia_blood_pressure_one, dia_blood_pressure_two \n",
861
+ "cond = (df[\"eligible_part_one\"]==\"Yes\") & (df[\"eligible_part_two\"]==\"Yes\") & (df[\"fbg_value\"].notna())\n",
862
+ "\n",
863
+ "df_crosstab = pd.crosstab(df[cond]['hba1c_value'].notna(), df[cond]['gender'], margins=True, dropna=False)\n",
864
+ "df_crosstab\n"
865
+ ]
866
+ },
867
+ {
868
+ "cell_type": "code",
869
+ "execution_count": null,
870
+ "id": "61",
871
+ "metadata": {},
872
+ "outputs": [],
873
+ "source": []
874
+ },
875
+ {
876
+ "cell_type": "code",
877
+ "execution_count": null,
878
+ "id": "62",
879
+ "metadata": {},
880
+ "outputs": [],
881
+ "source": [
882
+ "# let's look at screening glucose and BP measurements"
883
+ ]
884
+ },
885
+ {
886
+ "cell_type": "code",
887
+ "execution_count": null,
888
+ "id": "63",
889
+ "metadata": {},
890
+ "outputs": [],
891
+ "source": [
892
+ "cond = ((df[\"eligible_part_one\"]==\"Yes\") \n",
893
+ " & (df[\"eligible_part_two\"]==\"Yes\")\n",
894
+ " & (df[\"fasted\"]==\"Yes\")\n",
895
+ " & ((df['fbg_value'].notna()) | (df['ogtt_value'].notna()) | (df['fbg2_value'].notna()) | (df['ogtt2_value'].notna()))\n",
896
+ " )\n"
897
+ ]
898
+ },
899
+ {
900
+ "cell_type": "code",
901
+ "execution_count": null,
902
+ "id": "64",
903
+ "metadata": {},
904
+ "outputs": [],
905
+ "source": [
906
+ "cond = ((df[\"eligible_part_one\"]==\"Yes\") \n",
907
+ " & (df[\"eligible_part_two\"]==\"Yes\")\n",
908
+ " & (df[\"fasted\"]==\"Yes\")\n",
909
+ " & (df['fbg_value'].notna())\n",
910
+ " )\n"
911
+ ]
912
+ },
913
+ {
914
+ "cell_type": "code",
915
+ "execution_count": null,
916
+ "id": "65",
917
+ "metadata": {},
918
+ "outputs": [],
919
+ "source": [
920
+ "len(df[cond])"
921
+ ]
922
+ },
923
+ {
924
+ "cell_type": "code",
925
+ "execution_count": null,
926
+ "id": "66",
927
+ "metadata": {},
928
+ "outputs": [],
929
+ "source": [
930
+ "cond = cond & (df[\"ogtt_value\"].notna())\n",
931
+ "df_crosstab = pd.crosstab(df[cond]['fbg_value'].notna(), df[cond]['gender'], margins=True, dropna=False)\n",
932
+ "df_crosstab\n"
933
+ ]
934
+ },
935
+ {
936
+ "cell_type": "code",
937
+ "execution_count": null,
938
+ "id": "67",
939
+ "metadata": {},
940
+ "outputs": [],
941
+ "source": [
942
+ "df2 = df[cond]\n",
943
+ "df2[\"fbg\"] = df2[\"fbg_value\"]\n",
944
+ "df2.loc[df[\"fbg_value\"].notna() & df2[\"fbg2_value\"].notna(), \"fbg\"] = df2[\"fbg2_value\"]\n",
945
+ "df2[\"fbg\"] = pd.to_numeric(df2[\"fbg\"])"
946
+ ]
947
+ },
948
+ {
949
+ "cell_type": "code",
950
+ "execution_count": null,
951
+ "id": "68",
952
+ "metadata": {},
953
+ "outputs": [],
954
+ "source": [
955
+ "df2[df2[\"fbg2_value\"].notna()][[\"fbg\", \"fbg_value\",\"fbg2_value\"]]"
956
+ ]
957
+ },
958
+ {
959
+ "cell_type": "code",
960
+ "execution_count": null,
961
+ "id": "69",
962
+ "metadata": {},
963
+ "outputs": [],
964
+ "source": [
965
+ "df2['fbg'].describe()"
966
+ ]
967
+ },
968
+ {
969
+ "cell_type": "code",
970
+ "execution_count": null,
971
+ "id": "70",
972
+ "metadata": {},
973
+ "outputs": [],
974
+ "source": []
975
+ },
976
+ {
977
+ "cell_type": "code",
978
+ "execution_count": null,
979
+ "id": "71",
980
+ "metadata": {},
981
+ "outputs": [],
982
+ "source": []
983
+ },
984
+ {
985
+ "cell_type": "code",
986
+ "execution_count": null,
987
+ "id": "72",
988
+ "metadata": {},
989
+ "outputs": [],
990
+ "source": [
991
+ "# PART TWO\n",
992
+ "# \"congestive_heart_failure\",\n",
993
+ "# \"liver_disease\",\n",
994
+ "# \"alcoholism\",\n",
995
+ "# \"acute_metabolic_acidosis\",\n",
996
+ "# \"renal_function_condition\",\n",
997
+ "# \"tissue_hypoxia_condition\",\n",
998
+ "# \"acute_condition\",\n",
999
+ "# \"metformin_sensitivity\","
1000
+ ]
1001
+ },
1002
+ {
1003
+ "cell_type": "code",
1004
+ "execution_count": null,
1005
+ "id": "73",
1006
+ "metadata": {},
1007
+ "outputs": [],
1008
+ "source": [
1009
+ "# part one variables\n",
1010
+ "\n",
1011
+ "# \"meta_phase_two\",\n",
1012
+ "# \"hiv_pos\",\n",
1013
+ "# \"art_six_months\",\n",
1014
+ "# \"on_rx_stable\",\n",
1015
+ "# \"vl_undetectable\",\n",
1016
+ "# \"lives_nearby\",\n",
1017
+ "# \"staying_nearby_12\",\n",
1018
+ "# \"pregnant\",\n"
1019
+ ]
1020
+ },
1021
+ {
1022
+ "cell_type": "code",
1023
+ "execution_count": null,
1024
+ "id": "74",
1025
+ "metadata": {},
1026
+ "outputs": [],
1027
+ "source": []
1028
+ },
1029
+ {
1030
+ "cell_type": "code",
1031
+ "execution_count": null,
1032
+ "id": "75",
1033
+ "metadata": {},
1034
+ "outputs": [],
1035
+ "source": [
1036
+ "# only fasted for 7h\n",
1037
+ "df[df.subject_identifier==\"105-30-0164-8\"].to_dict()"
1038
+ ]
1039
+ },
1040
+ {
1041
+ "cell_type": "code",
1042
+ "execution_count": null,
1043
+ "id": "76",
1044
+ "metadata": {},
1045
+ "outputs": [],
1046
+ "source": [
1047
+ "df[~(df.subject_identifier.isna())][[\"fasted\", \"fasted_duration_delta\"]]\n"
1048
+ ]
1049
+ },
1050
+ {
1051
+ "cell_type": "code",
1052
+ "execution_count": null,
1053
+ "id": "77",
1054
+ "metadata": {},
1055
+ "outputs": [],
1056
+ "source": []
1057
+ },
1058
+ {
1059
+ "cell_type": "code",
1060
+ "execution_count": null,
1061
+ "id": "78",
1062
+ "metadata": {},
1063
+ "outputs": [],
1064
+ "source": []
1065
+ },
1066
+ {
1067
+ "cell_type": "code",
1068
+ "execution_count": null,
1069
+ "id": "79",
1070
+ "metadata": {},
1071
+ "outputs": [],
1072
+ "source": [
1073
+ "from meta_prn.models import OnSchedule, OffSchedule, OnScheduleDmReferral, OffScheduleDmReferral\n",
1074
+ "df_on_meta = read_frame(OnSchedule.objects.values(\"subject_identifier\", \"onschedule_datetime\").all())\n",
1075
+ "df_off_meta = read_frame(OffSchedule.objects.values(\"subject_identifier\", \"offschedule_datetime\").all())\n",
1076
+ "df_on = read_frame(OnScheduleDmReferral.objects.values(\"subject_identifier\", \"onschedule_datetime\").all())\n",
1077
+ "df_off = read_frame(OffScheduleDmReferral.objects.values(\"subject_identifier\", \"offschedule_datetime\").all())\n"
1078
+ ]
1079
+ },
1080
+ {
1081
+ "cell_type": "markdown",
1082
+ "id": "80",
1083
+ "metadata": {},
1084
+ "source": []
1085
+ },
1086
+ {
1087
+ "cell_type": "code",
1088
+ "execution_count": null,
1089
+ "id": "81",
1090
+ "metadata": {},
1091
+ "outputs": [],
1092
+ "source": [
1093
+ "def get_meta_duration(s):\n",
1094
+ " meta_off = get_utcnow() if pd.isna(s[\"meta_offschedule_datetime\"]) else s[\"meta_offschedule_datetime\"]\n",
1095
+ " return meta_off - s[\"meta_onschedule_datetime\"] \n",
1096
+ "\n",
1097
+ "def get_dm_duration(s):\n",
1098
+ " dm_off = get_utcnow() if pd.isna(s[\"dm_offschedule_datetime\"]) else s[\"dm_offschedule_datetime\"]\n",
1099
+ " return dm_off - s[\"dm_onschedule_datetime\"] \n",
1100
+ "\n",
1101
+ "df_status = pd.merge(df_on_meta, df_off_meta, on=\"subject_identifier\", how=\"left\") \n",
1102
+ "df_status.columns = [\"subject_identifier\", \"meta_onschedule_datetime\", \"meta_offschedule_datetime\"]\n",
1103
+ "df_status = df_status.merge(df_on, on=\"subject_identifier\", how=\"left\")\n",
1104
+ "df_status = df_status.merge(df_off, on=\"subject_identifier\", how=\"left\")\n",
1105
+ "df_status.columns = [\"subject_identifier\", \"meta_onschedule_datetime\", \"meta_offschedule_datetime\", \"dm_onschedule_datetime\", \"dm_offschedule_datetime\"]\n",
1106
+ "df_status[\"meta_duration\"] = df_status.apply(get_meta_duration, axis=1)\n",
1107
+ "df_status[\"meta_duration_days\"] = df_status[\"meta_duration\"].dt.days\n",
1108
+ "df_status[\"dm_duration\"] = df_status.apply(get_dm_duration, axis=1)\n",
1109
+ "df_status[\"dm_duration_days\"] = df_status[\"dm_duration\"].dt.days\n",
1110
+ "df_status.to_csv(report_folder / \"meta_schedule_status.csv\", index=False)"
1111
+ ]
1112
+ },
1113
+ {
1114
+ "cell_type": "code",
1115
+ "execution_count": null,
1116
+ "id": "82",
1117
+ "metadata": {},
1118
+ "outputs": [],
1119
+ "source": [
1120
+ "df_on = df_on.merge(df_off, on=\"subject_identifier\", how=\"left\")\n"
1121
+ ]
1122
+ },
1123
+ {
1124
+ "cell_type": "code",
1125
+ "execution_count": null,
1126
+ "id": "83",
1127
+ "metadata": {},
1128
+ "outputs": [],
1129
+ "source": [
1130
+ "from edc_utils import get_utcnow\n",
1131
+ "\n",
1132
+ "now = get_utcnow()\n",
1133
+ "df_on[\"duration\"] = now - df_on[\"onschedule_datetime\"] "
1134
+ ]
1135
+ },
1136
+ {
1137
+ "cell_type": "code",
1138
+ "execution_count": null,
1139
+ "id": "84",
1140
+ "metadata": {},
1141
+ "outputs": [],
1142
+ "source": [
1143
+ "df_on[df_on.duration >= pd.Timedelta(days=182)].to_stata\n"
1144
+ ]
1145
+ },
1146
+ {
1147
+ "cell_type": "code",
1148
+ "execution_count": null,
1149
+ "id": "85",
1150
+ "metadata": {},
1151
+ "outputs": [],
1152
+ "source": []
1153
+ }
1154
+ ],
1155
+ "metadata": {
1156
+ "kernelspec": {
1157
+ "display_name": "Python 3 (ipykernel)",
1158
+ "language": "python",
1159
+ "name": "python3"
1160
+ },
1161
+ "language_info": {
1162
+ "codemirror_mode": {
1163
+ "name": "ipython",
1164
+ "version": 3
1165
+ },
1166
+ "file_extension": ".py",
1167
+ "mimetype": "text/x-python",
1168
+ "name": "python",
1169
+ "nbconvert_exporter": "python",
1170
+ "pygments_lexer": "ipython3",
1171
+ "version": "3.12.4"
1172
+ }
1173
+ },
1174
+ "nbformat": 4,
1175
+ "nbformat_minor": 5
1176
+ }