python数据分析与挖掘实战第十章

本博客旨在帮助学生自己巩固所学,若能帮得上他人也是荣幸之至
首先以下是借鉴过的几个github库,非常感谢:
https://github.com/apachecn/python_data_analysis_and_mining_action
https://github.com/keefecn/python_practice_of_data_analysis_and_mining
https://github.com/Stormzudi/Python-Data-Mining
https://github.com/Echo9573/DataAnalysisbyPython

本文主要参考博客https://blog.csdn.net/u012063773/article/details/79310068

1 指定编码格式用pandas导入数据

data = pd.read_excel('original_data.xls',encoding='gbk')

2 pandas删除指定列

data = or_data.drop(or_data.columns[[0,5,9]],axis=1) # 删掉不相关属性

3 查看每列有多少非空值

data.info()

4 将时间列转化为特定日期格式

例如将20141019063917转化为2014-10-19 06:39:17

data[u'发生时间'] = pd.to_datetime(data[u'发生时间'], format = '%Y%m%d%H%M%S')#将时间列转成日期格式(***)

5 筛选出特定条件的数据

例如筛选出开关机状态为开或者水流量不等于0的数据

data1 = data[(data[u'开关机状态']==u'开')|(data[u'水流量']!=0)]

6 由时间列数据算时间间隔

例如2014-10-19 07:38:16减去2014-10-19 07:01:56 得到00:36:20

data[u'用水停顿时间间隔']= data[u'发生时间'].diff()

进一步转化为以分钟为单位

data[u'用水停顿时间间隔']= data[u'发生时间'].diff()/ np.timedelta64(1, 'm') #将datetime64[ns]转成 以分钟为单位(*****)

7 查看各数值列的最大最小和空值情况

就是用describe后求转置再填新列null,去除所需三列

#-----第*2*步-----数据探索,查看各数值列的最大最小和空值情况
data_explore = data.describe().T
data_explore['null'] = len(data)-data_explore['count']
explore = data_explore[['min','max','null']]
explore.columns = [u'最小值',u'最大值',u'空值数']
explore

8 将1列数据划分区间,区间从小到大排列,每个区间个数即所占比例和累加所占比例及百分比,lambda新建列

Ti = list(data[u'用水停顿时间间隔'])#将要面元化的数据转成一维的列表
timegaplist = [0.0,0.1,0.2,0.3,0.5,1,2,3,4,5,6,7,8,9,10,11,12,13,2100]# 确定划分区间

cats = pd.cut(Ti,timegaplist,right=False) # 包扩区间左端,类似"[0,0.1)",(默认为包含区间右端)
x = pd.value_counts(cats)

x.sort_index(inplace = True)
dx = DataFrame(x,columns=['num'])
dx['fn'] = dx['num']/sum(dx['num'])
dx['cumfn'] = dx['num'].cumsum()/sum(dx['num'])

f1 = lambda x :'%.2f%%' %  (x*100)
dx[['f']]= dx[['fn']].applymap(f1)
dx

9 条形图和累计频率线画入同意图,坐标倾斜,annotate加注释,保存图片结果

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

