ratedPowerWindSpeedAnalyst.py 4.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import os
  2. from datetime import datetime
  3. import pandas as pd
  4. import numpy as np
  5. import pandas as pd
  6. import matplotlib.pyplot as plt
  7. import matplotlib.cm as cm
  8. from matplotlib.ticker import MultipleLocator
  9. from matplotlib.colors import Normalize
  10. import matplotlib.ticker as ticker
  11. import seaborn as sns
  12. import plotly.graph_objects as go
  13. from plotly.subplots import make_subplots
  14. from geopy.distance import geodesic
  15. from behavior.analyst import Analyst
  16. from utils.directoryUtil import DirectoryUtil as dir
  17. from algorithmContract.confBusiness import *
  18. class RatedPowerWindSpeedAnalyst(Analyst):
  19. """
  20. 风电机组额定功率风速分析。
  21. 秒级scada数据运算太慢,建议使用分钟级scada数据
  22. """
  23. def typeAnalyst(self):
  24. return "rated_power_windspeed"
  25. def turbinesAnalysis(self, dataFrameMerge, outputAnalysisDir, confData: ConfBusiness):
  26. self.draw(dataFrameMerge, outputAnalysisDir, confData)
  27. def draw(self, dataFrameMerge: pd.DataFrame, outputAnalysisDir, confData: ConfBusiness):
  28. """
  29. 绘制并保存额定满发风速功率分布图,根据环境温度是否大于等于25℃。
  30. 参数:
  31. dataFrameMerge (pd.DataFrame): 包含数据的DataFrame,需要包含设备名、风速和功率列。
  32. outputAnalysisDir (str): 分析输出目录。
  33. confData (ConfBusiness): 配置
  34. """
  35. # 检查所需列是否存在
  36. required_columns = {confData.field_env_temp,
  37. confData.field_wind_speed, confData.field_power}
  38. if not required_columns.issubset(dataFrameMerge.columns):
  39. raise ValueError(f"DataFrame缺少必要的列。需要的列有: {required_columns}")
  40. y_name = 'power'
  41. upLimitOfPower = confData.rated_power*1.1
  42. lowLimitOfPower = confData.rated_power*0.9
  43. # 根据环境温度筛选数据
  44. over_temp = dataFrameMerge[(dataFrameMerge[confData.field_env_temp] >= 25) & (
  45. dataFrameMerge[confData.field_wind_speed] >= confData.rated_WindSpeed) & (dataFrameMerge[confData.field_power] >= lowLimitOfPower)].sort_values(by=Field_NameOfTurbine)
  46. below_temp = dataFrameMerge[(dataFrameMerge[confData.field_env_temp] < 25) & (
  47. dataFrameMerge[confData.field_wind_speed] >= confData.rated_WindSpeed) & (dataFrameMerge[confData.field_power] >= lowLimitOfPower)].sort_values(by=Field_NameOfTurbine)
  48. # 绘制环境温度大于等于25℃的功率分布图
  49. fig, ax = plt.subplots()
  50. sns.boxplot(y=confData.field_power, x=Field_NameOfTurbine, data=over_temp, fliersize=0, ax=ax,
  51. medianprops={'linestyle': '-', 'color': 'red'},
  52. boxprops={'color': 'dodgerblue', 'facecolor': 'dodgerblue'})
  53. ax.yaxis.set_major_locator(ticker.MultipleLocator(100))
  54. ax.set_ylim(lowLimitOfPower, upLimitOfPower)
  55. ax.set_ylabel(y_name)
  56. ax.set_title(
  57. 'rated wind speed and power distribute(10min)(ambient temperature>=25℃)')
  58. ax.grid(True)
  59. plt.xticks(rotation=45) # 旋转45度
  60. plt.savefig(os.path.join(outputAnalysisDir,
  61. "额定满发风速功率分布(10min)(环境温度大于25度).png"), bbox_inches='tight', dpi=120)
  62. plt.close()
  63. # 绘制环境温度小于25℃的功率分布图
  64. fig, ax = plt.subplots()
  65. sns.boxplot(y=confData.field_power, x=Field_NameOfTurbine, data=below_temp, fliersize=0, ax=ax,
  66. medianprops={'linestyle': '-', 'color': 'red'},
  67. boxprops={'color': 'dodgerblue', 'facecolor': 'dodgerblue'})
  68. ax.yaxis.set_major_locator(ticker.MultipleLocator(100))
  69. ax.set_ylim(lowLimitOfPower, upLimitOfPower)
  70. ax.set_ylabel(y_name)
  71. ax.set_title(
  72. 'rated wind speed and power distribute(10min)(ambient temperature<25℃)')
  73. ax.grid(True)
  74. plt.xticks(rotation=45) # 旋转45度
  75. plt.savefig(os.path.join(outputAnalysisDir,
  76. "额定满发风速功率分布(10min)(环境温度小于25度).png"), bbox_inches='tight', dpi=120)
  77. plt.close()