"""Reproducible check for sensor-quality-demo.csv only; not engineering limits.""" import csv, json from pathlib import Path from collections import defaultdict from datetime import datetime, timedelta path = Path(__file__).with_name("sensor-quality-demo.csv") rows = list(csv.DictReader(path.open(newline=""))) groups = defaultdict(list) for row in rows: groups[(row["asset_id"],row["sensor_id"],row["timestamp"])].append(row) exact_duplicates = sum(len(items)-1 for items in groups.values() if all(x==items[0] for x in items)) conflicts = [key for key,items in groups.items() if any(x!=items[0] for x in items)] series = {key[2]: items[0] for key,items in groups.items() if key[:2]==("A","T-1") and key not in conflicts} start=datetime.fromisoformat("2026-10-20T09:00:00+03:00") expected=[(start+timedelta(minutes=i)).isoformat() for i in range(6)] missing=[t for t in expected if t not in series] bad=[t for t,row in series.items() if row["quality"]!="OK"] normalized=[] for t,row in series.items(): if row["quality"]!="OK": continue v=float(row["value"]) if row["unit"]=="F": v=(v-32)*5/9 elif row["unit"]!="C": raise ValueError("Unknown unit") normalized.append({"timestamp":t,"value_c":v,"source_value":row["value"],"source_unit":row["unit"]}) result={"source_rows":len(rows),"exact_duplicates":exact_duplicates,"conflicts":conflicts,"missing":missing,"bad_quality":bad,"usable":len(normalized),"expected":len(expected),"usable_pct":round(100*len(normalized)/len(expected),1),"normalized":normalized} assert len(rows)==7 and exact_duplicates==1 and len(missing)==1 and len(bad)==1 and len(normalized)==4 assert normalized[-1]["value_c"]==70 print(json.dumps(result,ensure_ascii=False,indent=2))