faultAnalyst.py 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import pandas as pd
  2. import os
  3. import plotly.graph_objects as go
  4. from algorithmContract.confBusiness import *
  5. from algorithmContract.contract import Contract
  6. from behavior.analystNotFilter import AnalystNotFilter
  7. from plotly.subplots import make_subplots
  8. class FaultAnalyst(AnalystNotFilter):
  9. """
  10. 风电机组故障分析
  11. """
  12. def typeAnalyst(self):
  13. return "fault"
  14. def selectColumns(self):
  15. return [Field_DeviceName,Field_FaultTime,Field_FaultDetail]
  16. def turbinesAnalysis(self,outputAnalysisDir, conf: Contract, turbineCodes):
  17. dictionary = self.processTurbineData(turbineCodes,conf,self.selectColumns())
  18. dataFrameMerge = self.userDataFrame(dictionary,conf.dataContract.configAnalysis,self)
  19. return self.get_result(dataFrameMerge, outputAnalysisDir, conf)
  20. def get_result(self, dataFrame: pd.DataFrame, outputAnalysisDir: str, conf: Contract):
  21. #---------------整个风场维度统计故障时长与次数---------------------------
  22. # 统计各种类型故障出现的次数
  23. fault_detail_count = dataFrame[Field_FaultDetail].value_counts().reset_index()
  24. fault_detail_count.columns = [Field_FaultDetail, 'count']
  25. # 统计每个 fault_detail 的时长加和
  26. fault_time_sum = dataFrame.groupby(Field_FaultDetail)[Field_FaultTime].sum().reset_index()
  27. fault_time_sum.columns = [Field_FaultDetail, 'fault_time_sum']
  28. # 合并两个 DataFrame
  29. fault_summary = pd.merge(fault_detail_count, fault_time_sum, on=Field_FaultDetail, how='inner')
  30. fault_summary_sorted = fault_summary.sort_values(by='fault_time_sum', ascending=False)
  31. # -------------按风机分组统计故障情况------------------------------------------
  32. grouped = dataFrame.groupby(Field_DeviceName)
  33. results= []
  34. for name, group in grouped:
  35. turbine_fault_summary = pd.DataFrame({
  36. Field_DeviceName: [name],
  37. 'count': [len(group)],
  38. 'fault_time': [group[Field_FaultTime].sum()]
  39. })
  40. results.append(turbine_fault_summary)
  41. # 合并所有风机的故障统计结果
  42. turbine_fault_summary = pd.concat(results, ignore_index=True)
  43. turbine_fault_sorted = turbine_fault_summary.sort_values(by='fault_time', ascending=False)
  44. # 故障类型前十名
  45. draw_results=turbine_fault_sorted.head(10)
  46. # 保存结果
  47. result_rows = []
  48. filePathOfturbinefault = os.path.join(outputAnalysisDir, f"turbine_fault_result{CSVSuffix}")
  49. turbine_fault_sorted.to_csv(filePathOfturbinefault, index=False,encoding='utf-8-sig')
  50. result_rows.append({
  51. Field_Return_TypeAnalyst: self.typeAnalyst(),
  52. Field_PowerFarmCode: conf.dataContract.dataFilter.powerFarmID,
  53. Field_Return_BatchCode: conf.dataContract.dataFilter.dataBatchNum,
  54. Field_CodeOfTurbine: "total",
  55. Field_Return_FilePath: filePathOfturbinefault,
  56. Field_Return_IsSaveDatabase: True
  57. })
  58. filePathOftotalfault = os.path.join(outputAnalysisDir, f"total_fault_result{CSVSuffix}")
  59. fault_summary_sorted.to_csv(filePathOftotalfault, index=False,encoding='utf-8-sig')
  60. result_rows.append({
  61. Field_Return_TypeAnalyst: self.typeAnalyst(),
  62. Field_PowerFarmCode: conf.dataContract.dataFilter.powerFarmID,
  63. Field_Return_BatchCode: conf.dataContract.dataFilter.dataBatchNum,
  64. Field_CodeOfTurbine: "total",
  65. Field_Return_FilePath: filePathOftotalfault,
  66. Field_Return_IsSaveDatabase: True
  67. })
  68. result_df = pd.DataFrame(result_rows)
  69. return result_df