tools/cloud/timestream-to-html.py (92 lines of code) (raw):

#!/usr/bin/env python3 # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 import argparse import json import pandas as pd import plotly.graph_objects as go def is_included(name, include_list, exclude_list): if include_list: for include in include_list: if include and include in name: break else: return False for exclude in exclude_list: if exclude and exclude in name: return False return True def get_val(row, column): return ( None if column not in columns or "ScalarValue" not in row["Data"][columns[column]] else row["Data"][columns[column]]["ScalarValue"] ) if __name__ == "__main__": parser = argparse.ArgumentParser(description="Creates plots for collected data from Timestream") parser.add_argument( "--vehicle-name", required=True, help="Vehicle name", ) parser.add_argument( "--files", type=argparse.FileType("r"), nargs="+", required=True, help="List files to process", ) parser.add_argument( "--html-filename", metavar="FILE", required=True, help="HTML output filename", ) parser.add_argument( "--include-signals", metavar="SIGNAL_LIST", help="Comma separated list of signals to include", ) parser.add_argument( "--exclude-signals", metavar="SIGNAL_LIST", help="Comma separated list of signals to exclude", ) args = parser.parse_args() df = pd.DataFrame() include_list = ( [i.strip() for i in args.include_signals.split(",")] if args.include_signals else [] ) exclude_list = ( [i.strip() for i in args.exclude_signals.split(",")] if args.exclude_signals else [] ) for file in args.files: try: with open(file.name) as fp: data = json.load(fp) columns = {} i = 0 for column in data["ColumnInfo"]: columns[column["Name"]] = i i += 1 for row in data["Rows"]: if get_val(row, "vehicleName") != args.vehicle_name: continue ts = get_val(row, "time") signal_name = get_val(row, "measure_name") if not is_included(signal_name, include_list, exclude_list): continue val = get_val(row, "measure_value::double") if val is None: val = get_val(row, "measure_value::bigint") if val is None: val = get_val(row, "measure_value::boolean") if val is not None: val = 0 if val == "false" else 1 if val is None: val = get_val(row, "measure_value::varchar") df.at[ts, signal_name] = val except Exception as e: raise Exception(str(e) + f" in {file.name}") fig = go.Figure() for column in df.columns: fig.add_trace(go.Scatter(x=df.index, y=df[column], mode="markers", name=column)) with open(args.html_filename, "w") as fp: fp.write(fig.to_html())