commonBusiness.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import pandas as pd
  2. import numpy as np
  3. import chardet
  4. from algorithmContract.confBusiness import *
  5. class CommonBusiness:
  6. def getFloat32(self):
  7. return "float32"
  8. def isNone(self, value):
  9. return value is None
  10. def getUseColumns(self, confData: ConfBusiness):
  11. useColumns = []
  12. if not self.isNone(confData.field_turbine_time):
  13. useColumns.append(confData.field_turbine_time)
  14. if not self.isNone(confData.field_turbine_name):
  15. useColumns.append(confData.field_turbine_name)
  16. if not self.isNone(confData.field_wind_speed):
  17. useColumns.append(confData.field_wind_speed)
  18. if not self.isNone(confData.field_power):
  19. useColumns.append(confData.field_power)
  20. if not self.isNone(confData.field_pitch_angle1):
  21. useColumns.append(confData.field_pitch_angle1)
  22. if not self.isNone(confData.field_rotor_speed):
  23. useColumns.append(confData.field_rotor_speed)
  24. if not self.isNone(confData.field_gen_speed):
  25. useColumns.append(confData.field_gen_speed)
  26. if not self.isNone(confData.field_torque):
  27. useColumns.append(confData.field_torque)
  28. if not self.isNone(confData.field_wind_dir):
  29. useColumns.append(confData.field_wind_dir)
  30. if not self.isNone(confData.field_angle_included):
  31. useColumns.append(confData.field_angle_included)
  32. if not self.isNone(confData.field_nacelle_pos):
  33. useColumns.append(confData.field_nacelle_pos)
  34. if not self.isNone(confData.field_env_temp):
  35. useColumns.append(confData.field_env_temp)
  36. if not self.isNone(confData.field_nacelle_temp):
  37. useColumns.append(confData.field_nacelle_temp)
  38. if not self.isNone(confData.field_turbine_state):
  39. useColumns.append(confData.field_turbine_state)
  40. if not self.isNone(confData.field_Cabin_Vibrate_X):
  41. useColumns.append(confData.field_Cabin_Vibrate_X)
  42. if not self.isNone(confData.field_Cabin_Vibrate_Y):
  43. useColumns.append(confData.field_Cabin_Vibrate_Y)
  44. if not self.isNone(confData.field_activePowerSet):
  45. useColumns.append(confData.field_activePowerSet)
  46. if not self.isNone(confData.field_activePowerAvailable):
  47. useColumns.append(confData.field_activePowerAvailable)
  48. if not self.isNone(confData.field_temperature_large_components):
  49. temperature_cols = confData.field_temperature_large_components.split(
  50. ',')
  51. for temperatureColumn in temperature_cols:
  52. useColumns.append(temperatureColumn)
  53. return useColumns
  54. def recalculationOfGeneratorSpeedforShow(self, dataFrame: pd.DataFrame, confData: ConfBusiness):
  55. if not self.isNone(confData.value_gen_speed_multiple) and confData.field_gen_speed in dataFrame.columns:
  56. dataFrame[confData.field_gen_speed] = dataFrame[confData.field_gen_speed] * \
  57. confData.value_gen_speed_multiple
  58. dataFrame[Field_GeneratorTorque] = dataFrame[confData.field_gen_speed]
  59. def contractGuaranteePowerCurveData(self, csvPowerCurveFilePath, confData: ConfBusiness):
  60. with open(csvPowerCurveFilePath, 'rb') as f:
  61. result = chardet.detect(f.read())
  62. dataFrameGuaranteePowerCurve = pd.read_csv(csvPowerCurveFilePath, encoding= result['encoding'] )
  63. return dataFrameGuaranteePowerCurve
  64. def calculateTSR(self, dataFrame: pd.DataFrame, confData: ConfBusiness):
  65. """
  66. 使用叶轮/主轴转速、风速、叶轮直径,计算叶尖速比(TSR)
  67. """
  68. # Calculate tsr
  69. if not self.isNone(confData.rotor_diameter) \
  70. and not self.isNone(confData.field_wind_speed) and confData.field_wind_speed in dataFrame.columns \
  71. and not self.isNone(confData.field_rotor_speed) and confData.field_rotor_speed in dataFrame.columns:
  72. dataFrame[confData.field_rotor_speed] = pd.to_numeric(
  73. dataFrame[confData.field_rotor_speed], errors='coerce')
  74. dataFrame[confData.field_wind_speed] = pd.to_numeric(
  75. dataFrame[confData.field_wind_speed], errors='coerce')
  76. rotor_diameter = pd.to_numeric(
  77. confData.rotor_diameter, errors='coerce')
  78. dataFrame[Field_PowerFloor] = dataFrame[confData.field_power].apply(
  79. lambda x: int(x / 10) * 10 if pd.notnull(x) else np.nan # 保留NaN值
  80. )
  81. dataFrame[Field_TSR] = (dataFrame[confData.field_rotor_speed] * 0.104667 *
  82. (rotor_diameter / 2)) / dataFrame[confData.field_wind_speed]
  83. def calculateCp2(self,dataFrame: pd.DataFrame,airDensity,rotorDiameter,fieldWindSpeed,fieldActivePower):
  84. """
  85. 使用有功功率、风速、空气密度、叶轮直径,计算风能利用系数(Cp)
  86. """
  87. # Calculate cp
  88. if not self.isNone(airDensity) and not self.isNone(rotorDiameter) \
  89. and not self.isNone(fieldWindSpeed) and fieldWindSpeed in dataFrame.columns \
  90. and not self.isNone(fieldActivePower) and fieldActivePower in dataFrame.columns:
  91. dataFrame[fieldActivePower] = pd.to_numeric(
  92. dataFrame[fieldActivePower], errors='coerce')
  93. dataFrame[fieldWindSpeed] = pd.to_numeric(
  94. dataFrame[fieldWindSpeed], errors='coerce')
  95. rotor_diameter = pd.to_numeric(
  96. rotorDiameter, errors='coerce')
  97. air_density = pd.to_numeric(airDensity, errors='coerce')
  98. dataFrame[Field_PowerFloor] = dataFrame[fieldActivePower].apply(
  99. lambda x: int(x / 10) * 10 if pd.notnull(x) else np.nan # 保留NaN值
  100. )
  101. dataFrame[Field_Cp] = dataFrame[fieldActivePower] * 1000 / \
  102. (0.5 * np.pi * air_density *
  103. (rotor_diameter ** 2) / 4 * dataFrame[fieldWindSpeed] ** 3)
  104. def calculateCp(self, dataFrame: pd.DataFrame, confData: ConfBusiness):
  105. """
  106. 使用有功功率、风速、空气密度、叶轮直径,计算风能利用系数(Cp)
  107. """
  108. self.calculateCp2(dataFrame,confData.density_air,confData.rotor_diameter,confData.field_wind_speed,confData.field_power)
  109. # # Calculate cp
  110. # if not self.isNone(confData.density_air) and not self.isNone(confData.rotor_diameter) \
  111. # and not self.isNone(confData.field_wind_speed) and confData.field_wind_speed in dataFrame.columns \
  112. # and not self.isNone(confData.field_power) and confData.field_power in dataFrame.columns:
  113. # dataFrame[confData.field_power] = pd.to_numeric(
  114. # dataFrame[confData.field_power], errors='coerce')
  115. # dataFrame[confData.field_wind_speed] = pd.to_numeric(
  116. # dataFrame[confData.field_wind_speed], errors='coerce')
  117. # rotor_diameter = pd.to_numeric(
  118. # confData.rotor_diameter, errors='coerce')
  119. # air_density = pd.to_numeric(confData.density_air, errors='coerce')
  120. # dataFrame[Field_PowerFloor] = dataFrame[confData.field_power].apply(
  121. # lambda x: int(x / 10) * 10 if pd.notnull(x) else np.nan # 保留NaN值
  122. # )
  123. # dataFrame[Field_Cp] = dataFrame[confData.field_power] * 1000 / \
  124. # (0.5 * np.pi * air_density *
  125. # (rotor_diameter ** 2) / 4 * dataFrame[confData.field_wind_speed] ** 3)