powerOscillationAnalyst.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import os
  2. import pandas as pd
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. import seaborn as sns
  6. from behavior.analyst import Analyst
  7. from utils.directoryUtil import DirectoryUtil as dir
  8. from algorithmContract.confBusiness import *
  9. class PowerOscillationAnalyst(Analyst):
  10. """
  11. 风电机组功率震荡分析
  12. """
  13. def typeAnalyst(self):
  14. return "power_diff"
  15. def turbineAnalysis(self,
  16. dataFrame,
  17. outputAnalysisDir,
  18. outputFilePath,
  19. confData: ConfBusiness,
  20. turbineName):
  21. self.power_diff(dataFrame, outputFilePath,
  22. confData.field_power,confData.field_rotor_speed)
  23. def power_diff(self, dataFrame, outputFilePath, field_Active_Power, field_Rotor_Speed):
  24. # Floor the power column to the nearest 10
  25. dataFrame['power_col_floor'] = (
  26. dataFrame[field_Active_Power] // 10 * 10).astype('int32')
  27. # Group by the floored power column
  28. grouped = dataFrame.groupby('power_col_floor')
  29. # Calculate max, min, and diff of generator speed within each group
  30. agg_df = grouped[field_Rotor_Speed].agg(
  31. speed_max='max',
  32. speed_min='min'
  33. )
  34. agg_df['speed_diff'] = agg_df['speed_max'] - agg_df['speed_min']
  35. # Sort by the floored power column
  36. agg_df = agg_df.sort_index()
  37. # Write the result to a CSV file
  38. agg_df.to_csv(outputFilePath)
  39. def turbinesAnalysis(self,dataFrameMerge,outputAnalysisDir, confData: ConfBusiness):
  40. self.plot_power_oscillations(outputAnalysisDir,confData.farm_name)
  41. def plot_power_oscillations(self, csvFileDirOfCp, farm_name, encoding='utf-8'):
  42. """
  43. Plot TSR trend from CSV files in a given input path and save the plots to an output path.
  44. Parameters:
  45. - csvFileDirOfCp: str, path to the directory containing input CSV files.
  46. - farm_name: str, name of the wind farm.
  47. - encoding: str, encoding of the input CSV files. Defaults to 'utf-8'.
  48. """
  49. sns.set_palette('deep')
  50. field_Name_Turbine = "turbine_name"
  51. x_name = 'power_col_floor'
  52. y_name = 'speed_diff'
  53. # 初始化结果DataFrame
  54. res = pd.DataFrame()
  55. # 遍历输入路径下的所有文件
  56. for root, dir_names, file_names in dir.list_directory(csvFileDirOfCp):
  57. for file_name in file_names:
  58. if not file_name.endswith(CSVSuffix):
  59. continue
  60. file_path = os.path.join(root, file_name)
  61. frame = pd.read_csv(file_path, encoding=encoding)
  62. # 获取输出文件名前缀
  63. turbine_name = file_name.split(CSVSuffix)[0]
  64. # 添加设备名作为新列
  65. frame[field_Name_Turbine] = turbine_name
  66. selected_data = frame.loc[:, [field_Name_Turbine, x_name, y_name]]
  67. res = pd.concat([res, selected_data], axis=0)
  68. # 重置索引
  69. ress = res.reset_index(drop=True)
  70. # 绘制所有设备的功率震荡图
  71. fig, ax = plt.subplots(figsize=(16, 8))
  72. ax = sns.lineplot(x=x_name, y=y_name, data=ress, hue=field_Name_Turbine)
  73. ax.set_title('Power-Oscillation')
  74. plt.legend(ncol=4)
  75. plt.savefig(csvFileDirOfCp+ r'/{}-Power-Oscillation.png'.format(farm_name), bbox_inches='tight', dpi=300)
  76. plt.close()
  77. # 分组绘制每个设备的功率震荡图
  78. grouped = ress.groupby(field_Name_Turbine)
  79. for name, group in grouped:
  80. color = ["lightgrey"] * len(ress[field_Name_Turbine].unique())
  81. fig, ax = plt.subplots(figsize=(8, 8))
  82. ax = sns.lineplot(x=x_name, y=y_name, data=ress, hue=field_Name_Turbine, palette=sns.color_palette(color), legend=False)
  83. ax = sns.lineplot(x=x_name, y=y_name, data=group, color='darkblue', legend=False)
  84. ax.set_title('turbine_name={}'.format(name))
  85. plt.savefig(csvFileDirOfCp+ r'/{}.png'.format(name), bbox_inches='tight', dpi=120)
  86. plt.close()