baseAnalyst.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. from abc import ABC, abstractmethod
  2. import pandas as pd
  3. from utils.directoryUtil import DirectoryUtil as dir
  4. from algorithmContract.confBusiness import *
  5. from common.commonBusiness import CommonBusiness
  6. class BaseAnalyst(ABC):
  7. def __init__(self, confData: ConfBusiness):
  8. self.common = CommonBusiness()
  9. self.confData = confData
  10. self.node_filter_value_state_turbine = "filter_value_state_turbine"
  11. self.node_angle_pitch_min = "angle_pitch_min"
  12. self.node_angle_pitch_max = "angle_pitch_max"
  13. self.node_speed_wind_cut_in = "speed_wind_cut_in"
  14. self.node_speed_wind_cut_out = "speed_wind_cut_out"
  15. self.node_active_power_min = "active_power_min"
  16. self.node_active_power_max = "active_power_max"
  17. self.node_speed_generator_min = "speed_generator_min"
  18. self.node_speed_generator_max = "speed_generator_max"
  19. self.node_activePowerAvailable = "activePowerAvailable"
  20. self.dataFrameContractOfTurbine = self.processContractData(confData)
  21. def processContractData(self, confData: ConfBusiness):
  22. dataFrameContractOfTurbine = self.common.contractGuaranteePowerCurveData(
  23. confData.turbineGuaranteedPowerCurveFilePathCSV, confData)
  24. self.common.calculateCp2(
  25. dataFrameContractOfTurbine, confData.density_air, confData.rotor_diameter, "风速", "有功功率")
  26. return dataFrameContractOfTurbine
  27. @abstractmethod
  28. def typeAnalyst(self):
  29. pass
  30. def getOutputAnalysisDir(self):
  31. """
  32. 获取当前分析的输出目录
  33. """
  34. outputAnalysisDir = r"{}/{}".format(
  35. self.confData.output_path, self.typeAnalyst())
  36. dir.create_directory(outputAnalysisDir)
  37. return outputAnalysisDir
  38. def filterCommon(self, dataFrame: pd.DataFrame, confData: ConfBusiness):
  39. if not self.common.isNone(confData.field_wind_speed) and self.node_speed_wind_cut_in in confData.filter \
  40. and not self.common.isNone(confData.filter[self.node_speed_wind_cut_in]) \
  41. and self.node_speed_wind_cut_out in confData.filter \
  42. and not self.common.isNone(confData.filter[self.node_speed_wind_cut_out]) \
  43. and not self.common.isNone(confData.field_power):
  44. windSpeedCutIn = float(
  45. confData.filter[self.node_speed_wind_cut_in])
  46. windSpeedCutOut = float(
  47. confData.filter[self.node_speed_wind_cut_out])
  48. dataFrame = dataFrame[~((dataFrame[confData.field_wind_speed] > windSpeedCutOut) | (
  49. dataFrame[confData.field_wind_speed] < windSpeedCutIn))]
  50. dataFrame = dataFrame[~((dataFrame[confData.field_wind_speed] > windSpeedCutIn) & (
  51. dataFrame[confData.field_power] < confData.rated_power*0.01))]
  52. if not self.common.isNone(confData.field_power) and confData.field_power in dataFrame.columns \
  53. and not self.common.isNone(confData.field_pitch_angle1) and confData.field_pitch_angle1 in dataFrame.columns \
  54. and self.node_angle_pitch_min in confData.filter and not self.common.isNone(confData.filter[self.node_angle_pitch_min]):
  55. anglePitchMin = float(confData.filter[self.node_angle_pitch_min])
  56. dataFrame = dataFrame[~((
  57. dataFrame[confData.field_power] <= confData.rated_power*0.9) & (dataFrame[confData.field_pitch_angle1] >anglePitchMin) )]
  58. # if not self.common.isNone(confData.rated_WindSpeed) and not self.common.isNone(confData.field_pitch_angle1) \
  59. # and self.node_angle_pitch_min in confData.filter and not self.common.isNone(confData.filter[self.node_angle_pitch_min]):
  60. # anglePitchMin = float(confData.filter[self.node_angle_pitch_min])
  61. # dataFrame = dataFrame[~((dataFrame[confData.field_wind_speed] < confData.rated_WindSpeed) & (
  62. # dataFrame[confData.field_pitch_angle1] > anglePitchMin))]
  63. # Filter rows where turbine state
  64. if not self.common.isNone(confData.field_gen_speed) and confData.field_gen_speed in dataFrame.columns:
  65. dataFrame = dataFrame[(dataFrame[confData.field_gen_speed] > 0)]
  66. # Filter rows where turbine state
  67. if not self.common.isNone(confData.field_turbine_state) and self.node_filter_value_state_turbine in confData.filter and not self.common.isNone(confData.filter[self.node_filter_value_state_turbine]):
  68. stateTurbine = confData.filter[self.node_filter_value_state_turbine]
  69. dataFrame = dataFrame[dataFrame[confData.field_turbine_state].isin(
  70. stateTurbine)]
  71. if not self.common.isNone(confData.rated_WindSpeed) and not self.common.isNone(confData.field_wind_speed) \
  72. and not self.common.isNone(confData.field_gen_speed) \
  73. and self.node_speed_generator_max in confData.filter \
  74. and not self.common.isNone(confData.filter[self.node_speed_generator_max]):
  75. speedGeneratorMax = float(
  76. confData.filter[self.node_speed_generator_max])
  77. dataFrame = dataFrame[~((dataFrame[confData.field_wind_speed] >= confData.rated_WindSpeed) & (
  78. dataFrame[confData.field_gen_speed] < speedGeneratorMax*0.9))]
  79. if not self.common.isNone(confData.field_gen_speed) \
  80. and self.node_speed_generator_max in confData.filter \
  81. and not self.common.isNone(confData.filter[self.node_speed_generator_min]) \
  82. and not self.common.isNone(confData.filter[self.node_speed_generator_max]):
  83. speedGeneratorMin = float(
  84. confData.filter[self.node_speed_generator_min])
  85. speedGeneratorMax = float(
  86. confData.filter[self.node_speed_generator_max])
  87. dataFrame = dataFrame[~((dataFrame[confData.field_gen_speed] < speedGeneratorMin) | (
  88. dataFrame[confData.field_gen_speed] > speedGeneratorMax))]
  89. if not self.common.isNone(confData.field_activePowerSet) and confData.field_activePowerSet in dataFrame.columns:
  90. dataFrame = dataFrame[dataFrame[confData.field_activePowerSet]
  91. == confData.rated_power]
  92. if not self.common.isNone(confData.field_activePowerAvailable) and confData.field_activePowerAvailable in dataFrame.columns \
  93. and self.node_activePowerAvailable in confData.filter and not self.common.isNone(confData.filter[self.node_activePowerAvailable]):
  94. state = confData.filter[self.node_activePowerAvailable]
  95. dataFrame = dataFrame[dataFrame[confData.field_activePowerAvailable].isin(
  96. state)]
  97. # # Filter rows where pitch
  98. # if not self.common.isNone(confData.field_pitch_angle1) and self.node_angle_pitch_min in confData.filter and not self.common.isNone(confData.filter[self.node_angle_pitch_min]):
  99. # anglePitchMin = float(confData.filter[self.node_angle_pitch_min])
  100. # dataFrame = dataFrame[(
  101. # dataFrame[confData.field_pitch_angle1] < anglePitchMin)]
  102. # if not self.common.isNone(confData.field_pitch_angle1) and self.node_angle_pitch_max in confData.filter and not self.common.isNone(confData.filter[self.node_angle_pitch_max]):
  103. # anglePitchMax = float(confData.filter[self.node_angle_pitch_max])
  104. # dataFrame = dataFrame[(
  105. # dataFrame[confData.field_pitch_angle1] <= anglePitchMax)]
  106. # # Filter rows where wind speed
  107. # if not self.common.isNone(confData.field_wind_speed) and self.node_speed_wind_cut_in in confData.filter and not self.common.isNone(confData.filter[self.node_speed_wind_cut_in]):
  108. # windSpeedCutIn = float(confData.filter[self.node_speed_wind_cut_in])
  109. # dataFrame = dataFrame[(
  110. # dataFrame[confData.field_wind_speed] >= windSpeedCutIn)]
  111. # if not self.common.isNone(confData.field_wind_speed) and self.node_speed_wind_cut_out in confData.filter and not self.common.isNone(confData.filter[self.node_speed_wind_cut_out]):
  112. # windSpeedCutOut = float(confData.filter[self.node_speed_wind_cut_out])
  113. # dataFrame = dataFrame[(
  114. # dataFrame[confData.field_wind_speed] < windSpeedCutOut)]
  115. # # Filter rows where power
  116. # if not self.common.isNone(confData.field_power) and self.node_active_power_min in confData.filter and not self.common.isNone(confData.filter[self.node_active_power_min]):
  117. # activePowerMin = float(confData.filter[self.node_active_power_min])
  118. # dataFrame = dataFrame[(
  119. # dataFrame[confData.field_power] >= activePowerMin)]
  120. # if not self.common.isNone(confData.field_power) and self.node_active_power_max in confData.filter and not self.common.isNone(confData.filter[self.node_active_power_max]):
  121. # activePowerMax = float(confData.filter[self.node_active_power_max])
  122. # dataFrame = dataFrame[(
  123. # dataFrame[confData.field_power] < activePowerMax)]
  124. return dataFrame
  125. def filterCustomForTurbine(self, dataFrame: pd.DataFrame, confData: ConfBusiness):
  126. return self.filterCommon(dataFrame, confData)
  127. def analysisOfTurbine(self,
  128. dataFrame: pd.DataFrame,
  129. outputAnalysisDir,
  130. outputFilePath,
  131. confData: ConfBusiness,
  132. turbineName):
  133. dataFrame = self.filterCustomForTurbine(dataFrame, confData)
  134. self.turbineAnalysis(dataFrame, outputAnalysisDir,
  135. outputFilePath, confData, turbineName)
  136. def turbineAnalysis(self,
  137. dataFrame: pd.DataFrame,
  138. outputAnalysisDir,
  139. outputFilePath,
  140. confData: ConfBusiness,
  141. turbineName):
  142. pass
  143. def filterCustomForTurbines(self, dataFrame: pd.DataFrame, confData: ConfBusiness):
  144. return self.filterCommon(dataFrame, confData)
  145. def analysisOfTurbines(self, dataFrameMerge: pd.DataFrame, outputAnalysisDir, confData: ConfBusiness):
  146. dataFrameMerge = self.filterCustomForTurbines(dataFrameMerge, confData)
  147. self.turbinesAnalysis(dataFrameMerge, outputAnalysisDir, confData)
  148. def turbinesAnalysis(self, dataFrameMerge: pd.DataFrame, outputAnalysisDir, confData: ConfBusiness):
  149. pass