Spaces:
Sleeping
Sleeping
Create Wearable_Data.py
Browse files- 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 |
+
)
|