《Python数据分析与挖掘实战》学习笔记——电力漏窃电用户自动识别
目标
通过电力计量自动化系统采集到的各相电流、电压、功率因数等用电负荷数据及用电异常等终端报警信息,和在线稽查系统和现场稽查的记录的漏窃电用户信息
- 提取漏窃电用户的关键特征,构建识别模型。
- 利用实时监测数据,调用模型判断用户是否存在漏窃电行为。
分析
1. 数据抽取
- 营销系统数据
用户基本信息、违约窃电记录、计量方法 - 计量自动化系统采集的数据
- 实时负荷:时间点、计量点、总有功功率、A/B/C相用功功率、A/B/C相电流、A/B/C相电压、A/B/C相功率因数
- 终端报警
需要包含不同用电类别的所有漏窃电用户和部分正常用户。样本数据需要包含关键时间节点前后一定范围的数据,并计算用户当天的用电量。
2.探索分析
- 分布分析
统计各个用电类别的漏窃电用户分布情况,结论:非居民不存在漏窃电。 - 周期性分析
结论:正常用户周期内用量平稳,非正常用户用电量明显持续下降。
3.预处理
- 数据清洗——》过滤非居民和节假日用电数据。
- 缺失值处理——》拉格朗日差值对用电量插补
插值前:import pandas as pd from scipy.interpolate import lagrange inputfile = r"F:/jpt_f/python_data_analysis_all/chapter6/data/missing_data.xls" outputfile = r'tmp/missing_data_processed.xls' data = pd.read_excel(inputfile, header=None) def ployinterp_column(s, n, k=5): y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] y = y[y.notnull()] return lagrange(y.index, list(y))(n) for i in data.columns: for j in range(len(data)): if (data[i].isnull())[j]: data[i][j] = ployinterp_column(data[i], j) data.to_excel(outputfile, header=None, index=False)
插值后:- 数据变换
定义新的指标
(1)电量趋势下降指标 (2)线损指标 (3)告警类指标
这里作者通过对原始数据的公式计算,构建了新的指标,新指标均为整数,不明白怎样应该构建指标(根据经验?)及验证构建出的指标的有效性
- 数据变换
4.构建专家样本
根据新定义的指标对原始数据处理,得到专家样本数据291个
电量趋势下降指标、线损指标、告警类指标、是否窃漏电
4.模型构建
数据划分:20%测试样本,80%训练样本
from random import shuffle
datafile = r"F:/jpt_f/python_data_analysis_all/chapter6/data/model.xls"
data = pd.read_excel(datafile)
data = data.as_matrix()
shuffle(data)
p = 0.8
train = data[:int(len(data)*p), :]
test = data[int(len(data)*p):, :]
- LM神经网络
在window下配置keras库出现各种bug,待尝试在centos下部署python开发环境 - CART决策树
from sklearn.tree import DecisionTreeClassifier
from random import shuffle
def cm_plot(y, yp):
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y, yp)
import matplotlib.pyplot as plt
plt.matshow(cm, cmap=plt.cm.Greens)
plt.colorbar()
for x in range(len(cm)):
for y in range(len(cm)):
plt.annotate(cm[x,y], xy=(x, y), horizontalalignment='center', verticalalignment='center')
plt.ylabel('True label')
plt.xlabel('Predicted label')
return plt
datafile = r"F:/jpt_f/python_data_analysis_all/chapter6/data/model.xls"
data = pd.read_excel(datafile)
data = data.as_matrix()
shuffle(data)
p = 0.8
train = data[:int(len(data)*p), :]
test = data[int(len(data)*p):, :]
tree = DecisionTreeClassifier()
tree.fit(train[:, :3], train[:, 3])
joblib.dump(tree, 'my_tmp/tree.pkl')
cm_plot(train[:, 3], tree.predict(train[:,:3])).show()
这里,多次测试得到的结果会有变化。
3. 模型评价