import os from datetime import datetime import pandas as pd import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.cm as cm from matplotlib.ticker import MultipleLocator from matplotlib.colors import Normalize import seaborn as sns import plotly.graph_objects as go from plotly.subplots import make_subplots from geopy.distance import geodesic from behavior.analyst import Analyst from utils.directoryUtil import DirectoryUtil as dir from algorithmContract.confBusiness import * class RatedWindSpeedAnalyst(Analyst): """ 风电机组额定风速分析。 秒级scada数据运算太慢,建议使用分钟级scada数据 """ def typeAnalyst(self): return "rated_windspeed" def turbinesAnalysis(self, dataFrameMerge, outputAnalysisDir, confData: ConfBusiness): self.draw(dataFrameMerge, outputAnalysisDir, confData) def draw(self, dataFrameMerge: pd.DataFrame, outputAnalysisDir, confData: ConfBusiness): """ 绘制并保存满发风速区间数据计数图。 参数: dataFrameMerge (pd.DataFrame): 包含数据的DataFrame,需要包含设备名、风速和功率列。 outputAnalysisDir (str): 分析输出目录。 confData (ConfBusiness): 配置 """ # 初始化结果列表 res = [] # 按设备名分组并计算统计数据 grouped = dataFrameMerge.groupby(Field_NameOfTurbine) for name, group in grouped: group = group[group[confData.field_wind_speed] >= 11] res.append([name, group[confData.field_power].min(), group[confData.field_power].max( ), group[confData.field_power].mean(), group.shape[0]]) # 创建结果DataFrame data = pd.DataFrame(res, columns=[ Field_NameOfTurbine, 'power-min', 'power-max', 'power-mean', 'count']) # 绘制风速区间数据计数图 fig, ax = plt.subplots() sns.barplot(x=Field_NameOfTurbine, y='count', data=data, ax=ax, color='dodgerblue') ax.set_title('Rated - full wind speed interval data count') ax.grid(True) # 旋转45度 plt.xticks(rotation=45) # 保存图表 plt.savefig(os.path.join(outputAnalysisDir, "风速区间数据计数.png"), bbox_inches='tight', dpi=120) plt.close()