From 6628f663b636675bcaea316f2deaddf337de480e Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期五, 13 三月 2026 10:23:31 +0800
Subject: [PATCH] feat(米重分析): 新增稳态识别和预测功能页面并优化现有模型
---
app/pages/extruder_parameter_adjustment.py | 675 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 675 insertions(+), 0 deletions(-)
diff --git a/app/pages/extruder_parameter_adjustment.py b/app/pages/extruder_parameter_adjustment.py
new file mode 100644
index 0000000..113aa28
--- /dev/null
+++ b/app/pages/extruder_parameter_adjustment.py
@@ -0,0 +1,675 @@
+import streamlit as st
+import plotly.express as px
+import plotly.graph_objects as go
+import pandas as pd
+import numpy as np
+import joblib
+import os
+from datetime import datetime
+from app.services.parameter_adjustment_service import ParameterAdjustmentAdvisor
+
+# 椤甸潰鍑芥暟瀹氫箟
+def show_extruder_parameter_adjustment():
+ # 椤甸潰鏍囬
+ st.title("鎸ゅ嚭鏈哄弬鏁拌皟鑺傚缓璁�")
+
+ # 娣诲姞鎿嶄綔鎸囧紩
+ with st.expander("馃摉 鎿嶄綔鎸囧紩", expanded=True):
+ st.markdown("""
+ 娆㈣繋浣跨敤鎸ゅ嚭鏈哄弬鏁拌皟鑺傚缓璁姛鑳斤紒鏈姛鑳藉彲浠ユ牴鎹偍杈撳叆鐨勭背閲嶆暟鎹拰褰撳墠鍙傛暟锛屼负鎮ㄦ彁渚涚瀛﹀悎鐞嗙殑鍙傛暟璋冩暣寤鸿銆�
+
+ **鎿嶄綔姝ラ锛�**
+ 1. 閫夋嫨涓�涓凡璁粌濂界殑妯″瀷
+ 2. 杈撳叆绫抽噸鏍囧噯鍊笺�佷笂涓嬮檺鍜屽綋鍓嶆尋鍑烘満鍙傛暟
+ 3. 杈撳叆褰撳墠瀹為檯绫抽噸娴嬮噺鍊�
+ 4. 鐐瑰嚮"璁$畻璋冭妭寤鸿"鎸夐挳
+ 5. 鏌ョ湅绯荤粺鐢熸垚鐨勫弬鏁拌皟鏁村缓璁�
+
+ **娉ㄦ剰浜嬮」锛�**
+ - 璇风‘淇濊緭鍏ョ殑鍙傛暟鍊煎湪璁惧鍏佽鐨勮寖鍥村唴
+ - 寤鸿鏍规嵁瀹為檯鐢熶骇鎯呭喌璋冩暣妯″瀷鍙傛暟
+ - 鍘嗗彶璋冭妭璁板綍鍙湪椤甸潰搴曢儴鏌ョ湅
+ """)
+
+ # 鍒濆鍖栦細璇濈姸鎬�
+ if 'adjustment_history' not in st.session_state:
+ st.session_state['adjustment_history'] = []
+
+ # 1. 妯″瀷閫夋嫨鍖哄煙
+ with st.expander("馃攳 妯″瀷閫夋嫨", expanded=True):
+ # 鍒涘缓妯″瀷鐩綍锛堝鏋滀笉瀛樺湪锛�
+ model_dir = "saved_models"
+ os.makedirs(model_dir, exist_ok=True)
+
+ # 鑾峰彇鎵�鏈夊凡淇濆瓨鐨勬ā鍨嬫枃浠�
+ model_files = [f for f in os.listdir(model_dir) if f.endswith('.joblib')]
+ model_files.sort(reverse=True) # 鏈�鏂扮殑妯″瀷鎺掑湪鍓嶉潰
+
+ if not model_files:
+ st.warning("灏氭湭淇濆瓨浠讳綍妯″瀷锛岃鍏堣缁冩ā鍨嬪苟淇濆瓨銆�")
+ return
+
+ # 妯″瀷閫夋嫨涓嬫媺妗�
+ selected_model_file = st.selectbox(
+ "閫夋嫨宸蹭繚瀛樼殑妯″瀷",
+ options=model_files,
+ help="閫夋嫨瑕佺敤浜庨娴嬬殑妯″瀷鏂囦欢"
+ )
+
+ # 鍔犺浇骞舵樉绀烘ā鍨嬩俊鎭�
+ if selected_model_file:
+ model_path = os.path.join(model_dir, selected_model_file)
+ model_info = joblib.load(model_path)
+
+ # 鏄剧ず妯″瀷鍩烘湰淇℃伅
+ st.subheader("馃搳 妯″瀷淇℃伅")
+ info_cols = st.columns(2)
+
+ with info_cols[0]:
+ st.metric("妯″瀷绫诲瀷", model_info['model_type'])
+ st.metric("鍒涘缓鏃堕棿", model_info['created_at'].strftime('%Y-%m-%d %H:%M:%S'))
+ st.metric("浣跨敤绋虫�佹暟鎹�", "鏄�" if model_info.get('use_steady_data', False) else "鍚�")
+
+ with info_cols[1]:
+ st.metric("R虏 寰楀垎", f"{model_info['r2_score']:.4f}")
+ st.metric("鍧囨柟璇樊 (MSE)", f"{model_info['mse']:.6f}")
+ st.metric("鍧囨柟鏍硅宸� (RMSE)", f"{model_info['rmse']:.6f}")
+
+ # 鏄剧ず妯″瀷鐗瑰緛
+ st.write("馃攽 妯″瀷浣跨敤鐨勭壒寰�:")
+ st.code(", ".join(model_info['features']))
+
+ # 濡傛灉鏄繁搴﹀涔犳ā鍨嬶紝鏄剧ず搴忓垪闀垮害
+ if 'sequence_length' in model_info:
+ st.metric("搴忓垪闀垮害", model_info['sequence_length'])
+
+ # 淇濆瓨妯″瀷淇℃伅鍒颁細璇濈姸鎬�
+ st.session_state['selected_model'] = model_info
+ st.session_state['selected_model_file'] = selected_model_file
+
+ # 2. 鍙傛暟杈撳叆鍖哄煙
+ st.subheader("馃摑 鍙傛暟杈撳叆")
+
+ # 2.1 绫抽噸鏍囧噯鍊笺�佷笂涓嬮檺杈撳叆
+ with st.expander("鈿栵笍 绫抽噸鏍囧噯涓庝笂涓嬮檺", expanded=True):
+ weight_cols = st.columns(3)
+
+ with weight_cols[0]:
+ standard_weight = st.number_input(
+ "鏍囧噯绫抽噸",
+ key="standard_weight",
+ value=5.20,
+ min_value=0.01,
+ max_value=10.0,
+ step=0.0001,
+ format="%.4f",
+ help="杈撳叆鐩爣绫抽噸鏍囧噯鍊�"
+ )
+ st.caption("鍗曚綅: Kg/m")
+
+ with weight_cols[1]:
+ upper_limit = st.number_input(
+ "绫抽噸涓婇檺",
+ key="upper_limit",
+ value=5.46,
+ min_value=standard_weight,
+ max_value=10.0,
+ step=0.0001,
+ format="%.4f",
+ help="杈撳叆绫抽噸鍏佽鐨勪笂闄愬��"
+ )
+ st.caption("鍗曚綅: Kg/m")
+
+ with weight_cols[2]:
+ lower_limit = st.number_input(
+ "绫抽噸涓嬮檺",
+ key="lower_limit",
+ value=5.02,
+ min_value=0.01,
+ max_value=standard_weight,
+ step=0.0001,
+ format="%.4f",
+ help="杈撳叆绫抽噸鍏佽鐨勪笅闄愬��"
+ )
+ st.caption("鍗曚綅: Kg/m")
+
+ # 2.2 鎸ゅ嚭鏈哄綋鍓嶅弬鏁拌緭鍏�
+ with st.expander("馃敡 鎸ゅ嚭鏈哄綋鍓嶅弬鏁�", expanded=True):
+ param_cols = st.columns(3)
+
+ with param_cols[0]:
+ current_screw_speed = st.number_input(
+ "铻烘潌杞��",
+ key="current_screw_speed",
+ value=230.0,
+ min_value=0.0,
+ max_value=500.0,
+ step=0.1,
+ help="杈撳叆褰撳墠铻烘潌杞��"
+ )
+ st.caption("鍗曚綅: rpm")
+
+ current_head_pressure = st.number_input(
+ "鏈哄ご鍘嬪姏",
+ key="current_head_pressure",
+ value=0.26,
+ min_value=0.0,
+ max_value=500.0,
+ step=1.0,
+ help="杈撳叆褰撳墠鏈哄ご鍘嬪姏"
+ )
+ st.caption("鍗曚綅: bar")
+
+ current_process_speed = st.number_input(
+ "娴佺▼涓婚��",
+ key="current_process_speed",
+ value=6.6,
+ min_value=0.0,
+ max_value=300.0,
+ step=0.1,
+ help="杈撳叆褰撳墠娴佺▼涓婚��"
+ )
+ st.caption("鍗曚綅: m/min")
+
+ with param_cols[1]:
+ current_screw_temperature = st.number_input(
+ "铻烘潌娓╁害",
+ key="current_screw_temperature",
+ value=79.9,
+ min_value=0.0,
+ max_value=300.0,
+ step=1.0,
+ help="杈撳叆褰撳墠铻烘潌娓╁害"
+ )
+ st.caption("鍗曚綅: 掳C")
+
+ current_rear_barrel_temperature = st.number_input(
+ "鍚庢満绛掓俯搴�",
+ key="current_rear_barrel_temperature",
+ value=79.9,
+ min_value=0.0,
+ max_value=300.0,
+ step=1.0,
+ help="杈撳叆褰撳墠鍚庢満绛掓俯搴�"
+ )
+ st.caption("鍗曚綅: 掳C")
+
+ with param_cols[2]:
+ current_front_barrel_temperature = st.number_input(
+ "鍓嶆満绛掓俯搴�",
+ key="current_front_barrel_temperature",
+ value=80.1,
+ min_value=0.0,
+ max_value=300.0,
+ step=1.0,
+ help="杈撳叆褰撳墠鍓嶆満绛掓俯搴�"
+ )
+ st.caption("鍗曚綅: 掳C")
+
+ current_head_temperature = st.number_input(
+ "鏈哄ご娓╁害",
+ key="current_head_temperature",
+ value=95.1,
+ min_value=0.0,
+ max_value=300.0,
+ step=1.0,
+ help="杈撳叆褰撳墠鏈哄ご娓╁害"
+ )
+ st.caption("鍗曚綅: 掳C")
+
+ # 2.3 褰撳墠瀹為檯绫抽噸娴嬮噺鍊艰緭鍏�
+ with st.expander("馃搹 褰撳墠瀹為檯绫抽噸", expanded=True):
+ actual_weight = st.number_input(
+ "褰撳墠瀹為檯绫抽噸",
+ key="actual_weight",
+ value=5.115,
+ min_value=0.01,
+ max_value=10.0,
+ step=0.0001,
+ format="%.4f",
+ help="杈撳叆褰撳墠瀹為檯娴嬮噺鐨勭背閲嶅��"
+ )
+ st.caption("鍗曚綅: Kg/m")
+
+ # 3. 璁$畻璋冭妭寤鸿
+ st.subheader("馃殌 璁$畻璋冭妭寤鸿")
+
+ # 娣诲姞杩唬璋冩暣閫夐」
+ use_iterative_adjustment = st.checkbox("馃攧 浣跨敤杩唬璋冩暣", value=False,
+ help="鍚敤杩唬璋冩暣锛岃嚜鍔ㄤ紭鍖栧弬鏁扮洿鍒伴娴嬬背閲嶆弧瓒冲亸宸姹�")
+
+ # 杩唬璋冩暣鍙傛暟璁剧疆
+ max_iterations = 5
+ tolerance = 0.5
+
+ if use_iterative_adjustment:
+ st.write("### 杩唬璋冩暣鍙傛暟璁剧疆")
+ iter_cols = st.columns(2)
+ max_iterations = iter_cols[0].number_input("鏈�澶ц凯浠f鏁�", min_value=1, max_value=20, value=5, step=1)
+ tolerance = iter_cols[1].number_input("鍏佽鍋忓樊鐧惧垎姣�(%)", min_value=0.1, max_value=5.0, value=0.5, step=0.1)
+
+ if st.button("馃搳 璁$畻璋冭妭寤鸿", key="calculate_adjustment"):
+ # 鍙傛暟楠岃瘉
+ validation_errors = []
+
+ if standard_weight <= 0:
+ validation_errors.append("鏍囧噯绫抽噸蹇呴』澶т簬0")
+
+ if upper_limit <= standard_weight:
+ validation_errors.append("绫抽噸涓婇檺蹇呴』澶т簬鏍囧噯绫抽噸")
+
+ if lower_limit >= standard_weight:
+ validation_errors.append("绫抽噸涓嬮檺蹇呴』灏忎簬鏍囧噯绫抽噸")
+
+ if current_screw_speed <= 0:
+ validation_errors.append("铻烘潌杞�熷繀椤诲ぇ浜�0")
+
+ if current_process_speed <= 0:
+ validation_errors.append("娴佺▼涓婚�熷繀椤诲ぇ浜�0")
+
+ if actual_weight <= 0:
+ validation_errors.append("瀹為檯绫抽噸蹇呴』澶т簬0")
+
+ if validation_errors:
+ st.error("鍙傛暟杈撳叆閿欒锛�")
+ for error in validation_errors:
+ st.error(f"- {error}")
+ else:
+ with st.spinner("姝e湪璁$畻璋冭妭寤鸿..."):
+ # 鍒濆鍖栧弬鏁拌皟鑺傚缓璁櫒
+ adjustment_advisor = ParameterAdjustmentAdvisor()
+
+ # 鍑嗗鍒濆鍙傛暟
+ initial_params = {
+ 'real_time_weight': actual_weight,
+ 'standard_weight': standard_weight,
+ 'upper_limit': upper_limit,
+ 'lower_limit': lower_limit,
+ 'current_screw_speed': current_screw_speed,
+ 'current_process_speed': current_process_speed,
+ 'current_screw_temperature': current_screw_temperature,
+ 'current_rear_barrel_temperature': current_rear_barrel_temperature,
+ 'current_front_barrel_temperature': current_front_barrel_temperature,
+ 'current_head_temperature': current_head_temperature,
+ 'current_head_pressure': current_head_pressure
+ }
+
+ # 鏍规嵁鏄惁鍚敤杩唬璋冩暣鎵ц涓嶅悓閫昏緫
+ if use_iterative_adjustment and 'selected_model' in st.session_state:
+ # 浣跨敤杩唬璋冩暣
+ iterative_result = adjustment_advisor.iterative_adjustment(
+ initial_params=initial_params,
+ model_info=st.session_state['selected_model'],
+ max_iterations=max_iterations,
+ tolerance=tolerance
+ )
+
+ # 浣跨敤杩唬璋冩暣鐨勬渶缁堢粨鏋�
+ adjustment_result = iterative_result['final_result']
+ iteration_history = iterative_result['iteration_history']
+ converged = iterative_result['converged']
+ total_iterations = iterative_result['total_iterations']
+ else:
+ # 姝e父璁$畻璋冩暣寤鸿
+ adjustment_result = adjustment_advisor.calculate_adjustment(
+ real_time_weight=actual_weight,
+ standard_weight=standard_weight,
+ upper_limit=upper_limit,
+ lower_limit=lower_limit,
+ current_screw_speed=current_screw_speed,
+ current_process_speed=current_process_speed,
+ current_screw_temperature=current_screw_temperature,
+ current_rear_barrel_temperature=current_rear_barrel_temperature,
+ current_front_barrel_temperature=current_front_barrel_temperature,
+ current_head_temperature=current_head_temperature
+ )
+
+ # 浣跨敤閫変腑鐨勬ā鍨嬮娴嬭皟鏁村悗鐨勭背閲�
+ predicted_weight = None
+ if 'selected_model' in st.session_state:
+ selected_model_info = st.session_state['selected_model']
+ predicted_weight = adjustment_advisor.predict_weight(
+ model_info=selected_model_info,
+ screw_speed=adjustment_result['new_screw_speed'],
+ head_pressure=current_head_pressure,
+ process_speed=adjustment_result['new_process_speed'],
+ screw_temperature=current_screw_temperature,
+ rear_barrel_temperature=current_rear_barrel_temperature,
+ front_barrel_temperature=current_front_barrel_temperature,
+ head_temperature=current_head_temperature
+ )
+
+ # 灏嗛娴嬬粨鏋滄坊鍔犲埌璋冩暣缁撴灉涓�
+ adjustment_result['predicted_weight'] = predicted_weight
+
+ # 鍒濆鍖栬凯浠e巻鍙诧紙濡傛灉鏈娇鐢ㄨ凯浠h皟鏁达級
+ iteration_history = None
+ converged = None
+ total_iterations = None
+
+ # 淇濆瓨鍒板巻鍙茶褰�
+ history_record = {
+ 'timestamp': datetime.now(),
+ 'model_file': st.session_state.get('selected_model_file', '鏈煡妯″瀷'),
+ 'standard_weight': standard_weight,
+ 'upper_limit': upper_limit,
+ 'lower_limit': lower_limit,
+ 'actual_weight': actual_weight,
+ 'current_screw_speed': current_screw_speed,
+ 'current_process_speed': current_process_speed,
+ 'current_screw_temperature': current_screw_temperature,
+ 'current_rear_barrel_temperature': current_rear_barrel_temperature,
+ 'current_front_barrel_temperature': current_front_barrel_temperature,
+ 'current_head_temperature': current_head_temperature,
+ 'adjustment_result': adjustment_result,
+ 'use_iterative_adjustment': use_iterative_adjustment,
+ 'iteration_history': iteration_history
+ }
+
+ # 娣诲姞鍒颁細璇濈姸鎬佺殑鍘嗗彶璁板綍
+ if 'adjustment_history' not in st.session_state:
+ st.session_state['adjustment_history'] = []
+
+ st.session_state['adjustment_history'].append(history_record)
+
+ # 闄愬埗鍘嗗彶璁板綍鏁伴噺
+ if len(st.session_state['adjustment_history']) > 100:
+ st.session_state['adjustment_history'] = st.session_state['adjustment_history'][-100:]
+
+ # 4. 缁撴灉灞曠ず
+ st.success("璋冭妭寤鸿璁$畻瀹屾垚锛�")
+
+ st.subheader("馃搵 璋冭妭寤鸿缁撴灉")
+
+ # 4.1 绫抽噸鐘舵��
+ if adjustment_result['status'] == "姝e父":
+ st.success(f"绫抽噸鐘舵��: {adjustment_result['status']}")
+ else:
+ st.warning(f"绫抽噸鐘舵��: {adjustment_result['status']}")
+
+ # 4.2 鍋忓樊淇℃伅
+ info_cols = st.columns(3)
+ info_cols[0].metric("瀹炴椂绫抽噸", f"{adjustment_result['real_time_weight']:.4f} Kg/m")
+ info_cols[1].metric("鏍囧噯绫抽噸", f"{adjustment_result['standard_weight']:.4f} Kg/m")
+ info_cols[2].metric("鍋忓樊鐧惧垎姣�", f"{adjustment_result['deviation_percentage']:.2f}%")
+
+ # 4.2.1 妯″瀷棰勬祴缁撴灉
+ if adjustment_result['predicted_weight'] is not None:
+ st.markdown("### 馃搱 妯″瀷棰勬祴缁撴灉")
+ pred_cols = st.columns(3)
+ pred_cols[0].metric("璋冩暣鍚庨娴嬬背閲�", f"{adjustment_result['predicted_weight']:.4f} Kg/m")
+
+ # 璁$畻棰勬祴鍋忓樊
+ predicted_deviation = adjustment_result['predicted_weight'] - adjustment_result['standard_weight']
+ predicted_deviation_percent = (predicted_deviation / adjustment_result['standard_weight']) * 100
+ pred_cols[1].metric("棰勬祴鍋忓樊", f"{predicted_deviation:.4f} Kg/m")
+ pred_cols[2].metric("棰勬祴鍋忓樊鐧惧垎姣�", f"{predicted_deviation_percent:.2f}%")
+
+ # 鏄剧ず棰勬祴鏁堟灉
+ if abs(predicted_deviation_percent) < 0.5:
+ st.success("璋冩暣鍚庣背閲嶉娴嬪�兼帴杩戞爣鍑嗗�硷紝璋冩暣鏁堟灉鑹ソ锛�")
+ elif abs(predicted_deviation_percent) < 1.0:
+ st.info("璋冩暣鍚庣背閲嶉娴嬪�煎湪鍙帴鍙楄寖鍥村唴銆�")
+ else:
+ st.warning("璋冩暣鍚庣背閲嶉娴嬪�间粛鏈夎緝澶у亸宸紝寤鸿杩涗竴姝ュ井璋冦��")
+ else:
+ st.warning("妯″瀷棰勬祴澶辫触锛岃妫�鏌ユā鍨嬫枃浠舵垨鍙傛暟銆�")
+
+ # 4.3 鍏抽敭璋冩暣寤鸿
+ st.markdown("### 馃攽 鍏抽敭璋冩暣寤鸿")
+ st.info(adjustment_result['recommendation'])
+
+ # 4.4 鍙傛暟璋冩暣瀵规瘮
+ st.markdown("### 馃搳 鍙傛暟璋冩暣瀵规瘮")
+
+ param_compare_df = pd.DataFrame({
+ '鍙傛暟鍚嶇О': ['铻烘潌杞��', '娴佺▼涓婚��'],
+ '褰撳墠鍊�': [adjustment_result['current_screw_speed'], adjustment_result['current_process_speed']],
+ '寤鸿鍊�': [adjustment_result['new_screw_speed'], adjustment_result['new_process_speed']],
+ '璋冩暣骞呭害': [f"{adjustment_result['screw_speed_adjust_percent']:.2f}%",
+ f"{adjustment_result['process_speed_adjust_percent']:.2f}%"]
+ })
+
+ # 楂樹寒鏄剧ず璋冩暣骞呭害
+ def highlight_adjustment(val):
+ if isinstance(val, str) and '%' in val:
+ try:
+ percent = float(val.strip('%'))
+ if percent > 0:
+ return 'background-color: #90EE90' # 缁胯壊琛ㄧず澧炲姞
+ elif percent < 0:
+ return 'background-color: #FFB6C1' # 绾㈣壊琛ㄧず鍑忓皯
+ except:
+ pass
+ return ''
+
+ styled_df = param_compare_df.style.applymap(highlight_adjustment, subset=['璋冩暣骞呭害'])
+ st.dataframe(styled_df, use_container_width=True, hide_index=True)
+
+ # 4.5 鍙鍖栧姣�
+ fig = go.Figure()
+ fig.add_trace(go.Bar(
+ x=param_compare_df['鍙傛暟鍚嶇О'],
+ y=param_compare_df['褰撳墠鍊�'],
+ name='褰撳墠鍊�',
+ marker_color='blue'
+ ))
+ fig.add_trace(go.Bar(
+ x=param_compare_df['鍙傛暟鍚嶇О'],
+ y=param_compare_df['寤鸿鍊�'],
+ name='寤鸿鍊�',
+ marker_color='green'
+ ))
+
+ fig.update_layout(
+ barmode='group',
+ title='鍙傛暟璋冩暣瀵规瘮',
+ yaxis_title='鏁板��',
+ height=400
+ )
+
+ st.plotly_chart(fig, use_container_width=True)
+
+ # 4.6 杩唬璋冩暣缁撴灉灞曠ず
+ if use_iterative_adjustment and iteration_history:
+ st.markdown("### 馃攧 杩唬璋冩暣鍘嗗彶")
+
+ # 鏄剧ず杩唬璋冩暣鐘舵��
+ if converged:
+ st.success(f"鉁� 杩唬璋冩暣鎴愬姛鏀舵暃锛佺粡杩� {total_iterations} 娆¤凯浠o紝棰勬祴绫抽噸鍋忓樊杈惧埌 {tolerance}% 浠ュ唴銆�")
+ else:
+ st.warning(f"鈿狅笍 杩唬璋冩暣鏈敹鏁涳紒缁忚繃 {total_iterations} 娆¤凯浠o紝棰勬祴绫抽噸鍋忓樊浠嶆湭杈惧埌 {tolerance}% 浠ュ唴銆�")
+
+ # 鏄剧ず杩唬鍘嗗彶琛ㄦ牸
+ iter_history_df = pd.DataFrame(iteration_history)
+ iter_history_df = iter_history_df[[
+ 'iteration', 'current_screw_speed', 'current_process_speed',
+ 'adjusted_screw_speed', 'adjusted_process_speed',
+ 'predicted_weight', 'predicted_deviation_percent'
+ ]]
+
+ # 鏍煎紡鍖栬〃鏍�
+ iter_history_df = iter_history_df.rename(columns={
+ 'iteration': '杩唬娆℃暟',
+ 'current_screw_speed': '璋冩暣鍓嶈灪鏉嗚浆閫�',
+ 'current_process_speed': '璋冩暣鍓嶆祦绋嬩富閫�',
+ 'adjusted_screw_speed': '璋冩暣鍚庤灪鏉嗚浆閫�',
+ 'adjusted_process_speed': '璋冩暣鍚庢祦绋嬩富閫�',
+ 'predicted_weight': '棰勬祴绫抽噸',
+ 'predicted_deviation_percent': '棰勬祴鍋忓樊鐧惧垎姣�(%)'
+ })
+
+ st.dataframe(iter_history_df, use_container_width=True)
+
+ # 杩唬璋冩暣鍙鍖�
+ st.markdown("### 馃搲 杩唬璋冩暣鏁堟灉")
+
+ # 鍋忓樊鍙樺寲瓒嬪娍鍥�
+ fig_deviation = go.Figure()
+ fig_deviation.add_trace(go.Scatter(
+ x=iter_history_df['杩唬娆℃暟'],
+ y=iter_history_df['棰勬祴鍋忓樊鐧惧垎姣�(%)'],
+ mode='lines+markers',
+ name='棰勬祴鍋忓樊鐧惧垎姣�',
+ line=dict(color='blue', width=2),
+ marker=dict(size=8)
+ ))
+
+ # 娣诲姞鍋忓樊闃堝�肩嚎
+ fig_deviation.add_trace(go.Scatter(
+ x=iter_history_df['杩唬娆℃暟'],
+ y=[tolerance] * len(iter_history_df),
+ mode='lines',
+ name='鍏佽鍋忓樊涓婇檺',
+ line=dict(color='red', dash='dash', width=1)
+ ))
+
+ fig_deviation.add_trace(go.Scatter(
+ x=iter_history_df['杩唬娆℃暟'],
+ y=[-tolerance] * len(iter_history_df),
+ mode='lines',
+ name='鍏佽鍋忓樊涓嬮檺',
+ line=dict(color='red', dash='dash', width=1)
+ ))
+
+ fig_deviation.update_layout(
+ title='杩唬璋冩暣鍋忓樊鍙樺寲瓒嬪娍',
+ xaxis_title='杩唬娆℃暟',
+ yaxis_title='棰勬祴鍋忓樊鐧惧垎姣�(%)',
+ height=400,
+ legend=dict(yanchor="top", y=0.99, xanchor="left", x=0.01)
+ )
+
+ st.plotly_chart(fig_deviation, use_container_width=True)
+
+ # 铻烘潌杞�熷拰娴佺▼涓婚�熷彉鍖栬秼鍔�
+ fig_params = go.Figure()
+ fig_params.add_trace(go.Scatter(
+ x=iter_history_df['杩唬娆℃暟'],
+ y=iter_history_df['璋冩暣鍓嶈灪鏉嗚浆閫�'],
+ mode='lines+markers',
+ name='璋冩暣鍓嶈灪鏉嗚浆閫�',
+ line=dict(color='blue', width=2),
+ marker=dict(size=8)
+ ))
+
+ fig_params.add_trace(go.Scatter(
+ x=iter_history_df['杩唬娆℃暟'],
+ y=iter_history_df['璋冩暣鍚庤灪鏉嗚浆閫�'],
+ mode='lines+markers',
+ name='璋冩暣鍚庤灪鏉嗚浆閫�',
+ line=dict(color='green', width=2),
+ marker=dict(size=8)
+ ))
+
+ fig_params.add_trace(go.Scatter(
+ x=iter_history_df['杩唬娆℃暟'],
+ y=iter_history_df['璋冩暣鍓嶆祦绋嬩富閫�'],
+ mode='lines+markers',
+ name='璋冩暣鍓嶆祦绋嬩富閫�',
+ line=dict(color='orange', width=2),
+ marker=dict(size=8)
+ ))
+
+ fig_params.add_trace(go.Scatter(
+ x=iter_history_df['杩唬娆℃暟'],
+ y=iter_history_df['璋冩暣鍚庢祦绋嬩富閫�'],
+ mode='lines+markers',
+ name='璋冩暣鍚庢祦绋嬩富閫�',
+ line=dict(color='purple', width=2),
+ marker=dict(size=8)
+ ))
+
+ fig_params.update_layout(
+ title='鍙傛暟璋冩暣鍙樺寲瓒嬪娍',
+ xaxis_title='杩唬娆℃暟',
+ yaxis_title='鏁板��',
+ height=400,
+ legend=dict(yanchor="top", y=0.99, xanchor="right", x=0.99)
+ )
+
+ st.plotly_chart(fig_params, use_container_width=True)
+
+ # 5. 鍘嗗彶璁板綍灞曠ず
+ st.subheader("馃摎 鍘嗗彶璋冭妭璁板綍")
+
+ if 'adjustment_history' in st.session_state and st.session_state['adjustment_history']:
+ # 鏄剧ず鍘嗗彶璁板綍鏁伴噺
+ st.write(f"鍏� {len(st.session_state['adjustment_history'])} 鏉″巻鍙茶褰�")
+
+ # 鍒嗛〉鏄剧ず
+ page_size = 10
+ total_pages = (len(st.session_state['adjustment_history']) + page_size - 1) // page_size
+
+ page = st.selectbox(
+ "閫夋嫨椤电爜",
+ options=range(1, total_pages + 1),
+ key="history_page"
+ )
+
+ start_idx = (page - 1) * page_size
+ end_idx = start_idx + page_size
+ paginated_history = st.session_state['adjustment_history'][start_idx:end_idx]
+
+ # 鍙嶅悜鏄剧ず锛屾渶鏂拌褰曞湪鍓嶉潰
+ for record in reversed(paginated_history):
+ with st.expander(f"璁板綍鏃堕棿: {record['timestamp'].strftime('%Y-%m-%d %H:%M:%S')} | 妯″瀷: {record['model_file']}"):
+ history_cols = st.columns(3)
+
+ with history_cols[0]:
+ st.write("**绫抽噸鍙傛暟**")
+ st.write(f"- 鏍囧噯绫抽噸: {record['standard_weight']:.4f} Kg/m")
+ st.write(f"- 绫抽噸涓婇檺: {record['upper_limit']:.4f} Kg/m")
+ st.write(f"- 绫抽噸涓嬮檺: {record['lower_limit']:.4f} Kg/m")
+ st.write(f"- 瀹為檯绫抽噸: {record['actual_weight']:.4f} Kg/m")
+
+ with history_cols[1]:
+ st.write("**閫熷害鍙傛暟**")
+ st.write(f"- 铻烘潌杞��: {record['current_screw_speed']:.1f} rpm")
+ st.write(f"- 娴佺▼涓婚��: {record['current_process_speed']:.1f} m/min")
+
+ with history_cols[2]:
+ st.write("**娓╁害鍙傛暟**")
+ st.write(f"- 铻烘潌娓╁害: {record['current_screw_temperature']:.1f} 掳C")
+ st.write(f"- 鍚庢満绛掓俯搴�: {record['current_rear_barrel_temperature']:.1f} 掳C")
+ st.write(f"- 鍓嶆満绛掓俯搴�: {record['current_front_barrel_temperature']:.1f} 掳C")
+ st.write(f"- 鏈哄ご娓╁害: {record['current_head_temperature']:.1f} 掳C")
+
+ st.write("**璋冩暣寤鸿**")
+ st.write(record['adjustment_result']['recommendation'])
+ else:
+ st.info("鏆傛棤鍘嗗彶璋冭妭璁板綍")
+
+ # 6. 甯姪璇存槑
+ with st.expander("鉂� 甯姪璇存槑"):
+ st.markdown("""
+ ### 鍔熻兘璇存槑
+ 鏈姛鑳芥ā鍧楃敤浜庢牴鎹綋鍓嶇背閲嶆祴閲忓�煎拰鎸ゅ嚭鏈哄弬鏁帮紝涓虹敤鎴锋彁渚涚瀛﹀悎鐞嗙殑鍙傛暟璋冩暣寤鸿锛屼互甯姪鐢ㄦ埛灏嗙背閲嶆帶鍒跺湪鏍囧噯鑼冨洿鍐呫��
+
+ ### 妯″瀷閫夋嫨
+ - 绯荤粺浼氳嚜鍔ㄨ鍙栭」鐩洰褰曚腑璁粌濂界殑妯″瀷鏂囦欢
+ - 妯″瀷鏂囦欢闇�绗﹀悎绯荤粺瑕佹眰鐨勬牸寮忥紝鍖呭惈妯″瀷鍙傛暟鍜岃缁冧俊鎭�
+ - 寤鸿閫夋嫨R虏寰楀垎杈冮珮銆佽宸緝灏忕殑妯″瀷
+
+ ### 鍙傛暟杈撳叆
+ - 绫抽噸鏍囧噯鍊硷細鎮ㄦ湡鏈涚殑鐩爣绫抽噸鍊�
+ - 绫抽噸涓婁笅闄愶細鍏佽鐨勭背閲嶆尝鍔ㄨ寖鍥�
+ - 鎸ゅ嚭鏈哄綋鍓嶅弬鏁帮細鍖呮嫭铻烘潌杞�熴�佹祦绋嬩富閫熴�佹満澶村帇鍔涘拰鎸ゅ嚭鏈虹數娴�
+ - 褰撳墠瀹為檯绫抽噸锛氬疄闄呮祴閲忓緱鍒扮殑绫抽噸鍊�
+
+ ### 缁撴灉瑙h
+ - 绫抽噸鐘舵�侊細鏄剧ず褰撳墠绫抽噸鏄惁鍦ㄥ厑璁歌寖鍥村唴
+ - 鍋忓樊鐧惧垎姣旓細褰撳墠绫抽噸涓庢爣鍑嗙背閲嶇殑鍋忓樊鐧惧垎姣�
+ - 鍏抽敭璋冩暣寤鸿锛氱郴缁熺粰鍑虹殑涓昏璋冩暣寤鸿
+ - 鍙傛暟璋冩暣瀵规瘮锛氳缁嗗睍绀烘瘡涓弬鏁扮殑褰撳墠鍊笺�佸缓璁�煎拰璋冩暣骞呭害
+
+ ### 娉ㄦ剰浜嬮」
+ 1. 璇风‘淇濊緭鍏ョ殑鍙傛暟鍊煎噯纭弽鏄犺澶囧綋鍓嶇姸鎬�
+ 2. 璋冩暣寤鸿浠呬緵鍙傝�冿紝瀹為檯鎿嶄綔鏃惰缁撳悎鐜板満缁忛獙
+ 3. 寤鸿鍦ㄨ皟鏁村弬鏁板悗瀵嗗垏瑙傚療绫抽噸鍙樺寲
+ 4. 瀹氭湡鏇存柊妯″瀷浠ユ彁楂樺缓璁殑鍑嗙‘鎬�
+ """)
+
+# 椤甸潰鍏ュ彛
+if __name__ == "__main__":
+ show_extruder_parameter_adjustment()
--
Gitblit v1.9.3