import os import pandas as pd import numpy as np import plotly.graph_objects as go from plotly.subplots import make_subplots import plotly.express as px from behavior.analyst import Analyst from utils.directoryUtil import DirectoryUtil as dir from algorithmContract.confBusiness import * class WindSpeedAnalyst(Analyst): def typeAnalyst(self): return "wind_speed" def turbinesAnalysis(self, dataFrameMerge, outputAnalysisDir, confData: ConfBusiness): self.drawWindSpeedAnalysis(dataFrameMerge, outputAnalysisDir, confData) def drawWindSpeedAnalysis(self, dataFrameMerge: pd.DataFrame, outputAnalysisDir, confData: ConfBusiness): # 检查所需列是否存在 required_columns = {Field_NameOfTurbine,confData.field_wind_speed} if not required_columns.issubset(dataFrameMerge.columns): raise ValueError(f"DataFrame缺少必要的列。需要的列有: {required_columns}") # 确保'风速'列是数值类型 dataFrameMerge[confData.field_wind_speed] = pd.to_numeric(dataFrameMerge[confData.field_wind_speed], errors='coerce') # 计算每个turbine_name的平均风速 average_wind_speed = dataFrameMerge.groupby(Field_NameOfTurbine)[confData.field_wind_speed].mean().reset_index() # 使用plotly绘制柱状图 fig = px.bar(average_wind_speed, x=Field_NameOfTurbine, y=confData.field_wind_speed, title='Turbine Average Wind Speed') # 更新x轴和y轴的标签 fig.update_xaxes(title_text='Turbine Name', tickangle=-45) fig.update_yaxes(title_text='Average Wind Speed (m/s)') # 如果需要进一步调整标题样式或位置(尽管默认情况下标题是居中的) # 可以使用 update_layout 来设置标题的 x 坐标(xanchor)为 'center' 来确保居中 fig.update_layout(title_x=0.5) # 设置标题的x位置为图的中心 # 保存图像 output_file = os.path.join(outputAnalysisDir, f"WindSpeedAvg_Turbines.png") fig.write_image(output_file)