一、实验目的与要求
1、掌握使用pandas库处理数据的基本方法。 2、掌握对时间序列类数据预处理的基本方法。 3、掌握使用matplotlib结合pandas库对数据分析可视化处理的基本方法。 二、实验内容 1、利用python中pandas等库读取数据,并完成数据的预处理。 2、利用matplotlib等库完成对数据的可视化。 3、使用Sklearn库的相关系数建立决策树模型,对模型进行训练,使用测试集测试后对模型的效果进行评价。 三、实验步骤
1.数据预处理。读取所提供的数据文件,检查文件中时间序列是否完整,有无缺失值,重复值。
(1)导入所需要使用的包
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdate
from datetime import datetime, timedelta
from matplotlib.dates import DateFormatter, WeekdayLocator, DayLocator, MONDAY,YEARLY
import dateutil.relativedelta
import time
from matplotlib.pyplot import MultipleLocator
#设置绘图显示中文字体
plt.rcParams['font.sans-serif']=['SimHei']
(2)读取文件
file_path='/data/bigfiles/data3.csv'
data=pd.read_csv(file_path)
(3)查看数据的基本统计信息
print(data.info())
(4)检查数据是否完整--
# 查看数据长度
std_rng=pd.date_range(start='2006/1/1',end='2011/1/1',freq='D')
len(std_rng)
(5)求日平均数据并添加日类型
data['湿度']=data['湿度'].map(lambda x :float(x))
#湿度转换成 浮点类型
data['日最高湿度']=data["湿度"]
data['日最低湿度']=data["湿度"]
data['日均电力负荷']=data['电力负荷']
data['日最高电力负荷']=data['电力负荷']
data['日最低电力负荷']=data['电力负荷']
# 将日期设为行索引
data=data.set_index(['日期'])
# 将日期类型转换成datatime
data.index=data.index.map(lambda x :datetime.strptime(x,'%Y/%m/%d'))
data['日']=data.index
# 定义中文包
week_cn = [1,2,3,4,5,6,7]
#我这里为了省事换成了数字,如果你想你可以换换成中文
# week_cn = ["一","二","三","四","五","六","日"]
data['日']=data['日'].map(lambda x: week_cn[pd.to_datetime(x).weekday()])
datas =data.groupby('日期').agg({"干球温度":"mean","露点温度":"mean","湿球温度":"mean","湿度":"mean","日最高湿度":"max","日最低湿度":"min","电价":"mean","日最高电力负荷":"max","日最低电力负荷":"min","日均电力负荷":"mean","日":"mean"})
# 对缺失的值进行填补
datas.head()
(6)存储预处理后的文件
#跳过不用运行
out_file_path='信息预处理.xlsx'
data.to_excel(out_file_path,index=False)
2、数据可视化。
(1)读取预处理后的文件
# 此处读取跳过
datafile='信息预处理.xlsx'
data=pd.read_excel(datafile,encoding="utf-8")
data.head()
(2)绘制各气象信息的时间序列曲线
charts=datas["2006/01/01":"2010/02/01"]
charts.index=charts.index.map(lambda x:str(x)[:10])
# 创建一个画布
fig = plt.figure(figsize=(15.6,7.2))
# 在画布上添加一个子视图
ax = plt.subplot(111)
# 这里很重要 需要 将 x轴的刻度 进行格式化
# ax.xaxis.set_major_formatter(mdate.DateFormatter('%Y/%m/%d'))
x_major_locator=MultipleLocator(300) # 把x轴的刻度间隔设置为原来的2倍
ax.xaxis.set_major_locator(x_major_locator) # 把x轴的主刻度设置为1的倍数
# 画折线
line1,=ax.plot(charts.index,charts['湿度'],'r-',label='湿度')
line2,=ax.plot(charts.index,charts['日最高湿度'],'b--',label='日最高湿度')
line3,=ax.plot(charts.index,charts['日最低湿度'],'g-',label='日最低湿度')
line4,=ax.plot(charts.index,charts['露点温度'],'c--',label='露点温度')
line5,=ax.plot(charts.index,charts['湿球温度'],'y-',label='湿球温度')
plt.legend()
(3)绘制电价和电力负荷的时间序列曲线
chart=datas["2006/01/01":"2010/02/01"]
chart.index=chart.index.map(lambda x:str(x)[:10])
# 创建一个画布
fig = plt.figure(figsize=(15.6,7.2))
# 在画布上添加一个子视图
ax = plt.subplot(111)
# 这里很重要 需要 将 x轴的刻度 进行格式化
# ax.xaxis.set_major_formatter(mdate.DateFormatter('%Y/%m/%d'))
x_major_locator=MultipleLocator(300) # 把x轴的刻度间隔设置为原来的2倍
ax.xaxis.set_major_locator(x_major_locator) # 把x轴的主刻度设置为1的倍数
# 画折线
line1,=ax.plot(chart.index,chart['日均电力负荷'],'r-',label='日均电力负荷')
line2,=ax.plot(chart.index,chart['日最高电力负荷'],'b--',label='日最高电力负荷')
line3,=ax.plot(chart.index,chart['日最低电力负荷'],'g-',label='日最低电力负荷')
plt.legend()
(4)编写中值滤波函数消除明显的噪音
from scipy.interpolate import lagrange
def inmsg(s,label_index,k=5):
sc=s.copy()
loc=sc.index.get_loc(label_index)
stmp=sc[loc-k:loc+k+1]
#生成插值序列
x=list(range(0,k))+list(range(k+1,2*k+1))
stmp=list(stmp[0:k])+list(stmp[k+1:2*k+1])
#插值
ret=lagrange(x,stmp)(k)
#将插值结果赋值回原序列
sc[label_index]=ret
return sc
#使用insmg()函数插值
intrp_label=chart['日均电力负荷'][chart['日均电力负荷']<7500].index
for label_index in intrp_label:
chart['日均电力负荷']=inmsg(chart['日均电力负荷'],label_index,5)
intrp_label=chart['日最高电力负荷'][chart['日最高电力负荷']<8000].index
for label_index in intrp_label:
chart['日最高电力负荷']=inmsg(chart['日最高电力负荷'],label_index,5)
intrp_label=chart['日最低电力负荷'][chart['日最低电力负荷']<5700].index
for label_index in intrp_label:
chart['日最低电力负荷']=inmsg(chart['日最低电力负荷'],label_index,5)
(5)绘制滤波后的时序曲线
# 创建一个画布
fig = plt.figure(figsize=(15.6,7.2))
# 在画布上添加一个子视图
ax = plt.subplot(111)
# 这里很重要 需要 将 x轴的刻度 进行格式化
# ax.xaxis.set_major_formatter(mdate.DateFormatter('%Y/%m/%d'))
x_major_locator=MultipleLocator(300) # 把x轴的刻度间隔设置为原来的2倍
ax.xaxis.set_major_locator(x_major_locator) # 把x轴的主刻度设置为1的倍数
# 画折线
line1,=ax.plot(chart.index,chart['日均电力负荷'],'r-',label='日均电力负荷')
line2,=ax.plot(chart.index,chart['日最高电力负荷'],'b--',label='日最高电力负荷')
line3,=ax.plot(chart.index,chart['日最低电力负荷'],'g-',label='日最低电力负荷')
plt.legend()
3.相关系数。求出各量与电力负荷之间的皮尔逊相关系数,选择相关系数绝对值前3高的属性作为特征属性,用于下一步进行模型训练。
from sklearn import tree#决策树模型
from sklearn.model_selection import train_test_split#划分测试集合与训练集合
from sklearn.model_selection import GridSearchCV#用于找到最优模型
from scipy.stats import pearsonr
# 通常情况下通过以下取值范围判断变量的相关强度:
# 相关系数 0.8-1.0 极强相关
# 0.6-0.8 强相关
# 0.4-0.6 中等程度相关
# 0.2-0.4 弱相关
# 0.0-0.2 极弱相关或无相关
x=np.array([1,3,5])
y=np.array([1,3,4])
pc = pearsonr(x,y)
print("相关系数:",pc[0])
print("显著性水平:",pc[1])
pccs = pearsonr(chart['湿度'],chart['日均电力负荷'])
print('湿度')
print("相关系数:",pccs[0])
print("显著性水平:",pccs[1])
pccs = pearsonr(chart['干球温度'],chart['日均电力负荷'])
print('干球温度')
print("相关系数:",pccs[0])
print("显著性水平:",pccs[1])
pccs = pearsonr(chart['湿球温度'],chart['日均电力负荷'])
print('湿球温度')
print("相关系数:",pccs[0])
print("显著性水平:",pccs[1])
pccs = pearsonr(chart['露点温度'],chart['日均电力负荷'])
print('露点温度')
print("相关系数:",pccs[0])
print("显著性水平:",pccs[1])
pccs = pearsonr(chart['电价'],chart['日均电力负荷'])
print('电价')
print("相关系数:",pccs[0])
print("显著性水平:",pccs[1])
pccs = pearsonr(chart['日最高电力负荷'],chart['日均电力负荷'])
print('日最高电力负荷')
print("相关系数:",pccs[0])
print("显著性水平:",pccs[1])
pccs = pearsonr(chart['日最低电力负荷'],chart['日均电力负荷'])
print('日最低电力负荷')
print("相关系数:",pccs[0])
print("显著性水平:",pccs[1])
# 选择干球湿度与湿球湿度和电价作为特征属性
4.数据分析。使用上一步选择的3个特征属性作为输入属性,电力负荷作为输出属性,合理划分训练集与测试集比例,选择适合的参数,使用Sklearn建立决策树模型,并对模型进行测试。
(1)建立决策树模型
X=pd.concat([chart['湿球温度'],chart['干球温度'],chart['电价']],axis=1)
Y=chart['日均电力负荷']
# 划分测试与训练集
Xtrain,Xtest,Ytrain,Ytest=train_test_split(X,Y,test_size=0.1,random_state=420)
# 选择最优参数
tree_param={'criterion':['mse','friedman_mse','mae'],'max_depth':list(range(10))}
grid=GridSearchCV(tree.DecisionTreeRegressor(),param_grid=tree_param,cv=3)#实例化对象
grid.fit(Xtrain,Ytrain)#训练模型
grid.best_params_,grid.best_score_#最优参数,最优分数
# #建立决策树
dtr=tree.DecisionTreeRegressor(criterion='mae',max_depth =5)
# #训练决策树
#预测训练结果
dtr.fit(Xtrain,Ytrain)
pred=dtr.predict(Xtest)
(2)绘制预测结果
fig=plt.figure(figsize=(15.6,7.2))
ax=fig.add_subplot(111)
s1=ax.scatter(range(len(pred)),pred,facecolors="red",label='预测')
s2=ax.scatter(range(len(Ytest)),Ytest,facecolors="blue",label='实际')
plt.legend()