PDC / backend /tests /test_prediction_validation.py
borndeveloper's picture
Deploy: case-study recommendation engine + ply yarn fix + weighted percentile removal
967454e
Raw
History Blame Contribute Delete
2.02 kB
from app.services.data_service import DataService
def test_prediction_basic_holdout_mae() -> None:
ds = DataService()
ds.load_data()
assert ds.df is not None
df = ds.df.dropna(
subset=[
"weave",
"blend",
"Greige EPI",
"Greige PPI",
"FINISH EPI",
"FINISH PPI",
]
).copy()
sample = df.sample(n=min(120, len(df)), random_state=42)
abs_epi_errors = []
abs_ppi_errors = []
valid = 0
for _, row in sample.iterrows():
payload = {
"weave": row["weave"],
"blend": row["blend"],
"warp_count": float(row["warp_count"])
if row["warp_count"] == row["warp_count"]
else None,
"weft_count": float(row["weft_count"])
if row["weft_count"] == row["weft_count"]
else None,
"finish_epi": float(row["FINISH EPI"]),
"finish_ppi": float(row["FINISH PPI"]),
"target_gsm": float(row["FINISH GSM"])
if row["FINISH GSM"] == row["FINISH GSM"]
else None,
}
out = ds.predict_construction(payload)
rec = out.get("recommendation", {})
if rec.get("greige_epi") is None or rec.get("greige_ppi") is None:
continue
valid += 1
abs_epi_errors.append(abs(float(rec["greige_epi"]) - float(row["Greige EPI"])))
abs_ppi_errors.append(abs(float(rec["greige_ppi"]) - float(row["Greige PPI"])))
assert valid >= 80
mae_epi = sum(abs_epi_errors) / len(abs_epi_errors)
mae_ppi = sum(abs_ppi_errors) / len(abs_ppi_errors)
assert mae_epi < 45
assert mae_ppi < 20
def test_validation_report_endpoint_logic() -> None:
ds = DataService()
ds.load_data()
report = ds.get_validation_report(sample_size=120, seed=9)
assert "mae" in report
assert report["scored_rows"] >= 80
assert report["mae"]["greige_epi"] < 35
assert report["mae"]["greige_ppi"] < 15