【文末送书】《Python数据挖掘:入门、进阶与实用案例分析 》
Python数据挖掘可以从大量的数据中提取有价值的信息和模式,进而帮助我们做出更明智的决策。本案例根据已收集到的电力数据,深度挖掘各电力设备的电流、电压和功率等情况,分析各电力设备的实际用电量,进而为电力公司制定电能能源策略提供一定的参考依据。
案例背景
为了更好地监测用电设备的能耗情况,电力分项计量技术随之诞生。电力分项计量对于电力公司准确预测电力负荷、科学制定电网调度方案、提高电力系统稳定性和可靠性有着重要意义。对用户而言,电力分项计量可以帮助用户了解用电设备的使用情况,提高用户的节能意识,促进科学合理用电。
分析目标
本案例根据非侵入式负荷检测与分解的电力数据挖掘的背景和业务需求,需要实现的目标如下。
1.分析每个用电设备的运行属性。
2.构建设备判别属性库。
3.利用K最近邻模型,实现从整条线路中“分解”出每个用电设备的独立用电数据。
分析过程
数据准备
1.数据探索
在本案例的电力数据挖掘分析中,不会涉及操作记录数据。因此,此处主要获取设备数据、周波数据和谐波数据。在获取数据后,由于数据表较多,每个表的属性也较多,所以需要对数据进行数据探索分析。在数据探索过程中主要根据原始数据特点,对每个设备的不同属性对应的数据进行可视化,得到的部分结果如图1~图3所示。
图1 无功功率和总无功功率:
图2 电流轨迹:
图3 电压轨迹:
根据可视化结果可以看出,不同设备之间的电流、电压和功率属性各不相同。
对数据属性进行可视化如下所示:
import pandas as pd
import matplotlib.pyplot as plt
import os
filename = os.listdir('../data/附件1') # 得到文件夹下的所有文件名称
n_filename = len(filename)
# 给各设备的数据添加操作信息,画出各属性轨迹图并保存
def fun(a):
save_name = ['YD1', 'YD10', 'YD11', 'YD2', 'YD3', 'YD4',
'YD5', 'YD6', 'YD7', 'YD8', 'YD9']
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
for i in range(a):
Sb = pd.read_excel('../data/附件1/' + filename[i], '设备数据', index_col = None)
Xb = pd.read_excel('../data/附件1/' + filename[i], '谐波数据', index_col = None)
Zb = pd.read_excel('../data/附件1/' + filename[i], '周波数据', index_col = None)
# 电流轨迹图
plt.plot(Sb['IC'])
plt.title(save_name[i] + '-IC')
plt.ylabel('电流(0.001A)')
plt.show()
# 电压轨迹图
lt.plot(Sb['UC'])
plt.title(save_name[i] + '-UC')
plt.ylabel('电压(0.1V)')
plt.show()
# 有功功率和总有功功率
plt.plot(Sb[['PC', 'P']])
plt.title(save_name[i] + '-P')
plt.ylabel('有功功率(0.0001kW)')
plt.show()
# 无功功率和总无功功率
plt.plot(Sb[['QC', 'Q']])
plt.title(save_name[i] + '-Q')
plt.ylabel('无功功率(0.0001kVar)')
plt.show()
# 功率因数和总功率因数
plt.plot(Sb[['PFC', 'PF']])
plt.title(save_name[i] + '-PF')
plt.ylabel('功率因数(%)')
plt.show()
# 谐波电压
plt.plot(Xb.loc[:, 'UC02':].T)
plt.title(save_name[i] + '-谐波电压')
plt.show()
# 周波数据
plt.plot(Zb.loc[:, 'IC001':].T)
plt.title(save_name[i] + '-周波数据')
plt.show()
fun(n_filename)
2.缺失值处理
通过数据探索,发现数据中部分“time”属性存在缺失值,需要对这部分缺失值进行处理。由于每份数据中“time”属性的缺失时间段长不同,所以需要进行不同的处理。对于每个设备数据中具有较大缺失时间段的数据进行删除处理,对于具有较小缺失时间段的数据使用前一个值进行插补。
在进行缺失值处理之前,需要将训练数据中所有设备数据中的设备数据表、周波数据表、谐波数据表和操作记录表,以及测试数据中所有设备数据中的设备数据表、周波数据表和谐波数据表都提取出来,作为独立的数据文件,生成的部分文件如图所示:
提取数据文件如下所示:
# 将xlsx文件转化为CSV文件
import glob
import pandas as pd
import math
def file_transform(xls):
print('共发现%s个xlsx文件' % len(glob.glob(xls)))
print('正在处理............')
for file in glob.glob(xls): # 循环读取同文件夹下的xlsx文件
combine1 = pd.read_excel(file, index_col=0, sheet_name=None)
for key in combine1:
combine1[key].to_csv('../tmp/' + file[8: -5] + key + '.csv', encoding='utf-8')
print('处理完成')
xls_list = ['../data/附件1/*.xlsx', '../data/附件2/*.xlsx']
file_transform(xls_list[0]) # 处理训练数据
file_transform(xls_list[1]) # 处理测试数据
提取数据文件完成后&