一、实验目的与要求

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

智能电网的电能预估及价值分析相关推荐

  1. 智能电网势头好 电能表商纷纷扩张产能

    随着智能电网的全面建设,作为连接电网与客户的关键环节,智能电能表作用非常重要.它不仅决定客户用电的智能化水平,还将帮助客户合理用电,并实现节能减排. 有资料表明,从2010年至2015年间,我国电网系 ...

  2. 云数据库 GaussDB(for Influx) 解密第十一期:让智能电网中时序数据处理更高效

    摘要:GaussDB(for Influx)是一款基于计算存储分离架构,完全兼容 InfluxDB 生态的云原生时序数据库. 本文分享自华为云社区<云数据库 GaussDB(for Influx ...

  3. 关于智能电网调度自动化的细述

    智能调度自动化,是智能电网运行不可缺少的智能系统.其利用先进的IT技术和智能化科技,以及最先进的通信技术,将自动化系统的数据在模型结构上统一.兼容,实现系统间的双向互动;既能分散运行,又能自由组合.在 ...

  4. 全球及中国智能电网产业十四五规划方向及投资决策建议报告2021年版

    全球及中国智能电网产业十四五规划方向及投资决策建议报告2021年版 HS--HS--HS--HS--HS--HS--HS--HS--HS--HS--HS--HS-- [修订日期]:2021年11月 [ ...

  5. 面向智能电网的电力大数据存储与分析应用

    面向智能电网的电力大数据存储与分析应用 崔立真1, 史玉良1, 刘磊1, 赵卓峰2, 毕艳冰3 1. 山东大学计算机科学与技术学院,山东 济南 250101 2. 北方工业大学云计算研究中心,北京 1 ...

  6. 5个省,7大 “5G+智能电网” 落地应用案例!

    5G+智能电网正在如荼如火地发展着. 2020年3月12日,国家发展改革委.工业和信息化部联合发布<关于组织实施2020年新型基础设施建设工程(宽带网络和5G领域)的通知>. <通知 ...

  7. 实例 | 能源区块链、物联网技术在智能电网中的趋势及前沿应用

    近年来,移动互联网.大数据.云计算.物联网等数字信息技术得到迅猛发展,全球经济社会正在形成新的发展图景,世界各国和企业纷纷开启数字化转型之路.当前互联网数字化技术浪潮下,数字经济作为新生业态正在深刻改 ...

  8. 迎接智能电网浪潮,电力巡检机器人可以做哪些工作

    随着行业的快速发展,目前越来越多的机器人品类逐渐渗透到社会各行各业中,其中巡检机器人作为安防及公共安全领域的重要协助工具,这几年发展迅速,应用市场不断崛起.智能巡检作为智能电网建设的关键一环也迎来了发 ...

  9. 苏州智能电网产业园建筑能耗监测系统的应用

    摘要:随着社会生活水平的提高,经济的繁荣发展,人们对能源的需求逐渐增长,由此带来的能源危机日益严重.公共建筑如何实时的了解.分析和控制能源消耗已成为需要解决的迫在眉睫的难题.传统的能源消耗智能以月/季 ...

最新文章

  1. Nature微生物多样性驱动了细菌以CRISPR系统抵御噬菌体
  2. xampp无法启动apache,提示terminating worker thread 0
  3. 踩坑子Module引用aar
  4. 字符字节Base64编码
  5. ORA-12638: 身份证明检索失败 解决方法
  6. hadoop集群配置问题及思考
  7. 细粒度权限控制 linux,FGAC(细粒度访问控制)/VPD
  8. 对编写的代码进行单元测试_编写数据访问代码测试–单元测试是浪费
  9. python面试题总结(1)--语言特性
  10. Android中如何查看在res中存放的drawable文件对应的JAVA类型是什么呢
  11. Qt creator5.7 OpenCV249之pyrUp函数(含源码下载)
  12. ext2删除文件恢复笔记
  13. 每天Leetcode 刷题 初级算法篇-杨辉三角
  14. oozie ErrorCode含义
  15. 7 netsnmp安装window_Linuxfx 10.2,一款来自巴西的Window操作系统,“山寨”出了高度...
  16. 光立方,动手搭——原理简述
  17. 单点登录原理及其实现方案
  18. c语言单片机编程教学大纲,单片机应用技术[C语言]教学大纲.doc
  19. project2019安装教程
  20. 全民一起VBA实战篇第三课:文本内容的实用技巧

热门文章

  1. 信息安全的江湖 只有圈内人玩的转
  2. Mysql第五天 索引
  3. 解决安装英伟达显卡驱动循环登录问题
  4. 01.Mac默认zsh
  5. 《21天学通C#》将写的代码原封不动的在控制台显示
  6. 画星c语言程序,用星号画了一个正五角星。
  7. 完整的写出一个微信小程序的电子商城的用户人脉关系网的所有功能,所包含的前台、中台、后台所有的用户功能与管理员功能以及维护人员及客服的所有功能需求。
  8. 计算机博士英文复试自我介绍,博士复试英文自我介绍范文.doc
  9. Cloud一分钟 |周小川回应数字货币; 易到高管内讧风波未停;恒大健康回应FF员工诉讼...
  10. Databus--低延迟的分布式数据库同步系统(Canal类似)