import os import pandas as pd import numpy as np import matplotlib.pyplot as plt def process_scada_data(fpath, turbine_number, fn_start, fn_end, status_normal): """ 处理SCADA数据的函数。 参数: fpath (str): 文件存放位置的路径。 turbine_number (int): 风机数量(尽管此参数在此函数中未使用,但可以保留以匹配MATLAB代码)。 fn_start (int): 开始处理的文件编号。 fn_end (int): 结束处理的文件编号(不包含)。 status_normal (int): 风机正常并网状态的状态字(尽管此参数在此函数中未使用,但可以保留以匹配MATLAB代码)。 """ # 循环处理每个文件 for fn in range(fn_start, fn_end): fname = os.path.join(fpath, f"{fn}.csv") # 读取CSV文件 scada_10min = pd.read_csv(fname) # 提取所需列 time_stamp = scada_10min["时间"] active_power = scada_10min["变频器电网侧有功功率"] wind_speed = scada_10min["风速"] # 创建包含所需列的DataFrame LM = pd.DataFrame({ "时间戳": time_stamp, "有功功率": active_power, "风速": wind_speed }) # 调用数据标签处理函数(需要您根据MATLAB实现来编写此函数) xx = data_label(LM,fpath) # 合并标签数据到原始DataFrame merged_df = pd.concat([scada_10min, xx], axis=1) # 筛选出标签为1的行 D = merged_df[merged_df["lab"] == 1] # 绘制散点图 plt.scatter(D["风速"], D["变频器电网侧有功功率"], s=50, fillstyle='full') plt.title(f"风机 {fn} 散点图") plt.xlabel("风速") plt.ylabel("变频器电网侧有功功率") plt.show() # 创建保存结果的目录(如果不存在) labeled_dir = os.path.join(fpath, "labeled") os.makedirs(labeled_dir, exist_ok=True) # 将处理后的数据保存到CSV文件 labeled_fname = os.path.join(labeled_dir, f"{fn}_10s_n.csv") merged_df.to_csv(labeled_fname, index=False) # 假设data_label函数已经实现,这里只是一个示例的占位符 def data_label(df:pd.DataFrame,fpath): # 在这里实现您的数据标签处理逻辑 # 返回带有新标签的Series或DataFrame # 读取风机参数数据 fname2 = fpath + "info.csv" turbine_info = pd.read_csv(fname2, keep_default_na=False) PRated = turbine_info["额定功率"].values[0] VCutOut = turbine_info["切出风速"].values[0] VCutIn = turbine_info["切入风速"].values[0] VRated = turbine_info["额定风速"].values[0] # 读入有功功率和风速数据 Labeled_March809 = df APower = Labeled_March809["active_power"] WSpeed = Labeled_March809["wind_speed"] # 初始化计算用的变量 maxP = APower.max() intervalP = 25 # 功率分区间隔为25 intervalwindspeed = 0.25 # 风速分区间隔为0.25m/s # 根据最大功率和额定功率,计算功率和风速的区间数 PNum = (maxP // intervalP) + 1 if maxP >= PRated else (PRated // intervalP) TopP = ((maxP - PRated) // intervalP) + 1 if maxP >= PRated else 0 VNum = np.ceil(VCutOut / intervalwindspeed).astype(int) # 初始化标签列 Labeled_March809['label'] = 0 # 数据预处理:标记功率小于等于10的点 Labeled_March809.loc[APower <= 10, 'label'] = -1 # 下面是逻辑处理的示例,涉及到循环、条件判断和数据标记 # 示例:标记风速和功率在特定范围内的点 for i, row in Labeled_March809.iterrows(): if row['active_power'] > 10 and row['wind_speed'] > 0: # 这里可以根据需要添加更多的处理逻辑 pass # 以下是更高级的数据处理示例,这部分代码需要您根据实际逻辑继续开发 # 示例:根据风速和功率的分布对数据进行进一步的标记 # 请注意,这里需要你根据上面 MATLAB 代码的具体逻辑来实现相应的Python代码 return Labeled_March809 # 设置文件路径和其他参数 fpath = "E:\\BaiduNetdiskDownload\\test\\min_scada_LuoTuoGou\\72\\" # 注意:turbine_number 在此函数中未使用,但保持以匹配MATLAB代码 turbine_number = 24 status_normal = 8 # 调用函数处理文件,假设从编号82的文件开始,只处理这一个文件 process_scada_data(fpath, turbine_number, 82, 83, status_normal)