智能电网的电能预估及价值分析

该实验旨在通过Python的pandas库进行数据预处理,包括检查数据完整性、转换数据类型、计算日平均值等。接着,使用matplotlib进行数据可视化,展示时间序列曲线。此外,计算了各变量与电力负荷的相关系数,选择了相关性最强的特征进行决策树模型训练。最后,对模型进行了评估和预测。
摘要由CSDN通过智能技术生成

一、实验目的与要求

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(30)

 

(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()

 

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的倍数
# 画折线
line=ax.plot(chart.index,chart['电价'],'y-',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
# 中值滤波
def median_filter(data,sizes):
    filter_data=np.zeros_like(data)
    halfwindow=sizes
    for i in range (halfwindow,len(data)-halfwindow):
        window=data[i - halfwindow:i + halfwindow + 1]
        filter_data[i]=np.median(window)
    return filter_data

# #使用insmg()函数插值
# intrp_label=chart['日均电力负荷'][chart['日均电力负荷']<7650].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)    
# 使用中值滤波函数
# datafilter=chart['干球温度'].values
# datafilter=.values
chart['干球温度']=median_filter(chart['干球温度'],5)
chart['日均电力负荷']=median_filter(chart['日均电力负荷'],5) 
chart['日最高电力负荷']=median_filter(chart['日最高电力负荷'],5) 
chart['日最低电力负荷']=median_filter(chart['日最低电力负荷'],5) 
chart['露点温度']=median_filter(chart['露点温度'],5) 
chart['干球温度']=median_filter(chart['干球温度'],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))}
# GridSearchCV网格搜索,搜索的是参数,即在指定的参数范围内,按步长依次调整参数,利用调整的参数训练学习器,从所有的参数中找到在验证集上精度最高的参数,这其实是一个训练和比较的过程。k折交叉验证将所有数据集分成k份,不重复地每次取其中一份做测试集,
# 用其余k-1份做训练集训练模型,之后计算该模型在测试集上的得分,将k次的得分取平均得到最后的得分。
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()

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TECreate

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值