ratedWindSpeedAnalyst.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import os
  2. import pandas as pd
  3. import plotly.graph_objects as go
  4. from algorithmContract.confBusiness import *
  5. from algorithmContract.contract import Contract
  6. from behavior.analystWithGoodBadPoint import AnalystWithGoodBadPoint
  7. class RatedWindSpeedAnalyst(AnalystWithGoodBadPoint):
  8. """
  9. 风电机组额定风速分析。
  10. 秒级scada数据运算太慢,建议使用分钟级scada数据
  11. """
  12. def typeAnalyst(self):
  13. return "rated_windspeed"
  14. def turbinesAnalysis(self, outputAnalysisDir, conf: Contract, turbineCodes):
  15. dictionary=self.processTurbineData(turbineCodes,conf,[Field_DeviceCode,Field_Time,Field_WindSpeed,Field_ActiverPower])
  16. # dataFrameMerge=self.userDataFrame(dictionary,conf.dataContract.configAnalysis,self)
  17. dataFrameOfTurbines = self.userDataFrame(
  18. dictionary, conf.dataContract.configAnalysis, self)
  19. turbrineInfos = self.common.getTurbineInfos(
  20. conf.dataContract.dataFilter.powerFarmID, turbineCodes, self.turbineInfo)
  21. groupedOfTurbineModel = turbrineInfos.groupby(Field_MillTypeCode)
  22. returnDatas = []
  23. for turbineModelCode, group in groupedOfTurbineModel:
  24. currTurbineCodes = group[Field_CodeOfTurbine].unique().tolist()
  25. currTurbineModeInfo = self.common.getTurbineModelByCode(
  26. turbineModelCode, self.turbineModelInfo)
  27. currDataFrameOfTurbines = dataFrameOfTurbines[dataFrameOfTurbines[Field_CodeOfTurbine].isin(
  28. currTurbineCodes)]
  29. returnData= self.draw(currDataFrameOfTurbines, outputAnalysisDir, conf,currTurbineModeInfo)
  30. returnDatas.append(returnData)
  31. returnResult = pd.concat(returnDatas, ignore_index=True)
  32. return returnResult
  33. def draw(self, dataFrameMerge: pd.DataFrame, outputAnalysisDir, conf: Contract,turbineModelInfo: pd.Series):
  34. """
  35. 绘制并保存满发风速区间数据计数图。
  36. 参数:
  37. dataFrameMerge (pd.DataFrame): 包含数据的DataFrame,需要包含设备名、风速和功率列。
  38. outputAnalysisDir (str): 分析输出目录。
  39. confData (ConfBusiness): 配置
  40. """
  41. # 初始化结果列表
  42. res = []
  43. # 按设备名分组并计算统计数据
  44. grouped = dataFrameMerge.groupby(Field_NameOfTurbine)
  45. for name, group in grouped:
  46. group = group[group[Field_WindSpeed] >= 11]
  47. res.append([name, group[Field_ActiverPower].min(), group[Field_ActiverPower].max(
  48. ), group[Field_ActiverPower].median(), group.shape[0]])
  49. # 创建结果DataFrame
  50. data = pd.DataFrame(res, columns=[
  51. Field_NameOfTurbine, 'power-min', 'power-max', 'power-median', 'count'])
  52. fig = go.Figure(data=[go.Bar(
  53. x=data[Field_NameOfTurbine],
  54. y=data['count'],
  55. marker_color='dodgerblue'
  56. )
  57. ]
  58. )
  59. fig.update_layout(
  60. title={
  61. "text": f'额定风速间隔数据计数-{turbineModelInfo[Field_MachineTypeCode]}',
  62. 'x': 0.5
  63. },
  64. xaxis=dict(
  65. title='机组',
  66. tickangle=-45
  67. ),
  68. yaxis=dict(
  69. title='总数'
  70. )
  71. )
  72. result_rows = []
  73. # 保存图像
  74. pngFileName = '风速区间数据计数.png'
  75. pngFilePath = os.path.join(outputAnalysisDir, pngFileName)
  76. fig.write_image(pngFilePath, scale=3)
  77. # 保存HTML
  78. htmlFileName = '风速区间数据计数.html'
  79. htmlFilePath = os.path.join(outputAnalysisDir, htmlFileName)
  80. fig.write_html(htmlFilePath)
  81. result_rows.append({
  82. Field_Return_TypeAnalyst: self.typeAnalyst(),
  83. Field_PowerFarmCode: conf.dataContract.dataFilter.powerFarmID,
  84. Field_Return_BatchCode: conf.dataContract.dataFilter.dataBatchNum,
  85. Field_CodeOfTurbine: 'total',
  86. Field_Return_FilePath: pngFilePath,
  87. Field_Return_IsSaveDatabase: False
  88. })
  89. result_rows.append({
  90. Field_Return_TypeAnalyst: self.typeAnalyst(),
  91. Field_PowerFarmCode: conf.dataContract.dataFilter.powerFarmID,
  92. Field_Return_BatchCode: conf.dataContract.dataFilter.dataBatchNum,
  93. Field_CodeOfTurbine: 'total',
  94. Field_Return_FilePath: htmlFilePath,
  95. Field_Return_IsSaveDatabase: True
  96. })
  97. result_df = pd.DataFrame(result_rows)
  98. return result_df