2019-10-25 17:12:55 +02:00
|
|
|
import pandas as pd
|
2019-12-17 23:07:35 +01:00
|
|
|
import numpy as np
|
2019-10-25 17:12:55 +02:00
|
|
|
import plotly.io as pio
|
|
|
|
import plotly.graph_objects as go
|
2019-11-01 19:26:51 +01:00
|
|
|
import datetime
|
2019-10-25 17:12:55 +02:00
|
|
|
|
2019-11-01 19:26:51 +01:00
|
|
|
def getComplianceMatrix(dates, compliance_bins):
|
|
|
|
compliance_matrix = []
|
2019-10-25 17:12:55 +02:00
|
|
|
for date in dates:
|
2019-11-01 19:26:51 +01:00
|
|
|
date_bins = compliance_bins[compliance_bins["local_date"] == date]["count"].tolist()
|
|
|
|
compliance_matrix.append(date_bins)
|
|
|
|
return compliance_matrix
|
|
|
|
|
2019-10-25 17:12:55 +02:00
|
|
|
|
2020-02-07 17:14:19 +01:00
|
|
|
def getRowCountHeatmap(dates, row_count_per_bin, sensor_name, 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=row_count_per_bin,
|
|
|
|
x=x_axis_labels,
|
2019-11-01 19:26:51 +01:00
|
|
|
y=[datetime.datetime.strftime(date, '%Y/%m/%d') for date in dates],
|
2020-02-07 17:14:19 +01:00
|
|
|
colorscale="Viridis"))
|
2020-02-20 16:16:03 +01:00
|
|
|
plot.update_layout(title="Row count heatmap for " + sensor_name + " of " + pid + "<br>Label: " + label + ", device_id: " + device_id)
|
2020-03-23 23:24:19 +01:00
|
|
|
pio.write_html(plot, file=output_path, auto_open=False, include_plotlyjs="cdn")
|
2019-10-25 17:12:55 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
2020-02-20 16:16:03 +01:00
|
|
|
sensor_data = pd.read_csv(snakemake.input["sensor"], encoding="ISO-8859-1")
|
2019-10-25 17:12:55 +02:00
|
|
|
sensor_name = snakemake.params["table"]
|
|
|
|
pid = snakemake.params["pid"]
|
2020-02-07 17:14:19 +01:00
|
|
|
bin_size = snakemake.params["bin_size"]
|
2019-11-01 19:26:51 +01:00
|
|
|
|
2020-03-03 17:08:57 +01:00
|
|
|
with open(snakemake.input["pid_file"], encoding="ISO-8859-1") as external_file:
|
2020-02-20 16:16:03 +01:00
|
|
|
external_file_content = external_file.readlines()
|
|
|
|
device_id = external_file_content[0].split(",")[-1]
|
|
|
|
label = external_file_content[2]
|
|
|
|
|
|
|
|
|
2019-11-05 22:18:02 +01:00
|
|
|
# check if we have sensor data
|
|
|
|
if sensor_data.empty:
|
|
|
|
empty_html = open(snakemake.output[0], "w")
|
2020-02-20 16:16:03 +01:00
|
|
|
empty_html.write("There is no " + sensor_name + " data for " + pid + "<br>Label: " + label + ", device_id: " + device_id)
|
2019-11-05 22:18:02 +01:00
|
|
|
empty_html.close()
|
|
|
|
else:
|
|
|
|
start_date = sensor_data["local_date"][0]
|
|
|
|
end_date = sensor_data.at[sensor_data.index[-1],"local_date"]
|
|
|
|
|
2020-02-07 17:14:19 +01:00
|
|
|
sensor_data["local_date_time"] = pd.to_datetime(sensor_data["local_date_time"])
|
|
|
|
sensor_data = sensor_data[["local_date_time"]]
|
|
|
|
sensor_data["count"] = 1
|
2019-11-05 22:18:02 +01:00
|
|
|
|
|
|
|
# Add first and last day boundaries for resampling
|
2020-02-07 17:14:19 +01:00
|
|
|
sensor_data = sensor_data.append([pd.Series([datetime.datetime.strptime(start_date + " 00:00:00", "%Y-%m-%d %H:%M:%S"), 0], sensor_data.columns),
|
|
|
|
pd.Series([datetime.datetime.strptime(end_date + " 23:59:59", "%Y-%m-%d %H:%M:%S"), 0], sensor_data.columns)])
|
2019-11-05 22:18:02 +01:00
|
|
|
|
2020-02-07 17:14:19 +01:00
|
|
|
# Resample into bins with the size of bin_size
|
|
|
|
resampled_bins = pd.DataFrame(sensor_data.resample(str(bin_size) + "T", on="local_date_time")["count"].sum())
|
|
|
|
|
2019-11-05 22:18:02 +01:00
|
|
|
# Extract list of dates for creating the heatmap
|
2020-02-07 17:14:19 +01:00
|
|
|
resampled_bins.reset_index(inplace=True)
|
|
|
|
resampled_bins["local_date"] = resampled_bins["local_date_time"].dt.date
|
|
|
|
dates = resampled_bins["local_date"].drop_duplicates().tolist()
|
2019-11-05 22:18:02 +01:00
|
|
|
|
|
|
|
# Create heatmap
|
2020-02-07 17:14:19 +01:00
|
|
|
row_count_per_bin = getComplianceMatrix(dates, resampled_bins)
|
|
|
|
row_count_per_bin = np.asarray(row_count_per_bin)
|
|
|
|
row_count_per_bin = np.where(row_count_per_bin == 0, np.nan, row_count_per_bin)
|
|
|
|
getRowCountHeatmap(dates, row_count_per_bin, sensor_name, pid, snakemake.output[0], bin_size)
|