import os import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib.cm as cm import math from .analyst import Analyst from .utils.directoryUtil import DirectoryUtil as dir from confBusiness import ConfBusiness class MinPitchAnalyst(Analyst): """ 风电机组最小桨距角分析 """ def typeAnalyst(self): return "min_pitch" def turbineAnalysis(self, dataFrame, outputAnalysisDir, outputFilePath, confData: ConfBusiness, turbineName): self.min_pitch(dataFrame, outputFilePath, confData.field_turbine_time, confData.field_pitch_angle1, confData.field_power) def min_pitch(self, dataFrame, output_path, time_col, pitch_col, power_col): # Convert time column to datetime and extract date dataFrame['date_'] = pd.to_datetime( dataFrame[time_col], format='%Y-%m-%d %H:%M:%S').dt.date # Convert pitch to float and calculate pitch floor dataFrame['pitch'] = dataFrame[pitch_col].astype(float) dataFrame['pitch_floor'] = dataFrame[pitch_col].astype(int) # Group by date and pitch floor, then count occurrences grouped = dataFrame.groupby(['date_', 'pitch_floor'] ).size().reset_index(name='count') # Sort by date and pitch floor grouped.sort_values(['date_', 'pitch_floor'], inplace=True) # Write to CSV grouped.to_csv(output_path, index=False) def turbinesAnalysis(self, dataFrameMerge, outputAnalysisDir, confData: ConfBusiness): self.create_and_save_plot(outputAnalysisDir, confData.farm_name) def create_and_save_plot(self, csvFileDirOfCp, farm_name, encoding='utf-8'): """ Generates Cp distribution plots for turbines in a wind farm. Parameters: - csvFileDirOfCp: str, path to the directory containing input CSV files. - farm_name: str, name of the wind farm. - encoding: str, encoding of the input CSV files. Defaults to 'utf-8'. """ field_Name_Turbine = "turbine_name" file_time = 'date_' pitch_name = 'pitch_floor' count_name = 'count' split_way = 'merged_min_pitch' split_way = '_min_pitch.csv' # 遍历输入路径下的所有文件 for root, dir_names, file_names in dir.list_directory(csvFileDirOfCp): for file_name in file_names: if not file_name.endswith(".csv"): continue print(os.path.join(root, file_name)) data = pd.read_csv(os.path.join( root, file_name), encoding=encoding) # 将日期列转换为日期类型 data[file_time] = pd.to_datetime( data[file_time], format='%Y-%m-%d') # 计算count的对数 data['log_of_count'] = data[count_name].apply( lambda x: math.log2(x)) # 获取输出文件名(不含split_way之后的部分) turbine_name = file_name.split(split_way)[0] # 添加设备名作为新列 data[field_Name_Turbine] = turbine_name # 创建图表 fig, ax = plt.subplots(figsize=(12, 8), dpi=120) cmap = cm.get_cmap('Blues') norm = plt.Normalize( data['log_of_count'].min(), data['log_of_count'].max()) # 绘制散点图 ax.scatter(x=data[file_time], y=data[pitch_name], c=data['log_of_count'], cmap=cmap, s=5) # 设置图表属性 ax.set_xlabel('time') ax.set_ylabel('pitch angle') ax.set_ylim(-2, 60) ax.margins(x=0) # 创建颜色条 sm = cm.ScalarMappable(norm=norm, cmap=cmap) cbar = fig.colorbar(sm, ax=ax) cbar.set_label('log2(count)') # 设置图表标题 ax.set_title('turbine_name={}'.format(turbine_name)) # 保存图表 plot_path = os.path.join( csvFileDirOfCp, "{}.png".format(turbine_name)) plt.savefig(plot_path, bbox_inches='tight', dpi=120) # 关闭图表,释放资源 plt.close(fig)