dx['fn'].plot(kind='bar')
plt.ylabel(u'频率/组距')
plt.xlabel(u'时间间隔(分钟)')
p = 1.0*dx['fn'].cumsum()/dx['fn'].sum()# 数值等于 dx['cumfn'],但类型是列表
dx['cumfn'].plot(color = 'r', secondary_y = True, style = '-o',linewidth = 2)
plt.annotate(format((p[4]), '.4%'), xy = (7, p[4]), xytext=(7*0.9, p[4]*0.95), arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2")) #添加注释,即85%处的标记。这里包括了指定箭头样式。
plt.ylabel(u'累计频率')

plt.title(u'用水停顿时间间隔频率分布直方图')
plt.grid(axis='y',linestyle='--')

# fig.autofmt_xdate() #自动根据标签长度进行旋转
for label in ax.xaxis.get_ticklabels():   #此语句完成功能同上,但是可以自定义旋转角度
       label.set_rotation(60)

plt.savefig('Water-pause-times.jpg')
plt.show()

10 时间阈值设置,相邻时间差分与阈值比较,巧妙用累加求和划分事件

不太好理解,结果如下:
在这里插入图片描述

#-----第*5*步-----:确定一次用水事件停顿阈值后,开始划分一次完整事件
threshold = pd.Timedelta(minutes=4)#阈值为四分钟
d = data[u'发生时间'].diff() > threshold # 相邻时间做差分,比较是否大于阈值(*****)
data[u'事件编号'] = d.cumsum() + 1 # 通过累积求和的方式为事件编号(*****)

data.to_excel(outputfile)

11 列表生成Series

coun = pd.Series(counts, index=timedeltalist)

12 滚动求和取平均

h[u'斜率指标偏移前'] = h[u'斜率'].abs().rolling(n).mean()

13 某列数据上下移动

h[u'斜率指标'][:-4] = h[u'斜率指标偏移前'] [4:]

14 创建一个空列表,定义多个列,和序号列的名称

fdf2 = DataFrame([], index = range(1,MX+1))# 创建一个空列表 用来存放属性规约结果
fdf2.index.names = ['eventNUM']

fdf2['stDataIndex'] = np.nan #用水事件开始编号
fdf2['edDataIndex'] = np.nan #用水事件结束编号
fdf2['stUseTime'] = np.nan #用水开始时间
fdf2['enUseTime'] = np.nan #用水结束时间
fdf2['AllUseTime'] = np.nan #用水总时间
fdf2['gapTimes'] = np.nan #用水间隔时间
fdf2['stopLines'] = np.nan # 一次用水期间“水流量”为0的记录数

15 调用神经网络训练预测案例及混淆矩阵自定义函数

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) #画混淆矩阵图,配色风格使用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
# -*- coding:utf-8 -*-
# 3)模型构建
# 目标:判断是否是洗浴事件,是则1,不是则0
# 建立、训练多层神经网络 并完成模型的检验
# 选取”候选洗浴事件“的11个属性作为网络的输入,分别为:洗浴时间点、总用水时长、总停顿时长、平均停顿时长、停顿次数、
# 用水时长、用水时长/总用水时长、总用水量、平均水流量、水流量波动和停顿时长波动
from __future__ import print_function
import pandas as pd
from pandas import Series, DataFrame
import numpy as np

# 由于此单元的中间数据处理原书中有问题,所以此处采用书中给的训练数据,和测试数据,旨在测试模型在此数据上的运行
inputfile1 = 'train_neural_network_data.xls' # 训练数据
inputfile2 = 'test_neural_network_data.xls' # 测试数据
testoutputfile = 'test_output_data.xls' #测试数据模型输出文件

data_train = pd.read_excel(inputfile1) # 读入训练数据
data_test = pd.read_excel(inputfile2) # 读入测试数据

data_train.head()

在这里插入图片描述
在这里插入图片描述

x_train = data_train.iloc[:,5:17].values # 训练样本特征
y_train = data_train.iloc[:,4].values # 训练样本标签列
x_test = data_test.iloc[:,5:17].values # 测试样本特征
y_test = data_test.iloc[:,4].values # 训练样本标签列
# 训练神经网络时,对神经网络的参数进行寻优,发现含两个隐含层的神经网络训练效果较好
# 其中两个隐层的节点数分别为17和10时训练效果较好

from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation

netfile = 'net.model'# 构建的神经网络模型存储路径

model = Sequential() # 建立模型
model.add(Dense(units=17, input_dim=11)) # 添加输入层、隐藏层的连接
model.add(Activation('relu')) # 以relu函数为激活函数
model.add(Dense(units=10, input_dim=17)) # 添加隐藏层、二层隐藏层的连接
model.add(Activation('relu')) # 以relu函数为激活函数
model.add(Dense(units=1, input_dim=10)) # 添加二层隐藏层、输出层的连接
model.add(Activation('sigmoid')) # 以sigmoid函数为激活函数

# 编译模型,损失函数为binary_crossentropy,用adam法求解
model.compile(loss = 'binary_crossentropy', optimizer = 'adam')
model.fit(x_train, y_train, epochs = 1000, batch_size = 1)
model.save_weights(netfile)# 保存模型参数
predict_result_train = model.predict_classes(x_train).reshape(len(data_train)) #给出预测类别(训练集)
cm_plot(y_train, predict_result_train).show() #显示混淆矩阵可视化结果 看训练结果正确率

在这里插入图片描述

from sklearn.metrics import confusion_matrix
predict_result_test = model.predict_classes(x_test).reshape(len(data_test)) #给出预测类别(测试集)

cm = confusion_matrix(y_test, predict_result_test)
cm_plot(y_test, predict_result_test).show() #显示混淆矩阵可视化结果 看训练结果正确率
cm

在这里插入图片描述

from __future__ import division
correctRate = (cm[1,1] + cm[0,0]) / cm.sum()
correctRate
r = DataFrame(predict_result_test, columns = [u'预测结果']) # 给出预测类别测试集
# predict_rate = DataFrame(model.predict(x_test), columns = [u'预测正确率']) # 给出预测类别测试集
res = pd.concat([data_test.iloc[:,:5],r], axis=1)#测试集
res.to_excel(testoutputfile)
res
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值