cabinVibrateAnalyst.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import os
  2. import pandas as pd
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. import plotly.graph_objects as go
  6. from plotly.subplots import make_subplots
  7. import plotly.express as px
  8. from behavior.analyst import Analyst
  9. from utils.directoryUtil import DirectoryUtil as dir
  10. from algorithmContract.confBusiness import *
  11. from algorithmContract.contract import Contract
  12. from windrose import WindroseAxes
  13. import matplotlib as mpl
  14. class CabinVibrateAnalyst(Analyst):
  15. '''
  16. 风电机组机舱振动分析
  17. '''
  18. def typeAnalyst(self):
  19. return "cabin_vibrate"
  20. def turbinesAnalysis(self, dataFrameMerge, outputAnalysisDir, conf: Contract):
  21. self.CabinVibrateAnalysis(dataFrameMerge, outputAnalysisDir, conf)
  22. def CabinVibrateAnalysis(self, dataFrameMerge: pd.DataFrame, outputAnalysisDir, conf: Contract):
  23. # 检查所需列是否存在
  24. required_columns = {Field_WindDirection, Field_WindSpeed, Field_NacLrVib, Field_NacFbVib}
  25. # Cabin_Vibrate_X为左右振动 Cabin_Vibrate_Y为前后振动
  26. if not required_columns.issubset(dataFrameMerge.columns):
  27. raise ValueError(f"DataFrame缺少必要的列。需要的列有: {required_columns}")
  28. dataFrameMerge = dataFrameMerge.dropna(axis=0, how='any')
  29. # 按设备名分组数据
  30. grouped = dataFrameMerge.groupby(Field_NameOfTurbine)
  31. for name, group in grouped:
  32. # 风向- 左右振动 - 风速
  33. fig = plt.figure(figsize=(6,6))
  34. pointsize = 6 # 散点的大小
  35. ax = WindroseAxes.from_ax()
  36. ax.set_theta_zero_location("N")
  37. ax.set_theta_direction('clockwise')
  38. ax.set_xticks([(i/8)*np.pi for i in range(16)])
  39. ax.set_xticklabels(['N', 'NNE', 'NE', 'ENE', 'E','ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW'])
  40. #ax.set_rlim(0, 0.6, 0.1, auto=False)
  41. # 设定极轴的范围,即设定图片显示振动大小的范围
  42. ax.set_rlabel_position(34)
  43. # 将显示极轴刻度的位置设在34°方向上,即位于NNE与NE的中间
  44. plt.scatter(np.radians(group[Field_WindDirection]), group[Field_NacFbVib],
  45. c=group[Field_WindSpeed], cmap='viridis_r', alpha=1, s=pointsize)
  46. plt.title('WindDirecton-Cabin_VibrationX-Windspeed')
  47. locator = mpl.ticker.MultipleLocator(1)
  48. # 设置颜色条上的风速间隔为1
  49. cb = plt.colorbar(ticks=locator, pad=0.05, shrink=0.65)
  50. # 颜色条与图像保持一定距离,防止重叠现象
  51. cb.ax.tick_params()
  52. cb.ax.set_title('Wind Speedd(m/s)')
  53. # 保存图像
  54. plt.savefig(os.path.join(outputAnalysisDir, "{}Cabin_Vibrate_X.png".format(name)), bbox_inches='tight', dpi=120)
  55. # 风向- 前后振动 - 风速
  56. fig = plt.figure(figsize=(6,6))
  57. pointsize = 6 # 散点的大小
  58. ax = WindroseAxes.from_ax()
  59. ax.set_theta_zero_location("N")
  60. ax.set_theta_direction('clockwise')
  61. ax.set_xticks([(i/8)*np.pi for i in range(16)])
  62. ax.set_xticklabels(['N', 'NNE', 'NE', 'ENE', 'E','ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW'])
  63. #ax.set_rlim(0, 0.6, 0.1, auto=False)
  64. # 设定极轴的范围,即设定图片显示振动大小的范围
  65. ax.set_rlabel_position(34)
  66. # 将显示极轴刻度的位置设在34°方向上,即位于NNE与NE的中间
  67. plt.scatter(np.radians(group[Field_WindDirection]), group[Field_NacFbVib],
  68. c=group[Field_WindSpeed], cmap='viridis_r', alpha=1, s=pointsize)
  69. plt.title('WindDirecton-Cabin_VibrationX-Windspeed')
  70. locator = mpl.ticker.MultipleLocator(1)
  71. # 设置颜色条上的风速间隔为1
  72. cb = plt.colorbar(ticks=locator, pad=0.05, shrink=0.65)
  73. # 颜色条与图像保持一定距离,防止重叠现象
  74. cb.ax.tick_params()
  75. cb.ax.set_title('Wind Speedd(m/s)')
  76. # 保存图像
  77. plt.savefig(os.path.join(outputAnalysisDir, "{}Cabin_Vibrate_Y.png".format(name)), bbox_inches='tight', dpi=120)