from os import * import matplotlib import numpy as np from utils.draw.draw_file import scatter matplotlib.use('Agg') matplotlib.rcParams['font.family'] = 'SimHei' # 或者 'Microsoft YaHei' matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 或者 ['Microsoft YaHei'] from utils.file.trans_methods import read_file_to_df from utils.file.trans_methods import read_excel_files import pandas as pd class ContractPowerCurve(object): def __init__(self, df: pd.DataFrame, wind_velocity='风速', active_power='功率'): self.df = df self.wind_velocity = wind_velocity self.active_power = active_power def marker_active_power(contract_power_curve_class: ContractPowerCurve, df: pd.DataFrame, active_power='有功功率 kW均值', wind_velocity='风速 m/s均值'): """ 标记有功功率为正的记录 :param contract_power_curve_class: 合同功率曲线 :param df: 原始数据 :return: 标记有功功率为正的原始数据 """ contract_power_curve_df = contract_power_curve_class.df curve_wv = contract_power_curve_df[contract_power_curve_class.wind_velocity].values curve_ap = contract_power_curve_df[contract_power_curve_class.active_power].values df.dropna(subset=[active_power, wind_velocity], inplace=True) ap_gt_0_df = df[df[active_power] > 0] ap_le_0_df = df[df[active_power] <= 0] ap_le_0_df["marker"] = -1 active_power_values = ap_gt_0_df[active_power].values wind_speed_values = ap_gt_0_df[wind_velocity].values ap_gt_0_in = [0] * ap_gt_0_df.shape[0] for i in range(len(ap_gt_0_in)): wind_speed = wind_speed_values[i] active_power = active_power_values[i] # if active_power >= 2200 - 200: # ap_gt_0_in[i] = 1 # else: diffs = np.abs(curve_wv - wind_speed) # 找到差值最小的索引和对应的差值 minDiff, idx = np.min(diffs), np.argmin(diffs) # 使用找到的索引获取对应的值 closestValue = curve_ap[idx] if active_power - closestValue >= -100: ap_gt_0_in[i] = 1 ap_gt_0_df['marker'] = ap_gt_0_in return pd.concat([ap_gt_0_df, ap_le_0_df]) if __name__ == '__main__': wind_power_df = read_file_to_df(r"D:\中能智能\matlib计算相关\标记derating\PV_Curve.csv") all_files = read_excel_files(r"Z:\collection_data\1进行中\诺木洪风电场-甘肃-华电\清理数据\min-666") save_path = r"D:\trans_data\诺木洪\清理数据\min-666-derating" wind_power_df_class = ContractPowerCurve(wind_power_df) for file in all_files: name = path.basename(file).split("@")[0] try: df = read_file_to_df(file) df = marker_active_power(wind_power_df_class, df) df = df[df['marker'] == 1] df.to_csv(path.join(save_path, name + '.csv'), index=False, encoding='utf-8') # 使用scatter函数绘制散点图 if not df.empty: scatter(name, x_label='风速均值', y_label='有功功率均值', x_values=df['风速 m/s均值'].values, y_values=df['有功功率 kW均值'].values, color='green', save_file_path=path.join(save_path, name + '均值.png')) except Exception as e: print(path.basename(file), "出错", str(e)) raise e