50 lines
2.5 KiB
Python
50 lines
2.5 KiB
Python
|
import pandas as pd
|
||
|
import numpy as np
|
||
|
import plotly.io as pio
|
||
|
import plotly.graph_objects as go
|
||
|
import datetime
|
||
|
|
||
|
def getDatesComplianceMatrix(phone_sensed_bins):
|
||
|
dates = phone_sensed_bins.index
|
||
|
compliance_matrix = []
|
||
|
for date in dates:
|
||
|
compliance_matrix.append(phone_sensed_bins.loc[date, :].tolist())
|
||
|
return dates, compliance_matrix
|
||
|
|
||
|
def getComplianceHeatmap(dates, compliance_matrix, pid, output_path, bin_size):
|
||
|
bins_per_hour = int(60 / bin_size)
|
||
|
x_axis_labels = ["{0:0=2d}".format(x // bins_per_hour) + ":" + \
|
||
|
"{0:0=2d}".format(x % bins_per_hour * bin_size) for x in range(24 * bins_per_hour)]
|
||
|
plot = go.Figure(data=go.Heatmap(z=compliance_matrix,
|
||
|
x=x_axis_labels,
|
||
|
y=[datetime.datetime.strftime(date, '%Y/%m/%d') for date in dates],
|
||
|
colorscale='Viridis',
|
||
|
colorbar={'tick0': 0,'dtick': 1}))
|
||
|
plot.update_layout(title="Heatmap sensed bins.<br>Five-minute bins showing how many sensors logged at least one row of data in that period for " + pid + "<br>Label: " + label + ", device_id: " + device_id)
|
||
|
pio.write_html(plot, file=output_path, auto_open=False, include_plotlyjs="cdn")
|
||
|
|
||
|
# get current patient id
|
||
|
pid = snakemake.params["pid"]
|
||
|
bin_size = snakemake.params["bin_size"]
|
||
|
|
||
|
with open(snakemake.input["pid_file"], encoding="ISO-8859-1") as external_file:
|
||
|
external_file_content = external_file.readlines()
|
||
|
device_id = external_file_content[0].split(",")[-1]
|
||
|
label = external_file_content[2]
|
||
|
|
||
|
phone_sensed_bins = pd.read_csv(snakemake.input["sensor"], parse_dates=["local_date"], index_col="local_date")
|
||
|
|
||
|
if phone_sensed_bins.empty:
|
||
|
empty_html = open(snakemake.output[0], "w", encoding="ISO-8859-1")
|
||
|
empty_html.write("There is no sensor data for " + pid + "<br>Label: " + label + ", device_id: " + device_id)
|
||
|
empty_html.close()
|
||
|
else:
|
||
|
# resample to impute missing dates
|
||
|
phone_sensed_bins = phone_sensed_bins.resample("1D").asfreq().fillna(0)
|
||
|
# get dates and compliance_matrix
|
||
|
dates, compliance_matrix = getDatesComplianceMatrix(phone_sensed_bins)
|
||
|
# convert compliance_matrix from list to np.array and replace 0 with np.nan
|
||
|
compliance_matrix = np.asarray(compliance_matrix)
|
||
|
compliance_matrix = np.where(compliance_matrix == 0, np.nan, compliance_matrix)
|
||
|
# get heatmap
|
||
|
getComplianceHeatmap(dates, compliance_matrix, pid, snakemake.output[0], bin_size)
|