《Python数据分析与挖掘实战》学习笔记——电力漏窃电用户自动识别

目标

通过电力计量自动化系统采集到的各相电流、电压、功率因数等用电负荷数据及用电异常等终端报警信息,和在线稽查系统和现场稽查的记录的漏窃电用户信息

  • 提取漏窃电用户的关键特征,构建识别模型。
  • 利用实时监测数据,调用模型判断用户是否存在漏窃电行为。

分析

1. 数据抽取

  1. 营销系统数据
    用户基本信息、违约窃电记录、计量方法
  2. 计量自动化系统采集的数据
    1. 实时负荷:时间点、计量点、总有功功率、A/B/C相用功功率、A/B/C相电流、A/B/C相电压、A/B/C相功率因数
    2. 终端报警

需要包含不同用电类别的所有漏窃电用户和部分正常用户。样本数据需要包含关键时间节点前后一定范围的数据,并计算用户当天的用电量。

2.探索分析

  1. 分布分析
    统计各个用电类别的漏窃电用户分布情况,结论:非居民不存在漏窃电。
  2. 周期性分析
    结论:正常用户周期内用量平稳,非正常用户用电量明显持续下降。

3.预处理

  1. 数据清洗——》过滤非居民和节假日用电数据。
  2. 缺失值处理——》拉格朗日差值对用电量插补
    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)
    
    插值前:
    《Python数据分析与挖掘实战》学习笔记——电力漏窃电用户自动识别
    插值后:
    《Python数据分析与挖掘实战》学习笔记——电力漏窃电用户自动识别
    1. 数据变换
      定义新的指标
      (1)电量趋势下降指标 (2)线损指标 (3)告警类指标
      这里作者通过对原始数据的公式计算,构建了新的指标,新指标均为整数,不明白怎样应该构建指标(根据经验?)及验证构建出的指标的有效性

4.构建专家样本

根据新定义的指标对原始数据处理,得到专家样本数据291个
电量趋势下降指标、线损指标、告警类指标、是否窃漏电
《Python数据分析与挖掘实战》学习笔记——电力漏窃电用户自动识别

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):, :]
  1. LM神经网络
    在window下配置keras库出现各种bug,待尝试在centos下部署python开发环境
  2. 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()

这里,多次测试得到的结果会有变化。
《Python数据分析与挖掘实战》学习笔记——电力漏窃电用户自动识别
3. 模型评价