pitchPowerWindSpeedAnalyst.py 4.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import os
  2. import pandas as pd
  3. import numpy as np
  4. import plotly.graph_objects as go
  5. from plotly.subplots import make_subplots
  6. from behavior.analyst import Analyst
  7. from utils.directoryUtil import DirectoryUtil as dir
  8. from algorithmContract.confBusiness import *
  9. import plotly.offline as offline
  10. class PitchPowerWindSpeedAnalyst(Analyst):
  11. def typeAnalyst(self):
  12. return "pitch_power_windspeed"
  13. # def filterCommon(self,dataFrame:pd.DataFrame, confData:ConfBusiness):
  14. # dataFrame=super().filterCommon(dataFrame,confData)
  15. # dataFrame=dataFrame[(dataFrame[confData.field_power]>=1350) & (dataFrame[confData.field_power]<=1500)]
  16. # return dataFrame
  17. def turbinesAnalysis(self, dataFrameMerge: pd.DataFrame, outputAnalysisDir, confData: ConfBusiness):
  18. self.drawGraph(dataFrameMerge, outputAnalysisDir, confData)
  19. def drawGraph(self, dataFrameMerge: pd.DataFrame, outputAnalysisDir, confData: ConfBusiness):
  20. """
  21. 绘制3D散点图。
  22. 参数:
  23. df: pandas.DataFrame。
  24. 返回:
  25. 一个Plotly图形对象。
  26. """
  27. # 检查所需列是否存在
  28. required_columns = {confData.field_pitch_angle1,
  29. confData.field_power, confData.field_wind_speed}
  30. if not required_columns.issubset(dataFrameMerge.columns):
  31. raise ValueError(f"DataFrame缺少必要的列。需要的列有: {required_columns}")
  32. # 按设备名分组数据
  33. grouped = dataFrameMerge.groupby(Field_NameOfTurbine)
  34. for name, group in grouped:
  35. layout = go.Layout(
  36. title={
  37. "text": f'3D散点图: 风速 vs. 桨距角 vs. 功率 {name}',
  38. "x": 0.5
  39. },
  40. scene=dict(
  41. xaxis=dict(
  42. title='风速',
  43. dtick=2, # 设置轴刻度间隔
  44. range=[0,
  45. 26], # 设置轴的范围
  46. ),
  47. yaxis=dict(
  48. title='桨距角',
  49. dtick=confData.graphSets["pitchAngle"]["step"] if not self.common.isNone(
  50. confData.graphSets["pitchAngle"]["step"]) else 2, # 设置y轴刻度间隔为0.1
  51. range=[confData.graphSets["pitchAngle"]["min"] if not self.common.isNone(
  52. confData.graphSets["pitchAngle"]["min"]) else -2, confData.graphSets["pitchAngle"]["max"] if not self.common.isNone(confData.graphSets["pitchAngle"]["max"]) else 28], # 设置y轴的范围从0到1
  53. ),
  54. zaxis=dict(
  55. title='功率',
  56. dtick=confData.graphSets["activePower"]["step"] if not self.common.isNone(
  57. confData.graphSets["activePower"]) and not self.common.isNone(
  58. confData.graphSets["activePower"]["step"]) else 250,
  59. range=[confData.graphSets["activePower"]["min"] if not self.common.isNone(
  60. confData.graphSets["activePower"]["min"]) else 0, confData.graphSets["activePower"]["max"] if not self.common.isNone(confData.graphSets["activePower"]["max"]) else confData.rated_power*1.2],
  61. )
  62. ),
  63. # t为顶部(top)间距,b为底部(bottom)间距
  64. margin=dict(t=50, b=10)
  65. )
  66. # 创建 3D 散点图
  67. fig = go.Figure(data=[go.Scatter3d(
  68. x=group[confData.field_wind_speed],
  69. y=group[confData.field_pitch_angle1],
  70. z=group[confData.field_power],
  71. mode='markers', # 设置模式为 markers,表示绘制散点图
  72. marker=dict(
  73. size=1.5, # 设置散点的大小
  74. # 你还可以设置其他属性,如颜色、透明度等
  75. # color='blue',
  76. # opacity=0.8
  77. )
  78. )], layout=layout) # 假设 layout 已经定义好了
  79. # 保存html
  80. outputFileHtml = os.path.join(outputAnalysisDir, f"{name}.html")
  81. fig.write_html(outputFileHtml)
  82. # 保存图表为HTML文件
  83. # offline.plot(fig, filename=outputFileHtml, auto_open=False)
  84. # 保存图像
  85. # output_file = os.path.join(outputAnalysisDir, f"{name}.png")
  86. # fig.write_image(output_file)