| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- 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 matplotlib.ticker as ticker
- 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 RatedPowerWindSpeedAnalyst(Analyst):
- """
- 风电机组额定功率风速分析。
- 秒级scada数据运算太慢,建议使用分钟级scada数据
- """
- def typeAnalyst(self):
- return "rated_power_windspeed"
- def turbinesAnalysis(self, dataFrameMerge, outputAnalysisDir, confData: ConfBusiness):
- self.draw(dataFrameMerge, outputAnalysisDir, confData)
- def draw(self, dataFrameMerge: pd.DataFrame, outputAnalysisDir, confData: ConfBusiness):
- """
- 绘制并保存额定满发风速功率分布图,根据环境温度是否大于等于25℃。
- 参数:
- dataFrameMerge (pd.DataFrame): 包含数据的DataFrame,需要包含设备名、风速和功率列。
- outputAnalysisDir (str): 分析输出目录。
- confData (ConfBusiness): 配置
- """
- # 检查所需列是否存在
- required_columns = {confData.field_env_temp,
- confData.field_wind_speed, confData.field_power}
- if not required_columns.issubset(dataFrameMerge.columns):
- raise ValueError(f"DataFrame缺少必要的列。需要的列有: {required_columns}")
- y_name = 'power'
- upLimitOfPower = confData.rated_power*1.1
- lowLimitOfPower = confData.rated_power*0.9
- # 根据环境温度筛选数据
- over_temp = dataFrameMerge[(dataFrameMerge[confData.field_env_temp] >= 25) & (
- dataFrameMerge[confData.field_wind_speed] >= confData.rated_WindSpeed) & (dataFrameMerge[confData.field_power] >= lowLimitOfPower)].sort_values(by=Field_NameOfTurbine)
- below_temp = dataFrameMerge[(dataFrameMerge[confData.field_env_temp] < 25) & (
- dataFrameMerge[confData.field_wind_speed] >= confData.rated_WindSpeed) & (dataFrameMerge[confData.field_power] >= lowLimitOfPower)].sort_values(by=Field_NameOfTurbine)
- # 绘制环境温度大于等于25℃的功率分布图
- fig, ax = plt.subplots()
- sns.boxplot(y=confData.field_power, x=Field_NameOfTurbine, data=over_temp, fliersize=0, ax=ax,
- medianprops={'linestyle': '-', 'color': 'red'},
- boxprops={'color': 'dodgerblue', 'facecolor': 'dodgerblue'})
- ax.yaxis.set_major_locator(ticker.MultipleLocator(100))
- ax.set_ylim(lowLimitOfPower, upLimitOfPower)
- ax.set_ylabel(y_name)
- ax.set_title(
- 'rated wind speed and power distribute(10min)(ambient temperature>=25℃)')
- ax.grid(True)
- plt.xticks(rotation=45) # 旋转45度
- plt.savefig(os.path.join(outputAnalysisDir,
- "额定满发风速功率分布(10min)(环境温度大于25度).png"), bbox_inches='tight', dpi=120)
- plt.close()
- # 绘制环境温度小于25℃的功率分布图
- fig, ax = plt.subplots()
- sns.boxplot(y=confData.field_power, x=Field_NameOfTurbine, data=below_temp, fliersize=0, ax=ax,
- medianprops={'linestyle': '-', 'color': 'red'},
- boxprops={'color': 'dodgerblue', 'facecolor': 'dodgerblue'})
- ax.yaxis.set_major_locator(ticker.MultipleLocator(100))
- ax.set_ylim(lowLimitOfPower, upLimitOfPower)
- ax.set_ylabel(y_name)
- ax.set_title(
- 'rated wind speed and power distribute(10min)(ambient temperature<25℃)')
- ax.grid(True)
- plt.xticks(rotation=45) # 旋转45度
- plt.savefig(os.path.join(outputAnalysisDir,
- "额定满发风速功率分布(10min)(环境温度小于25度).png"), bbox_inches='tight', dpi=120)
- plt.close()
|