cs109-energy+哈佛大学能源探索项目 Part-2.2(Data Wrangling)

news2025/1/19 14:19:47

博主前期相关的博客见下:
cs109-energy+哈佛大学能源探索项目 Part-1(项目背景)
cs109-energy+哈佛大学能源探索项目 Part-2.1(Data Wrangling)
这次是将数据整理的部分讲完。

Data Wrangling

数据整理

Weather data

天气数据

有两个天气数据来源。

  • 2014年:来自GSD(设计研究生院)建筑物Gund屋顶的当地天气数据。
  • 2012年和2013年:从位于马萨诸塞州剑桥市的气象站购买天气数据。请注意,2012年和2013年的数据来自不同的气象站。

这是经过简单清理和单位转换后的原始天气数据。正如您所看到的,时间间隔为5分钟。

weather2014 = pd.read_excel('Data/weather-2014.xlsx')
weather2014.head()

在这里插入图片描述

Convert to hourly by resampling method.
Here is the clean hourly weather data of year 2014.

weather2014 = weather2014.set_index('Datetime')
weather2014 = weather2014.resample('H')
weather2014.head()

在这里插入图片描述

Here is the orginal weather data of the year 2013 and 2014 after a little cleaning including unit conversion. As you can see, the Datetime format is not correct.

Correct the timestep.
Here is the hourly data after cleaning.

weather2012and2013['Datetime'] = pd.to_datetime(weather2012and2013['Datetime'], format='%Y-%m-%d-%H')
weather2012and2013 = weather2012and2013.set_index('Datetime')
weather2012and2013.head()

在这里插入图片描述

Hourly weather data

Combine two files and add more features including cooling degrees, heating degrees, humidity ratio and dehumidification.
Here is all the hourly weather data.

# Combine two weather files
hourlyWeather = weather2014.append(weather2012and2013)
hourlyWeather.index.name = None
hourlyWeather.sort_index(inplace = True)

# Add more features

# Convert relative humidity to specific humidity

Mw=18.0160 # molecular weight of water
Md=28.9660 # molecular weight of dry air
R =  8.31432E3 # gas constant
Rd = R/Md # specific gas constant for dry air
Rv = R/Mw # specific gas constant for vapour
Lv = 2.5e6 # heat release for condensation of water vapour [J kg-1]
eps = Mw/Md

#saturation pressure
def esat(T):
    ''' get sateration pressure (units [Pa]) for a given air temperature (units [K])'''
    from numpy import log10
    TK = 273.15
    e1 = 101325.0
    logTTK = log10(T/TK)
    esat =  e1*10**(10.79586*(1-TK/T)-5.02808*logTTK+ 1.50474*1e-4*(1.-10**(-8.29692*(T/TK-1)))+ 0.42873*1e-3*(10**(4.76955*(1-TK/T))-1)-2.2195983) 
    return esat

def rh2sh(RH,p,T):
    '''purpose: conversion relative humidity (unitless) to specific humidity (humidity ratio) [kg/kg]'''
    es = esat(T)
    W = Mw/Md*RH*es/(p-RH*es)

    return W/(1.+W)


p = hourlyWeather['pressure-mbar'] * 100
RH = hourlyWeather['RH-%'] / 100
T = hourlyWeather['T-C'] + 273.15
w = rh2sh(RH,p,T)

hourlyWeather['humidityRatio-kg/kg'] = w
hourlyWeather['coolingDegrees'] = hourlyWeather['T-C'] - 12
hourlyWeather.loc[hourlyWeather['coolingDegrees'] < 0, 'coolingDegrees'] = 0

hourlyWeather['heatingDegrees'] = 15 - hourlyWeather['T-C']
hourlyWeather.loc[hourlyWeather['heatingDegrees'] < 0, 'heatingDegrees'] = 0

hourlyWeather['dehumidification'] = hourlyWeather['humidityRatio-kg/kg'] - 0.00886
hourlyWeather.loc[hourlyWeather['dehumidification'] < 0, 'dehumidification'] = 0

#hourlyWeather.to_excel('Data/hourlyWeather.xlsx')
hourlyWeather.head()

这段代码的作用是将两个天气数据文件合并,并添加更多功能,例如冷却度数、加热度数、湿度比和除湿

首先,使用pandas中的append函数将两个数据文件weather2014和weather2012and2013合并到一个新的数据框架hourlyWeather中,并设置索引名称为None。然后使用sort_index函数按时间对数据进行排序,并在原位将其应用于hourlyWeather。

