rapids/rules/features.snakefile

309 lines
14 KiB
Plaintext
Raw Normal View History

2020-08-11 22:18:06 +02:00
def infer_participant_platform(participant_file):
with open(participant_file, encoding="ISO-8859-1") as external_file:
external_file_content = external_file.readlines()
platforms = external_file_content[1].strip().split(",")
if platforms[0] == "multiple" or (len(platforms) > 1 and "android" in platforms and "ios" in platforms):
platform = "android"
else:
platform = platforms[0]
2020-08-11 22:18:06 +02:00
return platform
def optional_ar_input(wildcards):
platform = infer_participant_platform("data/external/"+wildcards.pid)
if platform == "android":
return ["data/raw/{pid}/" + config["ACTIVITY_RECOGNITION"]["DB_TABLE"]["ANDROID"] + "_with_datetime_unified.csv",
"data/processed/{pid}/" + config["ACTIVITY_RECOGNITION"]["DB_TABLE"]["ANDROID"] + "_deltas.csv"]
elif platform == "ios":
return ["data/raw/{pid}/"+config["ACTIVITY_RECOGNITION"]["DB_TABLE"]["IOS"]+"_with_datetime_unified.csv",
"data/processed/{pid}/"+config["ACTIVITY_RECOGNITION"]["DB_TABLE"]["IOS"]+"_deltas.csv"]
else:
raise ValueError("Platform (line 2) in a participant file should be 'android', 'ios', or 'multiple'. You typed '" + platforms + "'")
def optional_conversation_input(wildcards):
2020-08-11 22:18:06 +02:00
platform = infer_participant_platform("data/external/"+wildcards.pid)
if platform == "android":
2020-08-11 22:18:06 +02:00
return ["data/raw/{pid}/" + config["CONVERSATION"]["DB_TABLE"]["ANDROID"] + "_with_datetime_unified.csv"]
elif platform == "ios":
2020-08-11 22:18:06 +02:00
return ["data/raw/{pid}/" + config["CONVERSATION"]["DB_TABLE"]["IOS"] + "_with_datetime_unified.csv"]
else:
raise ValueError("Platform (line 2) in a participant file should be 'android' or 'ios', or 'multiple'. You typed '" + platforms + "'")
def optional_location_input(wildcards):
if config["BARNETT_LOCATION"]["LOCATIONS_TO_USE"] == "RESAMPLE_FUSED":
return expand("data/raw/{{pid}}/{sensor}_resampled.csv", sensor=config["BARNETT_LOCATION"]["DB_TABLE"])
else:
return expand("data/raw/{{pid}}/{sensor}_with_datetime.csv", sensor=config["BARNETT_LOCATION"]["DB_TABLE"])
def optional_location_doryab_input(wildcards):
if config["DORYAB_LOCATION"]["LOCATIONS_TO_USE"] == "RESAMPLE_FUSED":
return expand("data/raw/{{pid}}/{sensor}_resampled.csv", sensor=config["DORYAB_LOCATION"]["DB_TABLE"])
else:
return expand("data/raw/{{pid}}/{sensor}_with_datetime.csv", sensor=config["DORYAB_LOCATION"]["DB_TABLE"])
def optional_steps_sleep_input(wildcards):
if config["STEP"]["EXCLUDE_SLEEP"]["EXCLUDE"] == True and config["STEP"]["EXCLUDE_SLEEP"]["TYPE"] == "FITBIT_BASED":
return "data/raw/{pid}/fitbit_sleep_summary_with_datetime.csv"
else:
return []
2020-07-24 22:35:41 +02:00
def optional_wifi_input(wildcards):
if len(config["WIFI"]["DB_TABLE"]["VISIBLE_ACCESS_POINTS"]) > 0 and len(config["WIFI"]["DB_TABLE"]["CONNECTED_ACCESS_POINTS"]) == 0:
return {"visible_access_points": expand("data/raw/{{pid}}/{sensor}_with_datetime.csv", sensor=config["WIFI"]["DB_TABLE"]["VISIBLE_ACCESS_POINTS"])}
elif len(config["WIFI"]["DB_TABLE"]["VISIBLE_ACCESS_POINTS"]) == 0 and len(config["WIFI"]["DB_TABLE"]["CONNECTED_ACCESS_POINTS"]) > 0:
return {"connected_access_points": expand("data/raw/{{pid}}/{sensor}_with_datetime.csv", sensor=config["WIFI"]["DB_TABLE"]["CONNECTED_ACCESS_POINTS"])}
elif len(config["WIFI"]["DB_TABLE"]["VISIBLE_ACCESS_POINTS"]) > 0 and len(config["WIFI"]["DB_TABLE"]["CONNECTED_ACCESS_POINTS"]) > 0:
return {"visible_access_points": expand("data/raw/{{pid}}/{sensor}_with_datetime.csv", sensor=config["WIFI"]["DB_TABLE"]["VISIBLE_ACCESS_POINTS"]), "connected_access_points": expand("data/raw/{{pid}}/{sensor}_with_datetime.csv", sensor=config["WIFI"]["DB_TABLE"]["CONNECTED_ACCESS_POINTS"])}
else:
raise ValueError("If you are computing WIFI features you need to provide either VISIBLE_ACCESS_POINTS, CONNECTED_ACCESS_POINTS or both")
rule messages_features:
2019-10-24 22:27:43 +02:00
input:
expand("data/raw/{{pid}}/{sensor}_with_datetime.csv", sensor=config["MESSAGES"]["DB_TABLE"])
2019-10-24 22:27:43 +02:00
params:
messages_type = "{messages_type}",
2019-10-24 22:27:43 +02:00
day_segment = "{day_segment}",
features = lambda wildcards: config["MESSAGES"]["FEATURES"][wildcards.messages_type]
2019-10-24 22:27:43 +02:00
output:
"data/processed/{pid}/messages_{messages_type}_{day_segment}.csv"
2019-10-24 22:27:43 +02:00
script:
"../src/features/messages_features.R"
2019-10-25 16:21:09 +02:00
rule call_features:
2019-10-25 16:21:09 +02:00
input:
expand("data/raw/{{pid}}/{sensor}_with_datetime_unified.csv", sensor=config["CALLS"]["DB_TABLE"])
2019-10-25 16:21:09 +02:00
params:
call_type = "{call_type}",
day_segment = "{day_segment}",
features = lambda wildcards: config["CALLS"]["FEATURES"][wildcards.call_type]
2019-10-25 16:21:09 +02:00
output:
"data/processed/{pid}/calls_{call_type}_{day_segment}.csv"
2019-10-25 16:21:09 +02:00
script:
"../src/features/call_features.R"
2019-11-05 16:47:55 +01:00
rule battery_deltas:
input:
expand("data/raw/{{pid}}/{sensor}_with_datetime_unified.csv", sensor=config["BATTERY"]["DB_TABLE"])
2019-11-05 16:47:55 +01:00
output:
"data/processed/{pid}/battery_deltas.csv"
script:
2019-11-05 21:17:20 +01:00
"../src/features/battery_deltas.R"
2019-11-27 21:27:48 +01:00
rule screen_deltas:
input:
screen = expand("data/raw/{{pid}}/{sensor}_with_datetime_unified.csv", sensor=config["SCREEN"]["DB_TABLE"])
2019-11-27 21:27:48 +01:00
output:
"data/processed/{pid}/screen_deltas.csv"
script:
"../src/features/screen_deltas.R"
2019-11-27 21:53:37 +01:00
rule google_activity_recognition_deltas:
input:
expand("data/raw/{{pid}}/{sensor}_with_datetime_unified.csv", sensor=config["ACTIVITY_RECOGNITION"]["DB_TABLE"]["ANDROID"])
2019-11-27 21:53:37 +01:00
output:
expand("data/processed/{{pid}}/{sensor}_deltas.csv", sensor=config["ACTIVITY_RECOGNITION"]["DB_TABLE"]["ANDROID"])
2019-11-27 21:53:37 +01:00
script:
"../src/features/activity_recognition_deltas.R"
rule ios_activity_recognition_deltas:
input:
expand("data/raw/{{pid}}/{sensor}_with_datetime_unified.csv", sensor=config["ACTIVITY_RECOGNITION"]["DB_TABLE"]["IOS"])
output:
expand("data/processed/{{pid}}/{sensor}_deltas.csv", sensor=config["ACTIVITY_RECOGNITION"]["DB_TABLE"]["IOS"])
script:
"../src/features/activity_recognition_deltas.R"
2019-11-27 21:53:37 +01:00
rule location_barnett_features:
2019-11-05 21:17:20 +01:00
input:
locations = optional_location_input
2019-11-05 21:17:20 +01:00
params:
features = config["BARNETT_LOCATION"]["FEATURES"],
locations_to_use = config["BARNETT_LOCATION"]["LOCATIONS_TO_USE"],
2019-11-05 21:17:20 +01:00
accuracy_limit = config["BARNETT_LOCATION"]["ACCURACY_LIMIT"],
timezone = config["BARNETT_LOCATION"]["TIMEZONE"],
minutes_data_used = config["BARNETT_LOCATION"]["MINUTES_DATA_USED"],
day_segment = "{day_segment}"
2019-11-05 21:17:20 +01:00
output:
"data/processed/{pid}/location_barnett_{day_segment}.csv"
2019-11-05 21:17:20 +01:00
script:
"../src/features/location_barnett_features.R"
2019-11-06 18:19:30 +01:00
rule location_doryab_features:
input:
locations = optional_location_doryab_input
params:
features = config["DORYAB_LOCATION"]["FEATURES"],
day_segment = "{day_segment}",
dbscan_eps = config["DORYAB_LOCATION"]["DBSCAN_EPS"],
dbscan_minsamples = config["DORYAB_LOCATION"]["DBSCAN_MINSAMPLES"],
2020-07-22 00:56:43 +02:00
threshold_static = config["DORYAB_LOCATION"]["THRESHOLD_STATIC"],
2020-07-23 20:23:32 +02:00
maximum_gap_allowed = config["DORYAB_LOCATION"]["MAXIMUM_GAP_ALLOWED"],
minutes_data_used = config["DORYAB_LOCATION"]["MINUTES_DATA_USED"],
sampling_frequency = config["DORYAB_LOCATION"]["SAMPLING_FREQUENCY"]
output:
"data/processed/{pid}/location_doryab_{day_segment}.csv"
script:
"../src/features/location_doryab_features.py"
rule bluetooth_features:
2019-11-06 18:19:30 +01:00
input:
expand("data/raw/{{pid}}/{sensor}_with_datetime.csv", sensor=config["BLUETOOTH"]["DB_TABLE"])
2019-11-06 18:19:30 +01:00
params:
day_segment = "{day_segment}",
features = config["BLUETOOTH"]["FEATURES"]
2019-11-06 18:19:30 +01:00
output:
"data/processed/{pid}/bluetooth_{day_segment}.csv"
script:
"../src/features/bluetooth_features.R"
rule activity_features:
input:
optional_ar_input
2019-11-18 20:22:08 +01:00
params:
segment = "{day_segment}",
features = config["ACTIVITY_RECOGNITION"]["FEATURES"]
output:
"data/processed/{pid}/activity_recognition_{day_segment}.csv"
script:
"../src/features/activity_recognition.py"
rule battery_features:
input:
"data/processed/{pid}/battery_deltas.csv"
params:
day_segment = "{day_segment}",
features = config["BATTERY"]["FEATURES"]
output:
"data/processed/{pid}/battery_{day_segment}.csv"
script:
"../src/features/battery_features.py"
2019-11-27 20:25:17 +01:00
rule screen_features:
2019-11-27 20:25:17 +01:00
input:
screen_deltas = "data/processed/{pid}/screen_deltas.csv",
phone_sensed_bins = "data/interim/{pid}/phone_sensed_bins.csv"
2019-11-27 20:25:17 +01:00
params:
day_segment = "{day_segment}",
reference_hour_first_use = config["SCREEN"]["REFERENCE_HOUR_FIRST_USE"],
features_deltas = config["SCREEN"]["FEATURES_DELTAS"],
episode_types = config["SCREEN"]["EPISODE_TYPES"],
2020-07-23 20:38:59 +02:00
ignore_episodes_shorter_than = config["SCREEN"]["IGNORE_EPISODES_SHORTER_THAN"],
ignore_episodes_longer_than = config["SCREEN"]["IGNORE_EPISODES_LONGER_THAN"],
2020-07-09 19:01:50 +02:00
bin_size = config["PHONE_VALID_SENSED_BINS"]["BIN_SIZE"]
2019-11-27 20:25:17 +01:00
output:
"data/processed/{pid}/screen_{day_segment}.csv"
script:
"../src/features/screen_features.py"
2020-01-14 15:51:39 +01:00
rule light_features:
2020-01-14 15:51:39 +01:00
input:
expand("data/raw/{{pid}}/{sensor}_with_datetime.csv", sensor=config["LIGHT"]["DB_TABLE"]),
2020-01-14 15:51:39 +01:00
params:
day_segment = "{day_segment}",
features = config["LIGHT"]["FEATURES"],
2020-01-14 15:51:39 +01:00
output:
"data/processed/{pid}/light_{day_segment}.csv"
script:
"../src/features/light_features.py"
2020-01-15 20:15:24 +01:00
rule conversation_features:
input:
optional_conversation_input
params:
day_segment = "{day_segment}",
features = config["CONVERSATION"]["FEATURES"],
recordingMinutes = config["CONVERSATION"]["RECORDINGMINUTES"],
pausedMinutes = config["CONVERSATION"]["PAUSEDMINUTES"],
output:
"data/processed/{pid}/conversation_{day_segment}.csv"
script:
"../src/features/conversation_features.py"
rule accelerometer_features:
2020-01-15 20:15:24 +01:00
input:
expand("data/raw/{{pid}}/{sensor}_with_datetime.csv", sensor=config["ACCELEROMETER"]["DB_TABLE"]),
2020-01-15 20:15:24 +01:00
params:
day_segment = "{day_segment}",
magnitude = config["ACCELEROMETER"]["FEATURES"]["MAGNITUDE"],
exertional_activity_episode = config["ACCELEROMETER"]["FEATURES"]["EXERTIONAL_ACTIVITY_EPISODE"],
nonexertional_activity_episode = config["ACCELEROMETER"]["FEATURES"]["NONEXERTIONAL_ACTIVITY_EPISODE"],
valid_sensed_minutes = config["ACCELEROMETER"]["FEATURES"]["VALID_SENSED_MINUTES"],
2020-01-15 20:15:24 +01:00
output:
"data/processed/{pid}/accelerometer_{day_segment}.csv"
script:
"../src/features/accelerometer_features.py"
2020-01-29 22:22:53 +01:00
rule applications_foreground_features:
2020-02-07 17:52:55 +01:00
input:
expand("data/interim/{{pid}}/{sensor}_with_datetime_with_genre.csv", sensor=config["APPLICATIONS_FOREGROUND"]["DB_TABLE"])
2020-02-07 17:52:55 +01:00
params:
day_segment = "{day_segment}",
single_categories = config["APPLICATIONS_FOREGROUND"]["SINGLE_CATEGORIES"],
multiple_categories = config["APPLICATIONS_FOREGROUND"]["MULTIPLE_CATEGORIES"],
single_apps = config["APPLICATIONS_FOREGROUND"]["SINGLE_APPS"],
excluded_categories = config["APPLICATIONS_FOREGROUND"]["EXCLUDED_CATEGORIES"],
excluded_apps = config["APPLICATIONS_FOREGROUND"]["EXCLUDED_APPS"],
features = config["APPLICATIONS_FOREGROUND"]["FEATURES"],
2020-02-07 17:52:55 +01:00
output:
"data/processed/{pid}/applications_foreground_{day_segment}.csv"
script:
"../src/features/applications_foreground_features.py"
2020-02-07 17:52:55 +01:00
rule wifi_features:
input:
2020-07-24 22:35:41 +02:00
unpack(optional_wifi_input)
params:
day_segment = "{day_segment}",
features = config["WIFI"]["FEATURES"]
output:
"data/processed/{pid}/wifi_{day_segment}.csv"
script:
"../src/features/wifi_features.R"
rule fitbit_heartrate_features:
2020-02-07 17:35:15 +01:00
input:
heartrate_summary_data = "data/raw/{pid}/fitbit_heartrate_summary_with_datetime.csv",
heartrate_intraday_data = "data/raw/{pid}/fitbit_heartrate_intraday_with_datetime.csv"
2020-02-07 17:35:15 +01:00
params:
day_segment = "{day_segment}",
2020-06-12 22:04:03 +02:00
summary_features = config["HEARTRATE"]["SUMMARY_FEATURES"],
intraday_features = config["HEARTRATE"]["INTRADAY_FEATURES"]
2020-02-07 17:35:15 +01:00
output:
"data/processed/{pid}/fitbit_heartrate_{day_segment}.csv"
script:
"../src/features/fitbit_heartrate_features.py"
2020-02-07 17:35:15 +01:00
rule fitbit_step_features:
2020-01-29 22:22:53 +01:00
input:
step_data = "data/raw/{pid}/fitbit_step_intraday_with_datetime.csv",
sleep_data = optional_steps_sleep_input
2020-01-29 22:22:53 +01:00
params:
day_segment = "{day_segment}",
features_all_steps = config["STEP"]["FEATURES"]["ALL_STEPS"],
features_sedentary_bout = config["STEP"]["FEATURES"]["SEDENTARY_BOUT"],
features_active_bout = config["STEP"]["FEATURES"]["ACTIVE_BOUT"],
threshold_active_bout = config["STEP"]["THRESHOLD_ACTIVE_BOUT"],
include_zero_step_rows = config["STEP"]["INCLUDE_ZERO_STEP_ROWS"],
exclude_sleep = config["STEP"]["EXCLUDE_SLEEP"]["EXCLUDE"],
exclude_sleep_type = config["STEP"]["EXCLUDE_SLEEP"]["TYPE"],
exclude_sleep_fixed_start = config["STEP"]["EXCLUDE_SLEEP"]["FIXED"]["START"],
exclude_sleep_fixed_end = config["STEP"]["EXCLUDE_SLEEP"]["FIXED"]["END"],
2020-01-29 22:22:53 +01:00
output:
"data/processed/{pid}/fitbit_step_{day_segment}.csv"
script:
"../src/features/fitbit_step_features.py"
2020-04-13 19:24:52 +02:00
rule fitbit_sleep_features:
input:
sleep_summary_data = "data/raw/{pid}/fitbit_sleep_summary_with_datetime.csv",
sleep_intraday_data = "data/raw/{pid}/fitbit_sleep_intraday_with_datetime.csv"
2020-04-13 19:24:52 +02:00
params:
day_segment = "{day_segment}",
2020-06-13 00:44:05 +02:00
summary_features = config["SLEEP"]["SUMMARY_FEATURES"],
sleep_types = config["SLEEP"]["SLEEP_TYPES"]
2020-04-13 19:24:52 +02:00
output:
"data/processed/{pid}/fitbit_sleep_{day_segment}.csv"
2020-04-13 19:24:52 +02:00
script:
"../src/features/fitbit_sleep_features.py"