123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- 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)
|