接下来,定义了一些变量和函数,包括水分子量Mw、干空气分子量Md、气体常数R、干空气的特定气体常数Rd、水蒸气的特定气体常数Rv、水的凝结热Lv和水分子量Mw与干空气分子量Md之比eps。同时定义了函数esat,它用来计算给定空气温度下的饱和水蒸气压力。然后定义了一个函数rh2sh,将相对湿度(RH)转换为特定湿度(湿度比)(W)。

然后,将读取的数据中的压力、相对湿度和温度转换为所需的单位,并使用定义的rh2sh函数计算湿度比,将其添加到数据框架中。接下来,计算冷却度数、加热度数和除湿量,将它们添加到数据框架中。具体地,冷却度数是温度减去12,如果小于零则设为零;加热度数是15减去温度,如果小于零则设为零;除湿量是湿度比减去0.00886,如果小于零则设为零。

最后,将hourlyWeather数据框架的前几行打印出来供查看。如果需要,将数据框架写入Excel文件中。

在这里插入图片描述

plt.figure()
fig = hourlyWeather.plot(y = 'T-C', figsize = (15, 6))
fig.set_axis_bgcolor('w')
plt.title('All hourly temperture', fontsize = 16)
plt.ylabel(r'Temperature ($\circ$C)')
plt.show()

plt.figure()
fig = hourlyWeather.plot(y = 'solarRadiation-W/m2', figsize = (15, 6))
fig.set_axis_bgcolor('w')
plt.title('All hourly solar radiation', fontsize = 16)
plt.ylabel(r'$W/m^2$', fontsize = 13)
plt.show()

plt.figure()
fig = hourlyWeather['2014-10'].plot(y = 'T-C', figsize = (15, 6), marker = 'o')
fig.set_axis_bgcolor('w')
plt.title('Selected hourly temperture',fontsize = 16)
plt.ylabel(r'Temperature ($\circ$C)',fontsize = 13)
plt.show()

plt.figure()
fig = hourlyWeather['2014-10'].plot(y = 'solarRadiation-W/m2', figsize = (15, 6), marker ='o')
fig.set_axis_bgcolor('w')
plt.title('Selected hourly solar radiation', fontsize = 16)
plt.ylabel(r'$W/m^2$', fontsize = 13)
plt.show()

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

所有的 T-C(温度);所有的solar radiation(太阳辐射);选择的2014-10的温度与太阳辐射

Daily weather data

dailyWeather = hourlyWeather.resample('D')
#dailyWeather.to_excel('Data/dailyWeather.xlsx')
dailyWeather.head()

在这里插入图片描述

plt.figure()
fig = dailyWeather.plot(y = 'T-C', figsize = (15, 6), marker ='o')
fig.set_axis_bgcolor('w')
plt.title('All daily temperture', fontsize = 16)
plt.ylabel(r'Temperature ($\circ$C)', fontsize = 13)
plt.show()

plt.figure()
fig = dailyWeather['2014'].plot(y = 'T-C', figsize = (15, 6), marker ='o')
fig.set_axis_bgcolor('w')
plt.title('Selected daily temperture', fontsize = 16)
plt.ylabel(r'Temperature ($\circ$C)', fontsize = 13)
plt.show()

plt.figure()
fig = dailyWeather['2014'].plot(y = 'solarRadiation-W/m2', figsize = (15, 6), marker ='o')
fig.set_axis_bgcolor('w')
plt.title('Selected daily solar radiation', fontsize = 16)
plt.ylabel(r'$W/m^2$', fontsize = 14)
plt.show()

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

所有数据daily温度;2014年的daily温度;2014年的daily solar radiation

Features related to occupancy

与占用相关的特征。
这是一个介于0和1之间的数字。0表示没有人员占用,1表示正常占用。这是根据假期、周末和学校学术日历进行估算的。

holidays = pd.read_excel('Data/holidays.xlsx')
holidays.head()

在这里插入图片描述

hourlyTimestamp = pd.date_range(start = '2011/7/1', end = '2014/10/31', freq = 'H')
occupancy = np.ones(len(hourlyTimestamp)) 

hourlyOccupancy = pd.DataFrame(data = occupancy, index = hourlyTimestamp, columns = ['occupancy'])


Saturdays = hourlyOccupancy.index.weekday == 5
Sundays = hourlyOccupancy.index.weekday == 6
hourlyOccupancy.loc[Saturdays, 'occupancy'] = 0.5 
hourlyOccupancy.loc[Sundays, 'occupancy'] = 0.5 


