commonBusiness.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import pandas as pd
  2. import numpy as np
  3. from algorithmContract.confBusiness import *
  4. from algorithmContract.contract import Contract
  5. class CommonBusiness:
  6. def getFloat32(self):
  7. return "float32"
  8. def isNone(self, value):
  9. result: bool = False
  10. try:
  11. result = value is None
  12. except:
  13. result = False
  14. return result
  15. def calculateTSR(self, dataFrame: pd.DataFrame, vaneLong: float):
  16. """
  17. 使用叶轮/主轴转速、风速、叶轮直径,计算叶尖速比(TSR)
  18. """
  19. # Calculate tsr
  20. if Field_WindSpeed in dataFrame.columns \
  21. and Field_RotorSpeed in dataFrame.columns:
  22. dataFrame[Field_RotorSpeed] = pd.to_numeric(
  23. dataFrame[Field_RotorSpeed], errors='coerce')
  24. dataFrame[Field_WindSpeed] = pd.to_numeric(
  25. dataFrame[Field_WindSpeed], errors='coerce')
  26. dataFrame[Field_TSR] = (dataFrame[Field_RotorSpeed] * 0.104667 *
  27. (vaneLong/2)) / dataFrame[Field_WindSpeed]
  28. def calculateCp2(self, dataFrame: pd.DataFrame, airDensity, rotorDiameter, fieldWindSpeed, fieldActivePower):
  29. """
  30. 使用有功功率、风速、空气密度、叶轮直径,计算风能利用系数(Cp)
  31. """
  32. # Calculate cp
  33. if not self.isNone(airDensity) and not self.isNone(rotorDiameter) \
  34. and not self.isNone(fieldWindSpeed) and fieldWindSpeed in dataFrame.columns \
  35. and not self.isNone(fieldActivePower) and fieldActivePower in dataFrame.columns:
  36. dataFrame[fieldActivePower] = pd.to_numeric(
  37. dataFrame[fieldActivePower], errors='coerce')
  38. dataFrame[fieldWindSpeed] = pd.to_numeric(
  39. dataFrame[fieldWindSpeed], errors='coerce')
  40. dataFrame[Field_PowerFloor] = dataFrame[Field_ActiverPower].apply(
  41. lambda x: int(x / 10) *
  42. 10 if pd.notnull(x) else np.nan # 保留NaN值
  43. )
  44. rotor_diameter = pd.to_numeric(
  45. rotorDiameter, errors='coerce')
  46. air_density = pd.to_numeric(airDensity, errors='coerce')
  47. dataFrame[Field_Cp] = dataFrame[fieldActivePower] * 1000 / \
  48. (0.5 * np.pi * air_density *
  49. (rotor_diameter ** 2) / 4 * dataFrame[fieldWindSpeed] ** 3)
  50. return dataFrame
  51. def calculateCp(self, dataFrame: pd.DataFrame, powerFarmInfo: pd.DataFrame, turbineModelInfo: pd.DataFrame):
  52. """
  53. 使用有功功率、风速、空气密度、叶轮直径,计算风能利用系数(Cp)
  54. """
  55. self.calculateCp2(dataFrame, powerFarmInfo[Field_AirDensity].iloc[0],
  56. turbineModelInfo[Field_RotorDiameter].iloc[0], Field_WindSpeed, Field_ActiverPower)
  57. def getPowerFarm(self, powerFarmCode: str, powerFarmInfo: pd.DataFrame) -> pd.Series:
  58. """
  59. 根据场站代码获取对应场站信息
  60. """
  61. selectRow = powerFarmInfo[powerFarmInfo[Field_PowerFarmCode]
  62. == powerFarmCode].iloc[0]
  63. if selectRow.empty:
  64. raise CustomError(104, powerFarmCode)
  65. return selectRow
  66. def getTurbineInfo(self, powerFarmCode: str, turbineCode: str, turbineInfos: pd.DataFrame) -> pd.Series:
  67. """
  68. 获取对应机组信息
  69. """
  70. currTurbineInfo = turbineInfos[(turbineInfos[Field_PowerFarmCode] == powerFarmCode) & (
  71. turbineInfos[Field_CodeOfTurbine] == turbineCode)]
  72. if currTurbineInfo.empty:
  73. raise CustomError(115, turbineCode)
  74. return currTurbineInfo.iloc[0]
  75. def getTurbineInfos(self, powerFarmCode: str, turbineCodes: list, turbineInfos: pd.DataFrame) -> pd.DataFrame:
  76. """
  77. 获取对应机组信息
  78. """
  79. currTurbineInfo = turbineInfos[(turbineInfos[Field_PowerFarmCode] == powerFarmCode) & (
  80. turbineInfos[Field_CodeOfTurbine].isin(turbineCodes) )]
  81. if currTurbineInfo.empty:
  82. raise CustomError(115, turbineCodes)
  83. return currTurbineInfo
  84. def getTurbineModelByTurbine(self, turbineInfo: pd.Series, turbineModelInfos: pd.DataFrame) -> pd.Series:
  85. """
  86. 根据机组获取对应机型信息
  87. """
  88. turbineModelCode = turbineInfo[Field_MillTypeCode]
  89. if self.isNone(turbineModelCode):
  90. raise CustomError(114, turbineInfo[Field_CodeOfTurbine])
  91. selectRow = turbineModelInfos[turbineModelInfos[Field_MillTypeCode]
  92. == turbineModelCode].iloc[0]
  93. if selectRow.empty:
  94. raise CustomError(114, turbineInfo[Field_CodeOfTurbine])
  95. return selectRow
  96. def getTurbineModelByCode(self, turbineModelCode: str, turbineModelInfos: pd.DataFrame) -> pd.Series:
  97. """
  98. 根据机组获取对应机型信息
  99. """
  100. selectRow = turbineModelInfos[turbineModelInfos[Field_MillTypeCode]
  101. == turbineModelCode].iloc[0]
  102. if selectRow.empty:
  103. raise CustomError(116, turbineModelCode)
  104. return selectRow
  105. def calculateCpOfSingleTurbine(self, dataFrame: pd.DataFrame, airDensity: float, rotorDiameter: float):
  106. """
  107. 基于风电机组SCADA数据计算风能利用系数Cp
  108. """
  109. if dataFrame.empty:
  110. return
  111. if self.isNone(airDensity):
  112. raise CustomError(110)
  113. if self.isNone(rotorDiameter):
  114. raise CustomError(111)
  115. dataFrame[Field_Cp] = dataFrame[Field_ActiverPower] * 1000 / \
  116. (0.5 * np.pi * airDensity *
  117. (rotorDiameter ** 2) / 4 * dataFrame[Field_WindSpeed] ** 3)
  118. return dataFrame