import numpy as np import pandas as pd from pathlib import Path import matplotlib.pyplot as plt def fft_anlyies(data, time_step=0.0002) -> pd.DataFrame: """ 生成FFT数据 """ frequencies = np.fft.fftfreq(data.shape[0], d=time_step) # 计算频率轴 result = pd.DataFrame([], index=frequencies) for col_name in data: """ 分列处理 """ fft_result = np.fft.fft(data[col_name]) fft_magnitude = np.abs(fft_result) # 获取幅度谱 result[col_name + '频谱'] = fft_magnitude return result def RecordingAnalysis(data_origin: pd.DataFrame): """ 光伏逆变器录波数据分析 """ graph_map = { '电网电压': ['A相电网电压', 'B相电网电压', 'C相电网电压'], '滤波电容电压': ['A相滤波电容电压', 'B相滤波电容电压', 'C相滤波电容电压'], '母线电压': ['上母线电压', '下母线电压'], '母线电流': ['上母线电流', '下母线电流'], '逆变电流': ['A相逆变电流', 'B相逆变电流', 'C相逆变电流'], '负载电流': ['A相负载电流', 'B相负载电流', 'C相负载电流'], '调制比': ['A相调制比', 'B相调制比', 'C相调制比'], '电压前馈': ['A相电压前馈', 'B相电压前馈', 'C相电压前馈'], '逆变电流参考值': ['A相逆变电流参考值', 'B相逆变电流参考值', 'C相逆变电流参考值'], '谐振控制输出': ['谐振控制输出'], '有源阻尼': ['有源阻尼'], '零序电压': ['零序电压'], '相角': ['相角'], '故障状态': ['状态标签', '故障录波标志位'], } data_origin.index = data_origin.index * time_step for key, value in graph_map.items(): ax = data_origin[value].plot(title=key) if key == '故障状态': threshold = 1e-5 diff = data_origin[value].iloc[:-1].reset_index(drop=True) - data_origin[value].iloc[1:].reset_index(drop=True) diff = diff.replace(0, pd.NA).dropna(how='all') for x, d in diff.T.items(): if threshold is None or d > threshold: Y = data_origin.loc[x, value] for y in Y: ax.annotate(f'{y:.2f}', (x, y), textcoords="jump points", xytext=(0,5), ha='center') if key == '电网电压' or key == '滤波电容电压': """ 三相运行数据 """ data_fft = fft_anlyies(data_origin[value], time_step=time_step) data_fft.plot(title=(key + ' FFT频谱图'), xlabel = '频率 (Hz)', ylabel = '幅度') ax_fft = data_fft.plot(title=(key + ' FFT频谱图'), xlabel = '频率 (Hz)', ylabel = '幅度', xlim=(-200, 200)) if __name__ == "__main__": # plt中文显示 plt.rcParams['font.sans-serif'] = ['SimHei'] # 坐标轴负数显示 plt.rcParams['axes.unicode_minus'] = False time_step = 1 / 5000 data = pd.read_excel(Path(r"D:\WorkSpace\UserTool\SelfTool\FrameParser\test\pv_inviter\19__24_12_06_15_19_03.xlsx")) # Index([ # 'A相电网电压', 'B相电网电压', 'C相电网电压', # 'A相滤波电容电压', 'B相滤波电容电压', 'C相滤波电容电压', # '上母线电压', '下母线电压', # '上母线电流', '下母线电流', # 'A相逆变电流', 'B相逆变电流', 'C相逆变电流', # 'A相负载电流', 'B相负载电流', 'C相负载电流', # 'A相调制比', 'B相调制比', 'C相调制比', # 'A相电压前馈', 'B相电压前馈', 'C相电压前馈', # 'A相逆变电流参考值', 'B相逆变电流参考值', 'C相逆变电流参考值', # '谐振控制输出', # '有源阻尼', # '零序电压', # '相角', # '状态标签', '故障录波标志位' # ], # dtype='object') RecordingAnalysis(data) if not hasattr(__builtins__,"__IPYTHON__"): plt.waitforbuttonpress()