当前位置: 首页 > news >正文

使用Python进行办公楼电能消耗数据的机器学习分析与预测

一、数据集介绍

该数据集以Excel文件形式提供,包含两个子表:

  1. Info:数据集的详细说明,包括设备类型、测量频率等信息。
  2. Trend:办公楼的电能消耗时间序列数据,记录了不同设备在特定时间点的能耗值。

二、项目目标

本项目旨在探索办公楼的电能消耗特性,并尝试使用机器学习方法预测未来用电情况。我们将进行以下步骤:

  1. 数据清洗:处理缺失值、异常值等。
  2. 特征提取:从时间、设备类型等角度生成特征。
  3. 机器学习建模:构建用电量预测模型。
  4. 结果可视化:对预测结果进行可视化和解释。

三、数据处理与特征工程

1. 导入数据

我们使用pandas库加载Excel文件中的Trend表数据,查看数据的基本信息。

import pandas as pd# 加载数据
data = pd.read_excel('electricity_consumption.xlsx', sheet_name='Trend')
info = pd.read_excel('electricity_consumption.xlsx', sheet_name='Info')# 查看数据结构
print(data.head())
print(data.info())
2. 数据清洗

在探索数据时,可能会遇到缺失值或异常值。我们将填充缺失值并移除异常数据,以便后续分析。

# 检查缺失值
print(data.isnull().sum())# 使用前向填充填补缺失值
data.fillna(method='ffill', inplace=True)
3. 特征提取

为了捕捉用电规律,我们可以从时间、设备等维度提取特征:

  • 时间特征:从时间戳中提取“小时”、“星期几”、“是否为工作日”等特征,以分析不同时间段的用电情况。
  • 季节特征:将日期划分为四季,分析季节对空调等设备用电的影响。
# 提取时间特征
data['timestamp'] = pd.to_datetime(data['timestamp'])
data['hour'] = data['timestamp'].dt.hour
data['day_of_week'] = data['timestamp'].dt.dayofweek
data['is_weekday'] = data['day_of_week'].apply(lambda x: 1 if x < 5 else 0)

四、数据分析与可视化

在正式建模之前,我们可以通过可视化来探索数据特性,观察用电量随时间的变化规律。

1. 可视化不同时间段的用电量

通过绘制时间序列图,观察不同设备在一天内的用电波动。

import matplotlib.pyplot as plt
import seaborn as sns# 设置图形样式
sns.set(style="whitegrid")# 绘制不同设备的用电量变化
plt.figure(figsize=(14, 7))
sns.lineplot(x='timestamp', y='power_consumption', hue='device_type', data=data)
plt.title('Electricity Consumption Over Time by Device Type')
plt.xlabel('Time')
plt.ylabel('Power Consumption')
plt.legend(title='Device Type')
plt.xticks(rotation=45)
plt.show()
2. 可视化不同设备的季节性用电量

将数据按季节聚合,绘制不同设备在四季的用电分布。

# 添加季节特征
def get_season(month):if month in [12, 1, 2]:return 'Winter'elif month in [3, 4, 5]:return 'Spring'elif month in [6, 7, 8]:return 'Summer'else:return 'Fall'data['season'] = data['timestamp'].dt.month.apply(get_season)# 绘制不同季节的用电情况
plt.figure(figsize=(10, 6))
sns.boxplot(x='season', y='power_consumption', hue='device_type', data=data)
plt.title('Power Consumption by Season and Device Type')
plt.xlabel('Season')
plt.ylabel('Power Consumption')
plt.legend(title='Device Type')
plt.show()

五、机器学习建模

我们选择时间序列预测模型来预测未来用电量,常用的模型包括线性回归随机森林回归XGBoost等。我们将以随机森林回归为例,尝试建立模型预测未来用电量。

1. 准备训练数据

首先,将特征和标签分开,并划分训练集和测试集。

from sklearn.model_selection import train_test_split# 选择特征和标签
X = data[['hour', 'day_of_week', 'is_weekday', 'season']]
y = data['power_consumption']# 将季节转换为数值
X = pd.get_dummies(X, columns=['season'], drop_first=True)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
2. 模型训练

使用随机森林回归模型训练数据。

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error# 初始化模型并训练
model = RandomForestRegressor(n_estimators=100, random_state=42)
model.fit(X_train, y_train)# 预测并计算误差
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse}')

六、结果可视化与分析

1. 预测结果可视化

绘制实际值与预测值对比的折线图,直观展示模型预测的准确性。

plt.figure(figsize=(10, 6))
plt.plot(y_test.values, label='Actual')
plt.plot(y_pred, label='Predicted')
plt.title('Actual vs Predicted Power Consumption')
plt.xlabel('Test Sample Index')
plt.ylabel('Power Consumption')
plt.legend()
plt.show()
2. 结果分析

从预测结果中可以看出,模型在大部分时间点的预测值与实际值较为接近,说明随机森林回归模型在该任务上有一定的预测能力。同时,我们可以看到部分异常点可能受到某些不可控因素影响(如异常天气、电力设备维修等),这些因素的纳入可能进一步提高模型预测效果。

七、总结与建议

在本项目中,我们通过Python对办公楼的电能消耗数据进行了探索性分析和机器学习建模,分析了不同设备的用电特性和规律,尝试预测未来的电能消耗情况。通过本项目,我们得出了一些有价值的结论和节能建议:

  1. 空调用电的季节性波动显著,可在非必要季节调整温度以节省能耗。
  2. 照明与电脑等设备在工作日的消耗明显增加,在非工作时间可以设置自动节电模式。

本项目证明了数据科学和机器学习技术在智能楼宇管理中的应用潜力。未来可以结合更多外部数据(如天气、节假日等),进一步提升模型的预测精度和实用性。


http://www.mrgr.cn/news/59776.html

相关文章:

  • 2024 Python3.10 系统入门+进阶(十九):异常处理
  • qt QMediaPlaylist
  • 非凸科技银牌赞助GOSIM CHINA 2024,并受邀出席Rust分论坛
  • Unity引擎:游戏开发的核心力量
  • 软件测试工程师:如何写出好的测试用例?
  • 腾讯云视频文件上传云存储时自动将mp4格式转码成m3u8
  • 【Qt】系统相关——多线程、Qt多线程介绍、常用函数、线程安全、网络、UDP Socket、TCP Socket
  • 2024年汽车修理工(高级)证模拟考试题库及汽车修理工(高级)理论考试试题
  • 逆向破解真随机数系统的思路
  • Axure设置文本——元件动作三
  • 算法|牛客网华为机试10-20C++
  • mysql中的视图表
  • 【Python】Python字典深入剖析:哈希映射与常见操作
  • 120.WEB渗透测试-信息收集-ARL(11)
  • 【golang】 lo.Map使用
  • 202.快乐数
  • ts:数组的常用方法(forEach、map)
  • 微服务篇SpringCloud
  • C++——string的模拟实现(下)
  • kubernetes中的ingress-nginx
  • Mybatis中的参数占位符:${...} 、#{...}的区别
  • SD2.0 Specification之响应(Responses)
  • 小样本语义分割(MSDNet网络详解)
  • 【iOS】使用AFNetworking进行网络请求
  • XJ07、消费金融|信贷还款的基本种类及其系统交互
  • 【MySQL】LeeCode高频SQL50题基础版刷题记录(持续更新)