minPitchAnalyst.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import os
  2. import pandas as pd
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. import matplotlib.cm as cm
  6. import math
  7. from .analyst import Analyst
  8. from .utils.directoryUtil import DirectoryUtil as dir
  9. from confBusiness import ConfBusiness
  10. class MinPitchAnalyst(Analyst):
  11. """
  12. 风电机组最小桨距角分析
  13. """
  14. def typeAnalyst(self):
  15. return "min_pitch"
  16. def turbineAnalysis(self,
  17. dataFrame,
  18. outputAnalysisDir,
  19. outputFilePath,
  20. confData: ConfBusiness,
  21. turbineName):
  22. self.min_pitch(dataFrame, outputFilePath,
  23. confData.field_turbine_time, confData.field_pitch_angle1, confData.field_power)
  24. def min_pitch(self, dataFrame, output_path, time_col, pitch_col, power_col):
  25. # Convert time column to datetime and extract date
  26. dataFrame['date_'] = pd.to_datetime(
  27. dataFrame[time_col], format='%Y-%m-%d %H:%M:%S').dt.date
  28. # Convert pitch to float and calculate pitch floor
  29. dataFrame['pitch'] = dataFrame[pitch_col].astype(float)
  30. dataFrame['pitch_floor'] = dataFrame[pitch_col].astype(int)
  31. # Group by date and pitch floor, then count occurrences
  32. grouped = dataFrame.groupby(['date_', 'pitch_floor']
  33. ).size().reset_index(name='count')
  34. # Sort by date and pitch floor
  35. grouped.sort_values(['date_', 'pitch_floor'], inplace=True)
  36. # Write to CSV
  37. grouped.to_csv(output_path, index=False)
  38. def turbinesAnalysis(self, dataFrameMerge, outputAnalysisDir, confData: ConfBusiness):
  39. self.create_and_save_plot(outputAnalysisDir, confData.farm_name)
  40. def create_and_save_plot(self, csvFileDirOfCp, farm_name, encoding='utf-8'):
  41. """
  42. Generates Cp distribution plots for turbines in a wind farm.
  43. Parameters:
  44. - csvFileDirOfCp: str, path to the directory containing input CSV files.
  45. - farm_name: str, name of the wind farm.
  46. - encoding: str, encoding of the input CSV files. Defaults to 'utf-8'.
  47. """
  48. field_Name_Turbine = "turbine_name"
  49. file_time = 'date_'
  50. pitch_name = 'pitch_floor'
  51. count_name = 'count'
  52. split_way = 'merged_min_pitch'
  53. split_way = '_min_pitch.csv'
  54. # 遍历输入路径下的所有文件
  55. for root, dir_names, file_names in dir.list_directory(csvFileDirOfCp):
  56. for file_name in file_names:
  57. if not file_name.endswith(".csv"):
  58. continue
  59. print(os.path.join(root, file_name))
  60. data = pd.read_csv(os.path.join(
  61. root, file_name), encoding=encoding)
  62. # 将日期列转换为日期类型
  63. data[file_time] = pd.to_datetime(
  64. data[file_time], format='%Y-%m-%d')
  65. # 计算count的对数
  66. data['log_of_count'] = data[count_name].apply(
  67. lambda x: math.log2(x))
  68. # 获取输出文件名(不含split_way之后的部分)
  69. turbine_name = file_name.split(split_way)[0]
  70. # 添加设备名作为新列
  71. data[field_Name_Turbine] = turbine_name
  72. # 创建图表
  73. fig, ax = plt.subplots(figsize=(12, 8), dpi=120)
  74. cmap = cm.get_cmap('Blues')
  75. norm = plt.Normalize(
  76. data['log_of_count'].min(), data['log_of_count'].max())
  77. # 绘制散点图
  78. ax.scatter(x=data[file_time], y=data[pitch_name],
  79. c=data['log_of_count'], cmap=cmap, s=5)
  80. # 设置图表属性
  81. ax.set_xlabel('time')
  82. ax.set_ylabel('pitch angle')
  83. ax.set_ylim(-2, 60)
  84. ax.margins(x=0)
  85. # 创建颜色条
  86. sm = cm.ScalarMappable(norm=norm, cmap=cmap)
  87. cbar = fig.colorbar(sm, ax=ax)
  88. cbar.set_label('log2(count)')
  89. # 设置图表标题
  90. ax.set_title('turbine_name={}'.format(turbine_name))
  91. # 保存图表
  92. plot_path = os.path.join(
  93. csvFileDirOfCp, "{}.png".format(turbine_name))
  94. plt.savefig(plot_path, bbox_inches='tight', dpi=120)
  95. # 关闭图表,释放资源
  96. plt.close(fig)