power_derating.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import multiprocessing
  2. import os
  3. import matplotlib
  4. matplotlib.use('Agg')
  5. matplotlib.rcParams['font.family'] = 'SimHei'
  6. matplotlib.rcParams['font.sans-serif'] = ['SimHei']
  7. import numpy as np
  8. from matplotlib import pyplot as plt
  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. def select_data(file, curve_wv, curve_ap, save_path):
  13. name = os.path.basename(file).split("@")[0]
  14. try:
  15. df = read_file_to_df(file)
  16. df.dropna(subset=['有功功率 kW均值', '风速 m/s均值', '有功功率设定 kW均值'], inplace=True)
  17. ap_gt_0_df = df[df['有功功率 kW均值'] > 0]
  18. ap_le_0_df = df[df['有功功率 kW均值'] <= 0]
  19. ap_le_0_df["marker"] = -1
  20. ap = ap_gt_0_df['有功功率 kW均值'].values
  21. wv = ap_gt_0_df['风速 m/s均值'].values
  22. ap_set = ap_gt_0_df['有功功率设定 kW均值'].values
  23. ap_gt_0_in = [0] * ap_gt_0_df.shape[0]
  24. for i in range(len(ap_set)):
  25. wind_speed = wv[i]
  26. active_power = ap[i]
  27. active_power_set = ap_set[i]
  28. if active_power >= 2200 - 200:
  29. ap_gt_0_in[i] = 1
  30. else:
  31. diffs = np.abs(curve_wv - wind_speed)
  32. # 找到差值最小的索引和对应的差值
  33. minDiff, idx = np.min(diffs), np.argmin(diffs)
  34. # 使用找到的索引获取对应的值
  35. closestValue = curve_ap[idx]
  36. if active_power - closestValue >= -100:
  37. ap_gt_0_in[i] = 1
  38. ap_gt_0_df['marker'] = ap_gt_0_in
  39. df = pd.concat([ap_gt_0_df, ap_le_0_df])
  40. df.to_csv(os.path.join(save_path, name + '.csv'), index=False, encoding='utf-8')
  41. df = df[['时间', '风速 m/s均值', '有功功率 kW均值', '有功功率设定 kW均值', 'marker']]
  42. df = df[df['marker'] == 1]
  43. x = df['风速 m/s均值'].values
  44. y = df['有功功率 kW均值'].values
  45. # 使用scatter函数绘制散点图
  46. if not df.empty:
  47. plt.scatter(x, y, s=10, c='blue')
  48. # 添加标题和坐标轴标签
  49. plt.title(name)
  50. plt.xlabel('风速均值')
  51. plt.ylabel('有功功率均值')
  52. # 保存
  53. plt.savefig(os.path.join(save_path, name + '均值.png'))
  54. except Exception as e:
  55. print(os.path.basename(file), "出错", str(e))
  56. raise e
  57. if __name__ == '__main__':
  58. wind_power_df = read_file_to_df(r"D:\中能智能\matlib计算相关\标记derating\PV_Curve.csv")
  59. curve_wv = wind_power_df["风速"].values
  60. curve_ap = wind_power_df["功率"].values
  61. all_files = read_excel_files(r"Z:\collection_data\1进行中\诺木洪风电场-甘肃-华电\清理数据\min-666")
  62. save_path = r"D:\trans_data\诺木洪\清理数据\min-666-derating"
  63. # save_path = r"Z:\collection_data\1进行中\诺木洪风电场-甘肃-华电\清理数据\min-666-marker"
  64. # for file in all_files:
  65. with multiprocessing.Pool(10) as pool:
  66. pool.starmap(select_data, [(i, curve_wv, curve_ap, save_path) for i in all_files])