for i in range(len(holidays)):
    timestamp = pd.date_range(start = holidays.loc[i, 'startDate'], end = holidays.loc[i, 'endDate'], freq = 'H')
    hourlyOccupancy.loc[timestamp, 'occupancy'] = holidays.loc[i, 'value']

#hourlyHolidays['Datetime'] = pd.to_datetime(hourlyHolidays['Datetime'], format="%Y-%m-%d %H:%M:%S")
hourlyOccupancy['cosHour'] = np.cos((hourlyOccupancy.index.hour - 3) * 2 * np.pi / 24)

dailyOccupancy = hourlyOccupancy.resample('D')
dailyOccupancy.drop('cosHour', axis = 1, inplace = True)

这段代码的作用是生成一个包含时间戳和占用度的数据框架,并对占用度进行估算,包括周末、假期和时间的周期性影响。

首先,使用pandas中的date_range函数生成一个时间戳hourlyTimestamp,从2011年7月1日到2014年10月31日,时间间隔为1小时。然后,创建一个长度为时间戳长度的数组occupancy,数组中的每个元素均为1。使用这个数组创建一个名为hourlyOccupancy的数据框架,将时间戳设置为索引,将数组作为一个名为occupancy的列添加到数据框架中。

接下来,分别获取周六和周日的时间戳,并将这些时间戳所对应的占用度设置为0.5,以反映周末对占用度的影响。

然后,使用循环遍历存储在名为holidays的数据框架中的每个假期,并获取每个假期的开始时间和结束时间。使用这些时间戳将相应的小时时间戳所对应的占用度设置为假期的值,以反映假期对占用度的影响。

接下来,将每个小时时间戳的cos值作为一个新的列添加到hourlyOccupancy数据框架中,以考虑时间的周期性影响。具体地,将每个小时时间戳的小时数减去3,然后将结果乘以2π并除以24,最后求余弦值。

最后,将hourlyOccupancy数据框架按天重采样,并删除cosHour列,将结果存储在dailyOccupancy中。

Merge energy consumption data with weather and occupancy features

将能源消耗数据与天气和占用特征合并。

hourlyElectricityWithFeatures = hourlyElectricity.join(hourlyWeather, how = 'inner')
hourlyElectricityWithFeatures = hourlyElectricityWithFeatures.join(hourlyOccupancy, how = 'inner')
hourlyElectricityWithFeatures.dropna(axis=0, how='any', inplace = True)
hourlyElectricityWithFeatures.to_excel('Data/hourlyElectricityWithFeatures.xlsx')
hourlyElectricityWithFeatures.head()

这段代码的作用是将能源消耗数据与天气和占用特征合并,并将结果存储到Excel文件中。

首先,使用pandas的join函数将hourlyElectricity数据框架与hourlyWeather数据框架按内部连接方式合并,即只保留两者都有的时间戳。然后,再次使用join函数将hourlyOccupancy数据框架与合并后的数据框架按内部连接方式合并。最后,使用dropna函数删除包含缺失值的行。将合并后的数据框架存储到Excel文件’hourlyElectricityWithFeatures.xlsx’中,并打印出前几行以供查看。

在这里插入图片描述

这段代码的作用是将冷却水和蒸汽的能耗数据与天气和占用特征合并,并将结果存储到Excel文件中。其中,前两行为冷却水数据的处理,接下来三行为蒸汽数据的处理,最后三行为按日处理的能耗数据的处理。

对于冷却水和蒸汽数据,处理方式与能源消耗数据的处理相同。使用join函数将能耗数据与天气数据和占用特征数据按内部连接方式合并,删除包含缺失值的行,并将合并后的数据框架存储到Excel文件中。具体来说,将小时级别的数据与天气和占用特征按内部连接方式合并后,将包含缺失值的行删除,并将结果存储为Excel文件。同样的方式也适用于按日处理的数据。

由于数据的处理方式相同,这些代码块可以通过复制和粘贴进行重复使用。

A note for features

Nomenclature (Alphabetically)
特征说明(符号(按字母顺序))

  • coolingDegrees:

制冷度数:如果T-C-12>0,则为T-C-12,否则为0。假设当室外温度低于12°C时,不需要制冷,这对许多建筑物来说是正确的。这将对每日预测有用,因为小时制冷度数的平均值比小时温度的平均值更好。

  • cosHour:

cos ( hourOfDay ⋅ 2 π 24 ) \text{cos}(\text{hourOfDay} \cdot \frac{2\pi}{24}) cos(hourOfDay242π)

  • dehumidification

如果 humidityRatio-0.00886> 0,then = humidityRatio - 0.00886,否则= 0。这对冷水预测特别是每日冷水预测很有用。

  • heatingDegrees

