windSpeedAnalyst.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. turbineInfos = self.common.getTurbineInfos(conf.dataContract.dataFilter.powerFarmID, turbineCodes,
  13. self.turbineInfo)
  14. dataFrameMerge=self.userDataFrame(dictionary,conf.dataContract.configAnalysis,self)
  15. return self.drawWindSpeedAnalysis(dataFrameMerge, turbineInfos,outputAnalysisDir, conf)
  16. def drawWindSpeedAnalysis(self, dataFrameMerge: pd.DataFrame, turbineModelInfo: pd.Series, outputAnalysisDir, conf: Contract):
  17. # 检查所需列是否存在
  18. required_columns = {Field_NameOfTurbine, Field_WindSpeed}
  19. if not required_columns.issubset(dataFrameMerge.columns):
  20. raise ValueError(f"DataFrame缺少必要的列。需要的列有: {required_columns}")
  21. # 确保'风速'列是数值类型
  22. dataFrameMerge[Field_WindSpeed] = pd.to_numeric(
  23. dataFrameMerge[Field_WindSpeed], errors='coerce')
  24. # 计算每个turbine_name的平均风速
  25. average_wind_speed = dataFrameMerge.groupby(Field_NameOfTurbine)[
  26. Field_WindSpeed].mean().reset_index()
  27. # 使用plotly绘制柱状图
  28. fig = px.bar(average_wind_speed, x=Field_NameOfTurbine,
  29. y=Field_WindSpeed, title=f'机组平均风速')
  30. # 更新x轴和y轴的标签
  31. fig.update_xaxes(title_text='机组', tickangle=-45)
  32. fig.update_yaxes(title_text='平均风速 (m/s)')
  33. # 如果需要进一步调整标题样式或位置(尽管默认情况下标题是居中的)
  34. # 可以使用 update_layout 来设置标题的 x 坐标(xanchor)为 'center' 来确保居中
  35. fig.update_layout(title_x=0.5) # 设置标题的x位置为图的中心
  36. engineTypeCode = turbineModelInfo.get(Field_MillTypeCode, "")
  37. if isinstance(engineTypeCode, pd.Series):
  38. engineTypeCode = engineTypeCode.iloc[0]
  39. engineTypeName = turbineModelInfo.get(Field_MachineTypeCode, "")
  40. if isinstance(engineTypeName, pd.Series):
  41. engineTypeName = engineTypeName.iloc[0]
  42. # 构建最终的JSON对象
  43. json_output = {
  44. "analysisTypeCode": "风速均值分析",
  45. "engineCode": engineTypeCode,
  46. "engineTypeName": engineTypeName,
  47. "xaixs": "机组",
  48. "yaixs": "平均风速(m/s)",
  49. "data": [{
  50. "engineName":"",
  51. "engineCode": "",
  52. "title": f'机组平均风速',
  53. "xData": average_wind_speed[Field_NameOfTurbine].tolist(),
  54. "yData": average_wind_speed[Field_WindSpeed].tolist(),
  55. }]
  56. }
  57. # Save plot
  58. # filePathOfImage = os.path.join(
  59. # outputAnalysisDir, f"WindSpeedAvg_Turbines.png")
  60. # fig.write_image(filePathOfImage, scale=3)
  61. # filePathOfHtml = os.path.join(
  62. # outputAnalysisDir, f"WindSpeedAvg_Turbines.html")
  63. # fig.write_html(filePathOfHtml)
  64. # 将JSON对象保存到文件
  65. output_json_path = os.path.join(outputAnalysisDir, f"WindSpeedAvg_Turbines.json")
  66. with open(output_json_path, 'w', encoding='utf-8') as f:
  67. import json
  68. json.dump(json_output, f, ensure_ascii=False, indent=4)
  69. result_rows = []
  70. # result_rows.append({
  71. # Field_Return_TypeAnalyst: self.typeAnalyst(),
  72. # Field_PowerFarmCode: conf.dataContract.dataFilter.powerFarmID,
  73. # Field_Return_BatchCode: conf.dataContract.dataFilter.dataBatchNum,
  74. # Field_CodeOfTurbine: "total",
  75. # Field_Return_FilePath: filePathOfImage,
  76. # Field_Return_IsSaveDatabase: False
  77. # })
  78. result_rows.append({
  79. Field_Return_TypeAnalyst: self.typeAnalyst(),
  80. Field_PowerFarmCode: conf.dataContract.dataFilter.powerFarmID,
  81. Field_Return_BatchCode: conf.dataContract.dataFilter.dataBatchNum,
  82. Field_CodeOfTurbine: "total",
  83. Field_MillTypeCode: 'total',
  84. Field_Return_FilePath: output_json_path,
  85. Field_Return_IsSaveDatabase: True
  86. })
  87. result_df = pd.DataFrame(result_rows)
  88. return result_df