Przeglądaj źródła

fix时间错误bug
提供接口:获取变化趋势数据

drggboy 3 miesięcy temu
rodzic
commit
282e9780ba
2 zmienionych plików z 68 dodań i 3 usunięć
  1. 5 2
      api/app/model.py
  2. 63 1
      api/app/routes.py

+ 5 - 2
api/app/model.py

@@ -114,12 +114,15 @@ def save_current_dataset(session, data_type, commit=True):
     Returns:
     int: 新保存的数据集的ID。
     """
+    current_time = datetime.datetime.now()
+    
     new_dataset = Datasets(
-        Dataset_name=f"{data_type}_dataset_{datetime.datetime.now():%Y%m%d_%H%M%S}",
+        Dataset_name=f"{data_type}_dataset_{current_time:%Y%m%d_%H%M%S}",
         Dataset_description=f"Automatically generated dataset for type {data_type}",
         Row_count=0,
         Status='pending',
-        Dataset_type=data_type
+        Dataset_type=data_type,
+        Uploaded_at=current_time
     )
 
     session.add(new_dataset)

+ 63 - 1
api/app/routes.py

@@ -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()