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)