Kaynağa Gözat

添加风机无数据时返回-1值的代码

wangjiaojiao 2 gün önce
ebeveyn
işleme
1f097bfea2
3 değiştirilmiş dosya ile 37 ekleme ve 80 silme
  1. 36 1
      api_health.py
  2. 0 38
      database.py
  3. 1 41
      health_evalution_class.py

+ 36 - 1
api_health.py

@@ -74,12 +74,47 @@ async def assess_windfarm(request: AssessmentRequest):
             # 获取数据
             data = fetcher.fetch_turbine_data(request.windcode, engine_code, request.month, valid_features)
             print(data)
+            
             if data is None or data.empty:  # 增加对None的检查
                 logger.warning(f"{engine_code}在{request.month}无有效数据")
+                # 创建空评估结果,所有评分为-1
+                empty_assessment = {
+                    'engine_code': engine_code,
+                    'wind_turbine_name': wind_turbine_name,
+                    'mill_type': mill_type,
+                    'total_health_score': -1,
+                    'subsystems': {
+                        'generator': {
+                            'health_score': -1,
+                            'weights': {},
+                            'message': None
+                        },
+                        'nacelle': {
+                            'health_score': -1,
+                            'weights': {},
+                            'message': None
+                        },
+                        'grid': {
+                            'health_score': -1,
+                            'weights': {},
+                            'message': None
+                        },
+                        'drive_train': {
+                            'health_score': -1,
+                            'weights': {},
+                            'message': None
+                        }
+                    },
+                    'assessed_subsystems': ['generator', 'nacelle', 'grid', 'drive_train']
+                }
+                formatted_result = _format_result(empty_assessment)
+                results.append(formatted_result)
+                processed_count += 1
+                logger.info(f"处理无数据风机{engine_code}(已处理{processed_count}/{all_turbines}台)")
                 continue
 
             # 执行评估并格式化结果
-            assessment = assessor.assess_turbine(engine_code, data, mill_type,wind_turbine_name)
+            assessment = assessor.assess_turbine(engine_code, data, mill_type, wind_turbine_name)
             if not assessment:  # 检查评估结果有效性
                 logger.warning(f"{engine_code}评估结果为空")
                 continue

+ 0 - 38
database.py

@@ -53,44 +53,6 @@ class DataFetcher:
     获取风机时序数据
     根据风机编号在表'windcode_minute'中,筛选出timestamp在month范围里的所有数据条
     """
-    # def fetch_turbine_data(self, windecode,engine_code, month, features):
-
-    #     table_name = f"{windecode}_minute"
-    #     month_start = f"{month}-01"
-    #     month_end = f"{month}-31"  # 自动处理不同月份天数
-        
-    #     query = f"""
-    #     SELECT time_stamp, {','.join(features)} 
-    #     FROM {table_name} 
-    #     WHERE wind_turbine_number ='{engine_code}'
-    #     AND time_stamp BETWEEN '{month_start} 00:00:00' AND '{month_end} 23:59:59'
-    #     """
-    #     print('sql语句')
-    #     print(query)
-    #     try:
-    #         return pd.read_sql(query, self.data_engine)
-    #     except:
-    #         print(traceback.print_exc())
-    #         return pd.DataFrame()
-        
-    # def fetch_turbine_data(self, windecode,engine_code, month, features):
-
-    #     year_month_int = int(month.replace('-',''))
-    #     table_name = f"{windecode}_minute"
-        
-    #     query = f"""
-    #     SELECT year_month, {','.join(features)} 
-    #     FROM {table_name} 
-    #     WHERE wind_turbine_number ='{engine_code}'
-    #     AND year_month = :year_month_int
-    #     """
-    #     print('sql语句')
-    #     print(query)
-    #     try:
-    #         return pd.read_sql(query, self.data_engine)
-    #     except:
-    #         print(traceback.print_exc())
-    #         return pd.DataFrame()
     def fetch_turbine_data(self, windcode, engine_code, month, features):
         """获取指定月份风机数据(安全参数化版本)
         

+ 1 - 41
health_evalution_class.py

@@ -101,7 +101,7 @@ class HealthAssessor:
                 return est_X - newStates
 
             def calcSPRT(self, newsStates, feature_weight, alpha=0.1, beta=0.1, decisionGroup=1):
-                """优化SPRT计算(与源代码完全一致)"""
+                """优化SPRT计算"""
                 stateResidual = self.calcResidualByLocallyWeightedLR(newsStates)
                 weightedStateResidual = np.dot(stateResidual, feature_weight)
                 weightedHealthyResidual = np.dot(self.healthyResidual, feature_weight)
@@ -173,46 +173,6 @@ class HealthAssessor:
 
         return MSETCore()
 
-    # def assess_turbine(self, engine_code, data, mill_type,wind_turbine_name) :
-    #     """评估单个风机"""
-    #     results = {
-    #         "engine_code": engine_code,
-    #         "wind_turbine_name":wind_turbine_name,
-    #         "mill_type": mill_type,
-    #         "assessed_subsystems": [],            
-    #         "subsystems": {},
-    #         "overall_health": None
-
-    #     }
-
-    #     # 各子系统评估
-    #     subsystems_to_assess = [
-    #         ('generator', self.subsystem_config['generator'][mill_type], 2),
-    #         ('nacelle', self.subsystem_config['nacelle'], 2),
-    #         ('grid', self.subsystem_config['grid'], 2),
-    #         ('drive_train', self.subsystem_config['drive_train'] if mill_type == 'dfig' else None, 2)
-    #     ]
-
-    #     for subsystem, config, min_features in subsystems_to_assess:
-    #         if config is None:
-    #             continue
-                
-    #         features = self._get_subsystem_features(config, data)
-    #         if len(features) >= min_features:
-    #             assessment = self._assess_subsystem(data[features])
-    #             results["subsystems"][subsystem] = assessment
-
-    #     # 计算整机健康度
-    #     if results["subsystems"]:
-    #         valid_subsystems = [k for k, v in results["subsystems"].items() if v['health'] >= 0]
-    #         if valid_subsystems:
-    #             weights = self._get_subsystem_weights(valid_subsystems)
-    #             health_scores = [results["subsystems"][sys]['health'] for sys in valid_subsystems]
-    #             #整体健康度评分
-    #             results["overall_health"] = float(np.dot(health_scores, weights))
-    #             results["assessed_subsystems"] = valid_subsystems
-
-    #     return results
 
     def assess_turbine(self, engine_code, data, mill_type, wind_turbine_name):
         """评估单个风机