if 15 - T-C > 0, then = 15 - T-C, else = 0. 假设当室外温度高于15°C时,不需要供暖。这对每日预测有用,因为小时供暖度数的平均值比小时温度的平均值更好。

  • occupancy

一个介于0和1之间的数字。0表示没有人员占用,1表示正常占用。这是根据假期、周末和学校学术日历进行估算的。

  • pressure-mbar

atmospheric pressure

  • RH-%

Relative humidity

  • Tdew-C

Dew-point temperature

  • Humidity

Humidity ratio 是预测冷水的重要因素,因为冷水也用于干燥排放到房间中的空气。使用湿度比比使用相对湿度和露点温度更有效和有效。

Reference

cs109-energy+哈佛大学能源探索项目 Part-1(项目背景)
cs109-energy+哈佛大学能源探索项目 Part-2.1(Data Wrangling)
一个完整的机器学习项目实战代码+数据分析过程:哈佛大学能耗预测项目
Part 1-3 Project Overview, Data Wrangling and Exploratory Analysis-DEC10
Prediction of Buildings Energy Consumption

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/556328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能Python-python_changeint

Python中changeint函数介绍&#xff1a;将浮点数转换为整数 Python是一种高级编程语言&#xff0c;众所周知&#xff0c;它非常强大且易于学习。在Python中&#xff0c;有一个很有用的函数&#xff0c;名为changeint&#xff0c;它可以将一个浮点数转换为整数。在本文中&#…

进程间通信—进程池设计

进程池设计 文章目录 进程池设计代码目的头文件 对子进程操作建立子进程对象并把子进程对象放进数组里建立子进程需要执行的任务表创建子进程和父进程通信的管道&#xff0c;并且让子进程阻塞读取对父进程操作回收子进程整体代码子进程具有读端未关闭的bug 代码目的 创建一个父…

【libdatachannel】1 :cmake+vs2022 构建

libdatachannel libdatachannel 是基于c++17实现的cmake 链接openssl 可以参考【libcurl 】win32 构建 Release版本 修改cmakelist 链接openssl1.1.*构建 OpenSSL 找不到 Selecting Windows SDK version 10.0.22000.0 to target Windows 10.0.22621. The CXX compiler identifi…

机试打卡 -01 字母异位词(滑动窗口)

算法小白的代码如下↓ class Solution(object):def findAnagrams(self, s, p):""":type s: str:type p: str:rtype: List[int]"""# 输出列表answer_list[]# p的长度p_lenlen(p)# 索引遍历s的子串for i in range(len(s)):# 最后一次循环if ip_le…

Python对大量表格文件加以数据截取、逐行求差、跨文件合并等处理的方法

本文介绍基于Python语言&#xff0c;针对一个文件夹下大量的Excel表格文件&#xff0c;基于其中每一个文件&#xff0c;首先依据某一列数据的特征截取我们需要的数据&#xff0c;随后对截取出来的数据逐行求差&#xff0c;并基于其他多个文件夹中同样大量的Excel表格文件&#…

【NeRF】(一)NeRF论文学习笔记

文章目录 NeRF学习笔记1 实现过程1.1 相机参数&#xff1a;如何通过不同角度的照片得出输入数据1.2 MLP1.3 体积渲染及离散化1.4 优化点 NeRF学习笔记 概述&#xff1a; 重建&#xff1a;根据目前有的不同角度二维图片&#xff0c;重建三维物体。 用 MLP 网络学 Scene Represe…

《WEB安全漏洞30讲》(第5讲)任意文件上传漏洞

1.任意文件上传漏洞原理 文件上传漏洞,指攻击者利用程序缺陷绕过系统对文件的验证与处理策略将恶意程序上传到服务器并获得执行服务器端命令的能力。 这个漏洞其实非常简单,就是攻击者给服务器上传了恶意的木马程序,然后利用此木马程序执行操作系统命令,从而获得服务器权…

汇编实现点灯

循环亮灯 .text .global _start _start: bl LED1_INIT bl LED1_ON bl delay_1s bl LED1_OFF bl LED2_INIT bl LED2_ON bl delay_1s bl LED2_OFF bl LED3_INIT bl LED3_ON bl delay_1s bl LED3_OFF bl _start /**********LED1点灯PE10**************/ LED1_INIT: 1.通过RC…

UE5实现天际线分析效果

