tsrCpPowerScatterAnalyst.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import os
  2. import pandas as pd
  3. import math
  4. import numpy as np
  5. from plotly.subplots import make_subplots
  6. import plotly.express as px
  7. import pandas as pd
  8. import plotly.graph_objects as go
  9. import seaborn as sns
  10. from matplotlib.ticker import MultipleLocator
  11. from behavior.analystWithGoodPoint import AnalystWithGoodPoint
  12. from utils.directoryUtil import DirectoryUtil as dir
  13. from algorithmContract.confBusiness import *
  14. from algorithmContract.contract import Contract
  15. class TSRCpPowerScatterAnalyst(AnalystWithGoodPoint):
  16. """
  17. 风电机组叶尖速比-Cp-功率散点分析
  18. """
  19. def typeAnalyst(self):
  20. return "tsr_cp_power_scatter"
  21. def turbinesAnalysis(self, outputAnalysisDir, conf: Contract, turbineCodes):
  22. dictionary = self.processTurbineData(turbineCodes,conf,[Field_DeviceCode,Field_Time,Field_WindSpeed,Field_ActiverPower,Field_RotorSpeed,Field_GeneratorSpeed])
  23. dataFrameMerge = self.userDataFrame(dictionary,conf.dataContract.configAnalysis,self)
  24. # return self.plot_tsr_distribution(self.tsr(dataFrameMerge), outputAnalysisDir, conf)
  25. dataFrameMerge[Field_PowerFarmName] = self.currPowerFarmInfo.loc[Field_PowerFarmName]
  26. # Ensure the necessary columns are of float type
  27. dataFrameMerge[Field_WindSpeed] = dataFrameMerge[Field_WindSpeed].astype(float)
  28. dataFrameMerge[Field_RotorSpeed] = dataFrameMerge[Field_RotorSpeed].astype(float)
  29. dataFrameMerge[Field_Cp] = dataFrameMerge[Field_Cp].astype(float)
  30. dataFrameMerge[Field_ActiverPower] = dataFrameMerge[Field_ActiverPower].astype(float)
  31. dataFrameMerge[Field_GeneratorSpeed] = dataFrameMerge[Field_GeneratorSpeed].astype(float)
  32. max_cutin = self.turbineModelInfo[Field_CutInWS].max()
  33. min_rated = self.turbineModelInfo[Field_RatedWindSpeed].min()
  34. dataFrameMerge = dataFrameMerge[(dataFrameMerge[Field_WindSpeed] > max_cutin) & (dataFrameMerge[Field_WindSpeed] < min_rated)]
  35. # Group by 'power_floor' and calculate median, max, and min of TSR
  36. dataFrameMerge[Field_TSRModified] = dataFrameMerge[Field_TSR] / (dataFrameMerge[Field_Cp] ** (1/3))
  37. return self.plot_tsrcp_distribution(dataFrameMerge, outputAnalysisDir, conf)
  38. def plot_tsrcp_distribution(self, dataFrameMerge: pd.DataFrame, outputAnalysisDir, conf: Contract, encoding=charset_unify):
  39. """
  40. Generates tsr distribution plots for turbines in a wind farm.
  41. Parameters:
  42. - outputAnalysisDir: str, path to the directory containing input CSV files.
  43. - farm_name: str, name of the wind farm.
  44. - encoding: str, encoding of the input CSV files. Defaults to 'utf-8'.
  45. """
  46. x_name = Field_ActiverPower
  47. y_name = Field_TSRModified
  48. upLimitOfTSR = 20
  49. result_rows = []
  50. # 绘制每个设备的TSR分布图
  51. for name, group in dataFrameMerge.groupby([Field_NameOfTurbine, Field_CodeOfTurbine]):
  52. fig = px.scatter(group,x=x_name, y=y_name)
  53. fig.update_layout(
  54. title={"text": '机组: {}'.format(name[0])},
  55. xaxis=dict(
  56. title='功率',
  57. dtick=200,
  58. tickangle=-45,
  59. range=[0, 1800]),
  60. yaxis=dict(
  61. title= '叶尖速比/风能利用系数分析^(1/3)', # r"$\frac{TSR}{Cp^{1/3}}$" # 仅在.png格式下正确显示
  62. dtick=self.axisStepTSR,
  63. range=[self.axisLowerLimitTSR,
  64. self.axisUpperLimitTSR]
  65. )
  66. )
  67. fig.update_traces(marker=dict(size=3))
  68. fig.update_xaxes(tickangle=-45)
  69. # 保存图像
  70. pngFileName = f"{name[0]}.png"
  71. pngFilePath = os.path.join(outputAnalysisDir, pngFileName)
  72. fig.write_image(pngFilePath, scale=3)
  73. # 保存HTML
  74. htmlFileName = f"{name[0]}.html"
  75. htmlFilePath = os.path.join(outputAnalysisDir, htmlFileName)
  76. fig.write_html(htmlFilePath)
  77. result_rows.append({
  78. Field_Return_TypeAnalyst: self.typeAnalyst(),
  79. Field_PowerFarmCode: conf.dataContract.dataFilter.powerFarmID,
  80. Field_Return_BatchCode: conf.dataContract.dataFilter.dataBatchNum,
  81. Field_CodeOfTurbine: name[1],
  82. Field_Return_FilePath: pngFilePath,
  83. Field_Return_IsSaveDatabase: False
  84. })
  85. result_rows.append({
  86. Field_Return_TypeAnalyst: self.typeAnalyst(),
  87. Field_PowerFarmCode: conf.dataContract.dataFilter.powerFarmID,
  88. Field_Return_BatchCode: conf.dataContract.dataFilter.dataBatchNum,
  89. Field_CodeOfTurbine: name[1],
  90. Field_Return_FilePath: htmlFilePath,
  91. Field_Return_IsSaveDatabase: True
  92. })
  93. result_df = pd.DataFrame(result_rows)
  94. return result_df