windSpeedAnalyst.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import os
  2. import pandas as pd
  3. import plotly.express as px
  4. from algorithmContract.confBusiness import *
  5. from algorithmContract.contract import Contract
  6. from behavior.analystNotFilter import AnalystNotFilter
  7. class WindSpeedAnalyst(AnalystNotFilter):
  8. def typeAnalyst(self):
  9. return "wind_speed"
  10. def turbinesAnalysis(self, outputAnalysisDir, conf: Contract, turbineCodes):
  11. dictionary=self.processTurbineData(turbineCodes,conf,[Field_DeviceCode,Field_Time,Field_WindSpeed,Field_ActiverPower])
  12. dataFrameMerge=self.userDataFrame(dictionary,conf.dataContract.configAnalysis,self)
  13. return self.drawWindSpeedAnalysis(dataFrameMerge, outputAnalysisDir, conf)
  14. def drawWindSpeedAnalysis(self, dataFrameMerge: pd.DataFrame, outputAnalysisDir, conf: Contract):
  15. # 检查所需列是否存在
  16. required_columns = {Field_NameOfTurbine, Field_WindSpeed}
  17. if not required_columns.issubset(dataFrameMerge.columns):
  18. raise ValueError(f"DataFrame缺少必要的列。需要的列有: {required_columns}")
  19. # 确保'风速'列是数值类型
  20. dataFrameMerge[Field_WindSpeed] = pd.to_numeric(
  21. dataFrameMerge[Field_WindSpeed], errors='coerce')
  22. # 计算每个turbine_name的平均风速
  23. average_wind_speed = dataFrameMerge.groupby(Field_NameOfTurbine)[
  24. Field_WindSpeed].mean().reset_index()
  25. # 使用plotly绘制柱状图
  26. fig = px.bar(average_wind_speed, x=Field_NameOfTurbine,
  27. y=Field_WindSpeed, title=f'机组平均风速-{self.turbineModelInfo[Field_MachineTypeCode].iloc[0]}')
  28. # 更新x轴和y轴的标签
  29. fig.update_xaxes(title_text='机组', tickangle=-45)
  30. fig.update_yaxes(title_text='平均风速 (m/s)')
  31. # 如果需要进一步调整标题样式或位置(尽管默认情况下标题是居中的)
  32. # 可以使用 update_layout 来设置标题的 x 坐标(xanchor)为 'center' 来确保居中
  33. fig.update_layout(title_x=0.5) # 设置标题的x位置为图的中心
  34. # Save plot
  35. filePathOfImage = os.path.join(
  36. outputAnalysisDir, f"WindSpeedAvg_Turbines.png")
  37. fig.write_image(filePathOfImage, scale=3)
  38. filePathOfHtml = os.path.join(
  39. outputAnalysisDir, f"WindSpeedAvg_Turbines.html")
  40. fig.write_html(filePathOfHtml)
  41. result_rows = []
  42. result_rows.append({
  43. Field_Return_TypeAnalyst: self.typeAnalyst(),
  44. Field_PowerFarmCode: conf.dataContract.dataFilter.powerFarmID,
  45. Field_Return_BatchCode: conf.dataContract.dataFilter.dataBatchNum,
  46. Field_CodeOfTurbine: "total",
  47. Field_Return_FilePath: filePathOfImage,
  48. Field_Return_IsSaveDatabase: False
  49. })
  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: filePathOfHtml,
  56. Field_Return_IsSaveDatabase: True
  57. })
  58. result_df = pd.DataFrame(result_rows)
  59. return result_df