目录
一、数据抽取
二、数据探索
2.1 分布分析
对各个用电类别的窃漏电用户情况,作条形图。
2.2 周期性分析
对每天的用电情况,作折线图。
2.2.1 正常用电电量周期性分析
2.2.2 窃漏电用户电量周期性分析
三、数据预处理
3.1 数据清洗
3.2 缺失值处理
# -*- coding: utf-8 -*-
# 拉格朗日插值代码
import pandas as pd # 导入数据分析库Pandas
from scipy.interpolate import lagrange # 导入拉格朗日插值函数
inputfile = '.../data/missing_data.xls' # 输入数据路径,需要使用Excel格式;
outputfile = '.../tmp/missing_data_processed.xls' # 输出数据路径,需要使用Excel格式
data = pd.read_excel(inputfile, header=None) # 读入数据
# 自定义列向量插值函数
# s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
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) # 输出结果
3.3 数据变换
根据原来的数据,基于数据变换,构建出以下新的评价指标:
- 1)电量趋势下降指标
- 2)线损指标
- 3)告警指标
四、模型构建
4.1 数据划分
# -*- coding: utf-8 -*-
# 构建并测试CART决策树模型
import pandas as pd # 导入数据分析库
from random import shuffle # 导入随机函数shuffle,用来打乱数据
datafile = '.../data/model.xls' # 数据名
data = pd.read_excel(datafile) # 读取数据,数据的前三列是特征,第四列是标签
data = data.as_matrix() # 将表格转换为矩阵
shuffle(data) # 随机打乱数据
p = 0.8 # 设置训练数据比例
train = data[:int(len(data)*p),:] # 前80%为训练集
test = data[int(len(data)*p):,:] # 后20%为测试集
4.2 构建CART决策树模型
#构建CART决策树模型
from sklearn.tree import DecisionTreeClassifier # 导入决策树模型
treefile = 'C:/Users/Cong Ma/Desktop/exercise/case_6/temp/tree.pkl' # 模型输出名字
tree = DecisionTreeClassifier() # 建立决策树模型
tree.fit(train[:,:3], train[:,3]) # 训练
# 保存模型
from sklearn.externals import joblib
joblib.dump(tree, treefile)
4.3 模型评价
# 1 混淆矩阵
import seaborn as sns
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
# 1.1 得到混淆矩阵
C2=confusion_matrix(train[:,3], tree.predict(train[:,:3])) # 注意到Scikit-Learn使用predict方法直接给出预测结果。
print(C2) #打印出来看看
# 1.2 根据混淆矩阵画热力图
sns.set()
f,ax=plt.subplots()
sns.heatmap(C2, annot=True, fmt=".3g",ax=ax) # 画热力图,注意:默认fmt=".2g",此时图中的数据"144"会显示成"1.4e+02"
ax.set_title('confusion matrix') # 标题
ax.set_xlabel('predict') # x轴
ax.set_ylabel('true') # y轴
# 2 ROC曲线
from sklearn.metrics import roc_curve # 导入ROC曲线函数
from matplotlib import pyplot as plt
fpr, tpr, thresholds = roc_curve(test[:,3], tree.predict_proba(test[:,:3])[:,1], pos_label=1)
plt.plot(fpr, tpr, linewidth=2, label = 'ROC of CART', color = 'green') # 作出ROC曲线
plt.xlabel('False Positive Rate') # 坐标轴标签
plt.ylabel('True Positive Rate') # 坐标轴标签
plt.ylim(0,1.05) # 边界范围
plt.xlim(0,1.05) # 边界范围
plt.legend(loc=4) # 图例
plt.show() # 显示作图结果
五、模型应用
采集数据,并按进行数据变换,得到3.3中构建的指标,得到模型输入数据。利用构建好的模型对窃漏电用户进行诊断。