eaglelandsonce commited on
Commit
d25377b
·
verified ·
1 Parent(s): e94efbf

Create Wearable_Data.py

Browse files
Files changed (1) hide show
  1. pages/Wearable_Data.py +105 -0
pages/Wearable_Data.py ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import csv
3
+ import io
4
+ import random
5
+ from datetime import datetime, timedelta
6
+
7
+ st.title("Wearable Data Generator")
8
+
9
+ # User inputs
10
+ num_patients = st.number_input("Number of Patients", min_value=1, value=40)
11
+ num_measurements = st.number_input("Measurements per Patient", min_value=1, value=10)
12
+ start_date = st.date_input("Start Date", value=datetime(2024, 12, 1))
13
+ start_time = st.time_input("Start Time", value=datetime(2024, 12, 1, 8, 0).time())
14
+
15
+ st.write("This tool generates mock wearable data for patients, some of whom have cancer and may exhibit signs of chemo brain.")
16
+
17
+ # Additional parameters
18
+ cancer_rate = st.slider("Percentage of Patients with Cancer", 0, 100, 30) # 30% by default
19
+ chemo_brain_effect = st.slider("Chemo Brain Impact on Activity Level (in % reduction)", 0, 50, 20)
20
+
21
+ # Generate data when user clicks
22
+ if st.button("Generate Data"):
23
+ # Convert start_date and start_time into a datetime
24
+ start_datetime = datetime.combine(start_date, start_time)
25
+
26
+ # Time interval: 1 hour increments
27
+ time_interval = timedelta(hours=1)
28
+
29
+ # Generate unique PRIMARY_PERSON_KEYs
30
+ # We'll create a pattern of keys - hex-like strings
31
+ base_key = "7D2E50BB328E34917766B7A"
32
+ patient_keys = [base_key + format(i, 'X') for i in range(1, num_patients + 1)]
33
+
34
+ # Determine which patients have cancer
35
+ # Randomly assign cancer to the given percentage of patients
36
+ num_cancer_patients = int((cancer_rate / 100) * num_patients)
37
+ cancer_patients = set(random.sample(patient_keys, num_cancer_patients))
38
+
39
+ # Generate data
40
+ # Baseline measurements
41
+ baseline_activity = 2000
42
+ baseline_heart_rate = 80
43
+ baseline_o2 = 98.2
44
+
45
+ # For chemo brain patients, reduce activity by a percentage
46
+ # e.g., chemo brain patient might have a 20% reduction in activity
47
+ # also maybe increase heart rate slightly
48
+ activity_reduction_factor = (100 - chemo_brain_effect) / 100.0
49
+ chemo_heart_rate_increase = 5 # Increase HR by 5 bpm to simulate stress
50
+
51
+ data_rows = []
52
+
53
+ # Prepare timestamps
54
+ timestamps = [start_datetime + i * time_interval for i in range(num_measurements)]
55
+
56
+ # Generate random variability
57
+ for pkey in patient_keys:
58
+ is_cancer = pkey in cancer_patients
59
+ for ts in timestamps:
60
+ # Introduce some random variability
61
+ activity_var = random.randint(-300, 300)
62
+ hr_var = random.randint(-3, 3)
63
+ o2_var = random.uniform(-0.3, 0.3)
64
+
65
+ if is_cancer:
66
+ # Apply chemo brain effects
67
+ activity = int((baseline_activity + activity_var) * activity_reduction_factor)
68
+ heart_rate = baseline_heart_rate + hr_var + chemo_heart_rate_increase
69
+ else:
70
+ activity = baseline_activity + activity_var
71
+ heart_rate = baseline_heart_rate + hr_var
72
+
73
+ o2_sat = baseline_o2 + o2_var
74
+
75
+ # Ensure no negative values
76
+ if activity < 0:
77
+ activity = 0
78
+ if heart_rate < 50:
79
+ heart_rate = 50
80
+ if o2_sat < 90:
81
+ o2_sat = 90.0
82
+
83
+ data_rows.append([
84
+ pkey,
85
+ ts.strftime("%Y-%m-%d %H:%M:%S"),
86
+ activity,
87
+ heart_rate,
88
+ round(o2_sat, 1)
89
+ ])
90
+
91
+ # Create CSV in memory
92
+ output = io.StringIO()
93
+ writer = csv.writer(output)
94
+ writer.writerow(["PRIMARY_PERSON_KEY", "Measurement_Timestamp", "Activity_Level", "Heart_Rate", "O2_Saturation"])
95
+ writer.writerows(data_rows)
96
+
97
+ csv_data = output.getvalue().encode('utf-8')
98
+
99
+ st.success("Data generated successfully!")
100
+ st.download_button(
101
+ label="Download CSV",
102
+ data=csv_data,
103
+ file_name="Wearable_Data.csv",
104
+ mime="text/csv"
105
+ )