90 lines
3.9 KiB
Python
90 lines
3.9 KiB
Python
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()
|
|
|