|
@@ -13,6 +13,7 @@ from sqlalchemy.orm import sessionmaker
|
|
|
import logging
|
|
|
from sqlalchemy import text, select, MetaData, Table, func
|
|
|
from .tasks import train_model_task
|
|
|
+from datetime import datetime
|
|
|
|
|
|
# 配置日志
|
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
@@ -107,7 +108,8 @@ def upload_dataset():
|
|
|
Dataset_description=dataset_description,
|
|
|
Row_count=0,
|
|
|
Status='Datasets_upgraded',
|
|
|
- Dataset_type=dataset_type
|
|
|
+ Dataset_type=dataset_type,
|
|
|
+ Uploaded_at=datetime.now()
|
|
|
)
|
|
|
session.add(new_dataset)
|
|
|
session.commit()
|
|
@@ -1394,3 +1396,63 @@ def set_current_dataset(data_type, dataset_id):
|
|
|
|
|
|
finally:
|
|
|
session.close()
|
|
|
+
|
|
|
+@bp.route('/get-model-history/<string:data_type>', methods=['GET'])
|
|
|
+def get_model_history(data_type):
|
|
|
+ """
|
|
|
+ 获取模型训练历史数据的API接口
|
|
|
+
|
|
|
+ @param data_type: 数据集类型 ('reduce' 或 'reflux')
|
|
|
+ @return: JSON响应,包含时间序列的模型性能数据
|
|
|
+ """
|
|
|
+ Session = sessionmaker(bind=db.engine)
|
|
|
+ session = Session()
|
|
|
+
|
|
|
+ try:
|
|
|
+ # 查询所有自动生成的数据集,按时间排序
|
|
|
+ datasets = session.query(Datasets).filter(
|
|
|
+ Datasets.Dataset_type == data_type,
|
|
|
+ Datasets.Dataset_description == f"Automatically generated dataset for type {data_type}"
|
|
|
+ ).order_by(Datasets.Uploaded_at).all()
|
|
|
+
|
|
|
+ history_data = []
|
|
|
+ for dataset in datasets:
|
|
|
+ # 查找对应的自动训练模型
|
|
|
+ model = session.query(Models).filter(
|
|
|
+ Models.DatasetID == dataset.Dataset_ID,
|
|
|
+ Models.Model_name.like(f'auto_trained_{data_type}_%')
|
|
|
+ ).first()
|
|
|
+
|
|
|
+ if model and model.Performance_score is not None:
|
|
|
+ # 直接使用数据库中的时间,不进行格式化(保持与created_at相同的时区)
|
|
|
+ created_at = model.Created_at.isoformat() if model.Created_at else None
|
|
|
+
|
|
|
+ history_data.append({
|
|
|
+ 'dataset_id': dataset.Dataset_ID,
|
|
|
+ 'row_count': dataset.Row_count,
|
|
|
+ 'model_id': model.ModelID,
|
|
|
+ 'model_name': model.Model_name,
|
|
|
+ 'performance_score': float(model.Performance_score),
|
|
|
+ 'timestamp': created_at
|
|
|
+ })
|
|
|
+
|
|
|
+ # 按时间戳排序
|
|
|
+ history_data.sort(key=lambda x: x['timestamp'] if x['timestamp'] else '')
|
|
|
+
|
|
|
+ # 构建返回数据,分离各个指标序列便于前端绘图
|
|
|
+ response_data = {
|
|
|
+ 'data_type': data_type,
|
|
|
+ 'timestamps': [item['timestamp'] for item in history_data],
|
|
|
+ 'row_counts': [item['row_count'] for item in history_data],
|
|
|
+ 'performance_scores': [item['performance_score'] for item in history_data],
|
|
|
+ 'model_details': history_data # 保留完整数据供前端使用
|
|
|
+ }
|
|
|
+
|
|
|
+ return jsonify(response_data), 200
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ logger.error(f'获取模型历史数据失败: {str(e)}', exc_info=True)
|
|
|
+ return jsonify({'error': str(e)}), 500
|
|
|
+
|
|
|
+ finally:
|
|
|
+ session.close()
|