power_derating_biaozhun.py 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import os
  2. import matplotlib
  3. import numpy as np
  4. from matplotlib import pyplot as plt
  5. from utils.draw.draw_file import scatter
  6. matplotlib.use('Agg')
  7. matplotlib.rcParams['font.family'] = 'SimHei' # 或者 'Microsoft YaHei'
  8. matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 或者 ['Microsoft YaHei']
  9. from utils.file.trans_methods import read_file_to_df
  10. from utils.file.trans_methods import read_excel_files
  11. import pandas as pd
  12. class ContractPowerCurve(object):
  13. def __init__(self, df: pd.DataFrame, wind_velocity='风速', active_power='功率'):
  14. self.df = df
  15. self.wind_velocity = wind_velocity
  16. self.active_power = active_power
  17. def marker_active_power(contract_power_curve_class: ContractPowerCurve, df: pd.DataFrame, active_power='有功功率 kW均值',
  18. wind_velocity='风速 m/s均值'):
  19. """
  20. 标记有功功率为正的记录
  21. :param contract_power_curve_class: 合同功率曲线
  22. :param df: 原始数据
  23. :return: 标记有功功率为正的原始数据
  24. """
  25. contract_power_curve_df = contract_power_curve_class.df
  26. curve_wv = contract_power_curve_df[contract_power_curve_class.wind_velocity].values
  27. curve_ap = contract_power_curve_df[contract_power_curve_class.active_power].values
  28. df.dropna(subset=[active_power, wind_velocity], inplace=True)
  29. ap_gt_0_df = df[df[active_power] > 0]
  30. ap_le_0_df = df[df[active_power] <= 0]
  31. ap_le_0_df["marker"] = -1
  32. active_power_values = ap_gt_0_df[active_power].values
  33. wind_speed_values = ap_gt_0_df[wind_velocity].values
  34. ap_gt_0_in = [0] * ap_gt_0_df.shape[0]
  35. for i in range(len(ap_gt_0_in)):
  36. wind_speed = wind_speed_values[i]
  37. active_power = active_power_values[i]
  38. # if active_power >= 2200 - 200:
  39. # ap_gt_0_in[i] = 1
  40. # else:
  41. diffs = np.abs(curve_wv - wind_speed)
  42. # 找到差值最小的索引和对应的差值
  43. minDiff, idx = np.min(diffs), np.argmin(diffs)
  44. # 使用找到的索引获取对应的值
  45. closestValue = curve_ap[idx]
  46. if active_power - closestValue >= -100:
  47. ap_gt_0_in[i] = 1
  48. ap_gt_0_df['marker'] = ap_gt_0_in
  49. return pd.concat([ap_gt_0_df, ap_le_0_df])
  50. if __name__ == '__main__':
  51. wind_power_df = read_file_to_df(r"D:\中能智能\matlib计算相关\标记derating\PV_Curve.csv")
  52. all_files = read_excel_files(r"Z:\collection_data\1进行中\诺木洪风电场-甘肃-华电\清理数据\min-666")
  53. save_path = r"D:\trans_data\诺木洪\清理数据\min-666-derating"
  54. wind_power_df_class = ContractPowerCurve(wind_power_df)
  55. for file in all_files:
  56. name = os.path.basename(file).split("@")[0]
  57. try:
  58. df = read_file_to_df(file)
  59. df = marker_active_power(wind_power_df_class, df)
  60. df = df[df['marker'] == 1]
  61. df.to_csv(os.path.join(save_path, name + '.csv'), index=False, encoding='utf-8')
  62. # 使用scatter函数绘制散点图
  63. if not df.empty:
  64. scatter(name, x_label='风速均值', y_label='有功功率均值', x_values=df['风速 m/s均值'].values,
  65. y_values=df['有功功率 kW均值'].values, color='green',
  66. save_file_path=os.path.join(save_path, name + '均值.png'))
  67. except Exception as e:
  68. print(os.path.basename(file), "出错", str(e))
  69. raise e