123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- import os
- import pandas as pd
- import numpy as np
- import matplotlib.pyplot as plt
- 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 *
- from algorithmContract.contract import Contract
- from windrose import WindroseAxes
- import matplotlib as mpl
- class CabinVibrateAnalyst(Analyst):
- '''
- 风电机组机舱振动分析
- '''
- def typeAnalyst(self):
- return "cabin_vibrate"
-
- def turbinesAnalysis(self, dataFrameMerge, outputAnalysisDir, conf: Contract):
- self.CabinVibrateAnalysis(dataFrameMerge, outputAnalysisDir, conf)
-
- def CabinVibrateAnalysis(self, dataFrameMerge: pd.DataFrame, outputAnalysisDir, conf: Contract):
- # 检查所需列是否存在
- required_columns = {Field_WindDirection, Field_WindSpeed, Field_NacLrVib, Field_NacFbVib}
- # Cabin_Vibrate_X为左右振动 Cabin_Vibrate_Y为前后振动
- if not required_columns.issubset(dataFrameMerge.columns):
- raise ValueError(f"DataFrame缺少必要的列。需要的列有: {required_columns}")
-
- dataFrameMerge = dataFrameMerge.dropna(axis=0, how='any')
-
- # 按设备名分组数据
- grouped = dataFrameMerge.groupby(Field_NameOfTurbine)
- for name, group in grouped:
- # 风向- 左右振动 - 风速
- fig = plt.figure(figsize=(6,6))
- pointsize = 6 # 散点的大小
- ax = WindroseAxes.from_ax()
- ax.set_theta_zero_location("N")
- ax.set_theta_direction('clockwise')
- ax.set_xticks([(i/8)*np.pi for i in range(16)])
- ax.set_xticklabels(['N', 'NNE', 'NE', 'ENE', 'E','ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW'])
- #ax.set_rlim(0, 0.6, 0.1, auto=False)
- # 设定极轴的范围,即设定图片显示振动大小的范围
- ax.set_rlabel_position(34)
- # 将显示极轴刻度的位置设在34°方向上,即位于NNE与NE的中间
- plt.scatter(np.radians(group[Field_WindDirection]), group[Field_NacFbVib],
- c=group[Field_WindSpeed], cmap='viridis_r', alpha=1, s=pointsize)
- plt.title('WindDirecton-Cabin_VibrationX-Windspeed')
- locator = mpl.ticker.MultipleLocator(1)
- # 设置颜色条上的风速间隔为1
- cb = plt.colorbar(ticks=locator, pad=0.05, shrink=0.65)
- # 颜色条与图像保持一定距离,防止重叠现象
- cb.ax.tick_params()
- cb.ax.set_title('Wind Speedd(m/s)')
- # 保存图像
- plt.savefig(os.path.join(outputAnalysisDir, "{}Cabin_Vibrate_X.png".format(name)), bbox_inches='tight', dpi=120)
-
- # 风向- 前后振动 - 风速
- fig = plt.figure(figsize=(6,6))
- pointsize = 6 # 散点的大小
- ax = WindroseAxes.from_ax()
- ax.set_theta_zero_location("N")
- ax.set_theta_direction('clockwise')
- ax.set_xticks([(i/8)*np.pi for i in range(16)])
- ax.set_xticklabels(['N', 'NNE', 'NE', 'ENE', 'E','ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW'])
- #ax.set_rlim(0, 0.6, 0.1, auto=False)
- # 设定极轴的范围,即设定图片显示振动大小的范围
- ax.set_rlabel_position(34)
- # 将显示极轴刻度的位置设在34°方向上,即位于NNE与NE的中间
- plt.scatter(np.radians(group[Field_WindDirection]), group[Field_NacFbVib],
- c=group[Field_WindSpeed], cmap='viridis_r', alpha=1, s=pointsize)
- plt.title('WindDirecton-Cabin_VibrationX-Windspeed')
- locator = mpl.ticker.MultipleLocator(1)
- # 设置颜色条上的风速间隔为1
- cb = plt.colorbar(ticks=locator, pad=0.05, shrink=0.65)
- # 颜色条与图像保持一定距离,防止重叠现象
- cb.ax.tick_params()
- cb.ax.set_title('Wind Speedd(m/s)')
- # 保存图像
- plt.savefig(os.path.join(outputAnalysisDir, "{}Cabin_Vibrate_Y.png".format(name)), bbox_inches='tight', dpi=120)
|