123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- import pandas as pd
- import numpy as np
- from algorithmContract.confBusiness import *
- from algorithmContract.contract import Contract
- class CommonBusiness:
- def getFloat32(self):
- return "float32"
- def isNone(self, value):
- result: bool = False
- try:
- result = value is None
- except:
- result = False
- return result
- def calculateTSR(self, dataFrame: pd.DataFrame, vaneLong: float):
- """
- 使用叶轮/主轴转速、风速、叶轮直径,计算叶尖速比(TSR)
- """
- # Calculate tsr
- if Field_WindSpeed in dataFrame.columns \
- and Field_RotorSpeed in dataFrame.columns:
- dataFrame[Field_RotorSpeed] = pd.to_numeric(
- dataFrame[Field_RotorSpeed], errors='coerce')
- dataFrame[Field_WindSpeed] = pd.to_numeric(
- dataFrame[Field_WindSpeed], errors='coerce')
- dataFrame[Field_TSR] = (dataFrame[Field_RotorSpeed] * 0.104667 *
- (vaneLong/2)) / dataFrame[Field_WindSpeed]
- def calculateCp2(self, dataFrame: pd.DataFrame, airDensity, rotorDiameter, fieldWindSpeed, fieldActivePower):
- """
- 使用有功功率、风速、空气密度、叶轮直径,计算风能利用系数(Cp)
- """
- # Calculate cp
- if not self.isNone(airDensity) and not self.isNone(rotorDiameter) \
- and not self.isNone(fieldWindSpeed) and fieldWindSpeed in dataFrame.columns \
- and not self.isNone(fieldActivePower) and fieldActivePower in dataFrame.columns:
- dataFrame[fieldActivePower] = pd.to_numeric(
- dataFrame[fieldActivePower], errors='coerce')
- dataFrame[fieldWindSpeed] = pd.to_numeric(
- dataFrame[fieldWindSpeed], errors='coerce')
- dataFrame[Field_PowerFloor] = dataFrame[Field_ActiverPower].apply(
- lambda x: int(x / 10) *
- 10 if pd.notnull(x) else np.nan # 保留NaN值
- )
- rotor_diameter = pd.to_numeric(
- rotorDiameter, errors='coerce')
- air_density = pd.to_numeric(airDensity, errors='coerce')
- dataFrame[Field_Cp] = dataFrame[fieldActivePower] * 1000 / \
- (0.5 * np.pi * air_density *
- (rotor_diameter ** 2) / 4 * dataFrame[fieldWindSpeed] ** 3)
- return dataFrame
- def calculateCp(self, dataFrame: pd.DataFrame, powerFarmInfo: pd.DataFrame, turbineModelInfo: pd.DataFrame):
- """
- 使用有功功率、风速、空气密度、叶轮直径,计算风能利用系数(Cp)
- """
- self.calculateCp2(dataFrame, powerFarmInfo[Field_AirDensity].iloc[0],
- turbineModelInfo[Field_RotorDiameter].iloc[0], Field_WindSpeed, Field_ActiverPower)
- def getPowerFarm(self, powerFarmCode: str, powerFarmInfo: pd.DataFrame) -> pd.Series:
- """
- 根据场站代码获取对应场站信息
- """
- selectRow = powerFarmInfo[powerFarmInfo[Field_PowerFarmCode]
- == powerFarmCode].iloc[0]
- if selectRow.empty:
- raise CustomError(104, powerFarmCode)
- return selectRow
- def getTurbineInfo(self, powerFarmCode: str, turbineCode: str, turbineInfos: pd.DataFrame) -> pd.Series:
- """
- 获取对应机组信息
- """
- currTurbineInfo = turbineInfos[(turbineInfos[Field_PowerFarmCode] == powerFarmCode) & (
- turbineInfos[Field_CodeOfTurbine] == turbineCode)]
- if currTurbineInfo.empty:
- raise CustomError(115, turbineCode)
- return currTurbineInfo.iloc[0]
-
- def getTurbineInfos(self, powerFarmCode: str, turbineCodes: list, turbineInfos: pd.DataFrame) -> pd.DataFrame:
- """
- 获取对应机组信息
- """
- currTurbineInfo = turbineInfos[(turbineInfos[Field_PowerFarmCode] == powerFarmCode) & (
- turbineInfos[Field_CodeOfTurbine].isin(turbineCodes) )]
- if currTurbineInfo.empty:
- raise CustomError(115, turbineCodes)
- return currTurbineInfo
- def getTurbineModelByTurbine(self, turbineInfo: pd.Series, turbineModelInfos: pd.DataFrame) -> pd.Series:
- """
- 根据机组获取对应机型信息
- """
- turbineModelCode = turbineInfo[Field_MillTypeCode]
- if self.isNone(turbineModelCode):
- raise CustomError(114, turbineInfo[Field_CodeOfTurbine])
- selectRow = turbineModelInfos[turbineModelInfos[Field_MillTypeCode]
- == turbineModelCode].iloc[0]
- if selectRow.empty:
- raise CustomError(114, turbineInfo[Field_CodeOfTurbine])
- return selectRow
-
- def getTurbineModelByCode(self, turbineModelCode: str, turbineModelInfos: pd.DataFrame) -> pd.Series:
- """
- 根据机组获取对应机型信息
- """
- selectRow = turbineModelInfos[turbineModelInfos[Field_MillTypeCode]
- == turbineModelCode].iloc[0]
- if selectRow.empty:
- raise CustomError(116, turbineModelCode)
- return selectRow
- def calculateCpOfSingleTurbine(self, dataFrame: pd.DataFrame, airDensity: float, rotorDiameter: float):
- """
- 基于风电机组SCADA数据计算风能利用系数Cp
- """
- if dataFrame.empty:
- return
- if self.isNone(airDensity):
- raise CustomError(110)
- if self.isNone(rotorDiameter):
- raise CustomError(111)
- dataFrame[Field_Cp] = dataFrame[Field_ActiverPower] * 1000 / \
- (0.5 * np.pi * airDensity *
- (rotorDiameter ** 2) / 4 * dataFrame[Field_WindSpeed] ** 3)
- return dataFrame
|