文章目录 1.实现目标2.实现过程2.1 后处理材质2.2 验证测试3.参考资料1.实现目标 UE5中使用CesiumForUnreal插件加载在线的地形影像与OSM建筑数据,再基于后处理材质实现天际线分析效果,GIF动图如下所示: 2.实现过程 依旧是通过边缘检测,得到天际线位置,再通过后处理材质将…

PointGPT 论文解读,点云的自回归生成预训练

PointGPT: Auto-regressively Generative Pre-training from Point Clouds 论文&#xff1a;https://arxiv.org/pdf/2305.11487.pdf 一种将GPT概念扩展到点云的方法&#xff0c;在多个3D点云下有任务中&#xff08;点云分类&#xff0c;part分割等&#xff09;上实现了最先进…

C++中set的用法

博主简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的人。 博主主页&#xff1a;陈童学哦 所属专栏&#xff1a;CSTL 前言&#xff1a;Hello各位小伙伴们好&#xff01;欢迎来到本专栏CSTL的学习&#xff0c;本专栏旨在帮助大家了解…

[SWPUCTF 2021 新生赛] (WEB一)

目录 gift_F12 jicao easy_md5​ caidao include easy_sql easyrce babyrce Do_you_know_http ez_unserialize gift_F12 1.开启环境 2.题目提示f12 ctrlf 搜索flag 得到flag "WLLMCTF{We1c0me_t0_WLLMCTF_Th1s_1s_th3_G1ft} jicao 1.开启环境 2.传参 jso…

MyBatis-Plus中AutoGenerator的详细使用案例

AutoGenerator是什么&#xff1f; AutoGenerator 是 MyBatis-Plus 的代码生成器&#xff0c;通过 AutoGenerator 可以快速生成 Pojo、Mapper、 Mapper XML、Service、Controller 等各个模块的代码 AutoGenerator能干什么&#xff1f; 对于单表而言&#xff0c;几乎是一个全能…

调用百度API实现菜品识别

调用百度API实现菜品识别 1、作者介绍2、百度API菜品识别接口介绍2.1图像识别接口介绍2.2接口使用说明2.2.1请求示例2.2.2请求参数 3、调用百度API流程4、代码实现 1、作者介绍 李延&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生 研究方向&…

如何禁用网络共享打印?

139端口是为“NetBIOS Session Service”提供的&#xff0c;主要用于提供Windows文件和打印机共享以及Unix中的Samba服务。在Windows中要在局域网中进行文件的共享&#xff0c;必须使用该服务。 开启139端口虽然可以提供共享服务&#xff0c;但是常常被攻击者所利用进行攻击&am…

chatgpt赋能Python-python_chi

Python Chi&#xff1a;掌握Python语言的关键 Python是一种面向对象、直译式计算机程序设计语言&#xff0c;被广泛应用于各种领域。无论是数据分析、人工智能、Web开发、网络爬虫还是科学计算&#xff0c;Python都扮演着重要的角色。而Python Chi则是Python语言中一个重要的方…

HQL函数--打地鼠游戏及WordCount案例分析及实现

1.打地鼠 uid,hit,m 1,1,0 1,2,1 1,3,1 1,4,1 1,5,0 1,6,0 1,7,1 2,1,1 2,2,1 2,3,1 2,4,1 2,5,1 3,1,1 3,2,1 3,3,1 3,4,0 3,5,0 3,6,1 3,7,0 3,8,1 create table tb_ds( uid int , -- 用户名 hit int , -- 第几次打地鼠 m int -- 是否命中 1命中 0 …

Request响应和Response对象

什么是Request响应和Response对象 实际上就是指Request对象和Response对象。 一个get或者post请求实际上就是一些有规律的字符串&#xff0c;Tomcat将这些字符串获取并且封装成一个可操作的对象。 通过Response对象可以设置响应数据&#xff0c;也就是Tomcat想要给浏览器发送…

Redis安全性详解

目录 ​编辑 Redis安全性详解 1.Redis的访问控制措施。 2.Redis的密码认证机制 3.Redis的绑定IP地址 4.Redis的网络ACL 5.Redis的防火墙或网络安全组 Redis安全性详解 Redis是一个快速、开源的内存数据库&#xff0c;被广泛用于缓存、消息传递和数据存储等场景。然而&a…

sql查询每组数据中时间最大的一条

sql查询每组数据中时间最大的一条 前言代码总结 前言 先来了解一下业务需求。博主好久没写过后端了&#xff0c;这一写就直接碰到我知识盲区了 我们简单还原一下&#xff0c;这里使用一个表模拟下 表的字段如下 表的内容如下&#xff0c;我们的需求就是取出相同name的数据中…