Spaces:
Sleeping
Sleeping
| from flask import Flask, render_template, request, send_file | |
| import pandas as pd | |
| import matplotlib.pyplot as plt | |
| import numpy as np | |
| import io | |
| import os | |
| app = Flask(__name__) | |
| def index(): | |
| if request.method == "POST": | |
| golden_file = request.files.get("golden_file") | |
| test_file = request.files.get("test_file") | |
| if not golden_file or not test_file: | |
| return render_template("index.html", error="Please upload both files.") | |
| try: | |
| # --- Read Data --- | |
| limits_df1 = pd.read_excel(golden_file, nrows=4) | |
| df1 = pd.read_excel(golden_file) | |
| df1 = df1.drop([0, 1, 2, 3]) | |
| df2 = pd.read_excel(test_file) | |
| df2 = df2.drop([0, 1, 2, 3]) | |
| df1 = df1.apply(pd.to_numeric, errors="coerce") | |
| df2 = df2.apply(pd.to_numeric, errors="coerce") | |
| # --- Build Limits --- | |
| limits_df1 = limits_df1.drop([0]) | |
| ignore_cols = ["SITE_NUM", "PART_ID", "PASSFG", "SOFT_BIN", "T_TIME", "TEST_NUM"] | |
| cols_to_plot = [col for col in limits_df1.columns if "_" in col and col not in ignore_cols] | |
| limits_df1 = limits_df1.drop(columns=ignore_cols) | |
| limits = { | |
| col: {"LL": limits_df1.iloc[0][col], "UL": limits_df1.iloc[1][col]} | |
| for col in limits_df1.columns | |
| } | |
| # --- Plot --- | |
| n_cols = 3 | |
| n_rows = (len(cols_to_plot) + n_cols - 1) // n_cols | |
| plt.figure(figsize=(n_cols * 5, n_rows * 3.5)) | |
| for i, col in enumerate(cols_to_plot, 1): | |
| plt.subplot(n_rows, n_cols, i) | |
| x1 = np.arange(1, len(df1[col]) + 1) | |
| y1 = pd.to_numeric(df1[col], errors="coerce").values | |
| plt.plot(x1, y1, marker="o", linestyle="-", color="blue", label="Golden") | |
| if col in df2.columns: | |
| x2 = np.arange(1, len(df2[col]) + 1) | |
| y2 = pd.to_numeric(df2[col], errors="coerce").values | |
| plt.plot(x2, y2, marker="s", linestyle="--", color="red", label="Test") | |
| if col in limits: | |
| ll, ul = limits[col]["LL"], limits[col]["UL"] | |
| plt.axhline(ll, color="green", linestyle="--", linewidth=2, label="LL") | |
| plt.axhline(ul, color="orange", linestyle="--", linewidth=2, label="UL") | |
| plt.title(f"{col}") | |
| plt.xlabel("Part # (sequence)") | |
| plt.ylabel("Value") | |
| plt.grid(True, linestyle="--", alpha=0.7) | |
| plt.legend(fontsize="small") | |
| plt.tight_layout() | |
| # Save plot to in-memory buffer | |
| buf = io.BytesIO() | |
| plt.savefig(buf, format="png", bbox_inches="tight") | |
| buf.seek(0) | |
| plt.close() | |
| return send_file(buf, mimetype="image/png") | |
| except Exception as e: | |
| return render_template("index.html", error=f"Error: {str(e)}") | |
| return render_template("index.html") | |
| if __name__ == "__main__": | |
| app.run(host="0.0.0.0", port=7860, debug=True) | |