1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- import pandas as pd
- import os
- import plotly.graph_objects as go
- from algorithmContract.confBusiness import *
- from algorithmContract.contract import Contract
- from behavior.analystNotFilter import AnalystNotFilter
- from plotly.subplots import make_subplots
- class FaultAnalyst(AnalystNotFilter):
- """
- 风电机组故障分析
- """
- def typeAnalyst(self):
- return "fault"
- def selectColumns(self):
- return [Field_DeviceName,Field_FaultTime,Field_FaultDetail]
- def turbinesAnalysis(self,outputAnalysisDir, conf: Contract, turbineCodes):
- dictionary = self.processTurbineData(turbineCodes,conf,self.selectColumns())
- dataFrameMerge = self.userDataFrame(dictionary,conf.dataContract.configAnalysis,self)
- return self.get_result(dataFrameMerge, outputAnalysisDir, conf)
- def get_result(self, dataFrame: pd.DataFrame, outputAnalysisDir: str, conf: Contract):
- #---------------整个风场维度统计故障时长与次数---------------------------
- # 统计各种类型故障出现的次数
- fault_detail_count = dataFrame[Field_FaultDetail].value_counts().reset_index()
- fault_detail_count.columns = [Field_FaultDetail, 'count']
- # 统计每个 fault_detail 的时长加和
- fault_time_sum = dataFrame.groupby(Field_FaultDetail)[Field_FaultTime].sum().reset_index()
- fault_time_sum.columns = [Field_FaultDetail, 'fault_time_sum']
- # 合并两个 DataFrame
- fault_summary = pd.merge(fault_detail_count, fault_time_sum, on=Field_FaultDetail, how='inner')
- fault_summary_sorted = fault_summary.sort_values(by='fault_time_sum', ascending=False)
- # -------------按风机分组统计故障情况------------------------------------------
- grouped = dataFrame.groupby(Field_DeviceName)
- results= []
- for name, group in grouped:
- turbine_fault_summary = pd.DataFrame({
- Field_DeviceName: [name],
- 'count': [len(group)],
- 'fault_time': [group[Field_FaultTime].sum()]
- })
- results.append(turbine_fault_summary)
- # 合并所有风机的故障统计结果
- turbine_fault_summary = pd.concat(results, ignore_index=True)
- turbine_fault_sorted = turbine_fault_summary.sort_values(by='fault_time', ascending=False)
- # 故障类型前十名
- draw_results=turbine_fault_sorted.head(10)
- # 保存结果
- result_rows = []
- filePathOfturbinefault = os.path.join(outputAnalysisDir, f"turbine_fault_result{CSVSuffix}")
- turbine_fault_sorted.to_csv(filePathOfturbinefault, index=False,encoding='utf-8-sig')
- result_rows.append({
- Field_Return_TypeAnalyst: self.typeAnalyst(),
- Field_PowerFarmCode: conf.dataContract.dataFilter.powerFarmID,
- Field_Return_BatchCode: conf.dataContract.dataFilter.dataBatchNum,
- Field_CodeOfTurbine: "total",
- Field_Return_FilePath: filePathOfturbinefault,
- Field_Return_IsSaveDatabase: True
- })
- filePathOftotalfault = os.path.join(outputAnalysisDir, f"total_fault_result{CSVSuffix}")
- fault_summary_sorted.to_csv(filePathOftotalfault, index=False,encoding='utf-8-sig')
- result_rows.append({
- Field_Return_TypeAnalyst: self.typeAnalyst(),
- Field_PowerFarmCode: conf.dataContract.dataFilter.powerFarmID,
- Field_Return_BatchCode: conf.dataContract.dataFilter.dataBatchNum,
- Field_CodeOfTurbine: "total",
- Field_Return_FilePath: filePathOftotalfault,
- Field_Return_IsSaveDatabase: True
- })
- result_df = pd.DataFrame(result_rows)
- return result_df
|