generatorSpeedPowerAnalyst.py 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import os
  2. import pandas as pd
  3. from datetime import datetime
  4. import numpy as np
  5. import plotly.graph_objects as go
  6. from plotly.subplots import make_subplots
  7. import seaborn as sns
  8. import matplotlib.pyplot as plt
  9. import matplotlib.cm as cm
  10. from matplotlib.ticker import MultipleLocator
  11. from matplotlib.colors import Normalize
  12. from .analyst import Analyst
  13. from .utils.directoryUtil import DirectoryUtil as dir
  14. from confBusiness import Field_NameOfTurbine, ConfBusiness
  15. class GeneratorSpeedPowerAnalyst(Analyst):
  16. """
  17. 风电机组发电机转速-有功功率分析
  18. """
  19. def typeAnalyst(self):
  20. return "speed_power"
  21. def turbinesAnalysis(self, dataFrameMerge: pd.DataFrame, outputAnalysisDir, confData: ConfBusiness):
  22. self.create_and_save_plots(
  23. dataFrameMerge, outputAnalysisDir, confData, confData.field_gen_speed, confData.field_power)
  24. def create_and_save_plots(self, dataFrameMerge: pd.DataFrame, outputAnalysisDir, confData: ConfBusiness, field_Generator_Speed, field_Active_Power):
  25. x_name = 'generator_speed'
  26. y_name = 'power'
  27. grouped = dataFrameMerge.groupby(Field_NameOfTurbine)
  28. for name, group in grouped:
  29. # 创建图形和坐标轴
  30. fig, ax = plt.subplots()
  31. cmap = cm.get_cmap('rainbow')
  32. # 绘制散点图
  33. scatter = ax.scatter(x=group[confData.field_gen_speed]*confData.value_gen_speed_multiple if not self.common.isNone(confData.value_gen_speed_multiple) else group[confData.field_gen_speed],
  34. y=group[confData.field_power], c=group['monthIntTime'], cmap=cmap, s=5)
  35. # g = sns.lmplot(x=field_Generator_Speed, y=field_Active_Power, data=group,
  36. # fit_reg=False, scatter_kws={"s": 5, "color": "b"}, legend=False, height=6, aspect=1.2)
  37. # g = sns.lmplot(x=field_Generator_Speed, y=field_Active_Power, data=group,
  38. # fit_reg=False, scatter_kws={"s": 5}, legend=False, height=6, aspect=1.2)
  39. # for ax in g.axes.flat:
  40. # # ax.xaxis.set_major_locator(MultipleLocator(100))
  41. # ax.set_xlim(confData.value_gen_speed_min, confData.value_gen_speed_max)
  42. # ax.set_xlabel(x_name)
  43. # ax.set_ylabel(y_name)
  44. # 设置图形标题和坐标轴标签
  45. ax.set_title(f'turbine_name={name}')
  46. ax.set_xlim(confData.value_gen_speed_min,
  47. confData.value_gen_speed_max)
  48. # 设置x轴的刻度步长
  49. # 假设您想要每100个单位一个刻度
  50. if not self.common.isNone(confData.value_gen_speed_step):
  51. loc = MultipleLocator(confData.value_gen_speed_step) # 创建每100个单位一个刻度的定位器
  52. ax.xaxis.set_major_locator(loc) # 将定位器应用到x轴上
  53. ax.set_xlabel(x_name)
  54. ax.set_ylabel(y_name)
  55. # 显示图例,并调整位置
  56. ax.legend(loc='lower right')
  57. # 设置颜色条
  58. unique_months = len(group['年月'].unique())
  59. ticks = np.linspace(group['monthIntTime'].min(
  60. ), group['monthIntTime'].max(), min(unique_months, 6)) # 减少刻度数量
  61. ticklabels = [datetime.fromtimestamp(
  62. tick).strftime('%Y-%m') for tick in ticks]
  63. norm = Normalize(group['monthIntTime'].min(),
  64. group['monthIntTime'].max())
  65. sm = cm.ScalarMappable(norm=norm, cmap=cmap)
  66. # 添加颜色条
  67. cbar = fig.colorbar(sm, ax=ax)
  68. cbar.set_ticks(ticks)
  69. cbar.set_ticklabels(ticklabels)
  70. # 旋转x轴刻度标签
  71. plt.xticks(rotation=45)
  72. plt.tight_layout()
  73. plt.title(f'{Field_NameOfTurbine}={name}')
  74. # 保存图片到指定路径
  75. output_file = os.path.join(outputAnalysisDir, f"{name}.png")
  76. plt.savefig(output_file, bbox_inches='tight', dpi=120)
  77. plt.close()