testDataProcess.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import os
  2. import pandas as pd
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. def process_scada_data(fpath, turbine_number, fn_start, fn_end, status_normal):
  6. """
  7. 处理SCADA数据的函数。
  8. 参数:
  9. fpath (str): 文件存放位置的路径。
  10. turbine_number (int): 风机数量(尽管此参数在此函数中未使用,但可以保留以匹配MATLAB代码)。
  11. fn_start (int): 开始处理的文件编号。
  12. fn_end (int): 结束处理的文件编号(不包含)。
  13. status_normal (int): 风机正常并网状态的状态字(尽管此参数在此函数中未使用,但可以保留以匹配MATLAB代码)。
  14. """
  15. # 循环处理每个文件
  16. for fn in range(fn_start, fn_end):
  17. fname = os.path.join(fpath, f"{fn}.csv")
  18. # 读取CSV文件
  19. scada_10min = pd.read_csv(fname)
  20. # 提取所需列
  21. time_stamp = scada_10min["时间"]
  22. active_power = scada_10min["变频器电网侧有功功率"]
  23. wind_speed = scada_10min["风速"]
  24. # 创建包含所需列的DataFrame
  25. LM = pd.DataFrame({
  26. "时间戳": time_stamp,
  27. "有功功率": active_power,
  28. "风速": wind_speed
  29. })
  30. # 调用数据标签处理函数(需要您根据MATLAB实现来编写此函数)
  31. xx = data_label(LM,fpath)
  32. # 合并标签数据到原始DataFrame
  33. merged_df = pd.concat([scada_10min, xx], axis=1)
  34. # 筛选出标签为1的行
  35. D = merged_df[merged_df["lab"] == 1]
  36. # 绘制散点图
  37. plt.scatter(D["风速"], D["变频器电网侧有功功率"], s=50, fillstyle='full')
  38. plt.title(f"风机 {fn} 散点图")
  39. plt.xlabel("风速")
  40. plt.ylabel("变频器电网侧有功功率")
  41. plt.show()
  42. # 创建保存结果的目录(如果不存在)
  43. labeled_dir = os.path.join(fpath, "labeled")
  44. os.makedirs(labeled_dir, exist_ok=True)
  45. # 将处理后的数据保存到CSV文件
  46. labeled_fname = os.path.join(labeled_dir, f"{fn}_10s_n.csv")
  47. merged_df.to_csv(labeled_fname, index=False)
  48. # 假设data_label函数已经实现,这里只是一个示例的占位符
  49. def data_label(df:pd.DataFrame,fpath):
  50. # 在这里实现您的数据标签处理逻辑
  51. # 返回带有新标签的Series或DataFrame
  52. # 读取风机参数数据
  53. fname2 = fpath + "info.csv"
  54. turbine_info = pd.read_csv(fname2, keep_default_na=False)
  55. PRated = turbine_info["额定功率"].values[0]
  56. VCutOut = turbine_info["切出风速"].values[0]
  57. VCutIn = turbine_info["切入风速"].values[0]
  58. VRated = turbine_info["额定风速"].values[0]
  59. # 读入有功功率和风速数据
  60. Labeled_March809 = df
  61. APower = Labeled_March809["active_power"]
  62. WSpeed = Labeled_March809["wind_speed"]
  63. # 初始化计算用的变量
  64. maxP = APower.max()
  65. intervalP = 25 # 功率分区间隔为25
  66. intervalwindspeed = 0.25 # 风速分区间隔为0.25m/s
  67. # 根据最大功率和额定功率,计算功率和风速的区间数
  68. PNum = (maxP // intervalP) + 1 if maxP >= PRated else (PRated // intervalP)
  69. TopP = ((maxP - PRated) // intervalP) + 1 if maxP >= PRated else 0
  70. VNum = np.ceil(VCutOut / intervalwindspeed).astype(int)
  71. # 初始化标签列
  72. Labeled_March809['label'] = 0
  73. # 数据预处理:标记功率小于等于10的点
  74. Labeled_March809.loc[APower <= 10, 'label'] = -1
  75. # 下面是逻辑处理的示例,涉及到循环、条件判断和数据标记
  76. # 示例:标记风速和功率在特定范围内的点
  77. for i, row in Labeled_March809.iterrows():
  78. if row['active_power'] > 10 and row['wind_speed'] > 0:
  79. # 这里可以根据需要添加更多的处理逻辑
  80. pass
  81. # 以下是更高级的数据处理示例,这部分代码需要您根据实际逻辑继续开发
  82. # 示例:根据风速和功率的分布对数据进行进一步的标记
  83. # 请注意,这里需要你根据上面 MATLAB 代码的具体逻辑来实现相应的Python代码
  84. return Labeled_March809
  85. # 设置文件路径和其他参数
  86. fpath = "E:\\BaiduNetdiskDownload\\test\\min_scada_LuoTuoGou\\72\\"
  87. # 注意:turbine_number 在此函数中未使用,但保持以匹配MATLAB代码
  88. turbine_number = 24
  89. status_normal = 8
  90. # 调用函数处理文件,假设从编号82的文件开始,只处理这一个文件
  91. process_scada_data(fpath, turbine_number, 82, 83, status_normal)