123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- 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)
|