cabinVibrateAnalyst.py 4.3 KB

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