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,958 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": null,
6
+ "id": "0",
7
+ "metadata": {},
8
+ "outputs": [],
9
+ "source": [
10
+ "%load_ext sql\n",
11
+ "%sql mysql+mysqldb://root:cc3721b@127.0.0.1:3306/meta3_production\n",
12
+ "\n",
13
+ "import pandas as pd\n",
14
+ "from dj_notebook import activate\n",
15
+ "import numpy as np\n",
16
+ "import matplotlib.pyplot as plt\n",
17
+ "import seaborn as sns\n",
18
+ "\n",
19
+ "plus = activate(dotenv_file=\"/Users/erikvw/source/edc_source/meta-edc/.env\")"
20
+ ]
21
+ },
22
+ {
23
+ "cell_type": "code",
24
+ "execution_count": null,
25
+ "id": "1",
26
+ "metadata": {},
27
+ "outputs": [],
28
+ "source": [
29
+ "from meta_screening.models import SubjectScreening\n",
30
+ "from django_pandas.io import read_frame\n"
31
+ ]
32
+ },
33
+ {
34
+ "cell_type": "code",
35
+ "execution_count": null,
36
+ "id": "2",
37
+ "metadata": {},
38
+ "outputs": [],
39
+ "source": [
40
+ "qs = SubjectScreening.objects.all()\n",
41
+ "df = read_frame(qs)\n"
42
+ ]
43
+ },
44
+ {
45
+ "cell_type": "code",
46
+ "execution_count": null,
47
+ "id": "3",
48
+ "metadata": {},
49
+ "outputs": [],
50
+ "source": []
51
+ },
52
+ {
53
+ "cell_type": "code",
54
+ "execution_count": null,
55
+ "id": "4",
56
+ "metadata": {},
57
+ "outputs": [],
58
+ "source": [
59
+ "df[\"meta_phase_two\"] = df[\"meta_phase_two\"].apply(lambda x: \"No\" if not x else x)"
60
+ ]
61
+ },
62
+ {
63
+ "cell_type": "code",
64
+ "execution_count": null,
65
+ "id": "5",
66
+ "metadata": {},
67
+ "outputs": [],
68
+ "source": [
69
+ "pd.crosstab(df['gender'], 'subjects')"
70
+ ]
71
+ },
72
+ {
73
+ "cell_type": "code",
74
+ "execution_count": null,
75
+ "id": "6",
76
+ "metadata": {},
77
+ "outputs": [],
78
+ "source": [
79
+ "list(df.columns)"
80
+ ]
81
+ },
82
+ {
83
+ "cell_type": "code",
84
+ "execution_count": null,
85
+ "id": "7",
86
+ "metadata": {},
87
+ "outputs": [],
88
+ "source": [
89
+ "gender = pd.crosstab(index=df['gender'], columns=[\"gender\"], margins=True)\n",
90
+ "gender.columns = [\"gender\", 'rowtotal']\n",
91
+ "gender.index = ['female', 'male', 'coltotal']\n",
92
+ "gender"
93
+ ]
94
+ },
95
+ {
96
+ "cell_type": "code",
97
+ "execution_count": null,
98
+ "id": "8",
99
+ "metadata": {},
100
+ "outputs": [],
101
+ "source": [
102
+ "# counts by site - row, column\n",
103
+ "gender_by_site = pd.crosstab(df['site'], df['gender'], margins=True)\n",
104
+ "gender_by_site.columns = [\"female\", \"male\", \"rowtotal\"]\n",
105
+ "gender_by_site.index = [\"amana\", \"hindu-mandal\", \"mnazi-moja\", \"mwananyamala\", \"temeke\", \"coltotal\"]\n",
106
+ "gender_by_site"
107
+ ]
108
+ },
109
+ {
110
+ "cell_type": "code",
111
+ "execution_count": null,
112
+ "id": "9",
113
+ "metadata": {},
114
+ "outputs": [],
115
+ "source": [
116
+ "# proportion of counts by row, column\n",
117
+ "gender_by_site/gender_by_site.loc[\"coltotal\",\"rowtotal\"]"
118
+ ]
119
+ },
120
+ {
121
+ "cell_type": "code",
122
+ "execution_count": null,
123
+ "id": "10",
124
+ "metadata": {},
125
+ "outputs": [],
126
+ "source": [
127
+ "# proportion of counts by column\n",
128
+ "gender_by_site/gender_by_site.loc[\"coltotal\"]"
129
+ ]
130
+ },
131
+ {
132
+ "cell_type": "code",
133
+ "execution_count": null,
134
+ "id": "11",
135
+ "metadata": {},
136
+ "outputs": [],
137
+ "source": [
138
+ "# proportion of counts by row\n",
139
+ "prop = gender_by_site.div(gender_by_site[\"rowtotal\"], axis=0)\n",
140
+ "prop"
141
+ ]
142
+ },
143
+ {
144
+ "cell_type": "code",
145
+ "execution_count": null,
146
+ "id": "12",
147
+ "metadata": {},
148
+ "outputs": [],
149
+ "source": [
150
+ "# stats for female by site => mean=.718, well balanced\n",
151
+ "prop['female'].describe()"
152
+ ]
153
+ },
154
+ {
155
+ "cell_type": "code",
156
+ "execution_count": null,
157
+ "id": "13",
158
+ "metadata": {},
159
+ "outputs": [],
160
+ "source": [
161
+ "# part one variables\n",
162
+ "\n",
163
+ "# \"meta_phase_two\",\n",
164
+ "# \"hiv_pos\",\n",
165
+ "# \"art_six_months\",\n",
166
+ "# \"on_rx_stable\",\n",
167
+ "# \"vl_undetectable\",\n",
168
+ "# \"lives_nearby\",\n",
169
+ "# \"staying_nearby_12\",\n",
170
+ "# \"pregnant\",\n"
171
+ ]
172
+ },
173
+ {
174
+ "cell_type": "code",
175
+ "execution_count": null,
176
+ "id": "14",
177
+ "metadata": {},
178
+ "outputs": [],
179
+ "source": []
180
+ },
181
+ {
182
+ "cell_type": "code",
183
+ "execution_count": null,
184
+ "id": "15",
185
+ "metadata": {},
186
+ "outputs": [],
187
+ "source": [
188
+ "meta_phase_two = pd.crosstab(index=df['meta_phase_two'], columns=[df[\"eligible\"],df[\"gender\"]], margins=True)\n",
189
+ "# meta_phase_two.columns = [\"female\", \"male\", \"rowtotal\"]\n",
190
+ "# meta_phase_two.index = [\"no\", \"yes\", \"coltotal\"]\n",
191
+ "meta_phase_two"
192
+ ]
193
+ },
194
+ {
195
+ "cell_type": "code",
196
+ "execution_count": null,
197
+ "id": "16",
198
+ "metadata": {},
199
+ "outputs": [],
200
+ "source": [
201
+ "on_rx_stable = pd.crosstab(index=df['on_rx_stable'], columns=df[\"gender\"], margins=True)\n",
202
+ "on_rx_stable.columns = [\"female\", \"male\", \"rowtotal\"]\n",
203
+ "on_rx_stable.index = [\"no\", \"n/a\", \"yes\", \"coltotal\"]\n",
204
+ "on_rx_stable"
205
+ ]
206
+ },
207
+ {
208
+ "cell_type": "code",
209
+ "execution_count": null,
210
+ "id": "17",
211
+ "metadata": {},
212
+ "outputs": [],
213
+ "source": [
214
+ "on_dm_medication = pd.crosstab(index=df['on_dm_medication'], columns=df[\"gender\"], margins=True)\n",
215
+ "on_dm_medication.columns = [\"female\", \"male\", \"rowtotal\"]\n",
216
+ "on_dm_medication.index = [\"no\", \"yes\", \"coltotal\"]\n",
217
+ "on_dm_medication"
218
+ ]
219
+ },
220
+ {
221
+ "cell_type": "code",
222
+ "execution_count": null,
223
+ "id": "18",
224
+ "metadata": {},
225
+ "outputs": [],
226
+ "source": [
227
+ "hiv_pos = pd.crosstab(index=df['hiv_pos'], columns=df[\"gender\"], margins=True)\n",
228
+ "hiv_pos.columns = [\"female\", \"male\", \"rowtotal\"]\n",
229
+ "hiv_pos.index = [\"no\", \"yes\", \"coltotal\"]\n",
230
+ "hiv_pos"
231
+ ]
232
+ },
233
+ {
234
+ "cell_type": "code",
235
+ "execution_count": null,
236
+ "id": "19",
237
+ "metadata": {},
238
+ "outputs": [],
239
+ "source": [
240
+ "art_six_months = pd.crosstab(index=df['art_six_months'], columns=df[\"gender\"], margins=True)\n",
241
+ "art_six_months.columns = [\"female\", \"male\", \"rowtotal\"]\n",
242
+ "art_six_months.index = [\"no\", \"n/a\", \"yes\", \"coltotal\"]\n",
243
+ "art_six_months"
244
+ ]
245
+ },
246
+ {
247
+ "cell_type": "code",
248
+ "execution_count": null,
249
+ "id": "20",
250
+ "metadata": {},
251
+ "outputs": [],
252
+ "source": [
253
+ "vl_undetectable = pd.crosstab(index=df['vl_undetectable'], columns=df[\"gender\"], margins=True)\n",
254
+ "vl_undetectable.columns = [\"female\", \"male\", \"rowtotal\"]\n",
255
+ "vl_undetectable.index = [\"no\", \"n/a\", \"yes\", \"coltotal\"]\n",
256
+ "vl_undetectable"
257
+ ]
258
+ },
259
+ {
260
+ "cell_type": "code",
261
+ "execution_count": null,
262
+ "id": "21",
263
+ "metadata": {},
264
+ "outputs": [],
265
+ "source": [
266
+ "lives_nearby = pd.crosstab(index=df['lives_nearby'], columns=df[\"gender\"], margins=True)\n",
267
+ "lives_nearby.columns = [\"female\", \"male\", \"rowtotal\"]\n",
268
+ "lives_nearby.index = [\"no\", \"yes\", \"coltotal\"]\n",
269
+ "lives_nearby"
270
+ ]
271
+ },
272
+ {
273
+ "cell_type": "code",
274
+ "execution_count": null,
275
+ "id": "22",
276
+ "metadata": {},
277
+ "outputs": [],
278
+ "source": [
279
+ "staying_nearby_12 = pd.crosstab(index=df['staying_nearby_12'], columns=df[\"gender\"], margins=True)\n",
280
+ "staying_nearby_12.columns = [\"female\", \"male\", \"rowtotal\"]\n",
281
+ "staying_nearby_12.index = [\"no\", \"yes\", \"coltotal\"]\n",
282
+ "staying_nearby_12"
283
+ ]
284
+ },
285
+ {
286
+ "cell_type": "code",
287
+ "execution_count": null,
288
+ "id": "23",
289
+ "metadata": {},
290
+ "outputs": [],
291
+ "source": [
292
+ "pregnant = pd.crosstab(index=df['pregnant'], columns=df[\"gender\"], margins=True)\n",
293
+ "pregnant.columns = [\"female\", \"male\", \"rowtotal\"]\n",
294
+ "pregnant.index = [\"no\", \"n/a\", \"yes\", \"coltotal\"]\n",
295
+ "pregnant"
296
+ ]
297
+ },
298
+ {
299
+ "cell_type": "code",
300
+ "execution_count": null,
301
+ "id": "24",
302
+ "metadata": {},
303
+ "outputs": [],
304
+ "source": [
305
+ "eligible_part_one = pd.crosstab(index=df['eligible_part_one'], columns=df[\"gender\"], margins=True)\n",
306
+ "eligible_part_one.columns = [\"female\", \"male\", \"rowtotal\"]\n",
307
+ "eligible_part_one.index = [\"no\", \"yes\", \"coltotal\"]\n",
308
+ "eligible_part_one"
309
+ ]
310
+ },
311
+ {
312
+ "cell_type": "code",
313
+ "execution_count": null,
314
+ "id": "25",
315
+ "metadata": {},
316
+ "outputs": [],
317
+ "source": [
318
+ "# df_part_one eligible\n",
319
+ "# \"meta_phase_two\",\n",
320
+ "# \"hiv_pos\",\n",
321
+ "# \"art_six_months\",\n",
322
+ "# \"on_rx_stable\",\n",
323
+ "# \"vl_undetectable\",\n",
324
+ "# \"lives_nearby\",\n",
325
+ "# \"staying_nearby_12\",\n",
326
+ "# \"pregnant\",\n",
327
+ "\n",
328
+ "df_part_one = df[(df[\"meta_phase_two\"]==\"No\") & (df[\"hiv_pos\"]==\"Yes\") & (df[\"art_six_months\"]==\"Yes\") & (df[\"on_rx_stable\"]==\"Yes\") & (df[\"vl_undetectable\"]==\"Yes\") & (df[\"lives_nearby\"]==\"Yes\") & (df[\"staying_nearby_12\"]==\"Yes\") & (df[\"pregnant\"]!=\"Yes\")]\n",
329
+ "len(df_part_one)\n"
330
+ ]
331
+ },
332
+ {
333
+ "cell_type": "code",
334
+ "execution_count": null,
335
+ "id": "26",
336
+ "metadata": {},
337
+ "outputs": [],
338
+ "source": [
339
+ "df_p1_eligible = df[df[\"meta_phase_two\"]!=\"Yes\"]['meta_phase_two']"
340
+ ]
341
+ },
342
+ {
343
+ "cell_type": "code",
344
+ "execution_count": null,
345
+ "id": "27",
346
+ "metadata": {},
347
+ "outputs": [],
348
+ "source": [
349
+ "# PART TWO\n",
350
+ "# \"congestive_heart_failure\",\n",
351
+ "# \"liver_disease\",\n",
352
+ "# \"alcoholism\",\n",
353
+ "# \"acute_metabolic_acidosis\",\n",
354
+ "# \"renal_function_condition\",\n",
355
+ "# \"tissue_hypoxia_condition\",\n",
356
+ "# \"acute_condition\",\n",
357
+ "# \"metformin_sensitivity\",\n",
358
+ "# \"has_dm\",\n",
359
+ "# \"on_dm_medication\","
360
+ ]
361
+ },
362
+ {
363
+ "cell_type": "code",
364
+ "execution_count": null,
365
+ "id": "28",
366
+ "metadata": {},
367
+ "outputs": [],
368
+ "source": [
369
+ "\n",
370
+ "congestive_heart_failure = pd.crosstab(index=df['congestive_heart_failure'], columns=df[\"gender\"], margins=True)\n",
371
+ "congestive_heart_failure.columns = [\"female\", \"male\", \"rowtotal\"]\n",
372
+ "congestive_heart_failure.index = [\"no\", \"yes\", \"coltotal\"]\n",
373
+ "congestive_heart_failure"
374
+ ]
375
+ },
376
+ {
377
+ "cell_type": "code",
378
+ "execution_count": null,
379
+ "id": "29",
380
+ "metadata": {},
381
+ "outputs": [],
382
+ "source": [
383
+ "liver_disease = pd.crosstab(index=df['liver_disease'], columns=df[\"gender\"], margins=True)\n",
384
+ "liver_disease.columns = [\"female\", \"male\", \"rowtotal\"]\n",
385
+ "liver_disease.index = [\"no\", \"yes\", \"coltotal\"]\n",
386
+ "liver_disease"
387
+ ]
388
+ },
389
+ {
390
+ "cell_type": "code",
391
+ "execution_count": null,
392
+ "id": "30",
393
+ "metadata": {},
394
+ "outputs": [],
395
+ "source": [
396
+ "alcoholism = pd.crosstab(index=df['alcoholism'], columns=df[\"gender\"], margins=True)\n",
397
+ "alcoholism.columns = [\"female\", \"male\", \"rowtotal\"]\n",
398
+ "alcoholism.index = [\"no\", \"yes\", \"coltotal\"]\n",
399
+ "alcoholism"
400
+ ]
401
+ },
402
+ {
403
+ "cell_type": "code",
404
+ "execution_count": null,
405
+ "id": "31",
406
+ "metadata": {},
407
+ "outputs": [],
408
+ "source": [
409
+ "\n",
410
+ "acute_metabolic_acidosis = pd.crosstab(index=df['acute_metabolic_acidosis'], columns=df[\"gender\"], margins=True)\n",
411
+ "acute_metabolic_acidosis.columns = [\"female\", \"male\", \"rowtotal\"]\n",
412
+ "acute_metabolic_acidosis.index = [\"no\", \"yes\", \"coltotal\"]\n",
413
+ "acute_metabolic_acidosis"
414
+ ]
415
+ },
416
+ {
417
+ "cell_type": "code",
418
+ "execution_count": null,
419
+ "id": "32",
420
+ "metadata": {},
421
+ "outputs": [],
422
+ "source": [
423
+ "\n",
424
+ "renal_function_condition = pd.crosstab(index=df['renal_function_condition'], columns=df[\"gender\"], margins=True)\n",
425
+ "renal_function_condition.columns = [\"female\", \"male\", \"rowtotal\"]\n",
426
+ "renal_function_condition.index = [\"no\", \"yes\", \"coltotal\"]\n",
427
+ "renal_function_condition"
428
+ ]
429
+ },
430
+ {
431
+ "cell_type": "code",
432
+ "execution_count": null,
433
+ "id": "33",
434
+ "metadata": {},
435
+ "outputs": [],
436
+ "source": [
437
+ "\n",
438
+ "tissue_hypoxia_condition = pd.crosstab(index=df['tissue_hypoxia_condition'], columns=df[\"gender\"], margins=True)\n",
439
+ "tissue_hypoxia_condition.columns = [\"female\", \"male\", \"rowtotal\"]\n",
440
+ "tissue_hypoxia_condition.index = [\"no\", \"yes\", \"coltotal\"]\n",
441
+ "tissue_hypoxia_condition"
442
+ ]
443
+ },
444
+ {
445
+ "cell_type": "code",
446
+ "execution_count": null,
447
+ "id": "34",
448
+ "metadata": {},
449
+ "outputs": [],
450
+ "source": [
451
+ "\n",
452
+ "metformin_sensitivity = pd.crosstab(index=df['metformin_sensitivity'], columns=df[\"gender\"], margins=True)\n",
453
+ "metformin_sensitivity.columns = [\"female\", \"male\", \"rowtotal\"]\n",
454
+ "metformin_sensitivity.index = [\"no\", \"yes\", \"coltotal\"]\n",
455
+ "metformin_sensitivity"
456
+ ]
457
+ },
458
+ {
459
+ "cell_type": "code",
460
+ "execution_count": null,
461
+ "id": "35",
462
+ "metadata": {},
463
+ "outputs": [],
464
+ "source": [
465
+ "\n",
466
+ "acute_condition = pd.crosstab(index=df['acute_condition'], columns=df[\"gender\"], margins=True)\n",
467
+ "acute_condition.columns = [\"female\", \"male\", \"rowtotal\"]\n",
468
+ "acute_condition.index = [\"no\", \"yes\", \"coltotal\"]\n",
469
+ "acute_condition"
470
+ ]
471
+ },
472
+ {
473
+ "cell_type": "code",
474
+ "execution_count": null,
475
+ "id": "36",
476
+ "metadata": {},
477
+ "outputs": [],
478
+ "source": [
479
+ "# has_dm by gender (if not eligible_part_one)\n",
480
+ "has_dm = pd.crosstab(index=df[df[\"eligible_part_one\"]==\"Yes\"]['has_dm'], columns=df[\"gender\"], margins=True)\n",
481
+ "has_dm.columns = [\"female\", \"male\", \"rowtotal\"]\n",
482
+ "has_dm.index = [\"no\", \"yes\", \"coltotal\"]\n",
483
+ "has_dm"
484
+ ]
485
+ },
486
+ {
487
+ "cell_type": "code",
488
+ "execution_count": null,
489
+ "id": "37",
490
+ "metadata": {},
491
+ "outputs": [],
492
+ "source": [
493
+ "# has_dm by gender, eligible_part_one\n",
494
+ "has_dm = pd.crosstab(index=df['has_dm'], columns=[df[\"gender\"],df[\"eligible_part_one\"]], margins=True)\n",
495
+ "# has_dm.columns = [\"female\", \"male\", \"rowtotal\"]\n",
496
+ "# has_dm.index = [\"no\", \"yes\", \"coltotal\"]\n",
497
+ "has_dm"
498
+ ]
499
+ },
500
+ {
501
+ "cell_type": "code",
502
+ "execution_count": null,
503
+ "id": "38",
504
+ "metadata": {},
505
+ "outputs": [],
506
+ "source": [
507
+ "# has_dm by gender\n",
508
+ "has_dm = pd.crosstab(index=df['has_dm'], columns=df[\"gender\"], margins=True)\n",
509
+ "has_dm.columns = [\"female\", \"male\", \"rowtotal\"]\n",
510
+ "has_dm.index = [\"no\", \"yes\", \"coltotal\"]\n",
511
+ "has_dm"
512
+ ]
513
+ },
514
+ {
515
+ "cell_type": "code",
516
+ "execution_count": null,
517
+ "id": "39",
518
+ "metadata": {},
519
+ "outputs": [],
520
+ "source": [
521
+ "has_dm.div(has_dm[\"rowtotal\"], axis=0)"
522
+ ]
523
+ },
524
+ {
525
+ "cell_type": "code",
526
+ "execution_count": null,
527
+ "id": "40",
528
+ "metadata": {},
529
+ "outputs": [],
530
+ "source": [
531
+ "has_dm / len(df)"
532
+ ]
533
+ },
534
+ {
535
+ "cell_type": "code",
536
+ "execution_count": null,
537
+ "id": "41",
538
+ "metadata": {},
539
+ "outputs": [],
540
+ "source": [
541
+ "df[\"eligible_part_one\"].value_counts()"
542
+ ]
543
+ },
544
+ {
545
+ "cell_type": "code",
546
+ "execution_count": null,
547
+ "id": "42",
548
+ "metadata": {},
549
+ "outputs": [],
550
+ "source": [
551
+ "df[\"eligible_part_two\"].value_counts()"
552
+ ]
553
+ },
554
+ {
555
+ "cell_type": "code",
556
+ "execution_count": null,
557
+ "id": "43",
558
+ "metadata": {},
559
+ "outputs": [],
560
+ "source": [
561
+ "df[\"eligible_part_three\"].value_counts()"
562
+ ]
563
+ },
564
+ {
565
+ "cell_type": "code",
566
+ "execution_count": null,
567
+ "id": "44",
568
+ "metadata": {},
569
+ "outputs": [],
570
+ "source": [
571
+ "df[\"eligible\"].value_counts()"
572
+ ]
573
+ },
574
+ {
575
+ "cell_type": "code",
576
+ "execution_count": null,
577
+ "id": "45",
578
+ "metadata": {},
579
+ "outputs": [],
580
+ "source": [
581
+ "df[\"consented\"].value_counts()"
582
+ ]
583
+ },
584
+ {
585
+ "cell_type": "code",
586
+ "execution_count": null,
587
+ "id": "46",
588
+ "metadata": {},
589
+ "outputs": [],
590
+ "source": [
591
+ "df[\"eligible\"].value_counts()\n"
592
+ ]
593
+ },
594
+ {
595
+ "cell_type": "code",
596
+ "execution_count": null,
597
+ "id": "47",
598
+ "metadata": {},
599
+ "outputs": [],
600
+ "source": [
601
+ "pd.crosstab(index=df['eligible'], columns=df[\"gender\"], margins=True)"
602
+ ]
603
+ },
604
+ {
605
+ "cell_type": "code",
606
+ "execution_count": null,
607
+ "id": "48",
608
+ "metadata": {},
609
+ "outputs": [],
610
+ "source": [
611
+ "# let's start here for the consort chart"
612
+ ]
613
+ },
614
+ {
615
+ "cell_type": "code",
616
+ "execution_count": null,
617
+ "id": "49",
618
+ "metadata": {},
619
+ "outputs": [],
620
+ "source": [
621
+ "dm1 = df[df[\"meta_phase_two\"]==\"No\"]\n",
622
+ "dm1 = pd.crosstab(index=dm1['eligible'], columns=df[\"gender\"], margins=True, dropna=False)\n",
623
+ "dm1.columns = [\"female\", \"male\", \"rowtotal\"]\n",
624
+ "dm1.index = [\"no\", \"yes\", \"coltotal\"]\n",
625
+ "dm1"
626
+ ]
627
+ },
628
+ {
629
+ "cell_type": "code",
630
+ "execution_count": null,
631
+ "id": "50",
632
+ "metadata": {},
633
+ "outputs": [],
634
+ "source": [
635
+ "df1 = df[(df[\"meta_phase_two\"]==\"No\")]"
636
+ ]
637
+ },
638
+ {
639
+ "cell_type": "code",
640
+ "execution_count": null,
641
+ "id": "51",
642
+ "metadata": {},
643
+ "outputs": [],
644
+ "source": [
645
+ "hiv_pos = pd.crosstab(index=df1['hiv_pos'], columns=df1[\"gender\"], margins=True)\n",
646
+ "hiv_pos.columns = [\"female\", \"male\", \"rowtotal\"]\n",
647
+ "hiv_pos.index = [\"no\", \"yes\", \"coltotal\"]\n",
648
+ "hiv_pos"
649
+ ]
650
+ },
651
+ {
652
+ "cell_type": "code",
653
+ "execution_count": null,
654
+ "id": "52",
655
+ "metadata": {},
656
+ "outputs": [],
657
+ "source": [
658
+ "art_six_months = pd.crosstab(index=df1['art_six_months'], columns=df1[\"gender\"], margins=True)\n",
659
+ "art_six_months.columns = [\"female\", \"male\", \"rowtotal\"]\n",
660
+ "art_six_months.index = [\"no\", \"na\", \"yes\", \"coltotal\"]\n",
661
+ "art_six_months"
662
+ ]
663
+ },
664
+ {
665
+ "cell_type": "code",
666
+ "execution_count": null,
667
+ "id": "53",
668
+ "metadata": {},
669
+ "outputs": [],
670
+ "source": [
671
+ "on_rx_stable = pd.crosstab(index=df1['on_rx_stable'], columns=df1[\"gender\"], margins=True)\n",
672
+ "on_rx_stable.columns = [\"female\", \"male\", \"rowtotal\"]\n",
673
+ "on_rx_stable.index = [\"no\", \"na\", \"yes\", \"coltotal\"]\n",
674
+ "on_rx_stable"
675
+ ]
676
+ },
677
+ {
678
+ "cell_type": "code",
679
+ "execution_count": null,
680
+ "id": "54",
681
+ "metadata": {},
682
+ "outputs": [],
683
+ "source": [
684
+ "vl_undetectable = pd.crosstab(index=df1['vl_undetectable'], columns=df1[\"gender\"], margins=True)\n",
685
+ "vl_undetectable.columns = [\"female\", \"male\", \"rowtotal\"]\n",
686
+ "vl_undetectable.index = [\"no\", \"na\", \"yes\", \"coltotal\"]\n",
687
+ "vl_undetectable"
688
+ ]
689
+ },
690
+ {
691
+ "cell_type": "code",
692
+ "execution_count": null,
693
+ "id": "55",
694
+ "metadata": {},
695
+ "outputs": [],
696
+ "source": [
697
+ "len(df1)"
698
+ ]
699
+ },
700
+ {
701
+ "cell_type": "code",
702
+ "execution_count": null,
703
+ "id": "56",
704
+ "metadata": {},
705
+ "outputs": [],
706
+ "source": [
707
+ "\n",
708
+ "df2 = df1[(df1[\"hiv_pos\"]==\"Yes\") & (df1[\"art_six_months\"]!=\"No\") & (df1[\"on_rx_stable\"]!=\"No\") & (df1[\"vl_undetectable\"]!=\"No\")]\n",
709
+ "len(df2)\n"
710
+ ]
711
+ },
712
+ {
713
+ "cell_type": "code",
714
+ "execution_count": null,
715
+ "id": "57",
716
+ "metadata": {},
717
+ "outputs": [],
718
+ "source": [
719
+ "dftmp = pd.crosstab(index=df2['eligible'], columns=df2[\"gender\"], margins=True, dropna=False)\n",
720
+ "dftmp.columns = [\"female\", \"male\", \"rowtotal\"]\n",
721
+ "dftmp.index = [\"no\", \"yes\", \"coltotal\"]\n",
722
+ "dftmp"
723
+ ]
724
+ },
725
+ {
726
+ "cell_type": "code",
727
+ "execution_count": null,
728
+ "id": "58",
729
+ "metadata": {},
730
+ "outputs": [],
731
+ "source": [
732
+ "# \"lives_nearby\",\n",
733
+ "# \"staying_nearby_12\",\n",
734
+ "# \"pregnant\",\n",
735
+ "\n",
736
+ "df3 = df2[(df2[\"lives_nearby\"]==\"Yes\") & (df2[\"staying_nearby_12\"]==\"Yes\")]\n",
737
+ "len(df3)\n"
738
+ ]
739
+ },
740
+ {
741
+ "cell_type": "code",
742
+ "execution_count": null,
743
+ "id": "59",
744
+ "metadata": {},
745
+ "outputs": [],
746
+ "source": [
747
+ "dftmp = pd.crosstab(index=df3['eligible'], columns=df3[\"gender\"], margins=True, dropna=False)\n",
748
+ "dftmp.columns = [\"female\", \"male\", \"rowtotal\"]\n",
749
+ "dftmp.index = [\"no\", \"yes\", \"coltotal\"]\n",
750
+ "dftmp"
751
+ ]
752
+ },
753
+ {
754
+ "cell_type": "code",
755
+ "execution_count": null,
756
+ "id": "60",
757
+ "metadata": {},
758
+ "outputs": [],
759
+ "source": [
760
+ "lives_nearby = pd.crosstab(index=df2['lives_nearby'], columns=df2[\"gender\"], margins=True, dropna=False)\n",
761
+ "lives_nearby.columns = [\"female\", \"male\", \"rowtotal\"]\n",
762
+ "lives_nearby.index = [\"no\", \"yes\", \"coltotal\"]\n",
763
+ "lives_nearby"
764
+ ]
765
+ },
766
+ {
767
+ "cell_type": "code",
768
+ "execution_count": null,
769
+ "id": "61",
770
+ "metadata": {},
771
+ "outputs": [],
772
+ "source": [
773
+ "tmp = df2[df2['lives_nearby']==\"Yes\"]\n",
774
+ "staying_nearby_12 = pd.crosstab(index=tmp['staying_nearby_12'], columns=tmp[\"gender\"], margins=True, dropna=False)\n",
775
+ "staying_nearby_12.columns = [\"female\", \"male\", \"rowtotal\"]\n",
776
+ "staying_nearby_12.index = [\"no\", \"yes\", \"coltotal\"]\n",
777
+ "staying_nearby_12"
778
+ ]
779
+ },
780
+ {
781
+ "cell_type": "code",
782
+ "execution_count": null,
783
+ "id": "62",
784
+ "metadata": {},
785
+ "outputs": [],
786
+ "source": [
787
+ "df4 = df3[(df3[\"pregnant\"]!=\"Yes\")]\n",
788
+ "len(df4)\n"
789
+ ]
790
+ },
791
+ {
792
+ "cell_type": "code",
793
+ "execution_count": null,
794
+ "id": "63",
795
+ "metadata": {},
796
+ "outputs": [],
797
+ "source": [
798
+ "dftmp = pd.crosstab(index=df4['eligible'], columns=df4[\"gender\"], margins=True, dropna=False)\n",
799
+ "dftmp.columns = [\"female\", \"male\", \"rowtotal\"]\n",
800
+ "dftmp.index = [\"no\", \"yes\", \"coltotal\"]\n",
801
+ "dftmp"
802
+ ]
803
+ },
804
+ {
805
+ "cell_type": "code",
806
+ "execution_count": null,
807
+ "id": "64",
808
+ "metadata": {},
809
+ "outputs": [],
810
+ "source": [
811
+ "dftmp = pd.crosstab(index=df4['eligible_part_two'], columns=df4[\"gender\"], margins=True, dropna=True)\n",
812
+ "# dftmp.columns = [\"female\", \"male\", \"rowtotal\"]\n",
813
+ "# dftmp.index = [\"no\", \"yes\", \"coltotal\"]\n",
814
+ "dftmp"
815
+ ]
816
+ },
817
+ {
818
+ "cell_type": "code",
819
+ "execution_count": null,
820
+ "id": "65",
821
+ "metadata": {},
822
+ "outputs": [],
823
+ "source": [
824
+ "# \"congestive_heart_failure\",\n",
825
+ "# \"liver_disease\",\n",
826
+ "# \"alcoholism\",\n",
827
+ "# \"acute_metabolic_acidosis\",\n",
828
+ "# \"renal_function_condition\",\n",
829
+ "# \"tissue_hypoxia_condition\",\n",
830
+ "# \"acute_condition\",\n",
831
+ "# \"metformin_sensitivity\",\n",
832
+ "# \"has_dm\",\n",
833
+ "# \"on_dm_medication\","
834
+ ]
835
+ },
836
+ {
837
+ "cell_type": "code",
838
+ "execution_count": null,
839
+ "id": "66",
840
+ "metadata": {},
841
+ "outputs": [],
842
+ "source": [
843
+ "tmp1 = pd.crosstab(index=df4['acute_condition'], columns=tmp[\"gender\"], margins=True, dropna=False)\n",
844
+ "tmp1.columns = [\"female\", \"male\", \"rowtotal\"]\n",
845
+ "# tmp1.index = [\"no\", \"yes\", \"coltotal\"]\n",
846
+ "tmp1"
847
+ ]
848
+ },
849
+ {
850
+ "cell_type": "code",
851
+ "execution_count": null,
852
+ "id": "67",
853
+ "metadata": {},
854
+ "outputs": [],
855
+ "source": [
856
+ "\n",
857
+ "df5 = df4[(df4[\"congestive_heart_failure\"]!=\"Yes\") & (df4[\"liver_disease\"]!=\"Yes\") & (df4[\"alcoholism\"]!=\"Yes\") & (df4[\"acute_metabolic_acidosis\"]!=\"Yes\") & (df4[\"renal_function_condition\"]!=\"Yes\") & (df4[\"tissue_hypoxia_condition\"]!=\"Yes\") & (df4[\"acute_condition\"]!=\"Yes\")]\n",
858
+ "len(df5)"
859
+ ]
860
+ },
861
+ {
862
+ "cell_type": "code",
863
+ "execution_count": null,
864
+ "id": "68",
865
+ "metadata": {},
866
+ "outputs": [],
867
+ "source": [
868
+ "dftmp = pd.crosstab(index=df5['eligible_part_two'], columns=df5[\"gender\"], margins=True, dropna=True)\n",
869
+ "dftmp"
870
+ ]
871
+ },
872
+ {
873
+ "cell_type": "code",
874
+ "execution_count": null,
875
+ "id": "69",
876
+ "metadata": {},
877
+ "outputs": [],
878
+ "source": [
879
+ "tmp1 = pd.crosstab(index=df5['on_dm_medication'], columns=tmp[\"gender\"], margins=True, dropna=False)\n",
880
+ "tmp1.columns = [\"female\", \"male\", \"rowtotal\"]\n",
881
+ "# tmp1.index = [\"no\", \"yes\", \"coltotal\"]\n",
882
+ "tmp1"
883
+ ]
884
+ },
885
+ {
886
+ "cell_type": "code",
887
+ "execution_count": null,
888
+ "id": "70",
889
+ "metadata": {},
890
+ "outputs": [],
891
+ "source": [
892
+ "df6 = df5[(df5[\"has_dm\"]==\"No\") & (df5[\"on_dm_medication\"]==\"No\") & (df5[\"metformin_sensitivity\"]==\"No\")]\n",
893
+ "len(df6)"
894
+ ]
895
+ },
896
+ {
897
+ "cell_type": "code",
898
+ "execution_count": null,
899
+ "id": "71",
900
+ "metadata": {},
901
+ "outputs": [],
902
+ "source": [
903
+ "dftmp = pd.crosstab(index=df6['eligible_part_two'], columns=df6[\"gender\"], margins=True, dropna=True)\n",
904
+ "dftmp"
905
+ ]
906
+ },
907
+ {
908
+ "cell_type": "code",
909
+ "execution_count": null,
910
+ "id": "72",
911
+ "metadata": {},
912
+ "outputs": [],
913
+ "source": [
914
+ "dftmp = pd.crosstab(index=df['eligible_part_two'], columns=df[\"gender\"], margins=True, dropna=True)\n",
915
+ "dftmp"
916
+ ]
917
+ },
918
+ {
919
+ "cell_type": "code",
920
+ "execution_count": null,
921
+ "id": "73",
922
+ "metadata": {},
923
+ "outputs": [],
924
+ "source": [
925
+ "df['eligible_part_two'].values_count()"
926
+ ]
927
+ },
928
+ {
929
+ "cell_type": "code",
930
+ "execution_count": null,
931
+ "id": "74",
932
+ "metadata": {},
933
+ "outputs": [],
934
+ "source": []
935
+ }
936
+ ],
937
+ "metadata": {
938
+ "kernelspec": {
939
+ "display_name": "Python 3 (ipykernel)",
940
+ "language": "python",
941
+ "name": "python3"
942
+ },
943
+ "language_info": {
944
+ "codemirror_mode": {
945
+ "name": "ipython",
946
+ "version": 3
947
+ },
948
+ "file_extension": ".py",
949
+ "mimetype": "text/x-python",
950
+ "name": "python",
951
+ "nbconvert_exporter": "python",
952
+ "pygments_lexer": "ipython3",
953
+ "version": "3.12.2"
954
+ }
955
+ },
956
+ "nbformat": 4,
957
+ "nbformat_minor": 5
958
+ }